diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bcbf738 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +# Files and directories not needed by consumers of the package. +# `composer require` ships only the files NOT marked export-ignore. + +/.github export-ignore +/tests export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.php-cs-fixer.dist.php export-ignore +/.tool-versions export-ignore +/phpstan-baseline.neon export-ignore +/phpstan.neon.dist export-ignore +/phpunit.xml.dist export-ignore diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..b0c44f8 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,61 @@ +name: CI + +on: + push: + branches: [master] + pull_request: + +permissions: + contents: read + +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + tests: + name: Tests (PHP ${{ matrix.php }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: ['8.3', '8.4', '8.5'] + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: shivammathur/setup-php@fcafdd6392932010c2bd5094439b8e33be2a8a09 # v2.37.0 + with: + php-version: ${{ matrix.php }} + extensions: mbstring + coverage: none + tools: composer:v2 + - uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # v4.0.0 + - run: composer audit + - run: vendor/bin/phpunit + + static-analysis: + name: Static Analysis + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: shivammathur/setup-php@fcafdd6392932010c2bd5094439b8e33be2a8a09 # v2.37.0 + with: + php-version: '8.3' + extensions: mbstring + coverage: none + tools: composer:v2 + - uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # v4.0.0 + - run: vendor/bin/phpstan analyse --no-progress + + code-style: + name: Code Style + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: shivammathur/setup-php@fcafdd6392932010c2bd5094439b8e33be2a8a09 # v2.37.0 + with: + php-version: '8.3' + extensions: mbstring + coverage: none + tools: composer:v2 + - uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # v4.0.0 + - run: vendor/bin/php-cs-fixer fix --dry-run --diff diff --git a/.gitignore b/.gitignore index 4bb9daf..455f54e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ /vendor/ /tests/coverage +/.phpunit.cache/ +/.php-cs-fixer.cache phpunit.xml diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 0000000..bf690a8 --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,25 @@ +in([__DIR__.'/src', __DIR__.'/tests']); + +return (new PhpCsFixer\Config()) + ->setRiskyAllowed(true) + ->setRules([ + '@PER-CS2.0' => true, + '@PHP83Migration' => true, + 'ordered_imports' => ['sort_algorithm' => 'alpha'], + 'no_unused_imports' => true, + 'single_quote' => true, + 'trailing_comma_in_multiline' => true, + 'array_syntax' => ['syntax' => 'short'], + 'blank_line_after_namespace' => true, + 'no_extra_blank_lines' => true, + 'phpdoc_line_span' => [ + 'property' => 'multi', + 'method' => 'multi', + 'const' => 'multi', + ], + ]) + ->setFinder($finder) + ->setCacheFile(__DIR__.'/.php-cs-fixer.cache'); diff --git a/.scrutinizer.yml b/.scrutinizer.yml deleted file mode 100644 index 6fc3be8..0000000 --- a/.scrutinizer.yml +++ /dev/null @@ -1,8 +0,0 @@ -checks: - php: true -filter: - excluded_paths: - - vendor/ - - tests/ - paths: - - src/* diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..7d27ae4 --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +php 8.3 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 101124e..0000000 --- a/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: php -sudo: false -php: - - "7.1" - - "7.2" -env: - global: - - CC_TEST_REPORTER_ID=e52166dfd6d88c1c44d25f8ff60dfad344267093392ea772683f9d84aaa26998 -install: - - composer install - - composer dump-autoload -o -before_script: - - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter - - chmod +x ./cc-test-reporter - - ./cc-test-reporter before-build -script: - - mkdir -p build/logs - - vendor/bin/phpunit --coverage-clover build/logs/clover.xml -after_script: - - travis_retry php vendor/bin/php-coveralls -v - - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT diff --git a/LICENSE b/LICENSE index fdcc19e..f2599bf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ The MIT License (MIT) Copyright (c) 2017 THE ICONIC +Copyright (c) 2026 Zachary Miller (CodeByZach) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index c3d3122..9b7aed6 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,20 @@ -# THE ICONIC Name Parser +# Name Parser + + +> **Fork notice**: This is a maintained fork of [theiconic/name-parser](https://github.com/theiconic/name-parser), +> which has been effectively dormant since ~2020. This fork targets PHP 8.3+ +> (tested through 8.5), ships expanded English dictionary entries, and uses +> modernized tooling (PHPUnit 12, PHPStan 2, PHP-CS-Fixer, GitHub Actions). +> The library is framework-neutral at runtime and integrates cleanly into +> Laravel, Symfony, or vanilla PHP projects — no framework dependencies. ## Purpose This is a universal, language-independent name parser. @@ -24,7 +33,7 @@ E.g. **Mr Anthony R Von Fange III** is parsed to - lastname: **von Fange** - suffix: **III** -This package has been used by The Iconic in production for years, +The original library was used by The Iconic in production for years, successfully processing hundreds of thousands of customer names. ## Features @@ -60,20 +69,23 @@ This parser is able to handle name patterns with and without comma: ## Examples More than 60 different successfully parsed name patterns can be found in the -[parser unit test](https://github.com/theiconic/name-parser/blob/master/tests/ParserTest.php#L12-L12). +[parser unit test](https://github.com/CodeByZach/name-parser/blob/master/tests/ParserTest.php). ## Setup -```$xslt -composer require theiconic/name-parser + +```bash +composer require codebyzach/name-parser ``` +Requires PHP 8.3 or newer (tested on 8.3, 8.4, and 8.5). + ## Usage ### Basic usage ```php parse($input); @@ -91,6 +103,34 @@ echo $name; ``` An empty string is returned for missing parts. +### Laravel integration + +The library is framework-neutral and ships no Laravel-specific glue (no +service provider, no facade). Bind it in your own `AppServiceProvider` if +you want it resolvable from the container: + +```php +// app/Providers/AppServiceProvider.php +use CodeByZach\NameParser\Parser; + +public function register(): void +{ + $this->app->singleton(Parser::class); +} +``` + +Then inject or resolve as usual: + +```php +use CodeByZach\NameParser\Parser; + +public function store(Request $request, Parser $parser) +{ + $name = $parser->parse($request->input('full_name')); + // ... +} +``` + ### Special part retrieval features #### Explicit last name parts You can retrieve last name prefixes and pure last names separately with @@ -125,27 +165,27 @@ echo $name->getFullName(); // J. Peter M. Schluter ### Setting Languages ```php -$parser = new TheIconic\NameParser\Parser([ - new TheIconic\NameParser\Language\English(), //default - new TheIconic\NameParser\Language\German(), +$parser = new CodeByZach\NameParser\Parser([ + new CodeByZach\NameParser\Language\English(), //default + new CodeByZach\NameParser\Language\German(), ]) ``` ### Setting nickname delimiters ```php -$parser = new TheIconic\NameParser\Parser(); +$parser = new CodeByZach\NameParser\Parser(); $parser->setNicknameDelimiters(['(' => ')']); ``` ### Setting whitespace characters ```php -$parser = new TheIconic\NameParser\Parser(); +$parser = new CodeByZach\NameParser\Parser(); $parser->setWhitespace("\t _."); ``` ### Limiting the position of salutations ```php -$parser = new TheIconic\NameParser\Parser(); +$parser = new CodeByZach\NameParser\Parser(); $parser->setMaxSalutationIndex(2); ``` This will require salutations to appear within the @@ -156,7 +196,7 @@ the first half of the name parts. ### Adjusting combined initials support ```php -$parser = new TheIconic\NameParser\Parser(); +$parser = new CodeByZach\NameParser\Parser(); $parser->setMaxCombinedInitials(3); ``` Combined initials are combinations of several @@ -248,6 +288,26 @@ gist. Of course this can also be used in more useful ways, e.g. to spell out abbreviated titles, like `Prof.` as `Professor` etc. . +## Local development + +This repo uses [mise](https://mise.jdx.dev/) (or [asdf](https://asdf-vm.com/)) +for PHP version pinning via `.tool-versions`. After cloning: + +```bash +mise install # installs the pinned PHP version +composer install # installs dev dependencies +composer test # run the test suite +composer analyse # run PHPStan +composer lint # check code style (dry-run) +composer lint:fix # apply code style fixes +``` + +## Contributors + +- **The Iconic** ([@theiconic](https://github.com/theiconic)) — original library author +- **Zachary Miller** ([@CodeByZach](https://github.com/CodeByZach)) — fork maintainer + ## License -THE ICONIC Name Parser library for PHP is released under the MIT License. +Released under the [MIT License](LICENSE). Original work © 2017 The Iconic; +fork modifications © 2026 Zachary Miller (CodeByZach). diff --git a/composer.json b/composer.json index c13fd59..08de575 100644 --- a/composer.json +++ b/composer.json @@ -1,25 +1,48 @@ { - "name": "theiconic/name-parser", + "name": "codebyzach/name-parser", "description": "PHP library for parsing a string containing a full name into its parts", "type": "library", "license": "MIT", "authors": [ + { + "name": "Zachary Miller", + "email": "codebyzach@gmail.com" + }, { "name": "The Iconic", "email": "engineering@theiconic.com.au" } ], "require": { - "php": ">=7.1" + "php": "^8.3", + "ext-mbstring": "*" }, "require-dev": { - "phpunit/phpunit": "^7.0", - "php-coveralls/php-coveralls": "^2.1", - "php-mock/php-mock-phpunit": "^2.1" + "friendsofphp/php-cs-fixer": "^3.64", + "php-mock/php-mock-phpunit": "^2.15", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^12.0" }, "autoload": { "psr-4": { - "TheIconic\\NameParser\\": ["src/", "tests/"] + "CodeByZach\\NameParser\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\CodeByZach\\NameParser\\": "tests/" + } + }, + "scripts": { + "analyse": "phpstan analyse", + "lint": "php-cs-fixer fix --dry-run --diff", + "lint:fix": "php-cs-fixer fix", + "test": "phpunit" + }, + "config": { + "sort-packages": true, + "allow-plugins": { + "php-http/discovery": true } } } diff --git a/composer.lock b/composer.lock index 3484389..eed95f9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,42 +4,35 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f6d73c5b1ffd335d5886f0b5ed50e259", + "content-hash": "6a14cbf35c6a3a4584f054c1e8a13601", "packages": [], "packages-dev": [ { - "name": "doctrine/instantiator", - "version": "1.1.0", + "name": "clue/ndjson-react", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=5.3", + "react/stream": "^1.2" }, "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "^6.2.3", - "squizlabs/php_codesniffer": "^3.0.2" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + "Clue\\React\\NDJson\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -48,58 +41,75 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "name": "Christian Lück", + "email": "christian@clue.engineering" } ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", "keywords": [ - "constructor", - "instantiate" + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } ], - "time": "2017-07-22T11:58:36+00:00" + "time": "2022-12-23T10:58:28+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "6.3.3", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", - "php": ">=5.5" + "php": "^7.4 || ^8.0" }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.0" + "conflict": { + "phpstan/phpstan": "<1.11.10" }, - "suggest": { - "psr/log": "Required for using the Log middleware" + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, "branch-alias": { - "dev-master": "6.3-dev" + "dev-main": "3.x-dev" } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { - "GuzzleHttp\\": "src/" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -108,57 +118,69 @@ ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2018-04-22T15:46:56+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "guzzlehttp/promises", - "version": "v1.3.1", + "name": "composer/semver", + "version": "3.4.4", "source": { "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { - "php": ">=5.5.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.0" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + "Composer\\Semver\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -166,54 +188,74 @@ ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" } ], - "description": "Guzzle promises library", + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "promise" + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } ], - "time": "2016-12-20T10:07:11+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { - "name": "guzzlehttp/psr7", - "version": "1.4.2", + "name": "composer/xdebug-handler", + "version": "3.0.5", "source": { "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + "Composer\\XdebugHandler\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -221,221 +263,284 @@ ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], - "description": "PSR-7 message implementation that also provides common utility methods", + "description": "Restarts a process without Xdebug.", "keywords": [ - "http", - "message", - "request", - "response", - "stream", - "uri", - "url" + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2017-03-20T17:10:46+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.8.1", + "name": "ergebnis/agent-detector", + "version": "1.2.0", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" + "url": "https://github.com/ergebnis/agent-detector.git", + "reference": "e211f17928c8b95a51e06040792d57f5462fb271" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "url": "https://api.github.com/repos/ergebnis/agent-detector/zipball/e211f17928c8b95a51e06040792d57f5462fb271", + "reference": "e211f17928c8b95a51e06040792d57f5462fb271", "shasum": "" }, "require": { - "php": "^7.1" - }, - "replace": { - "myclabs/deep-copy": "self.version" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" + "ergebnis/composer-normalize": "^2.51.0", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.60.2", + "ergebnis/phpstan-rules": "^2.13.1", + "ergebnis/phpunit-slow-test-detector": "^2.24.0", + "ergebnis/rector-rules": "^1.18.1", + "fakerphp/faker": "^1.24.1", + "infection/infection": "^0.26.6", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.54", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "phpunit/phpunit": "^9.6.34", + "rector/rector": "^2.4.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, "autoload": { "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] + "Ergebnis\\AgentDetector\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } ], - "time": "2018-06-11T23:09:50+00:00" + "description": "Provides a detector for detecting the presence of an agent.", + "homepage": "https://github.com/ergebnis/agent-detector", + "support": { + "issues": "https://github.com/ergebnis/agent-detector/issues", + "security": "https://github.com/ergebnis/agent-detector/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/agent-detector" + }, + "time": "2026-05-07T08:19:07+00:00" }, { - "name": "phar-io/manifest", - "version": "1.0.1", + "name": "evenement/evenement", + "version": "v3.0.2", "source": { "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^1.0.1", - "php": "^5.6 || ^7.0" + "php": ">=7.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "require-dev": { + "phpunit/phpunit": "^9 || ^6" }, + "type": "library", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Evenement\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "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" + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" } ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2017-03-05T18:14:27+00:00" + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" }, { - "name": "phar-io/version", - "version": "1.0.1", + "name": "fidry/cpu-core-counter", + "version": "1.3.0", "source": { "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" }, "type": "library", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + }, + "funding": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" + "url": "https://github.com/theofidry", + "type": "github" } ], - "description": "Library for handling version information and constraints", - "time": "2017-03-05T17:38:23+00:00" + "time": "2025-08-14T07:29:31+00:00" }, { - "name": "php-coveralls/php-coveralls", - "version": "v2.1.0", + "name": "friendsofphp/php-cs-fixer", + "version": "v3.95.1", "source": { "type": "git", - "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "3b00c229726f892bfdadeaf01ea430ffd04a939d" + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/3b00c229726f892bfdadeaf01ea430ffd04a939d", - "reference": "3b00c229726f892bfdadeaf01ea430ffd04a939d", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a9727678fbd12997f1d9de8f4a37824ed9df1065", + "reference": "a9727678fbd12997f1d9de8f4a37824ed9df1065", "shasum": "" }, "require": { + "clue/ndjson-react": "^1.3", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.5", + "ergebnis/agent-detector": "^1.1.1", + "ext-filter": "*", + "ext-hash": "*", "ext-json": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.0", - "php": "^5.5 || ^7.0", - "psr/log": "^1.0", - "symfony/config": "^2.1 || ^3.0 || ^4.0", - "symfony/console": "^2.1 || ^3.0 || ^4.0", - "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0", - "symfony/yaml": "^2.0 || ^3.0 || ^4.0" + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.3", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.6", + "react/event-loop": "^1.5", + "react/socket": "^1.16", + "react/stream": "^1.4", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0", + "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.33", + "symfony/polyfill-php80": "^1.33", + "symfony/polyfill-php81": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0", + "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0" + "facile-it/paraunit": "^1.3.1 || ^2.8.0", + "infection/infection": "^0.32.6", + "justinrainbow/json-schema": "^6.8.0", + "keradus/cli-executor": "^2.3", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.9.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.8", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.8", + "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.55", + "symfony/polyfill-php85": "^1.33", + "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.8", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.8" }, "suggest": { - "symfony/http-kernel": "Allows Symfony integration" + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." }, "bin": [ - "bin/php-coveralls" + "php-cs-fixer" ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, + "type": "application", "autoload": { "psr-4": { - "PhpCoveralls\\": "src/" - } + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/**/Internal/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -443,457 +548,567 @@ ], "authors": [ { - "name": "Kitamura Satoshi", - "email": "with.no.parachute@gmail.com", - "homepage": "https://www.facebook.com/satooshi.jp", - "role": "Original creator" - }, - { - "name": "Takashi Matsuo", - "email": "tmatsuo@google.com" - }, - { - "name": "Google Inc" - }, - { - "name": "Dariusz Ruminski", - "email": "dariusz.ruminski@gmail.com", - "homepage": "https://github.com/keradus" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Contributors", - "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors" + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" } ], - "description": "PHP client library for Coveralls API", - "homepage": "https://github.com/php-coveralls/php-coveralls", + "description": "A tool to automatically fix PHP code style", "keywords": [ - "ci", - "coverage", - "github", - "test" + "Static code analysis", + "fixer", + "standards", + "static analysis" ], - "time": "2018-05-22T23:11:08+00:00" + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.1" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2026-04-12T17:00:09+00:00" }, { - "name": "php-mock/php-mock", - "version": "2.0.0", + "name": "myclabs/deep-copy", + "version": "1.13.4", "source": { "type": "git", - "url": "https://github.com/php-mock/php-mock.git", - "reference": "22d297231118e6fd5b9db087fbe1ef866c2b95d2" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-mock/php-mock/zipball/22d297231118e6fd5b9db087fbe1ef866c2b95d2", - "reference": "22d297231118e6fd5b9db087fbe1ef866c2b95d2", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { - "php": ">=5.6", - "phpunit/php-text-template": "^1" + "php": "^7.1 || ^8.0" }, - "replace": { - "malkusch/php-mock": "*" + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { - "phpunit/phpunit": "^5.7" - }, - "suggest": { - "php-mock/php-mock-phpunit": "Allows integration into PHPUnit testcase with the trait PHPMock." + "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": { - "phpmock\\": [ - "classes/", - "tests/" - ] + "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "WTFPL" + "MIT" ], - "authors": [ + "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.13.4" + }, + "funding": [ { - "name": "Markus Malkusch", - "email": "markus@malkusch.de", - "homepage": "http://markus.malkusch.de", - "role": "Developer" + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" } ], - "description": "PHP-Mock can mock built-in PHP functions (e.g. time()). PHP-Mock relies on PHP's namespace fallback policy. No further extension is needed.", - "homepage": "https://github.com/php-mock/php-mock", - "keywords": [ - "BDD", - "TDD", - "function", - "mock", - "stub", - "test", - "test double" - ], - "time": "2017-02-17T20:52:52+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { - "name": "php-mock/php-mock-integration", - "version": "2.0.0", + "name": "nikic/php-parser", + "version": "v5.7.0", "source": { "type": "git", - "url": "https://github.com/php-mock/php-mock-integration.git", - "reference": "5a0d7d7755f823bc2a230cfa45058b40f9013bc4" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-mock/php-mock-integration/zipball/5a0d7d7755f823bc2a230cfa45058b40f9013bc4", - "reference": "5a0d7d7755f823bc2a230cfa45058b40f9013bc4", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { - "php": ">=5.6", - "php-mock/php-mock": "^2", - "phpunit/php-text-template": "^1" + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" }, "require-dev": { - "phpunit/phpunit": "^4|^5" + "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": { - "phpmock\\integration\\": "classes/" + "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "WTFPL" + "BSD-3-Clause" ], "authors": [ { - "name": "Markus Malkusch", - "email": "markus@malkusch.de", - "homepage": "http://markus.malkusch.de", - "role": "Developer" + "name": "Nikita Popov" } ], - "description": "Integration package for PHP-Mock", - "homepage": "https://github.com/php-mock/php-mock-integration", + "description": "A PHP parser written in PHP", "keywords": [ - "BDD", - "TDD", - "function", - "mock", - "stub", - "test", - "test double" + "parser", + "php" ], - "time": "2017-02-17T21:31:34+00:00" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" }, { - "name": "php-mock/php-mock-phpunit", - "version": "2.1.1", + "name": "phar-io/manifest", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/php-mock/php-mock-phpunit.git", - "reference": "ff1cc1d4e7478ce74221e05742588619bee84f69" + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/ff1cc1d4e7478ce74221e05742588619bee84f69", - "reference": "ff1cc1d4e7478ce74221e05742588619bee84f69", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { - "php": ">=7", - "php-mock/php-mock-integration": "^2", - "phpunit/phpunit": "^6 || ^7" + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", - "autoload": { - "files": [ - "autoload.php" - ], - "psr-4": { - "phpmock\\phpunit\\": "classes/" + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" } }, + "autoload": { + "classmap": [ + "src/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "WTFPL" + "BSD-3-Clause" ], "authors": [ { - "name": "Markus Malkusch", - "email": "markus@malkusch.de", - "homepage": "http://markus.malkusch.de", + "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": "Mock built-in PHP functions (e.g. time()) with PHPUnit. This package relies on PHP's namespace fallback policy. No further extension is needed.", - "homepage": "https://github.com/php-mock/php-mock-phpunit", - "keywords": [ - "BDD", - "TDD", - "function", - "mock", - "phpunit", - "stub", - "test", - "test double" + "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": "2018-04-06T13:54:43+00:00" + "time": "2024-03-03T12:33:53+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "1.0.1", + "name": "phar-io/version", + "version": "3.2.1", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.6" + "php": "^7.2 || ^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "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": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2017-09-11T18:02:19+00:00" + "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": "phpdocumentor/reflection-docblock", - "version": "4.3.0", + "name": "php-mock/php-mock", + "version": "2.7.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + "url": "https://github.com/php-mock/php-mock.git", + "reference": "b59734f19765296bb0311942850d02288a224890" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "url": "https://api.github.com/repos/php-mock/php-mock/zipball/b59734f19765296bb0311942850d02288a224890", + "reference": "b59734f19765296bb0311942850d02288a224890", "shasum": "" }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" + "php": "^5.6 || ^7.0 || ^8.0", + "phpunit/php-text-template": "^1 || ^2 || ^3 || ^4 || ^5 || ^6" + }, + "replace": { + "malkusch/php-mock": "*" }, "require-dev": { - "doctrine/instantiator": "~1.0.5", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.4" + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0", + "squizlabs/php_codesniffer": "^3.8" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } + "suggest": { + "php-mock/php-mock-phpunit": "Allows integration into PHPUnit testcase with the trait PHPMock." }, + "type": "library", "autoload": { + "files": [ + "autoload.php" + ], "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" + "phpmock\\": [ + "classes/", + "tests/" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "WTFPL" ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Markus Malkusch", + "email": "markus@malkusch.de", + "homepage": "http://markus.malkusch.de", + "role": "Developer" + } + ], + "description": "PHP-Mock can mock built-in PHP functions (e.g. time()). PHP-Mock relies on PHP's namespace fallback policy. No further extension is needed.", + "homepage": "https://github.com/php-mock/php-mock", + "keywords": [ + "BDD", + "TDD", + "function", + "mock", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/php-mock/php-mock/issues", + "source": "https://github.com/php-mock/php-mock/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/michalbundyra", + "type": "github" } ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-30T07:14:17+00:00" + "time": "2026-02-06T07:39:37+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "0.4.0", + "name": "php-mock/php-mock-integration", + "version": "3.1.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + "url": "https://github.com/php-mock/php-mock-integration.git", + "reference": "cbbf39705ec13dece5b04133cef4e2fd3137a345" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "url": "https://api.github.com/repos/php-mock/php-mock-integration/zipball/cbbf39705ec13dece5b04133cef4e2fd3137a345", + "reference": "cbbf39705ec13dece5b04133cef4e2fd3137a345", "shasum": "" }, "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" + "php": ">=5.6", + "php-mock/php-mock": "^2.5", + "phpunit/php-text-template": "^1 || ^2 || ^3 || ^4 || ^5 || ^6" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" + "phpunit/phpunit": "^5.7.27 || ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || ^13" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpmock\\integration\\": "classes/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "WTFPL" ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Markus Malkusch", + "email": "markus@malkusch.de", + "homepage": "http://markus.malkusch.de", + "role": "Developer" + } + ], + "description": "Integration package for PHP-Mock", + "homepage": "https://github.com/php-mock/php-mock-integration", + "keywords": [ + "BDD", + "TDD", + "function", + "mock", + "stub", + "test", + "test double" + ], + "support": { + "issues": "https://github.com/php-mock/php-mock-integration/issues", + "source": "https://github.com/php-mock/php-mock-integration/tree/3.1.0" + }, + "funding": [ + { + "url": "https://github.com/michalbundyra", + "type": "github" } ], - "time": "2017-07-14T14:27:02+00:00" + "time": "2026-02-06T07:44:43+00:00" }, { - "name": "phpspec/prophecy", - "version": "1.7.6", + "name": "php-mock/php-mock-phpunit", + "version": "2.15.0", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" + "url": "https://github.com/php-mock/php-mock-phpunit.git", + "reference": "701df15b183f25af663af134eb71353cd838b955" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/701df15b183f25af663af134eb71353cd838b955", + "reference": "701df15b183f25af663af134eb71353cd838b955", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0|^3.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0" + "php": ">=7", + "php-mock/php-mock-integration": "^3.0", + "phpunit/phpunit": "^6 || ^7 || ^8 || ^9 || ^10.0.17 || ^11 || ^12.0.9 || ^13" }, "require-dev": { - "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + "mockery/mockery": "^1.3.6" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7.x-dev" - } - }, "autoload": { - "psr-0": { - "Prophecy\\": "src/" + "files": [ + "autoload.php" + ], + "psr-4": { + "phpmock\\phpunit\\": "classes/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "WTFPL" ], "authors": [ { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" + "name": "Markus Malkusch", + "email": "markus@malkusch.de", + "homepage": "http://markus.malkusch.de", + "role": "Developer" } ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", + "description": "Mock built-in PHP functions (e.g. time()) with PHPUnit. This package relies on PHP's namespace fallback policy. No further extension is needed.", + "homepage": "https://github.com/php-mock/php-mock-phpunit", "keywords": [ - "Double", - "Dummy", - "fake", + "BDD", + "TDD", + "function", "mock", - "spy", - "stub" + "phpunit", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/php-mock/php-mock-phpunit/issues", + "source": "https://github.com/php-mock/php-mock-phpunit/tree/2.15.0" + }, + "funding": [ + { + "url": "https://github.com/michalbundyra", + "type": "github" + } + ], + "time": "2026-02-06T09:12:10+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "2.1.54", + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8be50c3992107dc837b17da4d140fbbdf9a5c5bd", + "reference": "8be50c3992107dc837b17da4d140fbbdf9a5c5bd", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } ], - "time": "2018-04-18T13:57:24+00:00" + "time": "2026-04-29T13:31:09+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "6.0.7", + "version": "12.5.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a" + "reference": "876099a072646c7745f673d7aeab5382c4439691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/865662550c384bc1db7e51d29aeda1c2c161d69a", - "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/876099a072646c7745f673d7aeab5382c4439691", + "reference": "876099a072646c7745f673d7aeab5382c4439691", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-xmlwriter": "*", - "php": "^7.1", - "phpunit/php-file-iterator": "^2.0", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^12.5.1" }, "suggest": { - "ext-xdebug": "^2.6.0" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0-dev" + "dev-main": "12.5.x-dev" } }, "autoload": { @@ -919,29 +1134,55 @@ "testing", "xunit" ], - "time": "2018-06-01T07:51:50+00:00" + "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/12.5.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2026-04-15T08:23:17+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.1", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c" + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cecbc684605bb0cc288828eb5d65d93d5c676d3c", - "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -966,26 +1207,61 @@ "filesystem", "iterator" ], - "time": "2018-06-11T11:44:00+00:00" + "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/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-02-02T14:04:18+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-invoker", + "version": "6.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=8.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1002,37 +1278,48 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "template" + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2015-06-21T13:50:34+00:00" + "time": "2025-02-07T04:58:58+00:00" }, { - "name": "phpunit/php-timer", - "version": "2.0.0", + "name": "phpunit/php-text-template", + "version": "5.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", - "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -1051,38 +1338,48 @@ "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "timer" + "template" ], - "time": "2018-02-01T13:07:23+00:00" + "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:59:16+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "3.0.0", + "name": "phpunit/php-timer", + "version": "8.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", - "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.1" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -1097,65 +1394,69 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "tokenizer" + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } ], - "time": "2018-02-01T13:16:43+00:00" + "time": "2025-02-07T04:59:38+00:00" }, { "name": "phpunit/phpunit", - "version": "7.2.4", + "version": "12.5.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "00bc0b93f0ff4f557e9ea766557fde96da9a03dd" + "reference": "d75dd30597caa80e72fad2ef7904601a30ef1046" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/00bc0b93f0ff4f557e9ea766557fde96da9a03dd", - "reference": "00bc0b93f0ff4f557e9ea766557fde96da9a03dd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d75dd30597caa80e72fad2ef7904601a30ef1046", + "reference": "d75dd30597caa80e72fad2ef7904601a30ef1046", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", - "myclabs/deep-copy": "^1.7", - "phar-io/manifest": "^1.0.1", - "phar-io/version": "^1.0", - "php": "^7.1", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^6.0.7", - "phpunit/php-file-iterator": "^2.0", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.0", - "sebastian/comparator": "^3.0", - "sebastian/diff": "^3.0", - "sebastian/environment": "^3.1", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^1.0", - "sebastian/version": "^2.0.1" - }, - "conflict": { - "phpunit/phpunit-mock-objects": "*" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0" + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.6", + "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.6", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.1.0", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" }, "bin": [ "phpunit" @@ -1163,10 +1464,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.2-dev" + "dev-main": "12.5-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -1189,34 +1493,45 @@ "testing", "xunit" ], - "time": "2018-06-05T03:40:05+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.24" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsoring.html", + "type": "other" + } + ], + "time": "2026-05-01T04:21:04+00:00" }, { - "name": "psr/http-message", - "version": "1.0.1", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1226,37 +1541,40 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], - "time": "2016-08-06T14:39:51+00:00" + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "psr/log", - "version": "1.0.2", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.2.0" }, "type": "library", "extra": { @@ -1266,7 +1584,7 @@ }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1279,419 +1597,618 @@ "homepage": "http://www.php-fig.org/" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Standard interfaces for event handling.", "keywords": [ - "log", + "events", "psr", - "psr-3" + "psr-14" ], - "time": "2016-10-10T12:19:37+00:00" + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", + "name": "psr/log", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\Log\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" }, { - "name": "sebastian/comparator", - "version": "3.0.1", + "name": "react/cache", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "591a30922f54656695e59b1f39501aec513403da" + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/591a30922f54656695e59b1f39501aec513403da", - "reference": "591a30922f54656695e59b1f39501aec513403da", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", "shasum": "" }, "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "React\\Cache\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Volker Dusch", - "email": "github@wallbash.com" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" }, { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", + "description": "Async, Promise-based cache interface for ReactPHP", "keywords": [ - "comparator", - "compare", - "equality" + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2018-06-14T15:05:28+00:00" + "time": "2022-11-30T15:59:55+00:00" }, { - "name": "sebastian/diff", - "version": "3.0.1", + "name": "react/child-process", + "version": "v0.6.7", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "366541b989927187c4ca70490a35615d3fef2dce" + "url": "https://github.com/reactphp/child-process.git", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", - "reference": "366541b989927187c4ca70490a35615d3fef2dce", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/970f0e71945556422ee4570ccbabaedc3cf04ad3", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3", "shasum": "" }, "require": { - "php": "^7.1" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.4" }, "require-dev": { - "phpunit/phpunit": "^7.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/socket": "^1.16", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "React\\ChildProcess\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", + "description": "Event-driven library for executing child processes with ReactPHP.", "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.7" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2018-06-10T07:54:39+00:00" + "time": "2025-12-23T15:25:20+00:00" }, { - "name": "sebastian/environment", - "version": "3.1.0", + "name": "react/dns", + "version": "v1.14.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + "url": "https://github.com/reactphp/dns.git", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "url": "https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" }, "require-dev": { - "phpunit/phpunit": "^6.1" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "React\\Dns\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "description": "Async DNS resolver for ReactPHP", "keywords": [ - "Xdebug", - "environment", - "hhvm" + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.14.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } ], - "time": "2017-07-01T08:51:00+00:00" + "time": "2025-11-18T19:34:28+00:00" }, { - "name": "sebastian/exporter", - "version": "3.1.0", + "name": "react/event-loop", + "version": "v1.6.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" + "url": "https://github.com/reactphp/event-loop.git", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", - "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" + "php": ">=5.3.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" }, + "type": "library", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "React\\EventLoop\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" }, { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" }, { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", "keywords": [ - "export", - "exporter" + "asynchronous", + "event-loop" ], - "time": "2017-04-03T13:19:02+00:00" + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.6.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-11-17T20:46:25+00:00" }, { - "name": "sebastian/global-state", - "version": "2.0.0", + "name": "react/promise", + "version": "v3.3.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + "url": "https://github.com/reactphp/promise.git", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "suggest": { - "ext-uopz": "*" + "phpstan/phpstan": "1.12.28 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "description": "A lightweight implementation of CommonJS Promises/A for PHP", "keywords": [ - "global state" + "promise", + "promises" ], - "time": "2017-04-27T15:39:26+00:00" + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-08-19T18:57:03+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "3.0.3", + "name": "react/socket", + "version": "v1.17.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + "url": "https://github.com/reactphp/socket.git", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "url": "https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "React\\Socket\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.17.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-11-19T20:47:34+00:00" }, { - "name": "sebastian/object-reflector", - "version": "1.1.1", + "name": "react/stream", + "version": "v1.4.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-main": "4.2-dev" } }, "autoload": { @@ -1706,37 +2223,68 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" + "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/4.2.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/cli-parser", + "type": "tidelift" + } + ], + "time": "2025-09-14T09:36:45+00:00" }, { - "name": "sebastian/recursion-context", - "version": "3.0.0", + "name": "sebastian/comparator", + "version": "7.1.6", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c769009dee98f494e0edc3fd4f4087501688f11e", + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e", "shasum": "" }, "require": { - "php": "^7.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^12.2" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -1749,44 +2297,207 @@ "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/7.1.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-04-14T08:23:15+00:00" + }, + { + "name": "sebastian/complexity", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "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 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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" + }, + "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" }, { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" + "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/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:55:46+00:00" }, { - "name": "sebastian/resource-operations", - "version": "1.0.0", + "name": "sebastian/environment", + "version": "8.1.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b121608b28a13f721e76ffbbd386d08eff58f3f6", + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6", "shasum": "" }, "require": { - "php": ">=5.6.0" + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -1804,31 +2515,64 @@ "email": "sebastian@phpunit.de" } ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" + "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/8.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2026-04-15T12:13:01+00:00" }, { - "name": "sebastian/version", - "version": "2.0.1", + "name": "sebastian/exporter", + "version": "7.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", "shasum": "" }, "require": { - "php": ">=5.6" + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1840,60 +2584,1467 @@ "license": [ "BSD-3-Clause" ], - "authors": [ + "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/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:16:11+00:00" + }, + { + "name": "sebastian/global-state", + "version": "8.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^12.0" + }, + "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" + } + ], + "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/8.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" + } + ], + "time": "2025-08-29T11:29:25+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:28+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "shasum": "" + }, + "require": { + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^12.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" + } + ], + "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/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:57:48+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.0" + }, + "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" + } + ], + "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T04:58:17+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.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" + }, + { + "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/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:44:59+00:00" + }, + { + "name": "sebastian/type", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "phpunit/phpunit": "^12.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": "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/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:57:12+00:00" + }, + { + "name": "sebastian/version", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "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 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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T05:00:38+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "d7d2b64a45a89d607865927b176fa51c33ddbb58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/d7d2b64a45a89d607865927b176fa51c33ddbb58", + "reference": "d7d2b64a45a89d607865927b176fa51c33ddbb58", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-22T15:21:55+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-13T15:52:40+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "e4a2e29753c7801f7a8340e066cfa788f3bc8101" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e4a2e29753c7801f7a8340e066cfa788f3bc8101", + "reference": "e4a2e29753c7801f7a8340e066cfa788f3bc8101", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-18T13:18:21+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/ccba7060602b7fed0b03c85bf025257f76d9ef32", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-05T13:30:16+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "dcd8f96bcdc0f128ec406c765cc066c6035d1be3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/dcd8f96bcdc0f128ec406c765cc066c6035d1be3", + "reference": "dcd8f96bcdc0f128ec406c765cc066c6035d1be3", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-18T13:18:21+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "e0be088d22278583a82da281886e8c3592fbf149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", + "reference": "e0be088d22278583a82da281886e8c3592fbf149", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", + "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-26T13:13:48+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0" + }, + "funding": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { - "name": "symfony/config", - "version": "v4.1.0", + "name": "symfony/polyfill-php80", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "5ceefc256caecc3e25147c4e5b933de71d0020c4" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/5ceefc256caecc3e25147c4e5b933de71d0020c4", - "reference": "5ceefc256caecc3e25147c4e5b933de71d0020c4", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/filesystem": "~3.4|~4.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<3.4" - }, - "require-dev": { - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~3.4|~4.0", - "symfony/finder": "~3.4|~4.0", - "symfony/yaml": "~3.4|~4.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "4.1-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Config\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1902,66 +4053,82 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Config Component", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", - "time": "2018-05-16T14:33:22+00:00" + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" }, { - "name": "symfony/console", - "version": "v4.1.0", + "name": "symfony/polyfill-php81", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "2d5d973bf9933d46802b01010bd25c800c87c242" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2d5d973bf9933d46802b01010bd25c800c87c242", - "reference": "2d5d973bf9933d46802b01010bd25c800c87c242", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/process": "<3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~3.4|~4.0", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.4|~4.0" - }, - "suggest": { - "psr/log-implementation": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "4.1-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Console\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1970,48 +4137,78 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", - "time": "2018-05-30T07:26:09+00:00" + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/filesystem", - "version": "v4.1.0", + "name": "symfony/polyfill-php84", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "562bf7005b55fd80d26b582d28e3e10f2dd5ae9c" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/562bf7005b55fd80d26b582d28e3e10f2dd5ae9c", - "reference": "562bf7005b55fd80d26b582d28e3e10f2dd5ae9c", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/polyfill-ctype": "~1.8" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "4.1-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Filesystem\\": "" + "Symfony\\Polyfill\\Php84\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2020,47 +4217,69 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Filesystem Component", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", "homepage": "https://symfony.com", - "time": "2018-05-30T07:26:09+00:00" + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T18:47:49+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.8.0", + "name": "symfony/process", + "version": "v7.4.8", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" + "url": "https://github.com/symfony/process.git", + "reference": "60f19cd3badc8de688421e21e4305eba50f8089a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a", + "reference": "60f19cd3badc8de688421e21e4305eba50f8089a", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=8.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "Symfony\\Component\\Process\\": "" }, - "files": [ - "bootstrap.php" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2069,56 +4288,77 @@ ], "authors": [ { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "support": { + "source": "https://github.com/symfony/process/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2018-04-30T19:57:29+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.8.0", + "name": "symfony/service-contracts", + "version": "v3.7.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "3296adf6a6454a050679cde90f95350ad604b171" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", - "reference": "3296adf6a6454a050679cde90f95350ad604b171", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "ext-mbstring": "For best performance" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-master": "1.8-dev" + "dev-main": "3.7-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" + "Symfony\\Contracts\\Service\\": "" }, - "files": [ - "bootstrap.php" + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2135,40 +4375,58 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2018-04-26T10:06:28+00:00" + "time": "2026-03-28T09:44:51+00:00" }, { "name": "symfony/stopwatch", - "version": "v4.1.0", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "07463bbbbbfe119045a24c4a516f92ebd2752784" + "reference": "70a852d72fec4d51efb1f48dcd968efcaf5ccb89" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/07463bbbbbfe119045a24c4a516f92ebd2752784", - "reference": "07463bbbbbfe119045a24c4a516f92ebd2752784", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/70a852d72fec4d51efb1f48dcd968efcaf5ccb89", + "reference": "70a852d72fec4d51efb1f48dcd968efcaf5ccb89", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.1-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Stopwatch\\": "" @@ -2191,46 +4449,70 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Stopwatch Component", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", - "time": "2018-02-19T16:51:42+00:00" + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" }, { - "name": "symfony/yaml", - "version": "v4.1.0", + "name": "symfony/string", + "version": "v7.4.8", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "80e4bfa9685fc4a09acc4a857ec16974a9cd944e" + "url": "https://github.com/symfony/string.git", + "reference": "114ac57257d75df748eda23dd003878080b8e688" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/80e4bfa9685fc4a09acc4a857ec16974a9cd944e", - "reference": "80e4bfa9685fc4a09acc4a857ec16974a9cd944e", + "url": "https://api.github.com/repos/symfony/string/zipball/114ac57257d75df748eda23dd003878080b8e688", + "reference": "114ac57257d75df748eda23dd003878080b8e688", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/polyfill-ctype": "~1.8" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<3.4" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.1-dev" - } - }, "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { - "Symfony\\Component\\Yaml\\": "" + "Symfony\\Component\\String\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -2242,37 +4524,66 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", "homepage": "https://symfony.com", - "time": "2018-05-30T07:26:09+00:00" + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" }, { "name": "theseer/tokenizer", - "version": "1.1.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.0" + "php": "^8.1" }, "type": "library", "autoload": { @@ -2292,66 +4603,28 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2017-04-07T12:08:54+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "url": "https://github.com/theseer", + "type": "github" } ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2018-01-29T19:49:41+00:00" + "time": "2025-12-08T11:19:18+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.1" + "php": "^8.3", + "ext-mbstring": "*" }, - "platform-dev": [] + "platform-dev": {}, + "plugin-api-version": "2.9.0" } diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon new file mode 100644 index 0000000..f51e71c --- /dev/null +++ b/phpstan-baseline.neon @@ -0,0 +1,2 @@ +parameters: + ignoreErrors: [] diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 0000000..d4e24ef --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,10 @@ +parameters: + level: 9 + paths: + - src + - tests + bootstrapFiles: + - tests/bootstrap.php + +includes: + - phpstan-baseline.neon diff --git a/phpunit.xml.dist b/phpunit.xml.dist index a4f043e..8992944 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,29 +1,19 @@ - - - - - - - - - - - - - - - src - - tests - - - + failOnWarning="true" + failOnRisky="true"> - + ./tests + + + src + + diff --git a/src/Language/English.php b/src/Language/English.php index 08d9585..d2b8893 100644 --- a/src/Language/English.php +++ b/src/Language/English.php @@ -1,45 +1,69 @@ '1st', '2nd' => '2nd', '3rd' => '3rd', '4th' => '4th', '5th' => '5th', + '6th' => '6th', + '7th' => '7th', + '8th' => '8th', + '9th' => '9th', + '10th' => '10th', 'i' => 'I', 'ii' => 'II', 'iii' => 'III', 'iv' => 'IV', 'v' => 'V', + 'vi' => 'VI', + 'vii' => 'VII', + 'viii' => 'VIII', + 'ix' => 'IX', + 'x' => 'X', 'apr' => 'APR', 'cme' => 'CME', + 'dc' => 'DC', 'dds' => 'DDS', 'dmd' => 'DMD', + 'do' => 'DO', + 'dsw' => 'DSW', 'dvm' => 'DVM', + 'emba' => 'EMBA', 'esq' => 'Esq', + 'esquire' => 'Esquire', 'jr' => 'Jr', 'junior' => 'Junior', + 'lcsw' => 'LCSW', 'ma' => 'MA', + 'mba' => 'MBA', 'md' => 'MD', + 'ms' => 'MS', + 'msw' => 'MSW', 'pe' => 'PE', 'phd' => 'PhD', + 'psyd' => 'PsyD', 'rph' => 'RPh', 'senior' => 'Senior', 'sr' => 'Sr', ]; - const SALUTATIONS = [ + public const SALUTATIONS = [ 'dr' => 'Dr.', 'fr' => 'Fr.', + 'hon' => 'Hon.', + 'honorable' => 'Hon.', + 'the honorable' => 'Hon.', 'madam' => 'Madam', 'master' => 'Mr.', 'miss' => 'Miss', + 'missus' => 'Mrs.', 'mister' => 'Mr.', 'mr' => 'Mr.', 'mrs' => 'Mrs.', @@ -49,10 +73,10 @@ class English implements LanguageInterface 'sir' => 'Sir', 'prof' => 'Prof.', 'his honour' => 'His Honour', - 'her honour' => 'Her Honour' + 'her honour' => 'Her Honour', ]; - const LASTNAME_PREFIXES = [ + public const LASTNAME_PREFIXES = [ 'da' => 'da', 'de' => 'de', 'del' => 'del', @@ -70,16 +94,28 @@ class English implements LanguageInterface 'von' => 'von', ]; + /** + * @return array + */ + #[\Override] public function getSuffixes(): array { return self::SUFFIXES; } + /** + * @return array + */ + #[\Override] public function getSalutations(): array { return self::SALUTATIONS; } + /** + * @return array + */ + #[\Override] public function getLastnamePrefixes(): array { return self::LASTNAME_PREFIXES; diff --git a/src/Language/German.php b/src/Language/German.php index 491bb4c..499a09e 100644 --- a/src/Language/German.php +++ b/src/Language/German.php @@ -1,12 +1,12 @@ '1.', '2.' => '2.', '3.' => '3.', @@ -19,28 +19,40 @@ class German implements LanguageInterface 'v' => 'V', ]; - const SALUTATIONS = [ + public const SALUTATIONS = [ 'herr' => 'Herr', 'hr' => 'Herr', 'frau' => 'Frau', - 'fr' => 'Frau' + 'fr' => 'Frau', ]; - const LASTNAME_PREFIXES = [ + public const LASTNAME_PREFIXES = [ 'der' => 'der', 'von' => 'von', ]; + /** + * @return array + */ + #[\Override] public function getSuffixes(): array { return self::SUFFIXES; } + /** + * @return array + */ + #[\Override] public function getSalutations(): array { return self::SALUTATIONS; } + /** + * @return array + */ + #[\Override] public function getLastnamePrefixes(): array { return self::LASTNAME_PREFIXES; diff --git a/src/LanguageInterface.php b/src/LanguageInterface.php index d4d8bd8..7d74afa 100644 --- a/src/LanguageInterface.php +++ b/src/LanguageInterface.php @@ -1,12 +1,21 @@ + */ public function getSuffixes(): array; + /** + * @return array + */ public function getLastnamePrefixes(): array; + /** + * @return array + */ public function getSalutations(): array; } diff --git a/src/Mapper/AbstractMapper.php b/src/Mapper/AbstractMapper.php index 68811ca..e277142 100644 --- a/src/Mapper/AbstractMapper.php +++ b/src/Mapper/AbstractMapper.php @@ -1,35 +1,35 @@ + */ abstract class AbstractMapper { /** * implements the mapping of parts * - * @param array $parts - the name parts - * @return array $parts - the mapped parts + * @param PartArray $parts + * @return PartArray */ - abstract public function map(array $parts); + abstract public function map(array $parts): array; /** * checks if there are still unmapped parts left before the given position * - * @param array $parts - * @param $index - * @return bool + * @param PartArray $parts */ - protected function hasUnmappedPartsBefore(array $parts, $index): bool + protected function hasUnmappedPartsBefore(array $parts, int $index): bool { foreach ($parts as $k => $part) { if ($k === $index) { break; } - if (!($part instanceof AbstractPart)) { + if (! ($part instanceof AbstractPart)) { return true; } } @@ -38,11 +38,10 @@ protected function hasUnmappedPartsBefore(array $parts, $index): bool } /** - * @param string $type - * @param array $parts - * @return int|bool + * @param class-string $type + * @param PartArray $parts */ - protected function findFirstMapped(string $type, array $parts) + protected function findFirstMapped(string $type, array $parts): int|false { $total = count($parts); @@ -57,11 +56,8 @@ protected function findFirstMapped(string $type, array $parts) /** * get the registry lookup key for the given word - * - * @param string $word the word - * @return string the key */ - protected function getKey($word): string + protected function getKey(string $word): string { return strtolower(str_replace('.', '', $word)); } diff --git a/src/Mapper/FirstnameMapper.php b/src/Mapper/FirstnameMapper.php index 79226b4..6722c7e 100644 --- a/src/Mapper/FirstnameMapper.php +++ b/src/Mapper/FirstnameMapper.php @@ -1,21 +1,23 @@ findFirstnamePosition($parts); - if (null !== $pos) { + if ($pos !== null) { $parts[$pos] = new Firstname($parts[$pos]); } return $parts; } - /** - * @param $part - * @return Firstname - */ - protected function handleSinglePart($part): AbstractPart + protected function handleSinglePart(string|AbstractPart $part): AbstractPart { if ($part instanceof AbstractPart) { return $part; @@ -45,8 +43,7 @@ protected function handleSinglePart($part): AbstractPart } /** - * @param array $parts - * @return int|null + * @param PartArray $parts */ protected function findFirstnamePosition(array $parts): ?int { @@ -62,7 +59,7 @@ protected function findFirstnamePosition(array $parts): ?int break; } - if ($part instanceof Initial && null === $pos) { + if ($part instanceof Initial && $pos === null) { $pos = $k; } @@ -77,14 +74,13 @@ protected function findFirstnamePosition(array $parts): ?int } /** - * @param array $parts - * @return int + * @param PartArray $parts */ protected function getStartIndex(array $parts): int { $index = $this->findFirstMapped(Salutation::class, $parts); - if (false === $index) { + if ($index === false) { return 0; } diff --git a/src/Mapper/InitialMapper.php b/src/Mapper/InitialMapper.php index 3a75dc4..78fc900 100644 --- a/src/Mapper/InitialMapper.php +++ b/src/Mapper/InitialMapper.php @@ -1,31 +1,28 @@ matchLastPart = $matchLastPart; - $this->combinedMax = $combinedMax; - } + public function __construct( + private int $combinedMax = 2, + protected bool $matchLastPart = false, + ) {} /** - * map intials in parts array - * - * @param array $parts the name parts - * @return array the mapped parts + * @param PartArray $parts + * @return PartArray */ + #[\Override] public function map(array $parts): array { $last = count($parts) - 1; @@ -37,7 +34,7 @@ public function map(array $parts): array continue; } - if (!$this->matchLastPart && $k === $last) { + if (! $this->matchLastPart && $k === $last) { continue; } @@ -45,14 +42,14 @@ public function map(array $parts): array $stripped = str_replace('.', '', $part); $length = strlen($stripped); - if (1 < $length && $length <= $this->combinedMax) { + if ($length > 1 && $length <= $this->combinedMax) { array_splice($parts, $k, 1, str_split($stripped)); $last = count($parts) - 1; $part = $parts[$k]; } } - if ($this->isInitial($part)) { + if (is_string($part) && $this->isInitial($part)) { $parts[$k] = new Initial($part); } } @@ -60,18 +57,14 @@ public function map(array $parts): array return $parts; } - /** - * @param string $part - * @return bool - */ protected function isInitial(string $part): bool { $length = strlen($part); - if (1 === $length) { + if ($length === 1) { return true; } - return ($length === 2 && substr($part, -1) === '.'); + return $length === 2 && substr($part, -1) === '.'; } } diff --git a/src/Mapper/LastnameMapper.php b/src/Mapper/LastnameMapper.php index 43cfdc7..4ba47bf 100644 --- a/src/Mapper/LastnameMapper.php +++ b/src/Mapper/LastnameMapper.php @@ -1,36 +1,35 @@ prefixes = $prefixes; - $this->matchSinglePart = $matchSinglePart; - } + /** + * @param array $prefixes + */ + public function __construct( + protected array $prefixes, + protected bool $matchSinglePart = false, + ) {} /** - * map lastnames in the parts array - * - * @param array $parts the name parts - * @return array the mapped parts + * @param PartArray $parts + * @return PartArray */ + #[\Override] public function map(array $parts): array { - if (!$this->matchSinglePart && count($parts) < 2) { + if (! $this->matchSinglePart && count($parts) < 2) { return $parts; } @@ -41,8 +40,8 @@ public function map(array $parts): array * we map the parts in reverse order because it makes more * sense to parse for the lastname starting from the end * - * @param array $parts - * @return array + * @param PartArray $parts + * @return PartArray */ protected function mapParts(array $parts): array { @@ -59,6 +58,7 @@ protected function mapParts(array $parts): array if ($this->isFollowedByLastnamePart($parts, $k)) { if ($mapped = $this->mapAsPrefixIfPossible($parts, $k)) { $parts[$k] = $mapped; + continue; } @@ -82,18 +82,22 @@ protected function mapParts(array $parts): array * try to map this part as a lastname prefix or as a combined * lastname part containing a prefix * - * @param array $parts - * @param int $k - * @return Lastname|null + * @param PartArray $parts */ private function mapAsPrefixIfPossible(array $parts, int $k): ?Lastname { + $part = $parts[$k]; + + if (! is_string($part)) { + return null; + } + if ($this->isApplicablePrefix($parts, $k)) { - return new LastnamePrefix($parts[$k], $this->prefixes[$this->getKey($parts[$k])]); + return new LastnamePrefix($part, $this->prefixes[$this->getKey($part)]); } - if ($this->isCombinedWithPrefix($parts[$k])) { - return new Lastname($parts[$k]); + if ($this->isCombinedWithPrefix($part)) { + return new Lastname($part); } return null; @@ -102,15 +106,12 @@ private function mapAsPrefixIfPossible(array $parts, int $k): ?Lastname /** * check if the given part is a combined lastname part * that ends in a lastname prefix - * - * @param string $part - * @return bool */ private function isCombinedWithPrefix(string $part): bool { $pos = strpos($part, '-'); - if (false === $pos) { + if ($pos === false) { return false; } @@ -120,15 +121,14 @@ private function isCombinedWithPrefix(string $part): bool /** * skip through the parts we want to ignore and return the start index * - * @param array $parts - * @return int + * @param PartArray $parts */ protected function skipIgnoredParts(array $parts): int { $k = count($parts); while (--$k >= 0) { - if (!$this->isIgnoredPart($parts[$k])) { + if (! $this->isIgnoredPart($parts[$k])) { break; } } @@ -142,9 +142,7 @@ protected function skipIgnoredParts(array $parts): int * the assumption is that lastname parts have already been found * but we want to see if we should add more parts * - * @param array $parts - * @param int $k - * @return bool + * @param PartArray $parts */ protected function shouldStopMapping(array $parts, int $k): bool { @@ -158,18 +156,14 @@ protected function shouldStopMapping(array $parts, int $k): bool return true; } - - - return strlen($lastPart->getValue()) >= 3; + return $lastPart instanceof AbstractPart && strlen($lastPart->getValue()) >= 3; } /** * indicates if the given part should be ignored (skipped) during mapping - * - * @param $part - * @return bool */ - protected function isIgnoredPart($part) { + protected function isIgnoredPart(AbstractPart|string $part): bool + { return $part instanceof Suffix || $part instanceof Nickname || $part instanceof Salutation; } @@ -179,8 +173,8 @@ protected function isIgnoredPart($part) { * if the mapping did not derive any lastname this is called to transform * any previously ignored parts into lastname parts * - * @param array $parts - * @return array + * @param PartArray $parts + * @return PartArray */ protected function remapIgnored(array $parts): array { @@ -189,7 +183,7 @@ protected function remapIgnored(array $parts): array while (--$k >= 0) { $part = $parts[$k]; - if (!$this->isIgnoredPart($part)) { + if (! $this->isIgnoredPart($part)) { break; } @@ -200,15 +194,13 @@ protected function remapIgnored(array $parts): array } /** - * @param array $parts - * @param int $index - * @return bool + * @param PartArray $parts */ protected function isFollowedByLastnamePart(array $parts, int $index): bool { $next = $this->skipNicknameParts($parts, $index + 1); - return (isset($parts[$next]) && $parts[$next] instanceof Lastname); + return isset($parts[$next]) && $parts[$next] instanceof Lastname; } /** @@ -221,13 +213,13 @@ protected function isFollowedByLastnamePart(array $parts, int $index): bool * * This expects the parts array and index to be in the original order. * - * @param array $parts - * @param int $index - * @return bool + * @param PartArray $parts */ protected function isApplicablePrefix(array $parts, int $index): bool { - if (!$this->isPrefix($parts[$index])) { + $part = $parts[$index]; + + if (! is_string($part) || ! $this->isPrefix($part)) { return false; } @@ -236,28 +228,23 @@ protected function isApplicablePrefix(array $parts, int $index): bool /** * check if the given word is a lastname prefix - * - * @param string $word the word to check - * @return bool */ - protected function isPrefix($word): bool + protected function isPrefix(string $word): bool { - return (array_key_exists($this->getKey($word), $this->prefixes)); + return array_key_exists($this->getKey($word), $this->prefixes); } /** * find the next non-nickname index in parts * - * @param $parts - * @param $startIndex - * @return int|void + * @param PartArray $parts */ - protected function skipNicknameParts($parts, $startIndex) + protected function skipNicknameParts(array $parts, int $startIndex): int { $total = count($parts); for ($i = $startIndex; $i < $total; $i++) { - if (!($parts[$i] instanceof Nickname)) { + if (! ($parts[$i] instanceof Nickname)) { return $i; } } diff --git a/src/Mapper/MiddlenameMapper.php b/src/Mapper/MiddlenameMapper.php index be129b7..9a73ede 100644 --- a/src/Mapper/MiddlenameMapper.php +++ b/src/Mapper/MiddlenameMapper.php @@ -1,27 +1,26 @@ mapWithoutLastname = $mapWithoutLastname; - } + public function __construct( + protected bool $mapWithoutLastname = false, + ) {} /** - * map middlenames in the parts array - * - * @param array $parts the name parts - * @return array the mapped parts + * @param PartArray $parts + * @return PartArray */ + #[\Override] public function map(array $parts): array { // If we don't expect a lastname, match a mimimum of 2 parts @@ -33,7 +32,7 @@ public function map(array $parts): array $start = $this->findFirstMapped(Firstname::class, $parts); - if (false === $start) { + if ($start === false) { return $parts; } @@ -41,11 +40,10 @@ public function map(array $parts): array } /** - * @param $start - * @param $parts - * @return mixed + * @param PartArray $parts + * @return PartArray */ - protected function mapFrom($start, $parts): array + protected function mapFrom(int $start, array $parts): array { // If we don't expect a lastname, include the last part, // otherwise skip the last (-1) because it should be a lastname diff --git a/src/Mapper/NicknameMapper.php b/src/Mapper/NicknameMapper.php index f12867b..eb023af 100644 --- a/src/Mapper/NicknameMapper.php +++ b/src/Mapper/NicknameMapper.php @@ -1,37 +1,42 @@ */ - protected $delimiters = [ + protected array $delimiters = [ '[' => ']', '{' => '}', '(' => ')', '<' => '>', '"' => '"', - '\'' => '\'' + '\'' => '\'', ]; + /** + * @param array $delimiters + */ public function __construct(array $delimiters = []) { - if (!empty($delimiters)) { + if (! empty($delimiters)) { $this->delimiters = $delimiters; } } /** - * map nicknames in the parts array - * - * @param array $parts the name parts - * @return array the mapped parts + * @param PartArray $parts + * @return PartArray */ + #[\Override] public function map(array $parts): array { $isEncapsulated = false; @@ -51,7 +56,7 @@ public function map(array $parts): array $closingDelimiter = $this->delimiters[$matches[1]]; } - if (!$isEncapsulated) { + if (! $isEncapsulated) { continue; } @@ -66,10 +71,7 @@ public function map(array $parts): array return $parts; } - /** - * @return string - */ - protected function buildRegexp() + protected function buildRegexp(): string { $regexp = '/^(['; diff --git a/src/Mapper/SalutationMapper.php b/src/Mapper/SalutationMapper.php index 95f07c2..255e8c7 100644 --- a/src/Mapper/SalutationMapper.php +++ b/src/Mapper/SalutationMapper.php @@ -1,28 +1,28 @@ salutations = $salutations; - $this->maxIndex = $maxIndex; - } + /** + * @param array $salutations + */ + public function __construct( + protected array $salutations, + protected int $maxIndex = 0, + ) {} /** - * map salutations in the parts array - * - * @param array $parts the name parts - * @return array the mapped parts + * @param PartArray $parts + * @return PartArray */ + #[\Override] public function map(array $parts): array { $max = ($this->maxIndex > 0) ? $this->maxIndex : floor(count($parts) / 2); @@ -43,14 +43,16 @@ public function map(array $parts): array * not only single-word matches but also combined matches with * subsequent words (parts). * - * @param array $parts - * @param int $start - * @return array + * @param PartArray $parts + * @return PartArray */ protected function substituteWithSalutation(array $parts, int $start): array { - if ($this->isSalutation($parts[$start])) { - $parts[$start] = new Salutation($parts[$start], $this->salutations[$this->getKey($parts[$start])]); + $current = $parts[$start]; + + if (is_string($current) && $this->isSalutation($current)) { + $parts[$start] = new Salutation($current, $this->salutations[$this->getKey($current)]); + return $parts; } @@ -62,6 +64,7 @@ protected function substituteWithSalutation(array $parts, int $start): array if ($this->isMatchingSubset($keys, $subset)) { array_splice($parts, $start, $length, [new Salutation(implode(' ', $subset), $salutation)]); + return $parts; } } @@ -74,14 +77,16 @@ protected function substituteWithSalutation(array $parts, int $start): array * which means word by word, except that we first need to key-ify * the subset words * - * @param array $keys - * @param array $subset - * @return bool + * @param array $keys + * @param PartArray $subset + * + * @phpstan-assert-if-true array $subset */ private function isMatchingSubset(array $keys, array $subset): bool { for ($i = 0; $i < count($subset); $i++) { - if ($this->getKey($subset[$i]) !== $keys[$i]) { + $part = $subset[$i]; + if (! is_string($part) || $this->getKey($part) !== $keys[$i]) { return false; } } @@ -91,12 +96,9 @@ private function isMatchingSubset(array $keys, array $subset): bool /** * check if the given word is a viable salutation - * - * @param string $word the word to check - * @return bool */ - protected function isSalutation($word): bool + protected function isSalutation(string $word): bool { - return (array_key_exists($this->getKey($word), $this->salutations)); + return array_key_exists($this->getKey($word), $this->salutations); } } diff --git a/src/Mapper/SuffixMapper.php b/src/Mapper/SuffixMapper.php index 49206cc..7d4371a 100644 --- a/src/Mapper/SuffixMapper.php +++ b/src/Mapper/SuffixMapper.php @@ -1,35 +1,37 @@ suffixes = $suffixes; - $this->matchSinglePart = $matchSinglePart; - $this->reservedParts = $reservedParts; - } + /** + * @param array $suffixes + */ + public function __construct( + protected array $suffixes, + protected bool $matchSinglePart = false, + protected int $reservedParts = 2, + ) {} /** - * map suffixes in the parts array - * - * @param array $parts the name parts - * @return array the mapped parts + * @param PartArray $parts + * @return PartArray */ + #[\Override] public function map(array $parts): array { if ($this->isMatchingSinglePart($parts)) { - $parts[0] = new Suffix($parts[0], $this->suffixes[$this->getKey($parts[0])]); + $first = $parts[0]; + if (is_string($first)) { + $parts[0] = new Suffix($first, $this->suffixes[$this->getKey($first)]); + } + return $parts; } @@ -38,10 +40,11 @@ public function map(array $parts): array for ($k = $start; $k > $this->reservedParts - 1; $k--) { $part = $parts[$k]; - if (!$this->isSuffix($part)) { + if (! $this->isSuffix($part)) { break; } + // isSuffix() guarantees $part is a string at this point $parts[$k] = new Suffix($part, $this->suffixes[$this->getKey($part)]); } @@ -49,16 +52,15 @@ public function map(array $parts): array } /** - * @param $parts - * @return bool + * @param PartArray $parts */ - protected function isMatchingSinglePart($parts): bool + protected function isMatchingSinglePart(array $parts): bool { - if (!$this->matchSinglePart) { + if (! $this->matchSinglePart) { return false; } - if (1 !== count($parts)) { + if (count($parts) !== 1) { return false; } @@ -66,15 +68,14 @@ protected function isMatchingSinglePart($parts): bool } /** - * @param $part - * @return bool + * @phpstan-assert-if-true string $part */ - protected function isSuffix($part): bool + protected function isSuffix(AbstractPart|string $part): bool { if ($part instanceof AbstractPart) { return false; } - return (array_key_exists($this->getKey($part), $this->suffixes)); + return array_key_exists($this->getKey($part), $this->suffixes); } } diff --git a/src/Name.php b/src/Name.php index 15d2679..e7d804a 100644 --- a/src/Name.php +++ b/src/Name.php @@ -1,34 +1,30 @@ the parts that make up this name */ - protected $parts = []; + protected array $parts = []; /** * constructor takes the array of parts this name consists of * - * @param array|null $parts + * @param array|null $parts */ - public function __construct(array $parts = null) + public function __construct(?array $parts = null) { - if (null !== $parts) { + if ($parts !== null) { $this->setParts($parts); } } - /** - * @return string - */ public function __toString(): string { return implode(' ', $this->getAll(true)); @@ -37,7 +33,7 @@ public function __toString(): string /** * set the parts this name consists of * - * @param array $parts + * @param array $parts * @return $this */ public function setParts(array $parts): Name @@ -50,7 +46,7 @@ public function setParts(array $parts): Name /** * get the parts this name consists of * - * @return array + * @return array */ public function getParts(): array { @@ -58,8 +54,7 @@ public function getParts(): array } /** - * @param bool $format - * @return array + * @return array */ public function getAll(bool $format = false): array { @@ -76,9 +71,11 @@ public function getAll(bool $format = false): array foreach ($keys as $key => $args) { $method = sprintf('get%s', ucfirst($key)); - if ($value = call_user_func_array(array($this, $method), $args)) { + /** @var callable(): string $callable */ + $callable = [$this, $method]; + if ($value = $callable(...$args)) { $results[$key] = $value; - }; + } } return $results; @@ -87,8 +84,6 @@ public function getAll(bool $format = false): array /** * get the given name (first name, middle names and initials) * in the order they were entered while still applying normalisation - * - * @return string */ public function getGivenName(): string { @@ -97,8 +92,6 @@ public function getGivenName(): string /** * get the given name followed by the last name (including any prefixes) - * - * @return string */ public function getFullName(): string { @@ -107,8 +100,6 @@ public function getFullName(): string /** * get the first name - * - * @return string */ public function getFirstname(): string { @@ -117,9 +108,6 @@ public function getFirstname(): string /** * get the last name - * - * @param bool $pure - * @return string */ public function getLastname(bool $pure = false): string { @@ -128,8 +116,6 @@ public function getLastname(bool $pure = false): string /** * get the last name prefix - * - * @return string */ public function getLastnamePrefix(): string { @@ -138,8 +124,6 @@ public function getLastnamePrefix(): string /** * get the initials - * - * @return string */ public function getInitials(): string { @@ -148,8 +132,6 @@ public function getInitials(): string /** * get the suffix(es) - * - * @return string */ public function getSuffix(): string { @@ -158,8 +140,6 @@ public function getSuffix(): string /** * get the salutation(s) - * - * @return string */ public function getSalutation(): string { @@ -168,9 +148,6 @@ public function getSalutation(): string /** * get the nick name(s) - * - * @param bool $wrap - * @return string */ public function getNickname(bool $wrap = false): string { @@ -183,8 +160,6 @@ public function getNickname(bool $wrap = false): string /** * get the middle name(s) - * - * @return string */ public function getMiddlename(): string { @@ -193,10 +168,6 @@ public function getMiddlename(): string /** * helper method used by getters to extract and format relevant name parts - * - * @param string $type - * @param bool $strict - * @return string */ protected function export(string $type, bool $strict = false): string { @@ -208,16 +179,11 @@ protected function export(string $type, bool $strict = false): string } } - return implode(' ', $matched); + return implode(' ', $matched); } /** * helper method to check if a part is of the given type - * - * @param AbstractPart $part - * @param string $type - * @param bool $strict - * @return bool */ protected function isType(AbstractPart $part, string $type, bool $strict = false): bool { diff --git a/src/Parser.php b/src/Parser.php index f2040b0..736dfc0 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -1,48 +1,63 @@ */ - protected $whitespace = " \r\n\t"; + protected array $mappers = []; /** - * @var array + * @var array */ - protected $mappers = []; + protected array $languages = []; /** - * @var array + * @var array */ - protected $languages = []; + protected array $nicknameDelimiters = []; + + protected int $maxSalutationIndex = 0; + + protected int $maxCombinedInitials = 2; /** - * @var array + * memoized merge of all languages' lastname prefixes + * + * @var array|null */ - protected $nicknameDelimiters = []; + private ?array $prefixes = null; /** - * @var int + * memoized merge of all languages' suffixes + * + * @var array|null */ - protected $maxSalutationIndex = 0; + private ?array $suffixes = null; /** - * @var int + * memoized merge of all languages' salutations + * + * @var array|null */ - protected $maxCombinedInitials = 2; + private ?array $salutations = null; + /** + * @param array $languages + */ public function __construct(array $languages = []) { if (empty($languages)) { @@ -59,17 +74,14 @@ public function __construct(array $languages = []) * - middle initials * - surname / last name * - suffix (II, Phd, Jr, etc) - * - * @param string $name - * @return Name */ - public function parse($name): Name + public function parse(string $name): Name { $name = $this->normalize($name); $segments = explode(',', $name); - if (1 < count($segments)) { + if (count($segments) > 1) { return $this->parseSplitName($segments[0], $segments[1], $segments[2] ?? ''); } @@ -84,13 +96,8 @@ public function parse($name): Name /** * handles split-parsing of comma-separated name parts - * - * @param $left - the name part left of the comma - * @param $right - the name part right of the comma - * - * @return Name */ - protected function parseSplitName($first, $second, $third): Name + protected function parseSplitName(string $first, string $second, string $third): Name { $parts = array_merge( $this->getFirstSegmentParser()->parse($first)->getParts(), @@ -101,9 +108,6 @@ protected function parseSplitName($first, $second, $third): Name return new Name($parts); } - /** - * @return Parser - */ protected function getFirstSegmentParser(): Parser { $parser = new Parser(); @@ -119,9 +123,6 @@ protected function getFirstSegmentParser(): Parser return $parser; } - /** - * @return Parser - */ protected function getSecondSegmentParser(): Parser { $parser = new Parser(); @@ -152,7 +153,7 @@ protected function getThirdSegmentParser(): Parser /** * get the mappers for this parser * - * @return array + * @return array */ public function getMappers(): array { @@ -174,8 +175,7 @@ public function getMappers(): array /** * set the mappers for this parser * - * @param array $mappers - * @return Parser + * @param array $mappers */ public function setMappers(array $mappers): Parser { @@ -186,9 +186,6 @@ public function setMappers(array $mappers): Parser /** * normalize the name - * - * @param string $name - * @return string */ protected function normalize(string $name): string { @@ -196,13 +193,13 @@ protected function normalize(string $name): string $name = trim($name); - return preg_replace('/[' . preg_quote($whitespace) . ']+/', ' ', $name); + // preg_replace returns null on regex compile error; user-set whitespace + // characters might produce an invalid pattern, so fall back to the input. + return preg_replace('/[' . preg_quote($whitespace, '/') . ']+/', ' ', $name) ?? $name; } /** * get a string of characters that are supposed to be treated as whitespace - * - * @return string */ public function getWhitespace(): string { @@ -211,11 +208,8 @@ public function getWhitespace(): string /** * set the string of characters that are supposed to be treated as whitespace - * - * @param $whitespace - * @return Parser */ - public function setWhitespace($whitespace): Parser + public function setWhitespace(string $whitespace): Parser { $this->whitespace = $whitespace; @@ -223,52 +217,46 @@ public function setWhitespace($whitespace): Parser } /** - * @return array + * @return array */ - protected function getPrefixes() + protected function getPrefixes(): array { - $prefixes = []; - - /** @var LanguageInterface $language */ - foreach ($this->languages as $language) { - $prefixes += $language->getLastnamePrefixes(); - } - - return $prefixes; + return $this->prefixes ??= $this->mergeFromLanguages('getLastnamePrefixes'); } /** - * @return array + * @return array */ - protected function getSuffixes() + protected function getSuffixes(): array { - $suffixes = []; - - /** @var LanguageInterface $language */ - foreach ($this->languages as $language) { - $suffixes += $language->getSuffixes(); - } + return $this->suffixes ??= $this->mergeFromLanguages('getSuffixes'); + } - return $suffixes; + /** + * @return array + */ + protected function getSalutations(): array + { + return $this->salutations ??= $this->mergeFromLanguages('getSalutations'); } /** - * @return array + * @param 'getSuffixes'|'getSalutations'|'getLastnamePrefixes' $method + * @return array */ - protected function getSalutations() + private function mergeFromLanguages(string $method): array { - $salutations = []; + $merged = []; - /** @var LanguageInterface $language */ foreach ($this->languages as $language) { - $salutations += $language->getSalutations(); + $merged += $language->$method(); } - return $salutations; + return $merged; } /** - * @return array + * @return array */ public function getNicknameDelimiters(): array { @@ -276,8 +264,7 @@ public function getNicknameDelimiters(): array } /** - * @param array $nicknameDelimiters - * @return Parser + * @param array $nicknameDelimiters */ public function setNicknameDelimiters(array $nicknameDelimiters): Parser { @@ -286,18 +273,11 @@ public function setNicknameDelimiters(array $nicknameDelimiters): Parser return $this; } - /** - * @return int - */ public function getMaxSalutationIndex(): int { return $this->maxSalutationIndex; } - /** - * @param int $maxSalutationIndex - * @return Parser - */ public function setMaxSalutationIndex(int $maxSalutationIndex): Parser { $this->maxSalutationIndex = $maxSalutationIndex; @@ -305,18 +285,11 @@ public function setMaxSalutationIndex(int $maxSalutationIndex): Parser return $this; } - /** - * @return int - */ public function getMaxCombinedInitials(): int { return $this->maxCombinedInitials; } - /** - * @param int $maxCombinedInitials - * @return Parser - */ public function setMaxCombinedInitials(int $maxCombinedInitials): Parser { $this->maxCombinedInitials = $maxCombinedInitials; diff --git a/src/Part/AbstractPart.php b/src/Part/AbstractPart.php index 51e6372..60cd14e 100644 --- a/src/Part/AbstractPart.php +++ b/src/Part/AbstractPart.php @@ -1,20 +1,18 @@ setValue($value); } @@ -22,11 +20,8 @@ public function __construct($value) /** * set the value to wrap * (can take string or part instance) - * - * @param string|AbstractPart $value - * @return $this */ - public function setValue($value): AbstractPart + public function setValue(string|AbstractPart $value): static { if ($value instanceof AbstractPart) { $value = $value->getValue(); @@ -39,8 +34,6 @@ public function setValue($value): AbstractPart /** * get the wrapped value - * - * @return string */ public function getValue(): string { @@ -49,8 +42,6 @@ public function getValue(): string /** * get the normalized value - * - * @return string */ public function normalize(): string { @@ -60,31 +51,28 @@ public function normalize(): string /** * helper for camelization of values * to be used during normalize - * - * @param $word - * @return mixed */ - protected function camelcase($word): string + protected function camelcase(string $word): string { if (preg_match('/\p{L}(\p{Lu}*\p{Ll}\p{Ll}*\p{Lu}|\p{Ll}*\p{Lu}\p{Lu}*\p{Ll})\p{L}*/u', $word)) { return $word; } - return preg_replace_callback('/[\p{L}0-9]+/ui', [$this, 'camelcaseReplace'], $word); + // preg_replace_callback returns null on regex error; fall back to the input. + return preg_replace_callback('/[\p{L}0-9]+/ui', $this->camelcaseReplace(...), $word) ?? $word; } /** * camelcasing callback * - * @param $matches - * @return string + * @param array $matches */ - protected function camelcaseReplace($matches): string + protected function camelcaseReplace(array $matches): string { if (function_exists('mb_convert_case')) { return mb_convert_case($matches[0], MB_CASE_TITLE, 'UTF-8'); } - + return ucfirst(strtolower($matches[0])); } } diff --git a/src/Part/Firstname.php b/src/Part/Firstname.php index 1c7399a..d5a24f4 100644 --- a/src/Part/Firstname.php +++ b/src/Part/Firstname.php @@ -1,7 +1,5 @@ getValue()); diff --git a/src/Part/Lastname.php b/src/Part/Lastname.php index 8bc70bc..e24946e 100644 --- a/src/Part/Lastname.php +++ b/src/Part/Lastname.php @@ -1,7 +1,5 @@ normalized = $normalized ?? $value; @@ -16,9 +16,8 @@ public function __construct(string $value, string $normalized = null) /** * if this is a lastname prefix, look up normalized version from registry * otherwise camelcase the lastname - * - * @return string */ + #[\Override] public function normalize(): string { return $this->normalized; diff --git a/src/Part/Middlename.php b/src/Part/Middlename.php index 7f1f034..de7060d 100644 --- a/src/Part/Middlename.php +++ b/src/Part/Middlename.php @@ -1,7 +1,5 @@ camelcase($this->getValue()); diff --git a/src/Part/Nickname.php b/src/Part/Nickname.php index 07798d6..c7425f6 100644 --- a/src/Part/Nickname.php +++ b/src/Part/Nickname.php @@ -1,14 +1,13 @@ camelcase($this->getValue()); diff --git a/src/Part/PreNormalizedPart.php b/src/Part/PreNormalizedPart.php index cc5128c..395bc9d 100644 --- a/src/Part/PreNormalizedPart.php +++ b/src/Part/PreNormalizedPart.php @@ -1,12 +1,12 @@ normalized = $normalized ?? $value; @@ -16,9 +16,8 @@ public function __construct(string $value, string $normalized = null) /** * if this is a lastname prefix, look up normalized version from registry * otherwise camelcase the lastname - * - * @return string */ + #[\Override] public function normalize(): string { return $this->normalized; diff --git a/src/Part/Salutation.php b/src/Part/Salutation.php index f277ff3..04ae606 100644 --- a/src/Part/Salutation.php +++ b/src/Part/Salutation.php @@ -1,8 +1,5 @@ }> */ - public function provider() + public static function provider(): array { return [ [ @@ -18,7 +21,7 @@ public function provider() [ 'salutation' => 'Herr', 'lastname' => 'Schmidt', - ] + ], ], [ 'Frau Maria Lange', @@ -26,7 +29,7 @@ public function provider() 'salutation' => 'Frau', 'firstname' => 'Maria', 'lastname' => 'Lange', - ] + ], ], [ 'Hr. Juergen von der Lippe', @@ -34,7 +37,7 @@ public function provider() 'salutation' => 'Herr', 'firstname' => 'Juergen', 'lastname' => 'von der Lippe', - ] + ], ], [ 'Fr. Charlotte von Stein', @@ -42,21 +45,19 @@ public function provider() 'salutation' => 'Frau', 'firstname' => 'Charlotte', 'lastname' => 'von Stein', - ] + ], ], ]; } /** - * @dataProvider provider - * - * @param $input - * @param $expectation + * @param array $expectation */ - public function testParse($input, $expectation) + #[DataProvider('provider')] + public function testParse(string $input, array $expectation): void { $parser = new Parser([ - new German() + new German(), ]); $name = $parser->parse($input); diff --git a/tests/Mapper/AbstractMapperTest.php b/tests/Mapper/AbstractMapperTest.php deleted file mode 100644 index 915beba..0000000 --- a/tests/Mapper/AbstractMapperTest.php +++ /dev/null @@ -1,23 +0,0 @@ -assertEquals($expectation, $mapper->map($input)); - } - - abstract protected function getMapper(); -} diff --git a/tests/Mapper/AbstractMapperTestCase.php b/tests/Mapper/AbstractMapperTestCase.php new file mode 100644 index 0000000..ea6c4db --- /dev/null +++ b/tests/Mapper/AbstractMapperTestCase.php @@ -0,0 +1,26 @@ + $input + * @param array $expectation + * @param array $arguments + */ + #[DataProvider('provider')] + public function testMap(array $input, array $expectation, array $arguments = []): void + { + $mapper = $this->getMapper(...$arguments); + + $this->assertEquals($expectation, $mapper->map($input)); + } + + abstract protected function getMapper(): AbstractMapper; +} diff --git a/tests/Mapper/FirstnameMapperTest.php b/tests/Mapper/FirstnameMapperTest.php index cf9defb..92fd790 100644 --- a/tests/Mapper/FirstnameMapperTest.php +++ b/tests/Mapper/FirstnameMapperTest.php @@ -1,17 +1,18 @@ > */ - public function provider() + public static function provider(): array { return [ [ @@ -56,12 +57,12 @@ public function provider() 'expectation' => [ new Firstname('Alfonso'), new Salutation('Mr'), - ] - ] + ], + ], ]; } - protected function getMapper() + protected function getMapper(): FirstnameMapper { return new FirstnameMapper(); } diff --git a/tests/Mapper/InitialMapperTest.php b/tests/Mapper/InitialMapperTest.php index 92448f6..af7f7ac 100644 --- a/tests/Mapper/InitialMapperTest.php +++ b/tests/Mapper/InitialMapperTest.php @@ -1,18 +1,18 @@ > */ - public function provider() + public static function provider(): array { return [ [ @@ -54,17 +54,17 @@ public function provider() [ 'input' => [ 'James', - 'B' + 'B', ], 'expectation' => [ 'James', - 'B' + 'B', ], ], [ 'input' => [ 'James', - 'B' + 'B', ], 'expectation' => [ 'James', @@ -72,7 +72,7 @@ public function provider() ], 'arguments' => [ 2, - true + true, ], ], [ @@ -83,8 +83,8 @@ public function provider() 'expectation' => [ new Initial('J'), new Initial('M'), - 'Walker' - ] + 'Walker', + ], ], [ 'input' => [ @@ -93,16 +93,16 @@ public function provider() ], 'expectation' => [ 'JM', - 'Walker' + 'Walker', ], 'arguments' => [ - 1 - ] - ] + 1, + ], + ], ]; } - protected function getMapper($maxCombined = 2, $matchLastPart = false) + protected function getMapper(int $maxCombined = 2, bool $matchLastPart = false): InitialMapper { return new InitialMapper($maxCombined, $matchLastPart); } diff --git a/tests/Mapper/LastnameMapperTest.php b/tests/Mapper/LastnameMapperTest.php index 4c9b746..60235a2 100644 --- a/tests/Mapper/LastnameMapperTest.php +++ b/tests/Mapper/LastnameMapperTest.php @@ -1,19 +1,20 @@ > */ - public function provider() + public static function provider(): array { return [ [ @@ -98,10 +99,10 @@ public function provider() ], [ 'input' => [ - 'Kirk' + 'Kirk', ], 'expectation' => [ - 'Kirk' + 'Kirk', ], ], [ @@ -112,13 +113,13 @@ public function provider() new Lastname('Kirk'), ], 'arguments' => [ - true + true, ], - ] + ], ]; } - protected function getMapper($matchSingle = false) + protected function getMapper(bool $matchSingle = false): LastnameMapper { $english = new English(); diff --git a/tests/Mapper/MiddlenameMapperTest.php b/tests/Mapper/MiddlenameMapperTest.php index a301159..1a33fbc 100644 --- a/tests/Mapper/MiddlenameMapperTest.php +++ b/tests/Mapper/MiddlenameMapperTest.php @@ -1,18 +1,18 @@ > */ - public function provider() + public static function provider(): array { return [ [ @@ -87,13 +87,13 @@ public function provider() new Middlename('Tiberius'), ], 'arguments' => [ - true + true, ], ], ]; } - protected function getMapper($mapWithoutLastname = false) + protected function getMapper(bool $mapWithoutLastname = false): MiddlenameMapper { return new MiddlenameMapper($mapWithoutLastname); } diff --git a/tests/Mapper/NicknameMapperTest.php b/tests/Mapper/NicknameMapperTest.php index 592cf27..71bb786 100644 --- a/tests/Mapper/NicknameMapperTest.php +++ b/tests/Mapper/NicknameMapperTest.php @@ -1,16 +1,17 @@ > */ - public function provider() + public static function provider(): array { return [ [ @@ -109,7 +110,7 @@ public function provider() ]; } - protected function getMapper() + protected function getMapper(): NicknameMapper { return new NicknameMapper([ '[' => ']', @@ -117,7 +118,7 @@ protected function getMapper() '(' => ')', '<' => '>', '"' => '"', - '\'' => '\'' + '\'' => '\'', ]); } } diff --git a/tests/Mapper/SalutationMapperTest.php b/tests/Mapper/SalutationMapperTest.php index fd35c84..b6d0d3c 100644 --- a/tests/Mapper/SalutationMapperTest.php +++ b/tests/Mapper/SalutationMapperTest.php @@ -1,18 +1,18 @@ > */ - public function provider() + public static function provider(): array { return [ [ @@ -52,7 +52,7 @@ public function provider() ]; } - protected function getMapper() + protected function getMapper(): SalutationMapper { $english = new English(); diff --git a/tests/Mapper/SuffixMapperTest.php b/tests/Mapper/SuffixMapperTest.php index 629aa64..6add4ce 100644 --- a/tests/Mapper/SuffixMapperTest.php +++ b/tests/Mapper/SuffixMapperTest.php @@ -1,18 +1,19 @@ > */ - public function provider() + public static function provider(): array { return [ [ @@ -28,10 +29,10 @@ public function provider() 'Blueberg', new Suffix('PhD'), ], - [ + 'arguments' => [ 'matchSinglePart' => false, 'reservedParts' => 2, - ] + ], ], [ 'input' => [ @@ -44,10 +45,10 @@ public function provider() 'Alfred', new Suffix('III'), ], - [ + 'arguments' => [ 'matchSinglePart' => false, 'reservedParts' => 2, - ] + ], ], [ 'input' => [ @@ -60,10 +61,10 @@ public function provider() new Lastname('Smith'), new Suffix('Senior'), ], - [ + 'arguments' => [ 'matchSinglePart' => false, 'reservedParts' => 2, - ] + ], ], [ 'input' => [ @@ -76,10 +77,10 @@ public function provider() new Firstname('James'), 'Norrington', ], - [ + 'arguments' => [ 'matchSinglePart' => false, 'reservedParts' => 2, - ] + ], ], [ 'input' => [ @@ -92,10 +93,10 @@ public function provider() new Firstname('James'), new Lastname('Norrington'), ], - [ + 'arguments' => [ 'matchSinglePart' => false, 'reservedParts' => 2, - ] + ], ], [ 'input' => [ @@ -108,10 +109,10 @@ public function provider() 'Norrington', new Suffix('Senior'), ], - [ + 'arguments' => [ false, 2, - ] + ], ], [ 'input' => [ @@ -122,10 +123,10 @@ public function provider() 'Norrington', 'Senior', ], - [ + 'arguments' => [ false, 2, - ] + ], ], [ 'input' => [ @@ -136,10 +137,10 @@ public function provider() new Lastname('Norrington'), new Suffix('Senior'), ], - [ + 'arguments' => [ false, 1, - ] + ], ], [ 'input' => [ @@ -148,14 +149,14 @@ public function provider() 'expectation' => [ new Suffix('Senior'), ], - [ + 'arguments' => [ true, - ] + ], ], ]; } - protected function getMapper($matchSinglePart = false, $reservedParts = 2) + protected function getMapper(bool $matchSinglePart = false, int $reservedParts = 2): SuffixMapper { $english = new English(); diff --git a/tests/NameTest.php b/tests/NameTest.php index b9f2730..37190e2 100644 --- a/tests/NameTest.php +++ b/tests/NameTest.php @@ -1,20 +1,22 @@ assertSame('Mr. James (Jim) Morgan T. Smith I', (string) $name); } - public function testGetNickname() + public function testGetNickname(): void { $name = new Name([ new Nickname('Jim'), @@ -42,7 +44,7 @@ public function testGetNickname() $this->assertSame('(Jim)', $name->getNickname(true)); } - public function testGettingLastnameAndLastnamePrefixSeparately() + public function testGettingLastnameAndLastnamePrefixSeparately(): void { $name = new Name([ new Firstname('Frank'), diff --git a/tests/ParserTest.php b/tests/ParserTest.php index 05e79ca..d148157 100644 --- a/tests/ParserTest.php +++ b/tests/ParserTest.php @@ -1,17 +1,19 @@ }> */ - public function provider() + public static function provider(): array { return [ [ @@ -19,7 +21,7 @@ public function provider() [ 'firstname' => 'James', 'lastname' => 'Norrington', - ] + ], ], [ @@ -28,7 +30,7 @@ public function provider() 'firstname' => 'Hans', 'lastname' => 'Anderssen', 'middlename' => 'Christian', - ] + ], ], [ 'Mr Anthony R Von Fange III', @@ -38,7 +40,7 @@ public function provider() 'initials' => 'R', 'lastname' => 'von Fange', 'suffix' => 'III', - ] + ], ], [ 'J. B. Hunt', @@ -46,7 +48,7 @@ public function provider() 'firstname' => 'J.', 'initials' => 'B.', 'lastname' => 'Hunt', - ] + ], ], [ 'J.B. Hunt', @@ -54,23 +56,23 @@ public function provider() 'firstname' => 'J', 'initials' => 'B', 'lastname' => 'Hunt', - ] + ], ], [ 'Edward Senior III', [ 'firstname' => 'Edward', 'lastname' => 'Senior', - 'suffix' => 'III' - ] + 'suffix' => 'III', + ], ], [ 'Edward Dale Senior II', [ 'firstname' => 'Edward', 'lastname' => 'Dale', - 'suffix' => 'Senior II' - ] + 'suffix' => 'Senior II', + ], ], [ 'Dale Edward Jones Senior', @@ -78,30 +80,30 @@ public function provider() 'firstname' => 'Dale', 'middlename' => 'Edward', 'lastname' => 'Jones', - 'suffix' => 'Senior' - ] + 'suffix' => 'Senior', + ], ], [ 'Jason Rodriguez Sr.', [ 'firstname' => 'Jason', 'lastname' => 'Rodriguez', - 'suffix' => 'Sr' - ] + 'suffix' => 'Sr', + ], ], [ 'Jason Senior', [ 'firstname' => 'Jason', 'lastname' => 'Senior', - ] + ], ], [ 'Bill Junior', [ 'firstname' => 'Bill', 'lastname' => 'Junior', - ] + ], ], [ 'Sara Ann Fraser', @@ -109,34 +111,34 @@ public function provider() 'firstname' => 'Sara', 'middlename' => 'Ann', 'lastname' => 'Fraser', - ] + ], ], [ 'Adam', [ 'firstname' => 'Adam', - ] + ], ], [ 'OLD MACDONALD', [ 'firstname' => 'Old', 'lastname' => 'Macdonald', - ] + ], ], [ 'Old MacDonald', [ 'firstname' => 'Old', 'lastname' => 'MacDonald', - ] + ], ], [ 'Old McDonald', [ 'firstname' => 'Old', 'lastname' => 'McDonald', - ] + ], ], [ 'Old Mc Donald', @@ -144,7 +146,7 @@ public function provider() 'firstname' => 'Old', 'middlename' => 'Mc', 'lastname' => 'Donald', - ] + ], ], [ 'Old Mac Donald', @@ -152,14 +154,14 @@ public function provider() 'firstname' => 'Old', 'middlename' => 'Mac', 'lastname' => 'Donald', - ] + ], ], [ 'James van Allen', [ 'firstname' => 'James', 'lastname' => 'van Allen', - ] + ], ], [ 'Jimmy (Bubba) Smith', @@ -167,7 +169,7 @@ public function provider() 'firstname' => 'Jimmy', 'lastname' => 'Smith', 'nickname' => 'Bubba', - ] + ], ], [ 'Miss Jennifer Shrader Lawrence', @@ -176,7 +178,7 @@ public function provider() 'firstname' => 'Jennifer', 'middlename' => 'Shrader', 'lastname' => 'Lawrence', - ] + ], ], [ 'Dr. Jonathan Smith', @@ -184,7 +186,7 @@ public function provider() 'salutation' => 'Dr.', 'firstname' => 'Jonathan', 'lastname' => 'Smith', - ] + ], ], [ 'Ms. Jamie P. Harrowitz', @@ -193,7 +195,7 @@ public function provider() 'firstname' => 'Jamie', 'initials' => 'P.', 'lastname' => 'Harrowitz', - ] + ], ], [ 'Mr John Doe', @@ -201,7 +203,7 @@ public function provider() 'salutation' => 'Mr.', 'firstname' => 'John', 'lastname' => 'Doe', - ] + ], ], [ 'Rev. Dr John Doe', @@ -209,7 +211,7 @@ public function provider() 'salutation' => 'Rev. Dr.', 'firstname' => 'John', 'lastname' => 'Doe', - ] + ], ], [ 'Prof. Tyson J. Hirthe', @@ -218,7 +220,7 @@ public function provider() 'lastname' => 'Hirthe', 'firstname' => 'Tyson', 'initials' => 'J.', - ] + ], ], [ 'prof Eveline Aufderhar', @@ -226,23 +228,23 @@ public function provider() 'salutation' => 'Prof.', 'lastname' => 'Aufderhar', 'firstname' => 'Eveline', - ] + ], ], [ 'Anthony Von Fange III', [ 'firstname' => 'Anthony', 'lastname' => 'von Fange', - 'suffix' => 'III' - ] + 'suffix' => 'III', + ], ], [ 'Smarty Pants Phd', [ 'firstname' => 'Smarty', 'lastname' => 'Pants', - 'suffix' => 'PhD' - ] + 'suffix' => 'PhD', + ], ], [ 'Mark Peter Williams', @@ -250,7 +252,7 @@ public function provider() 'firstname' => 'Mark', 'middlename' => 'Peter', 'lastname' => 'Williams', - ] + ], ], [ 'Mark P Williams', @@ -258,7 +260,7 @@ public function provider() 'firstname' => 'Mark', 'lastname' => 'Williams', 'initials' => 'P', - ] + ], ], [ 'Mark P. Williams', @@ -266,7 +268,7 @@ public function provider() 'firstname' => 'Mark', 'initials' => 'P.', 'lastname' => 'Williams', - ] + ], ], [ 'M Peter Williams', @@ -274,7 +276,7 @@ public function provider() 'firstname' => 'Peter', 'initials' => 'M', 'lastname' => 'Williams', - ] + ], ], [ 'M. Peter Williams', @@ -282,7 +284,7 @@ public function provider() 'firstname' => 'Peter', 'initials' => 'M.', 'lastname' => 'Williams', - ] + ], ], [ 'M. P. Williams', @@ -290,7 +292,7 @@ public function provider() 'firstname' => 'M.', 'initials' => 'P.', 'lastname' => 'Williams', - ] + ], ], [ 'The Rev. Mark Williams', @@ -298,7 +300,7 @@ public function provider() 'salutation' => 'Rev.', 'firstname' => 'Mark', 'lastname' => 'Williams', - ] + ], ], [ 'Mister Mark Williams', @@ -306,14 +308,14 @@ public function provider() 'salutation' => 'Mr.', 'firstname' => 'Mark', 'lastname' => 'Williams', - ] + ], ], [ 'Fraser, Joshua', [ 'firstname' => 'Joshua', 'lastname' => 'Fraser', - ] + ], ], [ 'Mrs. Brown, Amanda', @@ -321,7 +323,7 @@ public function provider() 'salutation' => 'Mrs.', 'firstname' => 'Amanda', 'lastname' => 'Brown', - ] + ], ], [ "Mr.\r\nPaul\rJoseph\nMaria\tWinters", @@ -330,7 +332,7 @@ public function provider() 'firstname' => 'Paul', 'middlename' => 'Joseph Maria', 'lastname' => 'Winters', - ] + ], ], [ 'Van Truong', @@ -359,8 +361,8 @@ public function provider() [ 'firstname' => 'Anthony', 'lastname' => 'von Fange', - 'suffix' => 'III PhD' - ] + 'suffix' => 'III PhD', + ], ], [ 'Jimmy (Bubba Junior) Smith', @@ -368,15 +370,15 @@ public function provider() 'nickname' => 'Bubba Junior', 'firstname' => 'Jimmy', 'lastname' => 'Smith', - ] + ], ], [ 'Jonathan Smith, MD', [ 'firstname' => 'Jonathan', 'lastname' => 'Smith', - 'suffix' => 'MD' - ] + 'suffix' => 'MD', + ], ], [ 'Kirk, James T.', @@ -391,7 +393,7 @@ public function provider() [ 'firstname' => 'James', 'lastname' => 'B', - ] + ], ], [ 'Williams, Hank, Jr.', @@ -399,7 +401,7 @@ public function provider() 'firstname' => 'Hank', 'lastname' => 'Williams', 'suffix' => 'Jr', - ] + ], ], [ 'Sir James Reynolds, Junior', @@ -407,8 +409,8 @@ public function provider() 'salutation' => 'Sir', 'firstname' => 'James', 'lastname' => 'Reynolds', - 'suffix' => 'Junior' - ] + 'suffix' => 'Junior', + ], ], [ 'Sir John Paul Getty Sr.', @@ -418,29 +420,29 @@ public function provider() 'middlename' => 'Paul', 'lastname' => 'Getty', 'suffix' => 'Sr', - ] + ], ], [ 'etna übel', [ 'firstname' => 'Etna', 'lastname' => 'Übel', - ] + ], ], [ 'Markus Müller', [ 'firstname' => 'Markus', 'lastname' => 'Müller', - ] + ], ], [ 'Charles Dixon (20th century)', [ 'firstname' => 'Charles', 'lastname' => 'Dixon', - 'nickname' => '20Th Century' - ] + 'nickname' => '20Th Century', + ], ], [ 'Smith, John Eric', @@ -448,7 +450,7 @@ public function provider() 'lastname' => 'Smith', 'firstname' => 'John', 'middlename' => 'Eric', - ] + ], ], [ 'PAUL M LEWIS MR', @@ -456,7 +458,7 @@ public function provider() 'firstname' => 'Paul', 'initials' => 'M', 'lastname' => 'Lewis Mr', - ] + ], ], [ 'SUJAN MASTER', @@ -471,7 +473,7 @@ public function provider() 'firstname' => 'James', 'initials' => 'J', 'lastname' => 'Ma', - ] + ], ], [ 'Tiptree, James, Jr.', @@ -479,7 +481,7 @@ public function provider() 'lastname' => 'Tiptree', 'firstname' => 'James', 'suffix' => 'Jr', - ] + ], ], [ 'Miller, Walter M., Jr.', @@ -488,7 +490,7 @@ public function provider() 'firstname' => 'Walter', 'initials' => 'M.', 'suffix' => 'Jr', - ] + ], ], [ 'Tiptree, James Jr.', @@ -496,7 +498,7 @@ public function provider() 'lastname' => 'Tiptree', 'firstname' => 'James', 'suffix' => 'Jr', - ] + ], ], [ 'Miller, Walter M. Jr.', @@ -505,7 +507,7 @@ public function provider() 'firstname' => 'Walter', 'initials' => 'M.', 'suffix' => 'Jr', - ] + ], ], [ 'Thái Quốc Nguyễn', @@ -513,28 +515,28 @@ public function provider() 'lastname' => 'Nguyễn', 'middlename' => 'Quốc', 'firstname' => 'Thái', - ] + ], ], [ 'Yumeng Du', [ 'lastname' => 'Du', 'firstname' => 'Yumeng', - ] + ], ], [ 'Her Honour Mrs Judy', [ 'lastname' => 'Judy', - 'salutation' => 'Her Honour Mrs.' - ] + 'salutation' => 'Her Honour Mrs.', + ], ], [ 'Etje Heijdanus-De Boer', [ 'firstname' => 'Etje', 'lastname' => 'Heijdanus-De Boer', - ] + ], ], [ 'JB Hunt', @@ -542,7 +544,7 @@ public function provider() 'firstname' => 'J', 'initials' => 'B', 'lastname' => 'Hunt', - ] + ], ], [ 'Charles Philip Arthur George Mountbatten-Windsor', @@ -550,7 +552,7 @@ public function provider() 'firstname' => 'Charles', 'middlename' => 'Philip Arthur George', 'lastname' => 'Mountbatten-Windsor', - ] + ], ], [ 'Ella Marija Lani Yelich-O\'Connor', @@ -558,18 +560,16 @@ public function provider() 'firstname' => 'Ella', 'middlename' => 'Marija Lani', 'lastname' => 'Yelich-O\'Connor', - ] - ] + ], + ], ]; } /** - * @dataProvider provider - * - * @param $input - * @param $expectation + * @param array $expectation */ - public function testParse($input, $expectation) + #[DataProvider('provider')] + public function testParse(string $input, array $expectation): void { $parser = new Parser(); $name = $parser->parse($input); @@ -578,7 +578,7 @@ public function testParse($input, $expectation) $this->assertEquals($expectation, $name->getAll()); } - public function testSetGetWhitespace() + public function testSetGetWhitespace(): void { $parser = new Parser(); $parser->setWhitespace('abc'); @@ -589,7 +589,7 @@ public function testSetGetWhitespace() $this->assertSame(' _', $parser->getWhitespace()); } - public function testSetGetNicknameDelimiters() + public function testSetGetNicknameDelimiters(): void { $parser = new Parser(); $parser->setNicknameDelimiters(['[' => ']']); @@ -598,7 +598,7 @@ public function testSetGetNicknameDelimiters() $this->assertNotSame('Jim', $parser->parse('(Jim)')->getNickname()); } - public function testSetMaxSalutationIndex() + public function testSetMaxSalutationIndex(): void { $parser = new Parser(); $this->assertSame(0, $parser->getMaxSalutationIndex()); @@ -613,7 +613,7 @@ public function testSetMaxSalutationIndex() $this->assertSame('Mr.', $parser->parse('Francis Mr')->getSalutation()); } - public function testSetMaxCombinedInitials() + public function testSetMaxCombinedInitials(): void { $parser = new Parser(); $this->assertSame(2, $parser->getMaxCombinedInitials()); @@ -628,7 +628,7 @@ public function testSetMaxCombinedInitials() $this->assertSame('P A G', $parser->parse('Charles PAG Mountbatten-Windsor')->getInitials()); } - public function testParserAndSubparsersProperlyHandleLanguages() + public function testParserAndSubparsersProperlyHandleLanguages(): void { $parser = new Parser([ new German(), diff --git a/tests/Part/AbstractPartTest.php b/tests/Part/AbstractPartTest.php index 83623c5..1982b6a 100644 --- a/tests/Part/AbstractPartTest.php +++ b/tests/Part/AbstractPartTest.php @@ -1,29 +1,24 @@ getMockForAbstractClass(AbstractPart::class, ['abc']); + $part = new class ('abc') extends AbstractPart {}; $this->assertEquals('abc', $part->normalize()); } - /** - * make sure we unwrap any parts during setValue() calls - */ - public function testSetValueUnwraps() + public function testSetValueUnwraps(): void { - $part = $this->getMockForAbstractClass(AbstractPart::class, ['abc']); + $part = new class ('abc') extends AbstractPart {}; $this->assertEquals('abc', $part->getValue()); - $part = $this->getMockForAbstractClass(AbstractPart::class, [$part]); - $this->assertEquals('abc', $part->getValue()); + $wrapped = new class ($part) extends AbstractPart {}; + $this->assertEquals('abc', $wrapped->getValue()); } } diff --git a/tests/Part/NormalisationTest.php b/tests/Part/NormalisationTest.php index addf720..6375620 100644 --- a/tests/Part/NormalisationTest.php +++ b/tests/Part/NormalisationTest.php @@ -1,7 +1,9 @@ getFunctionMock(__NAMESPACE__, 'function_exists'); $functionExistsMock->expects($this->any()) @@ -36,12 +43,12 @@ public function testCamelcasingWorksWithMbString() $part = new Lastname('nguyễn'); $this->assertEquals('Nguyễn', $part->normalize()); - } + } /** * make sure we test both with and without mb_string support */ - public function testCamelcasingWorksWithoutMbString() + public function testCamelcasingWorksWithoutMbString(): void { $functionExistsMock = $this->getFunctionMock(__NAMESPACE__, 'function_exists'); $functionExistsMock->expects($this->any()) diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 973f8b5..ebf2d4f 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,7 +1,3 @@