From dec84fa0713f5968845279ee47e06f5188878b9b Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 13:15:22 -0700 Subject: [PATCH 01/25] update phpunit tests so they run correctly --- tests/NormalizerTest.php | 50 ++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/tests/NormalizerTest.php b/tests/NormalizerTest.php index 7e00f02..4a9bfcf 100644 --- a/tests/NormalizerTest.php +++ b/tests/NormalizerTest.php @@ -45,9 +45,14 @@ public function testReturnsFalseOnBadFivePartStrict() $this->assertFalse($address); } - public function normalizesAddressesDataProvider() + /** + * @test + */ + public function testNormalizesAddresses() { - return [ + $normalizer = new Normalizer(); + + $addresses = [ [ '1234 Main St. SE, Minneapolis, MN 55401', '1234 Main Street Southeast, Minneapolis, MN 55401' @@ -61,41 +66,32 @@ public function normalizesAddressesDataProvider() '1234 Main St southeast, Minneapolis, Minnesota 55401' ], ]; + + foreach ($addresses as $address) { + $this->assertEquals( + (string)$normalizer->parse($address[0]), + (string)$normalizer->parse($address[1]) + ); + } } /** * @test - * @dataProvider normalizesAddressesDataProvider */ - public function testNormalizesAddresses($firstAddress, $secondAddress) + public function testFailsOnBadAddresses() { $normalizer = new Normalizer(); - $this->assertEquals( - (string)$normalizer->parse($firstAddress), - (string)$normalizer->parse($secondAddress) - ); - } - - public function badAddressesDataProvider() - { - return [ - 'double unit no commas' => ['1234 Main St. SE Unit 101 Unit 101'], - 'double unit mismatch comma' => ['1234 Main St. SE, Unit 101 Apt 101, Minneapolis, MN 55555'], - 'double unit comma' => ['3333 West End Ave, Unit 301 Unit 301, Nashville, TN, 37205'], - 'nonsense' => ['Main Street West Fork Soup Salad'], + $addresses = [ + 'double unit no commas' => '1234 Main St. SE Unit 101 Unit 101', + 'double unit mismatch comma' => '1234 Main St. SE, Unit 101 Apt 101, Minneapolis, MN 55555', + 'double unit comma' => '3333 West End Ave, Unit 301 Unit 301, Nashville, TN, 37205', + 'nonsense' => 'Main Street West Fork Soup Salad', ]; - } - - /** - * @test - * @dataProvider badAddressesDataProvider - */ - public function testFailsOnBadAddresses($badAddress) - { - $normalizer = new Normalizer(); - $this->assertFalse($normalizer->parse($badAddress)); + foreach ($addresses as $address) { + $this->assertFalse($normalizer->parse($address)); + } } /** @test */ From 7222fd282441490797e7c40420b44c58e9a2bc61 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 19:21:04 -0700 Subject: [PATCH 02/25] migrate outdated XML configuration --- phpunit.xml | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/phpunit.xml b/phpunit.xml index 5dff6a6..d6c74fa 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,18 +1,8 @@ - - - - ./tests - - + + + + ./tests + + From 299497c9438a5d7ed14743c3ceaeb2839d36dbc6 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 19:21:32 -0700 Subject: [PATCH 03/25] ignore phpunit cache directory --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d599431..b11339c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .idea/* .DS_Store /nbproject/ +.phpunit.cache .phpunit.result.cache -vendor \ No newline at end of file +vendor From ac98229bde27acbd7b45a6643880c7e15cb0ccd6 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 19:23:52 -0700 Subject: [PATCH 04/25] update to latest version of PHPUnit --- composer.json | 2 +- composer.lock | 1939 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1940 insertions(+), 1 deletion(-) create mode 100644 composer.lock diff --git a/composer.json b/composer.json index 117d2a0..4d3126e 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "php": ">=8.0" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^13" }, "scripts": { "test": "phpunit" diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..607ec81 --- /dev/null +++ b/composer.lock @@ -0,0 +1,1939 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "007f4b979c6f519111fd548203d7e155", + "packages": [], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.14.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2026-08-11T10:17:44+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.9.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def", + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def", + "shasum": "" + }, + "require": { + "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.9.0" + }, + "time": "2026-09-13T18:51:52+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "14.3.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "f8640c238e930b914d0098a1edbad6652e61a64a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f8640c238e930b914d0098a1edbad6652e61a64a", + "reference": "f8640c238e930b914d0098a1edbad6652e61a64a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.8.0", + "php": ">=8.4", + "phpunit/php-text-template": "^6.0", + "sebastian/complexity": "^6.0", + "sebastian/environment": "^9.3.2", + "sebastian/git-state": "^1.0", + "sebastian/lines-of-code": "^5.0.2", + "sebastian/version": "^7.0", + "theseer/tokenizer": "^2.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.3" + }, + "suggest": { + "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-main": "14.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.3.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/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2026-09-10T13:08:32+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/9bb4e6c58b62c1e043be995c66abec7c97307aae", + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/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/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-08-25T14:47:43+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^13.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/7.0.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/phpunit/php-invoker", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:34:47+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a47af19f93f76aa3368303d752aa5272ca3299f4", + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.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/phpunit/php-text-template", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:36:37+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "9.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a0e12065831f6ab0d83120dc61513eb8d9a966f6", + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/9.0.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/phpunit/php-timer", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:37:53+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "13.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "d19d90cf860efb7e4d96cee8243e06a248578085" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d19d90cf860efb7e4d96cee8243e06a248578085", + "reference": "d19d90cf860efb7e4d96cee8243e06a248578085", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-filter": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.14.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.4.1", + "phpunit/php-code-coverage": "^14.3.3", + "phpunit/php-file-iterator": "^7.0.2", + "phpunit/php-invoker": "^7.0.0", + "phpunit/php-text-template": "^6.0.0", + "phpunit/php-timer": "^9.0.0", + "sebastian/cli-parser": "^5.0.1", + "sebastian/comparator": "^8.4", + "sebastian/diff": "^9.0.1", + "sebastian/environment": "^9.3.2", + "sebastian/exporter": "^8.2.1", + "sebastian/file-filter": "^1.0", + "sebastian/git-state": "^1.0", + "sebastian/global-state": "^9.0.1", + "sebastian/object-enumerator": "^8.1.0", + "sebastian/recursion-context": "^8.0.1", + "sebastian/type": "^7.0.2", + "sebastian/version": "^7.0.0", + "staabm/side-effects-detector": "^1.0.5" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "13.3-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.3.4" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsoring.html", + "type": "other" + } + ], + "time": "2026-09-15T07:37:05+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/eeb759ad3146b7096fb59c3195d39e071cd409e3", + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.2.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "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/5.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/cli-parser", + "type": "tidelift" + } + ], + "time": "2026-08-01T04:27:14+00:00" + }, + { + "name": "sebastian/comparator", + "version": "8.4.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/3b070e608146cba00fd6fd1f0ffba89e5a8897fb", + "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.4", + "sebastian/diff": "^9.0", + "sebastian/exporter": "^8.2" + }, + "require-dev": { + "phpunit/phpunit": "^13.3" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/8.4.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/comparator", + "type": "tidelift" + } + ], + "time": "2026-08-07T07:23:13+00:00" + }, + { + "name": "sebastian/complexity", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "c5651c795c98093480df79350cb050813fc7a2f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c5651c795c98093480df79350cb050813fc7a2f3", + "reference": "c5651c795c98093480df79350cb050813fc7a2f3", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/6.0.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/complexity", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:41:32+00:00" + }, + { + "name": "sebastian/diff", + "version": "9.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2df6626c1baf31d5a88674882a3072f151b5a26", + "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.1", + "symfony/process": "^7.4.17" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/9.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/diff", + "type": "tidelift" + } + ], + "time": "2026-08-25T15:38:55+00:00" + }, + { + "name": "sebastian/environment", + "version": "9.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", + "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.1.11" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/9.3.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/environment", + "type": "tidelift" + } + ], + "time": "2026-05-25T13:41:38+00:00" + }, + { + "name": "sebastian/exporter", + "version": "8.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/24a3b69bba4a12ab615fca9d34680c5598d9ab7a", + "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.4", + "sebastian/recursion-context": "^8.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^13.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/8.2.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/exporter", + "type": "tidelift" + } + ], + "time": "2026-08-07T07:22:06+00:00" + }, + { + "name": "sebastian/file-filter", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/file-filter.git", + "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/file-filter/zipball/33a26f394330f6faa7684bb9cc73afb7727aae93", + "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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 filtering files", + "homepage": "https://github.com/sebastianbergmann/file-filter", + "support": { + "issues": "https://github.com/sebastianbergmann/file-filter/issues", + "security": "https://github.com/sebastianbergmann/file-filter/security/policy", + "source": "https://github.com/sebastianbergmann/file-filter/tree/1.0.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/file-filter", + "type": "tidelift" + } + ], + "time": "2026-04-22T07:20:04+00:00" + }, + { + "name": "sebastian/git-state", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/git-state.git", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/git-state/zipball/792a952e0eba55b6960a48aeceb9f371aad1f76b", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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 describing the state of a Git checkout", + "homepage": "https://github.com/sebastianbergmann/git-state", + "support": { + "issues": "https://github.com/sebastianbergmann/git-state/issues", + "security": "https://github.com/sebastianbergmann/git-state/security/policy", + "source": "https://github.com/sebastianbergmann/git-state/tree/1.0.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/git-state", + "type": "tidelift" + } + ], + "time": "2026-03-21T12:54:28+00:00" + }, + { + "name": "sebastian/global-state", + "version": "9.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", + "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "sebastian/object-reflector": "^6.0", + "sebastian/recursion-context": "^8.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^13.1.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "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/9.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/global-state", + "type": "tidelift" + } + ], + "time": "2026-06-01T15:11:33+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.8.0", + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "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", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.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/lines-of-code", + "type": "tidelift" + } + ], + "time": "2026-07-09T08:42:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "8.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/511064ecde82bd747e2ba2fab3dda8d977b59576", + "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "sebastian/recursion-context": "^8.0.1" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/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/object-enumerator", + "type": "tidelift" + } + ], + "time": "2026-08-13T07:05:05+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "f71bbcdc4f95456b4622810bec64eb06372e25b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/f71bbcdc4f95456b4622810bec64eb06372e25b2", + "reference": "f71bbcdc4f95456b4622810bec64eb06372e25b2", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/6.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/object-reflector", + "type": "tidelift" + } + ], + "time": "2026-08-13T06:34:36+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "8.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.2.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.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": "2026-08-03T05:58:12+00:00" + }, + { + "name": "sebastian/type", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "bd1df467864cb95140414059a535b2d906173fcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/bd1df467864cb95140414059a535b2d906173fcf", + "reference": "bd1df467864cb95140414059a535b2d906173fcf", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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 types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/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/type", + "type": "tidelift" + } + ], + "time": "2026-08-10T08:00:57+00:00" + }, + { + "name": "sebastian/version", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ad37a5552c8e2b88572249fdc19b6da7792e021b", + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/7.0.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/version", + "type": "tidelift" + } + ], + "time": "2026-02-06T04:52:52+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": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^8.1" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-12-08T11:19:18+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.0" + }, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} From 54529fa752c2b8eed2a46ae12ce874676203f343 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 19:24:21 -0700 Subject: [PATCH 05/25] fix Unit regex to handle multi-word Places --- src/Normalizer.php | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Normalizer.php b/src/Normalizer.php index 85e29e4..588eeba 100644 --- a/src/Normalizer.php +++ b/src/Normalizer.php @@ -143,7 +143,29 @@ private function setupRegularExpressions() $this->zip_regexp = '(\d{5})(?:-?(\d{4})?)'; $this->corner_regexp = '(?:\band\b|\bat\b|&|\@)'; - $this->unit_regexp = '(?:(su?i?te|p\W*[om]\W*b(?:ox)?|dept|apt|apartment|ro*m|fl|unit|box)\W+|\#\W*|)([\w-]+)'; + + /* + * Unit pattern. A 'unit' is an apartment, suite, etc. + * + * There are two capture groups: the unit prefix and the unit value. + * + * The unit prefix can be: + * 1. A word from a set of acceptable words (e.g., 'Apt' or 'Apartment' + * or 'Ste') followed by whitespace or punctuation. + * 2. A pound sign (#) followed by whitespace or punctuation. + * 3. Missing (no prefix), but only if the unit value contains a number. + * + * The requirement for a number in the unit value allows us to detect + * the end of the street address and the beginning of the Place (City) + * when the user doesn't add commas between address segments or when the + * Place is a multi-word name like 'Los Angeles.' + */ + $this->unit_regexp = '(?:' + . '(su?i?te|p\W*[om]\W*b(?:ox)?|dept|apt|apartment|ro*m|fl|unit|box)\W+' + . '|\#\W*' + . '|(?=[\w-]*\d)' + . ')([\w-]+)'; + $this->street_regexp = '(?:' . '(?:(' . $this->direct_regexp . ')\W+' From 14f554c9b1afac5117e23bee2d3d18a6dfa72fcc Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 19:28:40 -0700 Subject: [PATCH 06/25] write tests to support Unit regex updates --- tests/NormalizerTest.php | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/NormalizerTest.php b/tests/NormalizerTest.php index 4a9bfcf..8a2df93 100644 --- a/tests/NormalizerTest.php +++ b/tests/NormalizerTest.php @@ -137,4 +137,48 @@ public function testHandlesAddressWithoutUnitPrefix() ); } } + + /** @test */ + public function testHandlesAddressWithMultiWordCity() + { + $normalizer = new Normalizer(); + + $addresses = [ + 'Two-word city' => [ + 'test' => '123 Main Street, Los Angeles, CA 90012', + 'expected_result' => '123 Main St, Los Angeles, CA 90012', + ], + 'Three-word city' => [ + 'test' => '123 Main Street, San Luis Obispo, CA 93405', + 'expected_result' => '123 Main St, San Luis Obispo, CA 93405', + ], + 'Multi-word city; without commas' => [ + 'test' => '123 Main Street Los Angeles CA 90012', + 'expected_result' => '123 Main St, Los Angeles, CA 90012', + ], + 'Multi-word city; with unit prefix' => [ + 'test' => '123 Main Street Apt 14A, Los Angeles, CA 90012', + 'expected_result' => '123 Main St Apt 14A, Los Angeles, CA 90012', + ], + 'Multi-word city; without unit prefix' => [ + 'test' => '123 Main Street 1A, Los Angeles, CA 90012', + 'expected_result' => '123 Main St #1A, Los Angeles, CA 90012', + ], + 'Multi-word city; with unit prefix; without commas' => [ + 'test' => '123 Main Street Apt 14, Los Angeles, CA 90012', + 'expected_result' => '123 Main St Apt 14, Los Angeles, CA 90012', + ], + 'Multi-word city; without unit prefix; without commas' => [ + 'test' => '123 Main Street 1A Los Angeles CA 90012', + 'expected_result' => '123 Main St #1A, Los Angeles, CA 90012', + ], + ]; + + foreach ($addresses as $address) { + $this->assertEquals( + $address['expected_result'], + (string)$normalizer->parse($address['test']) + ); + } + } } From f95013bcb70b807df0ee32686781b9178be6bfba Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 19:40:54 -0700 Subject: [PATCH 07/25] fix erroneous usage of 'Place' instead of 'City' --- src/Normalizer.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Normalizer.php b/src/Normalizer.php index 588eeba..0fda675 100644 --- a/src/Normalizer.php +++ b/src/Normalizer.php @@ -156,9 +156,9 @@ private function setupRegularExpressions() * 3. Missing (no prefix), but only if the unit value contains a number. * * The requirement for a number in the unit value allows us to detect - * the end of the street address and the beginning of the Place (City) - * when the user doesn't add commas between address segments or when the - * Place is a multi-word name like 'Los Angeles.' + * the end of the street address and the beginning of the City when the + * user doesn't add commas between address segments or when the City is + * a multi-word name like 'Los Angeles.' */ $this->unit_regexp = '(?:' . '(su?i?te|p\W*[om]\W*b(?:ox)?|dept|apt|apartment|ro*m|fl|unit|box)\W+' From dc82658a503912bd6e08765b153a2749dadb08fb Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 20:09:53 -0700 Subject: [PATCH 08/25] add tests for when the Unit has a number and not --- tests/NormalizerTest.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/NormalizerTest.php b/tests/NormalizerTest.php index 8a2df93..fc77a96 100644 --- a/tests/NormalizerTest.php +++ b/tests/NormalizerTest.php @@ -172,6 +172,14 @@ public function testHandlesAddressWithMultiWordCity() 'test' => '123 Main Street 1A Los Angeles CA 90012', 'expected_result' => '123 Main St #1A, Los Angeles, CA 90012', ], + 'Multi-word city; without unit prefix; unit is only a number; without commas' => [ + 'test' => '123 Main Street 1 Los Angeles CA 90012', + 'expected_result' => '123 Main St #1, Los Angeles, CA 90012', + ], + 'Multi-word city; without unit prefix; unit is only a letter; without commas' => [ + 'test' => '123 Main Street A Los Angeles CA 90012', + 'expected_result' => '123 Main St, A Los Angeles, CA 90012', + ], ]; foreach ($addresses as $address) { From 2d70080b2563efd1651608df707ee348f1a7ea4b Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 20:15:05 -0700 Subject: [PATCH 09/25] expand test to cover and explain edge cases --- tests/NormalizerTest.php | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/NormalizerTest.php b/tests/NormalizerTest.php index fc77a96..d3e3e22 100644 --- a/tests/NormalizerTest.php +++ b/tests/NormalizerTest.php @@ -144,23 +144,23 @@ public function testHandlesAddressWithMultiWordCity() $normalizer = new Normalizer(); $addresses = [ - 'Two-word city' => [ + 'Two-word city; without unit; with commas' => [ 'test' => '123 Main Street, Los Angeles, CA 90012', 'expected_result' => '123 Main St, Los Angeles, CA 90012', ], - 'Three-word city' => [ + 'Three-word city; without unit; with commas' => [ 'test' => '123 Main Street, San Luis Obispo, CA 93405', 'expected_result' => '123 Main St, San Luis Obispo, CA 93405', ], - 'Multi-word city; without commas' => [ + 'Multi-word city; without unit; without commas' => [ 'test' => '123 Main Street Los Angeles CA 90012', 'expected_result' => '123 Main St, Los Angeles, CA 90012', ], - 'Multi-word city; with unit prefix' => [ + 'Multi-word city; with unit prefix; with commas' => [ 'test' => '123 Main Street Apt 14A, Los Angeles, CA 90012', 'expected_result' => '123 Main St Apt 14A, Los Angeles, CA 90012', ], - 'Multi-word city; without unit prefix' => [ + 'Multi-word city; without unit prefix; with commas' => [ 'test' => '123 Main Street 1A, Los Angeles, CA 90012', 'expected_result' => '123 Main St #1A, Los Angeles, CA 90012', ], @@ -176,6 +176,18 @@ public function testHandlesAddressWithMultiWordCity() 'test' => '123 Main Street 1 Los Angeles CA 90012', 'expected_result' => '123 Main St #1, Los Angeles, CA 90012', ], + + // This is an edge case where we can't tell whether the 'A' is part + // of the Street name or a Unit. Since there's a comma, we assume + // it's part of the Street. + 'Multi-word city; without unit prefix; unit is only a letter; with commas' => [ + 'test' => '123 Main Street A, Los Angeles, CA 90012', + 'expected_result' => '123 Main Street A, Los Angeles, CA 90012', + ], + + // This is an edge case where we can't tell whether the 'A' is part + // of the Street or the City. Since there's no comma and we've + // found 'Street,' we assume it's part of the City. 'Multi-word city; without unit prefix; unit is only a letter; without commas' => [ 'test' => '123 Main Street A Los Angeles CA 90012', 'expected_result' => '123 Main St, A Los Angeles, CA 90012', From 4d20ab182424b82658d1679720c79ecce88e14d6 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Sun, 20 Sep 2026 20:16:48 -0700 Subject: [PATCH 10/25] consistent capitalization --- src/Normalizer.php | 4 ++-- tests/NormalizerTest.php | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Normalizer.php b/src/Normalizer.php index 0fda675..e775efa 100644 --- a/src/Normalizer.php +++ b/src/Normalizer.php @@ -156,8 +156,8 @@ private function setupRegularExpressions() * 3. Missing (no prefix), but only if the unit value contains a number. * * The requirement for a number in the unit value allows us to detect - * the end of the street address and the beginning of the City when the - * user doesn't add commas between address segments or when the City is + * the end of the street address and the beginning of the city when the + * user doesn't add commas between address segments or when the city is * a multi-word name like 'Los Angeles.' */ $this->unit_regexp = '(?:' diff --git a/tests/NormalizerTest.php b/tests/NormalizerTest.php index d3e3e22..dd007a7 100644 --- a/tests/NormalizerTest.php +++ b/tests/NormalizerTest.php @@ -178,16 +178,16 @@ public function testHandlesAddressWithMultiWordCity() ], // This is an edge case where we can't tell whether the 'A' is part - // of the Street name or a Unit. Since there's a comma, we assume - // it's part of the Street. + // of the street name or a unit. Since there's a comma, we assume + // it's part of the street. 'Multi-word city; without unit prefix; unit is only a letter; with commas' => [ 'test' => '123 Main Street A, Los Angeles, CA 90012', 'expected_result' => '123 Main Street A, Los Angeles, CA 90012', ], // This is an edge case where we can't tell whether the 'A' is part - // of the Street or the City. Since there's no comma and we've - // found 'Street,' we assume it's part of the City. + // of the street or the city. Since there's no comma and we've + // found 'street,' we assume it's part of the city. 'Multi-word city; without unit prefix; unit is only a letter; without commas' => [ 'test' => '123 Main Street A Los Angeles CA 90012', 'expected_result' => '123 Main St, A Los Angeles, CA 90012', From 890831d4b63f40baaf30ff8bb4da68ed235c91d3 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 09:19:55 -0700 Subject: [PATCH 11/25] use DataProviders for PHPUnit tests --- tests/NormalizerTest.php | 106 ++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 51 deletions(-) diff --git a/tests/NormalizerTest.php b/tests/NormalizerTest.php index dd007a7..8bc9a2e 100644 --- a/tests/NormalizerTest.php +++ b/tests/NormalizerTest.php @@ -3,6 +3,7 @@ namespace Tests; use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\Attributes\DataProvider; use ZeroDaHero\Normalizer; use ZeroDaHero\Address; use ZeroDaHero\SimpleAddress; @@ -45,61 +46,58 @@ public function testReturnsFalseOnBadFivePartStrict() $this->assertFalse($address); } - /** - * @test - */ - public function testNormalizesAddresses() - { - $normalizer = new Normalizer(); - - $addresses = [ + public static function normalizesAddressesDataProvider() { + return [ [ - '1234 Main St. SE, Minneapolis, MN 55401', - '1234 Main Street Southeast, Minneapolis, MN 55401' + '1234 Main Street Southeast, Minneapolis, MN 55401', + '1234 Main St. SE, Minneapolis, MN 55401' ], [ - '1234 Main St. SE, Minneapolis, MN 55401', - '1234 Main St SE, Minneapolis, Minnesota 55401' + '1234 Main St SE, Minneapolis, Minnesota 55401', + '1234 Main St. SE, Minneapolis, MN 55401' ], [ - '1234 Main St. SE, Minneapolis, MN 55401', - '1234 Main St southeast, Minneapolis, Minnesota 55401' + '1234 Main St southeast, Minneapolis, Minnesota 55401', + '1234 Main St. SE, Minneapolis, MN 55401' ], ]; - - foreach ($addresses as $address) { - $this->assertEquals( - (string)$normalizer->parse($address[0]), - (string)$normalizer->parse($address[1]) - ); - } } - /** - * @test - */ - public function testFailsOnBadAddresses() + #[DataProvider('normalizesAddressesDataProvider')] + public function testNormalizesAddresses($test, $expected_result) { $normalizer = new Normalizer(); - $addresses = [ - 'double unit no commas' => '1234 Main St. SE Unit 101 Unit 101', - 'double unit mismatch comma' => '1234 Main St. SE, Unit 101 Apt 101, Minneapolis, MN 55555', - 'double unit comma' => '3333 West End Ave, Unit 301 Unit 301, Nashville, TN, 37205', - 'nonsense' => 'Main Street West Fork Soup Salad', - ]; + $this->assertEquals( + (string)$normalizer->parse($expected_result), + (string)$normalizer->parse($test) + ); + } - foreach ($addresses as $address) { - $this->assertFalse($normalizer->parse($address)); - } + public static function badAddressesDataProvider() { + return [ + // double unit no commas + [ '1234 Main St. SE Unit 101 Unit 101' ], + // double unit mismatch comma + [ '1234 Main St. SE, Unit 101 Apt 101, Minneapolis, MN 55555' ], + // double unit comma + [ '3333 West End Ave, Unit 301 Unit 301, Nashville, TN, 37205' ], + // nonsense + [ 'Main Street West Fork Soup Salad' ], + ]; } /** @test */ - public function testHandlesAddressWithoutUnitPrefix() + #[DataProvider('badAddressesDataProvider')] + public function testFailsOnBadAddresses($address) { $normalizer = new Normalizer(); - $addresses = [ + $this->assertFalse($normalizer->parse($address)); + } + + public static function addressesWithoutUnitPrefixDataProvider() { + return [ [ // Test without unit prefix 'test' => '1234 W Main Avenue 1W, Chicago, IL, 60647', 'expected_result' => '1234 W Main Ave #1W, Chicago, IL 60647' @@ -129,21 +127,22 @@ public function testHandlesAddressWithoutUnitPrefix() 'expected_result' => '1234 W Main St, Chicago, IL 60647' ], ]; - - foreach ($addresses as $address) { - $this->assertEquals( - $address['expected_result'], - (string)$normalizer->parse($address['test']) - ); - } } /** @test */ - public function testHandlesAddressWithMultiWordCity() + #[DataProvider('addressesWithoutUnitPrefixDataProvider')] + public function testHandlesAddressWithoutUnitPrefix($test, $expected_result) { $normalizer = new Normalizer(); - $addresses = [ + $this->assertEquals( + $expected_result, + (string)$normalizer->parse($test) + ); + } + + public static function addressesWithMultiWordCityDataProvider() { + return [ 'Two-word city; without unit; with commas' => [ 'test' => '123 Main Street, Los Angeles, CA 90012', 'expected_result' => '123 Main St, Los Angeles, CA 90012', @@ -193,12 +192,17 @@ public function testHandlesAddressWithMultiWordCity() 'expected_result' => '123 Main St, A Los Angeles, CA 90012', ], ]; + } + + /** @test */ + #[DataProvider('addressesWithMultiWordCityDataProvider')] + public function testHandlesAddressWithMultiWordCity($test, $expected_result) + { + $normalizer = new Normalizer(); - foreach ($addresses as $address) { - $this->assertEquals( - $address['expected_result'], - (string)$normalizer->parse($address['test']) - ); - } + $this->assertEquals( + $expected_result, + (string)$normalizer->parse($test) + ); } } From ad88d43e0d5d734a36fce7f6e96d3f0e1e84fcb5 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 09:19:55 -0700 Subject: [PATCH 12/25] remove and ignore composer.lock file --- .gitignore | 5 +- composer.lock | 1939 ------------------------------------------------- 2 files changed, 3 insertions(+), 1941 deletions(-) delete mode 100644 composer.lock diff --git a/.gitignore b/.gitignore index b11339c..8c302ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ -.idea/* .DS_Store -/nbproject/ +.idea/* .phpunit.cache .phpunit.result.cache +/nbproject/ +composer.lock vendor diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 607ec81..0000000 --- a/composer.lock +++ /dev/null @@ -1,1939 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "007f4b979c6f519111fd548203d7e155", - "packages": [], - "packages-dev": [ - { - "name": "myclabs/deep-copy", - "version": "1.14.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", - "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - } - ], - "time": "2026-08-11T10:17:44+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v5.9.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def", - "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def", - "shasum": "" - }, - "require": { - "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.9.0" - }, - "time": "2026-09-13T18:51:52+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "14.3.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f8640c238e930b914d0098a1edbad6652e61a64a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f8640c238e930b914d0098a1edbad6652e61a64a", - "reference": "f8640c238e930b914d0098a1edbad6652e61a64a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^5.8.0", - "php": ">=8.4", - "phpunit/php-text-template": "^6.0", - "sebastian/complexity": "^6.0", - "sebastian/environment": "^9.3.2", - "sebastian/git-state": "^1.0", - "sebastian/lines-of-code": "^5.0.2", - "sebastian/version": "^7.0", - "theseer/tokenizer": "^2.0.1" - }, - "require-dev": { - "phpunit/phpunit": "^13.3.3" - }, - "suggest": { - "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-main": "14.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.3.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/phpunit/php-code-coverage", - "type": "tidelift" - } - ], - "time": "2026-09-10T13:08:32+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "7.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/9bb4e6c58b62c1e043be995c66abec7c97307aae", - "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.3.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/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/phpunit/php-file-iterator", - "type": "tidelift" - } - ], - "time": "2026-08-25T14:47:43+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "7.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", - "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^13.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.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": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/7.0.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/phpunit/php-invoker", - "type": "tidelift" - } - ], - "time": "2026-02-06T04:34:47+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "6.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a47af19f93f76aa3368303d752aa5272ca3299f4", - "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.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/phpunit/php-text-template", - "type": "tidelift" - } - ], - "time": "2026-02-06T04:36:37+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "9.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a0e12065831f6ab0d83120dc61513eb8d9a966f6", - "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "9.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/9.0.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/phpunit/php-timer", - "type": "tidelift" - } - ], - "time": "2026-02-06T04:37:53+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "13.3.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d19d90cf860efb7e4d96cee8243e06a248578085" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d19d90cf860efb7e4d96cee8243e06a248578085", - "reference": "d19d90cf860efb7e4d96cee8243e06a248578085", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-filter": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.14.0", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.4.1", - "phpunit/php-code-coverage": "^14.3.3", - "phpunit/php-file-iterator": "^7.0.2", - "phpunit/php-invoker": "^7.0.0", - "phpunit/php-text-template": "^6.0.0", - "phpunit/php-timer": "^9.0.0", - "sebastian/cli-parser": "^5.0.1", - "sebastian/comparator": "^8.4", - "sebastian/diff": "^9.0.1", - "sebastian/environment": "^9.3.2", - "sebastian/exporter": "^8.2.1", - "sebastian/file-filter": "^1.0", - "sebastian/git-state": "^1.0", - "sebastian/global-state": "^9.0.1", - "sebastian/object-enumerator": "^8.1.0", - "sebastian/recursion-context": "^8.0.1", - "sebastian/type": "^7.0.2", - "sebastian/version": "^7.0.0", - "staabm/side-effects-detector": "^1.0.5" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "13.3-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/13.3.4" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsoring.html", - "type": "other" - } - ], - "time": "2026-09-15T07:37:05+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "5.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/eeb759ad3146b7096fb59c3195d39e071cd409e3", - "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.2.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "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/5.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/cli-parser", - "type": "tidelift" - } - ], - "time": "2026-08-01T04:27:14+00:00" - }, - { - "name": "sebastian/comparator", - "version": "8.4.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/3b070e608146cba00fd6fd1f0ffba89e5a8897fb", - "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.4", - "sebastian/diff": "^9.0", - "sebastian/exporter": "^8.2" - }, - "require-dev": { - "phpunit/phpunit": "^13.3" - }, - "suggest": { - "ext-bcmath": "For comparing BcMath\\Number objects" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "8.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/8.4.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/comparator", - "type": "tidelift" - } - ], - "time": "2026-08-07T07:23:13+00:00" - }, - { - "name": "sebastian/complexity", - "version": "6.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "c5651c795c98093480df79350cb050813fc7a2f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c5651c795c98093480df79350cb050813fc7a2f3", - "reference": "c5651c795c98093480df79350cb050813fc7a2f3", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.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", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/6.0.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/complexity", - "type": "tidelift" - } - ], - "time": "2026-02-06T04:41:32+00:00" - }, - { - "name": "sebastian/diff", - "version": "9.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2df6626c1baf31d5a88674882a3072f151b5a26", - "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.3.1", - "symfony/process": "^7.4.17" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "9.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/9.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/diff", - "type": "tidelift" - } - ], - "time": "2026-08-25T15:38:55+00:00" - }, - { - "name": "sebastian/environment", - "version": "9.3.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", - "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.1.11" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "9.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/9.3.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/environment", - "type": "tidelift" - } - ], - "time": "2026-05-25T13:41:38+00:00" - }, - { - "name": "sebastian/exporter", - "version": "8.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/24a3b69bba4a12ab615fca9d34680c5598d9ab7a", - "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.4", - "sebastian/recursion-context": "^8.0.1" - }, - "require-dev": { - "phpunit/phpunit": "^13.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "8.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/8.2.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/exporter", - "type": "tidelift" - } - ], - "time": "2026-08-07T07:22:06+00:00" - }, - { - "name": "sebastian/file-filter", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/file-filter.git", - "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/file-filter/zipball/33a26f394330f6faa7684bb9cc73afb7727aae93", - "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "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 filtering files", - "homepage": "https://github.com/sebastianbergmann/file-filter", - "support": { - "issues": "https://github.com/sebastianbergmann/file-filter/issues", - "security": "https://github.com/sebastianbergmann/file-filter/security/policy", - "source": "https://github.com/sebastianbergmann/file-filter/tree/1.0.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/file-filter", - "type": "tidelift" - } - ], - "time": "2026-04-22T07:20:04+00:00" - }, - { - "name": "sebastian/git-state", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/git-state.git", - "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/git-state/zipball/792a952e0eba55b6960a48aeceb9f371aad1f76b", - "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "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 describing the state of a Git checkout", - "homepage": "https://github.com/sebastianbergmann/git-state", - "support": { - "issues": "https://github.com/sebastianbergmann/git-state/issues", - "security": "https://github.com/sebastianbergmann/git-state/security/policy", - "source": "https://github.com/sebastianbergmann/git-state/tree/1.0.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/git-state", - "type": "tidelift" - } - ], - "time": "2026-03-21T12:54:28+00:00" - }, - { - "name": "sebastian/global-state", - "version": "9.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", - "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", - "shasum": "" - }, - "require": { - "php": ">=8.4", - "sebastian/object-reflector": "^6.0", - "sebastian/recursion-context": "^8.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^13.1.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "9.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "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/9.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/global-state", - "type": "tidelift" - } - ], - "time": "2026-06-01T15:11:33+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "5.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", - "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.8.0", - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "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", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.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/lines-of-code", - "type": "tidelift" - } - ], - "time": "2026-07-09T08:42:34+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "8.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/511064ecde82bd747e2ba2fab3dda8d977b59576", - "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576", - "shasum": "" - }, - "require": { - "php": ">=8.4", - "sebastian/recursion-context": "^8.0.1" - }, - "require-dev": { - "phpunit/phpunit": "^13.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "8.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/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/object-enumerator", - "type": "tidelift" - } - ], - "time": "2026-08-13T07:05:05+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "6.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "f71bbcdc4f95456b4622810bec64eb06372e25b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/f71bbcdc4f95456b4622810bec64eb06372e25b2", - "reference": "f71bbcdc4f95456b4622810bec64eb06372e25b2", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/6.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/object-reflector", - "type": "tidelift" - } - ], - "time": "2026-08-13T06:34:36+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "8.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", - "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.2.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "8.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.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": "2026-08-03T05:58:12+00:00" - }, - { - "name": "sebastian/type", - "version": "7.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "bd1df467864cb95140414059a535b2d906173fcf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/bd1df467864cb95140414059a535b2d906173fcf", - "reference": "bd1df467864cb95140414059a535b2d906173fcf", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "phpunit/phpunit": "^13.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.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 types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/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/type", - "type": "tidelift" - } - ], - "time": "2026-08-10T08:00:57+00:00" - }, - { - "name": "sebastian/version", - "version": "7.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ad37a5552c8e2b88572249fdc19b6da7792e021b", - "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/7.0.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/version", - "type": "tidelift" - } - ], - "time": "2026-02-06T04:52:52+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": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", - "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^8.1" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2025-12-08T11:19:18+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=8.0" - }, - "platform-dev": {}, - "plugin-api-version": "2.9.0" -} From 41db98c575b384abc3be4e87189c561535c2772e Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 11:22:43 -0700 Subject: [PATCH 13/25] update GitHub Action --- .github/workflows/php.yml | 72 ++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 90f2789..8687f39 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -2,43 +2,81 @@ name: PHP Composer on: push: - branches: ["main"] + branches: ['main'] pull_request: - branches: ["main"] + branches: ['main'] permissions: contents: read jobs: build: + name: PHP ${{ matrix.php-version }}${{ matrix.run-tests && ' (tests)' || ' (compatibility)' }} runs-on: ubuntu-latest + strategy: fail-fast: true matrix: - php: [8.0, 8.1, 8.2] + # PHPUnit only runs on PHP >=8.4, so only run tests on those versions. + # For other versions, we'll run a PHP compatibility test. + include: + - { php-version: '8.0', run-tests: false } + - { php-version: '8.1', run-tests: false } + - { php-version: '8.2', run-tests: false } + - { php-version: '8.3', run-tests: false } + - { php-version: '8.4', run-tests: true } + - { php-version: '8.5', run-tests: true } + steps: - - uses: actions/checkout@v3 + - name: Check out repository + uses: actions/checkout@v7 - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: ${{ matrix.php }} - coverage: none + php-version: ${{ matrix.php-version }} - - name: Validate composer.json and composer.lock - run: composer validate --strict + # If we're not running tests, remove the Composer requirement for PHPUnit. + # PHPUnit can only run on PHP >=8.4, but our address-normalization library + # supports PHP >=8.0. We can't use Composer's `--no-dev` flag to avoid + # this, so we just rip out the `require-dev` section from composer.json. + - name: Remove dev requirements + if: ${{ !matrix.run-tests }} + run: | + jq 'del(."require-dev")' composer.json > composer.json.tmp + mv composer.json.tmp composer.json - - name: Cache Composer packages + - name: Get composer cache directory id: composer-cache - uses: actions/cache@v3 + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache dependencies + uses: actions/cache@v4 with: - path: vendor - key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-php- + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- - name: Install dependencies - run: composer install --prefer-dist --no-progress + run: composer update --prefer-dist --no-progress --no-interaction ${{ matrix.run-tests == false && '--no-dev' || '' }} + + # If PHP >=8.4, run PHPUnit tests. + - name: Run tests + if: ${{ matrix.run-tests }} + run: vendor/bin/phpunit + + # If PHP <8.4, run compatibility check. + - name: Check syntax of every source file + if: ${{ !matrix.run-tests }} + run: find src -name '*.php' -print0 | xargs -0 -n1 php -l - - name: Run test suite - run: composer run-script test + # Load the library and parse one address as a smoke test. + - name: Test library + if: ${{ !matrix.run-tests }} + run: | + php -r ' + require "vendor/autoload.php"; + $address = ( new ZeroDaHero\Normalizer() )->parse( "123 Main Street, Fall River, MA 02720" ); + echo $address, PHP_EOL; + exit( $address ? 0 : 1 ); + ' From 899da9a9e581d86f753a54c8dbea0ad7bf7213a6 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 11:43:32 -0700 Subject: [PATCH 14/25] remove unnecessary `composer update` flag --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 8687f39..b7ba520 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -58,7 +58,7 @@ jobs: restore-keys: ${{ runner.os }}-composer- - name: Install dependencies - run: composer update --prefer-dist --no-progress --no-interaction ${{ matrix.run-tests == false && '--no-dev' || '' }} + run: composer update --no-progress --no-interaction ${{ matrix.run-tests == false && '--no-dev' || '' }} # If PHP >=8.4, run PHPUnit tests. - name: Run tests From 3e328f92cb4c162eb2c122626f5cc6a1d9dab5e2 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 11:43:55 -0700 Subject: [PATCH 15/25] improve comments --- .github/workflows/php.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index b7ba520..e05c4a0 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -11,14 +11,14 @@ permissions: jobs: build: - name: PHP ${{ matrix.php-version }}${{ matrix.run-tests && ' (tests)' || ' (compatibility)' }} + name: PHP ${{ matrix.php-version }}${{ matrix.run-tests && ' (tests)' || ' (syntax)' }} runs-on: ubuntu-latest strategy: fail-fast: true matrix: # PHPUnit only runs on PHP >=8.4, so only run tests on those versions. - # For other versions, we'll run a PHP compatibility test. + # For other versions, we'll run PHP syntax checks. include: - { php-version: '8.0', run-tests: false } - { php-version: '8.1', run-tests: false } @@ -65,8 +65,8 @@ jobs: if: ${{ matrix.run-tests }} run: vendor/bin/phpunit - # If PHP <8.4, run compatibility check. - - name: Check syntax of every source file + # If PHP <8.4, run syntax check. + - name: Check PHP syntax if: ${{ !matrix.run-tests }} run: find src -name '*.php' -print0 | xargs -0 -n1 php -l From 789b69cc984f6a32b196fbee4b6bd3f6a4231dcf Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 11:44:38 -0700 Subject: [PATCH 16/25] also remove `autoload-dev` from Composer config --- .github/workflows/php.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index e05c4a0..96db7ce 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -37,13 +37,13 @@ jobs: php-version: ${{ matrix.php-version }} # If we're not running tests, remove the Composer requirement for PHPUnit. - # PHPUnit can only run on PHP >=8.4, but our address-normalization library - # supports PHP >=8.0. We can't use Composer's `--no-dev` flag to avoid - # this, so we just rip out the `require-dev` section from composer.json. + # The configured PHPUnit requires PHP >=8.4, but our library supports PHP + # >=8.0. We can't use Composer's `--no-dev` flag to avoid this, so we just + # rip out the `require-dev` section from composer.json. - name: Remove dev requirements if: ${{ !matrix.run-tests }} run: | - jq 'del(."require-dev")' composer.json > composer.json.tmp + jq 'del(."require-dev", ."autoload-dev")' composer.json > composer.json.tmp mv composer.json.tmp composer.json - name: Get composer cache directory From 1c37060102006480244a104e68c32ccb2a25f933 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 11:45:18 -0700 Subject: [PATCH 17/25] more useful to _not_ fail fast --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 96db7ce..2da3f25 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: - fail-fast: true + fail-fast: false matrix: # PHPUnit only runs on PHP >=8.4, so only run tests on those versions. # For other versions, we'll run PHP syntax checks. From f53b1bef1b393ca1a91ac937e8e0338f1968c2bf Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 11:45:33 -0700 Subject: [PATCH 18/25] validate Composer configuration --- .github/workflows/php.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 2da3f25..dcacd33 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -36,6 +36,9 @@ jobs: with: php-version: ${{ matrix.php-version }} + - name: Validate Composer configuration + run: composer validate --strict + # If we're not running tests, remove the Composer requirement for PHPUnit. # The configured PHPUnit requires PHP >=8.4, but our library supports PHP # >=8.0. We can't use Composer's `--no-dev` flag to avoid this, so we just From 8e00e7ce38fd52caa83765c58bd74b3c735604b1 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 11:46:57 -0700 Subject: [PATCH 19/25] user setup-php's `tools` support for Composer --- .github/workflows/php.yml | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index dcacd33..b1d373f 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -35,6 +35,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-version }} + tools: composer - name: Validate Composer configuration run: composer validate --strict @@ -49,17 +50,7 @@ jobs: jq 'del(."require-dev", ."autoload-dev")' composer.json > composer.json.tmp mv composer.json.tmp composer.json - - name: Get composer cache directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies - uses: actions/cache@v4 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - + # Run `composer update` because the lockfile is not committed. - name: Install dependencies run: composer update --no-progress --no-interaction ${{ matrix.run-tests == false && '--no-dev' || '' }} From a108af49a0e064b069674e87e4c74c966861a6fa Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 11:49:36 -0700 Subject: [PATCH 20/25] improve comments --- .github/workflows/php.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index b1d373f..9ad75af 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -17,8 +17,8 @@ jobs: strategy: fail-fast: false matrix: - # PHPUnit only runs on PHP >=8.4, so only run tests on those versions. - # For other versions, we'll run PHP syntax checks. + # The configured PHPUnit requires PHP >=8.4, so only run PHPUnit tests + # on matching PHP versions. For others, run PHP syntax checks. include: - { php-version: '8.0', run-tests: false } - { php-version: '8.1', run-tests: false } @@ -40,10 +40,10 @@ jobs: - name: Validate Composer configuration run: composer validate --strict - # If we're not running tests, remove the Composer requirement for PHPUnit. - # The configured PHPUnit requires PHP >=8.4, but our library supports PHP - # >=8.0. We can't use Composer's `--no-dev` flag to avoid this, so we just - # rip out the `require-dev` section from composer.json. + # If not running tests, remove the Composer requirement for PHPUnit. The + # configured PHPUnit requires PHP >=8.4, but this library supports PHP + # >=8.0. Composer's `--no-dev` flag will still install phpunit, so we just + # rip out the `require-dev` and `autoload-dev` sections from the config. - name: Remove dev requirements if: ${{ !matrix.run-tests }} run: | From 534e910384bb4b9f126c43d2078f1d07c06c612c Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 13:28:36 -0700 Subject: [PATCH 21/25] support PHP >=8.2 --- .github/workflows/php.yml | 45 +++++---------------------------------- README.md | 2 ++ composer.json | 4 ++-- tests/NormalizerTest.php | 27 ++++++++++++++++++++--- 4 files changed, 33 insertions(+), 45 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 9ad75af..d2a9986 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -11,21 +11,13 @@ permissions: jobs: build: - name: PHP ${{ matrix.php-version }}${{ matrix.run-tests && ' (tests)' || ' (syntax)' }} + name: PHP ${{ matrix.php-version }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: - # The configured PHPUnit requires PHP >=8.4, so only run PHPUnit tests - # on matching PHP versions. For others, run PHP syntax checks. - include: - - { php-version: '8.0', run-tests: false } - - { php-version: '8.1', run-tests: false } - - { php-version: '8.2', run-tests: false } - - { php-version: '8.3', run-tests: false } - - { php-version: '8.4', run-tests: true } - - { php-version: '8.5', run-tests: true } + php-version: ['8.2', '8.3', '8.4', '8.5'] steps: - name: Check out repository @@ -40,37 +32,10 @@ jobs: - name: Validate Composer configuration run: composer validate --strict - # If not running tests, remove the Composer requirement for PHPUnit. The - # configured PHPUnit requires PHP >=8.4, but this library supports PHP - # >=8.0. Composer's `--no-dev` flag will still install phpunit, so we just - # rip out the `require-dev` and `autoload-dev` sections from the config. - - name: Remove dev requirements - if: ${{ !matrix.run-tests }} - run: | - jq 'del(."require-dev", ."autoload-dev")' composer.json > composer.json.tmp - mv composer.json.tmp composer.json - - # Run `composer update` because the lockfile is not committed. + # Run `composer update` instead of `composer install` because the lockfile + # is not committed. - name: Install dependencies - run: composer update --no-progress --no-interaction ${{ matrix.run-tests == false && '--no-dev' || '' }} + run: composer update --no-progress --no-interaction - # If PHP >=8.4, run PHPUnit tests. - name: Run tests - if: ${{ matrix.run-tests }} run: vendor/bin/phpunit - - # If PHP <8.4, run syntax check. - - name: Check PHP syntax - if: ${{ !matrix.run-tests }} - run: find src -name '*.php' -print0 | xargs -0 -n1 php -l - - # Load the library and parse one address as a smoke test. - - name: Test library - if: ${{ !matrix.run-tests }} - run: | - php -r ' - require "vendor/autoload.php"; - $address = ( new ZeroDaHero\Normalizer() )->parse( "123 Main Street, Fall River, MA 02720" ); - echo $address, PHP_EOL; - exit( $address ? 0 : 1 ); - ' diff --git a/README.md b/README.md index cf3fad6..0cc7bbb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Basic Address Normalizer + [![Build Status](https://travis-ci.org/zerodahero/address-normalization.svg?branch=master)](https://travis-ci.org/zerodahero/address-normalization) ## Purpose @@ -108,6 +109,7 @@ $address->toArray(); ``` ### Hashing + If you only need to make use of a consistent way of hashing (e.g. if you're starting with a dependable 5-part address, such as from a 3rd party service), you can build a `SimpleAddress`. ```php diff --git a/composer.json b/composer.json index 4d3126e..e37aea5 100644 --- a/composer.json +++ b/composer.json @@ -13,10 +13,10 @@ } }, "require": { - "php": ">=8.0" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^13" + "phpunit/phpunit": "^11|^12|^13" }, "scripts": { "test": "phpunit" diff --git a/tests/NormalizerTest.php b/tests/NormalizerTest.php index 8bc9a2e..a1ef41e 100644 --- a/tests/NormalizerTest.php +++ b/tests/NormalizerTest.php @@ -1,5 +1,13 @@ =8.2, it supports PHPUnit 11, 12, and 13. +The DataProviders syntax was changed in v12. (Using both causes no problems, as +the docblock syntax is ignored as of v12.) +*/ + namespace Tests; use PHPUnit\Framework\TestCase; @@ -63,6 +71,10 @@ public static function normalizesAddressesDataProvider() { ]; } + /** + * @test + * @dataProvider normalizesAddressesDataProvider + */ #[DataProvider('normalizesAddressesDataProvider')] public function testNormalizesAddresses($test, $expected_result) { @@ -87,7 +99,10 @@ public static function badAddressesDataProvider() { ]; } - /** @test */ + /** + * @test + * @dataProvider badAddressesDataProvider + */ #[DataProvider('badAddressesDataProvider')] public function testFailsOnBadAddresses($address) { @@ -129,7 +144,10 @@ public static function addressesWithoutUnitPrefixDataProvider() { ]; } - /** @test */ + /** + * @test + * @dataProvider addressesWithoutUnitPrefixDataProvider + */ #[DataProvider('addressesWithoutUnitPrefixDataProvider')] public function testHandlesAddressWithoutUnitPrefix($test, $expected_result) { @@ -194,7 +212,10 @@ public static function addressesWithMultiWordCityDataProvider() { ]; } - /** @test */ + /** + * @test + * @dataProvider addressesWithMultiWordCityDataProvider + */ #[DataProvider('addressesWithMultiWordCityDataProvider')] public function testHandlesAddressWithMultiWordCity($test, $expected_result) { From 62dcfe2ec2fe46994f47de7e683ef08360979817 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 13:32:48 -0700 Subject: [PATCH 22/25] restore perfectly good existing code --- .github/workflows/php.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index d2a9986..d5fc20e 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -37,5 +37,5 @@ jobs: - name: Install dependencies run: composer update --no-progress --no-interaction - - name: Run tests - run: vendor/bin/phpunit + - name: Run test suite + run: composer run-script test From c23724c6bd04f2b32f3d3df510b55b0774b0cd89 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 13:53:51 -0700 Subject: [PATCH 23/25] use `composer install`, not `composer update` --- .github/workflows/php.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index d5fc20e..f8590e2 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -32,10 +32,8 @@ jobs: - name: Validate Composer configuration run: composer validate --strict - # Run `composer update` instead of `composer install` because the lockfile - # is not committed. - name: Install dependencies - run: composer update --no-progress --no-interaction + run: composer install --no-progress --no-interaction - name: Run test suite run: composer run-script test From 116abf6db24367e97d4a6e7c00499cc3a96b68c3 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 13:58:31 -0700 Subject: [PATCH 24/25] use assoc arrays for DataProviders --- tests/NormalizerTest.php | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/tests/NormalizerTest.php b/tests/NormalizerTest.php index a1ef41e..583be15 100644 --- a/tests/NormalizerTest.php +++ b/tests/NormalizerTest.php @@ -88,14 +88,10 @@ public function testNormalizesAddresses($test, $expected_result) public static function badAddressesDataProvider() { return [ - // double unit no commas - [ '1234 Main St. SE Unit 101 Unit 101' ], - // double unit mismatch comma - [ '1234 Main St. SE, Unit 101 Apt 101, Minneapolis, MN 55555' ], - // double unit comma - [ '3333 West End Ave, Unit 301 Unit 301, Nashville, TN, 37205' ], - // nonsense - [ 'Main Street West Fork Soup Salad' ], + 'double unit no commas' => [ '1234 Main St. SE Unit 101 Unit 101' ], + 'double unit mismatch comma' => [ '1234 Main St. SE, Unit 101 Apt 101, Minneapolis, MN 55555' ], + 'double unit comma' => [ '3333 West End Ave, Unit 301 Unit 301, Nashville, TN, 37205' ], + 'nonsense' => [ 'Main Street West Fork Soup Salad' ], ]; } @@ -113,31 +109,31 @@ public function testFailsOnBadAddresses($address) public static function addressesWithoutUnitPrefixDataProvider() { return [ - [ // Test without unit prefix + 'Test without unit prefix' => [ 'test' => '1234 W Main Avenue 1W, Chicago, IL, 60647', 'expected_result' => '1234 W Main Ave #1W, Chicago, IL 60647' ], - [ // Regression test with unit prefix + 'Regression test with "Unit" unit prefix' => [ 'test' => '1234 W Main Avenue Unit 1W, Chicago, IL, 60647', 'expected_result' => '1234 W Main Ave Unit 1W, Chicago, IL 60647' ], - [ // Regression test with unit prefix + 'Regression test with "Apartment" unit prefix' => [ 'test' => '1234 W Main Avenue Apartment 1W, Chicago, IL, 60647', 'expected_result' => '1234 W Main Ave Apartment 1W, Chicago, IL 60647' ], - [ // Regression test with unit prefix + 'Regression test with "#" unit prefix' => [ 'test' => '1234 W Main Avenue #1W, Chicago, IL, 60647', 'expected_result' => '1234 W Main Ave #1W, Chicago, IL 60647' ], - [ // Regression test with unit prefix + 'Regression test with "Room" unit prefix' => [ 'test' => '1234 W Main Avenue Room 1, Chicago, IL, 60647', 'expected_result' => '1234 W Main Ave Room 1, Chicago, IL 60647' ], - [ // Regression test with unit prefix + 'Regression test with "Apt" unit prefix' => [ 'test' => '1234 W Main Avenue Apt 1W, Chicago, IL, 60647', 'expected_result' => '1234 W Main Ave Apt 1W, Chicago, IL 60647' ], - [ // Regression test without any unit + 'Regression test without any unit' => [ 'test' => '1234 W Main Street, Chicago, IL, 60647', 'expected_result' => '1234 W Main St, Chicago, IL 60647' ], From c0d838fb78073b103c9f0f876b3de899bfdfd556 Mon Sep 17 00:00:00 2001 From: Matthew McVickar Date: Mon, 21 Sep 2026 14:00:21 -0700 Subject: [PATCH 25/25] consistent code style --- tests/NormalizerTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/NormalizerTest.php b/tests/NormalizerTest.php index 583be15..20b3dfd 100644 --- a/tests/NormalizerTest.php +++ b/tests/NormalizerTest.php @@ -88,10 +88,10 @@ public function testNormalizesAddresses($test, $expected_result) public static function badAddressesDataProvider() { return [ - 'double unit no commas' => [ '1234 Main St. SE Unit 101 Unit 101' ], - 'double unit mismatch comma' => [ '1234 Main St. SE, Unit 101 Apt 101, Minneapolis, MN 55555' ], - 'double unit comma' => [ '3333 West End Ave, Unit 301 Unit 301, Nashville, TN, 37205' ], - 'nonsense' => [ 'Main Street West Fork Soup Salad' ], + 'double unit no commas' => ['1234 Main St. SE Unit 101 Unit 101'], + 'double unit mismatch comma' => ['1234 Main St. SE, Unit 101 Apt 101, Minneapolis, MN 55555'], + 'double unit comma' => ['3333 West End Ave, Unit 301 Unit 301, Nashville, TN, 37205'], + 'nonsense' => ['Main Street West Fork Soup Salad'], ]; }