From dd6cb458f8be1e5edc54a88d2639f65874f817c8 Mon Sep 17 00:00:00 2001 From: Rick Lam Date: Thu, 28 May 2026 21:49:52 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Support=20PHP=207.4=E2=80=938.5=20and=20upg?= =?UTF-8?q?rade=20dev=20tooling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Widen the PHP constraint to 7.4–8.5 and bump the dev toolchain: PHPUnit 9, PHP_CodeSniffer 4, graze/standards 3, Mockery 1.6. - composer.json: php "^7.4 || ^8.0"; phpunit ^9; php_codesniffer ^4; graze/standards ^3; mockery ^1.6; var-dumper "^4.2 || ^5.0". - Tests migrated to PHPUnit 9 APIs: @expectedException annotations converted to expectException(), assertRegExp -> assertMatchesRegularExpression, assertInternalType('array') -> assertIsArray. - phpunit.xml.dist migrated to the v9 schema (coverage/include). - PHP 8 cleanliness: cast strcasecmp() args in Token::eq(); replace ${var} string interpolation in tests; guard ReflectionProperty::setAccessible() behind PHP_VERSION_ID < 80100. - CI matrix now covers PHP 7.4, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5. --prefer-lowest runs on 7.4 only, since the lowest supported runtime deps predate PHP 8. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 9 +- composer.json | 12 +- composer.lock | 885 +++++++++++++++++---------- phpunit.xml.dist | 13 +- src/Parse/Token.php | 2 +- tests/Parse/CollationInfoTest.php | 14 +- tests/Parse/ColumnDefinitionTest.php | 6 +- tests/Parse/CreateDatabaseTest.php | 17 +- tests/Parse/CreateTableTest.php | 2 +- tests/Parse/TableOptionsTest.php | 3 +- tests/Parse/TokenStreamTest.php | 18 +- tests/Parse/TokenTest.php | 18 +- 12 files changed, 635 insertions(+), 364 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28191bd..4c273c7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,8 +12,13 @@ jobs: strategy: fail-fast: false matrix: - php: ['7.4'] - prefer-lowest: ['', '--prefer-lowest'] + php: ['7.4', '8.0', '8.1', '8.2', '8.3', '8.4', '8.5'] + prefer-lowest: [''] + # The lowest supported dependencies (e.g. doctrine/dbal ^2.5) predate + # PHP 8 support, so only exercise --prefer-lowest on the minimum PHP. + include: + - php: '7.4' + prefer-lowest: '--prefer-lowest' steps: - uses: actions/checkout@v4 diff --git a/composer.json b/composer.json index fade82c..3a23100 100644 --- a/composer.json +++ b/composer.json @@ -29,18 +29,18 @@ } ], "require": { - "php": "^7.4", + "php": "^7.4 || ^8.0", "doctrine/dbal": "^2.5", "symfony/console": "^5", "symfony/yaml": "^5" }, "require-dev": { - "graze/standards": "^2.0", - "mockery/mockery": "^1.2", - "phpunit/phpunit": "^8", - "squizlabs/php_codesniffer": "^3.5.0", - "symfony/var-dumper": "^4.2" + "graze/standards": "^3.0", + "mockery/mockery": "^1.6", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^4.0", + "symfony/var-dumper": "^4.2 || ^5.0" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 098bc85..96eaad9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ebf03580b2068861621859d337cd6297", + "content-hash": "cdde474d4a5f11f0ca3b349d4c16d7f2", "packages": [ { "name": "doctrine/cache", @@ -1233,16 +1233,16 @@ }, { "name": "symfony/yaml", - "version": "v5.4.52", + "version": "v5.4.53", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "b0b27055f055f0d314c5c68ed0c10f0bbd90aee0" + "reference": "ae0bbb46f77ff56591d0a0259c7f458f4b3e1f77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/b0b27055f055f0d314c5c68ed0c10f0bbd90aee0", - "reference": "b0b27055f055f0d314c5c68ed0c10f0bbd90aee0", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ae0bbb46f77ff56591d0a0259c7f458f4b3e1f77", + "reference": "ae0bbb46f77ff56591d0a0259c7f458f4b3e1f77", "shasum": "" }, "require": { @@ -1288,7 +1288,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.52" + "source": "https://github.com/symfony/yaml/tree/v5.4.53" }, "funding": [ { @@ -1308,7 +1308,7 @@ "type": "tidelift" } ], - "time": "2026-05-15T06:40:16+00:00" + "time": "2026-05-20T17:13:41+00:00" } ], "packages-dev": [ @@ -1384,20 +1384,23 @@ }, { "name": "graze/standards", - "version": "v2.0.5", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/graze/standards.git", - "reference": "eac7737b0ca12c31d98987c981ce39448dd789c8" + "reference": "df8a5d9f9c2b921610e8337d925afe755b6f92b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/graze/standards/zipball/eac7737b0ca12c31d98987c981ce39448dd789c8", - "reference": "eac7737b0ca12c31d98987c981ce39448dd789c8", + "url": "https://api.github.com/repos/graze/standards/zipball/df8a5d9f9c2b921610e8337d925afe755b6f92b4", + "reference": "df8a5d9f9c2b921610e8337d925afe755b6f92b4", "shasum": "" }, + "require": { + "php": ">=7.2" + }, "require-dev": { - "squizlabs/php_codesniffer": "^3.0" + "squizlabs/php_codesniffer": "^4.0" }, "type": "library", "notification-url": "https://packagist.org/downloads/", @@ -1419,9 +1422,9 @@ ], "support": { "issues": "https://github.com/graze/standards/issues", - "source": "https://github.com/graze/standards/tree/v2.0.5" + "source": "https://github.com/graze/standards/tree/v3.0.0" }, - "time": "2020-08-18T15:43:31+00:00" + "time": "2026-05-28T10:14:05+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -1617,6 +1620,64 @@ ], "time": "2025-08-01T08:46:24+00:00" }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-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/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, { "name": "phar-io/manifest", "version": "2.0.4", @@ -1737,40 +1798,44 @@ }, { "name": "phpunit/php-code-coverage", - "version": "7.0.17", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", - "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-xmlwriter": "*", - "php": ">=7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.3 || ^4.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^8.2.2" + "phpunit/phpunit": "^9.6" }, "suggest": { - "ext-xdebug": "^2.7.2" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.0-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -1798,7 +1863,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.17" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -1806,32 +1872,32 @@ "type": "github" } ], - "time": "2024-03-02T06:09:37+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.6", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "69deeb8664f611f156a924154985fbd4911eb36b" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/69deeb8664f611f156a924154985fbd4911eb36b", - "reference": "69deeb8664f611f156a924154985fbd4911eb36b", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -1858,7 +1924,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.6" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -1866,26 +1932,38 @@ "type": "github" } ], - "time": "2024-03-01T13:39:50+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=5.3.3" + "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/" @@ -1902,41 +1980,47 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "template" + "process" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, - "time": "2015-06-21T13:50:34+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" }, { - "name": "phpunit/php-timer", - "version": "2.1.4", + "name": "phpunit/php-text-template", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a691211e94ff39a34811abd521c31bd5b305b0bb", - "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1955,14 +2039,14 @@ "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "timer" + "template" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.4" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, "funding": [ { @@ -1970,33 +2054,32 @@ "type": "github" } ], - "time": "2024-03-01T13:42:41+00:00" + "time": "2020-10-26T05:33:50+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "4.0.4", + "name": "phpunit/php-timer", + "version": "5.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.3 || ^8.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2011,17 +2094,18 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "tokenizer" + "timer" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, "funding": [ { @@ -2029,25 +2113,24 @@ "type": "github" } ], - "abandoned": true, - "time": "2020-08-04T08:28:15+00:00" + "time": "2020-10-26T13:16:10+00:00" }, { "name": "phpunit/phpunit", - "version": "8.5.52", + "version": "9.6.34", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1015741814413c156abb0f53d7db7bbd03c6e858" + "reference": "b36f02317466907a230d3aa1d34467041271ef4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1015741814413c156abb0f53d7db7bbd03c6e858", - "reference": "1015741814413c156abb0f53d7db7bbd03c6e858", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b36f02317466907a230d3aa1d34467041271ef4a", + "reference": "b36f02317466907a230d3aa1d34467041271ef4a", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.5.0", + "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -2057,25 +2140,27 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=7.2", - "phpunit/php-code-coverage": "^7.0.17", - "phpunit/php-file-iterator": "^2.0.6", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.4", - "sebastian/comparator": "^3.0.7", - "sebastian/diff": "^3.0.6", - "sebastian/environment": "^4.2.5", - "sebastian/exporter": "^3.1.8", - "sebastian/global-state": "^3.0.6", - "sebastian/object-enumerator": "^3.0.5", - "sebastian/resource-operations": "^2.0.3", - "sebastian/type": "^1.1.5", - "sebastian/version": "^2.0.1" + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.10", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.8", + "sebastian/global-state": "^5.0.8", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage", - "phpunit/php-invoker": "To allow enforcing time limits" + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -2083,10 +2168,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "8.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -2112,7 +2200,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.52" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.34" }, "funding": [ { @@ -2136,32 +2224,144 @@ "type": "tidelift" } ], - "time": "2026-01-27T05:20:18+00:00" + "time": "2026-01-27T05:45:00+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "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.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+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": "1.0.3", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54" + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", - "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2183,7 +2383,7 @@ "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/1.0.3" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { @@ -2191,35 +2391,34 @@ "type": "github" } ], - "abandoned": true, - "time": "2024-03-01T13:45:45+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.7", + "version": "4.0.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52" + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52", - "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e4df00b9b3571187db2831ae9aada2c6efbd715d", + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d", "shasum": "" }, "require": { - "php": ">=7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2258,7 +2457,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.7" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.10" }, "funding": [ { @@ -2278,33 +2477,90 @@ "type": "tidelift" } ], - "time": "2026-01-24T09:20:25+00:00" + "time": "2026-01-24T09:22:56+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "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.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", - "version": "3.0.6", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/98ff311ca519c3aa73ccd3de053bdb377171d7b6", - "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2336,7 +2592,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.6" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -2344,27 +2600,27 @@ "type": "github" } ], - "time": "2024-03-02T06:16:36+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", - "version": "4.2.5", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "56932f6049a0482853056ffd617c91ffcc754205" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/56932f6049a0482853056ffd617c91ffcc754205", - "reference": "56932f6049a0482853056ffd617c91ffcc754205", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" @@ -2372,7 +2628,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2399,7 +2655,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.5" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -2407,34 +2663,34 @@ "type": "github" } ], - "time": "2024-03-01T13:49:59+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.8", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296" + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64cfeaa341951ceb2019d7b98232399d57bb2296", - "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c", "shasum": "" }, "require": { - "php": ">=7.2", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2469,14 +2725,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.8" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.8" }, "funding": [ { @@ -2496,30 +2752,30 @@ "type": "tidelift" } ], - "time": "2025-09-24T05:55:14+00:00" + "time": "2025-09-24T06:03:27+00:00" }, { "name": "sebastian/global-state", - "version": "3.0.6", + "version": "5.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046" + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/800689427e3e8cf57a8fe38fcd1d4344c9b2f046", - "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", "shasum": "" }, "require": { - "php": ">=7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" @@ -2527,7 +2783,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2552,7 +2808,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.6" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" }, "funding": [ { @@ -2572,34 +2828,91 @@ "type": "tidelift" } ], - "time": "2025-08-10T05:40:12+00:00" + "time": "2025-08-10T07:10:35+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "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.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.5", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "ac5b293dba925751b808e02923399fb44ff0d541" + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541", - "reference": "ac5b293dba925751b808e02923399fb44ff0d541", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2621,7 +2934,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { @@ -2629,32 +2942,32 @@ "type": "github" } ], - "time": "2024-03-01T13:54:02+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "1d439c229e61f244ff1f211e5c99737f90c67def" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def", - "reference": "1d439c229e61f244ff1f211e5c99737f90c67def", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2676,7 +2989,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { @@ -2684,32 +2997,32 @@ "type": "github" } ], - "time": "2024-03-01T13:56:04+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.3", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a" + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/8fe7e75986a9d24b4cceae847314035df7703a5a", - "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2736,10 +3049,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6" }, "funding": [ { @@ -2759,29 +3072,32 @@ "type": "tidelift" } ], - "time": "2025-08-10T05:25:53+00:00" + "time": "2025-08-10T06:57:39+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/72a7f7674d053d548003b16ff5a106e7e0e06eee", - "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -2802,7 +3118,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -2810,32 +3126,32 @@ "type": "github" } ], - "time": "2024-03-01T13:59:09+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", - "version": "1.1.5", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/18f071c3a29892b037d35e6b20ddf3ea39b42874", - "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.2" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -2858,7 +3174,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/1.1.5" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -2866,29 +3182,29 @@ "type": "github" } ], - "time": "2024-03-01T14:04:07+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2911,32 +3227,38 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, - "time": "2016-10-03T07:35:21+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.13.5", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" + "reference": "0525c73950de35ded110cffafb9892946d7771b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", - "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0525c73950de35ded110cffafb9892946d7771b5", + "reference": "0525c73950de35ded110cffafb9892946d7771b5", "shasum": "" }, "require": { "ext-simplexml": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": ">=5.4.0" + "php": ">=7.2.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + "phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31" }, "bin": [ "bin/phpcbf", @@ -2961,7 +3283,7 @@ "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "description": "PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.", "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", @@ -2992,102 +3314,37 @@ "type": "thanks_dev" } ], - "time": "2025-11-04T16:30:35+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", - "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "metapackage", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "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 backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.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": "2024-09-09T11:45:10+00:00" + "time": "2025-11-10T16:43:36+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.47", + "version": "v5.4.48", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "1069c7a3fca74578022fab6f81643248d02f8e63" + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1069c7a3fca74578022fab6f81643248d02f8e63", - "reference": "1069c7a3fca74578022fab6f81643248d02f8e63", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/42f18f170aa86d612c3559cfb3bd11a375df32c8", + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php72": "~1.5", "symfony/polyfill-php80": "^1.16" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/console": "<3.4" + "symfony/console": "<4.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^1.43|^2.13|^3.0.4" + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", @@ -3130,7 +3387,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v4.4.47" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.48" }, "funding": [ { @@ -3146,7 +3403,7 @@ "type": "tidelift" } ], - "time": "2022-10-03T15:15:11+00:00" + "time": "2024-11-08T15:21:10+00:00" }, { "name": "theseer/tokenizer", @@ -3205,7 +3462,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.4" + "php": "^7.4 || ^8.0" }, "platform-dev": {}, "platform-overrides": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 2f55586..7e0d09d 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,4 +1,7 @@ - + - - + + src/ - - + + diff --git a/src/Parse/Token.php b/src/Parse/Token.php index a796b99..c483df4 100644 --- a/src/Parse/Token.php +++ b/src/Parse/Token.php @@ -105,7 +105,7 @@ public function isEof() public function eq($type, $text) { return ($this->type === $type) - && strcasecmp($this->text, $text) === 0; + && strcasecmp((string) $this->text, (string) $text) === 0; } /** diff --git a/tests/Parse/CollationInfoTest.php b/tests/Parse/CollationInfoTest.php index 4bdbf37..bb58f78 100644 --- a/tests/Parse/CollationInfoTest.php +++ b/tests/Parse/CollationInfoTest.php @@ -59,10 +59,10 @@ public function providerConstructorWithArgs() * @param string $charset * @param string $collation * @dataProvider providerConstructorWithBadArgs - * @expectedException RuntimeException */ public function testConstructorWithBadArgs($charset, $collation) { + $this->expectException(RuntimeException::class); new CollationInfo($charset, $collation); } @@ -106,9 +106,9 @@ public function testIsBinaryCharset() $this->assertFalse((new CollationInfo('utf8', 'utf8_bin'))->isBinaryCharset()); } - /** @expectedException LogicException */ public function testInvalidIsBinaryCharset() { + $this->expectException(LogicException::class); (new CollationInfo())->isBinaryCharset(); } @@ -123,9 +123,9 @@ public function testIsDefaultCollation() $this->assertFalse((new CollationInfo('latin1', 'latin1_general_ci'))->isDefaultCollation()); } - /** @expectedException LogicException */ public function testInvalidSiDefaulfCollation() { + $this->expectException(LogicException::class); (new CollationInfo())->isDefaultCollation(); } @@ -140,15 +140,15 @@ public function testSetCharset() $this->assertSame('utf8', $collation->getCharset()); } - /** @expectedException Exception */ public function testSetCharsetFail() { + $this->expectException(Exception::class); (new CollationInfo('latin1'))->setCharset('utf8'); } - /** @expectedException LogicException */ public function testEmptyCharsetFail() { + $this->expectException(LogicException::class); (new CollationInfo())->getCharset(); } @@ -165,9 +165,9 @@ public function testSetCollation() $this->assertSame('utf8_general_ci', $collation->getCollation()); } - /** @expectedException Exception */ public function testSetCollationFail() { + $this->expectException(Exception::class); (new CollationInfo('latin1'))->setCollation('utf8_general_ci'); } @@ -180,9 +180,9 @@ public function testGetCollation() $this->assertSame('utf8_bin', $collation->getCollation()); } - /** @expectedException LogicException */ public function testEmptyCollationFail() { + $this->expectException(LogicException::class); (new CollationInfo())->getCollation(); } } diff --git a/tests/Parse/ColumnDefinitionTest.php b/tests/Parse/ColumnDefinitionTest.php index a7d34c5..bbb79b1 100644 --- a/tests/Parse/ColumnDefinitionTest.php +++ b/tests/Parse/ColumnDefinitionTest.php @@ -255,10 +255,11 @@ public function parseDatatypesProvider() /** * @param string $text * @dataProvider parseInvalidDatatypesProvider - * @expectedException RuntimeException */ public function testParseInvalidDatatypes($text) { + $this->expectException(RuntimeException::class); + $stream = $this->makeStream($text); $column = new ColumnDefinition(); $column->parse($stream); @@ -318,10 +319,11 @@ public function parseInvalidDatatypesProvider() /** * @param string $text * @dataProvider parseInvalidDefaultValuesProvider - * @expectedException Exception */ public function testParseInvalidDefaultValues($text) { + $this->expectException(Exception::class); + $stream = $this->makeStream($text); $column = new ColumnDefinition(); $column->parse($stream); diff --git a/tests/Parse/CreateDatabaseTest.php b/tests/Parse/CreateDatabaseTest.php index d9c85ef..5a8a952 100644 --- a/tests/Parse/CreateDatabaseTest.php +++ b/tests/Parse/CreateDatabaseTest.php @@ -95,11 +95,10 @@ public function parseCollationProvider() ]; } - /** - * @expectedException RuntimeException - */ public function testBadParse() { + $this->expectException(RuntimeException::class); + $stream = $this->makeStream('foo'); $database = new CreateDatabase(new CollationInfo()); $database->parse($stream); @@ -138,11 +137,10 @@ public function testAddTable() $this->assertArrayHasKey($tableName, $database->tables); } - /** - * @expectedException RuntimeException - */ public function testBadAddTable() { + $this->expectException(RuntimeException::class); + $createTable = new CreateTable(new CollationInfo()); $database = new CreateDatabase(new CollationInfo()); $database->addTable($createTable); @@ -157,7 +155,7 @@ public function testGetDDL(CreateDatabase $database, $sql) { $ddl = $database->getDDL(); - $this->assertInternalType('array', $ddl); + $this->assertIsArray($ddl); $this->assertEquals(1, count($ddl)); $this->assertEquals($sql, $ddl[0]); } @@ -196,11 +194,10 @@ public function testGetDDLProvider() return $testCases; } - /** - * @expectedException RuntimeException - */ public function testBadGetDDL() { + $this->expectException(RuntimeException::class); + $database = new CreateDatabase(new CollationInfo()); $database->getDDL(); } diff --git a/tests/Parse/CreateTableTest.php b/tests/Parse/CreateTableTest.php index accb9a2..a2e3fd9 100644 --- a/tests/Parse/CreateTableTest.php +++ b/tests/Parse/CreateTableTest.php @@ -50,7 +50,7 @@ public function testParse($text, $expected) $this->fail("expected an $expectedExceptionType exception, but none was thrown"); } else { $this->assertInstanceOf($expectedExceptionType, $threw, "wrong exception type thrown"); - $this->assertRegExp("/$expectedMessageRegex/", $e->getMessage(), "wrong exception message"); + $this->assertMatchesRegularExpression("/$expectedMessageRegex/", $e->getMessage(), "wrong exception message"); } } elseif (is_null($threw)) { $ddl = $table->getDDL(); diff --git a/tests/Parse/TableOptionsTest.php b/tests/Parse/TableOptionsTest.php index e1c1b09..f8dafaf 100644 --- a/tests/Parse/TableOptionsTest.php +++ b/tests/Parse/TableOptionsTest.php @@ -121,10 +121,11 @@ public function parseProvider() /** * @dataProvider badParseProvider * @param string $text - * @expectedException RuntimeException */ public function testBadParse($text) { + $this->expectException(RuntimeException::class); + $stream = $this->makeStream($text); $options = new TableOptions(new CollationInfo()); diff --git a/tests/Parse/TokenStreamTest.php b/tests/Parse/TokenStreamTest.php index 939434a..9b8e8c2 100644 --- a/tests/Parse/TokenStreamTest.php +++ b/tests/Parse/TokenStreamTest.php @@ -23,9 +23,9 @@ public function testNewFromFile() $this->assertThat($stream, $this->isInstanceOf(__NAMESPACE__ . '\TokenStream')); } - /** @expectedException Exception */ public function testNewFromFileNotFound() { + $this->expectException(Exception::class); TokenStream::newFromFile(dirname(__FILE__) . "/file_not_found"); } @@ -117,7 +117,7 @@ public function nextTokenProvider() [ "{$bq}{$bq}", Token::IDENTIFIER, ''], [ "{$bq}hello{$bq}", Token::IDENTIFIER, 'hello'], [ "{$bq}hello{$bq}{$bq}world{$bq}", Token::IDENTIFIER, "hello{$bq}world"], // `` => ` - [ "{$bq}hello{$bs}{$bs}world{$bq}", Token::IDENTIFIER, "hello{$bs}${bs}world"], // \\ => \\ + [ "{$bq}hello{$bs}{$bs}world{$bq}", Token::IDENTIFIER, "hello{$bs}{$bs}world"], // \\ => \\ [ "{$bq}hello{$bs}nworld{$bq}", Token::IDENTIFIER, "hello{$bs}nworld"], // \n => \n // hex literals @@ -170,10 +170,11 @@ public function nextTokenProvider() /** * @param string $text * @dataProvider provideBadLogicNextToken - * @expectedException LogicException */ public function testBadLogicNextToken($text) { + $this->expectException(LogicException::class); + $stream = $this->makeStream($text); $stream->nextToken(); } @@ -199,10 +200,11 @@ public function provideBadLogicNextToken() /** * @param string $text * @dataProvider provideBadRuntimeNextToken - * @expectedException RuntimeException */ public function testBadRuntimeNextToken($text) { + $this->expectException(RuntimeException::class); + $stream = $this->makeStream($text); $stream->nextToken(); } @@ -322,9 +324,9 @@ public function testExpectSucc() $stream->expect(Token::IDENTIFIER, 'create'); } - /** @expectedException Exception */ public function testExpectFail() { + $this->expectException(Exception::class); $stream = $this->makeStream('create table t'); $stream->expect(Token::IDENTIFIER, 'drop'); } @@ -445,7 +447,11 @@ public function testContextualise() // Use reflection to set the internal offset to the place where error is. $reflection = new ReflectionClass($stream); $property = $reflection->getProperty('offset'); - $property->setAccessible(true); + if (PHP_VERSION_ID < 80100) { + // setAccessible() is required before PHP 8.1; it became a no-op in 8.1 + // and is deprecated from 8.5 onwards. + $property->setAccessible(true); + } $property->setValue($stream, 32); $message = $stream->contextualise("unknown datatype 'bar'"); diff --git a/tests/Parse/TokenTest.php b/tests/Parse/TokenTest.php index 959386c..f94b68e 100644 --- a/tests/Parse/TokenTest.php +++ b/tests/Parse/TokenTest.php @@ -69,8 +69,8 @@ public function testMakeStringNonEscapes() $unescaped = Token::fromString( "ijk{$bs}a" . "jkl{$bs}f" . - "klm{$bs}${sq}" . - "lmn{$bs}${dq}" . + "klm{$bs}{$sq}" . + "lmn{$bs}{$dq}" . "mno{$bs}?" . "nop{$bs}176" . "opq{$bs}x7e" . @@ -82,8 +82,8 @@ public function testMakeStringNonEscapes() Token::STRING, "ijk" . "a" . "jkl" . "f" . - "klm" . "${sq}" . - "lmn" . "${dq}" . + "klm" . "{$sq}" . + "lmn" . "{$dq}" . "mno" . "?" . "nop" . "176" . "opq" . "x7e" . @@ -98,15 +98,15 @@ public function testMakeStringQuotes() foreach ([ "" => "", - "{$sq}${sq}" => "{$sq}", - "abc{$sq}${sq}" => "abc{$sq}", - "{$sq}${sq}abc" => "{$sq}abc", + "{$sq}{$sq}" => "{$sq}", + "abc{$sq}{$sq}" => "abc{$sq}", + "{$sq}{$sq}abc" => "{$sq}abc", ] as $arg => $result) { $token = Token::fromString($arg, $sq); $this->assertTrue($token->eq(Token::STRING, $result)); } - $token = Token::fromString("{$sq}${sq}", $sq); + $token = Token::fromString("{$sq}{$sq}", $sq); $this->assertTrue($token->eq(Token::STRING, "{$sq}")); } @@ -275,13 +275,13 @@ public function providerAsXyz() /** * @dataProvider providerAsXyzError - * @expectedException Exception * @param string $method * @param string $type * @param string $arg */ public function testAsXyzError($method, $type, $arg) { + $this->expectException(Exception::class); (new Token($type, $arg))->$method(); } From 6db964785db4d2d5cef67bba9b17821d9152132b Mon Sep 17 00:00:00 2001 From: Rick Lam Date: Thu, 28 May 2026 21:59:55 +0100 Subject: [PATCH 2/2] =?UTF-8?q?Update=20README=20for=20PHP=207.4=E2=80=938?= =?UTF-8?q?.5;=20drop=20unused=20badges=20and=20Scrutinizer=20CI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add a Requirements section and note `make test PHP_VER=` for targeting a specific PHP version. - Replace the stale Travis badge with the GitHub Actions CI badge. - Remove the Scrutinizer (coverage/quality), MicroBadger badges and the imgur banner image, which are no longer used. - Drop the dead Scrutinizer coverage upload from CI and disable coverage in setup-php since nothing consumes it. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 13 ++----------- README.md | 8 +------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c273c7..bfdd659 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} - coverage: pcov + coverage: none tools: composer:v2 - name: Get composer cache directory @@ -52,16 +52,7 @@ jobs: run: vendor/bin/phpcs -p --warning-severity=0 src/ tests/ - name: Run phpunit - run: vendor/bin/phpunit --coverage-clover=./tests/report/coverage.clover - - - name: Upload coverage to Scrutinizer - if: matrix.php == '7.4' && matrix.prefer-lowest == '' && github.event_name == 'push' - continue-on-error: true - run: | - if [ -f ./tests/report/coverage.clover ]; then - wget https://scrutinizer-ci.com/ocular.phar - php ocular.phar code-coverage:upload --format=php-clover ./tests/report/coverage.clover - fi + run: vendor/bin/phpunit functional: name: Functional tests diff --git a/README.md b/README.md index f5e0963..2645dd6 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,9 @@ [![Latest Version on Packagist](https://img.shields.io/packagist/v/graze/morphism.svg?style=flat-square)](https://packagist.org/packages/graze/morphism) [![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE.md) -[![Build Status](https://img.shields.io/travis/graze/morphism/master.svg?style=flat-square)](https://travis-ci.org/graze/morphism) -[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/graze/morphism.svg?style=flat-square)](https://scrutinizer-ci.com/g/graze/morphism/code-structure) -[![Quality Score](https://img.shields.io/scrutinizer/g/graze/morphism.svg?style=flat-square)](https://scrutinizer-ci.com/g/graze/morphism) +[![Build Status](https://img.shields.io/github/actions/workflow/status/graze/morphism/ci.yml?branch=master&style=flat-square)](https://github.com/graze/morphism/actions/workflows/ci.yml) [![Total Downloads](https://img.shields.io/packagist/dt/graze/morphism.svg?style=flat-square)](https://packagist.org/packages/graze/morphism) [![PHP Version](https://img.shields.io/packagist/php-v/graze/morphism.svg?style=flat-square)](https://php.net) -[![MicroBadger Size](https://img.shields.io/microbadger/image-size/graze/morphism.svg?style=flat-square)](https://microbadger.com/images/graze/morphism) - -Morph and Chas This package provides a set of tools for parsing, extracting, and diffing mysqldump files. @@ -192,7 +187,6 @@ CREATE TABLE `product_dimensions` ( $ make test ``` - ## Security If you discover any security related issues, please email security@graze.com instead of using the issue tracker.