Skip to content

Commit 662f7c3

Browse files
committed
Change the task compiler logic to allow resolving of environment variables.
1 parent ea28129 commit 662f7c3

7 files changed

Lines changed: 58 additions & 100 deletions

File tree

resources/config/services.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ services:
99
GrumPHP\Event\Dispatcher\Bridge\SymfonyEventDispatcher:
1010
arguments:
1111
- '@Symfony\Component\EventDispatcher\EventDispatcher'
12-
GrumPHP\Configuration\Resolver\TaskConfigResolver:
13-
synthetic: true
1412

1513
GrumPHP\Event\Dispatcher\EventDispatcherInterface: '@GrumPHP\Event\Dispatcher\Bridge\SymfonyEventDispatcher'
1614

src/Collection/TasksCollection.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@ public function filterByTaskNames(array $tasks): self
4747
});
4848
}
4949

50+
public function filterEnabled(): self
51+
{
52+
return $this->filter(
53+
static fn(TaskInterface $task): bool => $task->getConfig()->getMetadata()->isEnabled()
54+
);
55+
}
56+
5057
/**
5158
* This method sorts the tasks by highest priority first.
5259
*/

src/Configuration/Compiler/TaskCompilerPass.php

Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
use GrumPHP\Configuration\Configurator\TaskConfigurator;
99
use GrumPHP\Configuration\Resolver\TaskConfigResolver;
1010
use GrumPHP\Exception\TaskConfigResolverException;
11-
use GrumPHP\Task\Config\LazyTaskConfig;
12-
use GrumPHP\Task\Config\Metadata;
13-
use GrumPHP\Task\Config\TaskConfig;
1411
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1512
use Symfony\Component\DependencyInjection\ContainerBuilder;
1613
use Symfony\Component\DependencyInjection\Definition;
@@ -30,7 +27,7 @@ public function process(ContainerBuilder $container): void
3027
$availableTasks = $this->fetchAvailableTasksInfo($container);
3128
$configuredTasks = $container->getParameter('tasks');
3229
$configuredTasks = is_array($configuredTasks) ? $configuredTasks : [];
33-
$taskConfigResolver = $this->buildTaskConfigResolver($availableTasks);
30+
$taskResolverConfig = [];
3431

3532
// Configure tasks
3633
foreach ($configuredTasks as $taskName => $config) {
@@ -46,30 +43,25 @@ public function process(ContainerBuilder $container): void
4643
['id' => $taskId, 'class' => $taskClass, 'info' => $taskInfo] = $currentTaskService;
4744
$configuredTaskKey = $taskId.'.'.$taskName.'.configured';
4845

49-
// Setup metadata:
50-
$metadata = new Metadata(array_merge(
51-
['priority' => $taskInfo['priority']],
52-
$metadataConfig
53-
));
54-
55-
// Disabled tasks can be skipped
56-
// This allows to conditionally disable tasks through parameters or by an extension.
57-
if (!$metadata->isEnabled()) {
58-
continue;
59-
}
46+
// Store the configuration in the task resolver config:
47+
// This way, the resolver knows how to build all task related configurations.
48+
// It is stores in a pain array so that environment variables get resolved and can be used in the configuration.
49+
$taskResolverConfig[$taskName] = [
50+
'class' => $taskClass,
51+
'config' => [
52+
...$taskConfig,
53+
'metadata' => [
54+
'priority' => $taskInfo['priority'],
55+
...$taskConfig['metadata'] ?? [],
56+
],
57+
],
58+
];
6059

6160
// Configure task:
6261
$taskBuilder = new Definition($taskClass, [
6362
new Reference($taskId),
64-
new LazyTaskConfig(
65-
function () use ($taskName, $taskConfigResolver, $currentTaskName, $taskConfig, $metadata) {
66-
return new TaskConfig(
67-
$taskName,
68-
$taskConfigResolver->resolve($currentTaskName, $taskConfig),
69-
$metadata
70-
);
71-
}
72-
)
63+
new Reference(TaskConfigResolver::class),
64+
$taskName,
7365
]);
7466
$taskBuilder->setFactory([new Reference(TaskConfigurator::class), '__invoke']);
7567
$taskBuilder->addTag('configured.task');
@@ -80,7 +72,10 @@ function () use ($taskName, $taskConfigResolver, $currentTaskName, $taskConfig,
8072
}
8173

8274
// Register available and configured tasks for easy data usage in the application:
83-
$container->set(TaskConfigResolver::class, $taskConfigResolver);
75+
$container->setDefinition(TaskConfigResolver::class, new Definition(
76+
TaskConfigResolver::class,
77+
[$taskResolverConfig]
78+
));
8479
$container->setParameter('grumphp.tasks.configured', array_keys($configuredTasks));
8580
}
8681

