diff --git a/README.md b/README.md index 035224fe..77cbf3b4 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,31 @@ return FractorConfiguration::configure() ]); ``` +### Skipping FileProcessors + +If skipping rules, files, or folders is not sufficient, you can also skip entire processors. + +#### Example + +```php +use a9f\FractorFluid\FluidFileProcessor; +use a9f\FractorHtaccess\HtaccessFileProcessor; +use a9f\FractorTypoScript\TypoScriptFileProcessor; +use a9f\FractorXml\XmlFileProcessor; +use a9f\FractorYaml\YamlFileProcessor; + +return FractorConfiguration::configure() + ->withSkip([ + '*/node_modules', + '*/vendor/*', + FluidFileProcessor::class, + HtaccessFileProcessor::class, + TypoScriptFileProcessor::class, + XmlFileProcessor::class, + YamlFileProcessor::class, + ]); +``` + ### Configure code style Fractor tries to format the code as good as possible. diff --git a/packages/fractor/src/Application/FractorRunner.php b/packages/fractor/src/Application/FractorRunner.php index 3a9472b1..087b70a5 100644 --- a/packages/fractor/src/Application/FractorRunner.php +++ b/packages/fractor/src/Application/FractorRunner.php @@ -37,6 +37,7 @@ public function __construct( private FileWriter $fileWriter, private FileDiffFactory $fileDiffFactory, private RuleSkipper $ruleSkipper, + private ProcessorSkipper $processorSkipper, private ChangedFilesDetector $changedFilesDetector, private ConfigurationRuleFilter $configurationRuleFilter ) { @@ -70,6 +71,10 @@ public function run(Configuration $configuration): ProcessResult $this->symfonyStyle->progressAdvance(); } foreach ($this->processors as $processor) { + if ($this->processorSkipper->shouldSkip($processor::class)) { + continue; + } + if (! $processor->canHandle($file)) { continue; } diff --git a/packages/fractor/src/Application/ProcessorSkipper.php b/packages/fractor/src/Application/ProcessorSkipper.php new file mode 100644 index 00000000..551364d5 --- /dev/null +++ b/packages/fractor/src/Application/ProcessorSkipper.php @@ -0,0 +1,28 @@ +> $processor + */ + public function shouldSkip(string $processor): bool + { + $configuredSkip = $this->configuration->getSkip(); + + // Check if the processor class is directly in the skip array + return in_array($processor, $configuredSkip, true); + } +} diff --git a/packages/fractor/src/Configuration/AllowedFileExtensionsResolver.php b/packages/fractor/src/Configuration/AllowedFileExtensionsResolver.php index 8441e2df..0bb7edef 100644 --- a/packages/fractor/src/Configuration/AllowedFileExtensionsResolver.php +++ b/packages/fractor/src/Configuration/AllowedFileExtensionsResolver.php @@ -6,6 +6,7 @@ use a9f\Fractor\Application\Contract\FileProcessor; use a9f\Fractor\Application\Contract\FractorRule; +use a9f\Fractor\Application\ProcessorSkipper; use Webmozart\Assert\Assert; final readonly class AllowedFileExtensionsResolver @@ -14,7 +15,8 @@ * @param iterable> $processors */ public function __construct( - private iterable $processors + private iterable $processors, + private ProcessorSkipper $processorSkipper ) { Assert::allIsInstanceOf($this->processors, FileProcessor::class); } @@ -26,6 +28,10 @@ public function resolve(): array { $fileExtensions = []; foreach ($this->processors as $processor) { + if ($this->processorSkipper->shouldSkip($processor::class)) { + continue; + } + $fileExtensions = array_merge($processor->allowedFileExtensions(), $fileExtensions); } diff --git a/packages/fractor/src/Configuration/FractorConfigurationBuilder.php b/packages/fractor/src/Configuration/FractorConfigurationBuilder.php index 1bf0e50c..ace72bf5 100644 --- a/packages/fractor/src/Configuration/FractorConfigurationBuilder.php +++ b/packages/fractor/src/Configuration/FractorConfigurationBuilder.php @@ -23,8 +23,7 @@ * An instance of the builder can be obtained via {@see FractorConfiguration::configure()} or from an instance * of {@see ContainerBuilder} passed to the callable returned by fractor.php. * - * @phpstan-import-type TSkipForRules from SkipConfiguration - * @phpstan-import-type TGlobalSkip from SkipConfiguration + * @phpstan-import-type TSkipConfiguration from SkipConfiguration */ final class FractorConfigurationBuilder { @@ -39,7 +38,7 @@ final class FractorConfigurationBuilder private array $paths = []; /** - * @var TSkipForRules|TGlobalSkip + * @var TSkipConfiguration */ private array $skip = []; @@ -163,7 +162,7 @@ public function withPaths(array $paths): self } /** - * @param TSkipForRules|TGlobalSkip $skip + * @param TSkipConfiguration $skip */ public function withSkip(array $skip): self { diff --git a/packages/fractor/src/Configuration/ValueObject/SkipConfiguration.php b/packages/fractor/src/Configuration/ValueObject/SkipConfiguration.php index c06d5a69..e4858515 100644 --- a/packages/fractor/src/Configuration/ValueObject/SkipConfiguration.php +++ b/packages/fractor/src/Configuration/ValueObject/SkipConfiguration.php @@ -4,26 +4,33 @@ namespace a9f\Fractor\Configuration\ValueObject; +use a9f\Fractor\Application\Contract\FileProcessor; use a9f\Fractor\Application\Contract\FractorRule; /** - * The configuration which paths to skip, optionally narrowed to single rules. + * The configuration which paths to skip, optionally narrowed to single rules or processors. * * @phpstan-type TSkipForRules array, string|list> + * @phpstan-type TSkipForProcessors array>, string|list> * @phpstan-type TGlobalSkip array + * @phpstan-type TProcessorSkip array>> + * @phpstan-type TSkipConfiguration TSkipForRules|TSkipForProcessors|TGlobalSkip|TProcessorSkip */ final readonly class SkipConfiguration { /** - * @param TSkipForRules|TGlobalSkip $skip + * @param TSkipConfiguration $skip */ public function __construct( + /** + * @phpstan-var TSkipConfiguration + */ private array $skip ) { } /** - * @return TSkipForRules|TGlobalSkip + * @return TSkipConfiguration */ public function getSkip(): array {