From b66bd6b4220ab305d3f046ce2737036038fa139a Mon Sep 17 00:00:00 2001 From: Simon Schaufelberger Date: Wed, 24 Jun 2026 02:48:45 +0200 Subject: [PATCH] [FEATURE] Add --no-diffs CLI option --- .../fractor/src/Application/FractorRunner.php | 9 ++-- .../Output/ConsoleOutputFormatter.php | 6 ++- .../Output/JsonOutputFormatter.php | 12 +++-- .../Configuration/ConfigurationFactory.php | 13 +++++ .../FractorConfigurationBuilder.php | 12 +++++ packages/fractor/src/Configuration/Option.php | 5 ++ .../ValueObject/Configuration.php | 48 +++++++++++-------- .../src/Console/Command/ProcessCommand.php | 6 +++ .../ValueObjectFactory/FileDiffFactory.php | 10 ++-- .../fractor/src/ValueObject/ProcessResult.php | 13 ++++- 10 files changed, 98 insertions(+), 36 deletions(-) diff --git a/packages/fractor/src/Application/FractorRunner.php b/packages/fractor/src/Application/FractorRunner.php index 087b70a5..5c73e01e 100644 --- a/packages/fractor/src/Application/FractorRunner.php +++ b/packages/fractor/src/Application/FractorRunner.php @@ -50,7 +50,7 @@ public function run(Configuration $configuration): ProcessResult // no files found if ($filePaths === []) { - return new ProcessResult([]); + return new ProcessResult([], 0); } $shouldShowProgressBar = $configuration->shouldShowProgressBar(); @@ -63,6 +63,7 @@ public function run(Configuration $configuration): ProcessResult /** @var FileDiff[] $fileDiffs */ $fileDiffs = []; + $totalChanged = 0; foreach ($filePaths as $filePath) { $file = new File($filePath, FileSystem::read($filePath)); $this->fileCollector->addFile($file); @@ -89,7 +90,9 @@ public function run(Configuration $configuration): ProcessResult continue; } - $file->setFileDiff($this->fileDiffFactory->createFileDiff($file)); + ++$totalChanged; + + $file->setFileDiff($this->fileDiffFactory->createFileDiff($configuration->shouldShowDiffs(), $file)); $fileProcessResult = new FileProcessResult($file->getFileDiff()); $currentFileDiff = $fileProcessResult->getFileDiff(); @@ -110,7 +113,7 @@ public function run(Configuration $configuration): ProcessResult $this->fileWriter->write($file); } - return new ProcessResult($fileDiffs); + return new ProcessResult($fileDiffs, $totalChanged); } /** diff --git a/packages/fractor/src/ChangesReporting/Output/ConsoleOutputFormatter.php b/packages/fractor/src/ChangesReporting/Output/ConsoleOutputFormatter.php index 396963a0..97e96d18 100644 --- a/packages/fractor/src/ChangesReporting/Output/ConsoleOutputFormatter.php +++ b/packages/fractor/src/ChangesReporting/Output/ConsoleOutputFormatter.php @@ -29,7 +29,9 @@ public function getName(): string public function report(ProcessResult $processResult, Configuration $configuration): void { - $this->reportFileDiffs($processResult->getFileDiffs(), false, $configuration->shouldShowChangelog()); + if ($configuration->shouldShowDiffs()) { + $this->reportFileDiffs($processResult->getFileDiffs(), false, $configuration->shouldShowChangelog()); + } // to keep space between progress bar and success message if ($configuration->shouldShowProgressBar() && $processResult->getFileDiffs() === []) { @@ -78,7 +80,7 @@ private function reportFileDiffs(array $fileDiffs, bool $absoluteFilePath, bool private function createSuccessMessage(ProcessResult $processResult, Configuration $configuration): string { - $changeCount = \count($processResult->getFileDiffs()); + $changeCount = $processResult->getTotalChanged(); if ($changeCount === 0) { return 'Fractor is done!'; } diff --git a/packages/fractor/src/ChangesReporting/Output/JsonOutputFormatter.php b/packages/fractor/src/ChangesReporting/Output/JsonOutputFormatter.php index d6885824..1cdef803 100644 --- a/packages/fractor/src/ChangesReporting/Output/JsonOutputFormatter.php +++ b/packages/fractor/src/ChangesReporting/Output/JsonOutputFormatter.php @@ -34,11 +34,13 @@ public function report(ProcessResult $processResult, Configuration $configuratio foreach ($fileDiffs as $fileDiff) { $filePath = $fileDiff->getRelativeFilePath(); - $errorsJson['file_diffs'][] = [ - 'file' => $filePath, - 'diff' => $fileDiff->getDiff(), - 'applied_rules' => $configuration->shouldShowChangelog() ? $fileDiff->getChangelogsLines() : $fileDiff->getFractorClasses(), - ]; + if ($configuration->shouldShowDiffs() && $fileDiff->getDiff() !== '') { + $errorsJson['file_diffs'][] = [ + 'file' => $filePath, + 'diff' => $fileDiff->getDiff(), + 'applied_rules' => $configuration->shouldShowChangelog() ? $fileDiff->getChangelogsLines() : $fileDiff->getFractorClasses(), + ]; + } // for CI $errorsJson['changed_files'][] = $filePath; diff --git a/packages/fractor/src/Configuration/ConfigurationFactory.php b/packages/fractor/src/Configuration/ConfigurationFactory.php index 6831f0eb..56c962ad 100644 --- a/packages/fractor/src/Configuration/ConfigurationFactory.php +++ b/packages/fractor/src/Configuration/ConfigurationFactory.php @@ -28,6 +28,7 @@ public function createFromInput(InputInterface $input): Configuration $outputFormat = (string) $input->getOption(Option::OUTPUT_FORMAT); $showProgressBar = $this->shouldShowProgressBar($input, $outputFormat); + $showDiffs = $this->shouldShowDiffs($input); $showChangelog = $this->shouldShowChangelog($input); /** @var list $paths */ @@ -48,6 +49,7 @@ public function createFromInput(InputInterface $input): Configuration $outputFormat, $fileExtensions, $paths, + $showDiffs, (array) $this->parameterBag->get(Option::SKIP), $onlyRule, $showChangelog @@ -81,6 +83,17 @@ private function shouldShowProgressBar(InputInterface $input, string $outputForm return $outputFormat === ConsoleOutputFormatter::NAME; } + private function shouldShowDiffs(InputInterface $input): bool + { + $noDiffs = (bool) $input->getOption(Option::NO_DIFFS); + if ($noDiffs) { + return false; + } + + // fallback to parameter + return ! SimpleParameterProvider::provideBoolParameter(Option::NO_DIFFS, false); + } + private function shouldShowChangelog(InputInterface $input): bool { return (bool) $input->getOption(Option::SHOW_CHANGELOG); diff --git a/packages/fractor/src/Configuration/FractorConfigurationBuilder.php b/packages/fractor/src/Configuration/FractorConfigurationBuilder.php index ace72bf5..f8698f7f 100644 --- a/packages/fractor/src/Configuration/FractorConfigurationBuilder.php +++ b/packages/fractor/src/Configuration/FractorConfigurationBuilder.php @@ -71,6 +71,8 @@ final class FractorConfigurationBuilder private ?string $containerCacheDirectory = null; + private bool $noDiffs = false; + public function __invoke(ContainerConfigurator $containerConfigurator): void { foreach ($this->imports as $import) { @@ -104,6 +106,9 @@ public function __invoke(ContainerConfigurator $containerConfigurator): void $parameters->set(Option::CONTAINER_CACHE_DIRECTORY, $this->containerCacheDirectory); SimpleParameterProvider::setParameter(Option::CONTAINER_CACHE_DIRECTORY, $this->containerCacheDirectory); + $parameters->set(Option::NO_DIFFS, $this->noDiffs); + SimpleParameterProvider::setParameter(Option::NO_DIFFS, $this->noDiffs); + foreach ($this->options as $optionName => $optionValue) { $parameters->set($optionName, $optionValue); } @@ -209,6 +214,13 @@ public function import(string $import): self return $this; } + public function withNoDiffs(): self + { + $this->noDiffs = true; + + return $this; + } + /** * @param array $options */ diff --git a/packages/fractor/src/Configuration/Option.php b/packages/fractor/src/Configuration/Option.php index 8bf8ebe8..a8adf9e5 100644 --- a/packages/fractor/src/Configuration/Option.php +++ b/packages/fractor/src/Configuration/Option.php @@ -89,4 +89,9 @@ final class Option * @internal to allow process file without extension if explicitly registered */ public const FILES_WITHOUT_EXTENSION = 'files_without_extension'; + + /** + * @var string + */ + public const NO_DIFFS = 'no-diffs'; } diff --git a/packages/fractor/src/Configuration/ValueObject/Configuration.php b/packages/fractor/src/Configuration/ValueObject/Configuration.php index 0e349fd6..8fcab5c3 100644 --- a/packages/fractor/src/Configuration/ValueObject/Configuration.php +++ b/packages/fractor/src/Configuration/ValueObject/Configuration.php @@ -24,6 +24,7 @@ public function __construct( private string $outputFormat = ConsoleOutputFormatter::NAME, private array $fileExtensions = [], private array $paths = [], + private bool $showDiffs = true, private array $skip = [], private ?string $onlyRule = null, private bool $showChangelog = false, @@ -31,20 +32,32 @@ public function __construct( Assert::allStringNotEmpty($this->paths, 'No directories given'); } - /** - * @return string[] - */ - public function getFileExtensions(): array + public function isDryRun(): bool { - return $this->fileExtensions; + return $this->dryRun; + } + + public function shouldShowProgressBar(): bool + { + return $this->showProgressBar; + } + + public function isQuiet(): bool + { + return $this->quiet; + } + + public function getOutputFormat(): string + { + return $this->outputFormat; } /** * @return string[] */ - public function getSkip(): array + public function getFileExtensions(): array { - return $this->skip; + return $this->fileExtensions; } /** @@ -55,19 +68,17 @@ public function getPaths(): array return $this->paths; } - public function isDryRun(): bool + public function shouldShowDiffs(): bool { - return $this->dryRun; + return $this->showDiffs; } - public function shouldShowProgressBar(): bool - { - return $this->showProgressBar; - } - - public function isQuiet(): bool + /** + * @return string[] + */ + public function getSkip(): array { - return $this->quiet; + return $this->skip; } public function getOnlyRule(): ?string @@ -75,11 +86,6 @@ public function getOnlyRule(): ?string return $this->onlyRule; } - public function getOutputFormat(): string - { - return $this->outputFormat; - } - public function shouldShowChangelog(): bool { return $this->showChangelog; diff --git a/packages/fractor/src/Console/Command/ProcessCommand.php b/packages/fractor/src/Console/Command/ProcessCommand.php index ee008f39..a12388b8 100644 --- a/packages/fractor/src/Console/Command/ProcessCommand.php +++ b/packages/fractor/src/Console/Command/ProcessCommand.php @@ -65,6 +65,12 @@ protected function configure(): void InputOption::VALUE_NONE, 'Hide progress bar. Useful e.g. for nicer CI output.' ); + $this->addOption( + Option::NO_DIFFS, + null, + InputOption::VALUE_NONE, + 'Hide diffs of changed files. Useful e.g. for nicer CI output.' + ); $this->addOption( Option::SHOW_CHANGELOG, null, diff --git a/packages/fractor/src/Differ/ValueObjectFactory/FileDiffFactory.php b/packages/fractor/src/Differ/ValueObjectFactory/FileDiffFactory.php index 4cfa8dac..0d8f10e7 100644 --- a/packages/fractor/src/Differ/ValueObjectFactory/FileDiffFactory.php +++ b/packages/fractor/src/Differ/ValueObjectFactory/FileDiffFactory.php @@ -21,16 +21,20 @@ public function __construct( ) { } - public function createFileDiff(File $file): FileDiff + public function createFileDiff(bool $shouldShowDiffs, File $file): FileDiff { $relativeFilePath = $this->filePathHelper->relativePath($file->getFilePath()); + + $diff = $shouldShowDiffs ? $this->defaultDiffer->diff($file->getDiff()) : ''; + $consoleDiff = $shouldShowDiffs ? $this->consoleDiffer->diff($file->getDiff()) : ''; + $fractorsChangelogsLines = $this->fractorsChangelogLinesResolver->createFractorChangelogLines( $file->getAppliedRules() ); return new FileDiff( $relativeFilePath, - $this->defaultDiffer->diff($file->getDiff()), - $this->consoleDiffer->diff($file->getDiff()), + $diff, + $consoleDiff, $file->getAppliedRules(), $fractorsChangelogsLines ); diff --git a/packages/fractor/src/ValueObject/ProcessResult.php b/packages/fractor/src/ValueObject/ProcessResult.php index e9c6bc9a..c40b3ae1 100644 --- a/packages/fractor/src/ValueObject/ProcessResult.php +++ b/packages/fractor/src/ValueObject/ProcessResult.php @@ -13,7 +13,8 @@ * @param FileDiff[] $fileDiffs */ public function __construct( - private array $fileDiffs + private array $fileDiffs, + private int $totalChanged, ) { Assert::allIsInstanceOf($this->fileDiffs, FileDiff::class); } @@ -21,8 +22,16 @@ public function __construct( /** * @return FileDiff[] */ - public function getFileDiffs(): array + public function getFileDiffs(bool $onlyWithChanges = true): array { + if ($onlyWithChanges) { + return array_filter($this->fileDiffs, static fn (FileDiff $fileDiff): bool => $fileDiff->getDiff() !== ''); + } return $this->fileDiffs; } + + public function getTotalChanged(): int + { + return $this->totalChanged; + } }