diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5561b5f..9786fd6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - php-version: ['8.1', '8.2', '8.3', '8.4', '8.5'] + php-version: ['8.3', '8.4', '8.5'] db: ['sqlite', 'mysql'] steps: - uses: niden/actions-memcached@v7 diff --git a/composer.json b/composer.json index 3b53dc3..f3a90bc 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ }, "require-dev": { "rector/rector": "^0.12.5", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "config": { "vendor-dir": "vendors/", diff --git a/composer.lock b/composer.lock index 7983687..89117e8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,21 +4,21 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "875153d31ac73c4f6960501bd66aaa82", + "content-hash": "2029bac8c297867db747d4637e87388e", "packages": [], "packages-dev": [ { "name": "myclabs/deep-copy", - "version": "1.13.0", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -57,7 +57,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -65,20 +65,20 @@ "type": "tidelift" } ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -97,7 +97,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -121,9 +121,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", @@ -303,35 +303,33 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.16", + "version": "12.5.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + "reference": "876099a072646c7745f673d7aeab5382c4439691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/876099a072646c7745f673d7aeab5382c4439691", + "reference": "876099a072646c7745f673d7aeab5382c4439691", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^10.1" + "phpunit/phpunit": "^12.5.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -340,7 +338,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1.x-dev" + "dev-main": "12.5.x-dev" } }, "autoload": { @@ -369,40 +367,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.6" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2024-08-22T04:31:57+00:00" + "time": "2026-04-15T08:23:17+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.1.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -430,36 +440,48 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2023-08-31T06:24:48+00:00" + "time": "2026-02-02T14:04:18+00:00" }, { "name": "phpunit/php-invoker", - "version": "4.0.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-pcntl": "*" @@ -467,7 +489,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -493,7 +515,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" }, "funding": [ { @@ -501,32 +524,32 @@ "type": "github" } ], - "time": "2023-02-03T06:56:09+00:00" + "time": "2025-02-07T04:58:58+00:00" }, { "name": "phpunit/php-text-template", - "version": "3.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -553,7 +576,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" }, "funding": [ { @@ -561,32 +584,32 @@ "type": "github" } ], - "time": "2023-08-31T14:07:24+00:00" + "time": "2025-02-07T04:59:16+00:00" }, { "name": "phpunit/php-timer", - "version": "6.0.0", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -612,7 +635,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" }, "funding": [ { @@ -620,20 +644,20 @@ "type": "github" } ], - "time": "2023-02-03T06:57:52+00:00" + "time": "2025-02-07T04:59:38+00:00" }, { "name": "phpunit/phpunit", - "version": "10.5.45", + "version": "12.5.25", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "bd68a781d8e30348bc297449f5234b3458267ae8" + "reference": "792c2980442dfce319226b88fa845b8b6de3b333" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bd68a781d8e30348bc297449f5234b3458267ae8", - "reference": "bd68a781d8e30348bc297449f5234b3458267ae8", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/792c2980442dfce319226b88fa845b8b6de3b333", + "reference": "792c2980442dfce319226b88fa845b8b6de3b333", "shasum": "" }, "require": { @@ -643,29 +667,26 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.3", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.2", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.0", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.6", + "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.6", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.1.0", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" }, "bin": [ "phpunit" @@ -673,7 +694,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.5-dev" + "dev-main": "12.5-dev" } }, "autoload": { @@ -705,23 +726,15 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.45" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.25" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2025-02-06T16:08:12+00:00" + "time": "2026-05-13T03:56:57+00:00" }, { "name": "rector/rector", @@ -785,28 +798,28 @@ }, { "name": "sebastian/cli-parser", - "version": "2.0.1", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "4.2-dev" } }, "autoload": { @@ -830,155 +843,59 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2024-03-02T07:12:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "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": "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/2.0.0" - }, - "funding": [ + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:58:43+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "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/3.0.0" - }, - "funding": [ + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" } ], - "time": "2023-02-03T06:59:15+00:00" + "time": "2025-09-14T09:36:45+00:00" }, { "name": "sebastian/comparator", - "version": "5.0.3", + "version": "7.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", - "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c769009dee98f494e0edc3fd4f4087501688f11e", + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^12.2" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -1018,41 +935,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.6" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2024-10-18T14:56:07+00:00" + "time": "2026-04-14T08:23:15+00:00" }, { "name": "sebastian/complexity", - "version": "3.2.0", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.2-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -1076,7 +1005,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" }, "funding": [ { @@ -1084,33 +1013,33 @@ "type": "github" } ], - "time": "2023-12-21T08:37:17+00:00" + "time": "2025-02-07T04:55:25+00:00" }, { "name": "sebastian/diff", - "version": "5.1.1", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1143,7 +1072,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" }, "funding": [ { @@ -1151,27 +1080,27 @@ "type": "github" } ], - "time": "2024-03-02T07:15:17+00:00" + "time": "2025-02-07T04:55:46+00:00" }, { "name": "sebastian/environment", - "version": "6.1.0", + "version": "8.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b121608b28a13f721e76ffbbd386d08eff58f3f6", + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-posix": "*" @@ -1179,7 +1108,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -1207,42 +1136,54 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2024-03-23T08:47:14+00:00" + "time": "2026-04-15T12:13:01+00:00" }, { "name": "sebastian/exporter", - "version": "5.1.2", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", - "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1285,43 +1226,55 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2024-03-02T07:17:12+00:00" + "time": "2025-09-24T06:16:11+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.2", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -1347,41 +1300,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-03-02T07:19:19+00:00" + "time": "2025-08-29T11:29:25+00:00" }, { "name": "sebastian/lines-of-code", - "version": "2.0.2", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" + "nikic/php-parser": "^5.0", + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -1405,7 +1370,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" }, "funding": [ { @@ -1413,34 +1378,34 @@ "type": "github" } ], - "time": "2023-12-21T08:38:20+00:00" + "time": "2025-02-07T04:57:28+00:00" }, { "name": "sebastian/object-enumerator", - "version": "5.0.0", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1462,7 +1427,8 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { @@ -1470,32 +1436,32 @@ "type": "github" } ], - "time": "2023-02-03T07:08:32+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { "name": "sebastian/object-reflector", - "version": "3.0.0", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -1517,7 +1483,8 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { @@ -1525,32 +1492,32 @@ "type": "github" } ], - "time": "2023-02-03T07:06:18+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { "name": "sebastian/recursion-context", - "version": "5.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1580,40 +1547,53 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2023-02-03T07:05:40+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { "name": "sebastian/type", - "version": "4.0.0", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -1636,37 +1616,50 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2023-02-03T07:10:45+00:00" + "time": "2025-08-09T06:57:12+00:00" }, { "name": "sebastian/version", - "version": "4.0.1", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -1689,7 +1682,8 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" }, "funding": [ { @@ -1697,27 +1691,79 @@ "type": "github" } ], - "time": "2023-02-07T11:34:05+00:00" + "time": "2025-02-07T05:00:38+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "type": "library", "autoload": { @@ -1739,7 +1785,7 @@ "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/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, "funding": [ { @@ -1747,7 +1793,7 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-12-08T11:19:18+00:00" } ], "aliases": [], @@ -1756,8 +1802,8 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.4,<8.5" + "php": ">=8.1,<8.6" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/lib/Cake/Core/Configure.php b/lib/Cake/Core/Configure.php index 09cbccf..36b15db 100644 --- a/lib/Cake/Core/Configure.php +++ b/lib/Cake/Core/Configure.php @@ -103,6 +103,7 @@ public static function bootstrap($boot = true) { ); } restore_error_handler(); + restore_exception_handler(); static::_setErrorHandlers( static::$_values['Error'], diff --git a/lib/Cake/I18n/I18n.php b/lib/Cake/I18n/I18n.php index 2b4780f..ccd9a28 100644 --- a/lib/Cake/I18n/I18n.php +++ b/lib/Cake/I18n/I18n.php @@ -293,13 +293,22 @@ public static function translate($singular, $plural = null, $domain = null, $cat } /** - * Clears the domains internal data array. Useful for testing i18n. + * Resets the internal translation state. Useful for testing i18n. + * + * Besides emptying the loaded domains, it drops the resolved language and + * recreates the L10n instance so a stale default language captured at + * construction time cannot leak between consecutive translations. * * @return void */ public static function clear() { $self = I18n::getInstance(); $self->_domains = array(); + $self->_lang = null; + $self->_noLocale = false; + $self->domain = null; + $self->category = 'LC_MESSAGES'; + $self->l10n = new L10n(); } /** diff --git a/lib/Cake/Network/CakeRequest.php b/lib/Cake/Network/CakeRequest.php index c0e7131..f926aff 100644 --- a/lib/Cake/Network/CakeRequest.php +++ b/lib/Cake/Network/CakeRequest.php @@ -433,7 +433,7 @@ public function clientIp($safe = true) { } else { $ipaddr = env('REMOTE_ADDR'); } - return trim($ipaddr); + return trim((string)$ipaddr); } /** diff --git a/lib/Cake/Test/Case/Cache/Engine/ApcEngineTest.php b/lib/Cake/Test/Case/Cache/Engine/ApcEngineTest.php index 2f87b97..159c2d8 100644 --- a/lib/Cake/Test/Case/Cache/Engine/ApcEngineTest.php +++ b/lib/Cake/Test/Case/Cache/Engine/ApcEngineTest.php @@ -31,7 +31,7 @@ class ApcEngineTest extends CakeTestCase { * @var string */ protected $_apcExtension = 'apc'; - private ?bool $_cacheDisable; + private ?bool $_cacheDisable = null; /** * setUp method diff --git a/lib/Cake/Test/Case/Cache/Engine/MemcacheEngineTest.php b/lib/Cake/Test/Case/Cache/Engine/MemcacheEngineTest.php index 6539723..fde59e9 100644 --- a/lib/Cake/Test/Case/Cache/Engine/MemcacheEngineTest.php +++ b/lib/Cake/Test/Case/Cache/Engine/MemcacheEngineTest.php @@ -49,7 +49,7 @@ public function setMemcache($memcache) { */ class MemcacheEngineTest extends CakeTestCase { - private ?bool $_cacheDisable; + private ?bool $_cacheDisable = null; /** * setUp method * diff --git a/lib/Cake/Test/Case/Cache/Engine/RedisEngineTest.php b/lib/Cake/Test/Case/Cache/Engine/RedisEngineTest.php index e753725..ddd0952 100644 --- a/lib/Cake/Test/Case/Cache/Engine/RedisEngineTest.php +++ b/lib/Cake/Test/Case/Cache/Engine/RedisEngineTest.php @@ -26,7 +26,7 @@ */ class RedisEngineTest extends CakeTestCase { - private ?bool $_cacheDisable; + private ?bool $_cacheDisable = null; /** * setUp method * diff --git a/lib/Cake/Test/Case/Cache/Engine/WincacheEngineTest.php b/lib/Cake/Test/Case/Cache/Engine/WincacheEngineTest.php index 141135c..845eb2e 100644 --- a/lib/Cake/Test/Case/Cache/Engine/WincacheEngineTest.php +++ b/lib/Cake/Test/Case/Cache/Engine/WincacheEngineTest.php @@ -25,7 +25,7 @@ */ class WincacheEngineTest extends CakeTestCase { - private ?bool $_cacheDisable; + private ?bool $_cacheDisable = null; /** * setUp method * diff --git a/lib/Cake/Test/Case/Cache/Engine/XcacheEngineTest.php b/lib/Cake/Test/Case/Cache/Engine/XcacheEngineTest.php index 6e075e5..bacfa20 100644 --- a/lib/Cake/Test/Case/Cache/Engine/XcacheEngineTest.php +++ b/lib/Cake/Test/Case/Cache/Engine/XcacheEngineTest.php @@ -25,7 +25,7 @@ */ class XcacheEngineTest extends CakeTestCase { - private ?bool $_cacheDisable; + private ?bool $_cacheDisable = null; /** * setUp method * diff --git a/lib/Cake/Test/Case/Console/Command/Task/ControllerTaskTest.php b/lib/Cake/Test/Case/Console/Command/Task/ControllerTaskTest.php index 5a8e852..7b52b07 100644 --- a/lib/Cake/Test/Case/Console/Command/Task/ControllerTaskTest.php +++ b/lib/Cake/Test/Case/Console/Command/Task/ControllerTaskTest.php @@ -172,8 +172,9 @@ public function testGetNameValidIndex() { */ public function testGetNameInvalidIndex() { $this->Task->interactive = true; + $invalidIndex = count($this->Task->listAll('test')) + 1; $this->Task->expects($this->any())->method('in') - ->will($this->onConsecutiveCalls(50, 'q')); + ->will($this->onConsecutiveCalls($invalidIndex, 'q')); $this->Task->expects($this->once())->method('err'); $this->Task->expects($this->once())->method('_stop'); @@ -548,9 +549,9 @@ public static function nameVariations() { /** * test that both plural and singular forms work for controller baking. * - * @dataProvider nameVariations * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('nameVariations')] public function testExecuteWithControllerNameVariations($name) { $this->Task->connection = 'test'; $this->Task->path = '/my/path/'; diff --git a/lib/Cake/Test/Case/Console/Command/Task/ModelTaskTest.php b/lib/Cake/Test/Case/Console/Command/Task/ModelTaskTest.php index 71e285d..1331ada 100644 --- a/lib/Cake/Test/Case/Console/Command/Task/ModelTaskTest.php +++ b/lib/Cake/Test/Case/Console/Command/Task/ModelTaskTest.php @@ -170,7 +170,8 @@ public function testGetNameValidOption() { * @return void */ public function testGetNameWithOutOfBoundsOption() { - $this->Task->expects($this->any())->method('in')->will($this->onConsecutiveCalls(99, 1)); + $invalidIndex = count($this->Task->listAll('test')) + 1; + $this->Task->expects($this->any())->method('in')->will($this->onConsecutiveCalls($invalidIndex, 1)); $this->Task->expects($this->once())->method('err'); $this->Task->getName('test'); @@ -1002,9 +1003,9 @@ public static function nameVariations() { /** * test that execute passes with different inflections of the same name. * - * @dataProvider nameVariations * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('nameVariations')] public function testExecuteWithNamedModelVariations($name) { $this->Task->connection = 'test'; $this->Task->path = '/my/path/'; diff --git a/lib/Cake/Test/Case/Console/Command/Task/TestTaskTest.php b/lib/Cake/Test/Case/Console/Command/Task/TestTaskTest.php index aa9e11b..b0b8cf1 100644 --- a/lib/Cake/Test/Case/Console/Command/Task/TestTaskTest.php +++ b/lib/Cake/Test/Case/Console/Command/Task/TestTaskTest.php @@ -646,9 +646,9 @@ public static function caseFileNameProvider() { /** * Test filename generation for each type + plugins * - * @dataProvider caseFileNameProvider * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('caseFileNameProvider')] public function testTestCaseFileName($type, $class, $expected) { $this->Task->path = DS . 'my' . DS . 'path' . DS . 'tests' . DS; @@ -747,9 +747,9 @@ public static function mapTypeProvider() { /** * Test that mapType returns the correct package names. * - * @dataProvider mapTypeProvider * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('mapTypeProvider')] public function testMapType($original, $plugin, $expected) { $this->assertEquals($expected, $this->Task->mapType($original, $plugin)); } diff --git a/lib/Cake/Test/Case/Console/Command/Task/ViewTaskTest.php b/lib/Cake/Test/Case/Console/Command/Task/ViewTaskTest.php index 004c294..d7c67a1 100644 --- a/lib/Cake/Test/Case/Console/Command/Task/ViewTaskTest.php +++ b/lib/Cake/Test/Case/Console/Command/Task/ViewTaskTest.php @@ -515,9 +515,9 @@ public static function nameVariations() { /** * test that both plural and singular forms can be used for baking views. * - * @dataProvider nameVariations * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('nameVariations')] public function testExecuteWithControllerVariations($name) { $this->Task->args = array($name); diff --git a/lib/Cake/Test/Case/Console/ShellTest.php b/lib/Cake/Test/Case/Console/ShellTest.php index 6dc334a..6fdb82c 100644 --- a/lib/Cake/Test/Case/Console/ShellTest.php +++ b/lib/Cake/Test/Case/Console/ShellTest.php @@ -877,8 +877,8 @@ public function testShellNaming() /** * Test reading params * - * @dataProvider paramReadingDataProvider */ + #[\PHPUnit\Framework\Attributes\DataProvider('paramReadingDataProvider')] public function testParamReading($toRead, $expected) { $this->Shell->params = [ diff --git a/lib/Cake/Test/Case/Controller/ControllerTest.php b/lib/Cake/Test/Case/Controller/ControllerTest.php index ca3a315..1e175cc 100644 --- a/lib/Cake/Test/Case/Controller/ControllerTest.php +++ b/lib/Cake/Test/Case/Controller/ControllerTest.php @@ -748,9 +748,9 @@ public static function statusCodeProvider() { /** * testRedirect method * - * @dataProvider statusCodeProvider * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('statusCodeProvider')] public function testRedirectByCode($code, $msg) { $Controller = new Controller(null); $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); @@ -769,9 +769,9 @@ public function testRedirectByCode($code, $msg) { /** * test redirecting by message * - * @dataProvider statusCodeProvider * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('statusCodeProvider')] public function testRedirectByMessage($code, $msg) { $Controller = new Controller(null); $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); @@ -1019,7 +1019,6 @@ public function testReferer() { $this->assertEquals('/posts/index', $result); $Controller = new Controller($request); - $request->setReturnValue('referer', '/', array(true)); $result = $Controller->referer(array('controller' => 'posts', 'action' => 'index'), true); $this->assertEquals('/posts/index', $result); @@ -1214,9 +1213,9 @@ public static function dangerousPostConditionsProvider() { /** * test postConditions raising an exception on unsafe keys. * - * @dataProvider dangerousPostConditionsProvider * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('dangerousPostConditionsProvider')] public function testPostConditionsDangerous($data) { $this->expectException(\RuntimeException::class); $request = new CakeRequest('controller_posts/index'); diff --git a/lib/Cake/Test/Case/Core/AppTest.php b/lib/Cake/Test/Case/Core/AppTest.php index e3ddfcb..ff08b9b 100644 --- a/lib/Cake/Test/Case/Core/AppTest.php +++ b/lib/Cake/Test/Case/Core/AppTest.php @@ -842,9 +842,9 @@ public function testPluginLibClasses() { /** * Test that increaseMemoryLimit increases the maximum amount of memory actually * - * @dataProvider memoryVariationProvider * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('memoryVariationProvider')] public function testIncreaseMemoryLimit($memoryLimit, $additionalKb, $expected) { $this->skipIf(!function_exists('ini_set')); diff --git a/lib/Cake/Test/Case/Core/ConfigureTest.php b/lib/Cake/Test/Case/Core/ConfigureTest.php index 4bacabc..52cc5b4 100644 --- a/lib/Cake/Test/Case/Core/ConfigureTest.php +++ b/lib/Cake/Test/Case/Core/ConfigureTest.php @@ -83,6 +83,11 @@ public function testBootstrap() { $this->assertEquals($expected['foo'], $result['foo']); $this->assertFalse($result['base']); + + // Configure::bootstrap() installs CakePHP's error/exception handlers; + // restore them so the test leaves the handler stack as it found it. + restore_error_handler(); + restore_exception_handler(); } /** diff --git a/lib/Cake/Test/Case/Error/ErrorHandlerTest.php b/lib/Cake/Test/Case/Error/ErrorHandlerTest.php index 5c505ca..62f5b78 100644 --- a/lib/Cake/Test/Case/Error/ErrorHandlerTest.php +++ b/lib/Cake/Test/Case/Error/ErrorHandlerTest.php @@ -110,7 +110,6 @@ public function testHandleErrorDebugOn() { $this->assertMatchesRegularExpression('/
/', $result);
 		$this->assertMatchesRegularExpression('/(Notice|Warning)<\/b>/', $result);
 		$this->assertMatchesRegularExpression('/variable\:?\s+\$?wrong/', $result);
