diff --git a/CHANGELOG.md b/CHANGELOG.md index f7b5f75..bc9aa07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Latest ------ ### Changes +* [#47](https://github.com/cleverage/archive-process-bundle/issues/47) Configuring a key under `clever_age_archive_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. * [#45](https://github.com/cleverage/archive-process-bundle/issues/45) 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` and `Exception\RuntimeException`, extending the SPL exceptions thrown before (same messages, the existing `catch` keep working). Add tests. * [#43](https://github.com/cleverage/archive-process-bundle/issues/43) 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). * [#38](https://github.com/cleverage/archive-process-bundle/issues/38) Define the public API (Symfony BC promise, as [cleverage/process-bundle#279](https://github.com/cleverage/process-bundle/issues/279)): `ZipTask`, `UnzipTask` and `CleverAgeArchiveProcessBundle` are marked `@final since 2.3`, they will be `final` in 3.0: extending them triggers a deprecation with the Symfony `DebugClassLoader`. `CleverAgeArchiveProcessExtension` is marked `@internal`. diff --git a/composer.json b/composer.json index 9176070..ecddd15 100644 --- a/composer.json +++ b/composer.json @@ -42,6 +42,7 @@ "cleverage/process-bundle": "^5.0", "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 2f48301..0f30cdf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -42,6 +42,8 @@ will be private in 3.0); their former ids, `cleverage_archive_process.task.zip` Both tasks accept their options either from the task configuration or from their input (an array merged with the options), which allows computing paths in a previous task. +No option can be configured under `clever_age_archive_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. + ## Documentation - Cookbooks diff --git a/src/DependencyInjection/CleverAgeArchiveProcessExtension.php b/src/DependencyInjection/CleverAgeArchiveProcessExtension.php index df752ed..9da5e76 100644 --- a/src/DependencyInjection/CleverAgeArchiveProcessExtension.php +++ b/src/DependencyInjection/CleverAgeArchiveProcessExtension.php @@ -25,6 +25,18 @@ class CleverAgeArchiveProcessExtension extends Extension { public function load(array $configs, ContainerBuilder $container): void { + $keys = array_keys(array_merge(...$configs)); + if ([] !== $keys) { + trigger_deprecation( + 'cleverage/archive-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'); } diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php new file mode 100644 index 0000000..419fdb8 --- /dev/null +++ b/src/DependencyInjection/Configuration.php @@ -0,0 +1,37 @@ +getRootNode(); + $rootNode->ignoreExtraKeys(); + + return $treeBuilder; + } +} diff --git a/tests/DependencyInjection/CleverAgeArchiveProcessExtensionTest.php b/tests/DependencyInjection/CleverAgeArchiveProcessExtensionTest.php index 30f8918..2bb7d38 100644 --- a/tests/DependencyInjection/CleverAgeArchiveProcessExtensionTest.php +++ b/tests/DependencyInjection/CleverAgeArchiveProcessExtensionTest.php @@ -14,6 +14,7 @@ namespace CleverAge\ArchiveProcessBundle\Tests\DependencyInjection; use CleverAge\ArchiveProcessBundle\DependencyInjection\CleverAgeArchiveProcessExtension; +use CleverAge\ArchiveProcessBundle\DependencyInjection\Configuration; use CleverAge\ArchiveProcessBundle\Task\UnzipTask; use CleverAge\ArchiveProcessBundle\Task\ZipTask; use PHPUnit\Framework\Attributes\CoversClass; @@ -23,6 +24,7 @@ use Symfony\Component\Yaml\Yaml; #[CoversClass(CleverAgeArchiveProcessExtension::class)] +#[CoversClass(Configuration::class)] class CleverAgeArchiveProcessExtensionTest extends TestCase { public function testEveryServiceDefinitionFileIsLoaded(): void @@ -96,4 +98,52 @@ public function testTaskIsRegistered(string $class, string $code, string $deprec $alias->getDeprecation($deprecatedId) ); } + + public function testConfigurationKeysAreDeprecated(): void + { + $deprecations = $this->collectDeprecations(static function (): void { + (new CleverAgeArchiveProcessExtension())->load([[], ['foo' => true], ['bar' => 1, 'foo' => false]], new ContainerBuilder()); + }); + + self::assertSame(['Since cleverage/archive-process-bundle 2.3: Configuring "clever_age_archive_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 CleverAgeArchiveProcessExtension())->load([[], []], new ContainerBuilder()); + }); + + self::assertSame([], $deprecations); + } + + public function testConfigurationHasNoOption(): void + { + $configuration = (new CleverAgeArchiveProcessExtension())->getConfiguration([], new ContainerBuilder()); + + self::assertInstanceOf(Configuration::class, $configuration); + self::assertSame('clever_age_archive_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; + } }