diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bd5f12f..94fe8770 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Latest ## Changes * [#339](https://github.com/cleverage/process-bundle/issues/339) A shared service referenced by several tasks of the same process is rejected when the container is compiled (`InvalidArgumentException` naming the service, the tasks and the process): all these tasks ran with the same instance, initialized with the options of each task in turn, without error. Declare the task services with `shared: false` (applied by the autoconfiguration of `TaskInterface` since 5.4). Update documentation, add tests. +* [#351](https://github.com/cleverage/process-bundle/issues/351) `ProcessManager` and `ProcessHelpCommand` are typed on `TaskRegistryInterface` instead of the final `TaskRegistry` class: the task registry can be decorated or replaced. Add tests. ## Fixes * [#343](https://github.com/cleverage/process-bundle/issues/343) The temporary files of `FileSplitterTask` (`file_splitter`), `CsvSplitterTask` (`csv_splitter`) and of the JSON buffer of `ProcessLauncherTask` (`json_buffering`) are created with a random name, exclusively (an existing path, symbolic links included, is never reused) and readable by their owner only, instead of a name derived from the time (`uniqid()`), opened in `w` mode with the permissions of the umask. Update documentation, add tests. diff --git a/src/Command/ProcessHelpCommand.php b/src/Command/ProcessHelpCommand.php index af865943..038f330a 100644 --- a/src/Command/ProcessHelpCommand.php +++ b/src/Command/ProcessHelpCommand.php @@ -23,6 +23,7 @@ use CleverAge\ProcessBundle\Model\TaskInterface; use CleverAge\ProcessBundle\Registry\ProcessConfigurationRegistry; use CleverAge\ProcessBundle\Registry\TaskRegistry; +use CleverAge\ProcessBundle\Registry\TaskRegistryInterface; use CleverAge\ProcessBundle\Task\Process\ProcessExecutorTask; use CleverAge\ProcessBundle\Task\Process\ProcessLauncherTask; use Psr\Container\ContainerInterface; @@ -64,7 +65,7 @@ class ProcessHelpCommand extends Command protected const INDENT_SIZE = 4; - protected TaskRegistry $taskRegistry; + protected TaskRegistryInterface $taskRegistry; /** * @deprecated since 5.4, only set when a container is passed to the constructor, will be removed in v6.0 @@ -73,7 +74,7 @@ class ProcessHelpCommand extends Command public function __construct( protected ProcessConfigurationRegistry $processConfigRegistry, - TaskRegistry|ContainerInterface $taskRegistry, + TaskRegistryInterface|ContainerInterface $taskRegistry, ) { parent::__construct(); if ($taskRegistry instanceof ContainerInterface) { diff --git a/src/Manager/ProcessManager.php b/src/Manager/ProcessManager.php index dc195f4e..b601b3b1 100644 --- a/src/Manager/ProcessManager.php +++ b/src/Manager/ProcessManager.php @@ -35,6 +35,7 @@ use CleverAge\ProcessBundle\Model\TaskInterface; use CleverAge\ProcessBundle\Registry\ProcessConfigurationRegistry; use CleverAge\ProcessBundle\Registry\TaskRegistry; +use CleverAge\ProcessBundle\Registry\TaskRegistryInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\Service\ResetInterface; @@ -70,7 +71,7 @@ class ProcessManager implements ProcessManagerInterface, ResetInterface protected ?TaskConfiguration $taskConfiguration = null; - protected TaskRegistry $taskRegistry; + protected TaskRegistryInterface $taskRegistry; /** * @param iterable $stopCheckers @@ -83,9 +84,9 @@ public function __construct( protected ContextualOptionResolver $contextualOptionResolver, protected EventDispatcherInterface $eventDispatcher, protected iterable $stopCheckers = [], - ?TaskRegistry $taskRegistry = null, + ?TaskRegistryInterface $taskRegistry = null, ) { - if (!$taskRegistry instanceof TaskRegistry) { + if (!$taskRegistry instanceof TaskRegistryInterface) { trigger_deprecation( 'cleverage/process-bundle', '5.4', diff --git a/tests/Manager/ProcessManagerTaskRegistryTest.php b/tests/Manager/ProcessManagerTaskRegistryTest.php index fedaddc6..517aa618 100644 --- a/tests/Manager/ProcessManagerTaskRegistryTest.php +++ b/tests/Manager/ProcessManagerTaskRegistryTest.php @@ -24,8 +24,10 @@ use CleverAge\ProcessBundle\Model\AbstractConfigurableTask; use CleverAge\ProcessBundle\Model\ProcessHistory; use CleverAge\ProcessBundle\Model\ProcessState; +use CleverAge\ProcessBundle\Model\TaskInterface; use CleverAge\ProcessBundle\Registry\ProcessConfigurationRegistry; use CleverAge\ProcessBundle\Registry\TaskRegistry; +use CleverAge\ProcessBundle\Registry\TaskRegistryInterface; use CleverAge\ProcessBundle\Task\ConstantOutputTask; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\UsesClass; @@ -65,6 +67,21 @@ public function testTasksAreFetchedWithTheTaskRegistry(): void self::assertSame([], $this->deprecations); } + public function testAnyTaskRegistryCanBeUsed(): void + { + // E.g. a decorator of the task registry of the bundle + $taskRegistry = new class implements TaskRegistryInterface { + public function getTask(TaskConfiguration $taskConfiguration): TaskInterface + { + return new ConstantOutputTask(); + } + }; + $processManager = $this->collectDeprecations(fn (): ProcessManager => $this->createProcessManager($taskRegistry)); + + self::assertSame('ok', $this->collectDeprecations(static fn (): mixed => $processManager->execute('test.process'))); + self::assertSame([], $this->deprecations); + } + public function testWithoutTaskRegistryTheTasksAreFetchedFromTheContainerWithADeprecation(): void { $processManager = $this->collectDeprecations(fn (): ProcessManager => $this->createProcessManager(null)); @@ -76,7 +93,7 @@ public function testWithoutTaskRegistryTheTasksAreFetchedFromTheContainerWithADe ); } - private function createProcessManager(?TaskRegistry $taskRegistry): ProcessManager + private function createProcessManager(?TaskRegistryInterface $taskRegistry): ProcessManager { $container = new Container(); $container->set('app.constant', new ConstantOutputTask());