diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..d5fe021
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,11 @@
+*.php text eol=lf
+*.phpt text eol=lf
+/composer.lock export-ignore
+/.github/ export-ignore
+/.phive/ export-ignore
+/tests export-ignore
+/.gitattributes export-ignore
+/.gitignore export-ignore
+/.php_cs export-ignore
+/phpstan.neon export-ignore
+/phpunit.xml export-ignore
\ No newline at end of file
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..07c5e96
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,33 @@
+
+
Change Log
+
+
Added
+
+
Fixed
+
+
Changed
+
+
Removed
+
+
Deprecated
+
+
Security
+
+
+
+
+Description
+
+
\ No newline at end of file
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..12f28b4
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+ - package-ecosystem: "composer"
+ directory: "/"
+ schedule:
+ interval: "daily"
\ No newline at end of file
diff --git a/.github/workflows/changelog-release.yml b/.github/workflows/changelog-release.yml
new file mode 100644
index 0000000..bb9608a
--- /dev/null
+++ b/.github/workflows/changelog-release.yml
@@ -0,0 +1,31 @@
+name: "Changelog - Release Unreleased"
+
+###################################################################
+# WARNING - THIS ACTION WILL PUSH COMMIT DIRECTLY INTO REPOSITORY #
+###################################################################
+
+on:
+ push:
+ tags:
+ - '*'
+
+jobs:
+ changelog-release-unreleased:
+ name: "Update Changelog - Release Unreleased"
+
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Get tag name"
+ id: "tag-name"
+ run: |
+ tag=$(echo ${{ github.event.ref }} | cut -c11-)
+ echo "::set-output name=tag::$tag"
+
+ - name: "Update CHANGELOG"
+ uses: "docker://aeonphp/automation:latest"
+ env:
+ AEON_AUTOMATION_GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+ with:
+ entrypoint: "/composer/vendor/bin/automation"
+ args: "changelog:release:unreleased ${{ github.repository }} CHANGELOG.md ${{ steps.tag-name.outputs.tag }} --github-file-changelog-update"
diff --git a/.github/workflows/changelog-update.yml b/.github/workflows/changelog-update.yml
new file mode 100644
index 0000000..e0ae30a
--- /dev/null
+++ b/.github/workflows/changelog-update.yml
@@ -0,0 +1,38 @@
+name: "Changelog - Update Unreleased"
+
+###################################################################
+# WARNING - THIS ACTION WILL PUSH COMMIT DIRECTLY INTO REPOSITORY #
+###################################################################
+
+on:
+ push:
+ branches:
+ - 6.x
+
+jobs:
+ changelog-update-unreleased:
+ name: "Changelog - Update Unreleased"
+
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@v2"
+
+ - name: "Restore Automation cache"
+ uses: "actions/cache@v2"
+ with:
+ path: |
+ cache
+ key: "${{ runner.os }}-automation-${{ hashFiles('**/CHANGELOG.md') }}"
+ restore-keys: |
+ ${{ runner.os }}-automation-
+
+ - name: "Update CHANGELOG"
+ uses: "docker://aeonphp/automation:latest"
+ env:
+ AEON_AUTOMATION_GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+ EON_AUTOMATION_CACHE_DIR: "/github/workspace/cache"
+ with:
+ entrypoint: "/composer/vendor/bin/automation"
+ args: "changelog:generate ${{ github.repository }} --github-file-update-path=CHANGELOG.md --skip-from=\"dependabot[bot]\" --skip-from=\"aeon-automation\""
diff --git a/.github/workflows/pull-request-description-check.yml b/.github/workflows/pull-request-description-check.yml
new file mode 100644
index 0000000..f624146
--- /dev/null
+++ b/.github/workflows/pull-request-description-check.yml
@@ -0,0 +1,20 @@
+name: "Pull Request Description Check"
+
+on:
+ pull_request:
+ types: ["opened", "edited", "reopened", "ready_for_review"]
+
+jobs:
+ pull-request-description-check:
+ name: "Pull Request Description"
+
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Pull Request Description - Check"
+ uses: "docker://aeonphp/automation:latest"
+ env:
+ AEON_AUTOMATION_GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+ with:
+ entrypoint: "/composer/vendor/bin/automation"
+ args: "pull-request:description:check ${{ github.repository }} ${{ github.event.pull_request.number }} --skip-from=\"dependabot[bot]\""
\ No newline at end of file
diff --git a/.github/workflows/release-description-update.yml b/.github/workflows/release-description-update.yml
new file mode 100644
index 0000000..c2db558
--- /dev/null
+++ b/.github/workflows/release-description-update.yml
@@ -0,0 +1,25 @@
+name: "Release - Description Update"
+
+#########################################################
+# WARNING - THIS ACTION WILL UPDATE RELEASE DESCRIPTION #
+#########################################################
+
+on:
+ release:
+ types:
+ - created
+
+jobs:
+ release-description-update:
+ name: "Release - Description Update"
+
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Update CHANGELOG"
+ uses: "docker://aeonphp/automation:latest"
+ env:
+ AEON_AUTOMATION_GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+ with:
+ entrypoint: "/composer/vendor/bin/automation"
+ args: "changelog:generate ${{ github.repository }} --tag=${{ github.event.release.tag_name }} --github-release-update --skip-from=\"dependabot[bot]\" --skip-from=\"aeon-automation\""
diff --git a/.github/workflows/static-analyze.yml b/.github/workflows/static-analyze.yml
new file mode 100644
index 0000000..45b6c03
--- /dev/null
+++ b/.github/workflows/static-analyze.yml
@@ -0,0 +1,77 @@
+name: "Static Analyze"
+
+on:
+ pull_request:
+ push:
+ branches:
+ - "4.x"
+ schedule:
+ - cron: '* 8 * * *'
+
+jobs:
+ compatibility:
+ name: "Static Analyze"
+
+ runs-on: ${{ matrix.operating-system }}
+
+ strategy:
+ matrix:
+ dependencies:
+ - "locked"
+ php-version:
+ - "7.4"
+ operating-system:
+ - "ubuntu-latest"
+
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@v2"
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "pcov"
+ php-version: "${{ matrix.php-version }}"
+ ini-values: memory_limit=-1
+ tools: phive, composer:v2
+
+ - name: "Cache Phive dependencies"
+ uses: "actions/cache@v2"
+ with:
+ path: |
+ ~/.phive
+ key: "${{ runner.os }}-phive-${{ hashFiles('**/phars.xml') }}"
+ restore-keys: |
+ ${{ runner.os }}-phive-
+
+ - name: "Get Composer Cache Directory"
+ id: composer-cache
+ run: |
+ echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+ - name: "Cache Composer dependencies"
+ uses: "actions/cache@v2"
+ with:
+ path: |
+ ${{ steps.composer-cache.outputs.dir }}
+ key: "php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.lock') }}"
+ restore-keys: |
+ php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-
+
+ - name: "Install tools"
+ run: "phive install --trust-gpg-keys E82B2FB314E9906E,CF1A108D0E7AE720,8A03EA3B385DBAA1,12CE0F1D262429A5 --force-accept-unsigned"
+
+ - name: "Install lowest dependencies"
+ if: ${{ matrix.dependencies == 'lowest' }}
+ run: "composer update --prefer-lowest --no-interaction --no-progress --no-suggest"
+
+ - name: "Install highest dependencies"
+ if: ${{ matrix.dependencies == 'highest' }}
+ run: "composer update --no-interaction --no-progress --no-suggest"
+
+ - name: "Install locked dependencies"
+ if: ${{ matrix.dependencies == 'locked' }}
+ run: "composer install --no-interaction --no-progress --no-suggest"
+
+ - name: "Static Analyze"
+ run: "composer static:analyze"
\ No newline at end of file
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 0000000..5a2eb63
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,80 @@
+name: "Tests"
+
+on:
+ pull_request:
+ push:
+ branches:
+ - "4.x"
+ schedule:
+ - cron: '* 8 * * *'
+
+jobs:
+ compatibility:
+ name: "Tests"
+
+ runs-on: ${{ matrix.operating-system }}
+
+ strategy:
+ matrix:
+ dependencies:
+ - "locked"
+ - "lowest"
+ - "highest"
+ php-version:
+ - "7.4"
+ - "8.0"
+ operating-system:
+ - "ubuntu-latest"
+
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@v2"
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "pcov"
+ php-version: "${{ matrix.php-version }}"
+ ini-values: memory_limit=-1
+ tools: phive, composer:v2
+
+ - name: "Cache Phive dependencies"
+ uses: "actions/cache@v2"
+ with:
+ path: |
+ ~/.phive
+ key: "${{ runner.os }}-phive-${{ hashFiles('**/phars.xml') }}"
+ restore-keys: |
+ ${{ runner.os }}-phive-
+
+ - name: "Get Composer Cache Directory"
+ id: composer-cache
+ run: |
+ echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+ - name: "Cache Composer dependencies"
+ uses: "actions/cache@v2"
+ with:
+ path: |
+ ${{ steps.composer-cache.outputs.dir }}
+ key: "php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-${{ hashFiles('**/composer.lock') }}"
+ restore-keys: |
+ php-${{ matrix.php-version }}-${{ matrix.dependencies }}-composer-
+
+ - name: "Install tools"
+ run: "phive install --trust-gpg-keys E82B2FB314E9906E,CF1A108D0E7AE720,8A03EA3B385DBAA1,12CE0F1D262429A5 --force-accept-unsigned"
+
+ - name: "Install lowest dependencies"
+ if: ${{ matrix.dependencies == 'lowest' }}
+ run: "composer update --prefer-lowest --no-interaction --no-progress --no-suggest"
+
+ - name: "Install highest dependencies"
+ if: ${{ matrix.dependencies == 'highest' }}
+ run: "composer update --no-interaction --no-progress --no-suggest"
+
+ - name: "Install locked dependencies"
+ if: ${{ matrix.dependencies == 'locked' }}
+ run: "composer install --no-interaction --no-progress --no-suggest"
+
+ - name: "Tests"
+ run: "composer test"
diff --git a/.gitignore b/.gitignore
index e0a7c66..482dd47 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,4 @@
vendor/
bin/
-composer.lock
-composer.phar
-*.cache
\ No newline at end of file
+var/
+tools/
\ No newline at end of file
diff --git a/.phive/phars.xml b/.phive/phars.xml
new file mode 100644
index 0000000..a00e5c5
--- /dev/null
+++ b/.phive/phars.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index aa0c007..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-language: php
-
-cache:
- directories:
- - $HOME/.composer/cache
-
-matrix:
- include:
- - php: 7.3
- - php: 7.4
-
-before_install:
- - composer self-update
-
-install:
- - composer update
-
-script:
- - composer run test
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 15c1f68..6125fde 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,268 @@
-# 2.0
+## [Unreleased] - 2020-10-18
-* Added support for PHP7
-* Updated dependencies to support Symfony3 components
-* Added support for Ordinal number strategies that require prefixes
+### Added
+- [#120](https://github.com/coduo/php-humanizer/pull/120) - **test for azerbaijani language** - [@4t87ux8](https://github.com/4t87ux8)
+- [#119](https://github.com/coduo/php-humanizer/pull/119) - **support azerbaijani language** - [@4t87ux8](https://github.com/4t87ux8)
+
+### Changed
+- [#118](https://github.com/coduo/php-humanizer/pull/118) - **create azerbaijani translation** - [@4t87ux8](https://github.com/4t87ux8)
+- [fa52e6](https://github.com/coduo/php-humanizer/commit/fa52e6223eef2f19fbd0a290432b5a878317dca2) - **Fixxed issue with symfony translator dependency, upgraded php, phpunit and phpspec dependencies** - [@norberttech](https://github.com/norberttech)
+- [f989a9](https://github.com/coduo/php-humanizer/commit/f989a91d2d90f5d4bf4922ab9fec1674e7fe024e) - **Create FUNDING.yml** - [@norberttech](https://github.com/norberttech)
+- [142689](https://github.com/coduo/php-humanizer/commit/142689763a6aafdd9f1dfbb48db9807bbe027acc) - **Update README.md** - [@norberttech](https://github.com/norberttech)
+- [6255e0](https://github.com/coduo/php-humanizer/commit/6255e022c0ff8767cae6cdb4552d13f5f0df0d65) - **Moved php-cs-fixer to dev dependency where it belongs to** - [@norberttech](https://github.com/norberttech)
+- [4d62db](https://github.com/coduo/php-humanizer/commit/4d62dba187d89bc8276ff6e5364d2dd9a3f2ad5f) - **Migrated from travis-ci.org to travis-ci.com** - [@norberttech](https://github.com/norberttech)
+- [dc528e](https://github.com/coduo/php-humanizer/commit/dc528ebcef31b793e1dd24dbe90f14039361fad1) - **Update README.md** - [@norberttech](https://github.com/norberttech)
+- [1b2787](https://github.com/coduo/php-humanizer/commit/1b2787d28282247b3fe68cd5b9f6bf80f304fa63) - **dev-master branch aliast** - [@norberttech](https://github.com/norberttech)
+
+### Fixed
+- [fc3a04](https://github.com/coduo/php-humanizer/commit/fc3a043f6e03bc29e86d0cd58ae3a6b7daf40d69) - **travis configuration** - [@norberttech](https://github.com/norberttech)
+- [#115](https://github.com/coduo/php-humanizer/pull/115) - **composer autoloading deprecation notice; Support symfony 5** - [@brianwozeniak](https://github.com/brianwozeniak)
+
+### Removed
+- [83a180](https://github.com/coduo/php-humanizer/commit/83a1805da9a28a98a0bb932a5236becd44ea79b6) - **php 8.0 from matrix** - [@norberttech](https://github.com/norberttech)
+
+## [3.0.2] - 2019-04-29
+
+### Changed
+- [9d83e5](https://github.com/coduo/php-humanizer/commit/9d83e509dacfd26250ee4c6b0f195affb08cb1e2) - **Moved php-cs-fixer to dev dependency where it belongs to** - [@norberttech](https://github.com/norberttech)
+
+## [3.0.1] - 2019-04-20
+
+### Changed
+- [380428](https://github.com/coduo/php-humanizer/commit/38042820e9ee7ccc76d66f9c480fe8b7f0e8aaf0) - **Update README.md** - [@norberttech](https://github.com/norberttech)
+
+## [3.0.0] - 2019-04-20
+
+### Added
+- [17a5ab](https://github.com/coduo/php-humanizer/commit/17a5ab5243ae1eec2e3d39388bf611088b8fd5e7) - **missing translations** - [@norberttech](https://github.com/norberttech)
+- [#86](https://github.com/coduo/php-humanizer/pull/86) - **test case with 0 at the end of the number** - [@norberttech](https://github.com/norberttech)
+- [#84](https://github.com/coduo/php-humanizer/pull/84) - **PFIGS ordinals** - [@martinbutt](https://github.com/martinbutt)
+
+### Changed
+- [1b2787](https://github.com/coduo/php-humanizer/commit/1b2787d28282247b3fe68cd5b9f6bf80f304fa63) - **dev-master branch aliast** - [@norberttech](https://github.com/norberttech)
+- [14ab74](https://github.com/coduo/php-humanizer/commit/14ab746762acd1856ddd386023128f23935ef119) - **CS Fixes** - [@norberttech](https://github.com/norberttech)
+- [9edceb](https://github.com/coduo/php-humanizer/commit/9edceb2d21fa879e91072308b8bbe3503a346bd2) - **CS Fixes** - [@norberttech](https://github.com/norberttech)
+- [#112](https://github.com/coduo/php-humanizer/pull/112) - **Upgraded thunderer/shortcode dependency to ^0.7** - [@thunderer](https://github.com/thunderer)
+- [#111](https://github.com/coduo/php-humanizer/pull/111) - **Allow later versions of symfony packages** - [@brianwozeniak](https://github.com/brianwozeniak)
+- [#91](https://github.com/coduo/php-humanizer/pull/91) - **Sanity check for NumberFormatter when intl is not installed** - [@thunderer](https://github.com/thunderer)
+- [#40](https://github.com/coduo/php-humanizer/pull/40) - **Romanian translations** - [@a-ungurianu](https://github.com/a-ungurianu)
+- [#106](https://github.com/coduo/php-humanizer/pull/106) - **[master] Add translation: zh_TW** - [@jfcherng](https://github.com/jfcherng)
+- [#104](https://github.com/coduo/php-humanizer/pull/104) - **Feature/update** - [@norberttech](https://github.com/norberttech)
+- [#89](https://github.com/coduo/php-humanizer/pull/89) - **remove unnecessary echo** - [@vinicius73](https://github.com/vinicius73)
+- [#87](https://github.com/coduo/php-humanizer/pull/87) - **Force $binaryPrefixes array ordering on 32-bit systems, fixes #83** - [@Forst](https://github.com/Forst)
+- [5cd850](https://github.com/coduo/php-humanizer/commit/5cd850b49b1ca30811f24c5c1a9b0d6e4cac9fba) - **Update composer.json** - [@norberttech](https://github.com/norberttech)
+- [#85](https://github.com/coduo/php-humanizer/pull/85) - **Support Japanese language** - [@serima](https://github.com/serima)
+
+### Fixed
+- [9b52c5](https://github.com/coduo/php-humanizer/commit/9b52c5dc42f10ff60f4827ff9a736b3a1a18f0e4) - **README.md** - [@norberttech](https://github.com/norberttech)
+- [#80](https://github.com/coduo/php-humanizer/pull/80) - **russian translation** - [@dizzy7](https://github.com/dizzy7)
+
+## [2.0.1] - 2019-02-25
+
+### Changed
+- [#107](https://github.com/coduo/php-humanizer/pull/107) - **[2.0] Add translation: zh_TW** - [@jfcherng](https://github.com/jfcherng)
+
+### Fixed
+- [#108](https://github.com/coduo/php-humanizer/pull/108) - **travis configuration for 2.0 branch** - [@norberttech](https://github.com/norberttech)
+
+## [2.0.0-beta] - 2016-02-21
+
+### Added
+- [#78](https://github.com/coduo/php-humanizer/pull/78) - **ext-inl to composer suggest** - [@norberttech](https://github.com/norberttech)
+- [#68](https://github.com/coduo/php-humanizer/pull/68) - **composer cache folder and move to new infrastructure** - [@norberttech](https://github.com/norberttech)
+
+### Changed
+- [e85d69](https://github.com/coduo/php-humanizer/commit/e85d6905a097f9ba6b2165d9998749eb113d0289) - **Merge pull request #78 from norzechowicz/suggest-intl** - [@norzechowicz](https://github.com/norzechowicz)
+- [#75](https://github.com/coduo/php-humanizer/pull/75) - **Cleanup before stable release** - [@norberttech](https://github.com/norberttech)
+- [f5831e](https://github.com/coduo/php-humanizer/commit/f5831e3be54ca85c9fc14ee5da00b2d6ba1143bb) - **Merge pull request #75 from norzechowicz/cleanup** - [@norzechowicz](https://github.com/norzechowicz)
+- [#73](https://github.com/coduo/php-humanizer/pull/73) - **improve strategy to handle prefix-ordinal** - [@isnani](https://github.com/isnani)
+- [6ec963](https://github.com/coduo/php-humanizer/commit/6ec963fb1c8ecee66feb0228ca5626f1c1ca09f8) - **Merge pull request #73 from isnani/improve-ordinal-strategy** - [@norzechowicz](https://github.com/norzechowicz)
+- [#70](https://github.com/coduo/php-humanizer/pull/70) - **Cleanup** - [@norberttech](https://github.com/norberttech)
+- [dac4b4](https://github.com/coduo/php-humanizer/commit/dac4b43390f320b82728f1e5e0ad45f7c68d591e) - **Merge pull request #70 from norzechowicz/cleanup** - [@norzechowicz](https://github.com/norzechowicz)
+- [#69](https://github.com/coduo/php-humanizer/pull/69) - **Renamed all facades in order to support php7** - [@norberttech](https://github.com/norberttech)
+- [b7214c](https://github.com/coduo/php-humanizer/commit/b7214ce3e0511d5172568aff4a4572a0d80762a1) - **Merge pull request #69 from norzechowicz/php7-support** - [@norzechowicz](https://github.com/norzechowicz)
+- [3f252e](https://github.com/coduo/php-humanizer/commit/3f252ef1a717a841dac1316f835494ef82104cde) - **master branch alias** - [@norberttech](https://github.com/norberttech)
+- [ae6020](https://github.com/coduo/php-humanizer/commit/ae602062f4500488dcbd119b3560a1bdd4fe2699) - **Merge pull request #68 from norzechowicz/travis-ci** - [@norzechowicz](https://github.com/norzechowicz)
+- [7c7e79](https://github.com/coduo/php-humanizer/commit/7c7e79dabc0989dbaf485d46c00d9d836c929f8a) - **Merge pull request #67 from nwatth/thai-translation** - [@norzechowicz](https://github.com/norzechowicz)
+- [#67](https://github.com/coduo/php-humanizer/pull/67) - **Thai translation** - [@nwatth](https://github.com/nwatth)
+
+## [1.0.9] - 2015-12-02
+
+### Added
+- [#54](https://github.com/coduo/php-humanizer/pull/54) - **Ukrainian to the list of languages** - [@Borales](https://github.com/Borales)
+- [d2904a](https://github.com/coduo/php-humanizer/commit/d2904ae1e1ebd79c7b8224aa31bd5aec8d9575a4) - **composer.phar into .gitignore** - [@norberttech](https://github.com/norberttech)
+- [#26](https://github.com/coduo/php-humanizer/pull/26) - **Spanish translation.** - [@orestes](https://github.com/orestes)
+- [#53](https://github.com/coduo/php-humanizer/pull/53) - **Chinese Simplified (zh_CN)** - [@arrowrowe](https://github.com/arrowrowe)
+
+### Changed
+- [#65](https://github.com/coduo/php-humanizer/pull/65) - **Oxford french translation** - [@percymamedy](https://github.com/percymamedy)
+- [b36457](https://github.com/coduo/php-humanizer/commit/b364572a7a73bed0be62a7d2df382fb1ab35cd2a) - **Merge pull request #65 from percymamedy/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [#66](https://github.com/coduo/php-humanizer/pull/66) - **Danish translation** - [@hyperpanic](https://github.com/hyperpanic)
+- [7599dd](https://github.com/coduo/php-humanizer/commit/7599dd847f6b72c6c41f9458cfd92092200644e9) - **Merge pull request #66 from radiosignal/danish-translation** - [@norzechowicz](https://github.com/norzechowicz)
+- [#61](https://github.com/coduo/php-humanizer/pull/61) - **Shortcode removal utilities** - [@thunderer](https://github.com/thunderer)
+- [6bed68](https://github.com/coduo/php-humanizer/commit/6bed6804a97b0489af80ea229616d26a7224b33a) - **Merge pull request #61 from thunderer/string-shortcode-removal** - [@norzechowicz](https://github.com/norzechowicz)
+- [a78a55](https://github.com/coduo/php-humanizer/commit/a78a552671dc51f4393b2806097250d0163eee2f) - **Merge pull request #64 from ddmler/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [#64](https://github.com/coduo/php-humanizer/pull/64) - **German translation** - [@ddmler](https://github.com/ddmler)
+- [3eb227](https://github.com/coduo/php-humanizer/commit/3eb227e710726d04b1905dfc2422370d716611d5) - **Merge pull request #46 from doenietzomoeilijk/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [#46](https://github.com/coduo/php-humanizer/pull/46) - **Refactor Number into separate languages** - [@doenietzomoeilijk](https://github.com/doenietzomoeilijk)
+- [a68dc7](https://github.com/coduo/php-humanizer/commit/a68dc7326b1991161e423812d454bf51f4c15d5e) - **Update README.md** - [@norzechowicz](https://github.com/norzechowicz)
+- [3bcb4b](https://github.com/coduo/php-humanizer/commit/3bcb4b6c204a1d042517bb93e39f45cef1fe8615) - **Merge pull request #54 from Borales/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [#58](https://github.com/coduo/php-humanizer/pull/58) - **Remove composer.phar file** - [@vinkla](https://github.com/vinkla)
+- [216c9b](https://github.com/coduo/php-humanizer/commit/216c9bbd1f173213a5137306faf5a8a04cab315e) - **Merge pull request #55 from hjason/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [5c9bb3](https://github.com/coduo/php-humanizer/commit/5c9bb3393a682126bb8d2d51fcdc77476eef2b83) - **Merge pull request #26 from orestes/es-translation** - [@norzechowicz](https://github.com/norzechowicz)
+- [34ef53](https://github.com/coduo/php-humanizer/commit/34ef53fbd42ee7d33999ca4896ea17c2a1cc8a30) - **Update README.md** - [@norzechowicz](https://github.com/norzechowicz)
+- [51ea67](https://github.com/coduo/php-humanizer/commit/51ea6720069d822a9b9ef8797d708b7205123517) - **Merge pull request #53 from dyweb/master** - [@norzechowicz](https://github.com/norzechowicz)
+
+### Fixed
+- [73e99d](https://github.com/coduo/php-humanizer/commit/73e99d096f9f1bc4f66fbb13fc0a3a6f620f4eea) - **StringTest** - [@hjason2042@gmail.com](#)
+
+## [1.0.8] - 2015-11-06
+
+### Added
+- [#52](https://github.com/coduo/php-humanizer/pull/52) - **Indonesian language** - [@naprirfan](https://github.com/naprirfan)
+- [#41](https://github.com/coduo/php-humanizer/pull/41) - **russian. Add prefix at format difference.** - [@sam002](https://github.com/sam002)
+- [#51](https://github.com/coduo/php-humanizer/pull/51) - **possibility to pass forbidden words into humanizer** - [@norberttech](https://github.com/norberttech)
+- [#49](https://github.com/coduo/php-humanizer/pull/49) - **support for multiple character separators at string humanizer** - [@drgomesp](https://github.com/drgomesp)
+- [#27](https://github.com/coduo/php-humanizer/pull/27) - **Bulgarian translation** - [@lpopov](https://github.com/lpopov)
+- [f65309](https://github.com/coduo/php-humanizer/commit/f6530941c4fb5c109aa593229a3ea3da449b6781) - **the breakpoint in the constructor** - [@smeeckaert](https://github.com/smeeckaert)
+- [798d77](https://github.com/coduo/php-humanizer/commit/798d77d6b864b2d46b4c2487f616ea044f08f92c) - **breakpoint tests** - [@smeeckaert](https://github.com/smeeckaert)
+- [#38](https://github.com/coduo/php-humanizer/pull/38) - **Dutch Oxford translations.** - [@doenietzomoeilijk](https://github.com/doenietzomoeilijk)
+- [#29](https://github.com/coduo/php-humanizer/pull/29) - **Norwegian translation** - [@dagaa](https://github.com/dagaa)
+- [#16](https://github.com/coduo/php-humanizer/pull/16) - **Dutch translation.** - [@Ozmodiar](https://github.com/Ozmodiar)
+
+### Changed
+- [d6e784](https://github.com/coduo/php-humanizer/commit/d6e784a86b6f2318394fd6b8af853e5180d3ab15) - **Merge pull request #52 from naprirfan/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [9d1732](https://github.com/coduo/php-humanizer/commit/9d17321e4259ff8376d5a779c0ad682b4394ae00) - **Merge pull request #47 from mostertb/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [#47](https://github.com/coduo/php-humanizer/pull/47) - **Support for optional explicit BinarySuffix precision** - [@mostertb](https://github.com/mostertb)
+- [a4d68a](https://github.com/coduo/php-humanizer/commit/a4d68a956478bfe84661ca1f8a6c8984aaba741c) - **Merge pull request #41 from sam002/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [#30](https://github.com/coduo/php-humanizer/pull/30) - **TruncateHtml** - [@smeeckaert](https://github.com/smeeckaert)
+- [0465bd](https://github.com/coduo/php-humanizer/commit/0465bd058e9b8c26bf9dc00f38fe14a8473f67b7) - **Merge branch 'master' of git://github.com/smeeckaert/php-humanizer into smeeckaert-master** - [@norberttech](https://github.com/norberttech)
+- [4a6ed1](https://github.com/coduo/php-humanizer/commit/4a6ed1f15345562df1eede367112d06a9fc41ab3) - **Merge pull request #51 from norzechowicz/humanizer-forbidden-words** - [@norzechowicz](https://github.com/norzechowicz)
+- [c0606e](https://github.com/coduo/php-humanizer/commit/c0606e6844a22bc5480a2527d2f043d6a52eb52a) - **Merge pull request #50 from norzechowicz/phpunit** - [@norzechowicz](https://github.com/norzechowicz)
+- [#50](https://github.com/coduo/php-humanizer/pull/50) - **Moved integration tests from phpspec into phpunit** - [@norberttech](https://github.com/norberttech)
+- [0a04e0](https://github.com/coduo/php-humanizer/commit/0a04e02fbf7ba37a2df8b4c3a5f0b93d0ce9f002) - **Merge pull request #49 from drgomesp/support-multiple-character-separator** - [@norzechowicz](https://github.com/norzechowicz)
+- [fe8f03](https://github.com/coduo/php-humanizer/commit/fe8f03731d1349fb24df7eb3d16eeda0b5d6f633) - **Merge pull request #27 from lpopov/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [#44](https://github.com/coduo/php-humanizer/pull/44) - **[ADD] Support PSR-4 Composer** - [@Th3Mouk](https://github.com/Th3Mouk)
+- [75825a](https://github.com/coduo/php-humanizer/commit/75825a8ca318a3d7c523d3d489dd0547ab6a6b23) - **Merge pull request #44 from Th3Mouk/patch-1** - [@norzechowicz](https://github.com/norzechowicz)
+- [#42](https://github.com/coduo/php-humanizer/pull/42) - **Fixes a typo in French** - [@Gnomino](https://github.com/Gnomino)
+- [5bbff0](https://github.com/coduo/php-humanizer/commit/5bbff03cebefdf95eaa4cf9c53905c703a471ae4) - **style** - [@smeeckaert](https://github.com/smeeckaert)
+- [cc7a56](https://github.com/coduo/php-humanizer/commit/cc7a56a09f31a50bf32a329dea7b65c446e53631) - **refacto truncate** - [@smeeckaert](https://github.com/smeeckaert)
+- [a7cb87](https://github.com/coduo/php-humanizer/commit/a7cb8781189fb13d078530a03111bef47af8d04e) - **rename breakpoint len** - [@smeeckaert](https://github.com/smeeckaert)
+- [91d107](https://github.com/coduo/php-humanizer/commit/91d1079d1f6eb88ec784d66e71c88da459ae6e37) - **code style** - [@smeeckaert](https://github.com/smeeckaert)
+- [dac446](https://github.com/coduo/php-humanizer/commit/dac446bb4bb0a959fb39466b3729bc97060f4449) - **refacto visibility and breakpoint** - [@smeeckaert](https://github.com/smeeckaert)
+- [#34](https://github.com/coduo/php-humanizer/pull/34) - **string functions into multibyte string functions** - [@norberttech](https://github.com/norberttech)
+- [#35](https://github.com/coduo/php-humanizer/pull/35) - **Oxford italian translations** - [@omissis](https://github.com/omissis)
+- [#22](https://github.com/coduo/php-humanizer/pull/22) - **Oxford collection + phpcs fixer cleanup.** - [@defrag](https://github.com/defrag)
+- [#33](https://github.com/coduo/php-humanizer/pull/33) - **Truncate check length of append** - [@smeeckaert](https://github.com/smeeckaert)
+- [#31](https://github.com/coduo/php-humanizer/pull/31) - **Addition of Portuguese (pt) language translation (with spec tests)** - [@lightglitch](https://github.com/lightglitch)
+- [8cdeae](https://github.com/coduo/php-humanizer/commit/8cdeaef54f759d7e9a93c85cbf9e6e7b63dd6e76) - **truncate html** - [@smeeckaert](https://github.com/smeeckaert)
+- [#28](https://github.com/coduo/php-humanizer/pull/28) - **Addition of Afrikaans (af) language translation (with spec tests)** - [@sarelvdwalt](https://github.com/sarelvdwalt)
+- [#21](https://github.com/coduo/php-humanizer/pull/21) - **More correct wording for Dutch version of "... from now".** - [@Ozmodiar](https://github.com/Ozmodiar)
+- [1f9243](https://github.com/coduo/php-humanizer/commit/1f924384c5f7b8bfbced89debac2b67b78511f7a) - **Merge pull request #21 from Ozmodiar/nl-translation** - [@norzechowicz](https://github.com/norzechowicz)
+- [f5dafa](https://github.com/coduo/php-humanizer/commit/f5dafa6e721f93306496d3207e646a60c5bb4283) - **Merge pull request #18 from mattallty/patch-1** - [@norzechowicz](https://github.com/norzechowicz)
+- [120f11](https://github.com/coduo/php-humanizer/commit/120f118c7051bdde9e9ea1d442cce6a70dfea8d9) - **Merge pull request #19 from NoUseFreak/composer_install** - [@norzechowicz](https://github.com/norzechowicz)
+- [#19](https://github.com/coduo/php-humanizer/pull/19) - **Update composer installation instructions.** - [@NoUseFreak](https://github.com/NoUseFreak)
+- [158714](https://github.com/coduo/php-humanizer/commit/1587145004b2f97b0562d359ef7c6d46e96295de) - **Merge pull request #16 from Ozmodiar/nl-translation** - [@norzechowicz](https://github.com/norzechowicz)
+- [e49510](https://github.com/coduo/php-humanizer/commit/e49510dfd6e381489cfc5976b5683dba5d5e73da) - **Merge pull request #17 from Ozmodiar/readme-parenthesis** - [@norzechowicz](https://github.com/norzechowicz)
+
+### Fixed
+- [3c3b83](https://github.com/coduo/php-humanizer/commit/3c3b830fad0f6e436a08b3f1adf20334a6a77604) - **doc** - [@smeeckaert](https://github.com/smeeckaert)
+- [#18](https://github.com/coduo/php-humanizer/pull/18) - **typo in french translation** - [@mattallty](https://github.com/mattallty)
+- [#17](https://github.com/coduo/php-humanizer/pull/17) - **parenthesis.** - [@Ozmodiar](https://github.com/Ozmodiar)
+
+## [1.0.7] - 2015-10-26
+
+### Added
+- [#15](https://github.com/coduo/php-humanizer/pull/15) - **spec for Italian translations** - [@norberttech](https://github.com/norberttech)
+- [#14](https://github.com/coduo/php-humanizer/pull/14) - **italian translations.** - [@omissis](https://github.com/omissis)
+
+### Changed
+- [a23b8e](https://github.com/coduo/php-humanizer/commit/a23b8e5b32a1b41e8e0d653a2de77ca090f47f8d) - **Merge pull request #15 from norzechowicz/italian-translations-spec** - [@norzechowicz](https://github.com/norzechowicz)
+- [0db6f5](https://github.com/coduo/php-humanizer/commit/0db6f5d73b46bf8864b3dfc4823b29aeb97dd326) - **Merge pull request #14 from omissis/italian-translations** - [@norzechowicz](https://github.com/norzechowicz)
+- [d05a54](https://github.com/coduo/php-humanizer/commit/d05a5494266fe5bc13e64aaa3c85cb58919fc63f) - **Update README.md** - [@norzechowicz](https://github.com/norzechowicz)
+
+## [1.0.6] - 2015-10-26
+
+### Changed
+- [8d7fff](https://github.com/coduo/php-humanizer/commit/8d7fff6382f60b278ddb069d9088d9d35ce26540) - **Rename difference.pt_br.yml to difference.pt_BR.yml** - [@norzechowicz](https://github.com/norzechowicz)
+
+## [1.0.4] - 2015-10-26
+
+### Added
+- [#10](https://github.com/coduo/php-humanizer/pull/10) - **translation for Portuguese - Brazil** - [@IgorDePaula](https://github.com/IgorDePaula)
+- [c6a594](https://github.com/coduo/php-humanizer/commit/c6a594a57ea3687cb199183b56a232761a81f736) - **specs for FR translations** - [@norberttech](https://github.com/norberttech)
+
+### Changed
+- [6051e8](https://github.com/coduo/php-humanizer/commit/6051e89f3bacd816dced8b3d1cb3a07c1b9b0336) - **Merge pull request #12 from marcamon2013/master** - [@norzechowicz](https://github.com/norzechowicz)
+- [#12](https://github.com/coduo/php-humanizer/pull/12) - **Translation file added** - [@jebog](https://github.com/jebog)
+- [#13](https://github.com/coduo/php-humanizer/pull/13) - **create turkish translation** - [@cnkt](https://github.com/cnkt)
+- [e007db](https://github.com/coduo/php-humanizer/commit/e007dbcccdf56ae2021f13b300f78e2fca628d5b) - **Merge pull request #13 from cnkt/master** - [@norzechowicz](https://github.com/norzechowicz)
+
+### Fixed
+- [8754ad](https://github.com/coduo/php-humanizer/commit/8754ad1f0e680d547c4197cc48d13d7f0b6ab766) - **Translator Builder regexp, added spec and updated readme for pt_BR translation** - [@norberttech](https://github.com/norberttech)
+- [38bc22](https://github.com/coduo/php-humanizer/commit/38bc22377a66d24d3ebda915afa09e83cf3d8581) - **typo in TR translations and added spec** - [@norberttech](https://github.com/norberttech)
+
+## [1.0.3] - 2015-10-24
+
+### Added
+- [9c6a59](https://github.com/coduo/php-humanizer/commit/9c6a59981ca6902644c7c35c8deea1cbc994d7c7) - **German locale specs** - [@norberttech](https://github.com/norberttech)
+
+### Changed
+- [a91217](https://github.com/coduo/php-humanizer/commit/a91217819c7c1d3a0f6a41182784b98681cb6f83) - **Update README.md** - [@norzechowicz](https://github.com/norzechowicz)
+- [c227c3](https://github.com/coduo/php-humanizer/commit/c227c3bfe343ce8322daee67bfb8116add20af1e) - **Rename difference-de.yml to difference.de.yml** - [@norzechowicz](https://github.com/norzechowicz)
+
+## [1.0.2] - 2015-10-24
+
+### Added
+- [#11](https://github.com/coduo/php-humanizer/pull/11) - **german translation** - [@tbreuss](https://github.com/tbreuss)
+
+### Changed
+- [9cb14a](https://github.com/coduo/php-humanizer/commit/9cb14aa8c77d6dc6aaff87770680251c993c0b79) - **Merge pull request #11 from tbreuss/master** - [@norzechowicz](https://github.com/norzechowicz)
+
+## [1.0.1] - 2015-07-14
+
+### Changed
+- [#9](https://github.com/coduo/php-humanizer/pull/9) - **Test lowest version of dependencies** - [@norberttech](https://github.com/norberttech)
+- [97fee0](https://github.com/coduo/php-humanizer/commit/97fee0dbe7999c4305a3de686f9fdc6b3502796e) - **Merge pull request #9 from norzechowicz/test-lowest-dependencies** - [@norzechowicz](https://github.com/norzechowicz)
+- [d97917](https://github.com/coduo/php-humanizer/commit/d979178d45d631d9acd98394b90be3ff345c8c02) - **Update README.md** - [@defrag](https://github.com/defrag)
+- [80500c](https://github.com/coduo/php-humanizer/commit/80500c5c50e45f0346af394e3031307923d59b5f) - **Update README.md** - [@defrag](https://github.com/defrag)
+- [59a604](https://github.com/coduo/php-humanizer/commit/59a6045a716ec63bfb335ea326ce4ee82cf5a4f7) - **Update README.md** - [@defrag](https://github.com/defrag)
+
+## [1.0.0] - 2014-06-12
+
+### Added
+- [#8](https://github.com/coduo/php-humanizer/pull/8) - **missing require for symfony/yaml in composer.json** - [@dedik](https://github.com/dedik)
+- [#4](https://github.com/coduo/php-humanizer/pull/4) - **truncate operation** - [@norberttech](https://github.com/norberttech)
+- [#3](https://github.com/coduo/php-humanizer/pull/3) - **roman converters** - [@defrag](https://github.com/defrag)
+- [#1](https://github.com/coduo/php-humanizer/pull/1) - **number and oridinalize** - [@defrag](https://github.com/defrag)
+- [192a29](https://github.com/coduo/php-humanizer/commit/192a29e78fb2fe8595da1a43580a0a2f7914399c) - **travis configuration** - [@norberttech](https://github.com/norberttech)
+
+### Changed
+- [b5a504](https://github.com/coduo/php-humanizer/commit/b5a504fec092d6d41391a1de6db09eb756e51895) - **Merge pull request #8 from dedik/master** - [@norberttech](https://github.com/norberttech)
+- [673cc6](https://github.com/coduo/php-humanizer/commit/673cc617a158c83056ae7d1647467ef771a4fdbf) - **Update README.md** - [@defrag](https://github.com/defrag)
+- [e5906b](https://github.com/coduo/php-humanizer/commit/e5906b5ea334a52960fab67f465246079fe971e3) - **Update README.md** - [@defrag](https://github.com/defrag)
+- [43ba95](https://github.com/coduo/php-humanizer/commit/43ba95d307ae00d480393cce368491f62deee4f7) - **Merge pull request #7 from defrag/precise-date-fix** - [@norberttech](https://github.com/norberttech)
+- [#6](https://github.com/coduo/php-humanizer/pull/6) - **Precise diffs** - [@defrag](https://github.com/defrag)
+- [08b9d1](https://github.com/coduo/php-humanizer/commit/08b9d1b4f35d3f5846fb187248548d2148a261e5) - **Merge pull request #6 from defrag/precise-diff** - [@norberttech](https://github.com/norberttech)
+- [7438be](https://github.com/coduo/php-humanizer/commit/7438be84cdc9831215bf99f83601ce3c4abfeb1e) - **Merge pull request #5 from norzechowicz/time** - [@defrag](https://github.com/defrag)
+- [#5](https://github.com/coduo/php-humanizer/pull/5) - **[WIP] Introduce time difference humanizer** - [@norberttech](https://github.com/norberttech)
+- [618179](https://github.com/coduo/php-humanizer/commit/618179735f5583ca8d425a8ccf375ce0afd22e55) - **Merge pull request #4 from norzechowicz/truncate** - [@defrag](https://github.com/defrag)
+- [711775](https://github.com/coduo/php-humanizer/commit/71177557d8d4bc7b95e10170c34cd176a8287e38) - **Moved library to Coduo organization** - [@norberttech](https://github.com/norberttech)
+- [6815c6](https://github.com/coduo/php-humanizer/commit/6815c651a7570802ccc5beaf3e6408e6abab1caa) - **Merge pull request #3 from defrag/roman** - [@norberttech](https://github.com/norberttech)
+- [cee3c3](https://github.com/coduo/php-humanizer/commit/cee3c34860042bb93ce73d39ea32fd6b9acef3d1) - **Update readme** - [@norberttech](https://github.com/norberttech)
+- [fda9db](https://github.com/coduo/php-humanizer/commit/fda9db3ef94591e80d627517390c42d688021d7a) - **Merge remote-tracking branch 'origin/master'** - [@norberttech](https://github.com/norberttech)
+- [fd51e9](https://github.com/coduo/php-humanizer/commit/fd51e914d98d28943a34a3fea9237f4a8c6c7e90) - **Metric suffix** - [@norberttech](https://github.com/norberttech)
+- [7b7d4e](https://github.com/coduo/php-humanizer/commit/7b7d4e4453211e1975f3004a74670e6ebdbecb1c) - **Merge pull request #2 from pborreli/typos** - [@norberttech](https://github.com/norberttech)
+- [720bec](https://github.com/coduo/php-humanizer/commit/720becd16f48140d94a983e5eaa6c4e1b9879442) - **Update README.md** - [@norberttech](https://github.com/norberttech)
+- [e62090](https://github.com/coduo/php-humanizer/commit/e62090a6ba103a63718fd17a5d6a0001f007ecac) - **Update README.md** - [@norberttech](https://github.com/norberttech)
+- [d7fd45](https://github.com/coduo/php-humanizer/commit/d7fd45f39377298e35922843cfe004497898cf18) - **Binary suffix converter** - [@norberttech](https://github.com/norberttech)
+- [65564e](https://github.com/coduo/php-humanizer/commit/65564e1202be4e67822e40c366dd36836bdec70a) - **Refactoring** - [@norberttech](https://github.com/norberttech)
+- [58f3d5](https://github.com/coduo/php-humanizer/commit/58f3d560caba8ec66ca57ef66cc3e598ee5eb230) - **Merge pull request #1 from defrag/number** - [@norberttech](https://github.com/norberttech)
+- [35d7e6](https://github.com/coduo/php-humanizer/commit/35d7e69c62e653f2f180b96597002bf143f79ec0) - **String humanize introduction** - [@norberttech](https://github.com/norberttech)
+- [e2bfc6](https://github.com/coduo/php-humanizer/commit/e2bfc680b3f339f6bf2f6e39ce9a17f02eeaebbe) - **Initial commit** - [@norberttech](https://github.com/norberttech)
+
+### Fixed
+- [#7](https://github.com/coduo/php-humanizer/pull/7) - **precise date calculations** - [@defrag](https://github.com/defrag)
+- [#2](https://github.com/coduo/php-humanizer/pull/2) - **typos** - [@pborreli](https://github.com/pborreli)
+
+Generated by [Automation](https://github.com/aeon-php/automation)
\ No newline at end of file
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..6681a3f
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at norbert+coduo@orzechowicz.pl. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index ee409ba..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,23 +0,0 @@
-#A quick guide to contribute to the project:
-
-##Installing the dev environment
-
-1. Fork the repo
-2. Clone the repo to local
-3. Install dependencies: `composer install` (this assumes you have 'composer' aliased to whereever your composer.phar lives)
-4. Run the tests. We only take pull requests with passing tests, and it's great to know that you have a clean slate:
- `./bin/phpspec run --format=pretty`
-
-##The actual contribution
-
-1. Make the changes/additions to the code, committing often and making clear what you've done
-2. Make sure you write tests for your code, located in the folder structure `spec/Coduo/PHPHumanizer/...`
-3. Run your tests (often and while coding): `./bin/phpspec run --format=pretty`
-
-##Coding Standards
-
-Try use similar coding standards to what you see in the project to keep things clear to the contributors. If you're unsure, it's always a safe bet to fall-back to the PSR standards.
-
-[PSR-1: Basic Coding Standard](http://www.php-fig.org/psr/psr-1/)
-
-[PSR-2: Coding Style Guide](http://www.php-fig.org/psr/psr-2/)
diff --git a/LICENSE b/LICENSE
index 6773c8c..aac62ee 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2014 Michal Dabrowski, Norbert Orzechowicz
+Copyright (c) 2014-2021 Michal Dabrowski, Norbert Orzechowicz
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
diff --git a/README.md b/README.md
index 345a7ca..1f7e85d 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# PHP Humanizer
-[![Build Status](https://travis-ci.com/coduo/php-humanizer.svg?branch=4.x)](https://travis-ci.com/coduo/php-humanizer)
+![Tests](https://github.com/coduo/php-humanizer/workflows/Tests/badge.svg?branch=4.x)
[![Latest Stable Version](https://poser.pugx.org/coduo/php-humanizer/v/stable)](https://packagist.org/packages/coduo/php-humanizer)
[![Total Downloads](https://poser.pugx.org/coduo/php-humanizer/downloads)](https://packagist.org/packages/coduo/php-humanizer)
[![Latest Unstable Version](https://poser.pugx.org/coduo/php-humanizer/v/unstable)](https://packagist.org/packages/coduo/php-humanizer)
@@ -8,10 +8,8 @@
### Tests
* [![Build Status](https://travis-ci.com/coduo/php-humanizer.svg?branch=4.x)](https://travis-ci.com/coduo/php-humanizer) - 4.x
-* [![Build Status](https://travis-ci.com/coduo/php-humanizer.svg?branch=3.0)](https://travis-ci.com/coduo/php-humanizer) - 3.0
[Readme for 4.x version](https://github.com/coduo/php-humanizer/tree/4.x/README.md)
-[Readme for 3.0 version](https://github.com/coduo/php-humanizer/tree/3.0/README.md)
diff --git a/baseline.xml b/baseline.xml
new file mode 100644
index 0000000..96ef6bc
--- /dev/null
+++ b/baseline.xml
@@ -0,0 +1,26 @@
+
+
+
+
+ $diff->{$unit->getDateIntervalSymbol()}
+
+
+
+
+ new $strategy()
+
+
+
+
+ $resourceName
+
+
+ $file
+ $resourceName
+
+
+ getBasename
+ getPathname
+
+
+
diff --git a/composer.json b/composer.json
index 098b493..58f5108 100644
--- a/composer.json
+++ b/composer.json
@@ -15,16 +15,13 @@
}
],
"require": {
- "php": ">=7.3",
- "symfony/config": "^4.4|^5.0",
+ "php": "^7.4 | ^8.0",
"symfony/translation": "^4.4|^5.0",
"symfony/yaml": "^4.4|^5.0"
},
"require-dev": {
"thunderer/shortcode": "^0.7",
- "phpspec/phpspec": "^6.0",
- "phpunit/phpunit": "^8.4",
- "friendsofphp/php-cs-fixer": "^2.16"
+ "phpunit/phpunit": "^9.4"
},
"config": {
"bin-dir": "bin"
@@ -39,22 +36,24 @@
"": "tests/"
}
},
- "extra": {
- "branch-alias": {
- "dev-master": "4.0-dev"
- }
- },
"suggest": {
"ext-intl": "Required if you are going to use humanizer with locales different than en_EN"
},
"scripts": {
"cs:php:fix": [
- "php-cs-fixer fix --using-cache=no"
+ "tools/php-cs-fixer fix --using-cache=no"
+ ],
+ "test" : [
+ "phpunit"
+ ],
+ "test:mutation": [
+ "Composer\\Config::disableProcessTimeout",
+ "tools/infection"
],
- "test": [
- "phpspec run --format=pretty",
- "phpunit",
- "php-cs-fixer fix -v --dry-run"
+ "static:analyze": [
+ "tools/psalm --shepherd --stats",
+ "tools/phpstan analyze -c phpstan.neon",
+ "tools/php-cs-fixer fix --dry-run"
]
}
}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..d0fe9ed
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,2640 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "2266b8e08228e1596ce0366b445cd246",
+ "packages": [
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665",
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-07T16:49:33+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-22T09:19:47+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.22-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-07T16:49:33+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v5.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "c021864d4354ee55160ddcfd31dc477a1bc77949"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/c021864d4354ee55160ddcfd31dc477a1bc77949",
+ "reference": "c021864d4354ee55160ddcfd31dc477a1bc77949",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/translation-contracts": "^2.3"
+ },
+ "conflict": {
+ "symfony/config": "<4.4",
+ "symfony/dependency-injection": "<5.0",
+ "symfony/http-kernel": "<5.0",
+ "symfony/twig-bundle": "<5.0",
+ "symfony/yaml": "<4.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/dependency-injection": "^5.0",
+ "symfony/finder": "^4.4|^5.0",
+ "symfony/http-kernel": "^5.0",
+ "symfony/intl": "^4.4|^5.0",
+ "symfony/service-contracts": "^1.1.2|^2",
+ "symfony/yaml": "^4.4|^5.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to internationalize your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/translation/tree/v5.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-27T10:15:41+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105",
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/translation-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-28T13:05:58+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v5.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/338cddc6d74929f6adf19ca5682ac4b8e109cdb0",
+ "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/console": "<4.4"
+ },
+ "require-dev": {
+ "symfony/console": "^4.4|^5.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v5.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-02-03T04:42:09+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^8.0",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/1.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-10T18:47:58+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "replace": {
+ "myclabs/deep-copy": "self.version"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ },
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-13T09:40:50+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.10.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4"
+ },
+ "time": "2020-12-20T10:01:03+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/master"
+ },
+ "time": "2020-06-27T14:33:11+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "e4782611070e50613683d2b9a57730e9a3ba5451"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/e4782611070e50613683d2b9a57730e9a3ba5451",
+ "reference": "e4782611070e50613683d2b9a57730e9a3ba5451",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.0.4"
+ },
+ "time": "2020-12-13T23:18:30+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
+ },
+ "time": "2020-09-03T19:13:55+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0"
+ },
+ "time": "2020-09-17T18:55:26+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "1.12.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "245710e971a030f42e08f4912863805570f23d39"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39",
+ "reference": "245710e971a030f42e08f4912863805570f23d39",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.2",
+ "php": "^7.2 || ~8.0, <8.1",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "sebastian/comparator": "^3.0 || ^4.0",
+ "sebastian/recursion-context": "^3.0 || ^4.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^6.0",
+ "phpunit/phpunit": "^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.11.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "support": {
+ "issues": "https://github.com/phpspec/prophecy/issues",
+ "source": "https://github.com/phpspec/prophecy/tree/1.12.2"
+ },
+ "time": "2020-12-19T10:15:11+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1",
+ "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.10.2",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "*",
+ "ext-xdebug": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:44:49+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:57:25+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f661659747f2f87f9e72095bb207bceb0f151cb4",
+ "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.1",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpspec/prophecy": "^1.12.1",
+ "phpunit/php-code-coverage": "^9.2.3",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.5",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.3",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^2.3",
+ "sebastian/version": "^3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*",
+ "phpspec/prophecy-phpunit": "^2.0.1"
+ },
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.5-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ],
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.2"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/donate.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-02-02T14:45:58+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:08:49+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:49:45+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.7",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:52:27+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:52:38+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:24:23+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:55:19+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.6",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:42:11+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:17:30+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:45:17+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/2.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:18:59+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2020-07-12T23:59:07+00:00"
+ },
+ {
+ "name": "thunderer/shortcode",
+ "version": "v0.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thunderer/Shortcode.git",
+ "reference": "79a219febd774ba1ee66a2992fee1145b4367561"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thunderer/Shortcode/zipball/79a219febd774ba1ee66a2992fee1145b4367561",
+ "reference": "79a219febd774ba1ee66a2992fee1145b4367561",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": ">=4.1",
+ "symfony/yaml": ">=2.0"
+ },
+ "suggest": {
+ "ext-dom": "if you want to use XML serializer",
+ "ext-json": "if you want to use JSON serializer",
+ "symfony/yaml": "if you want to use YAML serializer"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Thunder\\Shortcode\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tomasz Kowalczyk",
+ "email": "tomasz@kowalczyk.cc"
+ }
+ ],
+ "description": "Advanced shortcode (BBCode) parser and engine for PHP",
+ "keywords": [
+ "bbcode",
+ "engine",
+ "library",
+ "parser",
+ "shortcode"
+ ],
+ "support": {
+ "issues": "https://github.com/thunderer/Shortcode/issues",
+ "source": "https://github.com/thunderer/Shortcode/tree/v0.7.4"
+ },
+ "time": "2020-03-08T11:25:13+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0 || ^8.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<3.9.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.9.1"
+ },
+ "time": "2020-07-08T17:02:28+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^7.4 | ^8.0"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.0.0"
+}
diff --git a/phpstan.neon b/phpstan.neon
new file mode 100644
index 0000000..d05e1a4
--- /dev/null
+++ b/phpstan.neon
@@ -0,0 +1,6 @@
+parameters:
+ level: max
+ paths:
+ - src
+
+ tmpDir: var/phpstan/cache
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 546b974..e4936a9 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,23 +1,23 @@
-
+
-
+
./tests/
-
-
- ./src/Coduo/PHPHumanizer/
-
-
+
+
+
+ ./src/
+
+
+
+
+
+
\ No newline at end of file
diff --git a/psalm.xml b/psalm.xml
new file mode 100644
index 0000000..7d8635e
--- /dev/null
+++ b/psalm.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/spec/Coduo/PHPHumanizer/Collection/FormatterSpec.php b/spec/Coduo/PHPHumanizer/Collection/FormatterSpec.php
deleted file mode 100644
index e7bc4a8..0000000
--- a/spec/Coduo/PHPHumanizer/Collection/FormatterSpec.php
+++ /dev/null
@@ -1,47 +0,0 @@
-beConstructedWith($translator);
- $translator->trans(
- 'only_two',
- array('%first%' => 'Michal', '%second%' => 'Norbert'),
- 'oxford'
- )->willReturn('Michal and Norbert');
-
- $translator->trans(
- 'comma_separated_with_limit',
- array('%count%' => 1, "%list%" => 'Michal, Norbert'),
- 'oxford'
- )->willReturn('Michal, Norbert and 1 more');
-
- $translator->trans(
- 'comma_separated',
- array("%list%" => 'Michal, Norbert', '%last%' => "Lukasz"),
- 'oxford'
- )->willReturn('Michal, Norbert and Lukasz');
- }
-
- function it_formats_two_elements()
- {
- $this->format(array("Michal", "Norbert"), null)->shouldReturn("Michal and Norbert");
- }
-
- function it_formats_elements_with_limit()
- {
- $this->format(array("Michal", "Norbert", "Lukasz"), 2)->shouldReturn("Michal, Norbert and 1 more");
- }
-
- function it_formats_elements_without_limit()
- {
- $this->format(array("Michal", "Norbert", "Lukasz"), null)->shouldReturn("Michal, Norbert and Lukasz");
- }
-}
diff --git a/spec/Coduo/PHPHumanizer/Collection/OxfordSpec.php b/spec/Coduo/PHPHumanizer/Collection/OxfordSpec.php
deleted file mode 100644
index 536e4d3..0000000
--- a/spec/Coduo/PHPHumanizer/Collection/OxfordSpec.php
+++ /dev/null
@@ -1,45 +0,0 @@
-formatter = new Formatter(
- $translator->getWrappedObject()
- );
- $this->beConstructedWith($this->formatter);
- }
- function it_returns_empty_string_when_collection_is_empty()
- {
- $this->format(array())->shouldReturn('');
- }
-
- function it_returns_collection_item_string_when_collection_has_one_element()
- {
- $this->format(array(new CollectionItem("Michal")))->shouldReturn('Michal');
- }
-}
-
-class CollectionItem
-{
- private $name;
-
- public function __construct($name)
- {
- $this->name = $name;
- }
-
- public function __toString()
- {
- return $this->name;
- }
-}
diff --git a/spec/Coduo/PHPHumanizer/DateTime/DifferenceSpec.php b/spec/Coduo/PHPHumanizer/DateTime/DifferenceSpec.php
deleted file mode 100644
index dc41b9e..0000000
--- a/spec/Coduo/PHPHumanizer/DateTime/DifferenceSpec.php
+++ /dev/null
@@ -1,106 +0,0 @@
-beConstructedWith(new \DateTime("2014-04-26 13:00:00"), new \DateTime("2014-04-26 12:45:00"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Minute');
- $this->getQuantity()->shouldReturn(15);
- $this->isPast()->shouldReturn(true);
- }
-
- function it_calculate_diff_between_present_and_future_date_in_minutes()
- {
- $this->beConstructedWith(new \DateTime("2014-04-26 13:00:00"), new \DateTime("2014-04-26 13:15:00"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Minute');
- $this->getQuantity()->shouldReturn(15);
- $this->isPast()->shouldReturn(false);
- }
-
- function it_calculate_diff_between_present_and_past_date_in_hours()
- {
- $this->beConstructedWith(new \DateTime("2014-04-26 13:00:00"), new \DateTime("2014-04-26 11:00:00"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Hour');
- $this->getQuantity()->shouldReturn(2);
- $this->isPast()->shouldReturn(true);
- }
-
- function it_calculate_diff_between_present_and_future_date_in_hours()
- {
- $this->beConstructedWith(new \DateTime("2014-04-26 13:00:00"), new \DateTime("2014-04-26 16:00:00"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Hour');
- $this->getQuantity()->shouldReturn(3);
- $this->isPast()->shouldReturn(false);
- }
-
- function it_calculate_diff_between_present_and_past_date_in_days()
- {
- $this->beConstructedWith(new \DateTime("2014-04-10"), new \DateTime("2014-04-09"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Day');
- $this->getQuantity()->shouldReturn(1);
- $this->isPast()->shouldReturn(true);
- }
-
- function it_calculate_diff_between_present_and_future_date_in_days()
- {
- $this->beConstructedWith(new \DateTime("2014-04-10"), new \DateTime("2014-04-11"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Day');
- $this->getQuantity()->shouldReturn(1);
- $this->isPast()->shouldReturn(false);
- }
-
- function it_calculate_diff_between_present_and_past_date_in_weeks()
- {
- $this->beConstructedWith(new \DateTime("2014-04-15"), new \DateTime("2014-04-01"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Week');
- $this->getQuantity()->shouldReturn(2);
- $this->isPast()->shouldReturn(true);
- }
-
- function it_calculate_diff_between_present_and_future_date_in_weeks()
- {
- $this->beConstructedWith(new \DateTime("2014-04-01"), new \DateTime("2014-04-15"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Week');
- $this->getQuantity()->shouldReturn(2);
- $this->isPast()->shouldReturn(false);
- }
-
- function it_calculate_diff_between_present_and_past_date_in_months()
- {
- $this->beConstructedWith(new \DateTime("2014-04-01"), new \DateTime("2014-03-01"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Month');
- $this->getQuantity()->shouldReturn(1);
- $this->isPast()->shouldReturn(true);
- }
-
- function it_calculate_diff_between_present_and_future_date_in_months()
- {
- $this->beConstructedWith(new \DateTime("2014-04-01"), new \DateTime("2014-05-01"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Month');
- $this->getQuantity()->shouldReturn(1);
- $this->isPast()->shouldReturn(false);
- }
-
- function it_calculate_diff_between_present_and_past_date_in_years()
- {
- $this->beConstructedWith(new \DateTime("2014-01-01"), new \DateTime("2012-01-01"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Year');
- $this->getQuantity()->shouldReturn(2);
- $this->isPast()->shouldReturn(true);
- }
-
- function it_calculate_diff_between_present_and_future_date_in_years()
- {
- $this->beConstructedWith(new \DateTime("2014-01-01"), new \DateTime("2015-01-01"));
- $this->getUnit()->shouldReturnAnInstanceOf('Coduo\PHPHumanizer\DateTime\Unit\Year');
- $this->getQuantity()->shouldReturn(1);
- $this->isPast()->shouldReturn(false);
- }
-}
diff --git a/spec/Coduo/PHPHumanizer/DateTime/FormatterSpec.php b/spec/Coduo/PHPHumanizer/DateTime/FormatterSpec.php
deleted file mode 100644
index 1372ad3..0000000
--- a/spec/Coduo/PHPHumanizer/DateTime/FormatterSpec.php
+++ /dev/null
@@ -1,50 +0,0 @@
-beConstructedWith($translator);
- $translator->trans(
- 'minute.past',
- array('%count%' => 10),
- 'difference',
- 'en'
- )->willReturn('10 minutes ago');
-
- $translator->trans(
- 'minute.past',
- array('%count%' => 10),
- 'difference',
- 'pl'
- )->willReturn('10 minut temu');
- }
-
- function it_format_datetime_diff()
- {
- $diff = new Difference(
- new \DateTime("2015-01-01 00:10:00"),
- new \DateTime("2015-01-01 00:00:00")
- );
-
- $this->formatDifference($diff)->shouldReturn('10 minutes ago');
- }
-
- function it_format_datetime_diff_for_specific_locale()
- {
- $diff = new Difference(
- new \DateTime("2015-01-01 00:10:00"),
- new \DateTime("2015-01-01 00:00:00")
- );
-
- $this->formatDifference($diff, 'pl')->shouldReturn('10 minut temu');
- }
-}
diff --git a/spec/Coduo/PHPHumanizer/DateTime/PreciseFormatterSpec.php b/spec/Coduo/PHPHumanizer/DateTime/PreciseFormatterSpec.php
deleted file mode 100644
index 5228235..0000000
--- a/spec/Coduo/PHPHumanizer/DateTime/PreciseFormatterSpec.php
+++ /dev/null
@@ -1,80 +0,0 @@
-beConstructedWith($translator);
- $translator->trans(
- 'compound.day',
- array('%count%' => 10),
- 'difference',
- 'en'
- )->willReturn('10 days');
-
- $translator->trans(
- 'compound.hour',
- array('%count%' => 5),
- 'difference',
- 'en'
- )->willReturn('5 hours');
-
- $translator->trans(
- 'compound.future',
- array('%value%' => '10 days, 5 hours'),
- 'difference',
- 'en'
- )->willReturn('10 days, 5 hours from now');
-
- $translator->trans(
- 'compound.day',
- array('%count%' => 10),
- 'difference',
- 'ru'
- )->willReturn('10 дней');
-
- $translator->trans(
- 'compound.hour',
- array('%count%' => 5),
- 'difference',
- 'ru'
- )->willReturn('5 часов');
-
- $translator->trans(
- 'compound.future',
- array('%value%' => '10 дней, 5 часов'),
- 'difference',
- 'ru'
- )->willReturn('через 10 дней, 5 часов');
- }
-
- function it_format_compound_datetime_diff()
- {
- $diff = new PreciseDifference(
- new \DateTime("2015-01-01 00:00:00"),
- new \DateTime("2015-01-11 05:00:00")
- );
-
- $this->formatDifference($diff)->shouldReturn('10 days, 5 hours from now');
- }
-
- function it_format_compound_datetime_diff_for_specific_locale()
- {
- $diff = new PreciseDifference(
- new \DateTime("2015-01-01 00:00:00"),
- new \DateTime("2015-01-11 05:00:00")
- );
-
- $this->formatDifference($diff, 'ru')->shouldReturn('через 10 дней, 5 часов');
- }
-}
diff --git a/spec/Coduo/PHPHumanizer/String/WordBreakpointSpec.php b/spec/Coduo/PHPHumanizer/String/WordBreakpointSpec.php
deleted file mode 100644
index f608032..0000000
--- a/spec/Coduo/PHPHumanizer/String/WordBreakpointSpec.php
+++ /dev/null
@@ -1,36 +0,0 @@
-calculatePosition('Lorem ipsum dolorem', 2)->shouldReturn(5);
- $this->calculatePosition('Lorem ipsum dolorem', 4)->shouldReturn(5);
- $this->calculatePosition('Lorem ipsum dolorem', 5)->shouldReturn(5);
- $this->calculatePosition('Lorem ipsum dolorem', 10)->shouldReturn(11);
- $this->calculatePosition('Lorem ipsum dolorem', -2)->shouldReturn(19);
- $this->calculatePosition('Lorem ipsum dolorem', 0)->shouldReturn(5);
- }
-
- function it_calculate_breakpoint_position_when_sentence_is_shorter_than_characters_count()
- {
- $this->calculatePosition('Lorem ipsum dolorem', 20)->shouldReturn(19);
- }
-
- function it_calculate_breakpoint_position_when_characters_count_ends_in_last_word()
- {
- $this->calculatePosition('Lorem ipsum', 7)->shouldReturn(11);
- }
-
- function it_calculate_breakpoint_position_when_characters_count_ends_in_last_space()
- {
- $this->calculatePosition('Lorem ipsum', 5)->shouldReturn(5);
- }
-}
diff --git a/src/Coduo/PHPHumanizer/Collection/Formatter.php b/src/Coduo/PHPHumanizer/Collection/Formatter.php
index aa0798a..2f49887 100644
--- a/src/Coduo/PHPHumanizer/Collection/Formatter.php
+++ b/src/Coduo/PHPHumanizer/Collection/Formatter.php
@@ -15,26 +15,20 @@
final class Formatter
{
- /**
- * @var TranslatorInterface
- */
- private $translator;
+ private TranslatorInterface $translator;
- /**
- * @var string
- */
- private $catalogue;
+ private string $catalogue;
- /**
- * @param TranslatorInterface $translator
- */
- public function __construct(TranslatorInterface $translator, $catalogue = 'oxford')
+ public function __construct(TranslatorInterface $translator, string $catalogue = 'oxford')
{
$this->translator = $translator;
$this->catalogue = $catalogue;
}
- public function format($collection, $limit = null)
+ /**
+ * @param array $collection
+ */
+ public function format(array $collection, int $limit = null): string
{
$count = \count($collection);
@@ -58,17 +52,11 @@ public function format($collection, $limit = null)
}
/**
- * @param $collection
- * @param $limit
- * @param $count
- *
- * @return string
+ * @param array $collection
*/
- private function formatCommaSeparatedWithLimit($collection, $limit, $count)
+ private function formatCommaSeparatedWithLimit(array $collection, ?int $limit, int $count): string
{
- $display = \array_map(function ($element) {
- return (string) $element;
- }, \array_slice($collection, 0, $limit));
+ $display = \array_map(fn ($element) => (string) $element, \array_slice($collection, 0, $limit));
$moreCount = $count - \count($display);
@@ -79,16 +67,11 @@ private function formatCommaSeparatedWithLimit($collection, $limit, $count)
}
/**
- * @param $collection
- * @param $count
- *
- * @return string
+ * @param array $collection
*/
- private function formatCommaSeparated($collection, $count)
+ private function formatCommaSeparated(array $collection, int $count): string
{
- $display = \array_map(function ($element) {
- return (string) $element;
- }, \array_slice($collection, 0, $count - 1));
+ $display = \array_map(fn ($element) => (string) $element, \array_slice($collection, 0, $count - 1));
return $this->translator->trans('comma_separated', [
'%list%' => \implode(', ', $display),
@@ -97,11 +80,9 @@ private function formatCommaSeparated($collection, $count)
}
/**
- * @param $collection
- *
- * @return string
+ * @param array $collection
*/
- private function formatOnlyTwo($collection)
+ private function formatOnlyTwo(array $collection): string
{
return $this->translator->trans('only_two', [
'%first%' => (string) $collection[0],
diff --git a/src/Coduo/PHPHumanizer/Collection/Oxford.php b/src/Coduo/PHPHumanizer/Collection/Oxford.php
index a27cf80..2f84c21 100644
--- a/src/Coduo/PHPHumanizer/Collection/Oxford.php
+++ b/src/Coduo/PHPHumanizer/Collection/Oxford.php
@@ -13,28 +13,17 @@
final class Oxford
{
- /**
- * @var Formatter
- */
- private $formatter;
+ private Formatter $formatter;
- /**
- * Oxford constructor.
- *
- * @param Formatter $formatter
- */
public function __construct(Formatter $formatter)
{
$this->formatter = $formatter;
}
/**
- * @param $collection
- * @param null $limit
- *
- * @return string
+ * @param array $collection
*/
- public function format($collection, $limit = null)
+ public function format(array $collection, int $limit = null): string
{
return $this->formatter->format($collection, $limit);
}
diff --git a/src/Coduo/PHPHumanizer/CollectionHumanizer.php b/src/Coduo/PHPHumanizer/CollectionHumanizer.php
index 548cdc4..e7c2bce 100644
--- a/src/Coduo/PHPHumanizer/CollectionHumanizer.php
+++ b/src/Coduo/PHPHumanizer/CollectionHumanizer.php
@@ -18,12 +18,9 @@
final class CollectionHumanizer
{
/**
- * @param $collection
- * @param null $limit
- * @param string $locale
- * @return string
+ * @param array $collection
*/
- public static function oxford($collection, $limit = null, $locale = 'en')
+ public static function oxford(array $collection, int $limit = null, string $locale = 'en'): string
{
$oxford = new Oxford(
new Formatter(Builder::build($locale))
diff --git a/src/Coduo/PHPHumanizer/DateTime/Difference.php b/src/Coduo/PHPHumanizer/DateTime/Difference.php
index 60fce9a..2ca8258 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Difference.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Difference.php
@@ -22,25 +22,16 @@
final class Difference
{
- /**
- * @var \DateTime
- */
- private $fromDate;
+ private \DateTime $fromDate;
- /**
- * @var \DateTime
- */
- private $toDate;
+ private \DateTime $toDate;
/**
- * @var \Coduo\PHPHumanizer\DateTime\Unit
+ * @psalm-suppress PropertyNotSetInConstructor
*/
- private $unit;
+ private Unit $unit;
- /**
- * @var int
- */
- private $quantity;
+ private ?int $quantity = null;
public function __construct(\DateTime $fromDate, \DateTime $toDate)
{
@@ -49,25 +40,19 @@ public function __construct(\DateTime $fromDate, \DateTime $toDate)
$this->calculate();
}
- /**
- * @return Unit
- */
- public function getUnit()
+ public function getUnit(): Unit
{
return $this->unit;
}
- /**
- * @return int
- */
- public function getQuantity()
+ public function getQuantity(): ?int
{
return $this->quantity;
}
- private function calculate()
+ private function calculate(): void
{
- /* @var $units \Coduo\PHPHumanizer\DateTime\Unit[] */
+ /* @var $units Unit[] */
$units = [
new Year(),
new Month(),
@@ -92,7 +77,7 @@ private function calculate()
: (int) \round($absoluteMilliSecondsDiff / $this->unit->getMilliseconds());
}
- public function isPast()
+ public function isPast(): bool
{
$diff = $this->toDate->getTimestamp() - $this->fromDate->getTimestamp();
diff --git a/src/Coduo/PHPHumanizer/DateTime/Difference/CompoundResult.php b/src/Coduo/PHPHumanizer/DateTime/Difference/CompoundResult.php
index 7178ea1..512fd1b 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Difference/CompoundResult.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Difference/CompoundResult.php
@@ -15,46 +15,31 @@
final class CompoundResult
{
- /**
- * @var \Coduo\PHPHumanizer\DateTime\Unit
- */
- private $unit;
- private $quantity;
+ private Unit $unit;
+ private int $quantity;
- public function __construct(Unit $unit, $quantity)
+ public function __construct(Unit $unit, int $quantity)
{
$this->unit = $unit;
$this->quantity = $quantity;
}
- /**
- * @param mixed $quantity
- */
- public function setQuantity($quantity)
+ public function setQuantity(int $quantity): void
{
$this->quantity = $quantity;
}
- /**
- * @return mixed
- */
- public function getQuantity()
+ public function getQuantity() : int
{
return $this->quantity;
}
- /**
- * @param \Coduo\PHPHumanizer\DateTime\Unit $unit
- */
- public function setUnit($unit)
+ public function setUnit(Unit $unit): void
{
$this->unit = $unit;
}
- /**
- * @return \Coduo\PHPHumanizer\DateTime\Unit
- */
- public function getUnit()
+ public function getUnit(): Unit
{
return $this->unit;
}
diff --git a/src/Coduo/PHPHumanizer/DateTime/Formatter.php b/src/Coduo/PHPHumanizer/DateTime/Formatter.php
index a5d7c2f..28fc8ce 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Formatter.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Formatter.php
@@ -15,26 +15,14 @@
final class Formatter
{
- /**
- * @var TranslatorInterface
- */
- private $translator;
-
- /**
- * @param TranslatorInterface $translator
- */
+ private TranslatorInterface $translator;
+
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
- /**
- * @param Difference $difference
- * @param string $locale
- *
- * @return string
- */
- public function formatDifference(Difference $difference, $locale = 'en')
+ public function formatDifference(Difference $difference, string $locale = 'en'): string
{
$translationKey = \sprintf('%s.%s', $difference->getUnit()->getName(), $difference->isPast() ? 'past' : 'future');
diff --git a/src/Coduo/PHPHumanizer/DateTime/PreciseDifference.php b/src/Coduo/PHPHumanizer/DateTime/PreciseDifference.php
index 75c1cfb..0a75a80 100644
--- a/src/Coduo/PHPHumanizer/DateTime/PreciseDifference.php
+++ b/src/Coduo/PHPHumanizer/DateTime/PreciseDifference.php
@@ -21,25 +21,19 @@
final class PreciseDifference
{
- /**
- * @var \DateTime
- */
- private $fromDate;
+ private \DateTime $fromDate;
- /**
- * @var \DateTime
- */
- private $toDate;
+ private \DateTime $toDate;
/**
- * @var \Coduo\PHPHumanizer\DateTime\Unit[]
+ * @var array
*/
- private $units;
+ private array $units = [];
/**
- * @var \Coduo\PHPHumanizer\DateTime\Difference\CompoundResult[]
+ * @var array
*/
- private $compoundResults;
+ private array $compoundResults = [];
public function __construct(\DateTime $fromDate, \DateTime $toDate)
{
@@ -49,16 +43,16 @@ public function __construct(\DateTime $fromDate, \DateTime $toDate)
}
/**
- * @return \Coduo\PHPHumanizer\DateTime\Difference\CompoundResult[]
+ * @return array
*/
- public function getCompoundResults()
+ public function getCompoundResults(): array
{
return $this->compoundResults;
}
- private function calculate()
+ private function calculate(): void
{
- /* @var $units \Coduo\PHPHumanizer\DateTime\Unit[] */
+ /* @var $units Unit[] */
$units = [
new Year(),
new Month(),
@@ -78,7 +72,7 @@ private function calculate()
}
}
- public function isPast()
+ public function isPast(): bool
{
$diff = $this->toDate->getTimestamp() - $this->fromDate->getTimestamp();
diff --git a/src/Coduo/PHPHumanizer/DateTime/PreciseFormatter.php b/src/Coduo/PHPHumanizer/DateTime/PreciseFormatter.php
index a47fe67..2036fb9 100644
--- a/src/Coduo/PHPHumanizer/DateTime/PreciseFormatter.php
+++ b/src/Coduo/PHPHumanizer/DateTime/PreciseFormatter.php
@@ -15,26 +15,14 @@
final class PreciseFormatter
{
- /**
- * @var TranslatorInterface
- */
- private $translator;
-
- /**
- * @param TranslatorInterface $translator
- */
+ private TranslatorInterface $translator;
+
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
- /**
- * @param PreciseDifference $difference
- * @param string $locale
- *
- * @return string
- */
- public function formatDifference(PreciseDifference $difference, $locale = 'en')
+ public function formatDifference(PreciseDifference $difference, string $locale = 'en'): string
{
$diff = [];
diff --git a/src/Coduo/PHPHumanizer/DateTime/Unit.php b/src/Coduo/PHPHumanizer/DateTime/Unit.php
index 2a3525f..c5445cb 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Unit.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Unit.php
@@ -13,22 +13,15 @@
interface Unit
{
- /**
- * @return string
- */
- public function getName();
+ public function getName(): string;
/**
* Return millisecond that represents unit.
- *
- * @return int
*/
- public function getMilliseconds();
+ public function getMilliseconds(): int;
/**
* Returns symbol of \DateInterval equivalent.
- *
- * @return string
*/
- public function getDateIntervalSymbol();
+ public function getDateIntervalSymbol(): string;
}
diff --git a/src/Coduo/PHPHumanizer/DateTime/Unit/Day.php b/src/Coduo/PHPHumanizer/DateTime/Unit/Day.php
index 4e4f72d..f734a35 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Unit/Day.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Unit/Day.php
@@ -15,22 +15,19 @@
final class Day implements Unit
{
- /**
- * @return string
- */
- public function getName()
+ public function getName(): string
{
return 'day';
}
- public function getMilliseconds()
+ public function getMilliseconds(): int
{
$hour = new Hour();
return $hour->getMilliseconds() * 24;
}
- public function getDateIntervalSymbol()
+ public function getDateIntervalSymbol(): string
{
return 'd';
}
diff --git a/src/Coduo/PHPHumanizer/DateTime/Unit/Hour.php b/src/Coduo/PHPHumanizer/DateTime/Unit/Hour.php
index 8a21186..1864d41 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Unit/Hour.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Unit/Hour.php
@@ -15,22 +15,19 @@
final class Hour implements Unit
{
- /**
- * @return string
- */
- public function getName()
+ public function getName(): string
{
return 'hour';
}
- public function getMilliseconds()
+ public function getMilliseconds(): int
{
$minute = new Minute();
return $minute->getMilliseconds() * 60;
}
- public function getDateIntervalSymbol()
+ public function getDateIntervalSymbol(): string
{
return 'h';
}
diff --git a/src/Coduo/PHPHumanizer/DateTime/Unit/JustNow.php b/src/Coduo/PHPHumanizer/DateTime/Unit/JustNow.php
index ea1120a..3cb5aed 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Unit/JustNow.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Unit/JustNow.php
@@ -15,20 +15,17 @@
final class JustNow implements Unit
{
- /**
- * @return string
- */
- public function getName()
+ public function getName(): string
{
return 'just_now';
}
- public function getMilliseconds()
+ public function getMilliseconds(): int
{
return 0;
}
- public function getDateIntervalSymbol()
+ public function getDateIntervalSymbol(): string
{
throw new \RuntimeException("JustNow doesn't have date interval symbol equivalent");
}
diff --git a/src/Coduo/PHPHumanizer/DateTime/Unit/Minute.php b/src/Coduo/PHPHumanizer/DateTime/Unit/Minute.php
index 1c2c3c2..6bbc479 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Unit/Minute.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Unit/Minute.php
@@ -15,22 +15,19 @@
final class Minute implements Unit
{
- /**
- * @return string
- */
- public function getName()
+ public function getName(): string
{
return 'minute';
}
- public function getMilliseconds()
+ public function getMilliseconds(): int
{
$second = new Second();
return $second->getMilliseconds() * 60;
}
- public function getDateIntervalSymbol()
+ public function getDateIntervalSymbol(): string
{
return 'i';
}
diff --git a/src/Coduo/PHPHumanizer/DateTime/Unit/Month.php b/src/Coduo/PHPHumanizer/DateTime/Unit/Month.php
index ae26e8f..33a0e5c 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Unit/Month.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Unit/Month.php
@@ -15,22 +15,19 @@
final class Month implements Unit
{
- /**
- * @return string
- */
- public function getName()
+ public function getName(): string
{
return 'month';
}
- public function getMilliseconds()
+ public function getMilliseconds(): int
{
$day = new Day();
return $day->getMilliseconds() * 30;
}
- public function getDateIntervalSymbol()
+ public function getDateIntervalSymbol(): string
{
return 'm';
}
diff --git a/src/Coduo/PHPHumanizer/DateTime/Unit/Second.php b/src/Coduo/PHPHumanizer/DateTime/Unit/Second.php
index 12f3e54..465a5ff 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Unit/Second.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Unit/Second.php
@@ -15,20 +15,17 @@
final class Second implements Unit
{
- /**
- * @return string
- */
- public function getName()
+ public function getName(): string
{
return 'second';
}
- public function getMilliseconds()
+ public function getMilliseconds(): int
{
return 1000;
}
- public function getDateIntervalSymbol()
+ public function getDateIntervalSymbol(): string
{
return 's';
}
diff --git a/src/Coduo/PHPHumanizer/DateTime/Unit/Week.php b/src/Coduo/PHPHumanizer/DateTime/Unit/Week.php
index cd0ff1a..353d5a3 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Unit/Week.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Unit/Week.php
@@ -15,22 +15,19 @@
final class Week implements Unit
{
- /**
- * @return string
- */
- public function getName()
+ public function getName(): string
{
return 'week';
}
- public function getMilliseconds()
+ public function getMilliseconds(): int
{
$day = new Day();
return $day->getMilliseconds() * 7;
}
- public function getDateIntervalSymbol()
+ public function getDateIntervalSymbol(): string
{
throw new \RuntimeException("Week doesn't have date interval symbol equivalent");
}
diff --git a/src/Coduo/PHPHumanizer/DateTime/Unit/Year.php b/src/Coduo/PHPHumanizer/DateTime/Unit/Year.php
index 4dda1c9..22a539d 100644
--- a/src/Coduo/PHPHumanizer/DateTime/Unit/Year.php
+++ b/src/Coduo/PHPHumanizer/DateTime/Unit/Year.php
@@ -15,22 +15,19 @@
final class Year implements Unit
{
- /**
- * @return string
- */
- public function getName()
+ public function getName(): string
{
return 'year';
}
- public function getMilliseconds()
+ public function getMilliseconds(): int
{
$day = new Day();
return $day->getMilliseconds() * 356;
}
- public function getDateIntervalSymbol()
+ public function getDateIntervalSymbol(): string
{
return 'y';
}
diff --git a/src/Coduo/PHPHumanizer/DateTimeHumanizer.php b/src/Coduo/PHPHumanizer/DateTimeHumanizer.php
index 44f7472..2c51cf5 100644
--- a/src/Coduo/PHPHumanizer/DateTimeHumanizer.php
+++ b/src/Coduo/PHPHumanizer/DateTimeHumanizer.php
@@ -19,26 +19,14 @@
final class DateTimeHumanizer
{
- /**
- * @param \DateTime $fromDate
- * @param \DateTime $toDate
- * @param string $locale
- * @return string
- */
- public static function difference(\DateTime $fromDate, \DateTime $toDate, $locale = 'en')
+ public static function difference(\DateTime $fromDate, \DateTime $toDate, string $locale = 'en'): string
{
$formatter = new Formatter(Builder::build($locale));
return $formatter->formatDifference(new Difference($fromDate, $toDate), $locale);
}
- /**
- * @param \DateTime $fromDate
- * @param \DateTime $toDate
- * @param string $locale
- * @return string
- */
- public static function preciseDifference(\DateTime $fromDate, \DateTime $toDate, $locale = 'en')
+ public static function preciseDifference(\DateTime $fromDate, \DateTime $toDate, string $locale = 'en'): string
{
$formatter = new PreciseFormatter(Builder::build($locale));
diff --git a/src/Coduo/PHPHumanizer/Number/Ordinal.php b/src/Coduo/PHPHumanizer/Number/Ordinal.php
index 73e92a5..4d48872 100644
--- a/src/Coduo/PHPHumanizer/Number/Ordinal.php
+++ b/src/Coduo/PHPHumanizer/Number/Ordinal.php
@@ -21,27 +21,24 @@ final class Ordinal
*/
private $number;
- /**
- * @var StrategyInterface
- */
- private $strategy;
+ private StrategyInterface $strategy;
/**
* @param int|float $number
* @param string $locale
*/
- public function __construct($number, $locale)
+ public function __construct($number, string $locale)
{
$this->number = $number;
$this->strategy = Builder::build($locale);
}
- public function isPrefix()
+ public function isPrefix(): bool
{
return $this->strategy->isPrefix();
}
- public function __toString()
+ public function __toString(): string
{
return $this
->strategy
diff --git a/src/Coduo/PHPHumanizer/Number/Ordinal/Builder.php b/src/Coduo/PHPHumanizer/Number/Ordinal/Builder.php
index 582055b..2246cc9 100644
--- a/src/Coduo/PHPHumanizer/Number/Ordinal/Builder.php
+++ b/src/Coduo/PHPHumanizer/Number/Ordinal/Builder.php
@@ -11,38 +11,37 @@
namespace Coduo\PHPHumanizer\Number\Ordinal;
-/**
- * Tries to find a proper strategy for ordinal numbers.
- */
final class Builder
{
/**
- * @param string $locale
- *
- * @return StrategyInterface
- *
- * @throws \RuntimeException
+ * Find a proper strategy for ordinal numbers.
*/
- public static function build($locale)
+ public static function build(string $locale): StrategyInterface
{
// $locale should be xx or xx_YY
- if (!\preg_match('/^([a-z]{2})(_([A-Z]{2}))?$/', $locale, $m)) {
- throw new \RuntimeException("Invalid locale specified: '$locale'.");
+ if (!\preg_match('#^([a-z]{2})(_([A-Z]{2}))?$#', $locale, $m)) {
+ throw new \RuntimeException(\sprintf("Invalid locale specified: '%s'.", $locale));
}
$strategy = \ucfirst($m[1]);
if (!empty($m[3])) {
- $strategy .= "_$m[3]";
+ $strategy .= \sprintf('_%s', $m[3]);
}
- $strategy = "\\Coduo\\PHPHumanizer\\Resources\\Ordinal\\{$strategy}Strategy";
+ $strategy = \sprintf('\Coduo\PHPHumanizer\Resources\Ordinal\%sStrategy', $strategy);
if (\class_exists($strategy)) {
- return new $strategy();
+ $strategyInstance = new $strategy();
+
+ if (!$strategyInstance instanceof StrategyInterface) {
+ throw new \RuntimeException(\sprintf('Strategy for locale %s does not implement Strategy Interface.', $locale));
+ }
+
+ return $strategyInstance;
}
// Debatable: should we fallback to English?
// return self::build('en');
- throw new \RuntimeException("Strategy for locale $locale not found.");
+ throw new \RuntimeException(\sprintf('Strategy for locale %s not found.', $locale));
}
}
diff --git a/src/Coduo/PHPHumanizer/Number/Ordinal/StrategyInterface.php b/src/Coduo/PHPHumanizer/Number/Ordinal/StrategyInterface.php
index aa23162..eb60dcc 100644
--- a/src/Coduo/PHPHumanizer/Number/Ordinal/StrategyInterface.php
+++ b/src/Coduo/PHPHumanizer/Number/Ordinal/StrategyInterface.php
@@ -13,15 +13,11 @@
interface StrategyInterface
{
- /**
- * @return boolean
- */
- public function isPrefix();
+ public function isPrefix(): bool;
/**
* @param int|float $number
- *
* @return string
*/
- public function ordinalIndicator($number);
+ public function ordinalIndicator($number): string;
}
diff --git a/src/Coduo/PHPHumanizer/Number/RomanNumeral.php b/src/Coduo/PHPHumanizer/Number/RomanNumeral.php
index 4e184a9..6d1db95 100644
--- a/src/Coduo/PHPHumanizer/Number/RomanNumeral.php
+++ b/src/Coduo/PHPHumanizer/Number/RomanNumeral.php
@@ -13,11 +13,25 @@
final class RomanNumeral
{
+ /**
+ * @var int
+ */
const MIN_VALUE = 1;
+
+ /**
+ * @var int
+ */
const MAX_VALUE = 3999;
+
+ /**
+ * @var string
+ */
const ROMAN_STRING_MATCHER = '/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/';
- private $map = [
+ /**
+ * @var array
+ */
+ private array $map = [
'M' => 1000,
'CM' => 900,
'D' => 500,
@@ -34,13 +48,13 @@ final class RomanNumeral
];
/**
- * @param $number
+ * @param numeric $number
*
- * @return string
*
+ * @return string
* @throws \InvalidArgumentException
*/
- public function toRoman($number)
+ public function toRoman($number): string
{
if (($number < self::MIN_VALUE) || ($number > self::MAX_VALUE)) {
throw new \InvalidArgumentException();
@@ -62,13 +76,11 @@ public function toRoman($number)
}
/**
- * @param $string
- *
- * @return int
+ * @return float|int
*
* @throws \InvalidArgumentException
*/
- public function fromRoman($string)
+ public function fromRoman(string $string)
{
if (\mb_strlen((string) $string) === 0 || 0 === \preg_match(self::ROMAN_STRING_MATCHER, (string) $string)) {
throw new \InvalidArgumentException();
diff --git a/src/Coduo/PHPHumanizer/NumberHumanizer.php b/src/Coduo/PHPHumanizer/NumberHumanizer.php
index 7d26299..74271f6 100644
--- a/src/Coduo/PHPHumanizer/NumberHumanizer.php
+++ b/src/Coduo/PHPHumanizer/NumberHumanizer.php
@@ -20,36 +20,34 @@ final class NumberHumanizer
{
/**
* @param int|float $number
- * @param string $locale
- *
+ * @param string $locale
* @return string
*/
- public static function ordinalize($number, $locale = 'en')
+ public static function ordinalize($number, string $locale = 'en'): string
{
$ordinal = new Ordinal($number, $locale);
-
+
return (string) ($ordinal->isPrefix()) ? $ordinal.$number : $number.$ordinal;
}
-
+
/**
* @param int|float $number
- * @param string $locale
- *
+ * @param string $locale
* @return string
*/
- public static function ordinal($number, $locale = 'en')
+ public static function ordinal($number, string $locale = 'en'): string
{
$ordinal = new Ordinal($number, $locale);
-
+
return (string) $ordinal;
}
/**
- * @param $number
+ * @param int $number
* @param string $locale
* @return bool|int|string
*/
- public static function binarySuffix($number, $locale = 'en')
+ public static function binarySuffix(int $number, string $locale = 'en')
{
$binarySuffix = new BinarySuffix($number, $locale);
@@ -57,12 +55,9 @@ public static function binarySuffix($number, $locale = 'en')
}
/**
- * @param $number
- * @param $precision
- * @param string $locale
* @return bool|int|string
*/
- public static function preciseBinarySuffix($number, $precision, $locale = 'en')
+ public static function preciseBinarySuffix(int $number, ?int $precision, string $locale = 'en')
{
$binarySuffix = new BinarySuffix($number, $locale, $precision);
@@ -70,11 +65,9 @@ public static function preciseBinarySuffix($number, $precision, $locale = 'en')
}
/**
- * @param $number
- * @param string $locale
- * @return bool|string
+ * @param numeric $number
*/
- public static function metricSuffix($number, $locale = 'en')
+ public static function metricSuffix($number, string $locale = 'en'): string
{
$binarySuffix = new MetricSuffix($number, $locale);
@@ -82,10 +75,10 @@ public static function metricSuffix($number, $locale = 'en')
}
/**
- * @param $number
+ * @param numeric $number
* @return string
*/
- public static function toRoman($number)
+ public static function toRoman($number): string
{
$romanNumeral = new RomanNumeral();
@@ -93,10 +86,9 @@ public static function toRoman($number)
}
/**
- * @param $number
- * @return int
+ * @return float|int
*/
- public static function fromRoman($number)
+ public static function fromRoman(string $number)
{
$romanNumeral = new RomanNumeral();
diff --git a/src/Coduo/PHPHumanizer/Resources/Ordinal/DeStrategy.php b/src/Coduo/PHPHumanizer/Resources/Ordinal/DeStrategy.php
index 6a96127..bacc827 100644
--- a/src/Coduo/PHPHumanizer/Resources/Ordinal/DeStrategy.php
+++ b/src/Coduo/PHPHumanizer/Resources/Ordinal/DeStrategy.php
@@ -15,16 +15,12 @@
final class DeStrategy implements StrategyInterface
{
- /**
- * {@inheritdoc}
- */
- public function isPrefix()
+ public function isPrefix(): bool
{
return false;
}
- /** {@inheritdoc} */
- public function ordinalIndicator($number)
+ public function ordinalIndicator($number): string
{
return '.';
}
diff --git a/src/Coduo/PHPHumanizer/Resources/Ordinal/EnStrategy.php b/src/Coduo/PHPHumanizer/Resources/Ordinal/EnStrategy.php
index 35e6f5a..373932f 100644
--- a/src/Coduo/PHPHumanizer/Resources/Ordinal/EnStrategy.php
+++ b/src/Coduo/PHPHumanizer/Resources/Ordinal/EnStrategy.php
@@ -15,18 +15,12 @@
final class EnStrategy implements StrategyInterface
{
- /**
- * {@inheritdoc}
- */
- public function isPrefix()
+ public function isPrefix(): bool
{
return false;
}
- /**
- * {@inheritdoc}
- */
- public function ordinalIndicator($number)
+ public function ordinalIndicator($number): string
{
$absNumber = \abs((integer) $number);
diff --git a/src/Coduo/PHPHumanizer/Resources/Ordinal/EsStrategy.php b/src/Coduo/PHPHumanizer/Resources/Ordinal/EsStrategy.php
index 30ba76e..1793120 100644
--- a/src/Coduo/PHPHumanizer/Resources/Ordinal/EsStrategy.php
+++ b/src/Coduo/PHPHumanizer/Resources/Ordinal/EsStrategy.php
@@ -15,16 +15,12 @@
final class EsStrategy implements StrategyInterface
{
- /**
- * {@inheritdoc}
- */
- public function isPrefix()
+ public function isPrefix(): bool
{
return false;
}
- /** {@inheritdoc} */
- public function ordinalIndicator($number)
+ public function ordinalIndicator($number): string
{
return 'o';
}
diff --git a/src/Coduo/PHPHumanizer/Resources/Ordinal/FrStrategy.php b/src/Coduo/PHPHumanizer/Resources/Ordinal/FrStrategy.php
index 788789b..45a034c 100644
--- a/src/Coduo/PHPHumanizer/Resources/Ordinal/FrStrategy.php
+++ b/src/Coduo/PHPHumanizer/Resources/Ordinal/FrStrategy.php
@@ -15,16 +15,12 @@
final class FrStrategy implements StrategyInterface
{
- /**
- * {@inheritdoc}
- */
- public function isPrefix()
+ public function isPrefix(): bool
{
return false;
}
- /** {@inheritdoc} */
- public function ordinalIndicator($number)
+ public function ordinalIndicator($number): string
{
$absNumber = \abs((integer) $number);
diff --git a/src/Coduo/PHPHumanizer/Resources/Ordinal/IdStrategy.php b/src/Coduo/PHPHumanizer/Resources/Ordinal/IdStrategy.php
index e678f99..937eddc 100644
--- a/src/Coduo/PHPHumanizer/Resources/Ordinal/IdStrategy.php
+++ b/src/Coduo/PHPHumanizer/Resources/Ordinal/IdStrategy.php
@@ -15,18 +15,13 @@
final class IdStrategy implements StrategyInterface
{
- /**
- * {@inheritdoc}
- */
- public function isPrefix()
+ public function isPrefix(): bool
{
return true;
}
- /**
- * {@inheritdoc}
- */
- public function ordinalIndicator($number)
+
+ public function ordinalIndicator($number): string
{
return 'ke-';
}
diff --git a/src/Coduo/PHPHumanizer/Resources/Ordinal/ItStrategy.php b/src/Coduo/PHPHumanizer/Resources/Ordinal/ItStrategy.php
index 318bbf8..ec69b84 100644
--- a/src/Coduo/PHPHumanizer/Resources/Ordinal/ItStrategy.php
+++ b/src/Coduo/PHPHumanizer/Resources/Ordinal/ItStrategy.php
@@ -15,16 +15,12 @@
final class ItStrategy implements StrategyInterface
{
- /**
- * {@inheritdoc}
- */
- public function isPrefix()
+ public function isPrefix(): bool
{
return false;
}
- /** {@inheritdoc} */
- public function ordinalIndicator($number)
+ public function ordinalIndicator($number): string
{
return 'o';
}
diff --git a/src/Coduo/PHPHumanizer/Resources/Ordinal/NlStrategy.php b/src/Coduo/PHPHumanizer/Resources/Ordinal/NlStrategy.php
index 7350eb5..63cc61a 100644
--- a/src/Coduo/PHPHumanizer/Resources/Ordinal/NlStrategy.php
+++ b/src/Coduo/PHPHumanizer/Resources/Ordinal/NlStrategy.php
@@ -15,18 +15,12 @@
final class NlStrategy implements StrategyInterface
{
- /**
- * {@inheritdoc}
- */
- public function isPrefix()
+ public function isPrefix(): bool
{
return false;
}
- /**
- * {@inheritdoc}
- */
- public function ordinalIndicator($number)
+ public function ordinalIndicator($number): string
{
return 'e';
}
diff --git a/src/Coduo/PHPHumanizer/Resources/Ordinal/PtStrategy.php b/src/Coduo/PHPHumanizer/Resources/Ordinal/PtStrategy.php
index 2f625a8..94f0e75 100644
--- a/src/Coduo/PHPHumanizer/Resources/Ordinal/PtStrategy.php
+++ b/src/Coduo/PHPHumanizer/Resources/Ordinal/PtStrategy.php
@@ -15,16 +15,12 @@
final class PtStrategy implements StrategyInterface
{
- /**
- * {@inheritdoc}
- */
- public function isPrefix()
+ public function isPrefix(): bool
{
return false;
}
- /** {@inheritdoc} */
- public function ordinalIndicator($number)
+ public function ordinalIndicator($number): string
{
return 'o';
}
diff --git a/src/Coduo/PHPHumanizer/String/BinarySuffix.php b/src/Coduo/PHPHumanizer/String/BinarySuffix.php
index b71e798..a5e0967 100644
--- a/src/Coduo/PHPHumanizer/String/BinarySuffix.php
+++ b/src/Coduo/PHPHumanizer/String/BinarySuffix.php
@@ -13,47 +13,33 @@
final class BinarySuffix
{
- const CONVERT_THRESHOLD = 1024;
-
/**
* @var int
*/
- private $number;
+ const CONVERT_THRESHOLD = 1024;
- /**
- * @var string
- */
- private $locale;
+ private int $number;
+
+ private string $locale;
/**
- * @var array
+ * @var array
*/
- private $binaryPrefixes = [
- 1125899906842624 => '#.## PB',
- 1099511627776 => '#.## TB',
- 1073741824 => '#.## GB',
- 1048576 => '#.## MB',
+ private array $binaryPrefixes = [
+ 1_125_899_906_842_624 => '#.## PB',
+ 1_099_511_627_776 => '#.## TB',
+ 1_073_741_824 => '#.## GB',
+ 1_048_576 => '#.## MB',
1024 => '#.# kB',
0 => '# bytes',
];
- /**
- * @param int $number
- * @param string $locale
- * @param int $precision
- *
- * @throws \InvalidArgumentException
- */
- public function __construct($number, $locale = 'en', $precision = null)
+ public function __construct(int $number, string $locale = 'en', int $precision = null)
{
- if (!\class_exists('NumberFormatter')) {
+ if (!\class_exists(\NumberFormatter::class)) {
throw new \RuntimeException('Binary suffix converter requires intl extension!');
}
- if (!\is_numeric($number)) {
- throw new \InvalidArgumentException('Binary suffix converter accept only numeric values.');
- }
-
if (!\is_null($precision)) {
$this->setSpecificPrecisionFormat($precision);
}
@@ -68,6 +54,9 @@ public function __construct($number, $locale = 'en', $precision = null)
\krsort($this->binaryPrefixes);
}
+ /**
+ * @return int|string
+ */
public function convert()
{
$formatter = new \NumberFormatter($this->locale, \NumberFormatter::PATTERN_DECIMAL);
@@ -90,12 +79,8 @@ public function convert()
/**
* Replaces the default ICU 56.1 decimal formats defined in $binaryPrefixes with ones that provide the same symbols
* but the provided number of decimal places.
- *
- * @param int $precision
- *
- * @throws \InvalidArgumentException
*/
- protected function setSpecificPrecisionFormat($precision)
+ protected function setSpecificPrecisionFormat(int $precision): void
{
if ($precision < 0) {
throw new \InvalidArgumentException('Precision must be positive');
@@ -112,7 +97,7 @@ protected function setSpecificPrecisionFormat($precision)
foreach ($this->binaryPrefixes as $size => $unitPattern) {
if ($size >= 1024) {
- $symbol = \substr($unitPattern, \strpos($unitPattern, ' '));
+ $symbol = \substr($unitPattern, (int) \strpos($unitPattern, ' '));
$this->binaryPrefixes[$size] = $icuFormat.$symbol;
}
}
diff --git a/src/Coduo/PHPHumanizer/String/Breakpoint.php b/src/Coduo/PHPHumanizer/String/Breakpoint.php
index e823511..c29c2a5 100644
--- a/src/Coduo/PHPHumanizer/String/Breakpoint.php
+++ b/src/Coduo/PHPHumanizer/String/Breakpoint.php
@@ -15,12 +15,6 @@ interface Breakpoint
{
/**
* Return the length of the truncated $text depending on the $characterCount.
- *
- * @param string $text
- * @param int $charactersCount
- * @param int $charactersCount
- *
- * @return int
*/
- public function calculatePosition($text, $charactersCount);
+ public function calculatePosition(string $text, int $charactersCount): int;
}
diff --git a/src/Coduo/PHPHumanizer/String/HtmlTruncate.php b/src/Coduo/PHPHumanizer/String/HtmlTruncate.php
index f85097a..0e4c8c7 100644
--- a/src/Coduo/PHPHumanizer/String/HtmlTruncate.php
+++ b/src/Coduo/PHPHumanizer/String/HtmlTruncate.php
@@ -13,37 +13,20 @@
final class HtmlTruncate implements TruncateInterface
{
- /**
- * @var string
- */
- private $append;
+ private string $append;
- /**
- * @var string
- */
- private $allowedTags;
+ private string $allowedTags;
- /**
- * @var Breakpoint
- */
- private $breakpoint;
+ private Breakpoint $breakpoint;
- /**
- * @param Breakpoint $breakpoint
- * @param string $allowedTags
- * @param string $append
- */
- public function __construct(Breakpoint $breakpoint, $allowedTags = '', $append = '')
+ public function __construct(Breakpoint $breakpoint, string $allowedTags = '', string $append = '')
{
$this->breakpoint = $breakpoint;
$this->append = $append;
$this->allowedTags = $allowedTags;
}
- /**
- * @return string
- */
- public function truncate($text, $charactersCount)
+ public function truncate(string $text, int $charactersCount): string
{
$strippedText = \strip_tags($text, $this->allowedTags);
@@ -55,20 +38,15 @@ public function truncate($text, $charactersCount)
* HTML tags if $is_html is set to true.
*
* Adapted from FuelPHP Str::truncate (https://github.com/fuelphp/common/blob/master/src/Str.php)
- *
- * @param string $string
- * @param int $charactersCount
- *
- * @return string the truncated string
*/
- private function truncateHtml($string, $charactersCount)
+ private function truncateHtml(string $string, int $charactersCount): string
{
$limit = $charactersCount;
$offset = 0;
$tags = [];
// Handle special characters.
- \preg_match_all('/&[a-z]+;/i', \strip_tags($string), $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
+ \preg_match_all('#&[a-z]+;#i', \strip_tags($string), $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
foreach ($matches as $match) {
if ($match[0][1] >= $limit) {
break;
@@ -77,13 +55,13 @@ private function truncateHtml($string, $charactersCount)
}
// Handle all the html tags.
- \preg_match_all('/<[^>]+>([^<]*)/', $string, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
+ \preg_match_all('#<[^>]+>([^<]*)#', $string, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
foreach ($matches as $match) {
if ($match[0][1] - $offset >= $limit) {
break;
}
- $tag = \mb_substr(\strtok($match[0][0], " \t\n\r\0\x0B>"), 1);
+ $tag = \mb_substr((string) \strtok($match[0][0], " \t\n\r\0\x0B>"), 1);
if ($tag[0] != '/') {
$tags[] = $tag;
} elseif (\end($tags) == \mb_substr($tag, 1)) {
diff --git a/src/Coduo/PHPHumanizer/String/Humanize.php b/src/Coduo/PHPHumanizer/String/Humanize.php
index a4ef053..e7c79d8 100644
--- a/src/Coduo/PHPHumanizer/String/Humanize.php
+++ b/src/Coduo/PHPHumanizer/String/Humanize.php
@@ -13,28 +13,21 @@
final class Humanize
{
- /**
- * @var string
- */
- private $text;
+ private string $text;
- /**
- * @var bool
- */
- private $capitalize;
+ private bool $capitalize;
+
+ private string $separator;
/**
- * @var string
+ * @var array
*/
- private $separator;
+ private array $forbiddenWords;
/**
- * @param $text
- * @param bool $capitalize
- * @param string $separator
- * @param array $forbiddenWords
+ * @param array $forbiddenWords
*/
- public function __construct($text, $capitalize = true, $separator = '_', array $forbiddenWords = ['id'])
+ public function __construct(string $text, bool $capitalize = true, string $separator = '_', array $forbiddenWords = ['id'])
{
$this->text = $text;
$this->capitalize = $capitalize;
@@ -42,12 +35,9 @@ public function __construct($text, $capitalize = true, $separator = '_', array $
$this->forbiddenWords = $forbiddenWords;
}
- /**
- * @return string
- */
- public function __toString()
+ public function __toString(): string
{
- $humanized = \trim(\strtolower(\preg_replace(['/([A-Z])/', "/[{$this->separator}\\s]+/"], ['_$1', ' '], $this->text)));
+ $humanized = \trim(\strtolower((string) \preg_replace(['/([A-Z])/', \sprintf('/[%s\s]+/', $this->separator)], ['_$1', ' '], $this->text)));
$humanized = \trim(\str_replace($this->forbiddenWords, '', $humanized));
return $this->capitalize ? \ucfirst($humanized) : $humanized;
diff --git a/src/Coduo/PHPHumanizer/String/MetricSuffix.php b/src/Coduo/PHPHumanizer/String/MetricSuffix.php
index 3a76eb3..141987d 100644
--- a/src/Coduo/PHPHumanizer/String/MetricSuffix.php
+++ b/src/Coduo/PHPHumanizer/String/MetricSuffix.php
@@ -13,42 +13,42 @@
final class MetricSuffix
{
- const CONVERT_THRESHOLD = 1000;
-
/**
* @var int
*/
- private $number;
+ const CONVERT_THRESHOLD = 1000;
- /**
- * @var string
- */
- private $locale;
+ private int $number;
+
+ private string $locale;
/**
- * @var array
+ * @var array
*/
- private $binaryPrefixes = [
- 1000000000000000 => '#.##P',
- 1000000000000 => '#.##T',
- 1000000000 => '#.##G',
- 1000000 => '#.##M',
+ private array $binaryPrefixes = [
+ 1_000_000_000_000_000 => '#.##P',
+ 1_000_000_000_000 => '#.##T',
+ 1_000_000_000 => '#.##G',
+ 1_000_000 => '#.##M',
1000 => '#.#k',
0 => '#.#',
];
/**
- * @param $number
+ * @param numeric $number
* @param string $locale
*
* @throws \InvalidArgumentException
*/
- public function __construct($number, $locale = 'en')
+ public function __construct($number, string $locale = 'en')
{
- if (!\class_exists('NumberFormatter')) {
+ if (!\class_exists(\NumberFormatter::class)) {
throw new \RuntimeException('Metric suffix converter requires intl extension!');
}
+ /**
+ * @psalm-suppress DocblockTypeContradiction
+ */
if (!\is_numeric($number)) {
throw new \InvalidArgumentException('Metric suffix converter accept only numeric values.');
}
@@ -63,7 +63,7 @@ public function __construct($number, $locale = 'en')
\krsort($this->binaryPrefixes);
}
- public function convert()
+ public function convert(): string
{
$formatter = new \NumberFormatter($this->locale, \NumberFormatter::PATTERN_DECIMAL);
diff --git a/src/Coduo/PHPHumanizer/String/ShortcodeProcessor.php b/src/Coduo/PHPHumanizer/String/ShortcodeProcessor.php
index 405a056..c1f85c0 100644
--- a/src/Coduo/PHPHumanizer/String/ShortcodeProcessor.php
+++ b/src/Coduo/PHPHumanizer/String/ShortcodeProcessor.php
@@ -20,41 +20,25 @@ final class ShortcodeProcessor
{
/**
* Removes all shortcodes from given text.
- *
- * @param string $text
- *
- * @return string
*/
- public function removeShortcodes($text)
+ public function removeShortcodes(string $text): string
{
- $nullHandler = function () {
- return;
- };
-
- return $this->createShortcodeProcessor($nullHandler)->process($text);
+ return $this->createShortcodeProcessor(
+ function (): void {
+ return;
+ }
+ )->process($text);
}
/**
* Removes only shortcode tags from given text (leaves their content as it is).
- *
- * @param string $text
- *
- * @return string
*/
- public function removeShortcodeTags($text)
+ public function removeShortcodeTags(string $text): string
{
- $contentHandler = function (ShortcodeInterface $s) {
- return $s->getContent();
- };
-
- return $this->createShortcodeProcessor($contentHandler)->process($text);
+ return $this->createShortcodeProcessor(fn (ShortcodeInterface $s) : ?string => $s->getContent())->process($text);
}
- /**
- * @param $defaultHandler
- * @return Processor
- */
- private function createShortcodeProcessor($defaultHandler)
+ private function createShortcodeProcessor(callable $defaultHandler): Processor
{
$handlers = new HandlerContainer();
$handlers->setDefault($defaultHandler);
diff --git a/src/Coduo/PHPHumanizer/String/TextTruncate.php b/src/Coduo/PHPHumanizer/String/TextTruncate.php
index e48c044..a487951 100644
--- a/src/Coduo/PHPHumanizer/String/TextTruncate.php
+++ b/src/Coduo/PHPHumanizer/String/TextTruncate.php
@@ -13,33 +13,17 @@
final class TextTruncate implements TruncateInterface
{
- /**
- * @var string
- */
- private $append;
-
- /**
- * @var Breakpoint
- */
- private $breakpoint;
-
- /**
- * @param Breakpoint $breakpoint
- * @param string $append
- */
- public function __construct(Breakpoint $breakpoint, $append = '')
+ private string $append;
+
+ private Breakpoint $breakpoint;
+
+ public function __construct(Breakpoint $breakpoint, string $append = '')
{
$this->breakpoint = $breakpoint;
$this->append = $append;
}
- /**
- * @param string $text
- * @param int $charactersCount
- *
- * @return string
- */
- public function truncate($text, $charactersCount)
+ public function truncate(string $text, int $charactersCount): string
{
if ($charactersCount < 0 || \mb_strlen($text) <= $charactersCount) {
return $text;
diff --git a/src/Coduo/PHPHumanizer/String/TruncateInterface.php b/src/Coduo/PHPHumanizer/String/TruncateInterface.php
index 1749047..5f671b5 100644
--- a/src/Coduo/PHPHumanizer/String/TruncateInterface.php
+++ b/src/Coduo/PHPHumanizer/String/TruncateInterface.php
@@ -13,11 +13,5 @@
interface TruncateInterface
{
- /**
- * @param string $text
- * @param int $charactersCount
- *
- * @return string mixed
- */
- public function truncate($text, $charactersCount);
+ public function truncate(string $text, int $charactersCount): string;
}
diff --git a/src/Coduo/PHPHumanizer/String/WordBreakpoint.php b/src/Coduo/PHPHumanizer/String/WordBreakpoint.php
index 1a73722..0dd6f7d 100644
--- a/src/Coduo/PHPHumanizer/String/WordBreakpoint.php
+++ b/src/Coduo/PHPHumanizer/String/WordBreakpoint.php
@@ -13,27 +13,22 @@
final class WordBreakpoint implements Breakpoint
{
- /**
- * @param string $text
- * @param int $charactersCount
- * @return bool|int
- */
- public function calculatePosition($text, $charactersCount)
+ public function calculatePosition(string $text, int $charactersCount): int
{
if ($charactersCount < 0) {
- return \mb_strlen($text);
+ return (int) \mb_strlen($text);
}
if ($charactersCount > \mb_strlen($text)) {
- return \mb_strlen($text);
+ return (int) \mb_strlen($text);
}
$breakpoint = \mb_strpos($text, ' ', $charactersCount);
if (false === $breakpoint) {
- return \mb_strlen($text);
+ return (int) \mb_strlen($text);
}
- return $breakpoint;
+ return (int) $breakpoint;
}
}
diff --git a/src/Coduo/PHPHumanizer/StringHumanizer.php b/src/Coduo/PHPHumanizer/StringHumanizer.php
index 8da6660..ceb9df9 100644
--- a/src/Coduo/PHPHumanizer/StringHumanizer.php
+++ b/src/Coduo/PHPHumanizer/StringHumanizer.php
@@ -20,54 +20,30 @@
final class StringHumanizer
{
/**
- * @param $text
- * @param bool|true $capitalize
- * @param string $separator
- * @param array $forbiddenWords
- *
- * @return string
+ * @param array $forbiddenWords
*/
- public static function humanize($text, $capitalize = true, $separator = '_', array $forbiddenWords = [])
+ public static function humanize(string $text, bool $capitalize = true, string $separator = '_', array $forbiddenWords = []): string
{
return (string) new Humanize($text, $capitalize, $separator, $forbiddenWords);
}
- /**
- * @param $text
- * @param $charactersCount
- * @param string $append
- *
- * @return string
- */
- public static function truncate($text, $charactersCount, $append = '')
+ public static function truncate(string $text, int $charactersCount, string $append = ''): string
{
$truncate = new TextTruncate(new WordBreakpoint(), $append);
return $truncate->truncate($text, $charactersCount);
}
- /**
- * @param $text
- * @param $charactersCount
- * @param string $allowedTags
- * @param string $append
- *
- * @return string
- */
- public static function truncateHtml($text, $charactersCount, $allowedTags = '', $append = '')
+ public static function truncateHtml(string $text, int $charactersCount, string $allowedTags = '', string $append = ''): string
{
$truncate = new HtmlTruncate(new WordBreakpoint(), $allowedTags, $append);
return $truncate->truncate($text, $charactersCount);
}
- /**
- * @param $text
- * @return string
- */
- public static function removeShortcodes($text)
+ public static function removeShortcodes(string $text): string
{
- if (!\class_exists('Thunder\Shortcode\Processor\Processor')) {
+ if (!\class_exists('\Thunder\Shortcode\Processor\Processor')) {
throw new \RuntimeException('Please add "thunderer/shortcode": ^0.7 to composer.json first');
}
@@ -76,13 +52,9 @@ public static function removeShortcodes($text)
return $processor->removeShortcodes($text);
}
- /**
- * @param $text
- * @return string
- */
- public static function removeShortcodeTags($text)
+ public static function removeShortcodeTags(string $text): string
{
- if (!\class_exists('Thunder\Shortcode\Processor\Processor')) {
+ if (!\class_exists('\Thunder\Shortcode\Processor\Processor')) {
throw new \RuntimeException('Please add "thunderer/shortcode": ^0.7 to composer.json first');
}
diff --git a/src/Coduo/PHPHumanizer/Translator/Builder.php b/src/Coduo/PHPHumanizer/Translator/Builder.php
index b1500ff..1a3bd56 100644
--- a/src/Coduo/PHPHumanizer/Translator/Builder.php
+++ b/src/Coduo/PHPHumanizer/Translator/Builder.php
@@ -16,11 +16,7 @@
final class Builder
{
- /**
- * @param $locale
- * @return Translator
- */
- public static function build($locale)
+ public static function build(string $locale): Translator
{
$translator = new Translator($locale);
$translator->addLoader('yml', new YamlFileLoader());
diff --git a/tests/Coduo/PHPHumanizer/Tests/Collection/FormatterTest.php b/tests/Coduo/PHPHumanizer/Tests/Collection/FormatterTest.php
new file mode 100644
index 0000000..316dd4c
--- /dev/null
+++ b/tests/Coduo/PHPHumanizer/Tests/Collection/FormatterTest.php
@@ -0,0 +1,49 @@
+assertSame(
+ 'Michal and Norbert',
+ $formatter->format(['Michal', 'Norbert'], null)
+ );
+ }
+
+ public function test_formats_elements_with_limit()
+ {
+ $formatter = new Formatter(Builder::build('en'));
+
+ $this->assertSame(
+ 'Michal, Norbert, and 1 other',
+ $formatter->format(['Michal', 'Norbert', 'Lukasz'], 2)
+ );
+ }
+
+ public function test_formats_elements_without_limit()
+ {
+ $formatter = new Formatter(Builder::build('en'));
+
+ $this->assertSame(
+ 'Michal, Norbert, and Lukasz',
+ $formatter->format(['Michal', 'Norbert', 'Lukasz'], null)
+ );
+ }
+}
diff --git a/tests/Coduo/PHPHumanizer/Tests/Collection/OxfordTest.php b/tests/Coduo/PHPHumanizer/Tests/Collection/OxfordTest.php
new file mode 100644
index 0000000..5a56fcc
--- /dev/null
+++ b/tests/Coduo/PHPHumanizer/Tests/Collection/OxfordTest.php
@@ -0,0 +1,36 @@
+assertSame(
+ '',
+ (new Oxford(new Formatter(Builder::build('en'))))->format([])
+ );
+ }
+
+ public function test_returns_collection_item_string_when_collection_has_one_element() : void
+ {
+ $this->assertSame(
+ 'Michal',
+ (new Oxford(new Formatter(Builder::build('en'))))->format(['Michal'])
+ );
+ }
+}
diff --git a/tests/Coduo/PHPHumanizer/Tests/DateTime/DifferenceTest.php b/tests/Coduo/PHPHumanizer/Tests/DateTime/DifferenceTest.php
new file mode 100644
index 0000000..43c9ec5
--- /dev/null
+++ b/tests/Coduo/PHPHumanizer/Tests/DateTime/DifferenceTest.php
@@ -0,0 +1,120 @@
+assertInstanceOf(Minute::class, $diff->getUnit());
+ $this->assertSame(15, $diff->getQuantity());
+ $this->assertTrue($diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_future_date_in_minutes()
+ {
+ $diff = new Difference(new \DateTime('2014-04-26 13:00:00'), new \DateTime('2014-04-26 13:15:00'));
+ $this->assertInstanceOf(Minute::class, $diff->getUnit());
+ $this->assertSame(15, $diff->getQuantity());
+ $this->assertFalse($diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_past_date_in_hours()
+ {
+ $diff = new Difference(new \DateTime('2014-04-26 13:00:00'), new \DateTime('2014-04-26 11:00:00'));
+ $this->assertInstanceOf(Hour::class, $diff->getUnit());
+ $this->assertSame(2, $diff->getQuantity());
+ $this->assertSame(true, $diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_future_date_in_hours()
+ {
+ $diff = new Difference(new \DateTime('2014-04-26 13:00:00'), new \DateTime('2014-04-26 16:00:00'));
+ $this->assertInstanceOf(Hour::class, $diff->getUnit());
+ $this->assertSame(3, $diff->getQuantity());
+ $this->assertSame(false, $diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_past_date_in_days()
+ {
+ $diff = new Difference(new \DateTime('2014-04-10'), new \DateTime('2014-04-09'));
+ $this->assertInstanceOf(Day::class, $diff->getUnit());
+ $this->assertSame(1, $diff->getQuantity());
+ $this->assertSame(true, $diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_future_date_in_days()
+ {
+ $diff = new Difference(new \DateTime('2014-04-10'), new \DateTime('2014-04-11'));
+ $this->assertInstanceOf(Day::class, $diff->getUnit());
+ $this->assertSame(1, $diff->getQuantity());
+ $this->assertSame(false, $diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_past_date_in_weeks()
+ {
+ $diff = new Difference(new \DateTime('2014-04-15'), new \DateTime('2014-04-01'));
+ $this->assertInstanceOf(Week::class, $diff->getUnit());
+ $this->assertSame(2, $diff->getQuantity());
+ $this->assertSame(true, $diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_future_date_in_weeks()
+ {
+ $diff = new Difference(new \DateTime('2014-04-01'), new \DateTime('2014-04-15'));
+ $this->assertInstanceOf(Week::class, $diff->getUnit());
+ $this->assertSame(2, $diff->getQuantity());
+ $this->assertSame(false, $diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_past_date_in_months()
+ {
+ $diff = new Difference(new \DateTime('2014-04-01'), new \DateTime('2014-03-01'));
+ $this->assertInstanceOf(Month::class, $diff->getUnit());
+ $this->assertSame(1, $diff->getQuantity());
+ $this->assertSame(true, $diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_future_date_in_months()
+ {
+ $diff = new Difference(new \DateTime('2014-04-01'), new \DateTime('2014-05-01'));
+ $this->assertInstanceOf(Month::class, $diff->getUnit());
+ $this->assertSame(1, $diff->getQuantity());
+ $this->assertSame(false, $diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_past_date_in_years()
+ {
+ $diff = new Difference(new \DateTime('2014-01-01'), new \DateTime('2012-01-01'));
+ $this->assertInstanceOf(Year::class, $diff->getUnit());
+ $this->assertSame(2, $diff->getQuantity());
+ $this->assertSame(true, $diff->isPast());
+ }
+
+ public function test_calculate_diff_between_present_and_future_date_in_years()
+ {
+ $diff = new Difference(new \DateTime('2014-01-01'), new \DateTime('2015-01-01'));
+ $this->assertInstanceOf(Year::class, $diff->getUnit());
+ $this->assertSame(1, $diff->getQuantity());
+ $this->assertSame(false, $diff->isPast());
+ }
+}
diff --git a/tests/Coduo/PHPHumanizer/Tests/DateTime/FormatterTest.php b/tests/Coduo/PHPHumanizer/Tests/DateTime/FormatterTest.php
new file mode 100644
index 0000000..72d6011
--- /dev/null
+++ b/tests/Coduo/PHPHumanizer/Tests/DateTime/FormatterTest.php
@@ -0,0 +1,44 @@
+assertSame('10 minutes ago', $formatter->formatDifference($diff));
+ }
+
+ public function test_format_datetime_diff_for_specific_locale() : void
+ {
+ $diff = new Difference(
+ new \DateTime('2015-01-01 00:10:00'),
+ new \DateTime('2015-01-01 00:00:00')
+ );
+
+ $formatter = new Formatter(Builder::build('en'));
+
+ $this->assertSame('10 minut temu', $formatter->formatDifference($diff, 'pl'));
+ }
+}
diff --git a/tests/Coduo/PHPHumanizer/Tests/DateTime/PreciseFormatterTest.php b/tests/Coduo/PHPHumanizer/Tests/DateTime/PreciseFormatterTest.php
new file mode 100644
index 0000000..a14cb81
--- /dev/null
+++ b/tests/Coduo/PHPHumanizer/Tests/DateTime/PreciseFormatterTest.php
@@ -0,0 +1,44 @@
+assertSame('10 days, 5 hours from now', $formatter->formatDifference($diff));
+ }
+
+ public function test_format_compound_datetime_diff_for_specific_locale()
+ {
+ $diff = new PreciseDifference(
+ new \DateTime('2015-01-01 00:00:00'),
+ new \DateTime('2015-01-11 05:00:00')
+ );
+
+ $formatter = new PreciseFormatter(Builder::build('en'));
+
+ $this->assertSame('через 10 дней, 5 часов', $formatter->formatDifference($diff, 'ru'));
+ }
+}
diff --git a/tests/Coduo/PHPHumanizer/Tests/NumberHumanizerTest.php b/tests/Coduo/PHPHumanizer/Tests/NumberHumanizerTest.php
index a0a9847..1199877 100644
--- a/tests/Coduo/PHPHumanizer/Tests/NumberHumanizerTest.php
+++ b/tests/Coduo/PHPHumanizer/Tests/NumberHumanizerTest.php
@@ -185,12 +185,6 @@ public function test_convert_number_to_string_with_binary_suffix($expected, $num
$this->assertEquals($expected, NumberHumanizer::binarySuffix($number, $locale));
}
- public function test_statically_throw_exception_when_converting_to_string_with_binary_suffix_non_numeric_values()
- {
- $this->expectException(\InvalidArgumentException::class);
- NumberHumanizer::binarySuffix('as12');
- }
-
/**
* @dataProvider preciseBinarySuffixDataProvider
*
@@ -569,7 +563,6 @@ public function romanExceptionProvider()
public function arabicExceptionProvider()
{
return [
- [1234],
[''],
['foobar'],
];
diff --git a/tests/Coduo/PHPHumanizer/Tests/String/WordBreakpointTest.php b/tests/Coduo/PHPHumanizer/Tests/String/WordBreakpointTest.php
new file mode 100644
index 0000000..1dd46da
--- /dev/null
+++ b/tests/Coduo/PHPHumanizer/Tests/String/WordBreakpointTest.php
@@ -0,0 +1,51 @@
+assertSame(5, $wordBreakpoint->calculatePosition('Lorem ipsum dolorem', 2));
+ $this->assertSame(5, $wordBreakpoint->calculatePosition('Lorem ipsum dolorem', 4));
+ $this->assertSame(5, $wordBreakpoint->calculatePosition('Lorem ipsum dolorem', 5));
+ $this->assertSame(11, $wordBreakpoint->calculatePosition('Lorem ipsum dolorem', 10));
+ $this->assertSame(19, $wordBreakpoint->calculatePosition('Lorem ipsum dolorem', -2));
+ $this->assertSame(5, $wordBreakpoint->calculatePosition('Lorem ipsum dolorem', 0));
+ }
+
+ public function test_calculate_breakpoint_position_when_sentence_is_shorter_than_characters_count()
+ {
+ $wordBreakpoint = new WordBreakpoint();
+
+ $this->assertSame(19, $wordBreakpoint->calculatePosition('Lorem ipsum dolorem', 20));
+ }
+
+ public function test_calculate_breakpoint_position_when_characters_count_ends_in_last_word()
+ {
+ $wordBreakpoint = new WordBreakpoint();
+
+ $this->assertSame(11, $wordBreakpoint->calculatePosition('Lorem ipsum', 7));
+ }
+
+ public function test_calculate_breakpoint_position_when_characters_count_ends_in_last_space()
+ {
+ $wordBreakpoint = new WordBreakpoint();
+
+ $this->assertSame(5, $wordBreakpoint->calculatePosition('Lorem ipsum', 5));
+ }
+}
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
deleted file mode 100644
index 008bbfe..0000000
--- a/tests/bootstrap.php
+++ /dev/null
@@ -1,12 +0,0 @@
-