Skip to content

Commit

Permalink
Merge pull request #24 from Aeliot-Tm/add_filters_to_yaml_lint_command
Browse files Browse the repository at this point in the history
Add filters to YAML lint command
  • Loading branch information
Aeliot-Tm authored May 12, 2021
2 parents faae4c8 + 0fbd915 commit ee74660
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 9 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
-----
Expand Down
21 changes: 20 additions & 1 deletion src/Command/LintYamlCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -27,21 +29,38 @@ 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);
}

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<LinterInterface>
*/
Expand Down
17 changes: 17 additions & 0 deletions src/Dto/LintYamlFilterDto.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

declare(strict_types=1);

namespace Aeliot\Bundle\TransMaintain\Dto;

final class LintYamlFilterDto
{
/**
* @var string[]|null
*/
public ?array $domains = null;
/**
* @var string[]|null
*/
public ?array $locales = null;
}
14 changes: 11 additions & 3 deletions src/Service/Yaml/Linter/FilesMissedLinter.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace Aeliot\Bundle\TransMaintain\Service\Yaml\Linter;

use Aeliot\Bundle\TransMaintain\Dto\LintYamlFilterDto;
use Aeliot\Bundle\TransMaintain\Model\FilesMissedLine;
use Aeliot\Bundle\TransMaintain\Model\ReportBag;
use Aeliot\Bundle\TransMaintain\Service\Yaml\FilesMapProvider;
Expand All @@ -28,13 +29,20 @@ public function getPresets(): array
return [LinterRegistry::PRESET_BASE];
}

public function lint(): ReportBag
public function lint(LintYamlFilterDto $filterDto): ReportBag
{
$bag = new ReportBag(FilesMissedLine::class);
$filesMap = $this->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));
}
}
Expand Down
11 changes: 10 additions & 1 deletion src/Service/Yaml/Linter/KeyPatternLinter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)) {
Expand Down
11 changes: 10 additions & 1 deletion src/Service/Yaml/Linter/KeysDuplicatedLinter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 = [];
Expand Down
14 changes: 12 additions & 2 deletions src/Service/Yaml/Linter/KeysMissedLinter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -31,25 +32,34 @@ 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);

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));
Expand Down
3 changes: 2 additions & 1 deletion src/Service/Yaml/Linter/LinterInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -12,5 +13,5 @@ public function getKey(): string;

public function getPresets(): array;

public function lint(): ReportBag;
public function lint(LintYamlFilterDto $filterDto): ReportBag;
}

0 comments on commit ee74660

Please sign in to comment.