diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d602971..30d7984 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,39 +1,43 @@
name: Continuous Integration
-on: [push]
+on:
+ - push
jobs:
- run:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- php-versions:
- - '7.4'
- - '8.0'
- - '8.1'
- - '8.2'
- name: PHP ${{ matrix.php-versions }}
- steps:
- - uses: actions/checkout@v2
-
- - name: Setup PHP
- uses: shivammathur/setup-php@v2
- with:
- php-version: ${{ matrix.php-versions }}
- coverage: none
- tools: composer:v1
-
- - name: Validate composer.json and composer.lock
- run: composer validate
-
- - name: Install dependencies
- run: composer update --prefer-dist --no-progress --no-suggest
-
- - name: Run PHPUnit
- run: vendor/bin/phpunit
-
- - name: Run PHPCS
- run: ./vendor/bin/phpcs -s --runtime-set ignore_warnings_on_exit 1
-
- - name: Run Psalm
- run: vendor/bin/psalm
+ run:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ php-versions:
+ - '7.4'
+ - '8.0'
+ - '8.1'
+ - '8.2'
+ - '8.3'
+ name: PHP ${{ matrix.php-versions }}
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php-versions }}
+ coverage: none
+
+ - name: Validate composer.json and composer.lock
+ run: composer validate
+
+ - name: Install dependencies
+ uses: ramsey/composer-install@v3
+ with:
+ dependency-versions: highest
+ composer-options: "--prefer-dist"
+
+ - name: Run PHPUnit
+ run: vendor/bin/phpunit
+
+ - name: Run PHPCS
+ run: ./vendor/bin/phpcs -s --runtime-set ignore_warnings_on_exit 1
+
+ - name: Run Psalm
+ run: vendor/bin/psalm
diff --git a/.idea/codeception.xml b/.idea/codeception.xml
new file mode 100644
index 0000000..330f2dd
--- /dev/null
+++ b/.idea/codeception.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/php.xml b/.idea/php.xml
index 8bdb7ab..840938c 100644
--- a/.idea/php.xml
+++ b/.idea/php.xml
@@ -1,5 +1,15 @@
+
+
+
+
+
+
+
+
+
+
@@ -211,10 +221,13 @@
+
+
+
-
+
diff --git a/.idea/phpspec.xml b/.idea/phpspec.xml
new file mode 100644
index 0000000..ec7e1d4
--- /dev/null
+++ b/.idea/phpspec.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3193aff..69603e9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Missing return types causing warnings with PHP 8.1 and higher.
- Static check issues.
+### Added
+- Service tagging capability (#28).
+
## [0.1.4] -2021-10-06
Stable release.
diff --git a/README.md b/README.md
index a8996d6..d393343 100644
--- a/README.md
+++ b/README.md
@@ -27,6 +27,7 @@ A selection of [PSR-11][] containers for utility, simplicity, and ease.
### DI
- [`ServiceProvider`][] - A super-simple implementation that allows quick creation of [service providers][Service Provider] from known maps of factories and extensions.
- [`CompositeCachingServiceProvider`][] - A service provider that aggregates factories and extensions of other service providers. The results of this aggregation will be cached, meaing that it is only performed at most once per instance - when retrieving said factories or extensions.
+- [`TaggingServiceProvider`][] - A service provider that aggregates tagged services into a service with the tag's name.
- [`DelegatingContainer`][] - A container that will invoke the factories and extensions of its configured service provider before returning values. If a parent container is specified, it will be passed to the service definitions instead of this container. This allows [dependency lookup delegation][DDL], which is especially useful when composing a container out of other containers.
## Examples
@@ -56,6 +57,43 @@ Most modern applications use some kind of DI container setup. The below example
$appContainer->get('my-service');
```
+### Service Tagging
+You can tag your services into a collection. This adds a service with the same name as the tag,
+which will return a list of services tagged with it.
+
+Since a service name can theoretically be any legal string,
+while some limitations need to be set for it to remain a tag,
+the tag name can contain any character besides whitespace (anything that matches `\s`).
+
+```php
+[
+ 'serviceA' =>
+ /** @tag letters */
+ fn (): string => 'A',
+ 'serviceB' =>
+ /**
+ * @tag letters
+ */
+ function (): string {
+ return 'B';
+ },
+ 'serviceC' => function (ContainerInterface $c): string {
+ var_dump($c->get('letters'));
+ },
+];
+```
+
+The above example results in the following `var_dump()`:
+
+```
+array(2) {
+ [0]=>
+ string(1) "A"
+ [1]=>
+ string(1) "B"
+}
+```
+
### Fun Things With Maps
Maps are very commonly used in applications to represent some key-value relationships. We decided that PSR-11 containers are a great way to represent maps in an interop way. Here are some of the things you can do.
@@ -130,6 +168,7 @@ echo $productionConfig->get('password'); // NotFoundException: This key does not
[`ServiceProvider`]: src/ServiceProvider.php
[`CompositeCachingServiceProvider`]: src/CompositeCachingServiceProvider.php
+[`TaggingServiceProvider`]: src/TaggingServiceProvider.php
[`DelegatingContainer`]: src/DelegatingContainer.php
[`CachingContainer`]: src/CachingContainer.php
[`CompositeContainer`]: src/CompositeContainer.php
diff --git a/composer.lock b/composer.lock
index f82a913..bea93f6 100644
--- a/composer.lock
+++ b/composer.lock
@@ -8,20 +8,20 @@
"packages": [
{
"name": "container-interop/service-provider",
- "version": "v0.4.0",
+ "version": "v0.4.1",
"source": {
"type": "git",
"url": "https://github.com/container-interop/service-provider.git",
- "reference": "4969b9e49460690b7430b3f1a87cab07be61418a"
+ "reference": "e04441ca21ef03e10dce70b0af29269281eec6dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/container-interop/service-provider/zipball/4969b9e49460690b7430b3f1a87cab07be61418a",
- "reference": "4969b9e49460690b7430b3f1a87cab07be61418a",
+ "url": "https://api.github.com/repos/container-interop/service-provider/zipball/e04441ca21ef03e10dce70b0af29269281eec6dc",
+ "reference": "e04441ca21ef03e10dce70b0af29269281eec6dc",
"shasum": ""
},
"require": {
- "psr/container": "^1.0"
+ "psr/container": "^1.0 || ^2.0"
},
"type": "library",
"autoload": {
@@ -37,9 +37,9 @@
"homepage": "https://github.com/container-interop/service-provider",
"support": {
"issues": "https://github.com/container-interop/service-provider/issues",
- "source": "https://github.com/container-interop/service-provider/tree/master"
+ "source": "https://github.com/container-interop/service-provider/tree/v0.4.1"
},
- "time": "2017-09-20T14:13:36+00:00"
+ "time": "2023-12-14T14:50:12+00:00"
},
{
"name": "dhii/collections-interface",
@@ -153,12 +153,12 @@
"source": {
"type": "git",
"url": "https://github.com/amphp/amp.git",
- "reference": "c5ea79065f98f93f7b16a4d5a504fe5d69451447"
+ "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/amphp/amp/zipball/c5ea79065f98f93f7b16a4d5a504fe5d69451447",
- "reference": "c5ea79065f98f93f7b16a4d5a504fe5d69451447",
+ "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d",
+ "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d",
"shasum": ""
},
"require": {
@@ -170,8 +170,8 @@
"ext-json": "*",
"jetbrains/phpstorm-stubs": "^2019.3",
"phpunit/phpunit": "^7 | ^8 | ^9",
- "psalm/phar": "^3.11@dev",
- "react/promise": "^2"
+ "react/promise": "^2",
+ "vimeo/psalm": "^3.12"
},
"type": "library",
"extra": {
@@ -226,7 +226,7 @@
"support": {
"irc": "irc://irc.freenode.org/amphp",
"issues": "https://github.com/amphp/amp/issues",
- "source": "https://github.com/amphp/amp/tree/master"
+ "source": "https://github.com/amphp/amp/tree/2.x"
},
"funding": [
{
@@ -234,7 +234,7 @@
"type": "github"
}
],
- "time": "2022-08-21T11:55:21+00:00"
+ "time": "2024-03-21T18:52:26+00:00"
},
{
"name": "amphp/byte-stream",
@@ -242,12 +242,12 @@
"source": {
"type": "git",
"url": "https://github.com/amphp/byte-stream.git",
- "reference": "18f86b65129d923e004df27e2a3d6f4159c3c743"
+ "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/amphp/byte-stream/zipball/18f86b65129d923e004df27e2a3d6f4159c3c743",
- "reference": "18f86b65129d923e004df27e2a3d6f4159c3c743",
+ "url": "https://api.github.com/repos/amphp/byte-stream/zipball/4f0e968ba3798a423730f567b1b50d3441c16ddc",
+ "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc",
"shasum": ""
},
"require": {
@@ -263,11 +263,6 @@
"psalm/phar": "^3.11.4"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- }
- },
"autoload": {
"files": [
"lib/functions.php"
@@ -301,9 +296,8 @@
"stream"
],
"support": {
- "irc": "irc://irc.freenode.org/amphp",
"issues": "https://github.com/amphp/byte-stream/issues",
- "source": "https://github.com/amphp/byte-stream/tree/master"
+ "source": "https://github.com/amphp/byte-stream/tree/windows-test-failures"
},
"funding": [
{
@@ -311,7 +305,7 @@
"type": "github"
}
],
- "time": "2022-06-21T18:19:50+00:00"
+ "time": "2024-04-13T18:00:56+00:00"
},
{
"name": "composer/pcre",
@@ -319,12 +313,12 @@
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
- "reference": "73b47b99f928364693ab1f48480c949186283e82"
+ "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/73b47b99f928364693ab1f48480c949186283e82",
- "reference": "73b47b99f928364693ab1f48480c949186283e82",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
+ "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
"shasum": ""
},
"require": {
@@ -367,7 +361,7 @@
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
- "source": "https://github.com/composer/pcre/tree/main"
+ "source": "https://github.com/composer/pcre/tree/3.1.3"
},
"funding": [
{
@@ -383,7 +377,7 @@
"type": "tidelift"
}
],
- "time": "2023-09-01T08:40:22+00:00"
+ "time": "2024-03-19T10:26:25+00:00"
},
{
"name": "composer/semver",
@@ -469,16 +463,16 @@
},
{
"name": "composer/xdebug-handler",
- "version": "3.0.3",
+ "version": "3.0.4",
"source": {
"type": "git",
"url": "https://github.com/composer/xdebug-handler.git",
- "reference": "ced299686f41dce890debac69273b47ffe98a40c"
+ "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
- "reference": "ced299686f41dce890debac69273b47ffe98a40c",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
+ "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
"shasum": ""
},
"require": {
@@ -489,7 +483,7 @@
"require-dev": {
"phpstan/phpstan": "^1.0",
"phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^6.0"
+ "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
},
"type": "library",
"autoload": {
@@ -513,9 +507,9 @@
"performance"
],
"support": {
- "irc": "irc://irc.freenode.org/composer",
+ "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.3"
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.4"
},
"funding": [
{
@@ -531,7 +525,7 @@
"type": "tidelift"
}
],
- "time": "2022-02-25T21:32:43+00:00"
+ "time": "2024-03-26T18:29:49+00:00"
},
{
"name": "dealerdirect/phpcodesniffer-composer-installer",
@@ -651,25 +645,25 @@
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
- "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
+ "reference": "12be2483e1f0e850b353e26869e4e6c038459501"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
- "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/12be2483e1f0e850b353e26869e4e6c038459501",
+ "reference": "12be2483e1f0e850b353e26869e4e6c038459501",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
- "doctrine/coding-standard": "^9 || ^11",
+ "doctrine/coding-standard": "^9 || ^12",
"ext-pdo": "*",
"ext-phar": "*",
"phpbench/phpbench": "^0.16 || ^1",
"phpstan/phpstan": "^1.4",
"phpstan/phpstan-phpunit": "^1",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6",
"vimeo/psalm": "^4.30 || ^5.4"
},
"type": "library",
@@ -697,7 +691,7 @@
],
"support": {
"issues": "https://github.com/doctrine/instantiator/issues",
- "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
+ "source": "https://github.com/doctrine/instantiator/tree/1.5.x"
},
"funding": [
{
@@ -713,7 +707,7 @@
"type": "tidelift"
}
],
- "time": "2022-12-30T00:15:36+00:00"
+ "time": "2023-12-09T14:16:53+00:00"
},
{
"name": "felixfbecker/advanced-json-rpc",
@@ -819,16 +813,16 @@
},
{
"name": "fidry/cpu-core-counter",
- "version": "0.5.1",
+ "version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/theofidry/cpu-core-counter.git",
- "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623"
+ "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
- "reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
+ "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42",
+ "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42",
"shasum": ""
},
"require": {
@@ -836,13 +830,13 @@
},
"require-dev": {
"fidry/makefile": "^0.2.0",
+ "fidry/php-cs-fixer-config": "^1.1.2",
"phpstan/extension-installer": "^1.2.0",
"phpstan/phpstan": "^1.9.2",
"phpstan/phpstan-deprecation-rules": "^1.0.0",
"phpstan/phpstan-phpunit": "^1.2.2",
"phpstan/phpstan-strict-rules": "^1.4.4",
- "phpunit/phpunit": "^9.5.26 || ^8.5.31",
- "theofidry/php-cs-fixer-config": "^1.0",
+ "phpunit/phpunit": "^8.5.31 || ^9.5.26",
"webmozarts/strict-phpunit": "^7.5"
},
"type": "library",
@@ -868,7 +862,7 @@
],
"support": {
"issues": "https://github.com/theofidry/cpu-core-counter/issues",
- "source": "https://github.com/theofidry/cpu-core-counter/tree/0.5.1"
+ "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0"
},
"funding": [
{
@@ -876,7 +870,7 @@
"type": "github"
}
],
- "time": "2022-12-24T12:35:10+00:00"
+ "time": "2024-02-07T09:43:46+00:00"
},
{
"name": "gmazzap/andrew",
@@ -939,12 +933,12 @@
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "f6f48cfecf52ab791fe18cc1b11d6345512dc4b8"
+ "reference": "2f5294676c802a62b0549f6bc8983f14294ce369"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/f6f48cfecf52ab791fe18cc1b11d6345512dc4b8",
- "reference": "f6f48cfecf52ab791fe18cc1b11d6345512dc4b8",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/2f5294676c802a62b0549f6bc8983f14294ce369",
+ "reference": "2f5294676c802a62b0549f6bc8983f14294ce369",
"shasum": ""
},
"require": {
@@ -992,20 +986,20 @@
"type": "tidelift"
}
],
- "time": "2023-07-30T10:01:33+00:00"
+ "time": "2024-02-10T11:10:03+00:00"
},
{
"name": "netresearch/jsonmapper",
- "version": "v4.2.0",
+ "version": "v4.4.1",
"source": {
"type": "git",
"url": "https://github.com/cweiske/jsonmapper.git",
- "reference": "f60565f8c0566a31acf06884cdaa591867ecc956"
+ "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/f60565f8c0566a31acf06884cdaa591867ecc956",
- "reference": "f60565f8c0566a31acf06884cdaa591867ecc956",
+ "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/132c75c7dd83e45353ebb9c6c9f591952995bbf0",
+ "reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0",
"shasum": ""
},
"require": {
@@ -1016,7 +1010,7 @@
"php": ">=7.1"
},
"require-dev": {
- "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0",
+ "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0",
"squizlabs/php_codesniffer": "~3.5"
},
"type": "library",
@@ -1041,9 +1035,9 @@
"support": {
"email": "cweiske@cweiske.de",
"issues": "https://github.com/cweiske/jsonmapper/issues",
- "source": "https://github.com/cweiske/jsonmapper/tree/v4.2.0"
+ "source": "https://github.com/cweiske/jsonmapper/tree/v4.4.1"
},
- "time": "2023-04-09T17:37:40+00:00"
+ "time": "2024-01-31T06:18:54+00:00"
},
{
"name": "nikic/php-parser",
@@ -1051,23 +1045,22 @@
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d"
+ "reference": "4d36e9c16f4820c2ed9360bc818982f3c02a08f5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
- "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4d36e9c16f4820c2ed9360bc818982f3c02a08f5",
+ "reference": "4d36e9c16f4820c2ed9360bc818982f3c02a08f5",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
- "php": ">=7.0"
+ "php": ">=7.1"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
- "default-branch": true,
"bin": [
"bin/php-parse"
],
@@ -1098,9 +1091,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1"
+ "source": "https://github.com/nikic/PHP-Parser/tree/4.x"
},
- "time": "2023-08-13T19:53:39+00:00"
+ "time": "2024-03-17T09:03:35+00:00"
},
{
"name": "phar-io/manifest",
@@ -1108,12 +1101,12 @@
"source": {
"type": "git",
"url": "https://github.com/phar-io/manifest.git",
- "reference": "67729272c564ab9f953c81f48db44e8b1cb1e1c3"
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/manifest/zipball/67729272c564ab9f953c81f48db44e8b1cb1e1c3",
- "reference": "67729272c564ab9f953c81f48db44e8b1cb1e1c3",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
"shasum": ""
},
"require": {
@@ -1122,7 +1115,7 @@
"ext-phar": "*",
"ext-xmlwriter": "*",
"phar-io/version": "^3.0.1",
- "php": "^7.3 || ^8.0"
+ "php": "^7.2 || ^8.0"
},
"default-branch": true,
"type": "library",
@@ -1160,7 +1153,7 @@
"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/master"
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
},
"funding": [
{
@@ -1168,7 +1161,7 @@
"type": "github"
}
],
- "time": "2023-06-01T14:19:47+00:00"
+ "time": "2024-03-03T12:33:53+00:00"
},
{
"name": "phar-io/version",
@@ -1445,19 +1438,19 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76"
+ "reference": "3352293d9e91513d5508c415835014881b420218"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76",
- "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/3352293d9e91513d5508c415835014881b420218",
+ "reference": "3352293d9e91513d5508c415835014881b420218",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^4.15",
+ "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2",
@@ -1507,7 +1500,7 @@
"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/9.2.29"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2"
},
"funding": [
{
@@ -1515,7 +1508,7 @@
"type": "github"
}
],
- "time": "2023-09-19T04:57:46+00:00"
+ "time": "2024-03-22T05:16:32+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -1764,12 +1757,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be"
+ "reference": "33a0610878994fc134c74c25d5276d606d49079b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be",
- "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/33a0610878994fc134c74c25d5276d606d49079b",
+ "reference": "33a0610878994fc134c74c25d5276d606d49079b",
"shasum": ""
},
"require": {
@@ -1843,7 +1836,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6"
},
"funding": [
{
@@ -1859,7 +1852,7 @@
"type": "tidelift"
}
],
- "time": "2023-09-19T05:39:22+00:00"
+ "time": "2024-04-20T06:05:08+00:00"
},
{
"name": "psr/cache",
@@ -2013,16 +2006,16 @@
},
{
"name": "sebastian/cli-parser",
- "version": "1.0.1",
+ "version": "1.0.x-dev",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
"shasum": ""
},
"require": {
@@ -2057,7 +2050,7 @@
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
- "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2"
},
"funding": [
{
@@ -2065,7 +2058,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:08:49+00:00"
+ "time": "2024-03-02T06:27:43+00:00"
},
{
"name": "sebastian/code-unit",
@@ -2254,20 +2247,20 @@
},
{
"name": "sebastian/complexity",
- "version": "2.0.2",
+ "version": "2.0.x-dev",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.7",
+ "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@@ -2299,7 +2292,7 @@
"homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
- "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
},
"funding": [
{
@@ -2307,7 +2300,7 @@
"type": "github"
}
],
- "time": "2020-10-26T15:52:27+00:00"
+ "time": "2023-12-22T06:19:30+00:00"
},
{
"name": "sebastian/diff",
@@ -2315,12 +2308,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131"
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
- "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
"shasum": ""
},
"require": {
@@ -2365,7 +2358,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/4.0"
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
},
"funding": [
{
@@ -2373,7 +2366,7 @@
"type": "github"
}
],
- "time": "2023-05-07T05:35:17+00:00"
+ "time": "2024-03-02T06:30:58+00:00"
},
{
"name": "sebastian/environment",
@@ -2444,12 +2437,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
- "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72",
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72",
"shasum": ""
},
"require": {
@@ -2505,7 +2498,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
- "source": "https://github.com/sebastianbergmann/exporter/tree/4.0"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6"
},
"funding": [
{
@@ -2513,7 +2506,7 @@
"type": "github"
}
],
- "time": "2022-09-14T06:03:37+00:00"
+ "time": "2024-03-02T06:33:00+00:00"
},
{
"name": "sebastian/global-state",
@@ -2521,12 +2514,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "bde739e7565280bda77be70044ac1047bc007e34"
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34",
- "reference": "bde739e7565280bda77be70044ac1047bc007e34",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
"shasum": ""
},
"require": {
@@ -2569,7 +2562,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
- "source": "https://github.com/sebastianbergmann/global-state/tree/5.0"
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7"
},
"funding": [
{
@@ -2577,24 +2570,24 @@
"type": "github"
}
],
- "time": "2023-08-02T09:26:13+00:00"
+ "time": "2024-03-02T06:35:11+00:00"
},
{
"name": "sebastian/lines-of-code",
- "version": "1.0.3",
+ "version": "1.0.x-dev",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.6",
+ "nikic/php-parser": "^4.18 || ^5.0",
"php": ">=7.3"
},
"require-dev": {
@@ -2626,7 +2619,7 @@
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
},
"funding": [
{
@@ -2634,7 +2627,7 @@
"type": "github"
}
],
- "time": "2020-11-28T06:42:11+00:00"
+ "time": "2023-12-22T06:20:34+00:00"
},
{
"name": "sebastian/object-enumerator",
@@ -2817,12 +2810,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "20bdda85c7c585ab265c0c37ec052a019bae29c4"
+ "reference": "ff553e7482dcee39fa4acc2b175d6ddeb0f7bc25"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/20bdda85c7c585ab265c0c37ec052a019bae29c4",
- "reference": "20bdda85c7c585ab265c0c37ec052a019bae29c4",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ff553e7482dcee39fa4acc2b175d6ddeb0f7bc25",
+ "reference": "ff553e7482dcee39fa4acc2b175d6ddeb0f7bc25",
"shasum": ""
},
"require": {
@@ -2864,7 +2857,7 @@
"type": "github"
}
],
- "time": "2023-03-25T08:11:39+00:00"
+ "time": "2024-03-14T18:47:08+00:00"
},
{
"name": "sebastian/type",
@@ -3105,13 +3098,13 @@
"version": "dev-master",
"source": {
"type": "git",
- "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "7566b4d89de1d08d2a8ad85910507d6633a35d28"
+ "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
+ "reference": "9a0c2546ea2fa7aac19881da7b655cc5f022bc10"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/7566b4d89de1d08d2a8ad85910507d6633a35d28",
- "reference": "7566b4d89de1d08d2a8ad85910507d6633a35d28",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/9a0c2546ea2fa7aac19881da7b655cc5f022bc10",
+ "reference": "9a0c2546ea2fa7aac19881da7b655cc5f022bc10",
"shasum": ""
},
"require": {
@@ -3121,12 +3114,12 @@
"php": ">=5.4.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4"
},
"default-branch": true,
"bin": [
- "bin/phpcs",
- "bin/phpcbf"
+ "bin/phpcbf",
+ "bin/phpcs"
],
"type": "library",
"extra": {
@@ -3141,22 +3134,45 @@
"authors": [
{
"name": "Greg Sherwood",
- "role": "lead"
+ "role": "Former lead"
+ },
+ {
+ "name": "Juliette Reinders Folmer",
+ "role": "Current lead"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors"
}
],
"description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
- "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
+ "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
"keywords": [
"phpcs",
"standards",
"static analysis"
],
"support": {
- "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
- "source": "https://github.com/squizlabs/PHP_CodeSniffer",
- "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+ "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues",
+ "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy",
+ "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
+ "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki"
},
- "time": "2023-09-11T11:08:03+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/PHPCSStandards",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/jrfnl",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-04-24T15:14:01+00:00"
},
{
"name": "symfony/console",
@@ -3164,12 +3180,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "f4f71842f24c2023b91237c72a365306f3c58827"
+ "reference": "f3e591c48688a0cfa1a3296205926c05e84b22b1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827",
- "reference": "f4f71842f24c2023b91237c72a365306f3c58827",
+ "url": "https://api.github.com/repos/symfony/console/zipball/f3e591c48688a0cfa1a3296205926c05e84b22b1",
+ "reference": "f3e591c48688a0cfa1a3296205926c05e84b22b1",
"shasum": ""
},
"require": {
@@ -3255,7 +3271,7 @@
"type": "tidelift"
}
],
- "time": "2023-08-07T06:12:30+00:00"
+ "time": "2024-04-18T08:26:06+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -3330,19 +3346,20 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364"
+ "reference": "e6edd875d5d39b03de51f3c3951148cfa79a4d12"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364",
- "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/e6edd875d5d39b03de51f3c3951148cfa79a4d12",
+ "reference": "e6edd875d5d39b03de51f3c3951148cfa79a4d12",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8",
- "symfony/polyfill-php80": "^1.16"
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/process": "^5.4|^6.4"
},
"type": "library",
"autoload": {
@@ -3386,7 +3403,7 @@
"type": "tidelift"
}
],
- "time": "2023-05-31T13:04:02+00:00"
+ "time": "2024-04-18T08:26:06+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -3394,12 +3411,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+ "reference": "c9e59dec962d38cf2e0e4c61c4a1a1312f4dd7fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c9e59dec962d38cf2e0e4c61c4a1a1312f4dd7fe",
+ "reference": "c9e59dec962d38cf2e0e4c61c4a1a1312f4dd7fe",
"shasum": ""
},
"require": {
@@ -3414,9 +3431,6 @@
"default-branch": true,
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3453,7 +3467,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/1.x"
},
"funding": [
{
@@ -3469,7 +3483,7 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-04-19T06:31:17+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
@@ -3477,12 +3491,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "875e90aeea2777b6f135677f618529449334a612"
+ "reference": "0a1df740cbb01859ce1bac85b0ad58ffe02f69b6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
- "reference": "875e90aeea2777b6f135677f618529449334a612",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/0a1df740cbb01859ce1bac85b0ad58ffe02f69b6",
+ "reference": "0a1df740cbb01859ce1bac85b0ad58ffe02f69b6",
"shasum": ""
},
"require": {
@@ -3494,9 +3508,6 @@
"default-branch": true,
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3535,7 +3546,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/1.x"
},
"funding": [
{
@@ -3551,7 +3562,7 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-04-19T06:31:17+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
@@ -3559,12 +3570,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
+ "reference": "2a090dc3db090fcb35cc7329d18a07f281f15d79"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
- "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2a090dc3db090fcb35cc7329d18a07f281f15d79",
+ "reference": "2a090dc3db090fcb35cc7329d18a07f281f15d79",
"shasum": ""
},
"require": {
@@ -3576,9 +3587,6 @@
"default-branch": true,
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3620,7 +3628,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/1.x"
},
"funding": [
{
@@ -3636,7 +3644,7 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-04-19T06:31:17+00:00"
},
{
"name": "symfony/polyfill-mbstring",
@@ -3644,12 +3652,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "42292d99c55abe617799667f454222c54c60e229"
+ "reference": "e642fbe7a7b73cdb05460555289a9057bfd6ead6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
- "reference": "42292d99c55abe617799667f454222c54c60e229",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e642fbe7a7b73cdb05460555289a9057bfd6ead6",
+ "reference": "e642fbe7a7b73cdb05460555289a9057bfd6ead6",
"shasum": ""
},
"require": {
@@ -3664,9 +3672,6 @@
"default-branch": true,
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3704,7 +3709,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/1.x"
},
"funding": [
{
@@ -3720,7 +3725,7 @@
"type": "tidelift"
}
],
- "time": "2023-07-28T09:04:16+00:00"
+ "time": "2024-04-19T06:31:17+00:00"
},
{
"name": "symfony/polyfill-php73",
@@ -3728,12 +3733,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5"
+ "reference": "bca7fd9c46ef734d27d59dae1b71ce4f4ff70b03"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5",
- "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/bca7fd9c46ef734d27d59dae1b71ce4f4ff70b03",
+ "reference": "bca7fd9c46ef734d27d59dae1b71ce4f4ff70b03",
"shasum": ""
},
"require": {
@@ -3742,9 +3747,6 @@
"default-branch": true,
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3784,7 +3786,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-php73/tree/1.x"
},
"funding": [
{
@@ -3800,7 +3802,7 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-04-19T06:31:17+00:00"
},
{
"name": "symfony/polyfill-php80",
@@ -3808,12 +3810,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
+ "reference": "7d191eb4022901cd3d91a816ec5464ca3a08a8aa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
- "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7d191eb4022901cd3d91a816ec5464ca3a08a8aa",
+ "reference": "7d191eb4022901cd3d91a816ec5464ca3a08a8aa",
"shasum": ""
},
"require": {
@@ -3822,9 +3824,6 @@
"default-branch": true,
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3868,7 +3867,69 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/1.x"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-19T06:31:17+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "5.4.x-dev",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "85a554acd7c28522241faf2e97b9541247a0d3d5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/85a554acd7c28522241faf2e97b9541247a0d3d5",
+ "reference": "85a554acd7c28522241faf2e97b9541247a0d3d5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "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": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/5.4"
},
"funding": [
{
@@ -3884,7 +3945,7 @@
"type": "tidelift"
}
],
- "time": "2023-01-26T09:26:14+00:00"
+ "time": "2024-04-18T08:26:06+00:00"
},
{
"name": "symfony/service-contracts",
@@ -3975,12 +4036,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "e41bdc93def20eaf3bfc1537c4e0a2b0680a152d"
+ "reference": "495e71bae5862308051b9e63cc3e34078eed83ef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/e41bdc93def20eaf3bfc1537c4e0a2b0680a152d",
- "reference": "e41bdc93def20eaf3bfc1537c4e0a2b0680a152d",
+ "url": "https://api.github.com/repos/symfony/string/zipball/495e71bae5862308051b9e63cc3e34078eed83ef",
+ "reference": "495e71bae5862308051b9e63cc3e34078eed83ef",
"shasum": ""
},
"require": {
@@ -4053,20 +4114,20 @@
"type": "tidelift"
}
],
- "time": "2023-09-13T11:47:41+00:00"
+ "time": "2024-04-18T08:26:06+00:00"
},
{
"name": "theseer/tokenizer",
- "version": "1.2.1",
+ "version": "1.2.3",
"source": {
"type": "git",
"url": "https://github.com/theseer/tokenizer.git",
- "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
- "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
"shasum": ""
},
"require": {
@@ -4095,7 +4156,7 @@
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
"issues": "https://github.com/theseer/tokenizer/issues",
- "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
},
"funding": [
{
@@ -4103,7 +4164,7 @@
"type": "github"
}
],
- "time": "2021-07-28T10:34:58+00:00"
+ "time": "2024-03-03T12:36:25+00:00"
},
{
"name": "vimeo/psalm",
@@ -4111,12 +4172,12 @@
"source": {
"type": "git",
"url": "https://github.com/vimeo/psalm.git",
- "reference": "7d8d74d32ada065cc2d55979f4247eac23257a9b"
+ "reference": "7d6c88e88a55cf04af4d6932cfb906d15ac2fe23"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vimeo/psalm/zipball/7d8d74d32ada065cc2d55979f4247eac23257a9b",
- "reference": "7d8d74d32ada065cc2d55979f4247eac23257a9b",
+ "url": "https://api.github.com/repos/vimeo/psalm/zipball/7d6c88e88a55cf04af4d6932cfb906d15ac2fe23",
+ "reference": "7d6c88e88a55cf04af4d6932cfb906d15ac2fe23",
"shasum": ""
},
"require": {
@@ -4135,14 +4196,14 @@
"ext-tokenizer": "*",
"felixfbecker/advanced-json-rpc": "^3.1",
"felixfbecker/language-server-protocol": "^1.5.2",
- "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1",
+ "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0",
"netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
"nikic/php-parser": "^4.16",
"php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0",
- "sebastian/diff": "^4.0 || ^5.0",
+ "sebastian/diff": "^4.0 || ^5.0 || ^6.0",
"spatie/array-to-xml": "^2.17.0 || ^3.0",
- "symfony/console": "^4.1.6 || ^5.0 || ^6.0",
- "symfony/filesystem": "^5.4 || ^6.0"
+ "symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0",
+ "symfony/filesystem": "^5.4 || ^6.0 || ^7.0"
},
"conflict": {
"nikic/php-parser": "4.17.0"
@@ -4164,7 +4225,7 @@
"psalm/plugin-phpunit": "^0.18",
"slevomat/coding-standard": "^8.4",
"squizlabs/php_codesniffer": "^3.6",
- "symfony/process": "^4.4 || ^5.0 || ^6.0"
+ "symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0"
},
"suggest": {
"ext-curl": "In order to send data to shepherd",
@@ -4214,7 +4275,7 @@
"issues": "https://github.com/vimeo/psalm/issues",
"source": "https://github.com/vimeo/psalm"
},
- "time": "2023-09-17T14:06:40+00:00"
+ "time": "2024-04-06T18:17:07+00:00"
},
{
"name": "webmozart/assert",
@@ -4386,5 +4447,5 @@
"php": "^7.4 | ^8.0"
},
"platform-dev": [],
- "plugin-api-version": "2.3.0"
+ "plugin-api-version": "2.6.0"
}
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 89c2d17..78e56c6 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,11 +1,18 @@
+
+
+ src
+
+
-
-
+
+
@@ -18,9 +25,4 @@
tests/system
-
-
- src
-
-
diff --git a/psalm-baseline.xml b/psalm-baseline.xml
new file mode 100644
index 0000000..eeb1f9d
--- /dev/null
+++ b/psalm-baseline.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ extensions]]>
+ factories]]>
+
+
+
+
+
+
+
+
+
+
+
+ $c->get($serviceName)]]>
+
+
+
+
+
+
+
+
+
+
diff --git a/psalm.xml.dist b/psalm.xml.dist
index 6ed0a4b..898390b 100644
--- a/psalm.xml.dist
+++ b/psalm.xml.dist
@@ -19,6 +19,7 @@
throwExceptionOnError="false"
hideExternalErrors="true"
allowFileIncludes="true"
+ errorBaseline="psalm-baseline.xml"
>
diff --git a/src/PrefixingContainer.php b/src/PrefixingContainer.php
index a748416..aa5e36b 100644
--- a/src/PrefixingContainer.php
+++ b/src/PrefixingContainer.php
@@ -151,7 +151,7 @@ protected function isPrefixed(string $key): bool
*/
protected function substring(string $string, int $offset = 0, ?int $length = null): string
{
- $length = $length ?: strlen($string) - $offset;
+ $length = $length ?? strlen($string) - $offset;
$substring = substr($string, $offset, $length);
if ($substring === false) {
throw new RuntimeException(
diff --git a/src/SimpleCacheContainer.php b/src/SimpleCacheContainer.php
index 60a32a4..9b7d98b 100644
--- a/src/SimpleCacheContainer.php
+++ b/src/SimpleCacheContainer.php
@@ -110,7 +110,7 @@ public function clear(): void
try {
$storage->clear();
} catch (Exception $e) {
- throw new ContainerException(sprintf('Could not clear container'), 0, $e);
+ throw new ContainerException('Could not clear container', 0, $e);
}
}
}
diff --git a/src/TaggingServiceProvider.php b/src/TaggingServiceProvider.php
new file mode 100644
index 0000000..f091162
--- /dev/null
+++ b/src/TaggingServiceProvider.php
@@ -0,0 +1,121 @@
+ */
+ protected array $factories;
+ /** @var array */
+ protected array $extensions;
+
+ public function __construct(ServiceProviderInterface $inner)
+ {
+ $this->factories = $inner->getFactories();
+ $this->extensions = $inner->getExtensions();
+ $this->indexTags();
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getFactories()
+ {
+ return $this->factories;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getExtensions()
+ {
+ return $this->extensions;
+ }
+
+ /**
+ * Indexes tagged factories, and creates factories and extensions for tags.
+ *
+ * @throws ReflectionException If problem obtaining factory reflection.
+ */
+ protected function indexTags(): void
+ {
+ $tags = [];
+
+ foreach ($this->factories as $serviceName => $factory) {
+ if (is_string($factory)) {
+ continue;
+ }
+
+ $reflection = is_object($factory) && get_class($factory) === 'Closure'
+ ? new ReflectionFunction($factory)
+ : new ReflectionObject($factory);
+ $docBlock = $reflection->getDocComment();
+
+ // No docblock
+ if ($docBlock === false) {
+ continue;
+ }
+
+ $factoryTags = $this->getTagsFromDocBlock($docBlock);
+ foreach ($factoryTags as $tag) {
+ if (!isset($tags[$tag]) || !is_array($tags[$tag])) {
+ $tags[$tag] = [];
+ }
+ $tags[$tag][] = $serviceName;
+ }
+ }
+
+ foreach ($tags as $tag => $taggedServiceNames) {
+ $this->factories[$tag] = fn (): array => [];
+ $this->extensions[$tag] = function (ContainerInterface $c, array $prev) use ($taggedServiceNames): array {
+ return array_merge(
+ $prev,
+ array_map(fn (string $serviceName) => $c->get($serviceName), $taggedServiceNames)
+ );
+ };
+ }
+ }
+
+ /**
+ * Retrieves tags names that are part of a docBlock.
+ *
+ * @link https://www.php.net/manual/en/reflectionclass.getdoccomment.php#118606
+ *
+ * @param string $docBlock The docBlock.
+ *
+ * @return array A list of tag names.
+ */
+ protected function getTagsFromDocBlock(string $docBlock): array
+ {
+ $regex = '#^\s*/?\**\s*(@tag\s*(?P[^\s]+))#m';
+ preg_match_all($regex, $docBlock, $matches);
+
+ return $matches['tags'];
+ }
+}
diff --git a/tests/functional/TaggingServiceProviderTest.php b/tests/functional/TaggingServiceProviderTest.php
new file mode 100644
index 0000000..ea54013
--- /dev/null
+++ b/tests/functional/TaggingServiceProviderTest.php
@@ -0,0 +1,63 @@
+
+ fn (): string => 'X',
+ 'serviceY' =>
+ /**
+ * This @tag my_tag is misplaced.
+ */
+ fn (): string => 'Y',
+ 'serviceZ' =>
+ /** This @tag my_tag is misplaced. */
+ fn (): string => 'Z',
+ 'serviceA' =>
+ /**
+ * @tag my_tag
+ */
+ fn (): string => 'A',
+ 'serviceB' =>
+ /** @tag my_tag */
+ function (): string {
+ return 'B';
+ },
+ 'serviceC' =>
+ /**
+ * @tag my_tag
+ */
+ new class () {
+ public function __invoke(): string
+ {
+ return 'C';
+ }
+ },
+ 'serviceD' => fn (ContainerInterface $c): string =>
+ implode('', array_merge($c->get('my_tag'), ['D'])),
+ ];
+ $extensions = [];
+ $inner = new ServiceProvider($factories, $extensions);
+ $subject = new TaggingServiceProvider($inner);
+ $container = new DelegatingContainer($subject, null);
+
+ $result = $container->get('serviceD');
+ $this->assertEquals('ABCD', $result);
+ }
+}