Skip to content

Commit 6277d05

Browse files
authored
[FEATURE] Introduce ProcessorSkipper for conditional processor execution (#339)
* [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. - Introduced a new section on skipping entire processors. - Provided an example configuration for skipping specific processors.
1 parent 6aee9e1 commit 6277d05

6 files changed

Lines changed: 78 additions & 8 deletions

File tree

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,31 @@ return FractorConfiguration::configure()
117117
]);
118118
```
119119

120+
### Skipping FileProcessors
121+
122+
If skipping rules, files, or folders is not sufficient, you can also skip entire processors.
123+
124+
#### Example
125+
126+
```php
127+
use a9f\FractorFluid\FluidFileProcessor;
128+
use a9f\FractorHtaccess\HtaccessFileProcessor;
129+
use a9f\FractorTypoScript\TypoScriptFileProcessor;
130+
use a9f\FractorXml\XmlFileProcessor;
131+
use a9f\FractorYaml\YamlFileProcessor;
132+
133+
return FractorConfiguration::configure()
134+
->withSkip([
135+
'*/node_modules',
136+
'*/vendor/*',
137+
FluidFileProcessor::class,
138+
HtaccessFileProcessor::class,
139+
TypoScriptFileProcessor::class,
140+
XmlFileProcessor::class,
141+
YamlFileProcessor::class,
142+
]);
143+
```
144+
120145
### Configure code style
121146

122147
Fractor tries to format the code as good as possible.

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)