Skip to content

Commit c8949e5

Browse files
chrissonntagcs
authored andcommitted
[FEATURE] Introduce ProcessorSkipper for conditional processor execution
- ✨ Added ProcessorSkipper class to manage processor skipping logic. - 🔧 Integrated ProcessorSkipper into FractorRunner and AllowedFileExtensionsResolver to conditionally skip processors based on configuration. - 📜 Updated SkipConfiguration to support processor skipping configurations.
1 parent bcd09a2 commit c8949e5

File tree

5 files changed

+53
-8
lines changed

5 files changed

+53
-8
lines changed

packages/fractor/src/Application/FractorRunner.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public function __construct(
3737
private FileWriter $fileWriter,
3838
private FileDiffFactory $fileDiffFactory,
3939
private RuleSkipper $ruleSkipper,
40+
private ProcessorSkipper $processorSkipper,
4041
private ChangedFilesDetector $changedFilesDetector,
4142
private ConfigurationRuleFilter $configurationRuleFilter
4243
) {
@@ -70,6 +71,10 @@ public function run(Configuration $configuration): ProcessResult
7071
$this->symfonyStyle->progressAdvance();
7172
}
7273
foreach ($this->processors as $processor) {
74+
if ($this->processorSkipper->shouldSkip($processor::class)) {
75+
continue;
76+
}
77+
7378
if (! $processor->canHandle($file)) {
7479
continue;
7580
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\Fractor\Application;
6+
7+
use a9f\Fractor\Application\Contract\FileProcessor;
8+
use a9f\Fractor\Application\Contract\FractorRule;
9+
use a9f\Fractor\Configuration\ValueObject\SkipConfiguration;
10+
11+
final readonly class ProcessorSkipper
12+
{
13+
public function __construct(
14+
private SkipConfiguration $configuration
15+
) {
16+
}
17+
18+
/**
19+
* @param class-string<FileProcessor<FractorRule>> $processor
20+
*/
21+
public function shouldSkip(string $processor): bool
22+
{
23+
$configuredSkip = $this->configuration->getSkip();
24+
25+
// Check if the processor class is directly in the skip array
26+
return in_array($processor, $configuredSkip, true);
27+
}
28+
}

packages/fractor/src/Configuration/AllowedFileExtensionsResolver.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use a9f\Fractor\Application\Contract\FileProcessor;
88
use a9f\Fractor\Application\Contract\FractorRule;
9+
use a9f\Fractor\Application\ProcessorSkipper;
910
use Webmozart\Assert\Assert;
1011

1112
final readonly class AllowedFileExtensionsResolver
@@ -14,7 +15,8 @@
1415
* @param iterable<FileProcessor<FractorRule>> $processors
1516
*/
1617
public function __construct(
17-
private iterable $processors
18+
private iterable $processors,
19+
private ProcessorSkipper $processorSkipper
1820
) {
1921
Assert::allIsInstanceOf($this->processors, FileProcessor::class);
2022
}
@@ -26,6 +28,10 @@ public function resolve(): array
2628
{
2729
$fileExtensions = [];
2830
foreach ($this->processors as $processor) {
31+
if ($this->processorSkipper->shouldSkip($processor::class)) {
32+
continue;
33+
}
34+
2935
$fileExtensions = array_merge($processor->allowedFileExtensions(), $fileExtensions);
3036
}
3137

packages/fractor/src/Configuration/FractorConfigurationBuilder.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
* An instance of the builder can be obtained via {@see FractorConfiguration::configure()} or from an instance
2424
* of {@see ContainerBuilder} passed to the callable returned by fractor.php.
2525
*
26-
* @phpstan-import-type TSkipForRules from SkipConfiguration
27-
* @phpstan-import-type TGlobalSkip from SkipConfiguration
26+
* @phpstan-import-type TSkipConfiguration from SkipConfiguration
2827
*/
2928
final class FractorConfigurationBuilder
3029
{
@@ -39,7 +38,7 @@ final class FractorConfigurationBuilder
3938
private array $paths = [];
4039

4140
/**
42-
* @var TSkipForRules|TGlobalSkip
41+
* @var TSkipConfiguration
4342
*/
4443
private array $skip = [];
4544

@@ -163,7 +162,7 @@ public function withPaths(array $paths): self
163162
}
164163

165164
/**
166-
* @param TSkipForRules|TGlobalSkip $skip
165+
* @param TSkipConfiguration $skip
167166
*/
168167
public function withSkip(array $skip): self
169168
{

packages/fractor/src/Configuration/ValueObject/SkipConfiguration.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,33 @@
44

55
namespace a9f\Fractor\Configuration\ValueObject;
66

7+
use a9f\Fractor\Application\Contract\FileProcessor;
78
use a9f\Fractor\Application\Contract\FractorRule;
89

910
/**
10-
* The configuration which paths to skip, optionally narrowed to single rules.
11+
* The configuration which paths to skip, optionally narrowed to single rules or processors.
1112
*
1213
* @phpstan-type TSkipForRules array<class-string<FractorRule>, string|list<string>>
14+
* @phpstan-type TSkipForProcessors array<class-string<FileProcessor<FractorRule>>, string|list<string>>
1315
* @phpstan-type TGlobalSkip array<int, string>
16+
* @phpstan-type TProcessorSkip array<int, class-string<FileProcessor<FractorRule>>>
17+
* @phpstan-type TSkipConfiguration TSkipForRules|TSkipForProcessors|TGlobalSkip|TProcessorSkip
1418
*/
1519
final readonly class SkipConfiguration
1620
{
1721
/**
18-
* @param TSkipForRules|TGlobalSkip $skip
22+
* @param TSkipConfiguration $skip
1923
*/
2024
public function __construct(
25+
/**
26+
* @phpstan-var TSkipConfiguration
27+
*/
2128
private array $skip
2229
) {
2330
}
2431

2532
/**
26-
* @return TSkipForRules|TGlobalSkip
33+
* @return TSkipConfiguration
2734
*/
2835
public function getSkip(): array
2936
{

0 commit comments

Comments
 (0)