diff --git a/CHANGELOG.md b/CHANGELOG.md index f071043..e5f49b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Latest ------ ### Changes +* [#65](https://github.com/cleverage/cache-process-bundle/issues/65) Configuring a key under `clever_age_cache_process` is deprecated: the bundle has no configuration and the keys were ignored without notice (new internal `Configuration`, empty; notice when the container is compiled). They will be rejected in 3.0. Require `symfony/deprecation-contracts`, used directly. Update documentation, add tests. * [#63](https://github.com/cleverage/cache-process-bundle/issues/63) The bundle throws exceptions implementing `ProcessExceptionInterface` of the process bundle instead of raw SPL exceptions (as [cleverage/process-bundle#317](https://github.com/cleverage/process-bundle/issues/317)): new `Exception\UnexpectedValueException`, extending the SPL exceptions thrown before (same messages, the existing `catch` keep working). `MissingAdapterException` implements `ProcessExceptionInterface`. Add tests. * [#61](https://github.com/cleverage/cache-process-bundle/issues/61) Composer: require PHP `^8.2` instead of `>=8.2` (PHP 9 is no longer accepted before being tested), remove the authorization of the `symfony/flex` plugin, which is not required (the CI installs it globally), as [cleverage/process-bundle#319](https://github.com/cleverage/process-bundle/issues/319). * [#56](https://github.com/cleverage/cache-process-bundle/issues/56) Define the public API (Symfony BC promise, as [cleverage/process-bundle#279](https://github.com/cleverage/process-bundle/issues/279)): `GetTask`, `SetTask`, `AdapterRegistry` and `CleverAgeCacheProcessBundle` are marked `@final since 2.3`, they will be `final` in 3.0: extending them triggers a deprecation with the Symfony `DebugClassLoader`. `AbstractCacheTask`, `Adapter` (extended by the applications) and `MissingAdapterException` stay open. `CleverAgeCacheProcessExtension` and `RegisterAdaptersPass` are marked `@internal`. diff --git a/composer.json b/composer.json index 6e39177..880e816 100644 --- a/composer.json +++ b/composer.json @@ -37,6 +37,7 @@ "symfony/cache": "^6.4 || ^7.4 || ^8", "symfony/config": "^6.4 || ^7.4 || ^8", "symfony/dependency-injection": "^6.4 || ^7.4 || ^8", + "symfony/deprecation-contracts": "^2.5 || ^3", "symfony/http-kernel": "^6.4 || ^7.4 || ^8", "symfony/options-resolver": "^6.4 || ^7.4 || ^8", "symfony/polyfill-php83": "^1.33", diff --git a/docs/index.md b/docs/index.md index 44d378e..78a7846 100644 --- a/docs/index.md +++ b/docs/index.md @@ -47,6 +47,8 @@ services: - { name: cleverage.cache.adapter, code: app } ``` +No option can be configured under `clever_age_cache_process`: a key there is ignored. Configuring one is deprecated since 2.3 (an `E_USER_DEPRECATED` error is triggered when the container is compiled), the keys will be rejected in 3.0. + ## Custom cache tasks `CleverAge\CacheProcessBundle\Task\AbstractCacheTask` can be extended to implement other cache operations. It extends diff --git a/src/DependencyInjection/CleverAgeCacheProcessExtension.php b/src/DependencyInjection/CleverAgeCacheProcessExtension.php index bb9b109..e8f48ab 100644 --- a/src/DependencyInjection/CleverAgeCacheProcessExtension.php +++ b/src/DependencyInjection/CleverAgeCacheProcessExtension.php @@ -31,6 +31,18 @@ class CleverAgeCacheProcessExtension extends Extension { public function load(array $configs, ContainerBuilder $container): void { + $keys = array_keys(array_merge(...$configs)); + if ([] !== $keys) { + trigger_deprecation( + 'cleverage/cache-process-bundle', + '2.3', + 'Configuring "%s" is deprecated, the bundle has no configuration: the keys "%s" are ignored. They will be rejected in 3.0.', + $this->getAlias(), + implode('", "', $keys), + ); + } + $this->processConfiguration(new Configuration(), $configs); + $this->findServices($container, __DIR__.'/../../config/services'); $container->registerAttributeForAutoconfiguration( diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php new file mode 100644 index 0000000..16bf225 --- /dev/null +++ b/src/DependencyInjection/Configuration.php @@ -0,0 +1,37 @@ +getRootNode(); + $rootNode->ignoreExtraKeys(); + + return $treeBuilder; + } +} diff --git a/tests/DependencyInjection/CleverAgeCacheProcessExtensionTest.php b/tests/DependencyInjection/CleverAgeCacheProcessExtensionTest.php index 27c4678..db2ece2 100644 --- a/tests/DependencyInjection/CleverAgeCacheProcessExtensionTest.php +++ b/tests/DependencyInjection/CleverAgeCacheProcessExtensionTest.php @@ -15,6 +15,7 @@ use CleverAge\CacheProcessBundle\Attribute\AsCacheAdapter; use CleverAge\CacheProcessBundle\DependencyInjection\CleverAgeCacheProcessExtension; +use CleverAge\CacheProcessBundle\DependencyInjection\Configuration; use CleverAge\CacheProcessBundle\Registry\AdapterRegistry; use CleverAge\CacheProcessBundle\Task\GetTask; use CleverAge\CacheProcessBundle\Task\SetTask; @@ -32,6 +33,7 @@ use Symfony\Component\Yaml\Yaml; #[CoversClass(CleverAgeCacheProcessExtension::class)] +#[CoversClass(Configuration::class)] #[UsesClass(AdapterRegistry::class)] #[CoversClass(AsCacheAdapter::class)] class CleverAgeCacheProcessExtensionTest extends TestCase @@ -149,6 +151,54 @@ public function testTaskIsRegistered(string $class, string $code, string $deprec $alias->getDeprecation($deprecatedId) ); } + + public function testConfigurationKeysAreDeprecated(): void + { + $deprecations = $this->collectDeprecations(static function (): void { + (new CleverAgeCacheProcessExtension())->load([[], ['foo' => true], ['bar' => 1, 'foo' => false]], new ContainerBuilder()); + }); + + self::assertSame(['Since cleverage/cache-process-bundle 2.3: Configuring "clever_age_cache_process" is deprecated, the bundle has no configuration: the keys "foo", "bar" are ignored. They will be rejected in 3.0.'], $deprecations); + } + + public function testNoDeprecationWithoutConfigurationKey(): void + { + $deprecations = $this->collectDeprecations(static function (): void { + (new CleverAgeCacheProcessExtension())->load([[], []], new ContainerBuilder()); + }); + + self::assertSame([], $deprecations); + } + + public function testConfigurationHasNoOption(): void + { + $configuration = (new CleverAgeCacheProcessExtension())->getConfiguration([], new ContainerBuilder()); + + self::assertInstanceOf(Configuration::class, $configuration); + self::assertSame('clever_age_cache_process', $configuration->getConfigTreeBuilder()->buildTree()->getName()); + } + + /** + * @param callable(): void $callback + * + * @return list + */ + private function collectDeprecations(callable $callback): array + { + $deprecations = []; + set_error_handler(static function (int $errno, string $errstr) use (&$deprecations): bool { + $deprecations[] = $errstr; + + return true; + }, \E_USER_DEPRECATED); + try { + $callback(); + } finally { + restore_error_handler(); + } + + return $deprecations; + } } final readonly class AutowiredRegistryConsumer