From 68a9ebda1c5ed77432865cea0c1961133e88ccea Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 4 Jan 2026 20:42:14 +0100 Subject: [PATCH] rename leftover of mask to pattern --- README.md | 4 +- src/DefinitionPatternsExtractor.php | 46 +++++++++---------- .../PatternCollectionStatsPrinter.php | 18 ++++---- src/Resolver/ClassMethodPatternResolver.php | 12 ++--- ...uplicatedContextDefinitionContentsRule.php | 8 ++-- ...MaskRule.php => DuplicatedPatternRule.php} | 14 +++--- src/Rule/UnusedContextDefinitionsRule.php | 14 +++--- src/ValueObject/ContextDefinition.php | 8 ++-- src/ValueObject/PatternCollection.php | 20 ++++---- .../Fixture/UnusedPattern/BehatContext.php | 2 +- .../UnusedDefinitionsAnalyzerTest.php | 14 +++--- .../DefinitionPatternExtractorTest.php | 18 ++++---- 12 files changed, 89 insertions(+), 89 deletions(-) rename src/Rule/{DuplicatedMaskRule.php => DuplicatedPatternRule.php} (79%) diff --git a/README.md b/README.md index a2d71f349..2e82e3da1 100644 --- a/README.md +++ b/README.md @@ -57,9 +57,9 @@ Better use a one definition with single pattern, to make your tests more precise
-### 2. Find duplicated masks (`duplicated-masks`) +### 2. Find duplicated patterns (`duplicated-patterns`) -Same as services, there should be unique definition masks: +Same as services, there should be unique definition patterns: ```php use Behat\Step\When; diff --git a/src/DefinitionPatternsExtractor.php b/src/DefinitionPatternsExtractor.php index e6ed4a3cf..d373b4daa 100644 --- a/src/DefinitionPatternsExtractor.php +++ b/src/DefinitionPatternsExtractor.php @@ -35,17 +35,17 @@ public function __construct( */ public function extract(array $contextFiles): PatternCollection { - $masks = []; + $patterns = []; - $classMethodContextDefinitions = $this->resolveMasksFromFiles($contextFiles); + $classMethodContextDefinitions = $this->resolvePatternsFromFiles($contextFiles); foreach ($classMethodContextDefinitions as $classMethodContextDefinition) { - $rawMask = $classMethodContextDefinition->getMask(); + $rawPattern = $classMethodContextDefinition->getPattern(); // @todo edge case - handle next - if (str_contains($rawMask, ' [:')) { - $masks[] = new SkippedPattern( - $rawMask, + if (str_contains($rawPattern, ' [:')) { + $patterns[] = new SkippedPattern( + $rawPattern, $classMethodContextDefinition->getFilePath(), $classMethodContextDefinition->getMethodLine(), $classMethodContextDefinition->getClass(), @@ -55,9 +55,9 @@ public function extract(array $contextFiles): PatternCollection } // regex pattern, handled else-where - if (PatternAnalyzer::isRegex($rawMask)) { - $masks[] = new RegexPattern( - $rawMask, + if (PatternAnalyzer::isRegex($rawPattern)) { + $patterns[] = new RegexPattern( + $rawPattern, $classMethodContextDefinition->getFilePath(), $classMethodContextDefinition->getMethodLine(), $classMethodContextDefinition->getClass(), @@ -66,11 +66,11 @@ public function extract(array $contextFiles): PatternCollection continue; } - // handled in mask one - if (PatternAnalyzer::isValuePattern($rawMask)) { - // if (str_contains($rawMask, ':')) { - $masks[] = new NamedPattern( - $rawMask, + // handled in pattern one + if (PatternAnalyzer::isValuePattern($rawPattern)) { + // if (str_contains($rawPattern, ':')) { + $patterns[] = new NamedPattern( + $rawPattern, $classMethodContextDefinition->getFilePath(), $classMethodContextDefinition->getMethodLine(), $classMethodContextDefinition->getClass(), @@ -79,11 +79,11 @@ public function extract(array $contextFiles): PatternCollection continue; } - // remove \/ escape from mask - $rawMask = str_replace('\/', '/', $rawMask); + // remove \/ escape from pattern + $rawPattern = str_replace('\/', '/', $rawPattern); - $masks[] = new ExactPattern( - $rawMask, + $patterns[] = new ExactPattern( + $rawPattern, $classMethodContextDefinition->getFilePath(), $classMethodContextDefinition->getMethodLine(), $classMethodContextDefinition->getClass(), @@ -91,14 +91,14 @@ public function extract(array $contextFiles): PatternCollection ); } - return new PatternCollection($masks); + return new PatternCollection($patterns); } /** * @param SplFileInfo[] $fileInfos * @return ContextDefinition[] */ - private function resolveMasksFromFiles(array $fileInfos): array + private function resolvePatternsFromFiles(array $fileInfos): array { $classMethodContextDefinitions = []; @@ -123,14 +123,14 @@ private function resolveMasksFromFiles(array $fileInfos): array $className = $class->namespacedName->toString(); foreach ($class->getMethods() as $classMethod) { - $rawMasks = $this->classMethodPatternResolver->resolve($classMethod); + $rawPatterns = $this->classMethodPatternResolver->resolve($classMethod); - foreach ($rawMasks as $rawMask) { + foreach ($rawPatterns as $rawPattern) { $classMethodContextDefinitions[] = new ContextDefinition( $fileInfo->getRealPath(), $className, $classMethod->name->toString(), - $rawMask, + $rawPattern, $classMethod->getStartLine() ); } diff --git a/src/Reporting/PatternCollectionStatsPrinter.php b/src/Reporting/PatternCollectionStatsPrinter.php index d782bdae7..be46d2f20 100644 --- a/src/Reporting/PatternCollectionStatsPrinter.php +++ b/src/Reporting/PatternCollectionStatsPrinter.php @@ -25,27 +25,27 @@ public function print(PatternCollection $patternCollection): void $this->outputPrinter->writeln(sprintf(' * %d /regex/', $patternCollection->countByType(RegexPattern::class))); $this->outputPrinter->writeln(sprintf(' * %d :named', $patternCollection->countByType(NamedPattern::class))); - $this->printSkippedMasks($patternCollection); + $this->printSkippedPatterns($patternCollection); } - private function printSkippedMasks(PatternCollection $patternCollection): void + private function printSkippedPatterns(PatternCollection $patternCollection): void { - $skippedMasks = $patternCollection->byType(SkippedPattern::class); - if ($skippedMasks === []) { + $skippedPatterns = $patternCollection->byType(SkippedPattern::class); + if ($skippedPatterns === []) { return; } - $skippedMasksValues = []; - foreach ($skippedMasks as $skippedMask) { - $skippedMasksValues[] = $skippedMask->pattern; + $skippedPatternsValues = []; + foreach ($skippedPatterns as $skippedPattern) { + $skippedPatternsValues[] = $skippedPattern->pattern; } - $skippedMasksString = implode('", "', $skippedMasksValues); + $skippedPatternsString = implode('", "', $skippedPatternsValues); $this->outputPrinter->writeln(sprintf( ' * %d skipped ("%s")', $patternCollection->countByType(SkippedPattern::class), - $skippedMasksString + $skippedPatternsString )); } } diff --git a/src/Resolver/ClassMethodPatternResolver.php b/src/Resolver/ClassMethodPatternResolver.php index d1fa2c104..53a34ceb8 100644 --- a/src/Resolver/ClassMethodPatternResolver.php +++ b/src/Resolver/ClassMethodPatternResolver.php @@ -27,7 +27,7 @@ public function resolve(ClassMethod $classMethod): array preg_match_all(self::INSTRUCTION_DOCBLOCK_REGEX, $classMethod->getDocComment()->getText(), $match); foreach ($match['instruction'] as $instruction) { - $rawPatterns[] = $this->clearMask($instruction); + $rawPatterns[] = $this->clearPattern($instruction); } } @@ -53,12 +53,12 @@ public function resolve(ClassMethod $classMethod): array return $rawPatterns; } - private function clearMask(string $mask): string + private function clearPattern(string $pattern): string { - $mask = trim($mask); + $pattern = trim($pattern); - // clear extra quote escaping that would cause miss-match with feature masks - $mask = str_replace('\\\'', "'", $mask); - return str_replace('\\/', '/', $mask); + // clear extra quote escaping that would cause miss-match with feature patterns + $pattern = str_replace('\\\'', "'", $pattern); + return str_replace('\\/', '/', $pattern); } } diff --git a/src/Rule/DuplicatedContextDefinitionContentsRule.php b/src/Rule/DuplicatedContextDefinitionContentsRule.php index 2d22fcf3f..1f8a3cc6f 100644 --- a/src/Rule/DuplicatedContextDefinitionContentsRule.php +++ b/src/Rule/DuplicatedContextDefinitionContentsRule.php @@ -40,10 +40,10 @@ public function process( $duplicatedContextDefinitionByContentsHash = $this->filterOutNotDuplicated($contextDefinitionByContentHash); foreach ($duplicatedContextDefinitionByContentsHash as $duplicatedContextDefinition) { - $maskStrings = ''; + $patternStrings = ''; $lineFilePaths = []; foreach ($duplicatedContextDefinition as $contextDefinition) { - $maskStrings .= ' * ' . $contextDefinition->getMask() . "\n"; + $patternStrings .= ' * ' . $contextDefinition->getPattern() . "\n"; $lineFilePaths[] = $contextDefinition->getFilePath() . ':' . $contextDefinition->getMethodLine(); } @@ -51,10 +51,10 @@ public function process( sort($lineFilePaths); $errorMessage = sprintf( - 'These %d definitions have different masks, but same method body: %s%s', + 'These %d definitions have different patterns, but same method body: %s%s', count($duplicatedContextDefinition), PHP_EOL, - $maskStrings + $patternStrings ); $ruleErrors[] = new RuleError($errorMessage, $lineFilePaths, $this->getIdentifier()); diff --git a/src/Rule/DuplicatedMaskRule.php b/src/Rule/DuplicatedPatternRule.php similarity index 79% rename from src/Rule/DuplicatedMaskRule.php rename to src/Rule/DuplicatedPatternRule.php index 4b93a18c2..0bfbb256b 100644 --- a/src/Rule/DuplicatedMaskRule.php +++ b/src/Rule/DuplicatedPatternRule.php @@ -12,7 +12,7 @@ use Rector\Behastan\ValueObject\RuleError; use Symfony\Component\Finder\SplFileInfo; -final readonly class DuplicatedMaskRule implements RuleInterface +final readonly class DuplicatedPatternRule implements RuleInterface { public function __construct( private ContextDefinitionsAnalyzer $classMethodContextDefinitionsAnalyzer @@ -30,17 +30,17 @@ public function process( PatternCollection $patternCollection, string $projectDirectory ): array { - // 1. find duplicated masks, e.g. if 2 methods have the same mask, its a race condition problem + // 1. find duplicated patterns, e.g. if 2 methods have the same pattern, its a race condition problem $classMethodContextDefinitions = $this->classMethodContextDefinitionsAnalyzer->resolve($contextFiles); - $groupedByMask = []; + $groupedByPattern = []; foreach ($classMethodContextDefinitions as $classMethodContextDefinition) { - $groupedByMask[$classMethodContextDefinition->getMask()][] = $classMethodContextDefinition; + $groupedByPattern[$classMethodContextDefinition->getPattern()][] = $classMethodContextDefinition; } $ruleErrors = []; - foreach ($groupedByMask as $mask => $sameMaksClassMethodContextDefinitions) { + foreach ($groupedByPattern as $pattern => $sameMaksClassMethodContextDefinitions) { /** @var ContextDefinition[] $sameMaksClassMethodContextDefinitions */ if (count($sameMaksClassMethodContextDefinitions) === 1) { continue; @@ -52,8 +52,8 @@ public function process( } $ruleErrors[] = new RuleError(sprintf( - 'Duplicated mask "%s"', - $mask + 'Duplicated pattern "%s"', + $pattern ), $lineFilePaths, $this->getIdentifier()); } diff --git a/src/Rule/UnusedContextDefinitionsRule.php b/src/Rule/UnusedContextDefinitionsRule.php index 1fec97c3b..092eb3968 100644 --- a/src/Rule/UnusedContextDefinitionsRule.php +++ b/src/Rule/UnusedContextDefinitionsRule.php @@ -29,21 +29,21 @@ public function process( PatternCollection $patternCollection, string $projectDirectory ): array { - $unusedMasks = $this->unusedDefinitionsAnalyzer->analyse($contextFiles, $featureFiles, $patternCollection); + $unusedPatterns = $this->unusedDefinitionsAnalyzer->analyse($contextFiles, $featureFiles, $patternCollection); $ruleErrors = []; - foreach ($unusedMasks as $unusedMask) { + foreach ($unusedPatterns as $unusedPattern) { $errorMessage = sprintf( - 'The mask "%s" and its definition %s::%s() is never used', - $unusedMask->pattern, - $unusedMask->className, - $unusedMask->methodName + 'The pattern "%s" and its definition %s::%s() is never used', + $unusedPattern->pattern, + $unusedPattern->className, + $unusedPattern->methodName ); $ruleErrors[] = new RuleError( $errorMessage, - [$unusedMask->filePath . ':' . $unusedMask->line], + [$unusedPattern->filePath . ':' . $unusedPattern->line], $this->getIdentifier() ); } diff --git a/src/ValueObject/ContextDefinition.php b/src/ValueObject/ContextDefinition.php index 0cf61366f..c257665cf 100644 --- a/src/ValueObject/ContextDefinition.php +++ b/src/ValueObject/ContextDefinition.php @@ -12,7 +12,7 @@ public function __construct( private readonly string $filePath, private readonly string $class, private readonly string $methodName, - private readonly string $mask, + private readonly string $pattern, private readonly int $methodLine ) { } @@ -32,9 +32,9 @@ public function getMethodName(): string return $this->methodName; } - public function getMask(): string + public function getPattern(): string { - return $this->mask; + return $this->pattern; } public function getMethodLine(): int @@ -49,7 +49,7 @@ public function recordUsage(array $featureInstructions): void { $usageCount = 0; foreach ($featureInstructions as $featureInstruction) { - if ($this->mask === $featureInstruction) { + if ($this->pattern === $featureInstruction) { ++$usageCount; } } diff --git a/src/ValueObject/PatternCollection.php b/src/ValueObject/PatternCollection.php index a5434a4ee..a93f73c27 100644 --- a/src/ValueObject/PatternCollection.php +++ b/src/ValueObject/PatternCollection.php @@ -9,10 +9,10 @@ final readonly class PatternCollection { /** - * @param AbstractPattern[] $masks + * @param AbstractPattern[] $patterns */ public function __construct( - private array $masks + private array $patterns ) { } @@ -21,13 +21,13 @@ public function __construct( */ public function countByType(string $type): int { - $masksByType = $this->byType($type); - return count($masksByType); + $patternsByType = $this->byType($type); + return count($patternsByType); } public function count(): int { - return count($this->masks); + return count($this->patterns); } /** @@ -35,17 +35,17 @@ public function count(): int */ public function all(): array { - return $this->masks; + return $this->patterns; } /** - * @template TMask as AbstractPattern + * @template TPattern as AbstractPattern * - * @param class-string $type - * @return TMask[] + * @param class-string $type + * @return TPattern[] */ public function byType(string $type): array { - return array_filter($this->masks, fn (AbstractPattern $pattern): bool => $pattern instanceof $type); + return array_filter($this->patterns, fn (AbstractPattern $pattern): bool => $pattern instanceof $type); } } diff --git a/tests/Analyzer/UnusedDefinitionsAnalyzer/Fixture/UnusedPattern/BehatContext.php b/tests/Analyzer/UnusedDefinitionsAnalyzer/Fixture/UnusedPattern/BehatContext.php index cd7151a6e..b6085c901 100644 --- a/tests/Analyzer/UnusedDefinitionsAnalyzer/Fixture/UnusedPattern/BehatContext.php +++ b/tests/Analyzer/UnusedDefinitionsAnalyzer/Fixture/UnusedPattern/BehatContext.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Rector\Behastan\Tests\Analyzer\UnusedDefinitionsAnalyzer\Fixture\UnusedMasks; +namespace Rector\Behastan\Tests\Analyzer\UnusedDefinitionsAnalyzer\Fixture\UnusedPattern; final class BehatContext { diff --git a/tests/Analyzer/UnusedDefinitionsAnalyzer/UnusedDefinitionsAnalyzerTest.php b/tests/Analyzer/UnusedDefinitionsAnalyzer/UnusedDefinitionsAnalyzerTest.php index e13abdc8c..dea0f280a 100644 --- a/tests/Analyzer/UnusedDefinitionsAnalyzer/UnusedDefinitionsAnalyzerTest.php +++ b/tests/Analyzer/UnusedDefinitionsAnalyzer/UnusedDefinitionsAnalyzerTest.php @@ -53,14 +53,14 @@ public function testFoundPattern(): void $patternCollection = $this->definitionPatternsExtractor->extract($contextFiles); - $unusedMasks = $this->unusedDefinitionsAnalyzer->analyse($contextFiles, $featureFiles, $patternCollection); + $unusedPatterns = $this->unusedDefinitionsAnalyzer->analyse($contextFiles, $featureFiles, $patternCollection); - $this->assertCount(1, $unusedMasks); - $this->assertContainsOnlyInstancesOf(AbstractPattern::class, $unusedMasks); + $this->assertCount(1, $unusedPatterns); + $this->assertContainsOnlyInstancesOf(AbstractPattern::class, $unusedPatterns); - /** @var AbstractPattern $unusedMask */ - $unusedMask = $unusedMasks[0]; - $this->assertSame(__DIR__ . '/Fixture/UnusedPattern/BehatContext.php', $unusedMask->filePath); - $this->assertSame('never used', $unusedMask->pattern); + /** @var AbstractPattern $unusedPattern */ + $unusedPattern = $unusedPatterns[0]; + $this->assertSame(__DIR__ . '/Fixture/UnusedPattern/BehatContext.php', $unusedPattern->filePath); + $this->assertSame('never used', $unusedPattern->pattern); } } diff --git a/tests/DefinitionPatternExtractor/DefinitionPatternExtractorTest.php b/tests/DefinitionPatternExtractor/DefinitionPatternExtractorTest.php index 9329192b0..8c33b8172 100644 --- a/tests/DefinitionPatternExtractor/DefinitionPatternExtractorTest.php +++ b/tests/DefinitionPatternExtractor/DefinitionPatternExtractorTest.php @@ -31,18 +31,18 @@ public function test(): void $this->assertCount(3, $patternCollection->all()); - $exactMasks = $patternCollection->byType(ExactPattern::class); - $this->assertCount(3, $exactMasks); - $this->assertContainsOnlyInstancesOf(ExactPattern::class, $exactMasks); + $exactPatterns = $patternCollection->byType(ExactPattern::class); + $this->assertCount(3, $exactPatterns); + $this->assertContainsOnlyInstancesOf(ExactPattern::class, $exactPatterns); - $firstExactMask = $exactMasks[0]; + $firstExactPattern = $exactPatterns[0]; - $this->assertSame('I click homepage', $firstExactMask->pattern); - $this->assertSame(AnotherBehatContext::class, $firstExactMask->className); - $this->assertSame(__DIR__ . '/Fixture/AnotherBehatContext.php', $firstExactMask->filePath); + $this->assertSame('I click homepage', $firstExactPattern->pattern); + $this->assertSame(AnotherBehatContext::class, $firstExactPattern->className); + $this->assertSame(__DIR__ . '/Fixture/AnotherBehatContext.php', $firstExactPattern->filePath); - $slashMask = $exactMasks[2]; + $slashPattern = $exactPatterns[2]; - $this->assertSame('Do this and / that', $slashMask->pattern); + $this->assertSame('Do this and / that', $slashPattern->pattern); } }