-		restore_error_handler();
 	}
 
 /**
@@ -128,9 +127,9 @@ public static function errorProvider() {
 /**
  * test error mappings
  *
- * @dataProvider errorProvider
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('errorProvider')]
 	public function testErrorMapping($error, $expected) {
 		set_error_handler('ErrorHandler::handleError');
 		$this->_restoreError = true;
@@ -142,7 +141,6 @@ public function testErrorMapping($error, $expected) {
 
 		$result = ob_get_clean();
 		$this->assertMatchesRegularExpression('/' . $expected . '<\/b>/', $result);
-		restore_error_handler();
 	}
 
 /**
@@ -165,7 +163,6 @@ public function testErrorSuppressed() {
 		}else{
 			$this->assertTrue(empty($result));
 		}
-		restore_error_handler();
 	}
 
 /**
@@ -196,7 +193,6 @@ public function testHandleErrorDebugOff() {
 		if (file_exists(LOGS . 'debug.log')) {
 			unlink(LOGS . 'debug.log');
 		}
-		restore_error_handler();
 	}
 
 	public function testHandleErrorDebugOffPHP8() {
@@ -222,7 +218,6 @@ public function testHandleErrorDebugOffPHP8() {
 		if (file_exists(LOGS . 'error.log')) {
 			unlink(LOGS . 'error.log');
 		}
-		restore_error_handler();
 	}
 
 /**
@@ -254,7 +249,6 @@ public function testHandleErrorLoggingTrace() {
 		if (file_exists(LOGS . 'debug.log')) {
 			unlink(LOGS . 'debug.log');
 		}
-		restore_error_handler();
 	}
 
 	public function testHandleErrorLoggingTracePHP8() {
@@ -282,7 +276,6 @@ public function testHandleErrorLoggingTracePHP8() {
 		if (file_exists(LOGS . 'error.log')) {
 			unlink(LOGS . 'error.log');
 		}
-		restore_error_handler();
 	}
 
 /**
diff --git a/lib/Cake/Test/Case/Error/ExceptionRendererTest.php b/lib/Cake/Test/Case/Error/ExceptionRendererTest.php
index 301fb3b..155c356 100644
--- a/lib/Cake/Test/Case/Error/ExceptionRendererTest.php
+++ b/lib/Cake/Test/Case/Error/ExceptionRendererTest.php
@@ -671,9 +671,9 @@ public static function errorProvider() {
 /**
  * Test the various CakeException sub classes
  *
- * @dataProvider errorProvider
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('errorProvider')]
 	public function testCakeExceptionHandling($exception, $patterns, $code) {
 		$ExceptionRenderer = new ExceptionRenderer($exception);
 		$ExceptionRenderer->controller->response = $this->getMock('CakeResponse', array('statusCode', '_sendHeader'));
diff --git a/lib/Cake/Test/Case/I18n/I18nTest.php b/lib/Cake/Test/Case/I18n/I18nTest.php
index 69c5949..23e20e8 100644
--- a/lib/Cake/Test/Case/I18n/I18nTest.php
+++ b/lib/Cake/Test/Case/I18n/I18nTest.php
@@ -43,6 +43,12 @@ public function setUp(): void {
 		Configure::write('Session', array('defaults' => 'php'));
 		CakeSession::destroy();
 
+		// Each test selects its own language; start from a clean slate so a
+		// language left over from a previous test cannot become the stale
+		// default captured by the L10n instance.
+		Configure::delete('Config.language');
+		I18n::clear();
+
 		Cache::delete('object_map', '_cake_core_');
 		App::build(array(
 			'Locale' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Locale' . DS),
@@ -59,6 +65,8 @@ public function setUp(): void {
 	public function tearDown(): void {
 		parent::tearDown();
 
+		Configure::delete('Config.language');
+		I18n::clear();
 		Cache::delete('object_map', '_cake_core_');
 		CakeSession::destroy();
 		App::build();
diff --git a/lib/Cake/Test/Case/I18n/L10nTest.php b/lib/Cake/Test/Case/I18n/L10nTest.php
index 4256345..d3b70bd 100644
--- a/lib/Cake/Test/Case/I18n/L10nTest.php
+++ b/lib/Cake/Test/Case/I18n/L10nTest.php
@@ -123,8 +123,14 @@ public function testGetAutoLanguage() {
 /**
  * testGet method with deprecated constant DEFAULT_LANGUAGE
  *
+ * Runs in a separate process: it defines the DEFAULT_LANGUAGE constant,
+ * which cannot be undefined and would otherwise become a permanent stale
+ * default for every L10n instance created afterwards in the same process.
+ *
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\RunInSeparateProcess]
+	#[\PHPUnit\Framework\Attributes\PreserveGlobalState(false)]
 	public function testGetWithDeprecatedConstant() {
 		$this->skipIf(defined('DEFAULT_LANGUAGE'), 'Cannot re-define already defined constant.');
 
diff --git a/lib/Cake/Test/Case/Log/Engine/SyslogLogTest.php b/lib/Cake/Test/Case/Log/Engine/SyslogLogTest.php
index e0ab827..d25c266 100644
--- a/lib/Cake/Test/Case/Log/Engine/SyslogLogTest.php
+++ b/lib/Cake/Test/Case/Log/Engine/SyslogLogTest.php
@@ -48,9 +48,9 @@ public function testOpenLog() {
 /**
  * Tests that single lines are written to syslog
  *
- * @dataProvider typesProvider
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('typesProvider')]
 	public function testWriteOneLine($type, $expected) {
 		$log = $this->getMock('SyslogLog', array('_open', '_write'));
 		$log->expects($this->once())->method('_write')->with($expected, $type . ': Foo');
diff --git a/lib/Cake/Test/Case/Model/Behavior/TranslateBehaviorTest.php b/lib/Cake/Test/Case/Model/Behavior/TranslateBehaviorTest.php
index 92cf5fc..4dd3904 100644
--- a/lib/Cake/Test/Case/Model/Behavior/TranslateBehaviorTest.php
+++ b/lib/Cake/Test/Case/Model/Behavior/TranslateBehaviorTest.php
@@ -1139,6 +1139,7 @@ public function testFieldsRestoreAfterBind() {
 		$this->loadFixtures('Translate', 'TranslatedItem');
 
 		$TestModel = new TranslatedItem();
+		$TestModel->locale = 'eng';
 
 		$translations = array('title' => 'Title');
 		$TestModel->bindTranslation($translations);
diff --git a/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php b/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php
index b450dc6..aeef83e 100644
--- a/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php
+++ b/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php
@@ -98,9 +98,9 @@ public function tearDown(): void {
 /**
  * Test Dbo value method
  *
- * @group quoting
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\Group('quoting')]
 	public function testQuoting() {
 		$result = $this->Dbo->fields($this->model);
 		$expected = array(
@@ -158,9 +158,9 @@ public function testQuoting() {
 /**
  * test that localized floats don't cause trouble.
  *
- * @group quoting
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\Group('quoting')]
 	public function testLocalizedFloats() {
 		$this->skipIf(DS === '\\', 'The locale is not supported in Windows and affect the others tests.');
 
@@ -271,9 +271,9 @@ public function testLastAffected() {
 /**
  * testIndexDetection method
  *
- * @group indices
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\Group('indices')]
 	public function testIndexDetection() {
 		$this->Dbo->cacheSources = false;
 
@@ -372,9 +372,9 @@ public function testIndexDetection() {
  * MySQL 4.x returns index data in a different format,
  * Using a mock ensure that MySQL 4.x output is properly parsed.
  *
- * @group indices
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\Group('indices')]
 	public function testIndexOnMySQL4Output() {
 		$this->skipIf(version_compare(PHP_VERSION, '8.1', '>='), 'Escapando teste no PHP 8.1');
 		$name = $this->Dbo->fullTableName('simple');
@@ -548,9 +548,9 @@ public function testColumn() {
 /**
  * testAlterSchemaIndexes method
  *
- * @group indices
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\Group('indices')]
 	public function testAlterSchemaIndexes() {
 		$this->Dbo->cacheSources = $this->Dbo->testing = false;
 		$table = $this->Dbo->fullTableName('altertest');
@@ -3270,8 +3270,8 @@ public function testBuildColumnBadType() {
  *
  * @return void
  *
- * @dataProvider buildColumnUnsignedProvider
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('buildColumnUnsignedProvider')]
 	public function testBuildColumnUnsigned($data, $expected) {
 		$result = $this->Dbo->buildColumn($data);
 		$this->assertEquals($expected, $result);
diff --git a/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php b/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php
index e7000cb..170e822 100644
--- a/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php
+++ b/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php
@@ -43,6 +43,7 @@ public function __construct() {
 	/**
 	 * @return false|string|void
 	 */
