diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 7ae87439..3961e366 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -9,5 +9,5 @@ jobs: ci: uses: ray-di/.github/.github/workflows/continuous-integration.yml@v1 with: - old_stable: '["7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3", "8.4"]' + old_stable: '["8.2", "8.3", "8.4"]' current_stable: 8.5 diff --git a/composer-require-checker.json b/composer-require-checker.json index 1412610f..ba94db9c 100644 --- a/composer-require-checker.json +++ b/composer-require-checker.json @@ -12,6 +12,9 @@ "PhpParser\\Node\\Expr\\PropertyFetch", "PhpParser\\Node\\Expr\\Variable", "PhpParser\\Node\\Name", "PhpParser\\Node\\FullyQualified", "PhpParser\\Node\\Scalar\\DNumber", "PhpParser\\Node\\Scalar\\LNumber", "PhpParser\\Node\\Scalar\\String_", "PhpParser\\Node\\Stmt\\Return_", "PhpParser\\ParserFactory", - "PhpParser\\PrettyPrinter\\Standard", "PhpParser\\Node\\Name\\FullyQualified" + "PhpParser\\PrettyPrinter\\Standard", "PhpParser\\Node\\Name\\FullyQualified", + "Doctrine\\Common\\Annotations\\Reader", + "Koriym\\ParamReader\\ParamReader", + "Koriym\\ParamReader\\ParamReaderInterface" ] } diff --git a/composer.json b/composer.json index 00b428db..eddbee66 100644 --- a/composer.json +++ b/composer.json @@ -11,21 +11,15 @@ } ], "require": { - "php": "^7.2 || ^8.0", - "doctrine/annotations": "^1.8 || ^2.0", - "doctrine/cache": "^1.10 || ^2.1", - "koriym/attributes": "^1.0", + "php": "^8.2", "koriym/null-object": "^1.0", - "koriym/param-reader": "^1.0", - "koriym/printo": "^1.0", - "ray/aop": "^2.14", - "ray/di": "^2.18", - "symfony/polyfill-php83": "^1.33" + "ray/aop": "dev-php82", + "ray/di": "dev-php82" }, "require-dev": { "ext-pdo": "*", "bamarni/composer-bin-plugin": "^1.4", - "phpunit/phpunit": "^8.5.41 || ^9.5" + "phpunit/phpunit": "^9.5" }, "config": { "sort-packages": true, diff --git a/src/AbstractInjectorContext.php b/src/AbstractInjectorContext.php index a79f567f..dde2266b 100644 --- a/src/AbstractInjectorContext.php +++ b/src/AbstractInjectorContext.php @@ -4,7 +4,6 @@ namespace Ray\Compiler; -use Doctrine\Common\Cache\CacheProvider; use Override; use Ray\Di\AbstractModule; use Ray\Di\Annotation\ScriptDir; @@ -30,7 +29,18 @@ public function __construct(string $tmpDir) #[Override] abstract public function __invoke(): AbstractModule; - abstract public function getCache(): CacheProvider; + /** + * Returns cache provider + * + * @return null Always returns null + * + * @deprecated Cache functionality has been removed because doctrine/cache is abandoned. + * See: https://github.com/doctrine/cache + */ + public function getCache() + { + return null; + } /** * Return array of cacheable singleton class names diff --git a/src/CachedInjectorFactory.php b/src/CachedInjectorFactory.php index 0a523a39..cb11d26c 100644 --- a/src/CachedInjectorFactory.php +++ b/src/CachedInjectorFactory.php @@ -4,10 +4,8 @@ namespace Ray\Compiler; -use Doctrine\Common\Cache\CacheProvider; use Ray\Di\AbstractModule; use Ray\Di\InjectorInterface; -use Ray\Di\NullCache; use function assert; use function serialize; @@ -23,9 +21,13 @@ final class CachedInjectorFactory /** * @param non-empty-string $scriptDir * @param callable(): AbstractModule $modules + * @param mixed $cache Deprecated parameter (no longer used) * @param SavedSingletons $savedSingletons + * + * @deprecated The $cache parameter is deprecated. doctrine/cache has been abandoned. + * Pass null or omit this parameter. */ - public static function getInstance(string $injectorId, string $scriptDir, callable $modules, ?CacheProvider $cache = null, array $savedSingletons = []): InjectorInterface + public static function getInstance(string $injectorId, string $scriptDir, callable $modules, mixed $cache = null, array $savedSingletons = []): InjectorInterface { if (isset(self::$injectors[$injectorId])) { /** @noinspection UnserializeExploitsInspection */ @@ -35,20 +37,8 @@ public static function getInstance(string $injectorId, string $scriptDir, callab return $injector; } - /** @psalm-suppress DeprecatedClass */ - $cache = $cache ?? new NullCache(); - $cache->setNamespace($injectorId); - /** @var ScriptInjectorInterface|null $cachedInjector */ - $cachedInjector = $cache->fetch(ScriptInjectorInterface::class); - if ($cachedInjector instanceof ScriptInjectorInterface) { - return $cachedInjector; // @codeCoverageIgnore - } - + // $cache parameter is ignored for backward compatibility $injector = self::getInjector($modules, $scriptDir, $savedSingletons); - if ($injector instanceof ScriptInjectorInterface) { - $cache->save(ScriptInjectorInterface::class, $injector); - } - self::$injectors[$injectorId] = serialize($injector); return $injector; diff --git a/src/CompiledInjector.php b/src/CompiledInjector.php index 6000166a..f8e3012b 100644 --- a/src/CompiledInjector.php +++ b/src/CompiledInjector.php @@ -54,8 +54,8 @@ final class CompiledInjector implements ScriptInjectorInterface * @psalm-suppress UnresolvableInclude * @ScriptDir */ - #[ScriptDir] - public function __construct(string $scriptDir) + public function __construct(#[ScriptDir] + string $scriptDir) { $realPath = realpath($scriptDir); if ($realPath === false || ! is_dir($realPath) || ! is_readable($realPath)) { @@ -114,14 +114,16 @@ private function registerLoader(): void if (self::$scriptDirs === []) { spl_autoload_register( + // @codeCoverageIgnoreStart static function (string $class): void { foreach (self::$scriptDirs as $scriptDir) { $file = sprintf('%s/%s.php', $scriptDir, str_replace('\\', '_', $class)); if (file_exists($file)) { - require_once $file; // @codeCoverageIgnore + require_once $file; } } } + // @codeCoverageIgnoreEnd ); } diff --git a/src/ContextInjector.php b/src/ContextInjector.php index a83772fd..0d2e1eb1 100644 --- a/src/ContextInjector.php +++ b/src/ContextInjector.php @@ -7,19 +7,18 @@ use Ray\Di\AbstractModule; use Ray\Di\InjectorInterface; -use function get_class; - /** @psalm-immutable */ final class ContextInjector { public static function getInstance(AbstractInjectorContext $injectorContext): InjectorInterface { + /** @psalm-suppress DeprecatedMethod */ return CachedInjectorFactory::getInstance( - get_class($injectorContext), + $injectorContext::class, $injectorContext->tmpDir, $injectorContext, $injectorContext->getCache(), - $injectorContext->getSavedSingleton() + $injectorContext->getSavedSingleton(), ); } diff --git a/src/InjectionPoint.php b/src/InjectionPoint.php index dc6a59b0..1183bd0a 100644 --- a/src/InjectionPoint.php +++ b/src/InjectionPoint.php @@ -9,12 +9,13 @@ use Ray\Aop\ReflectionMethod; use Ray\Di\Di\Qualifier; use Ray\Di\InjectionPointInterface; -use Ray\ServiceLocator\ServiceLocator; +use ReflectionAttribute; use ReflectionException; use ReflectionParameter; use function assert; use function class_exists; +use function count; /** * @psalm-import-type ScriptDir from Types @@ -95,20 +96,51 @@ public function getQualifiers(): array * {@inheritDoc} * * @return object|null + * + * @throws ReflectionException */ public function getQualifier() { - $reader = ServiceLocator::getReader(); - $annotations = $reader->getMethodAnnotations($this->getMethod()); - foreach ($annotations as $annotation) { - $maybeQualifers = $reader->getClassAnnotations(new \ReflectionClass($annotation)); - foreach ($maybeQualifers as $maybeQualifer) { - if ($maybeQualifer instanceof Qualifier) { - return $annotation; - } + // Try method attributes first + $parameter = $this->getParameter(); + $class = $parameter->getDeclaringClass(); + $methodName = $parameter->getDeclaringFunction()->getShortName(); + assert($class instanceof \ReflectionClass); + + $nativeMethod = new \ReflectionMethod($class->getName(), $methodName); + $methodAttributes = $nativeMethod->getAttributes(); + + foreach ($methodAttributes as $attribute) { + if ($this->isQualifier($attribute)) { + return $attribute->newInstance(); + } + } + + // Try parameter attributes + $paramAttributes = $parameter->getAttributes(); + + foreach ($paramAttributes as $attribute) { + if ($this->isQualifier($attribute)) { + return $attribute->newInstance(); } } return null; } + + /** + * @phpstan-param ReflectionAttribute $attribute + * + * @throws ReflectionException + * + * @psalm-suppress TooManyTemplateParams + */ + private function isQualifier(ReflectionAttribute $attribute): bool + { + $attributeClass = $attribute->getName(); + $reflectionClass = new \ReflectionClass($attributeClass); + $classAttributes = $reflectionClass->getAttributes(Qualifier::class); + + return count($classAttributes) > 0; + } } diff --git a/tests/CachedFactoryTest.php b/tests/CachedFactoryTest.php index a91dec5f..399d7672 100644 --- a/tests/CachedFactoryTest.php +++ b/tests/CachedFactoryTest.php @@ -7,7 +7,6 @@ use PHPUnit\Framework\TestCase; use Ray\Di\AbstractModule; use Ray\Di\InjectorInterface; -use Ray\Di\NullCache; use function spl_object_hash; @@ -21,12 +20,10 @@ public function testInstanceCachedInStaticMemory(): void $this->assertNotSame(spl_object_hash($injector1), spl_object_hash($injector2)); } - public function testInstanceCachedInFileCache(): void + public function testInstanceWithSavedSingletons(): void { $injector1 = $this->getInjector('prod'); - $this->assertFalse(DevCache::$wasHit); $injector2 = $this->getInjector('prod'); - $this->assertFalse(DevCache::$wasHit); $this->assertNotSame(spl_object_hash($injector1), spl_object_hash($injector2)); $injector2->getInstance(FakeRobotInterface::class); } @@ -40,7 +37,7 @@ private function getInjector(string $context): InjectorInterface __DIR__ . '/tmp/dev', static function (): AbstractModule { return new FakeToBindPrototypeModule(); - } + }, ); } @@ -53,8 +50,7 @@ static function (): AbstractModule { return $module; }, - new DevCache(new NullCache()), - [FakeRobotInterface::class] // FakeRobotInterface object is cached in an injector. + [FakeRobotInterface::class], // FakeRobotInterface object is cached in an injector. ); } } diff --git a/tests/CompiledInjectorTest.php b/tests/CompiledInjectorTest.php index 6d014421..53769c2a 100644 --- a/tests/CompiledInjectorTest.php +++ b/tests/CompiledInjectorTest.php @@ -37,8 +37,10 @@ public function testCompile(): void $this->assertFileExists(__DIR__ . '/tmp/-Ray_Compiler_Annotation_Compile.php'); $this->assertFileExists(__DIR__ . '/tmp/-Ray_Di_Annotation_ScriptDir.php'); $this->assertFileExists(__DIR__ . '/tmp/Ray_Aop_MethodInvocation-.php'); - $this->assertFileExists(__DIR__ . '/tmp/Koriym_ParamReader_ParamReaderInterface-.php'); - $this->assertFileExists(__DIR__ . '/tmp/Ray_Di_AssistedInterceptor-.php'); + // Note: Koriym_ParamReader_ParamReaderInterface is not generated in php82-dev branch + // $this->assertFileExists(__DIR__ . '/tmp/Koriym_ParamReader_ParamReaderInterface-.php'); + // Note: AssistedInterceptor renamed to AssistedInjectInterceptor in php82-dev branch + $this->assertFileExists(__DIR__ . '/tmp/Ray_Di_AssistedInjectInterceptor-.php'); $this->assertFileExists(__DIR__ . '/tmp/Ray_Di_InjectorInterface-.php'); $this->assertFileExists(__DIR__ . '/tmp/Ray_Di_MethodInvocationProvider-.php'); $this->assertFileExists(__DIR__ . '/tmp/Ray_Di_ProviderInterface-.php'); diff --git a/tests/DevCache.php b/tests/DevCache.php deleted file mode 100644 index be883c21..00000000 --- a/tests/DevCache.php +++ /dev/null @@ -1,79 +0,0 @@ -cache = $cache; - } - - /** - * @param string $id - * - * @return false|mixed - */ - public function doFetch($id) - { - $data = $this->cache->fetch($id); - self::$wasHit = (bool) $data; - - return $data; - } - - /** - * @param string $id - * - * @return bool - */ - public function doContains($id) - { - return $this->cache->contains($id); - } - - /** - * @param string $id - * @param string $data - * @param int $lifeTime - * - * @return bool - */ - public function doSave($id, $data, $lifeTime = 0) - { - return $this->cache->save($id, $data, $lifeTime); - } - - /** - * @param string $id - * - * @return bool - */ - public function doDelete($id) - { - return $this->cache->delete($id); - } - - /** @return ?array */ - public function doGetStats() - { - return $this->cache->getStats(); - } - - /** @return bool */ - public function doFlush() - { - return true; - } -} diff --git a/tests/Fake/Assisted/FakeAssistedConsumer.php b/tests/Fake/Assisted/FakeAssistedConsumer.php index be428bb0..aab8c5a6 100644 --- a/tests/Fake/Assisted/FakeAssistedConsumer.php +++ b/tests/Fake/Assisted/FakeAssistedConsumer.php @@ -11,19 +11,18 @@ class FakeAssistedConsumer { /** * @return FakeRobotInterface|null - * - * @Assisted({"robot"}) */ - public function assistOne($a, $b, ?FakeRobotInterface $robot = null) + public function assistOne( + $a, + $b, + #[Assisted] ?FakeRobotInterface $robot = null) { return $robot; } - /** - * @Assisted({"var1"}) - * @Named("var1=one") - */ - public function assistWithName($a, $var1 = null) + public function assistWithName( + $a, + #[Named("one")] #[Assisted] $var1 = null) { return $var1; } @@ -31,12 +30,11 @@ public function assistWithName($a, $var1 = null) /** * @return (FakeRobotInterface|mixed|null)[] * @psalm-return array{0: mixed, 1: FakeRobotInterface|null} - * - * @Assisted({"var2", "robot"}) - * @Named("var2=one") */ - public function assistAny($var2 = null, ?FakeRobotInterface $robot = null) - { + public function assistAny( + #[Named("one")] #[Assisted] $var2 = null, + #[Assisted] ?FakeRobotInterface $robot = null + ) { return [$var2, $robot]; } } diff --git a/tests/Fake/Assisted/FakeAssistedParamsConsumer.php b/tests/Fake/Assisted/FakeAssistedParamsConsumer.php index ba90b914..0af9db41 100644 --- a/tests/Fake/Assisted/FakeAssistedParamsConsumer.php +++ b/tests/Fake/Assisted/FakeAssistedParamsConsumer.php @@ -10,10 +10,8 @@ class FakeAssistedParamsConsumer { /** * @return array [int, FakeAbstractDb] - * - * @Assisted({"db"}) */ - public function getUser($id, ?FakeAbstractDb $db = null) + public function getUser($id, #[Assisted] ?FakeAbstractDb $db = null) { return [$id, $db]; } diff --git a/tests/Fake/Deep/FakeInjectorContext.php b/tests/Fake/Deep/FakeInjectorContext.php index b9a5f19e..94c50526 100644 --- a/tests/Fake/Deep/FakeInjectorContext.php +++ b/tests/Fake/Deep/FakeInjectorContext.php @@ -4,11 +4,8 @@ namespace Ray\Compiler\Deep; - -use Doctrine\Common\Cache\CacheProvider; use Ray\Compiler\AbstractInjectorContext; use Ray\Di\AbstractModule; -use Ray\Di\NullCache; use Ray\Di\Scope; final class FakeInjectorContext extends AbstractInjectorContext @@ -17,9 +14,4 @@ public function __invoke(): AbstractModule { return new FakeDepModule(); } - - public function getCache(): CacheProvider - { - return new NullCache(); - } } diff --git a/tests/Fake/Deep/FakeScriptInjectorContext.php b/tests/Fake/Deep/FakeScriptInjectorContext.php index be54a321..d3be786b 100644 --- a/tests/Fake/Deep/FakeScriptInjectorContext.php +++ b/tests/Fake/Deep/FakeScriptInjectorContext.php @@ -4,8 +4,6 @@ namespace Ray\Compiler\Deep; - -use Doctrine\Common\Cache\CacheProvider; use Ray\Compiler\AbstractInjectorContext; use Ray\Di\AbstractModule; @@ -15,33 +13,4 @@ public function __invoke(): AbstractModule { return new FakeDepModule(); } - - public function getCache(): CacheProvider - { - return new class() extends CacheProvider { - protected function doFetch($id) - { - } - - protected function doContains($id) - { - } - - protected function doSave($id, $data, $lifeTime = 0) - { - } - - protected function doDelete($id) - { - } - - protected function doFlush() - { - } - - protected function doGetStats() - { - } - }; - } } diff --git a/tests/Fake/FakeCar.php b/tests/Fake/FakeCar.php index 43d50075..0b8eb92f 100644 --- a/tests/Fake/FakeCar.php +++ b/tests/Fake/FakeCar.php @@ -24,9 +24,7 @@ class FakeCar implements FakeCarInterface public $handle; public $null = false; - /** - * @Inject - */ + #[Inject] public function setTires(FakeTyreInterface $frontTyre, FakeTyreInterface $rearTyre, $null = null) { $this->frontTyre = $frontTyre; @@ -34,44 +32,34 @@ public function setTires(FakeTyreInterface $frontTyre, FakeTyreInterface $rearTy $this->null = $null; } - /** - * @Inject(optional=true) - */ + #[Inject(optional: true)] public function setHardtop(FakeHardtopInterface $hardtop) { $this->hardtop = $hardtop; } - /** - * @Inject - * @Named("rightMirror=right,leftMirror=left") - */ - public function setMirrors(FakeMirrorInterface $rightMirror, FakeMirrorInterface $leftMirror) - { + #[Inject] + public function setMirrors( + #[Named('right')] FakeMirrorInterface $rightMirror, + #[Named('left')] FakeMirrorInterface $leftMirror + ) { $this->rightMirror = $rightMirror; $this->leftMirror = $leftMirror; } - /** - * @Inject - * @Named("right") - */ - public function setSpareMirror(FakeMirrorInterface $rightMirror) + #[Inject] + public function setSpareMirror(#[Named('right')] FakeMirrorInterface $rightMirror) { $this->spareMirror = $rightMirror; } - /** - * @Inject - */ + #[Inject] public function setHandle(FakeHandleInterface $handle) { $this->handle = $handle; } - /** - * @Inject - */ + #[Inject] public function setOil(FakeOilInterface $oil) { $this->oil = $oil; @@ -86,9 +74,7 @@ public function __construct(FakeEngineInterface $engine) } - /** - * @PostConstruct - */ + #[PostConstruct] public function postConstruct() { $isEngineInstalled = $this->engine instanceof FakeEngine; diff --git a/tests/Fake/FakeHandleProvider.php b/tests/Fake/FakeHandleProvider.php index 9cc53ac6..f9852ecf 100644 --- a/tests/Fake/FakeHandleProvider.php +++ b/tests/Fake/FakeHandleProvider.php @@ -12,11 +12,8 @@ class FakeHandleProvider implements ProviderInterface { private $logo; - /** - * @Inject - * @Named("logo") - */ - public function __construct($logo = 'nardi') + #[Inject] + public function __construct(#[Named('logo')] $logo = 'nardi') { $this->logo = $logo; } diff --git a/tests/Fake/FakeLoggerConsumer.php b/tests/Fake/FakeLoggerConsumer.php index 2f3646ab..fb0961f9 100644 --- a/tests/Fake/FakeLoggerConsumer.php +++ b/tests/Fake/FakeLoggerConsumer.php @@ -22,6 +22,7 @@ public function __construct(InjectorInterface $injector) /** * @FakeLoggerInject(type="MEMORY") */ + #[FakeLoggerInject(type: 'MEMORY')] public function setLogger(FakeLoggerInterface $logger) { $this->logger = $logger; diff --git a/tests/Fake/FakeLoggerInject.php b/tests/Fake/FakeLoggerInject.php index 321bb103..b8f38c05 100644 --- a/tests/Fake/FakeLoggerInject.php +++ b/tests/Fake/FakeLoggerInject.php @@ -21,6 +21,25 @@ final class FakeLoggerInject implements InjectInterface /** @Enum({"MEMORY", "FILE", "DB"}) */ public $type; + /** + * @param string|array|null $type + */ + public function __construct($type = null) + { + if (is_array($type) && isset($type['type'])) { + // Doctrine Annotations format: @FakeLoggerInject(type="MEMORY") + $this->type = $type['type']; + } elseif (is_string($type)) { + // Attribute format: #[FakeLoggerInject(type: 'MEMORY')] + $this->type = $type; + } elseif (is_array($type) && isset($type['value'])) { + // Doctrine Annotations format: @FakeLoggerInject("MEMORY") + $this->type = $type['value']; + } else { + $this->type = $type ?? 'MEMORY'; + } + } + public function isOptional() { return true; diff --git a/tests/Fake/FakeOptional.php b/tests/Fake/FakeOptional.php index 91c625fb..45d4fa40 100644 --- a/tests/Fake/FakeOptional.php +++ b/tests/Fake/FakeOptional.php @@ -10,9 +10,7 @@ class FakeOptional { public $robot = null; - /** - * @Inject(optional=true) - */ + #[Inject(optional: true)] public function setOptionalRobot(FakeRobotInterface $robot) { $this->robot = $robot; diff --git a/tests/Fake/FakeParameterQualifier.php b/tests/Fake/FakeParameterQualifier.php new file mode 100644 index 00000000..7376f54a --- /dev/null +++ b/tests/Fake/FakeParameterQualifier.php @@ -0,0 +1,18 @@ + - * @Set(FakeEngineInterface::class) - */ - public $engines; - - /** - * @var Map - * @Set(FakeRobotInterface::class) - */ - public $robots; - public function __construct( - Map $engines, - Map $robots + #[Set(FakeEngineInterface::class)] public Map $engines, + #[Set(FakeRobotInterface::class)] public Map $robots ){ - $this->engines = $engines; - $this->robots = $robots; } } diff --git a/tests/InjectionPointTest.php b/tests/InjectionPointTest.php index 430fe062..52cdd9bb 100644 --- a/tests/InjectionPointTest.php +++ b/tests/InjectionPointTest.php @@ -58,4 +58,24 @@ public function testGetQualifierReturnsNullWhenNoQualifier(): void $qualifier = $this->injectionPoint->getQualifier(); $this->assertNull($qualifier); } + + public function testGetQualifierReturnsMethodLevelQualifier(): void + { + // Test with FakeLoggerConsumer which has #[FakeLoggerInject] on setLogger method + $injectionPoint = InjectionPoint::getInstance([FakeLoggerConsumer::class, 'setLogger', 'logger']); + $qualifier = $injectionPoint->getQualifier(); + + $this->assertInstanceOf(FakeLoggerInject::class, $qualifier); + $this->assertSame('MEMORY', $qualifier->type); + } + + public function testGetQualifierReturnsParameterLevelQualifier(): void + { + // Test with FakeParameterQualifierConsumer which has #[FakeParameterQualifier] on parameter + $injectionPoint = InjectionPoint::getInstance([FakeParameterQualifierConsumer::class, 'setRobot', 'robot']); + $qualifier = $injectionPoint->getQualifier(); + + $this->assertInstanceOf(FakeParameterQualifier::class, $qualifier); + $this->assertSame('special', $qualifier->value); + } } diff --git a/vendor-bin/tools/composer.lock b/vendor-bin/tools/composer.lock index 8100a182..8d01ec66 100644 --- a/vendor-bin/tools/composer.lock +++ b/vendor-bin/tools/composer.lock @@ -2854,16 +2854,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.13.4", + "version": "3.13.5", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119" + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ad545ea9c1b7d270ce0fc9cbfb884161cd706119", - "reference": "ad545ea9c1b7d270ce0fc9cbfb884161cd706119", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "shasum": "" }, "require": { @@ -2880,11 +2880,6 @@ "bin/phpcs" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -2934,7 +2929,7 @@ "type": "thanks_dev" } ], - "time": "2025-09-05T05:47:09+00:00" + "time": "2025-11-04T16:30:35+00:00" }, { "name": "symfony/config", @@ -3017,16 +3012,16 @@ }, { "name": "symfony/console", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" + "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", - "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", + "url": "https://api.github.com/repos/symfony/console/zipball/cdb80fa5869653c83cfe1a9084a673b6daf57ea7", + "reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7", "shasum": "" }, "require": { @@ -3091,7 +3086,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.4" + "source": "https://github.com/symfony/console/tree/v7.3.5" }, "funding": [ { @@ -3111,7 +3106,7 @@ "type": "tidelift" } ], - "time": "2025-09-22T15:31:00+00:00" + "time": "2025-10-14T15:46:26+00:00" }, { "name": "symfony/dependency-injection", @@ -4123,16 +4118,16 @@ }, { "name": "webmozart/assert", - "version": "1.12.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "541057574806f942c94662b817a50f63f7345360" + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/541057574806f942c94662b817a50f63f7345360", - "reference": "541057574806f942c94662b817a50f63f7345360", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", "shasum": "" }, "require": { @@ -4175,9 +4170,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.0" + "source": "https://github.com/webmozarts/assert/tree/1.12.1" }, - "time": "2025-10-20T12:43:39+00:00" + "time": "2025-10-29T15:56:20+00:00" } ], "aliases": [],