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 @@