diff --git a/CHANGELOG.md b/CHANGELOG.md index 69a8b3b..b6ba0d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ CHANGELOG * Added YAML key pattern checker. * Updated Linters presets mechanism. * Arguments for command `aeliot_trans_maintain:lint:yaml` became optional. Preset "base" used by default. +* Added filtering to command `aeliot_trans_maintain:lint:yaml` by options: + * "domain" - list of analyzed domains, + * "locale" - list of analyzed locales. 2.2.0 ----- diff --git a/src/Command/LintYamlCommand.php b/src/Command/LintYamlCommand.php index cfd43ba..fcae0bc 100644 --- a/src/Command/LintYamlCommand.php +++ b/src/Command/LintYamlCommand.php @@ -4,12 +4,14 @@ namespace Aeliot\Bundle\TransMaintain\Command; +use Aeliot\Bundle\TransMaintain\Dto\LintYamlFilterDto; use Aeliot\Bundle\TransMaintain\Report\Builder\ConsoleOutputTableBuilder; use Aeliot\Bundle\TransMaintain\Service\Yaml\Linter\LinterInterface; use Aeliot\Bundle\TransMaintain\Service\Yaml\LinterRegistry; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; final class LintYamlCommand extends Command @@ -27,14 +29,18 @@ protected function configure(): void { $this->setDescription('Command for the sorting of yaml files'); $this->addArgument('linter', InputArgument::IS_ARRAY, 'List of linters', [LinterRegistry::PRESET_BASE]); + $this->addOption('domain', 'd', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Filter domains'); + $this->addOption('locale', 'l', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Filter locales'); } protected function execute(InputInterface $input, OutputInterface $output): int { $hasProblems = false; + $filterDto = $this->createFilterDto($input); $reportBuilder = new ConsoleOutputTableBuilder($output); foreach ($this->getLinters($input) as $linter) { - $reportBag = $linter->lint(); + /** @var LinterInterface $linter */ + $reportBag = $linter->lint($filterDto); $hasProblems = $hasProblems || !$reportBag->isEmpty(); $reportBuilder->render($reportBag); } @@ -42,6 +48,19 @@ protected function execute(InputInterface $input, OutputInterface $output): int return (int) $hasProblems; } + private function createFilterDto(InputInterface $input): LintYamlFilterDto + { + $filterDto = new LintYamlFilterDto(); + if ($input->hasOption('domain')) { + $filterDto->domains = $input->getOption('domain'); + } + if ($input->hasOption('locale')) { + $filterDto->locales = $input->getOption('locale'); + } + + return $filterDto; + } + /** * @return \Generator */ diff --git a/src/Dto/LintYamlFilterDto.php b/src/Dto/LintYamlFilterDto.php new file mode 100644 index 0000000..5ae5028 --- /dev/null +++ b/src/Dto/LintYamlFilterDto.php @@ -0,0 +1,17 @@ +filesMapProvider->getFilesMap(); $mentionedLocales = $this->getMentionedLocales($filesMap); - foreach ($filesMap as $domain => $locales) { - if ($omitted = array_diff($mentionedLocales, array_keys($locales))) { + foreach ($filesMap as $domain => $localesFiles) { + if ($filterDto->domains && !\in_array($domain, $filterDto->domains, true)) { + continue; + } + $omitted = array_diff($mentionedLocales, array_keys($localesFiles)); + if ($filterDto->locales) { + $omitted = \array_intersect($omitted, $filterDto->locales); + } + if ($omitted) { $bag->addLine(new FilesMissedLine($domain, $omitted)); } } diff --git a/src/Service/Yaml/Linter/KeyPatternLinter.php b/src/Service/Yaml/Linter/KeyPatternLinter.php index 13bcf3f..64ca8a0 100644 --- a/src/Service/Yaml/Linter/KeyPatternLinter.php +++ b/src/Service/Yaml/Linter/KeyPatternLinter.php @@ -4,6 +4,7 @@ namespace Aeliot\Bundle\TransMaintain\Service\Yaml\Linter; +use Aeliot\Bundle\TransMaintain\Dto\LintYamlFilterDto; use Aeliot\Bundle\TransMaintain\Model\KeysPatternLine; use Aeliot\Bundle\TransMaintain\Model\ReportBag; use Aeliot\Bundle\TransMaintain\Service\Yaml\FilesMapProvider; @@ -32,11 +33,19 @@ public function getPresets(): array return []; } - public function lint(): ReportBag + public function lint(LintYamlFilterDto $filterDto): ReportBag { $bag = new ReportBag(KeysPatternLine::class); $domainsFiles = $this->filesMapProvider->getFilesMap(); foreach ($domainsFiles as $domain => $localesFiles) { + if ($filterDto->domains && !\in_array($domain, $filterDto->domains, true)) { + continue; + } + + if ($filterDto->locales) { + $localesFiles = array_intersect_key($localesFiles, array_flip($filterDto->locales)); + } + $keys = $this->getKeysSummary($this->keysParser->getParsedKeys($localesFiles)); foreach ($keys as $languageId => $locales) { if (!preg_match($this->keyPattern, $languageId)) { diff --git a/src/Service/Yaml/Linter/KeysDuplicatedLinter.php b/src/Service/Yaml/Linter/KeysDuplicatedLinter.php index ceb1e4c..3a48837 100644 --- a/src/Service/Yaml/Linter/KeysDuplicatedLinter.php +++ b/src/Service/Yaml/Linter/KeysDuplicatedLinter.php @@ -4,6 +4,7 @@ namespace Aeliot\Bundle\TransMaintain\Service\Yaml\Linter; +use Aeliot\Bundle\TransMaintain\Dto\LintYamlFilterDto; use Aeliot\Bundle\TransMaintain\Model\KeysDuplicatedLine; use Aeliot\Bundle\TransMaintain\Model\ReportBag; use Aeliot\Bundle\TransMaintain\Service\Yaml\FileManipulator; @@ -33,12 +34,20 @@ public function getPresets(): array return [LinterRegistry::PRESET_BASE]; } - public function lint(): ReportBag + public function lint(LintYamlFilterDto $filterDto): ReportBag { $bag = new ReportBag(KeysDuplicatedLine::class); $domainsFiles = $this->filesMapProvider->getFilesMap(); foreach ($domainsFiles as $domain => $localesFiles) { + if ($filterDto->domains && !\in_array($domain, $filterDto->domains, true)) { + continue; + } + + if ($filterDto->locales) { + $localesFiles = array_intersect_key($localesFiles, array_flip($filterDto->locales)); + } + foreach ($localesFiles as $locale => $files) { $values = []; $duplicatedKeys = []; diff --git a/src/Service/Yaml/Linter/KeysMissedLinter.php b/src/Service/Yaml/Linter/KeysMissedLinter.php index eb4a345..e7cc5a6 100644 --- a/src/Service/Yaml/Linter/KeysMissedLinter.php +++ b/src/Service/Yaml/Linter/KeysMissedLinter.php @@ -4,6 +4,7 @@ namespace Aeliot\Bundle\TransMaintain\Service\Yaml\Linter; +use Aeliot\Bundle\TransMaintain\Dto\LintYamlFilterDto; use Aeliot\Bundle\TransMaintain\Model\KeysMissedLine; use Aeliot\Bundle\TransMaintain\Model\ReportBag; use Aeliot\Bundle\TransMaintain\Service\Yaml\FilesMapProvider; @@ -31,14 +32,18 @@ public function getPresets(): array return [LinterRegistry::PRESET_BASE]; } - public function lint(): ReportBag + public function lint(LintYamlFilterDto $filterDto): ReportBag { $bag = new ReportBag(KeysMissedLine::class); $domainsFiles = $this->filesMapProvider->getFilesMap(); foreach ($domainsFiles as $domain => $localesFiles) { + if ($filterDto->domains && !\in_array($domain, $filterDto->domains, true)) { + continue; + } if (count($localesFiles) === 1) { continue; } + $parsedKeys = $this->keysParser->getParsedKeys($localesFiles); $omittedKeys = $this->keysParser->getOmittedKeys($parsedKeys); $allOmittedKeys = $this->keysParser->mergeKeys($omittedKeys); @@ -46,10 +51,15 @@ public function lint(): ReportBag foreach ($allOmittedKeys as $languageId) { $omittedLanguages = []; foreach ($omittedKeys as $locale => $keys) { - if (in_array($languageId, $keys, true)) { + if (\in_array($languageId, $keys, true)) { $omittedLanguages[] = $locale; } } + + if ($filterDto->locales) { + $omittedLanguages = array_intersect($omittedLanguages, $filterDto->locales); + } + if ($omittedLanguages) { sort($omittedLanguages); $bag->addLine(new KeysMissedLine($domain, $languageId, $omittedLanguages)); diff --git a/src/Service/Yaml/Linter/LinterInterface.php b/src/Service/Yaml/Linter/LinterInterface.php index 70b5424..8a59016 100644 --- a/src/Service/Yaml/Linter/LinterInterface.php +++ b/src/Service/Yaml/Linter/LinterInterface.php @@ -4,6 +4,7 @@ namespace Aeliot\Bundle\TransMaintain\Service\Yaml\Linter; +use Aeliot\Bundle\TransMaintain\Dto\LintYamlFilterDto; use Aeliot\Bundle\TransMaintain\Model\ReportBag; interface LinterInterface @@ -12,5 +13,5 @@ public function getKey(): string; public function getPresets(): array; - public function lint(): ReportBag; + public function lint(LintYamlFilterDto $filterDto): ReportBag; }