+	#[\ReturnTypeWillChange]
 	public function quote($string, $type = PDO::PARAM_INT)
 	{
 		return parent::quote($string, $type);
@@ -51,6 +52,7 @@ public function quote($string, $type = PDO::PARAM_INT)
 	/**
 	 * @return false|int|void
 	 */
+	#[\ReturnTypeWillChange]
 	public function exec($statement)
 	{
 		return parent::exec($statement);
@@ -59,6 +61,7 @@ public function exec($statement)
 	/**
 	 * @return false|string|void
 	 */
+	#[\ReturnTypeWillChange]
 	public function lastInsertId($name = null)
 	{
 		return parent::lastInsertId($name);
@@ -67,6 +70,7 @@ public function lastInsertId($name = null)
 	/**
 	 * @return false|\PDOStatement|void
 	 */
+	#[\ReturnTypeWillChange]
 	public function prepare($query, $options = [])
 	{
 		return parent::prepare($query, $options);
@@ -75,6 +79,7 @@ public function prepare($query, $options = [])
 	/**
 	 * @return false|\PDOStatement|void
 	 */
+	#[\ReturnTypeWillChange]
 	public function query(string $statement, ?int $mode = PDO::ATTR_DEFAULT_FETCH_MODE, $arg3 = null, ...$fechModeArgs)
 	{
 		return parent::query($statement, $mode, $arg3, $fechModeArgs);
@@ -1662,9 +1667,9 @@ public static function joinStatements() {
  * Test buildJoinStatement()
  * ensure that schemaName is not added when table value is a subquery
  *
- * @dataProvider joinStatements
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('joinStatements')]
 	public function testBuildJoinStatement($join, $expected) {
 		$db = $this->getMock('DboTestSource', array('getSchemaName'));
 		$db->expects($this->any())
@@ -1700,9 +1705,9 @@ public static function joinStatementsWithPrefix() {
  * Test buildJoinStatement()
  * ensure that prefix is not added when table value is a subquery
  *
- * @dataProvider joinStatementsWithPrefix
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('joinStatementsWithPrefix')]
 	public function testBuildJoinStatementWithTablePrefix($join, $expected) {
 		$db = new DboTestSource();
 		$db->config['prefix'] = 'pre_';
diff --git a/lib/Cake/Test/Case/Model/ModelIntegrationTest.php b/lib/Cake/Test/Case/Model/ModelIntegrationTest.php
index e8fdc49..e0d329e 100644
--- a/lib/Cake/Test/Case/Model/ModelIntegrationTest.php
+++ b/lib/Cake/Test/Case/Model/ModelIntegrationTest.php
@@ -57,9 +57,9 @@ class ModelIntegrationTest extends BaseModelTest {
 /**
  * testAssociationLazyLoading
  *
- * @group lazyloading
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\Group('lazyloading')]
 	public function testAssociationLazyLoading() {
 		$this->loadFixtures('ArticleFeaturedsTags');
 		$Article = new ArticleFeatured();
@@ -93,9 +93,9 @@ public function testAssociationLazyLoading() {
 /**
  * testAssociationLazyLoadWithHABTM
  *
- * @group lazyloading
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\Group('lazyloading')]
 	public function testAssociationLazyLoadWithHABTM() {
 		$this->loadFixtures('FruitsUuidTag', 'ArticlesTag');
 		$this->db->cacheSources = false;
@@ -121,9 +121,9 @@ public function testAssociationLazyLoadWithHABTM() {
 /**
  * testAssociationLazyLoadWithBindModel
  *
- * @group lazyloading
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\Group('lazyloading')]
 	public function testAssociationLazyLoadWithBindModel() {
 		$this->loadFixtures('Article', 'User');
 		$Article = new ArticleB();
@@ -1013,9 +1013,9 @@ public static function timeProvider() {
 /**
  * test deconstruct with time fields.
  *
- * @dataProvider timeProvider
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('timeProvider')]
 	public function testDeconstructFieldsTime($input, $result) {
 		$this->skipIf($this->db instanceof Sqlserver, 'This test is not compatible with SQL Server.');
 
diff --git a/lib/Cake/Test/Case/Network/CakeRequestTest.php b/lib/Cake/Test/Case/Network/CakeRequestTest.php
index c155aa1..e273c36 100644
--- a/lib/Cake/Test/Case/Network/CakeRequestTest.php
+++ b/lib/Cake/Test/Case/Network/CakeRequestTest.php
@@ -108,7 +108,9 @@ public function tearDown(): void {
 			$_SERVER['PHP_SELF'],
 			$_SERVER['PATH_INFO'],
 			$_SERVER['QUERY_STRING'],
-			$_SERVER['HTTP_REFERER']
+			$_SERVER['HTTP_REFERER'],
+			$_SERVER['CONTENT_TYPE'],
+			$_SERVER['HTTP_CONTENT_TYPE']
 		);
 		$_POST = array();
 		$_FILES = array();
@@ -2083,12 +2085,12 @@ public static function environmentGenerator() {
 /**
  * Test environment detection
  *
- * @dataProvider environmentGenerator
  * @param $name
  * @param $env
  * @param $expected
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('environmentGenerator')]
 	public function testEnvironmentDetection($name, $env, $expected) {
 		$_GET = array();
 		$this->_loadEnvironment($env);
@@ -2206,8 +2208,8 @@ public function testDataWritingFalsey() {
 /**
  * Test reading params
  *
- * @dataProvider paramReadingDataProvider
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('paramReadingDataProvider')]
 	public function testParamReading($toRead, $expected) {
 		$request = new CakeRequest('/');
 		$request->addParams(array(
diff --git a/lib/Cake/Test/Case/Network/CakeResponseTest.php b/lib/Cake/Test/Case/Network/CakeResponseTest.php
index ae221ab..48cf6b5 100644
--- a/lib/Cake/Test/Case/Network/CakeResponseTest.php
+++ b/lib/Cake/Test/Case/Network/CakeResponseTest.php
@@ -261,9 +261,9 @@ public static function charsetTypeProvider() {
 /**
  * Tests the send method and changing the content type
  *
- * @dataProvider charsetTypeProvider
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('charsetTypeProvider')]
 	public function testSendChangingContentType($original, $expected) {
 		$response = $this->getMock('CakeResponse', array('_sendHeader', '_sendContent', '_setCookies'));
 		$response->type($original);
@@ -1094,7 +1094,6 @@ public function testCookieSettings() {
 /**
  * Test CORS
  *
- * @dataProvider corsData
  * @param CakeRequest $request
  * @param string $origin
  * @param string|array $domains
@@ -1105,6 +1104,7 @@ public function testCookieSettings() {
  * @param string|bool $expectedHeaders
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('corsData')]
 	public function testCors($request, $origin, $domains, $methods, $headers, $expectedOrigin, $expectedMethods = false, $expectedHeaders = false) {
 		$_SERVER['HTTP_ORIGIN'] = $origin;
 
@@ -1613,9 +1613,9 @@ public static function rangeProvider() {
 /**
  * Test the various range offset types.
  *
- * @dataProvider rangeProvider
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('rangeProvider')]
 	public function testFileRangeOffsets($range, $length, $offsetResponse) {
 		$_SERVER['HTTP_RANGE'] = $range;
 		$response = $this->getMock('CakeResponse', array(
@@ -1745,9 +1745,9 @@ public static function invalidFileRangeProvider() {
 /**
  * Test invalid file ranges.
  *
- * @dataProvider invalidFileRangeProvider
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('invalidFileRangeProvider')]
 	public function testFileRangeInvalid($range) {
 		$_SERVER['HTTP_RANGE'] = $range;
 		$response = $this->getMock('CakeResponse', array(
@@ -1800,9 +1800,9 @@ public function testFileRangeReversed() {
 /**
  * testFileRangeOffsetsNoDownload method
  *
- * @dataProvider rangeProvider
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('rangeProvider')]
 	public function testFileRangeOffsetsNoDownload($range, $length, $offsetResponse) {
 		$_SERVER['HTTP_RANGE'] = $range;
 		$response = $this->getMock('CakeResponse', array(
diff --git a/lib/Cake/Test/Case/Network/CakeSocketTest.php b/lib/Cake/Test/Case/Network/CakeSocketTest.php
index 536fdd3..e7aa2dd 100644
--- a/lib/Cake/Test/Case/Network/CakeSocketTest.php
+++ b/lib/Cake/Test/Case/Network/CakeSocketTest.php
@@ -117,9 +117,9 @@ public static function invalidConnections() {
 /**
 	 * testInvalidConnection method
 	 *
-	 * @dataProvider invalidConnections
 	 * @return void
 	 */
+	#[\PHPUnit\Framework\Attributes\DataProvider('invalidConnections')]
 	public function testInvalidConnection($data) {
 		$this->expectException('SocketException');
 		$this->Socket->config = array_merge($this->Socket->config, $data);
diff --git a/lib/Cake/Test/Case/Network/Email/CakeEmailTest.php b/lib/Cake/Test/Case/Network/Email/CakeEmailTest.php
index 66b7c67..8901206 100644
--- a/lib/Cake/Test/Case/Network/Email/CakeEmailTest.php
+++ b/lib/Cake/Test/Case/Network/Email/CakeEmailTest.php
@@ -774,9 +774,9 @@ public static function invalidHeaders() {
 /**
 	 * testInvalidHeaders
 	 *
-	 * @dataProvider invalidHeaders
 	 * @return void
 	 */
+	#[\PHPUnit\Framework\Attributes\DataProvider('invalidHeaders')]
 	public function testInvalidHeaders($value) {
 		$this->expectException('SocketException');
 		$this->CakeEmail->setHeaders($value);
@@ -785,9 +785,9 @@ public function testInvalidHeaders($value) {
 /**
 	 * testInvalidAddHeaders
 	 *
-	 * @dataProvider invalidHeaders
 	 * @return void
 	 */
+	#[\PHPUnit\Framework\Attributes\DataProvider('invalidHeaders')]
 	public function testInvalidAddHeaders($value) {
 		$this->expectException('SocketException');
 		$this->CakeEmail->addHeaders($value);
diff --git a/lib/Cake/Test/Case/Network/Http/HttpResponseTest.php b/lib/Cake/Test/Case/Network/Http/HttpResponseTest.php
index 4c16798..ae59a18 100644
--- a/lib/Cake/Test/Case/Network/Http/HttpResponseTest.php
+++ b/lib/Cake/Test/Case/Network/Http/HttpResponseTest.php
@@ -361,9 +361,9 @@ public static function invalidParseResponseDataProvider() {
 /**
 	 * testInvalidParseResponseData
 	 *
-	 * @dataProvider invalidParseResponseDataProvider
 	 * @return void
 	 */
+	#[\PHPUnit\Framework\Attributes\DataProvider('invalidParseResponseDataProvider')]
 	public function testInvalidParseResponseData($value) {
 		$this->expectException('SocketException');
 		$this->HttpResponse->parseResponse($value);
diff --git a/lib/Cake/Test/Case/Network/Http/HttpSocketTest.php b/lib/Cake/Test/Case/Network/Http/HttpSocketTest.php
index bf793ce..4683130 100644
--- a/lib/Cake/Test/Case/Network/Http/HttpSocketTest.php
+++ b/lib/Cake/Test/Case/Network/Http/HttpSocketTest.php
@@ -1869,9 +1869,9 @@ public static function statusProvider() {
 /**
  * test response status parsing
  *
- * @dataProvider statusProvider
  * @return void
  */
+	#[\PHPUnit\Framework\Attributes\DataProvider('statusProvider')]
 	public function testResponseStatusParsing($status, $code, $msg = '') {
 		$this->Socket->connected = true;
 		$serverResponse = $status . "\r\nDate: Mon, 16 Apr 2007 04:14:16 GMT\r\nServer: CakeHttp Server\r\n\r\n

This is a test!

"; diff --git a/lib/Cake/Test/Case/Routing/DispatcherTest.php b/lib/Cake/Test/Case/Routing/DispatcherTest.php index 30c652f..2dda4ca 100644 --- a/lib/Cake/Test/Case/Routing/DispatcherTest.php +++ b/lib/Cake/Test/Case/Routing/DispatcherTest.php @@ -1523,10 +1523,10 @@ public static function assetProvider() { /** * Test assets * - * @dataProvider assetProvider * @outputBuffering enabled * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('assetProvider')] public function testAsset($url, $file) { Router::reload(); @@ -1600,9 +1600,9 @@ public static function cacheActionProvider() { /** * testFullPageCachingDispatch method * - * @dataProvider cacheActionProvider * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('cacheActionProvider')] public function testFullPageCachingDispatch($url) { Configure::write('Cache.disable', false); Configure::write('Cache.check', true); diff --git a/lib/Cake/Test/Case/Routing/RouterTest.php b/lib/Cake/Test/Case/Routing/RouterTest.php index d007c54..cf111e6 100644 --- a/lib/Cake/Test/Case/Routing/RouterTest.php +++ b/lib/Cake/Test/Case/Routing/RouterTest.php @@ -18,11 +18,52 @@ App::uses('Router', 'Routing'); App::uses('CakeResponse', 'Network'); +App::uses('CakeRoute', 'Routing/Route'); if (!defined('FULL_BASE_URL')) { define('FULL_BASE_URL', 'https://cakephp.org'); } +/** + * Test double route class whose parse() result can be controlled by the test. + * + * @package Cake.Test.Case.Routing + */ +class MockConnectedRoute extends CakeRoute { + +/** + * Value returned by parse(). + * + * @var array|bool + */ + public $parseReturn = false; + + public function parse($url) { + return $this->parseReturn; + } + +} + +/** + * Test double route class whose match() result can be controlled by the test. + * + * @package Cake.Test.Case.Routing + */ +class MockReturnRoute extends CakeRoute { + +/** + * Value returned by match(). + * + * @var string|bool + */ + public $matchReturn = false; + + public function match($url) { + return $this->matchReturn; + } + +} + /** * RouterTest class * @@ -1258,8 +1299,8 @@ public function testRouteSymmetry() { * Test parse and reverse symmetry * * @return void - * @dataProvider parseReverseSymmetryData */ + #[\PHPUnit\Framework\Attributes\DataProvider('parseReverseSymmetryData')] public function testParseReverseSymmetry($url) { $this->assertSame($url, Router::reverse(Router::parse($url) + array('url' => array()))); } @@ -2412,7 +2453,6 @@ public function testConnectDefaultRoutes() { * @return void */ public function testUsingCustomRouteClass() { - $this->getMock('CakeRoute', array(), array(), 'MockConnectedRoute', false); $routes = Router::connect( '/:slug', array('controller' => 'posts', 'action' => 'view'), @@ -2420,9 +2460,7 @@ public function testUsingCustomRouteClass() { ); $this->assertInstanceOf('MockConnectedRoute', $routes[0], 'Incorrect class used. %s'); $expected = array('controller' => 'posts', 'action' => 'view', 'slug' => 'test'); - $routes[0]->expects($this->any()) - ->method('parse') - ->will($this->returnValue($expected)); + $routes[0]->parseReturn = $expected; $result = Router::parse('/test'); $this->assertEquals($expected, $result); } @@ -2685,10 +2723,8 @@ public function testUrlWithRequestAction() { public function testUrlFullUrlReturnFromRoute() { $url = 'http://example.com/posts/view/1'; - $this->getMock('CakeRoute', array(), array('/'), 'MockReturnRoute'); $routes = Router::connect('/:controller/:action', array(), array('routeClass' => 'MockReturnRoute')); - $routes[0]->expects($this->any())->method('match') - ->will($this->returnValue($url)); + $routes[0]->matchReturn = $url; $result = Router::url(array('controller' => 'posts', 'action' => 'view', 1)); $this->assertEquals($url, $result); diff --git a/lib/Cake/Test/Case/TestSuite/ControllerTestCaseTest.php b/lib/Cake/Test/Case/TestSuite/ControllerTestCaseTest.php index 791dae3..b3c4f3a 100644 --- a/lib/Cake/Test/Case/TestSuite/ControllerTestCaseTest.php +++ b/lib/Cake/Test/Case/TestSuite/ControllerTestCaseTest.php @@ -135,7 +135,7 @@ public function setUp(): void { 'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS) ), App::RESET); CakePlugin::load(array('TestPlugin', 'TestPluginTwo')); - $this->Case = $this->getMockForAbstractClass('ControllerTestCase'); + $this->Case = $this->getMockForAbstractClass('ControllerTestCase', ['ControllerTestCaseMock']); Router::reload(); } diff --git a/lib/Cake/Test/Case/TestSuite/Fixture/CakeFixtureManagerTest.php b/lib/Cake/Test/Case/TestSuite/Fixture/CakeFixtureManagerTest.php index cf1c0ea..2604d9e 100644 --- a/lib/Cake/Test/Case/TestSuite/Fixture/CakeFixtureManagerTest.php +++ b/lib/Cake/Test/Case/TestSuite/Fixture/CakeFixtureManagerTest.php @@ -80,7 +80,9 @@ public function testLoadTruncatesTable() { )); } - $TestCase = $this->getMock('CakeTestCase'); + $TestCase = $this->getMockBuilder('CakeTestCase') + ->setConstructorArgs(array('dummy')) + ->getMock(); $TestCase->fixtures = array('core.uuid'); $TestCase->autoFixtures = true; $TestCase->dropTables = false; diff --git a/lib/Cake/Test/Case/Utility/CakeNumberTest.php b/lib/Cake/Test/Case/Utility/CakeNumberTest.php index 3205f79..caf69ff 100644 --- a/lib/Cake/Test/Case/Utility/CakeNumberTest.php +++ b/lib/Cake/Test/Case/Utility/CakeNumberTest.php @@ -746,9 +746,9 @@ public function testToPercentage() { /** * testFromReadableSize * - * @dataProvider filesizes * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('filesizes')] public function testFromReadableSize($params, $expected) { $result = $this->Number->fromReadableSize($params['size'], $params['default']); $this->assertEquals($expected, $result); diff --git a/lib/Cake/Test/Case/Utility/CakeTextTest.php b/lib/Cake/Test/Case/Utility/CakeTextTest.php index 4913f24..51e3c0e 100644 --- a/lib/Cake/Test/Case/Utility/CakeTextTest.php +++ b/lib/Cake/Test/Case/Utility/CakeTextTest.php @@ -347,11 +347,11 @@ public function testReplaceWithQuestionMarkInString() { /** * test that wordWrap() works the same as built-in wordwrap function * - * @dataProvider wordWrapProvider * @return void * @covers ::wordWrap * @covers ::_wordWrap */ + #[\PHPUnit\Framework\Attributes\DataProvider('wordWrapProvider')] public function testWordWrap($text, $width, $break = "\n", $cut = false) { $result = CakeText::wordWrap($text, $width, $break, $cut); $expected = wordwrap($text, $width, $break, $cut); diff --git a/lib/Cake/Test/Case/Utility/CakeTimeTest.php b/lib/Cake/Test/Case/Utility/CakeTimeTest.php index 21cd9dc..eb91ad9 100644 --- a/lib/Cake/Test/Case/Utility/CakeTimeTest.php +++ b/lib/Cake/Test/Case/Utility/CakeTimeTest.php @@ -17,6 +17,7 @@ */ App::uses('CakeTime', 'Utility'); +App::uses('I18n', 'I18n'); /** * CakeTimeTest class @@ -69,6 +70,13 @@ public function setUp(): void { parent::setUp(); $this->Time = new CakeTime(); $this->_systemTimezoneIdentifier = date_default_timezone_get(); + + // Reset i18n state so a language selected by a previous test cannot + // remain as L10n's stale default and override the language a test + // asks for. Config.language is cleared before I18n::clear() so the + // recreated L10n instance starts without a default. + Configure::delete('Config.language'); + I18n::clear(); Configure::write('Config.language', 'eng'); } @@ -81,6 +89,8 @@ public function tearDown(): void { parent::tearDown(); unset($this->Time); $this->_restoreSystemTimezone(); + Configure::delete('Config.language'); + I18n::clear(); } /** @@ -147,9 +157,9 @@ public static function timeAgoProvider() { /** * testTimeAgoInWords method * - * @dataProvider timeAgoProvider * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('timeAgoProvider')] public function testTimeAgoInWords($input, $expected) { $result = $this->Time->timeAgoInWords($input); $this->assertEquals($expected, $result); @@ -203,9 +213,9 @@ public static function timeAgoEndProvider() { /** * test the end option for timeAgoInWords * - * @dataProvider timeAgoEndProvider * @return void */ + #[\PHPUnit\Framework\Attributes\DataProvider('timeAgoEndProvider')] public function testTimeAgoInWordsEnd($input, $expected, $end) { $result = $this->Time->timeAgoInWords( $input, array('end' => $end) @@ -504,7 +514,9 @@ public function testNiceShortI18n() { $set = setlocale(LC_ALL, 'es_ES'); $this->skipIf($set === false, 'es_ES locale is not available on this system.'); $time = strtotime('2015-01-07 03:05:00'); - $this->assertEquals('ene 7th 2015, 03:05', $this->Time->niceShort($time)); + // Some systems' es_ES locale data abbreviates January as "ene."; + // accept the trailing period either way. + $this->assertMatchesRegularExpression('/^ene\.? 7th 2015, 03:05$/', $this->Time->niceShort($time)); setlocale(LC_ALL, $restore); } diff --git a/lib/Cake/Test/Case/Utility/DebuggerTest.php b/lib/Cake/Test/Case/Utility/DebuggerTest.php index 8c632f1..9e966a9 100644 --- a/lib/Cake/Test/Case/Utility/DebuggerTest.php +++ b/lib/Cake/Test/Case/Utility/DebuggerTest.php @@ -199,7 +199,6 @@ public function testOutput() { if (!$this->isPHP8()) { $this->assertStringContainsString('$wrong = ''', $result[3], 'Context should be HTML escaped.'); } - restore_error_handler(); } /** @@ -218,7 +217,6 @@ public function testOutputEncodeDescription() { $this->assertStringNotContainsString('