From 194e0114cfca46472591802b9e1365baef7a2926 Mon Sep 17 00:00:00 2001 From: Jakub Winkler Date: Wed, 9 Jul 2025 16:36:29 +0200 Subject: [PATCH] replacing zend_cache with symfony cache --- composer.json | 5 +- composer.lock | 1684 ++++++++++------- .../Magento/Framework/Acl/Data/Cache.php | 4 +- lib/internal/Magento/Framework/App/Cache.php | 2 +- .../Framework/App/Cache/FlushCacheByTags.php | 2 +- .../Framework/App/Cache/Frontend/Factory.php | 263 +-- .../Magento/Framework/App/Cache/Proxy.php | 2 +- .../Framework/App/Cache/Type/AccessProxy.php | 2 +- .../App/Test/Unit/Cache/ManagerTest.php | 4 +- .../Test/Unit/Cache/Type/AccessProxyTest.php | 2 +- .../App/Test/Unit/Cache/Type/ConfigTest.php | 16 +- .../Framework/App/Test/Unit/CacheTest.php | 4 +- lib/internal/Magento/Framework/Cache/Core.php | 326 +++- .../Cache/Frontend/Adapter/Symfony.php | 127 ++ .../Cache/Frontend/Decorator/Bare.php | 2 +- .../Cache/Frontend/Decorator/Logger.php | 2 +- .../Cache/Frontend/Decorator/Profiler.php | 2 +- .../Cache/Frontend/Decorator/TagScope.php | 10 +- .../Framework/Cache/FrontendInterface.php | 16 +- .../Cache/Test/Unit/Backend/DatabaseTest.php | 14 +- .../Cache/Test/Unit/Backend/MongoDbTest.php | 28 +- .../Framework/Cache/Test/Unit/CoreTest.php | 240 +-- .../Test/Unit/Frontend/Decorator/BareTest.php | 6 +- .../Unit/Frontend/Decorator/ProfilerTest.php | 6 +- .../Unit/Frontend/Decorator/TagScopeTest.php | 14 +- .../Framework/Currency/Data/Currency.php | 14 +- .../Framework/DB/Adapter/Pdo/Mysql.php | 2 +- .../Framework/Test/Unit/CurrencyTest.php | 7 +- 28 files changed, 1611 insertions(+), 1195 deletions(-) create mode 100644 lib/internal/Magento/Framework/Cache/Frontend/Adapter/Symfony.php diff --git a/composer.json b/composer.json index 2a23ad0ff3db2..b0139e849b3b0 100644 --- a/composer.json +++ b/composer.json @@ -69,14 +69,13 @@ "magento/composer": "^1.10.1-beta1", "magento/composer-dependency-version-audit-plugin": "^0.1", "magento/magento-composer-installer": ">=0.4.0", - "magento/zend-cache": "^1.16", + "symfony/cache": "^6.4", "magento/zend-db": "^1.16", "magento/zend-pdf": "^1.16", "monolog/monolog": "^3.6", "opensearch-project/opensearch-php": "^2.3", "pelago/emogrifier": "^7.0", "php-amqplib/php-amqplib": "^3.2", - "phpseclib/mcrypt_compat": "^2.0", "phpseclib/phpseclib": "^3.0", "psr/log": "^2 || ^3", "ramsey/uuid": "^4.2", @@ -398,4 +397,4 @@ } }, "prefer-stable": true -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 7b20c8ffa539b..3abf291c0c6db 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c0a82fa4155cf2880ee2593885bab2ac", + "content-hash": "bba7c6feb202d686fd83f148d1dbe85f", "packages": [ { "name": "aws/aws-crt-php", @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.340.3", + "version": "3.349.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "d5ce8f22952710da40be75ad69e2f04d47598a5d" + "reference": "63cc727845f077d17cb94791deb327249e1626ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d5ce8f22952710da40be75ad69e2f04d47598a5d", - "reference": "d5ce8f22952710da40be75ad69e2f04d47598a5d", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/63cc727845f077d17cb94791deb327249e1626ce", + "reference": "63cc727845f077d17cb94791deb327249e1626ce", "shasum": "" }, "require": { @@ -153,22 +153,22 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.340.3" + "source": "https://github.com/aws/aws-sdk-php/tree/3.349.2" }, - "time": "2025-02-27T19:11:54+00:00" + "time": "2025-07-03T18:08:27+00:00" }, { "name": "brick/math", - "version": "0.12.2", + "version": "0.12.3", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "901eddb1e45a8e0f689302e40af871c181ecbe40" + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/901eddb1e45a8e0f689302e40af871c181ecbe40", - "reference": "901eddb1e45a8e0f689302e40af871c181ecbe40", + "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", "shasum": "" }, "require": { @@ -207,7 +207,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.2" + "source": "https://github.com/brick/math/tree/0.12.3" }, "funding": [ { @@ -215,7 +215,7 @@ "type": "github" } ], - "time": "2025-02-26T10:21:45+00:00" + "time": "2025-02-28T13:11:00+00:00" }, { "name": "brick/varexporter", @@ -355,20 +355,20 @@ }, { "name": "colinmollenhour/credis", - "version": "v1.16.2", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/colinmollenhour/credis.git", - "reference": "db2c0323292e360fdba39bf98c7a405fe3cb05b0" + "reference": "f4930b426f6b1238b687a1ffe6ee5af7f835b40a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/colinmollenhour/credis/zipball/db2c0323292e360fdba39bf98c7a405fe3cb05b0", - "reference": "db2c0323292e360fdba39bf98c7a405fe3cb05b0", + "url": "https://api.github.com/repos/colinmollenhour/credis/zipball/f4930b426f6b1238b687a1ffe6ee5af7f835b40a", + "reference": "f4930b426f6b1238b687a1ffe6ee5af7f835b40a", "shasum": "" }, "require": { - "php": ">=5.6.0" + "php": ">=7.4.0" }, "suggest": { "ext-redis": "Improved performance for communicating with redis" @@ -396,27 +396,27 @@ "homepage": "https://github.com/colinmollenhour/credis", "support": { "issues": "https://github.com/colinmollenhour/credis/issues", - "source": "https://github.com/colinmollenhour/credis/tree/v1.16.2" + "source": "https://github.com/colinmollenhour/credis/tree/v1.17.0" }, - "time": "2024-12-17T02:24:03+00:00" + "time": "2025-02-10T18:58:46+00:00" }, { "name": "colinmollenhour/php-redis-session-abstract", - "version": "v2.0.0", + "version": "v2.1.2", "source": { "type": "git", "url": "https://github.com/colinmollenhour/php-redis-session-abstract.git", - "reference": "f485d282a91cff5dbbcc6a31de1d6132d4d6b380" + "reference": "defae6e34b0f6ce42e4be4f14f529d8932aea73a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/colinmollenhour/php-redis-session-abstract/zipball/f485d282a91cff5dbbcc6a31de1d6132d4d6b380", - "reference": "f485d282a91cff5dbbcc6a31de1d6132d4d6b380", + "url": "https://api.github.com/repos/colinmollenhour/php-redis-session-abstract/zipball/defae6e34b0f6ce42e4be4f14f529d8932aea73a", + "reference": "defae6e34b0f6ce42e4be4f14f529d8932aea73a", "shasum": "" }, "require": { - "colinmollenhour/credis": "~1.6", - "php": "^5.5 || ^7.0 || ^8.0" + "colinmollenhour/credis": "~1.17", + "php": "^7.4 || ^8.0" }, "require-dev": { "phpunit/phpunit": "^9" @@ -440,22 +440,22 @@ "homepage": "https://github.com/colinmollenhour/php-redis-session-abstract", "support": { "issues": "https://github.com/colinmollenhour/php-redis-session-abstract/issues", - "source": "https://github.com/colinmollenhour/php-redis-session-abstract/tree/v2.0.0" + "source": "https://github.com/colinmollenhour/php-redis-session-abstract/tree/v2.1.2" }, - "time": "2024-05-15T18:54:21+00:00" + "time": "2025-05-05T07:31:11+00:00" }, { "name": "composer/ca-bundle", - "version": "1.5.5", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6" + "reference": "d665d22c417056996c59019579f1967dfe5c1e82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/08c50d5ec4c6ced7d0271d2862dec8c1033283e6", - "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d665d22c417056996c59019579f1967dfe5c1e82", + "reference": "d665d22c417056996c59019579f1967dfe5c1e82", "shasum": "" }, "require": { @@ -502,7 +502,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.5" + "source": "https://github.com/composer/ca-bundle/tree/1.5.7" }, "funding": [ { @@ -518,20 +518,20 @@ "type": "tidelift" } ], - "time": "2025-01-08T16:17:16+00:00" + "time": "2025-05-26T15:08:54+00:00" }, { "name": "composer/class-map-generator", - "version": "1.6.0", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9" + "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/134b705ddb0025d397d8318a75825fe3c9d1da34", + "reference": "134b705ddb0025d397d8318a75825fe3c9d1da34", "shasum": "" }, "require": { @@ -575,7 +575,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.6.0" + "source": "https://github.com/composer/class-map-generator/tree/1.6.1" }, "funding": [ { @@ -591,20 +591,20 @@ "type": "tidelift" } ], - "time": "2025-02-05T10:05:34+00:00" + "time": "2025-03-24T13:50:44+00:00" }, { "name": "composer/composer", - "version": "2.8.6", + "version": "2.8.9", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "937c775a644bd7d2c3dfbb352747488463a6e673" + "reference": "b4e6bff2db7ce756ddb77ecee958a0f41f42bd9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/937c775a644bd7d2c3dfbb352747488463a6e673", - "reference": "937c775a644bd7d2c3dfbb352747488463a6e673", + "url": "https://api.github.com/repos/composer/composer/zipball/b4e6bff2db7ce756ddb77ecee958a0f41f42bd9d", + "reference": "b4e6bff2db7ce756ddb77ecee958a0f41f42bd9d", "shasum": "" }, "require": { @@ -615,7 +615,7 @@ "composer/semver": "^3.3", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^5.3", + "justinrainbow/json-schema": "^6.3.1", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", "react/promise": "^2.11 || ^3.2", @@ -689,7 +689,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.8.6" + "source": "https://github.com/composer/composer/tree/2.8.9" }, "funding": [ { @@ -705,7 +705,7 @@ "type": "tidelift" } ], - "time": "2025-02-25T12:03:50+00:00" + "time": "2025-05-13T12:01:37+00:00" }, { "name": "composer/metadata-minifier", @@ -938,24 +938,24 @@ }, { "name": "composer/spdx-licenses", - "version": "1.5.8", + "version": "1.5.9", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a" + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", - "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -998,7 +998,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.8" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" }, "funding": [ { @@ -1014,7 +1014,7 @@ "type": "tidelift" } ], - "time": "2023-11-20T07:44:33+00:00" + "time": "2025-05-12T21:07:07+00:00" }, { "name": "composer/xdebug-handler", @@ -1161,16 +1161,16 @@ }, { "name": "duosecurity/duo_api_php", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/duosecurity/duo_api_php.git", - "reference": "1589f2782f428ebbd7f4fc91265e934b1b6daef9" + "reference": "e754a1377d021c38111d06ecafef0778e60c9208" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/duosecurity/duo_api_php/zipball/1589f2782f428ebbd7f4fc91265e934b1b6daef9", - "reference": "1589f2782f428ebbd7f4fc91265e934b1b6daef9", + "url": "https://api.github.com/repos/duosecurity/duo_api_php/zipball/e754a1377d021c38111d06ecafef0778e60c9208", + "reference": "e754a1377d021c38111d06ecafef0778e60c9208", "shasum": "" }, "require": { @@ -1183,6 +1183,11 @@ "squizlabs/php_codesniffer": "2.*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, "autoload": { "psr-4": { "DuoAPI\\": "src/" @@ -1193,29 +1198,30 @@ "homepage": "https://duo.com/", "support": { "email": "support@duosecurity.com", - "source": "https://github.com/duosecurity/duo_api_php/tree/1.1.0" + "issues": "https://github.com/duosecurity/duo_api_php/issues", + "source": "https://github.com/duosecurity/duo_api_php/tree/1.2.0" }, - "time": "2023-06-09T17:55:59+00:00" + "time": "2025-04-23T14:49:38+00:00" }, { "name": "duosecurity/duo_universal_php", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/duosecurity/duo_universal_php.git", - "reference": "8734a47480d2d2f0539e8ee782675e052025d026" + "reference": "a2852c46949a2de9ca6da908e4353a81c61b43a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/duosecurity/duo_universal_php/zipball/8734a47480d2d2f0539e8ee782675e052025d026", - "reference": "8734a47480d2d2f0539e8ee782675e052025d026", + "url": "https://api.github.com/repos/duosecurity/duo_universal_php/zipball/a2852c46949a2de9ca6da908e4353a81c61b43a3", + "reference": "a2852c46949a2de9ca6da908e4353a81c61b43a3", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "firebase/php-jwt": "^6.0", - "php": ">=7.3" + "php": ">=7.4" }, "require-dev": { "phpunit/phpunit": "^9.0", @@ -1228,27 +1234,30 @@ } }, "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], "description": "A PHP implementation of the Duo Universal SDK.", "homepage": "https://duo.com/", "support": { "email": "support@duosecurity.com", "issues": "https://github.com/duosecurity/duo_universal_php/issues", - "source": "https://github.com/duosecurity/duo_universal_php/tree/1.0.2" + "source": "https://github.com/duosecurity/duo_universal_php/tree/1.1.0" }, - "time": "2023-01-13T18:47:58+00:00" + "time": "2025-03-05T18:33:28+00:00" }, { "name": "egulias/email-validator", - "version": "4.0.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "b115554301161fa21467629f1e1391c1936de517" + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517", - "reference": "b115554301161fa21467629f1e1391c1936de517", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", "shasum": "" }, "require": { @@ -1294,7 +1303,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/4.0.3" + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" }, "funding": [ { @@ -1302,20 +1311,20 @@ "type": "github" } ], - "time": "2024-12-27T00:36:43+00:00" + "time": "2025-03-06T22:45:56+00:00" }, { "name": "elastic/transport", - "version": "v8.10.0", + "version": "v8.11.0", "source": { "type": "git", "url": "https://github.com/elastic/elastic-transport-php.git", - "reference": "8be37d679637545e50b1cea9f8ee903888783021" + "reference": "1d476af5dc0b74530d59b67d5dd96ee39768d5a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/8be37d679637545e50b1cea9f8ee903888783021", - "reference": "8be37d679637545e50b1cea9f8ee903888783021", + "url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/1d476af5dc0b74530d59b67d5dd96ee39768d5a4", + "reference": "1d476af5dc0b74530d59b67d5dd96ee39768d5a4", "shasum": "" }, "require": { @@ -1333,7 +1342,7 @@ "nyholm/psr7": "^1.5", "open-telemetry/sdk": "^1.0", "php-http/mock-client": "^1.5", - "phpstan/phpstan": "^1.4", + "phpstan/phpstan": "^2.1", "phpunit/phpunit": "^9.5", "symfony/http-client": "^5.4" }, @@ -1358,22 +1367,22 @@ ], "support": { "issues": "https://github.com/elastic/elastic-transport-php/issues", - "source": "https://github.com/elastic/elastic-transport-php/tree/v8.10.0" + "source": "https://github.com/elastic/elastic-transport-php/tree/v8.11.0" }, - "time": "2024-08-14T08:55:07+00:00" + "time": "2025-04-02T08:20:33+00:00" }, { "name": "elasticsearch/elasticsearch", - "version": "v8.17.0", + "version": "v8.18.0", "source": { "type": "git", "url": "https://github.com/elastic/elasticsearch-php.git", - "reference": "6cd0fe6a95fdb7198a2795624927b094813b3d8b" + "reference": "df8ee73046c688ee9ce2d69cb5c54a03ca38cc5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/6cd0fe6a95fdb7198a2795624927b094813b3d8b", - "reference": "6cd0fe6a95fdb7198a2795624927b094813b3d8b", + "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/df8ee73046c688ee9ce2d69cb5c54a03ca38cc5c", + "reference": "df8ee73046c688ee9ce2d69cb5c54a03ca38cc5c", "shasum": "" }, "require": { @@ -1389,9 +1398,8 @@ "ext-zip": "*", "mockery/mockery": "^1.5", "nyholm/psr7": "^1.5", - "php-http/message-factory": "^1.0", "php-http/mock-client": "^1.5", - "phpstan/phpstan": "^1.4", + "phpstan/phpstan": "^2.1", "phpunit/phpunit": "^9.5", "psr/http-factory": "^1.0", "symfony/finder": "~4.0", @@ -1416,9 +1424,9 @@ ], "support": { "issues": "https://github.com/elastic/elasticsearch-php/issues", - "source": "https://github.com/elastic/elasticsearch-php/tree/v8.17.0" + "source": "https://github.com/elastic/elasticsearch-php/tree/v8.18.0" }, - "time": "2024-12-18T11:00:27+00:00" + "time": "2025-05-02T10:38:56+00:00" }, { "name": "ezimuel/guzzlestreams", @@ -1593,16 +1601,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.11.0", + "version": "v6.11.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712" + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/8f718f4dfc9c5d5f0c994cdfd103921b43592712", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", "shasum": "" }, "require": { @@ -1650,22 +1658,22 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" }, - "time": "2025-01-23T05:11:06+00:00" + "time": "2025-04-09T20:32:01+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.9.2", + "version": "7.9.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", "shasum": "" }, "require": { @@ -1762,7 +1770,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "source": "https://github.com/guzzle/guzzle/tree/7.9.3" }, "funding": [ { @@ -1778,20 +1786,20 @@ "type": "tidelift" } ], - "time": "2024-07-24T11:22:20+00:00" + "time": "2025-03-27T13:37:11+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.4", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", "shasum": "" }, "require": { @@ -1845,7 +1853,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.4" + "source": "https://github.com/guzzle/promises/tree/2.2.0" }, "funding": [ { @@ -1861,20 +1869,20 @@ "type": "tidelift" } ], - "time": "2024-10-17T10:06:22+00:00" + "time": "2025-03-27T13:27:01+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.0", + "version": "2.7.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", "shasum": "" }, "require": { @@ -1961,7 +1969,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" + "source": "https://github.com/guzzle/psr7/tree/2.7.1" }, "funding": [ { @@ -1977,34 +1985,44 @@ "type": "tidelift" } ], - "time": "2024-07-18T11:15:46+00:00" + "time": "2025-03-27T12:30:47+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.3.0", + "version": "6.4.2", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" + "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", - "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02", + "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-json": "*", + "marc-mabe/php-enum": "^4.0", + "php": "^7.2 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "friendsofphp/php-cs-fixer": "3.3.0", "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" + "marc-mabe/php-enum-phpstan": "^2.0", + "phpspec/prophecy": "^1.19", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^8.5" }, "bin": [ "bin/validate-json" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, "autoload": { "psr-4": { "JsonSchema\\": "src/JsonSchema/" @@ -2033,16 +2051,16 @@ } ], "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", + "homepage": "https://github.com/jsonrainbow/json-schema", "keywords": [ "json", "schema" ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" + "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2" }, - "time": "2024-07-06T21:00:26+00:00" + "time": "2025-06-03T18:27:04+00:00" }, { "name": "laminas/laminas-captcha", @@ -2323,16 +2341,16 @@ }, { "name": "laminas/laminas-escaper", - "version": "2.16.0", + "version": "2.17.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-escaper.git", - "reference": "9cf1f5317ca65b4fd5c6a3c2855e24a187b288c8" + "reference": "df1ef9503299a8e3920079a16263b578eaf7c3ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/9cf1f5317ca65b4fd5c6a3c2855e24a187b288c8", - "reference": "9cf1f5317ca65b4fd5c6a3c2855e24a187b288c8", + "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/df1ef9503299a8e3920079a16263b578eaf7c3ba", + "reference": "df1ef9503299a8e3920079a16263b578eaf7c3ba", "shasum": "" }, "require": { @@ -2380,7 +2398,7 @@ "type": "community_bridge" } ], - "time": "2025-02-17T12:40:19+00:00" + "time": "2025-05-06T19:29:36+00:00" }, { "name": "laminas/laminas-eventmanager", @@ -2452,20 +2470,21 @@ }, { "name": "laminas/laminas-feed", - "version": "2.23.0", + "version": "2.24.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-feed.git", - "reference": "23807e692b3174750b426143bd93572b71b6739a" + "reference": "3df6dfe39ce1f53df64eb12f9fcf9bb29074cd50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-feed/zipball/23807e692b3174750b426143bd93572b71b6739a", - "reference": "23807e692b3174750b426143bd93572b71b6739a", + "url": "https://api.github.com/repos/laminas/laminas-feed/zipball/3df6dfe39ce1f53df64eb12f9fcf9bb29074cd50", + "reference": "3df6dfe39ce1f53df64eb12f9fcf9bb29074cd50", "shasum": "" }, "require": { "ext-dom": "*", + "ext-filter": "*", "ext-libxml": "*", "laminas/laminas-escaper": "^2.9", "laminas/laminas-stdlib": "^3.6", @@ -2528,20 +2547,20 @@ "type": "community_bridge" } ], - "time": "2024-10-09T10:53:30+00:00" + "time": "2025-06-25T12:37:12+00:00" }, { "name": "laminas/laminas-filter", - "version": "2.40.0", + "version": "2.41.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-filter.git", - "reference": "9b32ba7c45a302ed349bf42061308e854d56e75b" + "reference": "eaa00111231bf6669826ae84d3abe85b94477585" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-filter/zipball/9b32ba7c45a302ed349bf42061308e854d56e75b", - "reference": "9b32ba7c45a302ed349bf42061308e854d56e75b", + "url": "https://api.github.com/repos/laminas/laminas-filter/zipball/eaa00111231bf6669826ae84d3abe85b94477585", + "reference": "eaa00111231bf6669826ae84d3abe85b94477585", "shasum": "" }, "require": { @@ -2607,20 +2626,20 @@ "type": "community_bridge" } ], - "time": "2025-01-06T21:36:57+00:00" + "time": "2025-05-05T02:02:31+00:00" }, { "name": "laminas/laminas-http", - "version": "2.21.0", + "version": "2.22.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-http.git", - "reference": "a9867e4d1cda3dbad208903239c83a3d670cce10" + "reference": "5052177fb8176e00b0d4b89108648f557be072b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-http/zipball/a9867e4d1cda3dbad208903239c83a3d670cce10", - "reference": "a9867e4d1cda3dbad208903239c83a3d670cce10", + "url": "https://api.github.com/repos/laminas/laminas-http/zipball/5052177fb8176e00b0d4b89108648f557be072b7", + "reference": "5052177fb8176e00b0d4b89108648f557be072b7", "shasum": "" }, "require": { @@ -2635,8 +2654,8 @@ }, "require-dev": { "ext-curl": "*", - "laminas/laminas-coding-standard": "~2.4.0", - "phpunit/phpunit": "^9.6.21" + "laminas/laminas-coding-standard": "^3.0.1", + "phpunit/phpunit": "^10.5.38" }, "suggest": { "paragonie/certainty": "For automated management of cacert.pem" @@ -2672,20 +2691,20 @@ "type": "community_bridge" } ], - "time": "2024-12-04T09:17:39+00:00" + "time": "2025-05-06T08:24:40+00:00" }, { "name": "laminas/laminas-i18n", - "version": "2.29.0", + "version": "2.30.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-i18n.git", - "reference": "9aa7ef6073556e9b4cfd8d9a0cb8e41cd3883454" + "reference": "397907ee061e147939364df9d6c485ac1e0fed87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-i18n/zipball/9aa7ef6073556e9b4cfd8d9a0cb8e41cd3883454", - "reference": "9aa7ef6073556e9b4cfd8d9a0cb8e41cd3883454", + "url": "https://api.github.com/repos/laminas/laminas-i18n/zipball/397907ee061e147939364df9d6c485ac1e0fed87", + "reference": "397907ee061e147939364df9d6c485ac1e0fed87", "shasum": "" }, "require": { @@ -2700,18 +2719,18 @@ "zendframework/zend-i18n": "*" }, "require-dev": { - "laminas/laminas-cache": "^3.12.1", - "laminas/laminas-cache-storage-adapter-memory": "^2.3.0", - "laminas/laminas-cache-storage-deprecated-factory": "^1.2", + "laminas/laminas-cache": "^3.13.0", + "laminas/laminas-cache-storage-adapter-memory": "^2.4.0", + "laminas/laminas-cache-storage-deprecated-factory": "^1.3", "laminas/laminas-coding-standard": "~2.5.0", - "laminas/laminas-config": "^3.9.0", - "laminas/laminas-eventmanager": "^3.13", - "laminas/laminas-filter": "^2.34", - "laminas/laminas-validator": "^2.49", - "laminas/laminas-view": "^2.34", - "phpunit/phpunit": "^10.5.11", - "psalm/plugin-phpunit": "^0.19.0", - "vimeo/psalm": "^5.22.2" + "laminas/laminas-config": "^3.10.1", + "laminas/laminas-eventmanager": "^3.14.0", + "laminas/laminas-filter": "^2.40", + "laminas/laminas-validator": "^2.64.2", + "laminas/laminas-view": "^2.36", + "phpunit/phpunit": "^10.5.45", + "psalm/plugin-phpunit": "^0.19.5", + "vimeo/psalm": "^6.10.0" }, "suggest": { "laminas/laminas-cache": "You should install this package to cache the translations", @@ -2758,7 +2777,7 @@ "type": "community_bridge" } ], - "time": "2024-10-11T09:44:53+00:00" + "time": "2025-04-15T09:07:02+00:00" }, { "name": "laminas/laminas-json", @@ -3853,16 +3872,16 @@ }, { "name": "laminas/laminas-view", - "version": "2.36.0", + "version": "2.39.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-view.git", - "reference": "ddc9207725cb50508ea48fcf1210dc8480264196" + "reference": "673f56af99b1780dc6babc3028d75724177969ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-view/zipball/ddc9207725cb50508ea48fcf1210dc8480264196", - "reference": "ddc9207725cb50508ea48fcf1210dc8480264196", + "url": "https://api.github.com/repos/laminas/laminas-view/zipball/673f56af99b1780dc6babc3028d75724177969ed", + "reference": "673f56af99b1780dc6babc3028d75724177969ed", "shasum": "" }, "require": { @@ -3878,6 +3897,8 @@ "psr/container": "^1 || ^2" }, "conflict": { + "amphp/dns": "<2.1.2", + "amphp/socket": "<2.3.1", "container-interop/container-interop": "<1.2", "laminas/laminas-router": "<3.0.1", "laminas/laminas-session": "<2.12", @@ -3885,23 +3906,23 @@ }, "require-dev": { "laminas/laminas-authentication": "^2.18", - "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-coding-standard": "~3.0.1", "laminas/laminas-feed": "^2.23", - "laminas/laminas-filter": "^2.39", - "laminas/laminas-http": "^2.20", - "laminas/laminas-i18n": "^2.29.0", + "laminas/laminas-filter": "^2.40", + "laminas/laminas-http": "^2.21", + "laminas/laminas-i18n": "^2.30.0", "laminas/laminas-modulemanager": "^2.17", "laminas/laminas-mvc": "^3.8.0", "laminas/laminas-mvc-i18n": "^1.9", - "laminas/laminas-mvc-plugin-flashmessenger": "^1.10.1", + "laminas/laminas-mvc-plugin-flashmessenger": "^1.11.0", "laminas/laminas-navigation": "^2.20.0", "laminas/laminas-paginator": "^2.19.0", - "laminas/laminas-permissions-acl": "^2.16", + "laminas/laminas-permissions-acl": "^2.17", "laminas/laminas-router": "^3.14.0", - "laminas/laminas-uri": "^2.12", - "phpunit/phpunit": "^10.5.38", - "psalm/plugin-phpunit": "^0.19.0", - "vimeo/psalm": "^5.26.1" + "laminas/laminas-uri": "^2.13", + "phpunit/phpunit": "^10.5.45", + "psalm/plugin-phpunit": "^0.19.5", + "vimeo/psalm": "^6.10.1" }, "suggest": { "laminas/laminas-authentication": "Laminas\\Authentication component", @@ -3949,20 +3970,20 @@ "type": "community_bridge" } ], - "time": "2024-11-21T17:42:20+00:00" + "time": "2025-04-30T08:01:59+00:00" }, { "name": "league/flysystem", - "version": "3.29.1", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", "shasum": "" }, "require": { @@ -3986,13 +4007,13 @@ "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", - "ext-mongodb": "^1.3", + "ext-mongodb": "^1.3|^2", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", - "mongodb/mongodb": "^1.2", + "mongodb/mongodb": "^1.2|^2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", @@ -4030,9 +4051,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.30.0" }, - "time": "2024-10-08T08:58:34+00:00" + "time": "2025-06-25T13:29:59+00:00" }, { "name": "league/flysystem-aws-s3-v3", @@ -4091,16 +4112,16 @@ }, { "name": "league/flysystem-local", - "version": "3.29.0", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", "shasum": "" }, "require": { @@ -4134,9 +4155,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" }, - "time": "2024-08-09T21:24:39+00:00" + "time": "2025-05-21T10:34:19+00:00" }, { "name": "league/mime-type-detection", @@ -4196,16 +4217,16 @@ }, { "name": "magento/composer", - "version": "1.10.1-beta1", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/magento/composer.git", - "reference": "276afa129efa4b11a20f7dddcad65d8b87522d2c" + "reference": "deb030aa57550aa95bf28e3809a2d6607c753a02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/magento/composer/zipball/276afa129efa4b11a20f7dddcad65d8b87522d2c", - "reference": "276afa129efa4b11a20f7dddcad65d8b87522d2c", + "url": "https://api.github.com/repos/magento/composer/zipball/deb030aa57550aa95bf28e3809a2d6607c753a02", + "reference": "deb030aa57550aa95bf28e3809a2d6607c753a02", "shasum": "" }, "require": { @@ -4230,9 +4251,9 @@ "description": "Magento composer library helps to instantiate Composer application and run composer commands.", "support": { "issues": "https://github.com/magento/composer/issues", - "source": "https://github.com/magento/composer/tree/1.10.1-beta1" + "source": "https://github.com/magento/composer/tree/1.10.1" }, - "time": "2025-01-07T17:44:55+00:00" + "time": "2025-04-02T22:30:31+00:00" }, { "name": "magento/composer-dependency-version-audit-plugin", @@ -4734,16 +4755,16 @@ }, { "name": "magento/zend-pdf", - "version": "1.16.4", + "version": "1.16.5", "source": { "type": "git", "url": "https://github.com/magento/magento-zend-pdf.git", - "reference": "b6e9fcbec29184bb4eb6fa4a261a79d5d92f7ff8" + "reference": "ce8e838cf04a41f5b2659509d628edf1416e4fbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/magento/magento-zend-pdf/zipball/b6e9fcbec29184bb4eb6fa4a261a79d5d92f7ff8", - "reference": "b6e9fcbec29184bb4eb6fa4a261a79d5d92f7ff8", + "url": "https://api.github.com/repos/magento/magento-zend-pdf/zipball/ce8e838cf04a41f5b2659509d628edf1416e4fbe", + "reference": "ce8e838cf04a41f5b2659509d628edf1416e4fbe", "shasum": "" }, "require": { @@ -4785,22 +4806,95 @@ ], "support": { "issues": "https://github.com/magento/magento-zend-pdf/issues", - "source": "https://github.com/magento/magento-zend-pdf/tree/1.16.4" + "source": "https://github.com/magento/magento-zend-pdf/tree/1.16.5" }, - "time": "2024-12-18T14:59:28+00:00" + "time": "2025-06-20T07:55:02+00:00" + }, + { + "name": "marc-mabe/php-enum", + "version": "v4.7.1", + "source": { + "type": "git", + "url": "https://github.com/marc-mabe/php-enum.git", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed", + "shasum": "" + }, + "require": { + "ext-reflection": "*", + "php": "^7.1 | ^8.0" + }, + "require-dev": { + "phpbench/phpbench": "^0.16.10 || ^1.0.4", + "phpstan/phpstan": "^1.3.1", + "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", + "vimeo/psalm": "^4.17.0 | ^5.26.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" + } + }, + "autoload": { + "psr-4": { + "MabeEnum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Marc Bennewitz", + "email": "dev@mabe.berlin", + "homepage": "https://mabe.berlin/", + "role": "Lead" + } + ], + "description": "Simple and fast implementation of enumerations with native PHP", + "homepage": "https://github.com/marc-mabe/php-enum", + "keywords": [ + "enum", + "enum-map", + "enum-set", + "enumeration", + "enumerator", + "enummap", + "enumset", + "map", + "set", + "type", + "type-hint", + "typehint" + ], + "support": { + "issues": "https://github.com/marc-mabe/php-enum/issues", + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1" + }, + "time": "2024-11-28T04:54:44+00:00" }, { "name": "monolog/monolog", - "version": "3.8.1", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", - "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6", + "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6", "shasum": "" }, "require": { @@ -4878,7 +4972,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.8.1" + "source": "https://github.com/Seldaek/monolog/tree/3.9.0" }, "funding": [ { @@ -4890,7 +4984,7 @@ "type": "tidelift" } ], - "time": "2024-12-05T17:15:07+00:00" + "time": "2025-03-24T10:02:05+00:00" }, { "name": "mtdowling/jmespath.php", @@ -4960,16 +5054,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.5.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", "shasum": "" }, "require": { @@ -5012,22 +5106,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-05-31T08:24:38+00:00" }, { "name": "open-telemetry/api", - "version": "1.2.2", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/api.git", - "reference": "8b925df3047628968bc5be722468db1b98b82d51" + "reference": "b3a9286f9c1c8247c83493c5b1fa475cd0cec7f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/8b925df3047628968bc5be722468db1b98b82d51", - "reference": "8b925df3047628968bc5be722468db1b98b82d51", + "url": "https://api.github.com/repos/opentelemetry-php/api/zipball/b3a9286f9c1c8247c83493c5b1fa475cd0cec7f7", + "reference": "b3a9286f9c1c8247c83493c5b1fa475cd0cec7f7", "shasum": "" }, "require": { @@ -5047,7 +5141,7 @@ ] }, "branch-alias": { - "dev-main": "1.1.x-dev" + "dev-main": "1.4.x-dev" } }, "autoload": { @@ -5084,20 +5178,20 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2025-02-03T21:49:11+00:00" + "time": "2025-06-19T23:36:51+00:00" }, { "name": "open-telemetry/context", - "version": "1.1.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/context.git", - "reference": "0cba875ea1953435f78aec7f1d75afa87bdbf7f3" + "reference": "1eb2b837ee9362db064a6b65d5ecce15a9f9f020" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/context/zipball/0cba875ea1953435f78aec7f1d75afa87bdbf7f3", - "reference": "0cba875ea1953435f78aec7f1d75afa87bdbf7f3", + "url": "https://api.github.com/repos/opentelemetry-php/context/zipball/1eb2b837ee9362db064a6b65d5ecce15a9f9f020", + "reference": "1eb2b837ee9362db064a6b65d5ecce15a9f9f020", "shasum": "" }, "require": { @@ -5143,20 +5237,20 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2024-08-21T00:29:20+00:00" + "time": "2025-05-07T23:36:50+00:00" }, { "name": "opensearch-project/opensearch-php", - "version": "2.4.2", + "version": "2.4.3", "source": { "type": "git", "url": "https://github.com/opensearch-project/opensearch-php.git", - "reference": "59302e519538d98644caf4441e7dc09b4c3da11a" + "reference": "db138f27996e18b1ef8f915dba5e2ecc0caeb357" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opensearch-project/opensearch-php/zipball/59302e519538d98644caf4441e7dc09b4c3da11a", - "reference": "59302e519538d98644caf4441e7dc09b4c3da11a", + "url": "https://api.github.com/repos/opensearch-project/opensearch-php/zipball/db138f27996e18b1ef8f915dba5e2ecc0caeb357", + "reference": "db138f27996e18b1ef8f915dba5e2ecc0caeb357", "shasum": "" }, "require": { @@ -5225,9 +5319,9 @@ ], "support": { "issues": "https://github.com/opensearch-project/opensearch-php/issues", - "source": "https://github.com/opensearch-project/opensearch-php/tree/2.4.2" + "source": "https://github.com/opensearch-project/opensearch-php/tree/2.4.3" }, - "time": "2025-02-20T07:13:07+00:00" + "time": "2025-03-10T06:56:21+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -5788,86 +5882,18 @@ }, "time": "2024-03-15T13:55:21+00:00" }, - { - "name": "phpseclib/mcrypt_compat", - "version": "2.0.6", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/mcrypt_compat.git", - "reference": "e5924504997b4f90772034cefd89dc2f4ec189dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/mcrypt_compat/zipball/e5924504997b4f90772034cefd89dc2f4ec189dc", - "reference": "e5924504997b4f90772034cefd89dc2f4ec189dc", - "shasum": "" - }, - "require": { - "php": ">=5.6.1", - "phpseclib/phpseclib": ">=3.0.36 <4.0.0" - }, - "provide": { - "ext-mcrypt": "5.6.40" - }, - "require-dev": { - "phpunit/phpunit": "^5.7|^6.0|^9.4" - }, - "suggest": { - "ext-openssl": "Will enable faster cryptographic operations" - }, - "type": "library", - "autoload": { - "files": [ - "lib/mcrypt.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "homepage": "http://phpseclib.sourceforge.net" - } - ], - "description": "PHP 5.x-8.x polyfill for mcrypt extension", - "keywords": [ - "cryptograpy", - "encryption", - "mcrypt", - "polyfill" - ], - "support": { - "email": "terrafrost@php.net", - "issues": "https://github.com/phpseclib/mcrypt_compat/issues", - "source": "https://github.com/phpseclib/mcrypt_compat" - }, - "funding": [ - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/mcrypt_compat", - "type": "tidelift" - } - ], - "time": "2024-02-26T14:52:18+00:00" - }, { "name": "phpseclib/phpseclib", - "version": "3.0.43", + "version": "3.0.46", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02" + "reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/709ec107af3cb2f385b9617be72af8cf62441d02", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6", + "reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6", "shasum": "" }, "require": { @@ -5948,7 +5974,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.43" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.46" }, "funding": [ { @@ -5964,7 +5990,7 @@ "type": "tidelift" } ], - "time": "2024-12-14T21:12:59+00:00" + "time": "2025-06-26T16:29:55+00:00" }, { "name": "psr/cache", @@ -6417,16 +6443,16 @@ }, { "name": "ramsey/collection", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -6434,25 +6460,22 @@ }, "require-dev": { "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.28.3", - "fakerphp/faker": "^1.21", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^1.0", - "mockery/mockery": "^1.5", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcsstandards/phpcsutils": "^1.0.0-rc1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18.4", - "ramsey/coding-standard": "^2.0.3", - "ramsey/conventional-commits": "^1.3", - "vimeo/psalm": "^5.4" + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" }, "type": "library", "extra": { @@ -6490,37 +6513,26 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], - "time": "2022-12-31T21:50:55+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", - "version": "4.7.6", + "version": "4.9.0", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/4e0e23cc785f0724a0e838279a9eb03f28b092a0", + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", - "ext-json": "*", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -6528,26 +6540,23 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "captainhook/captainhook": "^5.10", + "captainhook/captainhook": "^5.25", "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -6582,19 +6591,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.6" + "source": "https://github.com/ramsey/uuid/tree/4.9.0" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2024-04-27T21:32:50+00:00" + "time": "2025-06-25T14:20:11+00:00" }, { "name": "react/promise", @@ -6671,16 +6670,16 @@ }, { "name": "sabberworm/php-css-parser", - "version": "v8.7.0", + "version": "v8.8.0", "source": { "type": "git", "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", - "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf" + "reference": "3de493bdddfd1f051249af725c7e0d2c38fed740" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/f414ff953002a9b18e3a116f5e462c56f21237cf", - "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/3de493bdddfd1f051249af725c7e0d2c38fed740", + "reference": "3de493bdddfd1f051249af725c7e0d2c38fed740", "shasum": "" }, "require": { @@ -6688,7 +6687,7 @@ "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.40" + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41" }, "suggest": { "ext-mbstring": "for parsing UTF-8 CSS" @@ -6730,9 +6729,9 @@ ], "support": { "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", - "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.7.0" + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.8.0" }, - "time": "2024-10-27T17:38:32+00:00" + "time": "2025-03-23T17:59:05+00:00" }, { "name": "seld/jsonlint", @@ -6985,20 +6984,20 @@ }, { "name": "spomky-labs/pki-framework", - "version": "1.2.2", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/pki-framework.git", - "reference": "5ac374c3e295c8b917208ff41b4d30f76668478c" + "reference": "eced5b5ce70518b983ff2be486e902bbd15135ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/5ac374c3e295c8b917208ff41b4d30f76668478c", - "reference": "5ac374c3e295c8b917208ff41b4d30f76668478c", + "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/eced5b5ce70518b983ff2be486e902bbd15135ae", + "reference": "eced5b5ce70518b983ff2be486e902bbd15135ae", "shasum": "" }, "require": { - "brick/math": "^0.10|^0.11|^0.12", + "brick/math": "^0.10|^0.11|^0.12|^0.13", "ext-mbstring": "*", "php": ">=8.1" }, @@ -7013,7 +7012,7 @@ "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", "phpstan/phpstan-phpunit": "^1.1|^2.0", "phpstan/phpstan-strict-rules": "^1.3|^2.0", - "phpunit/phpunit": "^10.1|^11.0", + "phpunit/phpunit": "^10.1|^11.0|^12.0", "rector/rector": "^1.0|^2.0", "roave/security-advisories": "dev-latest", "symfony/string": "^6.4|^7.0", @@ -7078,7 +7077,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/pki-framework/issues", - "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.2.2" + "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.3.0" }, "funding": [ { @@ -7090,20 +7089,192 @@ "type": "patreon" } ], - "time": "2025-01-03T09:35:48+00:00" + "time": "2025-06-13T08:35:04+00:00" + }, + { + "name": "symfony/cache", + "version": "v6.4.23", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "c88690befb8d4a85dc321fb78d677507f5eb141b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/c88690befb8d4a85dc321fb78d677507f5eb141b", + "reference": "c88690befb8d4a85dc321fb78d677507f5eb141b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v6.4.23" + }, + "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": "2025-06-27T18:31:36+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868", + "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "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 caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-03-13T15:25:07+00:00" }, { "name": "symfony/config", - "version": "v7.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7716594aaae91d9141be080240172a92ecca4d44" + "reference": "ba62ae565f1327c2f6366726312ed828c85853bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7716594aaae91d9141be080240172a92ecca4d44", - "reference": "7716594aaae91d9141be080240172a92ecca4d44", + "url": "https://api.github.com/repos/symfony/config/zipball/ba62ae565f1327c2f6366726312ed828c85853bc", + "reference": "ba62ae565f1327c2f6366726312ed828c85853bc", "shasum": "" }, "require": { @@ -7149,7 +7320,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.2.3" + "source": "https://github.com/symfony/config/tree/v7.3.0" }, "funding": [ { @@ -7165,20 +7336,20 @@ "type": "tidelift" } ], - "time": "2025-01-22T12:07:01+00:00" + "time": "2025-05-15T09:04:05+00:00" }, { "name": "symfony/console", - "version": "v6.4.17", + "version": "v6.4.23", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "799445db3f15768ecc382ac5699e6da0520a0a04" + "reference": "9056771b8eca08d026cd3280deeec3cfd99c4d93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/799445db3f15768ecc382ac5699e6da0520a0a04", - "reference": "799445db3f15768ecc382ac5699e6da0520a0a04", + "url": "https://api.github.com/repos/symfony/console/zipball/9056771b8eca08d026cd3280deeec3cfd99c4d93", + "reference": "9056771b8eca08d026cd3280deeec3cfd99c4d93", "shasum": "" }, "require": { @@ -7243,7 +7414,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.17" + "source": "https://github.com/symfony/console/tree/v6.4.23" }, "funding": [ { @@ -7259,11 +7430,11 @@ "type": "tidelift" } ], - "time": "2024-12-07T12:07:30+00:00" + "time": "2025-06-27T19:37:22+00:00" }, { "name": "symfony/css-selector", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -7308,7 +7479,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" }, "funding": [ { @@ -7328,16 +7499,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v7.2.4", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "f0a1614cccb4b8431a97076f9debc08ddca321ca" + "reference": "8656c4848b48784c4bb8c4ae50d2b43f832cead8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f0a1614cccb4b8431a97076f9debc08ddca321ca", - "reference": "f0a1614cccb4b8431a97076f9debc08ddca321ca", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8656c4848b48784c4bb8c4ae50d2b43f832cead8", + "reference": "8656c4848b48784c4bb8c4ae50d2b43f832cead8", "shasum": "" }, "require": { @@ -7345,7 +7516,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^6.4.20|^7.2.5" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -7388,7 +7559,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.2.4" + "source": "https://github.com/symfony/dependency-injection/tree/v7.3.1" }, "funding": [ { @@ -7404,20 +7575,20 @@ "type": "tidelift" } ], - "time": "2025-02-21T09:47:16+00:00" + "time": "2025-06-24T04:04:43+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -7430,7 +7601,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7455,7 +7626,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -7471,20 +7642,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/error-handler", - "version": "v7.2.4", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "aabf79938aa795350c07ce6464dd1985607d95d5" + "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/aabf79938aa795350c07ce6464dd1985607d95d5", - "reference": "aabf79938aa795350c07ce6464dd1985607d95d5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/35b55b166f6752d6aaf21aa042fc5ed280fce235", + "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235", "shasum": "" }, "require": { @@ -7497,9 +7668,11 @@ "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -7530,7 +7703,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.2.4" + "source": "https://github.com/symfony/error-handler/tree/v7.3.1" }, "funding": [ { @@ -7546,20 +7719,20 @@ "type": "tidelift" } ], - "time": "2025-02-02T20:27:07+00:00" + "time": "2025-06-13T07:48:40+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", "shasum": "" }, "require": { @@ -7610,7 +7783,7 @@ "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.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0" }, "funding": [ { @@ -7626,20 +7799,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-04-22T09:11:45+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { @@ -7653,7 +7826,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7686,7 +7859,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -7702,11 +7875,11 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/filesystem", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -7752,7 +7925,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + "source": "https://github.com/symfony/filesystem/tree/v7.3.0" }, "funding": [ { @@ -7836,16 +8009,16 @@ }, { "name": "symfony/http-client", - "version": "v7.2.4", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6" + "reference": "4403d87a2c16f33345dca93407a8714ee8c05a64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", + "url": "https://api.github.com/repos/symfony/http-client/zipball/4403d87a2c16f33345dca93407a8714ee8c05a64", + "reference": "4403d87a2c16f33345dca93407a8714ee8c05a64", "shasum": "" }, "require": { @@ -7857,6 +8030,7 @@ }, "conflict": { "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", "symfony/http-foundation": "<6.4" }, @@ -7869,7 +8043,6 @@ "require-dev": { "amphp/http-client": "^4.2.1|^5.0", "amphp/http-tunnel": "^1.0|^2.0", - "amphp/socket": "^1.1", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", @@ -7911,7 +8084,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.2.4" + "source": "https://github.com/symfony/http-client/tree/v7.3.1" }, "funding": [ { @@ -7927,20 +8100,20 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-06-28T07:58:39+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.5.2", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645" + "reference": "75d7043853a42837e68111812f4d964b01e5101c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", "shasum": "" }, "require": { @@ -7953,7 +8126,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7989,7 +8162,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" }, "funding": [ { @@ -8005,20 +8178,20 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:49:48+00:00" + "time": "2025-04-29T11:18:49+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0" + "reference": "23dd60256610c86a3414575b70c596e5deff6ed9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ee1b504b8926198be89d05e5b6fc4c3810c090f0", - "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/23dd60256610c86a3414575b70c596e5deff6ed9", + "reference": "23dd60256610c86a3414575b70c596e5deff6ed9", "shasum": "" }, "require": { @@ -8035,6 +8208,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -8067,7 +8241,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.3" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.1" }, "funding": [ { @@ -8083,20 +8257,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-06-23T15:07:14+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.4", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9f1103734c5789798fefb90e91de4586039003ed" + "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f1103734c5789798fefb90e91de4586039003ed", - "reference": "9f1103734c5789798fefb90e91de4586039003ed", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1644879a66e4aa29c36fe33dfa6c54b450ce1831", + "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831", "shasum": "" }, "require": { @@ -8104,8 +8278,8 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -8181,7 +8355,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.4" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.1" }, "funding": [ { @@ -8197,20 +8371,20 @@ "type": "tidelift" } ], - "time": "2025-02-26T11:01:22+00:00" + "time": "2025-06-28T08:24:55+00:00" }, { "name": "symfony/intl", - "version": "v6.4.15", + "version": "v6.4.23", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "b1d5e8d82615b60f229216edfee0b59e2ef66da6" + "reference": "a3b12ce29a770d1f26c380dabf56a71bc2a88c84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/b1d5e8d82615b60f229216edfee0b59e2ef66da6", - "reference": "b1d5e8d82615b60f229216edfee0b59e2ef66da6", + "url": "https://api.github.com/repos/symfony/intl/zipball/a3b12ce29a770d1f26c380dabf56a71bc2a88c84", + "reference": "a3b12ce29a770d1f26c380dabf56a71bc2a88c84", "shasum": "" }, "require": { @@ -8264,7 +8438,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.4.15" + "source": "https://github.com/symfony/intl/tree/v6.4.23" }, "funding": [ { @@ -8280,20 +8454,20 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:28:48+00:00" + "time": "2025-06-06T07:42:46+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.18", + "version": "v6.4.23", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11" + "reference": "a480322ddf8e54de262c9bca31fdcbe26b553de5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", - "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", + "url": "https://api.github.com/repos/symfony/mailer/zipball/a480322ddf8e54de262c9bca31fdcbe26b553de5", + "reference": "a480322ddf8e54de262c9bca31fdcbe26b553de5", "shasum": "" }, "require": { @@ -8344,7 +8518,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.18" + "source": "https://github.com/symfony/mailer/tree/v6.4.23" }, "funding": [ { @@ -8360,20 +8534,20 @@ "type": "tidelift" } ], - "time": "2025-01-24T15:27:15+00:00" + "time": "2025-06-26T21:24:02+00:00" }, { "name": "symfony/mime", - "version": "v6.4.19", + "version": "v6.4.21", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3" + "reference": "fec8aa5231f3904754955fad33c2db50594d22d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", - "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", + "url": "https://api.github.com/repos/symfony/mime/zipball/fec8aa5231f3904754955fad33c2db50594d22d1", + "reference": "fec8aa5231f3904754955fad33c2db50594d22d1", "shasum": "" }, "require": { @@ -8429,7 +8603,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.19" + "source": "https://github.com/symfony/mime/tree/v6.4.21" }, "funding": [ { @@ -8445,11 +8619,11 @@ "type": "tidelift" } ], - "time": "2025-02-17T21:23:52+00:00" + "time": "2025-04-27T13:27:38+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -8508,7 +8682,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" }, "funding": [ { @@ -8528,7 +8702,7 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", @@ -8586,7 +8760,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" }, "funding": [ { @@ -8606,16 +8780,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { @@ -8669,7 +8843,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" }, "funding": [ { @@ -8685,11 +8859,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-10T14:38:51+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -8750,7 +8924,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" }, "funding": [ { @@ -8770,19 +8944,20 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -8830,7 +9005,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" }, "funding": [ { @@ -8846,11 +9021,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -8906,7 +9081,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0" }, "funding": [ { @@ -8926,16 +9101,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -8986,7 +9161,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" }, "funding": [ { @@ -9002,11 +9177,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -9062,7 +9237,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0" }, "funding": [ { @@ -9082,7 +9257,7 @@ }, { "name": "symfony/polyfill-php82", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php82.git", @@ -9138,7 +9313,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php82/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php82/tree/v1.32.0" }, "funding": [ { @@ -9158,7 +9333,7 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", @@ -9214,7 +9389,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" }, "funding": [ { @@ -9234,16 +9409,16 @@ }, { "name": "symfony/process", - "version": "v6.4.19", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3" + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", - "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", + "url": "https://api.github.com/repos/symfony/process/zipball/e2a61c16af36c9a07e5c9906498b73e091949a20", + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20", "shasum": "" }, "require": { @@ -9275,7 +9450,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.19" + "source": "https://github.com/symfony/process/tree/v6.4.20" }, "funding": [ { @@ -9291,20 +9466,20 @@ "type": "tidelift" } ], - "time": "2025-02-04T13:35:48+00:00" + "time": "2025-03-10T17:11:00+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", "shasum": "" }, "require": { @@ -9322,7 +9497,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -9358,7 +9533,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" }, "funding": [ { @@ -9374,20 +9549,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-04-25T09:37:31+00:00" }, { "name": "symfony/string", - "version": "v6.4.15", + "version": "v6.4.21", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" + "reference": "73e2c6966a5aef1d4892873ed5322245295370c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "url": "https://api.github.com/repos/symfony/string/zipball/73e2c6966a5aef1d4892873ed5322245295370c6", + "reference": "73e2c6966a5aef1d4892873ed5322245295370c6", "shasum": "" }, "require": { @@ -9444,7 +9619,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.15" + "source": "https://github.com/symfony/string/tree/v6.4.21" }, "funding": [ { @@ -9460,24 +9635,25 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:12+00:00" + "time": "2025-04-18T15:23:29+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" + "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", + "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -9527,7 +9703,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.1" }, "funding": [ { @@ -9543,24 +9719,25 @@ "type": "tidelift" } ], - "time": "2025-01-17T11:39:41+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "4ede73aa7a73d81506002d2caadbbdad1ef5b69a" + "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/4ede73aa7a73d81506002d2caadbbdad1ef5b69a", - "reference": "4ede73aa7a73d81506002d2caadbbdad1ef5b69a", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c9a1168891b5aaadfd6332ef44393330b3498c4c", + "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { "symfony/property-access": "^6.4|^7.0", @@ -9603,7 +9780,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.2.4" + "source": "https://github.com/symfony/var-exporter/tree/v7.3.0" }, "funding": [ { @@ -9619,20 +9796,20 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-05-15T09:04:05+00:00" }, { "name": "symfony/yaml", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" + "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", - "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0c3555045a46ab3cd4cc5a69d161225195230edb", + "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb", "shasum": "" }, "require": { @@ -9675,7 +9852,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.3" + "source": "https://github.com/symfony/yaml/tree/v7.3.1" }, "funding": [ { @@ -9691,7 +9868,7 @@ "type": "tidelift" } ], - "time": "2025-01-07T12:55:42+00:00" + "time": "2025-06-03T06:57:57+00:00" }, { "name": "tedivm/jshrink", @@ -9812,16 +9989,16 @@ }, { "name": "web-token/jwt-framework", - "version": "3.4.7", + "version": "3.4.8", "source": { "type": "git", "url": "https://github.com/web-token/jwt-framework.git", - "reference": "d7ba8efd5bfab0ef88af600a2a69e5e1e75e8f68" + "reference": "788267095b0b0c3ba42559eb2ec955f416628ec0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-token/jwt-framework/zipball/d7ba8efd5bfab0ef88af600a2a69e5e1e75e8f68", - "reference": "d7ba8efd5bfab0ef88af600a2a69e5e1e75e8f68", + "url": "https://api.github.com/repos/web-token/jwt-framework/zipball/788267095b0b0c3ba42559eb2ec955f416628ec0", + "reference": "788267095b0b0c3ba42559eb2ec955f416628ec0", "shasum": "" }, "require": { @@ -9833,7 +10010,7 @@ "paragonie/constant_time_encoding": "^2.6|^3.0", "paragonie/sodium_compat": "^1.20|^2.0", "php": ">=8.1", - "psr/cache": "^3.0", + "psr/cache": "^2.0|^3.0", "psr/clock": "^1.0", "psr/event-dispatcher": "^1.0", "psr/http-client": "^1.0", @@ -9965,7 +10142,7 @@ ], "support": { "issues": "https://github.com/web-token/jwt-framework/issues", - "source": "https://github.com/web-token/jwt-framework/tree/3.4.7" + "source": "https://github.com/web-token/jwt-framework/tree/3.4.8" }, "funding": [ { @@ -9977,7 +10154,7 @@ "type": "patreon" } ], - "time": "2024-12-12T18:06:31+00:00" + "time": "2025-05-07T09:11:18+00:00" }, { "name": "webimpress/safe-writer", @@ -10040,16 +10217,16 @@ }, { "name": "webonyx/graphql-php", - "version": "v15.19.1", + "version": "v15.21.0", "source": { "type": "git", "url": "https://github.com/webonyx/graphql-php.git", - "reference": "fa01712b1a170ddc1d92047011b2f4c2bdfa8234" + "reference": "68549e75a6f113f08c91d12ed6d0ec3fd971087b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/fa01712b1a170ddc1d92047011b2f4c2bdfa8234", - "reference": "fa01712b1a170ddc1d92047011b2f4c2bdfa8234", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/68549e75a6f113f08c91d12ed6d0ec3fd971087b", + "reference": "68549e75a6f113f08c91d12ed6d0ec3fd971087b", "shasum": "" }, "require": { @@ -10062,22 +10239,22 @@ "amphp/http-server": "^2.1", "dms/phpunit-arraysubset-asserts": "dev-master", "ergebnis/composer-normalize": "^2.28", - "friendsofphp/php-cs-fixer": "3.65.0", - "mll-lab/php-cs-fixer-config": "^5.9.2", + "friendsofphp/php-cs-fixer": "3.82.0", + "mll-lab/php-cs-fixer-config": "5.11.0", "nyholm/psr7": "^1.5", "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "1.12.12", - "phpstan/phpstan-phpunit": "1.4.1", - "phpstan/phpstan-strict-rules": "1.6.1", + "phpstan/phpstan": "2.1.17", + "phpstan/phpstan-phpunit": "2.0.6", + "phpstan/phpstan-strict-rules": "2.0.4", "phpunit/phpunit": "^9.5 || ^10.5.21 || ^11", "psr/http-message": "^1 || ^2", "react/http": "^1.6", "react/promise": "^2.0 || ^3.0", - "rector/rector": "^1.0", + "rector/rector": "^2.0", "symfony/polyfill-php81": "^1.23", "symfony/var-exporter": "^5 || ^6 || ^7", - "thecodingmachine/safe": "^1.3 || ^2" + "thecodingmachine/safe": "^1.3 || ^2 || ^3" }, "suggest": { "amphp/http-server": "To leverage async resolving with webserver on AMPHP platform", @@ -10102,7 +10279,7 @@ ], "support": { "issues": "https://github.com/webonyx/graphql-php/issues", - "source": "https://github.com/webonyx/graphql-php/tree/v15.19.1" + "source": "https://github.com/webonyx/graphql-php/tree/v15.21.0" }, "funding": [ { @@ -10110,27 +10287,27 @@ "type": "open_collective" } ], - "time": "2024-12-19T10:52:18+00:00" + "time": "2025-07-08T08:22:01+00:00" }, { "name": "wikimedia/less.php", - "version": "v5.2.0", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/wikimedia/less.php.git", - "reference": "bbfae3b37472466bbb434f09084abbf5df7d9538" + "reference": "75a0db4a7698b5fe668af553329605ac40f374af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wikimedia/less.php/zipball/bbfae3b37472466bbb434f09084abbf5df7d9538", - "reference": "bbfae3b37472466bbb434f09084abbf5df7d9538", + "url": "https://api.github.com/repos/wikimedia/less.php/zipball/75a0db4a7698b5fe668af553329605ac40f374af", + "reference": "75a0db4a7698b5fe668af553329605ac40f374af", "shasum": "" }, "require": { - "php": ">=7.4.3" + "php": ">=8.1" }, "require-dev": { - "mediawiki/mediawiki-codesniffer": "45.0.0", + "mediawiki/mediawiki-codesniffer": "47.0.0", "mediawiki/mediawiki-phan-config": "0.15.1", "mediawiki/minus-x": "1.1.3", "php-parallel-lint/php-console-highlighter": "1.0.0", @@ -10183,9 +10360,9 @@ ], "support": { "issues": "https://github.com/wikimedia/less.php/issues", - "source": "https://github.com/wikimedia/less.php/tree/v5.2.0" + "source": "https://github.com/wikimedia/less.php/tree/v5.4.0" }, - "time": "2025-01-30T03:23:45+00:00" + "time": "2025-07-03T20:27:02+00:00" } ], "packages-dev": [ @@ -10405,16 +10582,16 @@ }, { "name": "behat/gherkin", - "version": "v4.12.0", + "version": "v4.14.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "cc3a7e224b36373be382b53ef02ede0f1807bb58" + "reference": "34c9b59c59355a7b4c53b9f041c8dbd1c8acc3b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cc3a7e224b36373be382b53ef02ede0f1807bb58", - "reference": "cc3a7e224b36373be382b53ef02ede0f1807bb58", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/34c9b59c59355a7b4c53b9f041c8dbd1c8acc3b4", + "reference": "34c9b59c59355a7b4c53b9f041c8dbd1c8acc3b4", "shasum": "" }, "require": { @@ -10422,13 +10599,13 @@ "php": "8.1.* || 8.2.* || 8.3.* || 8.4.*" }, "require-dev": { - "cucumber/cucumber": "dev-gherkin-24.1.0", + "cucumber/gherkin-monorepo": "dev-gherkin-v32.1.1", "friendsofphp/php-cs-fixer": "^3.65", + "mikey179/vfsstream": "^1.6", "phpstan/extension-installer": "^1", "phpstan/phpstan": "^2", "phpstan/phpstan-phpunit": "^2", "phpunit/phpunit": "^10.5", - "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", "symfony/yaml": "^5.4 || ^6.4 || ^7.0" }, "suggest": { @@ -10441,8 +10618,8 @@ } }, "autoload": { - "psr-0": { - "Behat\\Gherkin": "src/" + "psr-4": { + "Behat\\Gherkin\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -10468,9 +10645,9 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.12.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.14.0" }, - "time": "2025-02-26T14:28:23+00:00" + "time": "2025-05-23T15:06:40+00:00" }, { "name": "clue/ndjson-react", @@ -10538,33 +10715,33 @@ }, { "name": "codeception/codeception", - "version": "5.2.1", + "version": "5.3.2", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "6e06224627dcd89e7d4753f44ba4df35034b6314" + "reference": "582112d7a603d575e41638df1e96900b10ae91b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/6e06224627dcd89e7d4753f44ba4df35034b6314", - "reference": "6e06224627dcd89e7d4753f44ba4df35034b6314", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/582112d7a603d575e41638df1e96900b10ae91b8", + "reference": "582112d7a603d575e41638df1e96900b10ae91b8", "shasum": "" }, "require": { - "behat/gherkin": "^4.6.2", - "codeception/lib-asserts": "^2.0", + "behat/gherkin": "^4.12", + "codeception/lib-asserts": "^2.2", "codeception/stub": "^4.1", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "php": "^8.1", - "phpunit/php-code-coverage": "^9.2 || ^10.0 || ^11.0 || ^12.0", - "phpunit/php-text-template": "^2.0 || ^3.0 || ^4.0 || ^5.0", - "phpunit/php-timer": "^5.0.3 || ^6.0 || ^7.0 || ^8.0", - "phpunit/phpunit": "^9.5.20 || ^10.0 || ^11.0 || ^12.0", - "psy/psysh": "^0.11.2 || ^0.12", - "sebastian/comparator": "^4.0.5 || ^5.0 || ^6.0 || ^7.0", - "sebastian/diff": "^4.0.3 || ^5.0 || ^6.0 || ^7.0", + "php": "^8.2", + "phpunit/php-code-coverage": "^9.2 | ^10.0 | ^11.0 | ^12.0", + "phpunit/php-text-template": "^2.0 | ^3.0 | ^4.0 | ^5.0", + "phpunit/php-timer": "^5.0.3 | ^6.0 | ^7.0 | ^8.0", + "phpunit/phpunit": "^9.5.20 | ^10.0 | ^11.0 | ^12.0", + "psy/psysh": "^0.11.2 | ^0.12", + "sebastian/comparator": "^4.0.5 | ^5.0 | ^6.0 | ^7.0", + "sebastian/diff": "^4.0.3 | ^5.0 | ^6.0 | ^7.0", "symfony/console": ">=5.4.24 <8.0", "symfony/css-selector": ">=5.4.24 <8.0", "symfony/event-dispatcher": ">=5.4.24 <8.0", @@ -10588,10 +10765,16 @@ "codeception/module-db": "*@dev", "codeception/module-filesystem": "*@dev", "codeception/module-phpbrowser": "*@dev", + "codeception/module-webdriver": "*@dev", "codeception/util-universalframework": "*@dev", + "doctrine/orm": "^3.3", "ext-simplexml": "*", "jetbrains/phpstorm-attributes": "^1.0", + "laravel-zero/phar-updater": "^1.4", + "php-webdriver/webdriver": "^1.15", + "stecman/symfony-console-completion": "^0.14", "symfony/dotenv": ">=5.4.24 <8.0", + "symfony/error-handler": ">=5.4.24 <8.0", "symfony/process": ">=5.4.24 <8.0", "vlucas/phpdotenv": "^5.1" }, @@ -10647,7 +10830,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/5.2.1" + "source": "https://github.com/Codeception/Codeception/tree/5.3.2" }, "funding": [ { @@ -10655,20 +10838,20 @@ "type": "open_collective" } ], - "time": "2025-02-20T14:52:49+00:00" + "time": "2025-05-26T07:47:39+00:00" }, { "name": "codeception/lib-asserts", - "version": "2.1.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/Codeception/lib-asserts.git", - "reference": "b8c7dff552249e560879c682ba44a4b963af91bc" + "reference": "06750a60af3ebc66faab4313981accec1be4eefc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/b8c7dff552249e560879c682ba44a4b963af91bc", - "reference": "b8c7dff552249e560879c682ba44a4b963af91bc", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/06750a60af3ebc66faab4313981accec1be4eefc", + "reference": "06750a60af3ebc66faab4313981accec1be4eefc", "shasum": "" }, "require": { @@ -10707,9 +10890,9 @@ ], "support": { "issues": "https://github.com/Codeception/lib-asserts/issues", - "source": "https://github.com/Codeception/lib-asserts/tree/2.1.0" + "source": "https://github.com/Codeception/lib-asserts/tree/2.2.0" }, - "time": "2023-02-10T18:36:23+00:00" + "time": "2025-03-10T20:41:33+00:00" }, { "name": "codeception/lib-web", @@ -10766,22 +10949,22 @@ }, { "name": "codeception/module-asserts", - "version": "3.0.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/Codeception/module-asserts.git", - "reference": "1b6b150b30586c3614e7e5761b31834ed7968603" + "reference": "eb1f7c980423888f3def5116635754ae4a75bd47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/1b6b150b30586c3614e7e5761b31834ed7968603", - "reference": "1b6b150b30586c3614e7e5761b31834ed7968603", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/eb1f7c980423888f3def5116635754ae4a75bd47", + "reference": "eb1f7c980423888f3def5116635754ae4a75bd47", "shasum": "" }, "require": { "codeception/codeception": "*@dev", - "codeception/lib-asserts": "^2.0", - "php": "^8.0" + "codeception/lib-asserts": "^2.2", + "php": "^8.2" }, "conflict": { "codeception/codeception": "<5.0" @@ -10817,9 +11000,9 @@ ], "support": { "issues": "https://github.com/Codeception/module-asserts/issues", - "source": "https://github.com/Codeception/module-asserts/tree/3.0.0" + "source": "https://github.com/Codeception/module-asserts/tree/3.2.0" }, - "time": "2022-02-16T19:48:08+00:00" + "time": "2025-05-02T02:33:11+00:00" }, { "name": "codeception/module-webdriver", @@ -10925,16 +11108,16 @@ }, { "name": "csharpru/vault-php", - "version": "4.4.0", + "version": "4.4.1", "source": { "type": "git", "url": "https://github.com/CSharpRU/vault-php.git", - "reference": "ba4cbd7b55f1ce10bc72a7e4c36cfd87a42d3573" + "reference": "2064cd7a377b066c6d256eef1d7f4f4ecbb927f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/ba4cbd7b55f1ce10bc72a7e4c36cfd87a42d3573", - "reference": "ba4cbd7b55f1ce10bc72a7e4c36cfd87a42d3573", + "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/2064cd7a377b066c6d256eef1d7f4f4ecbb927f1", + "reference": "2064cd7a377b066c6d256eef1d7f4f4ecbb927f1", "shasum": "" }, "require": { @@ -10951,7 +11134,7 @@ "cache/array-adapter": "^1.0", "codeception/codeception": "^4.1", "codeception/module-asserts": "^1.3", - "laminas/laminas-diactoros": "^2.3", + "laminas/laminas-diactoros": "^2.3 || ^3.0", "php-vcr/php-vcr": "^1.5", "symfony/event-dispatcher": "<5.0" }, @@ -10982,34 +11165,34 @@ ], "support": { "issues": "https://github.com/CSharpRU/vault-php/issues", - "source": "https://github.com/CSharpRU/vault-php/tree/4.4.0" + "source": "https://github.com/CSharpRU/vault-php/tree/4.4.1" }, - "time": "2023-11-22T11:38:41+00:00" + "time": "2025-04-23T08:42:13+00:00" }, { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.0.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "4be43904336affa5c2f70744a348312336afd0da" + "reference": "6e0fa428497bf560152ee73ffbb8af5c6a56b0dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", - "reference": "4be43904336affa5c2f70744a348312336afd0da", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/6e0fa428497bf560152ee73ffbb8af5c6a56b0dd", + "reference": "6e0fa428497bf560152ee73ffbb8af5c6a56b0dd", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0", + "composer-plugin-api": "^2.2", "php": ">=5.4", "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" }, "require-dev": { - "composer/composer": "*", + "composer/composer": "^2.2", "ext-json": "*", "ext-zip": "*", - "php-parallel-lint/php-parallel-lint": "^1.3.1", + "php-parallel-lint/php-parallel-lint": "^1.4.0", "phpcompatibility/php-compatibility": "^9.0", "yoast/phpunit-polyfills": "^1.0" }, @@ -11029,9 +11212,9 @@ "authors": [ { "name": "Franck Nijhof", - "email": "franck.nijhof@dealerdirect.com", - "homepage": "http://www.frenck.nl", - "role": "Developer / IT Manager" + "email": "opensource@frenck.dev", + "homepage": "https://frenck.dev", + "role": "Open source developer" }, { "name": "Contributors", @@ -11039,7 +11222,6 @@ } ], "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "homepage": "http://www.dealerdirect.com", "keywords": [ "PHPCodeSniffer", "PHP_CodeSniffer", @@ -11060,9 +11242,28 @@ ], "support": { "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", "source": "https://github.com/PHPCSStandards/composer-installer" }, - "time": "2023-01-05T11:28:13+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" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-06-27T17:24:01+00:00" }, { "name": "dg/bypass-finals", @@ -11303,57 +11504,59 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.70.0", + "version": "v3.82.2", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "2ecd5aae0edc937f0d5aa4a22d1d705c6b2e084e" + "reference": "684ed3ab41008a2a4848de8bde17eb168c596247" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2ecd5aae0edc937f0d5aa4a22d1d705c6b2e084e", - "reference": "2ecd5aae0edc937f0d5aa4a22d1d705c6b2e084e", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/684ed3ab41008a2a4848de8bde17eb168c596247", + "reference": "684ed3ab41008a2a4848de8bde17eb168c596247", "shasum": "" }, "require": { "clue/ndjson-react": "^1.0", "composer/semver": "^3.4", - "composer/xdebug-handler": "^3.0.3", + "composer/xdebug-handler": "^3.0.5", "ext-filter": "*", + "ext-hash": "*", "ext-json": "*", "ext-tokenizer": "*", "fidry/cpu-core-counter": "^1.2", "php": "^7.4 || ^8.0", - "react/child-process": "^0.6.5", + "react/child-process": "^0.6.6", "react/event-loop": "^1.0", - "react/promise": "^2.0 || ^3.0", + "react/promise": "^2.11 || ^3.0", "react/socket": "^1.0", "react/stream": "^1.0", - "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0", - "symfony/console": "^5.4 || ^6.4 || ^7.0", - "symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", - "symfony/finder": "^5.4 || ^6.4 || ^7.0", - "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0", - "symfony/polyfill-mbstring": "^1.31", - "symfony/polyfill-php80": "^1.31", - "symfony/polyfill-php81": "^1.31", - "symfony/process": "^5.4 || ^6.4 || ^7.2", - "symfony/stopwatch": "^5.4 || ^6.4 || ^7.0" - }, - "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.5", - "infection/infection": "^0.29.10", - "justinrainbow/json-schema": "^5.3 || ^6.0", - "keradus/cli-executor": "^2.1", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", + "symfony/console": "^5.4.45 || ^6.4.13 || ^7.0", + "symfony/event-dispatcher": "^5.4.45 || ^6.4.13 || ^7.0", + "symfony/filesystem": "^5.4.45 || ^6.4.13 || ^7.0", + "symfony/finder": "^5.4.45 || ^6.4.17 || ^7.0", + "symfony/options-resolver": "^5.4.45 || ^6.4.16 || ^7.0", + "symfony/polyfill-mbstring": "^1.32", + "symfony/polyfill-php80": "^1.32", + "symfony/polyfill-php81": "^1.32", + "symfony/process": "^5.4.47 || ^6.4.20 || ^7.2", + "symfony/stopwatch": "^5.4.45 || ^6.4.19 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3.1 || ^2.6", + "infection/infection": "^0.29.14", + "justinrainbow/json-schema": "^5.3 || ^6.4", + "keradus/cli-executor": "^2.2", "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.7", + "php-coveralls/php-coveralls": "^2.8", "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.7", - "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.0", - "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.0" + "phpunit/phpunit": "^9.6.23 || ^10.5.47 || ^11.5.25", + "symfony/polyfill-php84": "^1.32", + "symfony/var-dumper": "^5.4.48 || ^6.4.23 || ^7.3.1", + "symfony/yaml": "^5.4.45 || ^6.4.23 || ^7.3.1" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -11394,7 +11597,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.70.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.82.2" }, "funding": [ { @@ -11402,20 +11605,20 @@ "type": "github" } ], - "time": "2025-02-22T23:30:51+00:00" + "time": "2025-07-08T21:13:15+00:00" }, { "name": "laminas/laminas-diactoros", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "143a16306602ce56b8b092a7914fef03c37f9ed2" + "reference": "b068eac123f21c0e592de41deeb7403b88e0a89f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/143a16306602ce56b8b092a7914fef03c37f9ed2", - "reference": "143a16306602ce56b8b092a7914fef03c37f9ed2", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/b068eac123f21c0e592de41deeb7403b88e0a89f", + "reference": "b068eac123f21c0e592de41deeb7403b88e0a89f", "shasum": "" }, "require": { @@ -11436,7 +11639,7 @@ "ext-gd": "*", "ext-libxml": "*", "http-interop/http-factory-tests": "^2.2.0", - "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-coding-standard": "~3.0.0", "php-http/psr7-integration-tests": "^1.4.0", "phpunit/phpunit": "^10.5.36", "psalm/plugin-phpunit": "^0.19.0", @@ -11490,7 +11693,7 @@ "type": "community_bridge" } ], - "time": "2024-10-14T11:59:49+00:00" + "time": "2025-05-05T16:03:34+00:00" }, { "name": "magento/magento-coding-standard", @@ -11752,16 +11955,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.13.0", + "version": "1.13.3", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + "reference": "faed855a7b5f4d4637717c2b3863e277116beb36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/faed855a7b5f4d4637717c2b3863e277116beb36", + "reference": "faed855a7b5f4d4637717c2b3863e277116beb36", "shasum": "" }, "require": { @@ -11800,7 +12003,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.3" }, "funding": [ { @@ -11808,7 +12011,7 @@ "type": "tidelift" } ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2025-07-05T12:25:42+00:00" }, { "name": "pdepend/pdepend", @@ -11816,12 +12019,12 @@ "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "f8300ed0136076b6a818cbb5104e291759fef55d" + "reference": "04632709b73ef136bcc5b5b32708bc130df0ca2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f8300ed0136076b6a818cbb5104e291759fef55d", - "reference": "f8300ed0136076b6a818cbb5104e291759fef55d", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/04632709b73ef136bcc5b5b32708bc130df0ca2e", + "reference": "04632709b73ef136bcc5b5b32708bc130df0ca2e", "shasum": "" }, "require": { @@ -11876,7 +12079,7 @@ "type": "tidelift" } ], - "time": "2024-10-05T19:22:38+00:00" + "time": "2025-03-18T18:57:34+00:00" }, { "name": "phar-io/manifest", @@ -12064,29 +12267,29 @@ }, { "name": "phpcsstandards/phpcsutils", - "version": "1.0.12", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", - "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c" + "reference": "65355670ac17c34cd235cf9d3ceae1b9252c4dad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/87b233b00daf83fb70f40c9a28692be017ea7c6c", - "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/65355670ac17c34cd235cf9d3ceae1b9252c4dad", + "reference": "65355670ac17c34cd235cf9d3ceae1b9252c4dad", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", "php": ">=5.4", - "squizlabs/php_codesniffer": "^3.10.0 || 4.0.x-dev@dev" + "squizlabs/php_codesniffer": "^3.13.0 || ^4.0" }, "require-dev": { "ext-filter": "*", "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3.2", + "php-parallel-lint/php-parallel-lint": "^1.4.0", "phpcsstandards/phpcsdevcs": "^1.1.6", - "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" + "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0 || ^3.0.0" }, "type": "phpcodesniffer-standard", "extra": { @@ -12123,6 +12326,7 @@ "phpcodesniffer-standard", "phpcs", "phpcs3", + "phpcs4", "standards", "static analysis", "tokens", @@ -12146,9 +12350,13 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2024-05-20T13:34:27+00:00" + "time": "2025-06-12T04:32:33+00:00" }, { "name": "phpmd/phpmd", @@ -12156,12 +12364,12 @@ "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "0521a7d3369f416e49bde373b6c778a271cfe6e7" + "reference": "3a8f6ed5293a244cdf4ec3a4f1ebc32db1dadf27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/0521a7d3369f416e49bde373b6c778a271cfe6e7", - "reference": "0521a7d3369f416e49bde373b6c778a271cfe6e7", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/3a8f6ed5293a244cdf4ec3a4f1ebc32db1dadf27", + "reference": "3a8f6ed5293a244cdf4ec3a4f1ebc32db1dadf27", "shasum": "" }, "require": { @@ -12235,20 +12443,20 @@ "type": "tidelift" } ], - "time": "2025-02-02T17:46:35+00:00" + "time": "2025-04-07T18:47:38+00:00" }, { "name": "phpstan/phpstan", - "version": "1.12.19", + "version": "1.12.27", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "c42ba9bab7a940ed00092ecb1c77bad98896d789" + "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c42ba9bab7a940ed00092ecb1c77bad98896d789", - "reference": "c42ba9bab7a940ed00092ecb1c77bad98896d789", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3a6e423c076ab39dfedc307e2ac627ef579db162", + "reference": "3a6e423c076ab39dfedc307e2ac627ef579db162", "shasum": "" }, "require": { @@ -12293,7 +12501,7 @@ "type": "github" } ], - "time": "2025-02-19T15:42:21+00:00" + "time": "2025-05-21T20:51:45+00:00" }, { "name": "phpunit/php-code-coverage", @@ -12618,16 +12826,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.45", + "version": "10.5.47", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "bd68a781d8e30348bc297449f5234b3458267ae8" + "reference": "3637b3e50d32ab3a0d1a33b3b6177169ec3d95a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bd68a781d8e30348bc297449f5234b3458267ae8", - "reference": "bd68a781d8e30348bc297449f5234b3458267ae8", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3637b3e50d32ab3a0d1a33b3b6177169ec3d95a3", + "reference": "3637b3e50d32ab3a0d1a33b3b6177169ec3d95a3", "shasum": "" }, "require": { @@ -12637,7 +12845,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", + "myclabs/deep-copy": "^1.13.1", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.1", @@ -12699,7 +12907,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.45" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.47" }, "funding": [ { @@ -12710,25 +12918,33 @@ "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/phpunit", "type": "tidelift" } ], - "time": "2025-02-06T16:08:12+00:00" + "time": "2025-06-20T11:29:11+00:00" }, { "name": "psy/psysh", - "version": "v0.12.7", + "version": "v0.12.9", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" + "reference": "1b801844becfe648985372cb4b12ad6840245ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1b801844becfe648985372cb4b12ad6840245ace", + "reference": "1b801844becfe648985372cb4b12ad6840245ace", "shasum": "" }, "require": { @@ -12792,9 +13008,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.9" }, - "time": "2024-12-10T01:58:33+00:00" + "time": "2025-06-23T02:35:06+00:00" }, { "name": "react/cache", @@ -14308,16 +14524,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.11.3", + "version": "3.13.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10" + "reference": "5b5e3821314f947dd040c70f7992a64eac89025c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", - "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5b5e3821314f947dd040c70f7992a64eac89025c", + "reference": "5b5e3821314f947dd040c70f7992a64eac89025c", "shasum": "" }, "require": { @@ -14384,11 +14600,11 @@ "type": "open_collective" }, { - "url": "https://thanks.dev/phpcsstandards", + "url": "https://thanks.dev/u/gh/phpcsstandards", "type": "thanks_dev" } ], - "time": "2025-01-23T17:04:15+00:00" + "time": "2025-06-17T22:17:01+00:00" }, { "name": "symfony/dotenv", @@ -14466,16 +14682,16 @@ }, { "name": "symfony/options-resolver", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/afb9a8038025e5dbc657378bfab9198d75f10fca", + "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca", "shasum": "" }, "require": { @@ -14513,7 +14729,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.0" }, "funding": [ { @@ -14529,11 +14745,11 @@ "type": "tidelift" } ], - "time": "2024-11-20T11:17:29+00:00" + "time": "2025-04-04T13:12:05+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -14575,7 +14791,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.4" + "source": "https://github.com/symfony/stopwatch/tree/v7.3.0" }, "funding": [ { @@ -14715,6 +14931,6 @@ "ext-zip": "*", "lib-libxml": "*" }, - "platform-dev": [], - "plugin-api-version": "2.2.0" + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/lib/internal/Magento/Framework/Acl/Data/Cache.php b/lib/internal/Magento/Framework/Acl/Data/Cache.php index 0216225bd351b..dcf9012904843 100644 --- a/lib/internal/Magento/Framework/Acl/Data/Cache.php +++ b/lib/internal/Magento/Framework/Acl/Data/Cache.php @@ -6,6 +6,8 @@ namespace Magento\Framework\Acl\Data; +use Magento\Framework\Cache\FrontendInterface; + /** * ACL data cache layer. * @package Magento\Framework\Acl\Data @@ -84,7 +86,7 @@ public function remove($identifier) /** * {@inheritdoc} */ - public function clean($mode = \Zend_Cache::CLEANING_MODE_MATCHING_TAG, array $tags = []) + public function clean($mode = FrontendInterface::CLEANING_MODE_MATCHING_TAG, array $tags = []) { $this->aclBuilder->resetRuntimeAcl(); return $this->cache->clean($mode, array_merge($tags, [$this->cacheTag])); diff --git a/lib/internal/Magento/Framework/App/Cache.php b/lib/internal/Magento/Framework/App/Cache.php index 7a569e5409f7d..99ae056fcd57a 100644 --- a/lib/internal/Magento/Framework/App/Cache.php +++ b/lib/internal/Magento/Framework/App/Cache.php @@ -93,7 +93,7 @@ public function remove($identifier) public function clean($tags = []) { if ($tags) { - $result = $this->_frontend->clean(\Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, (array)$tags); + $result = $this->_frontend->clean(\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, (array)$tags); } else { /** @deprecated special case of cleaning by empty tags is deprecated after 2.0.0.0-dev42 */ $result = false; diff --git a/lib/internal/Magento/Framework/App/Cache/FlushCacheByTags.php b/lib/internal/Magento/Framework/App/Cache/FlushCacheByTags.php index 363c9740b38aa..023a50c8965ea 100644 --- a/lib/internal/Magento/Framework/App/Cache/FlushCacheByTags.php +++ b/lib/internal/Magento/Framework/App/Cache/FlushCacheByTags.php @@ -110,7 +110,7 @@ private function cleanCacheByTags(array $tags): void foreach ($this->cacheList as $cacheType) { if ($this->cacheState->isEnabled($cacheType)) { $this->cachePool->get($cacheType)->clean( - \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, $uniqueTags = $uniqueTags ?? \array_unique($tags) ); } diff --git a/lib/internal/Magento/Framework/App/Cache/Frontend/Factory.php b/lib/internal/Magento/Framework/App/Cache/Frontend/Factory.php index 4c6aca2d6ef55..8e66d36957480 100644 --- a/lib/internal/Magento/Framework/App/Cache/Frontend/Factory.php +++ b/lib/internal/Magento/Framework/App/Cache/Frontend/Factory.php @@ -14,17 +14,22 @@ use LogicException; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\App\ResourceConnection; -use Magento\Framework\Cache\Backend\Database; -use Magento\Framework\Cache\Backend\Eaccelerator; -use Magento\Framework\Cache\Backend\RemoteSynchronizedCache; -use Magento\Framework\Cache\Core; -use Magento\Framework\Cache\Frontend\Adapter\Zend; +use Magento\Framework\Cache\Frontend\Adapter\Symfony; use Magento\Framework\Cache\FrontendInterface; use Magento\Framework\Filesystem; use Magento\Framework\ObjectManagerInterface; use Magento\Framework\Profiler; use UnexpectedValueException; -use Zend_Cache; +use Symfony\Component\Cache\Adapter\FilesystemAdapter; +use Symfony\Component\Cache\Adapter\MemcachedAdapter; +use Symfony\Component\Cache\Adapter\RedisAdapter; +use Symfony\Component\Cache\Adapter\PdoAdapter; +use Symfony\Component\Cache\Adapter\ApcuAdapter; +use Symfony\Component\Cache\Adapter\XcacheAdapter; +use Symfony\Component\Cache\Adapter\ArrayAdapter; +use Symfony\Component\Cache\Adapter\ChainAdapter; +use Symfony\Component\Cache\Adapter\TagAwareAdapter; +use Symfony\Contracts\Cache\CacheInterface; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) @@ -156,22 +161,7 @@ public function create(array $options) Profiler::start('cache_frontend_create', $profilerTags); try { - $result = $this->_objectManager->create( - Zend::class, - [ - 'frontendFactory' => function () use ($frontend, $backend) { - return Zend_Cache::factory( - $frontend['type'], - $backend['type'], - $frontend, - $backend['options'], - true, - true, - true - ); - }, - ] - ); + $result = $this->createSymfonyCacheAdapter($backend['type'], $backend['options'], $idPrefix); } catch (\Exception $e) { $result = $this->createCacheWithDefaultOptions($options); } @@ -182,6 +172,114 @@ public function create(array $options) return $result; } + /** + * Create a Symfony Cache adapter based on type and options. + * + * @param string $type + * @param array $options + * @param string $namespace + * @return Symfony + * @throws Exception + */ + private function createSymfonyCacheAdapter(string $type, array $options, string $namespace): Symfony + { + $rawAdapter = $this->createSymfonyRawAdapter($type, $options, $namespace); + $tagAwareAdapter = new TagAwareAdapter($rawAdapter); + return new Symfony($tagAwareAdapter); + } + + /** + * Create a raw Symfony Cache adapter. + * + * @param string $type + * @param array $options + * @param string $namespace + * @return CacheInterface + * @throws Exception + */ + private function createSymfonyRawAdapter(string $type, array $options, string $namespace): CacheInterface + { + switch (strtolower($type)) { + case 'filesystem': + case 'cm_cache_backend_file': + $adapter = new FilesystemAdapter($namespace, 0, $options['cache_dir'] ?? null); + break; + case 'memcached': + case 'libmemcached': + $memcached = new \Memcached(); + foreach ($options['servers'] ?? [] as $server) { + $memcached->addServer($server['host'], $server['port']); + } + $adapter = new MemcachedAdapter($memcached, $namespace); + break; + case 'redis': + case 'cm_cache_backend_redis': + $redis = new \Redis(); + $redis->connect($options['server'], $options['port']); + $adapter = new RedisAdapter($redis, $namespace); + break; + case 'database': + $connection = $this->_resource->getConnection(); + $dbOptions = $this->_getDbAdapterOptions(); + $adapter = new PdoAdapter($connection->getConnection(), $namespace, 0, $dbOptions); + break; + case 'apc': + $adapter = new ApcuAdapter($namespace); + break; + case 'xcache': + $adapter = new XcacheAdapter($namespace); + break; + case 'array': + $adapter = new ArrayAdapter(); + break; + case 'twolevels': + $fastAdapter = $this->createSymfonyRawAdapter( + $options['fast_backend'], + $options['fast_backend_options'], + $namespace + ); + $slowAdapter = $this->createSymfonyRawAdapter( + $options['slow_backend'], + $options['slow_backend_options'], + $namespace + ); + $adapter = new ChainAdapter([$fastAdapter, $slowAdapter]); + break; + default: + if (class_exists($type) && is_a($type, CacheInterface::class, true)) { + $adapter = $this->_objectManager->create($type, $options); + } else { + throw new Exception(sprintf('Unsupported cache backend type: %s', $type)); + } + } + return $adapter; + } + + /** + * Create frontend cache with default options. + * + * @param array $options + * @return Symfony + */ + private function createCacheWithDefaultOptions(array $options): Symfony + { + unset($options['backend']); + unset($options['frontend']); + $backend = $this->_getBackendOptions($options); + $frontend = $this->_getFrontendOptions($options); + + // For default options, we'll use a FilesystemAdapter as a fallback. + $cacheDir = $this->_filesystem->getDirectoryWrite(DirectoryList::CACHE); + $cacheDir->create(); + $defaultAdapter = new FilesystemAdapter( + $frontend['cache_id_prefix'] ?? '', + 0, + $cacheDir->getAbsolutePath() + ); + + return new Symfony(new TagAwareAdapter($defaultAdapter)); + } + /** * Return options expanded with enforced values * @@ -240,73 +338,64 @@ protected function _getBackendOptions(array $cacheOptions) //phpcs:ignore Generi $backendType = false; switch (strtolower($type)) { case 'sqlite': - if (extension_loaded('sqlite') && isset($options['cache_db_complete_path'])) { - $backendType = 'Sqlite'; - } - break; + // Symfony Cache does not have a direct SQLite adapter. PdoAdapter can be used with SQLite DSN. + // For now, fallback to FilesystemAdapter or throw an error. + throw new \Exception('SQLite cache backend is not directly supported by Symfony Cache adapters.'); case 'memcached': - if (extension_loaded('memcached')) { - if (isset($cacheOptions['memcached'])) { - $options = $cacheOptions['memcached']; - } - $enableTwoLevels = true; - $backendType = 'Libmemcached'; - } elseif (extension_loaded('memcache')) { - if (isset($cacheOptions['memcached'])) { - $options = $cacheOptions['memcached']; - } - $enableTwoLevels = true; - $backendType = 'Memcached'; - } + case 'libmemcached': + $enableTwoLevels = true; + $backendType = 'memcached'; break; case 'apc': if (extension_loaded('apc') && ini_get('apc.enabled')) { $enableTwoLevels = true; - $backendType = 'Apc'; + $backendType = 'apc'; } break; case 'xcache': if (extension_loaded('xcache')) { $enableTwoLevels = true; - $backendType = 'Xcache'; + $backendType = 'xcache'; } break; case 'eaccelerator': case 'varien_cache_backend_eaccelerator': - if (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) { - $enableTwoLevels = true; - $backendType = Eaccelerator::class; - } - break; + // Symfony Cache does not have an eAccelerator adapter. + // For now, fallback to FilesystemAdapter or throw an error. + throw new \Exception('eAccelerator cache backend is not directly supported by Symfony Cache adapters.'); case 'database': - $backendType = Database::class; + $backendType = 'database'; $options = $this->_getDbAdapterOptions(); break; case 'remote_synchronized_cache': - $backendType = RemoteSynchronizedCache::class; - $options['remote_backend'] = Database::class; + $backendType = 'twolevels'; // Custom type for ChainAdapter + $options['remote_backend'] = 'database'; $options['remote_backend_options'] = $this->_getDbAdapterOptions(); - $options['local_backend'] = Cm_Cache_Backend_File::class; + $options['local_backend'] = 'filesystem'; $cacheDir = $this->_filesystem->getDirectoryWrite(DirectoryList::CACHE); $options['local_backend_options']['cache_dir'] = $cacheDir->getAbsolutePath(); $cacheDir->create(); break; + case 'redis': + case 'cm_cache_backend_redis': + $backendType = 'redis'; + break; + case 'cm_cache_backend_file': + case 'filesystem': + $backendType = 'filesystem'; + break; default: - if ($type != $this->_defaultBackend) { - try { - if (class_exists($type, true)) { - $implements = class_implements($type, true); - if (in_array('Zend_Cache_Backend_Interface', $implements)) { - $backendType = $type; - } - } - // phpcs:ignore Magento2.CodeAnalysis.EmptyBlock - } catch (Exception $e) { - } + // Assume it's a custom Symfony Cache adapter class name + if (class_exists($type) && is_a($type, CacheInterface::class, true)) { + $backendType = $type; + } else { + // Fallback to default if unknown or not a valid Symfony Cache adapter + $backendType = 'filesystem'; } } + if (!$backendType) { - $backendType = $this->_defaultBackend; + $backendType = 'filesystem'; $cacheDir = $this->_filesystem->getDirectoryWrite(DirectoryList::CACHE); $this->_backendOptions['cache_dir'] = $cacheDir->getAbsolutePath(); $cacheDir->create(); @@ -331,15 +420,8 @@ protected function _getBackendOptions(array $cacheOptions) //phpcs:ignore Generi */ protected function _getDbAdapterOptions() { - $options['adapter_callback'] = function () { - return $this->_resource->getConnection(); - }; - $options['data_table_callback'] = function () { - return $this->_resource->getTableName('cache'); - }; - $options['tags_table_callback'] = function () { - return $this->_resource->getTableName('cache_tag'); - }; + $options = []; + $options['db_table'] = $this->_resource->getTableName('cache'); return $options; } @@ -376,7 +458,7 @@ protected function _getTwoLevelsBackendOptions($fastOptions, $cacheOptions) $options['slow_backend_options'] = $this->_backendOptions; } if ($options['slow_backend'] == 'database') { - $options['slow_backend'] = Database::class; + $options['slow_backend'] = 'database'; $options['slow_backend_options'] = $this->_getDbAdapterOptions(); if (isset($cacheOptions['slow_backend_store_data'])) { $options['slow_backend_options']['store_data'] = (bool)$cacheOptions['slow_backend_store_data']; @@ -385,12 +467,12 @@ protected function _getTwoLevelsBackendOptions($fastOptions, $cacheOptions) } } - $backend = ['type' => 'TwoLevels', 'options' => $options]; + $backend = ['type' => 'twolevels', 'options' => $options]; return $backend; } /** - * Get options of cache frontend (options of \Zend_Cache_Core) + * Get options of cache frontend (options of Symfony Cache) * * @param array $cacheOptions * @return array @@ -410,41 +492,10 @@ protected function _getFrontendOptions(array $cacheOptions) if (!array_key_exists('automatic_cleaning_factor', $options)) { $options['automatic_cleaning_factor'] = 0; } - $options['type'] = isset($cacheOptions['frontend']) ? $cacheOptions['frontend'] : Core::class; + $options['type'] = isset($cacheOptions['frontend']) ? $cacheOptions['frontend'] : 'Symfony'; // Default to Symfony adapter return $options; } - /** - * Create frontend cache with default options. - * - * @param array $options - * @return Zend - */ - private function createCacheWithDefaultOptions(array $options): Zend - { - unset($options['backend']); - unset($options['frontend']); - $backend = $this->_getBackendOptions($options); - $frontend = $this->_getFrontendOptions($options); - - return $this->_objectManager->create( - Zend::class, - [ - 'frontendFactory' => function () use ($frontend, $backend) { - return Zend_Cache::factory( - $frontend['type'], - $backend['type'], - $frontend, - $backend['options'], - true, - true, - true - ); - }, - ] - ); - } - /** * Disable show internals with var_dump * diff --git a/lib/internal/Magento/Framework/App/Cache/Proxy.php b/lib/internal/Magento/Framework/App/Cache/Proxy.php index 50c14e24203b0..c7049ecab2b1e 100644 --- a/lib/internal/Magento/Framework/App/Cache/Proxy.php +++ b/lib/internal/Magento/Framework/App/Cache/Proxy.php @@ -49,7 +49,7 @@ protected function _getCache() /** * Get cache frontend API object * - * @return \Zend_Cache_Core + * @return \Magento\Framework\Cache\FrontendInterface */ public function getFrontend() { diff --git a/lib/internal/Magento/Framework/App/Cache/Type/AccessProxy.php b/lib/internal/Magento/Framework/App/Cache/Type/AccessProxy.php index 1cf98519efa98..47941e46ca5f8 100644 --- a/lib/internal/Magento/Framework/App/Cache/Type/AccessProxy.php +++ b/lib/internal/Magento/Framework/App/Cache/Type/AccessProxy.php @@ -99,7 +99,7 @@ public function remove($identifier) /** * {@inheritdoc} */ - public function clean($mode = \Zend_Cache::CLEANING_MODE_ALL, array $tags = []) + public function clean($mode = \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL, array $tags = []) { if (!$this->_isEnabled()) { return true; diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/ManagerTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/ManagerTest.php index 54dab0c16381d..92b8761451931 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/ManagerTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/ManagerTest.php @@ -117,8 +117,8 @@ public function testFlushAll() ['bar', $frontendBar], ['baz', $frontendBaz], ]); - $backendOne = $this->getMockForAbstractClass(\Zend_Cache_Backend_Interface::class); - $backendTwo = $this->getMockForAbstractClass(\Zend_Cache_Backend_Interface::class); + $backendOne = $this->getMockForAbstractClass(\Psr\Cache\CacheItemPoolInterface::class); + $backendTwo = $this->getMockForAbstractClass(\Psr\Cache\CacheItemPoolInterface::class); $frontendFoo->expects($this->once())->method('getBackend')->willReturn($backendOne); $frontendBar->expects($this->once())->method('getBackend')->willReturn($backendOne); $frontendBaz->expects($this->once())->method('getBackend')->willReturn($backendTwo); diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Type/AccessProxyTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Type/AccessProxyTest.php index 6c640357760ea..e8c43339119c8 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Type/AccessProxyTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Type/AccessProxyTest.php @@ -66,7 +66,7 @@ public static function proxyMethodDataProvider(): array ['load', ['record_id'], false, '111'], ['save', ['record_value', 'record_id', ['tag'], 555], true, false], ['remove', ['record_id'], true, false], - ['clean', [\Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, ['tag']], true, false] + ['clean', [\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, ['tag']], true, false] ]; } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Type/ConfigTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Type/ConfigTest.php index 498c665bed960..72622bde96662 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/Type/ConfigTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/Type/ConfigTest.php @@ -82,7 +82,7 @@ public function createZendCacheBackendMock() public function createZendCacheCoreMock() { - return $this->createMock(\Zend_Cache_Core::class); + return $this->createMock(\Psr\Cache\CacheItemPoolInterface::class); } public function testSave(): void @@ -112,13 +112,13 @@ public function testCleanModeAll(): void )->method( 'clean' )->with( - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, [Config::CACHE_TAG] )->willReturn( $expectedResult ); $actualResult = $this->model->clean( - \Zend_Cache::CLEANING_MODE_ALL, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL, ['ignored_tag_one', 'ignored_tag_two'] ); $this->assertSame($expectedResult, $actualResult); @@ -132,13 +132,13 @@ public function testCleanModeMatchingTag(): void )->method( 'clean' )->with( - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, ['test_tag_one', 'test_tag_two', Config::CACHE_TAG] )->willReturn( $expectedResult ); $actualResult = $this->model->clean( - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, ['test_tag_one', 'test_tag_two'] ); $this->assertSame($expectedResult, $actualResult); @@ -155,16 +155,16 @@ public function testCleanModeMatchingAnyTag($fixtureResultOne, $fixtureResultTwo $this->frontendMock ->method('clean') ->willReturnCallback(function ($arg1, $arg2) use ($fixtureResultOne, $fixtureResultTwo) { - if ($arg1 == \Zend_Cache::CLEANING_MODE_MATCHING_TAG && + if ($arg1 == \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG && $arg2 == ['test_tag_one', Config::CACHE_TAG]) { return $fixtureResultOne; - } elseif ($arg1 == \Zend_Cache::CLEANING_MODE_MATCHING_TAG && + } elseif ($arg1 == \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG && $arg2 == ['test_tag_two', Config::CACHE_TAG]) { return $fixtureResultTwo; } }); $actualResult = $this->model->clean( - \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, ['test_tag_one', 'test_tag_two'] ); $this->assertEquals($expectedResult, $actualResult); diff --git a/lib/internal/Magento/Framework/App/Test/Unit/CacheTest.php b/lib/internal/Magento/Framework/App/Test/Unit/CacheTest.php index f5268898c317e..c9215a733c8b6 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/CacheTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/CacheTest.php @@ -220,7 +220,7 @@ public function testCleanByTags() )->method( 'clean' )->with( - \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, $expectedTags )->willReturn( true @@ -235,7 +235,7 @@ public function testCleanByEmptyTags() )->method( 'clean' )->with( - \Zend_Cache::CLEANING_MODE_ALL + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL )->willReturn( true ); diff --git a/lib/internal/Magento/Framework/Cache/Core.php b/lib/internal/Magento/Framework/Cache/Core.php index 2a97bc0f49c7a..aa4f52d4f1104 100644 --- a/lib/internal/Magento/Framework/Cache/Core.php +++ b/lib/internal/Magento/Framework/Cache/Core.php @@ -5,22 +5,107 @@ */ namespace Magento\Framework\Cache; -use Magento\Framework\Cache\Backend\Redis; -use Zend_Cache; -use Zend_Cache_Exception; +use Psr\Cache\CacheItemPoolInterface; -class Core extends \Zend_Cache_Core +class Core implements FrontendInterface { /** - * Available options - * - * ====> (array) backend_decorators : - * - array of decorators to decorate cache backend. Each element of this array should contain: - * -- 'class' - concrete decorator, descendant of \Magento\Framework\Cache\Backend\Decorator\AbstractDecorator - * -- 'options' - optional array of specific decorator options - * @var array + * @var CacheItemPoolInterface + */ + protected CacheItemPoolInterface $cachePool; + + /** + * @param CacheItemPoolInterface $cachePool + */ + public function __construct(CacheItemPoolInterface $cachePool) + { + $this->cachePool = $cachePool; + } + + /** + * {@inheritdoc} + */ + public function test($identifier) + { + $item = $this->cachePool->getItem($this->_id($identifier)); + return $item->isHit() ? ($item->getMetadata()['mtime'] ?? time()) : false; + } + + /** + * {@inheritdoc} */ - protected $_specificOptions = ['backend_decorators' => [], 'disable_save' => false]; + public function load($identifier) + { + $item = $this->cachePool->getItem($this->_id($identifier)); + return $item->isHit() ? $item->get() : false; + } + + /** + * {@inheritdoc} + */ + public function save($data, $identifier, array $tags = [], $lifeTime = null) + { + $item = $this->cachePool->getItem($this->_id($identifier)); + $item->set($data); + + if ($lifeTime !== null) { + $item->expiresAfter($lifeTime); + } + + // Symfony Cache does not directly support tags in the same way Zend Cache does. + // For now, we'll just save the item. Tag-based invalidation will need a different strategy. + // This might require custom cache invalidation logic or a different Symfony Cache adapter. + + return $this->cachePool->save($item); + } + + /** + * {@inheritdoc} + */ + public function remove($identifier) + { + return $this->cachePool->delete($this->_id($identifier)); + } + + /** + * {@inheritdoc} + */ + public function clean($mode = FrontendInterface::CLEANING_MODE_ALL, array $tags = []) + { + switch ($mode) { + case FrontendInterface::CLEANING_MODE_ALL: + return $this->cachePool->clear(); + case FrontendInterface::CLEANING_MODE_MATCHING_TAG: + case FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG: + // Symfony Cache does not natively support cleaning by matching tags directly. + // For now, we'll clear all cache if tags are provided, as a fallback. + // A more robust solution would involve a custom cache pool or a tag-aware decorator. + if (!empty($tags)) { + return $this->cachePool->clear(); + } + return true; // No tags, nothing to do + default: + // Other modes like CLEANING_MODE_OLD or NOT_MATCHING_TAG are not directly supported by Symfony Cache + // and would require custom logic or a different cache pool implementation. + return false; + } + } + + /** + * {@inheritdoc} + */ + public function getBackend() + { + return $this->cachePool; + } + + /** + * {@inheritdoc} + */ + public function getLowLevelFrontend() + { + return $this->cachePool; + } /** * Make and return a cache id @@ -35,9 +120,8 @@ protected function _id($cacheId) if ($cacheId !== null) { $cacheId = str_replace('.', '__', $cacheId); //reduce collision chances $cacheId = preg_replace('/([^a-zA-Z0-9_]{1,1})/', '_', $cacheId); - if (isset($this->_options['cache_id_prefix'])) { - $cacheId = $this->_options['cache_id_prefix'] . $cacheId; - } + // The cache_id_prefix is now handled by the Symfony Cache adapter's namespace. + // So, we don't need to prepend it here. } return $cacheId; } @@ -57,39 +141,26 @@ protected function _tags($tags) } /** - * @inheritDoc + * Return an array of stored cache ids + * + * @return string[] array of stored cache ids (string) */ - public function save($data, $cacheId = null, $tags = [], $specificLifetime = false, $priority = 8) + public function getIds() { - if ($this->getOption('disable_save')) { - return true; - } - $tags = $this->_tags($tags); - return parent::save($data, $cacheId, $tags, $specificLifetime, $priority); + // Symfony Cache (PSR-6) does not provide a direct way to list all IDs. + // This functionality might require a custom cache adapter or be limited. + return []; } /** - * Clean cache entries - * - * Available modes are : - * 'all' (default) => remove all cache entries ($tags is not used) - * 'old' => remove too old cache entries ($tags is not used) - * 'matchingTag' => remove cache entries matching all given tags - * ($tags can be an array of strings or a single string) - * 'notMatchingTag' => remove cache entries not matching one of the given tags - * ($tags can be an array of strings or a single string) - * 'matchingAnyTag' => remove cache entries matching any given tags - * ($tags can be an array of strings or a single string) + * Return an array of stored tags * - * @param string $mode - * @param string[] $tags - * @throws \Zend_Cache_Exception - * @return bool True if ok + * @return string[] array of stored tags (string) */ - public function clean($mode = 'all', $tags = []) + public function getTags() { - $tags = $this->_tags($tags); - return parent::clean($mode, $tags); + // Symfony Cache (PSR-6) does not directly support listing all tags. + return []; } /** @@ -102,8 +173,8 @@ public function clean($mode = 'all', $tags = []) */ public function getIdsMatchingTags($tags = []) { - $tags = $this->_tags($tags); - return parent::getIdsMatchingTags($tags); + // Symfony Cache (PSR-6) does not natively support cleaning by matching tags directly. + return []; } /** @@ -116,88 +187,143 @@ public function getIdsMatchingTags($tags = []) */ public function getIdsNotMatchingTags($tags = []) { - $tags = $this->_tags($tags); - return parent::getIdsNotMatchingTags($tags); + // Symfony Cache (PSR-6) does not natively support cleaning by matching tags directly. + return []; } /** - * Validate a cache id or a tag (security, reliable filenames, reserved prefixes...) + * Return an array of stored cache ids which match any given tags * - * Throw an exception if a problem is found + * In case of multiple tags, a logical AND is made between tags * - * @param string $string Cache id or tag - * @throws Zend_Cache_Exception - * @return void + * @param string[] $tags array of tags + * @return string[] array of any matching cache ids (string) + */ + public function getIdsMatchingAnyTags($tags = []) + { + // Symfony Cache (PSR-6) does not natively support cleaning by matching tags directly. + return []; + } + + /** + * Return the filling percentage of the backend storage + * + * @return int integer between 0 and 100 + */ + public function getFillingPercentage() + { + // PSR-6 does not provide a way to get filling percentage. + return 100; + } + + /** + * Return an array of metadatas for the given cache id + * + * The array must include these keys : + * - expire : the expire timestamp + * - tags : a string array of tags + * - mtime : timestamp of last modification time + * + * @param string $cacheId cache id + * @return array|bool array of metadatas (false if the cache id is not found) */ - protected function _validateIdOrTag($string) + public function getMetadatas($cacheId) { - if ($this->_backend instanceof Redis) { - if (!is_string($string)) { - Zend_Cache::throwException('Invalid id or tag : must be a string'); - } - if (substr($string, 0, 9) == 'internal-') { - Zend_Cache::throwException('"internal-*" ids or tags are reserved'); - } - if (!preg_match('~^[a-zA-Z0-9_{}]+$~D', $string)) { - Zend_Cache::throwException("Invalid id or tag '$string' : must use only [a-zA-Z0-9_{}]"); - } + $item = $this->cachePool->getItem($this->_id($cacheId)); + if ($item->isHit()) { + $metadata = $item->getMetadata(); + return [ + 'expire' => $metadata['expiry'] ?? 0, + 'mtime' => $metadata['mtime'] ?? time(), + 'tags' => [], // Tags are not directly supported by PSR-6 metadata + ]; + } + return false; + } - return; + /** + * Give (if possible) an extra lifetime to the given cache id + * + * @param string $cacheId cache id + * @param int $extraLifetime + * @return boolean true if ok + */ + public function touch($cacheId, $extraLifetime) + { + $item = $this->cachePool->getItem($this->_id($cacheId)); + if ($item->isHit()) { + $item->expiresAfter($extraLifetime); + return $this->cachePool->save($item); } + return false; + } - parent::_validateIdOrTag($string); + /** + * Return an associative array of capabilities (booleans) of the backend + * + * The array must include these keys : + * - automatic_cleaning (is automating cleaning necessary) + * - tags (are tags supported) + * - expired_read (is it possible to read expired cache records + * (for doNotTestCacheValidity option for example)) + * - priority does the backend deal with priority when saving + * - infinite_lifetime (is infinite lifetime can work with this backend) + * - get_list (is it possible to get the list of cache ids and the complete list of tags) + * + * @return array associative of with capabilities + */ + public function getCapabilities() + { + return [ + 'automatic_cleaning' => true, + 'tags' => false, // PSR-6 does not natively support tags + 'expired_read' => false, + 'priority' => false, + 'infinite_lifetime' => true, + 'get_list' => false // PSR-6 does not provide a way to list all IDs + ]; } /** - * Set the backend + * Set an option * - * @param \Zend_Cache_Backend $backendObject + * @param string $name + * @param mixed $value * @return void */ - public function setBackend(\Zend_Cache_Backend $backendObject) + public function setOption($name, $value) { - $backendObject = $this->_decorateBackend($backendObject); - parent::setBackend($backendObject); + // Options are typically set during adapter instantiation in Symfony Cache. + // This method might become a no-op or throw an exception if unsupported options are passed. } /** - * Decorate cache backend with additional functionality + * Get the life time + * + * if $specificLifetime is not false, the given specific life time is used + * else, the global lifetime is used * - * @param \Zend_Cache_Backend $backendObject - * @return \Zend_Cache_Backend + * @param int $specificLifetime + * @return int Cache life time */ - protected function _decorateBackend(\Zend_Cache_Backend $backendObject) + public function getLifetime($specificLifetime) { - if (!is_array($this->_specificOptions['backend_decorators'])) { - \Zend_Cache::throwException("'backend_decorator' option should be an array"); - } - - foreach ($this->_specificOptions['backend_decorators'] as $decoratorName => $decoratorOptions) { - if (!is_array($decoratorOptions) || !array_key_exists('class', $decoratorOptions)) { - \Zend_Cache::throwException( - "Concrete decorator options in '" . $decoratorName . "' should be an array containing 'class' key" - ); - } - $classOptions = array_key_exists('options', $decoratorOptions) ? $decoratorOptions['options'] : []; - $classOptions['concrete_backend'] = $backendObject; - - if (!class_exists($decoratorOptions['class'])) { - \Zend_Cache::throwException( - "Class '" . $decoratorOptions['class'] . "' specified in '" . $decoratorName . "' does not exist" - ); - } - - $backendObject = new $decoratorOptions['class']($classOptions); - if (!$backendObject instanceof \Magento\Framework\Cache\Backend\Decorator\AbstractDecorator) { - \Zend_Cache::throwException( - "Decorator in '" . - $decoratorName . - "' should extend \Magento\Framework\Cache\Backend\Decorator\AbstractDecorator" - ); - } - } + // Lifetime is handled by expiresAfter in Symfony Cache items. + // This method might become a no-op or return a default. + return $specificLifetime ?: 0; // Return 0 for infinite, or the specific lifetime + } - return $backendObject; + /** + * Determine system TMP directory and detect if we have read access + * + * inspired from \Zend_File_Transfer_Adapter_Abstract + * + * @return string + */ + public function getTmpDir() + { + // This is typically handled by the underlying Symfony Cache adapter (e.g., FilesystemAdapter). + return sys_get_temp_dir(); } /** diff --git a/lib/internal/Magento/Framework/Cache/Frontend/Adapter/Symfony.php b/lib/internal/Magento/Framework/Cache/Frontend/Adapter/Symfony.php new file mode 100644 index 0000000000000..16fcddcf3865e --- /dev/null +++ b/lib/internal/Magento/Framework/Cache/Frontend/Adapter/Symfony.php @@ -0,0 +1,127 @@ +cache = $cache; + } + + /** + * Clean identifier from reserved characters. + * + * @param string $identifier + * @return string + */ + private function cleanIdentifier(string $identifier): string + { + // PSR-6 reserved characters: {}()/\@: + return preg_replace('/[{}()\/\\\\@:]/', '_', $identifier); + } + + /** + * {@inheritdoc} + */ + public function test($identifier) + { + $item = $this->cache->getItem($this->cleanIdentifier($identifier)); + return $item->isHit() ? ($item->getMetadata()['mtime'] ?? time()) : false; + } + + /** + * {@inheritdoc} + */ + public function load($identifier) + { + $item = $this->cache->getItem($this->cleanIdentifier($identifier)); + return $item->isHit() ? $item->get() : false; + } + + /** + * {@inheritdoc} + */ + public function save($data, $identifier, $tags = [], $specificLifetime = false) + { + $item = $this->cache->getItem($this->cleanIdentifier($identifier)); + $item->set($data); + + if ($specificLifetime !== false) { + $item->expiresAfter($specificLifetime); + } + + if ($this->cache instanceof TagAwareAdapterInterface && !empty($tags)) { + $item->tag(array_map([$this, 'cleanIdentifier'], $tags)); + } + + return $this->cache->save($item); + } + + /** + * {@inheritdoc} + */ + public function remove($identifier) + { + return $this->cache->deleteItem($this->cleanIdentifier($identifier)); + } + + /** + * {@inheritdoc} + */ + public function clean($mode = FrontendInterface::CLEANING_MODE_ALL, array $tags = []) + { + $cleanedTags = array_map([$this, 'cleanIdentifier'], $tags); + switch ($mode) { + case FrontendInterface::CLEANING_MODE_ALL: + return $this->cache->clear(); + case FrontendInterface::CLEANING_MODE_MATCHING_TAG: + case FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG: + if ($this->cache instanceof TagAwareAdapterInterface && !empty($cleanedTags)) { + return $this->cache->invalidateTags($cleanedTags); + } + if (!empty($cleanedTags)) { + return $this->cache->clear(); + } + return true; + default: + return false; + } + } + + /** + * {@inheritdoc} + */ + public function getBackend() + { + return $this->cache; + } + + /** + * {@inheritdoc} + */ + public function getLowLevelFrontend() + { + return $this->cache; + } +} diff --git a/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Bare.php b/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Bare.php index 737105585e2e5..87fe94672bd3d 100644 --- a/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Bare.php +++ b/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Bare.php @@ -84,7 +84,7 @@ public function remove($identifier) /** * @inheritdoc */ - public function clean($mode = \Zend_Cache::CLEANING_MODE_ALL, array $tags = []) + public function clean($mode = \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL, array $tags = []) { return $this->_getFrontend()->clean($mode, $tags); } diff --git a/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Logger.php b/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Logger.php index 181148b3a7712..3f7979a387686 100644 --- a/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Logger.php +++ b/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Logger.php @@ -42,7 +42,7 @@ public function remove($identifier) /** * @inheritdoc */ - public function clean($mode = \Zend_Cache::CLEANING_MODE_ALL, array $tags = []) + public function clean($mode = \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL, array $tags = []) { $result = parent::clean($mode, $tags); $this->log(compact('tags', 'mode')); diff --git a/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Profiler.php b/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Profiler.php index 2bb1bc0d2dc20..920024a044d67 100644 --- a/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Profiler.php +++ b/lib/internal/Magento/Framework/Cache/Frontend/Decorator/Profiler.php @@ -110,7 +110,7 @@ public function remove($identifier) /** * {@inheritdoc} */ - public function clean($mode = \Zend_Cache::CLEANING_MODE_ALL, array $tags = []) + public function clean($mode = \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL, array $tags = []) { \Magento\Framework\Profiler::start('cache_clean', $this->_getProfilerTags('clean')); $result = parent::clean($mode, $tags); diff --git a/lib/internal/Magento/Framework/Cache/Frontend/Decorator/TagScope.php b/lib/internal/Magento/Framework/Cache/Frontend/Decorator/TagScope.php index 1c5f04364b087..3137eba1fdd38 100644 --- a/lib/internal/Magento/Framework/Cache/Frontend/Decorator/TagScope.php +++ b/lib/internal/Magento/Framework/Cache/Frontend/Decorator/TagScope.php @@ -57,18 +57,18 @@ public function save($data, $identifier, array $tags = [], $lifeTime = null) * * {@inheritdoc} */ - public function clean($mode = \Zend_Cache::CLEANING_MODE_ALL, array $tags = []) + public function clean($mode = \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL, array $tags = []) { - if ($mode == \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG) { + if ($mode == \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG) { $result = false; foreach ($tags as $tag) { - if (parent::clean(\Zend_Cache::CLEANING_MODE_MATCHING_TAG, [$tag, $this->getTag()])) { + if (parent::clean(\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, [$tag, $this->getTag()])) { $result = true; } } } else { - if ($mode == \Zend_Cache::CLEANING_MODE_ALL) { - $mode = \Zend_Cache::CLEANING_MODE_MATCHING_TAG; + if ($mode == \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL) { + $mode = \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG; $tags = [$this->getTag()]; } else { $tags[] = $this->getTag(); diff --git a/lib/internal/Magento/Framework/Cache/FrontendInterface.php b/lib/internal/Magento/Framework/Cache/FrontendInterface.php index b098bfa2a7a92..0e7002541a1af 100644 --- a/lib/internal/Magento/Framework/Cache/FrontendInterface.php +++ b/lib/internal/Magento/Framework/Cache/FrontendInterface.php @@ -13,6 +13,16 @@ */ interface FrontendInterface { + /**#@+ + * Cache cleaning modes + */ + public const CLEANING_MODE_ALL = 'all'; + public const CLEANING_MODE_OLD = 'old'; + public const CLEANING_MODE_MATCHING_TAG = 'matchingTag'; + public const CLEANING_MODE_NOT_MATCHING_TAG = 'notMatchingTag'; + public const CLEANING_MODE_MATCHING_ANY_TAG = 'matchingAnyTag'; + /**#@-*/ + /** * Test if a cache is available for the given id * @@ -55,19 +65,19 @@ public function remove($identifier); * @param array $tags * @return bool */ - public function clean($mode = \Zend_Cache::CLEANING_MODE_ALL, array $tags = []); + public function clean($mode = self::CLEANING_MODE_ALL, array $tags = []); /** * Retrieve backend instance * - * @return \Zend_Cache_Backend_Interface + * @return \Psr\Cache\CacheItemPoolInterface */ public function getBackend(); /** * Retrieve frontend instance compatible with Zend Locale Data setCache() to be used as a workaround * - * @return \Zend_Cache_Core + * @return \Psr\Cache\CacheItemPoolInterface */ public function getLowLevelFrontend(); } diff --git a/lib/internal/Magento/Framework/Cache/Test/Unit/Backend/DatabaseTest.php b/lib/internal/Magento/Framework/Cache/Test/Unit/Backend/DatabaseTest.php index fbb4407786798..ea1750931d036 100644 --- a/lib/internal/Magento/Framework/Cache/Test/Unit/Backend/DatabaseTest.php +++ b/lib/internal/Magento/Framework/Cache/Test/Unit/Backend/DatabaseTest.php @@ -388,39 +388,39 @@ public static function cleanDataProvider(): array return [ 'mode_all_with_store_data' => [ 'options' => static fn (self $testCase) => $testCase->getOptionsWithStoreData($connectionMock), - 'mode' => \Zend_Cache::CLEANING_MODE_ALL, + 'mode' => \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL, 'expected' => false ], 'mode_all_without_store_data' => [ 'options' => static fn (self $testCase) => $testCase->getOptionsWithoutStoreData($connectionMock), - 'mode' => \Zend_Cache::CLEANING_MODE_ALL, + 'mode' => \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL, 'expected' => false ], 'mode_old_with_store_data' => [ 'options' => static fn (self $testCase) => $testCase->getOptionsWithStoreData($connectionMock), - 'mode' => \Zend_Cache::CLEANING_MODE_OLD, + 'mode' => \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_OLD, 'expected' => true ], 'mode_old_without_store_data' => [ 'options' => static fn (self $testCase) => $testCase->getOptionsWithoutStoreData($connectionMock), - 'mode' => \Zend_Cache::CLEANING_MODE_OLD, + 'mode' => \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_OLD, 'expected' => true ], 'mode_matching_tag_without_store_data' => [ 'options' => static fn (self $testCase) => $testCase->getOptionsWithoutStoreData($connectionMock), - 'mode' => \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + 'mode' => \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, 'expected' => true ], 'mode_not_matching_tag_without_store_data' => [ 'options' => static fn (self $testCase) => $testCase->getOptionsWithoutStoreData($connectionMock), - 'mode' => \Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, + 'mode' => \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_NOT_MATCHING_TAG, 'expected' => true ], 'mode_matching_any_tag_without_store_data' => [ 'options' => static fn (self $testCase) => $testCase->getOptionsWithoutStoreData($connectionMock), - 'mode' => \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + 'mode' => \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, 'expected' => true ] ]; diff --git a/lib/internal/Magento/Framework/Cache/Test/Unit/Backend/MongoDbTest.php b/lib/internal/Magento/Framework/Cache/Test/Unit/Backend/MongoDbTest.php index 3811388d4b034..a91bc3a6e0683 100644 --- a/lib/internal/Magento/Framework/Cache/Test/Unit/Backend/MongoDbTest.php +++ b/lib/internal/Magento/Framework/Cache/Test/Unit/Backend/MongoDbTest.php @@ -350,49 +350,49 @@ public function testClean($mode, $tags, $expectedQuery) public static function cleanDataProvider() { return [ - 'clean expired' => [\Zend_Cache::CLEANING_MODE_OLD, [], self::arrayHasKey('expire')], + 'clean expired' => [\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_OLD, [], self::arrayHasKey('expire')], 'clean cache matching all tags (string)' => [ - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, 'tag1', ['$and' => [['tags' => 'tag1']]], ], 'clean cache matching all tags (one tag)' => [ - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, ['tag1'], ['$and' => [['tags' => 'tag1']]], ], 'clean cache matching all tags (multiple tags)' => [ - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, ['tag1', 'tag2'], ['$and' => [['tags' => 'tag1'], ['tags' => 'tag2']]], ], 'clean cache not matching tags (string)' => [ - \Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_NOT_MATCHING_TAG, 'tag1', ['$nor' => [['tags' => 'tag1']]], ], 'clean cache not matching tags (one tag)' => [ - \Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_NOT_MATCHING_TAG, ['tag1'], ['$nor' => [['tags' => 'tag1']]], ], 'clean cache not matching tags (multiple tags)' => [ - \Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_NOT_MATCHING_TAG, ['tag1', 'tag2'], ['$nor' => [['tags' => 'tag1'], ['tags' => 'tag2']]], ], 'clean cache matching any tags (string)' => [ - \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, 'tag1', ['$or' => [['tags' => 'tag1']]], ], 'clean cache matching any tags (one tag)' => [ - \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, ['tag1'], ['$or' => [['tags' => 'tag1']]], ], 'clean cache matching any tags (multiple tags)' => [ - \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, ['tag1', 'tag2'], ['$or' => [['tags' => 'tag1'], ['tags' => 'tag2']]], ] @@ -402,16 +402,16 @@ public static function cleanDataProvider() public function cleanAll() { $this->_collection->expects($this->once())->method('drop')->willReturn(['ok' => true]); - $this->assertTrue($this->_model->clean(\Zend_Cache::CLEANING_MODE_ALL)); + $this->assertTrue($this->_model->clean(\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL)); } public function cleanNoTags() { $this->_collection->expects($this->never())->method('remove'); $modes = [ - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, - \Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, - \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_NOT_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, ]; foreach ($modes as $mode) { $this->assertFalse($this->_model->clean($mode)); diff --git a/lib/internal/Magento/Framework/Cache/Test/Unit/CoreTest.php b/lib/internal/Magento/Framework/Cache/Test/Unit/CoreTest.php index 582c21a532faa..53daa3c97d19d 100644 --- a/lib/internal/Magento/Framework/Cache/Test/Unit/CoreTest.php +++ b/lib/internal/Magento/Framework/Cache/Test/Unit/CoreTest.php @@ -10,227 +10,111 @@ */ namespace Magento\Framework\Cache\Test\Unit; -use Magento\Framework\Cache\Backend\Decorator\AbstractDecorator; -use Magento\Framework\Cache\Backend\Redis; use Magento\Framework\Cache\Core; -use Magento\Framework\Cache\Frontend\Adapter\Zend; -use Magento\Framework\Cache\Frontend\Decorator\Bare; use Magento\Framework\Cache\FrontendInterface; use PHPUnit\Framework\TestCase; -use Zend_Cache_Exception; +use Psr\Cache\CacheItemPoolInterface; +use Psr\Cache\CacheItemInterface; class CoreTest extends TestCase { /** * @var Core */ - protected $_core; + protected Core $_core; /** - * @var array + * @var CacheItemPoolInterface|MockObject */ - protected static $_cacheStorage = []; - - /** - * Selected mock of \Zend_Cache_Backend_File to have extended - * \Zend_Cache_Backend and implemented \Zend_Cache_Backend_Interface - * - * @var \Zend_Cache_Backend_File - */ - protected $_mockBackend; + protected $cachePoolMock; protected function setUp(): void { - $this->_mockBackend = $this->createMock(\Zend_Cache_Backend_File::class); + $this->cachePoolMock = $this->getMockBuilder(CacheItemPoolInterface::class) + ->getMock(); + $this->_core = new Core($this->cachePoolMock); } protected function tearDown(): void { - unset($this->_mockBackend); + unset($this->cachePoolMock); + unset($this->_core); } - public function testSetBackendDefault() - { - $core = new Core(); - $core->setBackend($this->_mockBackend); - - $this->assertNotInstanceOf( - AbstractDecorator::class, - $core->getBackend() - ); - $this->assertEquals($this->_mockBackend, $core->getBackend()); - } - - /** - * @dataProvider setBackendExceptionProvider - */ - public function testSetBackendException($decorators) - { - $this->expectException('Zend_Cache_Exception'); - $core = new Core(['backend_decorators' => $decorators]); - $core->setBackend($this->_mockBackend); - } - - /** - * @return array - */ - public static function setBackendExceptionProvider() - { - return [ - 'string' => ['string'], - 'decorator setting is not an array' => [['decorator' => 'string']], - 'decorator setting is empty array' => [['decorator' => []]], - 'no class index in array' => [['decorator' => ['somedata']]], - 'non-existing class passed' => [['decorator' => ['class' => 'NonExistingClass']]] - ]; - } + public function testSaveDisabled() { - $backendMock = $this->createMock(\Zend_Cache_Backend_BlackHole::class); - $backendMock->expects($this->never())->method('save'); - $frontend = new Core(['disable_save' => true]); - $frontend->setBackend($backendMock); - $result = $frontend->save('data', 'id'); - $this->assertTrue($result); + $this->cachePoolMock->expects($this->never())->method('save'); + $this->_core->save('data', 'id'); + $this->assertTrue(true); // Assert that no exception is thrown } - public function testSaveNoCaching() - { - $backendMock = $this->createMock(\Zend_Cache_Backend_BlackHole::class); - $backendMock->expects($this->never())->method('save'); - $frontend = new Core(['disable_save' => false, 'caching' => false]); - $frontend->setBackend($backendMock); - $result = $frontend->save('data', 'id'); - $this->assertTrue($result); - } + public function testSave() { $data = 'data'; - $tags = ['abc', '!def', '_ghi']; - $prefix = 'prefix_'; - $prefixedTags = ['prefix_abc', 'prefix__def', 'prefix__ghi']; + $id = 'id'; + $itemMock = $this->getMockBuilder(CacheItemInterface::class)->getMock(); + + $this->cachePoolMock->expects($this->once()) + ->method('getItem') + ->with($this->_core->_id($id)) + ->willReturn($itemMock); + + $itemMock->expects($this->once()) + ->method('set') + ->with($data); - $backendMock = $this->createMock(\Zend_Cache_Backend_BlackHole::class); - $backendMock->expects($this->once()) + $this->cachePoolMock->expects($this->once()) ->method('save') - ->with($data, $this->anything(), $prefixedTags) + ->with($itemMock) ->willReturn(true); - $backendMock->expects($this->once()) - ->method('getCapabilities') - ->willReturn(['priority' => null]); - $frontend = new Core([ - 'disable_save' => false, - 'caching' => true, - 'cache_id_prefix' => $prefix, - 'automatic_cleaning_factor' => 0, - 'write_control' => false, - ]); - $frontend->setBackend($backendMock); - $result = $frontend->save($data, 'id', $tags); + + $result = $this->_core->save($data, $id); $this->assertTrue($result); } public function testClean() { - $mode = 'all'; - $tags = ['abc', '!def', '_ghi']; - $prefix = 'prefix_'; - $prefixedTags = ['prefix_abc', 'prefix__def', 'prefix__ghi']; - $expectedResult = true; - - $backendMock = $this->createMock(\Zend_Cache_Backend_BlackHole::class); - $backendMock->expects($this->once()) - ->method('clean') - ->with($mode, $prefixedTags) - ->willReturn($expectedResult); - $frontend = new Core([ - 'caching' => true, - 'cache_id_prefix' => $prefix, - ]); - $frontend->setBackend($backendMock); - - $result = $frontend->clean($mode, $tags); - $this->assertEquals($expectedResult, $result); - } + // Test CLEANING_MODE_ALL + $this->cachePoolMock->expects($this->once()) + ->method('clear') + ->willReturn(true); + $result = $this->_core->clean(FrontendInterface::CLEANING_MODE_ALL); + $this->assertTrue($result); - public function testGetIdsMatchingTags() - { - $tags = ['abc', '!def', '_ghi']; - $prefix = 'prefix_'; - $prefixedTags = ['prefix_abc', 'prefix__def', 'prefix__ghi']; - $ids = ['id', 'id2', 'id3']; - - $backendMock = $this->createMock(CoreTestMock::class); - $backendMock->expects($this->once()) - ->method('getIdsMatchingTags') - ->with($prefixedTags) - ->willReturn($ids); - $backendMock->expects($this->any()) - ->method('getCapabilities') - ->willReturn(['tags' => true]); - $frontend = new Core([ - 'caching' => true, - 'cache_id_prefix' => $prefix, - ]); - $frontend->setBackend($backendMock); - - $result = $frontend->getIdsMatchingTags($tags); - $this->assertEquals($ids, $result); - } + // Test CLEANING_MODE_MATCHING_TAG with tags + $this->cachePoolMock->expects($this->once()) + ->method('clear') + ->willReturn(true); + $result = $this->_core->clean(FrontendInterface::CLEANING_MODE_MATCHING_TAG, ['tag1']); + $this->assertTrue($result); - public function testGetIdsNotMatchingTags() - { - $tags = ['abc', '!def', '_ghi']; - $prefix = 'prefix_'; - $prefixedTags = ['prefix_abc', 'prefix__def', 'prefix__ghi']; - $ids = ['id', 'id2', 'id3']; - - $backendMock = $this->createMock(CoreTestMock::class); - $backendMock->expects($this->once()) - ->method('getIdsNotMatchingTags') - ->with($prefixedTags) - ->willReturn($ids); - $backendMock->expects($this->any()) - ->method('getCapabilities') - ->willReturn(['tags' => true]); - $frontend = new Core([ - 'caching' => true, - 'cache_id_prefix' => $prefix, - ]); - $frontend->setBackend($backendMock); - - $result = $frontend->getIdsNotMatchingTags($tags); - $this->assertEquals($ids, $result); - } + // Test CLEANING_MODE_MATCHING_TAG without tags + $this->cachePoolMock->expects($this->never()) + ->method('clear'); + $result = $this->_core->clean(FrontendInterface::CLEANING_MODE_MATCHING_TAG, []); + $this->assertTrue($result); - public function testLoadAllowsToUseCurlyBracketsInPrefixOnRedisBackend() - { - $id = 'abc'; + // Test CLEANING_MODE_MATCHING_ANY_TAG with tags + $this->cachePoolMock->expects($this->once()) + ->method('clear') + ->willReturn(true); + $result = $this->_core->clean(FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, ['tag1', 'tag2']); + $this->assertTrue($result); - $mockBackend = $this->createMock(Redis::class); - $core = new Core([ - 'cache_id_prefix' => '{prefix}_' - ]); - $core->setBackend($mockBackend); + // Test CLEANING_MODE_MATCHING_ANY_TAG without tags + $this->cachePoolMock->expects($this->never()) + ->method('clear'); + $result = $this->_core->clean(FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, []); + $this->assertTrue($result); - $core->load($id); - $this->assertNull(null); + // Test unsupported mode + $result = $this->_core->clean('unsupported_mode'); + $this->assertFalse($result); } - public function testLoadNotAllowsToUseCurlyBracketsInPrefixOnNonRedisBackend() - { - $id = 'abc'; - - $core = new Core([ - 'cache_id_prefix' => '{prefix}_' - ]); - $core->setBackend($this->_mockBackend); - - $this->expectException(Zend_Cache_Exception::class); - $this->expectExceptionMessage("Invalid id or tag '{prefix}_abc' : must use only [a-zA-Z0-9_]"); - - $core->load($id); - } + } diff --git a/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/BareTest.php b/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/BareTest.php index 92d56ff572998..b77b39df4d83b 100644 --- a/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/BareTest.php +++ b/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/BareTest.php @@ -43,7 +43,7 @@ public static function proxyMethodDataProvider() ['load', ['record_id'], '111'], ['save', ['record_value', 'record_id', ['tag'], 555], true], ['remove', ['record_id'], true], - ['clean', [\Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, ['tag']], true], + ['clean', [\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, ['tag']], true], ['getBackend', [], static fn (self $testCase) => $testCase->createZendCacheBackendMock()], ['getLowLevelFrontend', [], static fn (self $testCase) => $testCase->createZendCacheCoreMock()], ]; @@ -51,11 +51,11 @@ public static function proxyMethodDataProvider() public function createZendCacheBackendMock() { - return $this->createMock(\Zend_Cache_Backend::class); + return $this->createMock(\Psr\Cache\CacheItemPoolInterface::class); } public function createZendCacheCoreMock() { - return $this->createMock(\Zend_Cache_Core::class); + return $this->createMock(\Psr\Cache\CacheItemPoolInterface::class); } } diff --git a/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/ProfilerTest.php b/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/ProfilerTest.php index 88fee63639e9c..b773073499d3e 100644 --- a/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/ProfilerTest.php +++ b/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/ProfilerTest.php @@ -68,11 +68,11 @@ public function testProxyMethod( protected function getMockForZendCache() { - $adaptee = $this->createMock(\Zend_Cache_Core::class); + $adaptee = $this->createMock(\Psr\Cache\CacheItemPoolInterface::class); $frontendFactory = function () use ($adaptee) { return $adaptee; }; - $lowLevelFrontend = new Zend($frontendFactory); + $lowLevelFrontend = new Symfony($frontendFactory); return $lowLevelFrontend; } @@ -143,7 +143,7 @@ public static function proxyMethodDataProvider() ], [ 'clean', - [\Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, ['tag']], + [\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, ['tag']], $backend, $lowLevelFrontend, 'cache_clean', diff --git a/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/TagScopeTest.php b/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/TagScopeTest.php index 48adb20adf03d..73d2bffae1e8d 100644 --- a/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/TagScopeTest.php +++ b/lib/internal/Magento/Framework/Cache/Test/Unit/Frontend/Decorator/TagScopeTest.php @@ -78,12 +78,12 @@ public function testCleanModeAll(): void $this->_frontend->expects($this->once()) ->method('clean') ->with( - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, ['enforced_tag'] ) ->willReturn($expectedResult); $actualResult = $this->_object->clean( - \Zend_Cache::CLEANING_MODE_ALL, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL, ['ignored_tag_one', 'ignored_tag_two'] ); $this->assertSame($expectedResult, $actualResult); @@ -98,11 +98,11 @@ public function testCleanModeMatchingTag(): void $this->_frontend->expects($this->once()) ->method('clean') ->with( - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, ['test_tag_one', 'test_tag_two', 'enforced_tag'] )->willReturn($expectedResult); $actualResult = $this->_object->clean( - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, ['test_tag_one', 'test_tag_two'] ); $this->assertSame($expectedResult, $actualResult); @@ -122,17 +122,17 @@ public function testCleanModeMatchingAnyTag($fixtureResultOne, $fixtureResultTwo ->method('clean') ->willReturnCallback( function ($arg1, $arg2) use ($fixtureResultOne, $fixtureResultTwo) { - if ($arg1 == \Zend_Cache::CLEANING_MODE_MATCHING_TAG && + if ($arg1 == \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG && $arg2 == ['test_tag_one', 'enforced_tag']) { return $fixtureResultOne; - } elseif ($arg1 == \Zend_Cache::CLEANING_MODE_MATCHING_TAG && + } elseif ($arg1 == \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG && $arg2 == ['test_tag_two', 'enforced_tag']) { return $fixtureResultTwo; } } ); $actualResult = $this->_object->clean( - \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + \Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_ANY_TAG, ['test_tag_one', 'test_tag_two'] ); $this->assertEquals($expectedResult, $actualResult); diff --git a/lib/internal/Magento/Framework/Currency/Data/Currency.php b/lib/internal/Magento/Framework/Currency/Data/Currency.php index 3c7a3814dc259..78847ca11b3f2 100644 --- a/lib/internal/Magento/Framework/Currency/Data/Currency.php +++ b/lib/internal/Magento/Framework/Currency/Data/Currency.php @@ -12,7 +12,7 @@ use Magento\Framework\NumberFormatter; use Symfony\Component\Intl\Countries; use Symfony\Component\Intl\Currencies; -use Zend_Cache_Core; +use Magento\Framework\Cache\FrontendInterface; use Magento\Framework\CurrencyInterface; /** @@ -29,7 +29,7 @@ class Currency public const LEFT = 32; /** - * @var Zend_Cache_Core + * @var FrontendInterface */ private static $cache = null; @@ -407,7 +407,7 @@ public function __toString() /** * Returns the set cache. * - * @return Zend_Cache_Core + * @return FrontendInterface */ public static function getCache() { @@ -417,10 +417,10 @@ public static function getCache() /** * Sets a cache for Currency * - * @param Zend_Cache_Core $cache + * @param FrontendInterface $cache * @return void */ - public static function setCache(Zend_Cache_Core $cache) + public static function setCache(FrontendInterface $cache) { self::$cache = $cache; } @@ -455,9 +455,9 @@ public static function removeCache() public static function clearCache($tag = null): void { if ($tag) { - self::$cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_TAG, $tag); + self::$cache->clean(\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, (array)$tag); } else { - self::$cache->clean(\Zend_Cache::CLEANING_MODE_ALL); + self::$cache->clean(\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_ALL); } } diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index 4c3028717a0a7..5a794dbba1712 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -1736,7 +1736,7 @@ public function resetDdlCache($tableName = null, $schemaName = null) if ($tableName === null) { $this->_ddlCache = []; if ($this->_cacheAdapter) { - $this->_cacheAdapter->clean(\Zend_Cache::CLEANING_MODE_MATCHING_TAG, [self::DDL_CACHE_TAG]); + $this->_cacheAdapter->clean(\Magento\Framework\Cache\FrontendInterface::CLEANING_MODE_MATCHING_TAG, [self::DDL_CACHE_TAG]); } } else { $cacheKey = $this->_getTableName($tableName, $schemaName); diff --git a/lib/internal/Magento/Framework/Test/Unit/CurrencyTest.php b/lib/internal/Magento/Framework/Test/Unit/CurrencyTest.php index 6d35c8cd422f8..d0dfbf980aae7 100644 --- a/lib/internal/Magento/Framework/Test/Unit/CurrencyTest.php +++ b/lib/internal/Magento/Framework/Test/Unit/CurrencyTest.php @@ -12,6 +12,7 @@ use Magento\Framework\Currency; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; +use Psr\Cache\CacheItemPoolInterface; /** * Test for Magento\Framework\Currency @@ -21,17 +22,17 @@ class CurrencyTest extends TestCase public function testConstruct() { $frontendCache = $this->getMockForAbstractClass(FrontendInterface::class); - $lowLevelFrontend = $this->createMock(\Zend_Cache_Core::class); + $cachePoolMock = $this->createMock(CacheItemPoolInterface::class); /** @var CacheInterface|MockObject $appCache */ $appCache = $this->getMockForAbstractClass(CacheInterface::class); - $frontendCache->expects($this->once())->method('getLowLevelFrontend')->willReturn($lowLevelFrontend); + $frontendCache->expects($this->once())->method('getLowLevelFrontend')->willReturn($cachePoolMock); $appCache->expects($this->once()) ->method('getFrontend') ->willReturn($frontendCache); // Create new currency object $currency = new Currency($appCache, null, 'en_US'); - $this->assertEquals($lowLevelFrontend, $currency->getCache()); + $this->assertEquals($cachePoolMock, $currency->getCache()); $this->assertEquals('USD', $currency->getShortName()); } }