@@ -127,16 +122,4 @@ private function fetchAvailableTasksInfo(ContainerBuilder $container): array
127122

128123
return $map;
129124
}
130-
131-
private function buildTaskConfigResolver(array $availableTasks): TaskConfigResolver
132-
{
133-
return new TaskConfigResolver(
134-
array_map(
135-
function ($availableTask): string {
136-
return (string) ($availableTask['class'] ?? '');
137-
},
138-
$availableTasks
139-
)
140-
);
141-
}
142125
}

src/Configuration/Configurator/TaskConfigurator.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44

55
namespace GrumPHP\Configuration\Configurator;
66

7-
use GrumPHP\Task\Config\TaskConfigInterface;
7+
use GrumPHP\Configuration\Resolver\TaskConfigResolver;
88
use GrumPHP\Task\TaskInterface;
99

1010
class TaskConfigurator
1111
{
12-
public function __invoke(TaskInterface $task, TaskConfigInterface $config): TaskInterface
13-
{
14-
return $task->withConfig($config);
12+
public function __invoke(
13+
TaskInterface $task,
14+
TaskConfigResolver $configResolver,
15+
string $taskName
16+
): TaskInterface {
17+
return $task->withConfig(
18+
$configResolver->resolve($taskName)
19+
);
1520
}
1621
}

src/Configuration/Resolver/TaskConfigResolver.php

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,20 @@
66

77
use GrumPHP\Exception\TaskConfigResolverException;
88
use GrumPHP\Task\Config\ConfigOptionsResolver;
9+
use GrumPHP\Task\Config\Metadata;
10+
use GrumPHP\Task\Config\TaskConfig;
911
use GrumPHP\Task\TaskInterface;
1012

11-
class TaskConfigResolver
13+
/**
14+
* @psalm-type TaskConfiguration = array{
15+
* class: string,
16+
* config: array
17+
* }
18+
*/
19+
final class TaskConfigResolver
1220
{
1321
/**
14-
* @var array<string, string>
22+
* @var array<string, TaskConfiguration>
1523
*/
1624
private $taskMap;
1725

@@ -28,14 +36,21 @@ public function listAvailableTaskNames(): array
2836
return array_keys($this->taskMap);
2937
}
3038

31-
public function resolve(string $taskName, array $config): array
39+
public function resolve(string $taskName): TaskConfig
3240
{
3341
$resolver = $this->fetchByName($taskName);
3442

35-
// Make sure metadata is never a part of the task configuration
43+
$config = $this->taskMap[$taskName]['config'] ?? [];
44+
$metadata = new Metadata($config['metadata'] ?? []);
45+
3646
unset($config['metadata']);
47+
$resolvedConfig = $resolver->resolve($config);
3748

38-
return $resolver->resolve($config);
49+
return new TaskConfig(
50+
$taskName,
51+
$resolvedConfig,
52+
$metadata
53+
);
3954
}
4055

4156
public function fetchByName(string $taskName): ConfigOptionsResolver
@@ -44,7 +59,7 @@ public function fetchByName(string $taskName): ConfigOptionsResolver
4459
throw TaskConfigResolverException::unknownTask($taskName);
4560
}
4661

47-
$class = $this->taskMap[$taskName];
62+
$class = $this->taskMap[$taskName]['class'];
4863
if (!class_exists($class) || !is_subclass_of($class, TaskInterface::class)) {
4964
throw TaskConfigResolverException::unknownClass($class);
5065
}

src/Runner/TaskRunner.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public function __construct(TasksCollection $tasks, MiddlewareStack $middleware)
2828
public function run(TaskRunnerContext $runnerContext): TaskResultCollection
2929
{
3030
return $this->middleware->handle(
31-
$runnerContext->withTasks($this->tasks)
31+
$runnerContext->withTasks($this->tasks->filterEnabled())
3232
);
3333
}
3434
}

src/Task/Config/LazyTaskConfig.php

Lines changed: 0 additions & 50 deletions
This file was deleted.

0 commit comments

Comments
 (0)