44
55namespace Rector \SwissKnife \Behastan \Command ;
66
7- use Nette \Utils \Strings ;
8- use Rector \SwissKnife \Behastan \DefinitionMasksResolver ;
7+ use Rector \SwissKnife \Behastan \Behastan ;
98use Rector \SwissKnife \Behastan \Finder \BehatMetafilesFinder ;
10- use Rector \SwissKnife \Behastan \UsedInstructionResolver ;
119use Rector \SwissKnife \Behastan \ValueObject \AbstractMask ;
12- use Rector \SwissKnife \Behastan \ValueObject \ExactMask ;
13- use Rector \SwissKnife \Behastan \ValueObject \MaskCollection ;
14- use Rector \SwissKnife \Behastan \ValueObject \NamedMask ;
15- use Rector \SwissKnife \Behastan \ValueObject \RegexMask ;
16- use Rector \SwissKnife \Behastan \ValueObject \SkippedMask ;
1710use Symfony \Component \Console \Command \Command ;
1811use Symfony \Component \Console \Input \InputArgument ;
1912use Symfony \Component \Console \Input \InputInterface ;
@@ -26,8 +19,7 @@ final class BehastanCommand extends Command
2619 public function __construct (
2720 private readonly SymfonyStyle $ symfonyStyle ,
2821 private readonly BehatMetafilesFinder $ behatMetafilesFinder ,
29- private readonly DefinitionMasksResolver $ definitionMasksResolver ,
30- private readonly UsedInstructionResolver $ usedInstructionResolver ,
22+ private readonly Behastan $ behastan ,
3123 ) {
3224 parent ::__construct ();
3325 }
@@ -66,45 +58,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int
6658 sprintf ('Checking static, named and regex masks from %d *Feature files ' , count ($ featureFiles ))
6759 );
6860
69- $ maskCollection = $ this ->definitionMasksResolver ->resolve ($ contextFiles );
70- $ this ->printStats ($ maskCollection );
61+ $ unusedMasks = $ this ->behastan ->analyse ($ contextFiles , $ featureFiles );
7162
72- $ featureInstructions = $ this ->usedInstructionResolver ->resolveInstructionsFromFeatureFiles ($ featureFiles );
73-
74- $ maskProgressBar = $ this ->symfonyStyle ->createProgressBar ($ maskCollection ->count ());
75-
76- $ unusedMasks = [];
77- foreach ($ maskCollection ->all () as $ mask ) {
78- $ maskProgressBar ->advance ();
79-
80- if ($ mask instanceof SkippedMask) {
81- continue ;
82- }
83-
84- // is used?
85- if ($ mask instanceof ExactMask && in_array ($ mask ->mask , $ featureInstructions , true )) {
86- continue ;
87- }
88-
89- // is used?
90- if ($ mask instanceof RegexMask && $ this ->isRegexDefinitionUsed ($ mask ->mask , $ featureInstructions )) {
91- continue ;
92- }
93-
94- if ($ mask instanceof NamedMask) {
95- // normalize :mask definition to regex
96- $ regexMask = '# ' . Strings::replace ($ mask ->mask , '#(\:[\W\w]+)# ' , '(.*?) ' ) . '# ' ;
97- if ($ this ->isRegexDefinitionUsed ($ regexMask , $ featureInstructions )) {
98- continue ;
99- }
100- }
101-
102- if ($ mask instanceof AbstractMask) {
103- $ unusedMasks [] = $ mask ;
104- }
105- }
106-
107- $ maskProgressBar ->finish ();
10863 $ this ->symfonyStyle ->newLine (2 );
10964
11065 if ($ unusedMasks === []) {
@@ -117,21 +72,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int
11772 return Command::FAILURE ;
11873 }
11974
120- /**
121- * @param string[] $featureInstructions
122- */
123- private function isRegexDefinitionUsed (string $ regexBehatDefinition , array $ featureInstructions ): bool
124- {
125- foreach ($ featureInstructions as $ featureInstruction ) {
126- if (Strings::match ($ featureInstruction , $ regexBehatDefinition )) {
127- // it is used!
128- return true ;
129- }
130- }
131-
132- return false ;
133- }
134-
13575 /**
13676 * @param AbstractMask[] $unusedMasks
13777 */
@@ -144,28 +84,6 @@ private function reportUnusedDefinitions(array $unusedMasks): void
14484 $ this ->symfonyStyle ->error (sprintf ('Found %d unused definitions ' , count ($ unusedMasks )));
14585 }
14686
147- private function printStats (MaskCollection $ maskCollection ): void
148- {
149- $ this ->symfonyStyle ->writeln (sprintf ('Found %d masks: ' , $ maskCollection ->count ()));
150- $ this ->symfonyStyle ->newLine ();
151-
152- $ this ->symfonyStyle ->writeln (sprintf (' * %d exact ' , $ maskCollection ->countByType (ExactMask::class)));
153- $ this ->symfonyStyle ->writeln (sprintf (' * %d /regex/ ' , $ maskCollection ->countByType (RegexMask::class)));
154- $ this ->symfonyStyle ->writeln (sprintf (' * %d :named ' , $ maskCollection ->countByType (NamedMask::class)));
155- $ this ->symfonyStyle ->writeln (sprintf (' * %d skipped ' , $ maskCollection ->countByType (SkippedMask::class)));
156-
157- $ skippedMasks = $ maskCollection ->byType (SkippedMask::class);
158- if ($ skippedMasks !== []) {
159- $ this ->symfonyStyle ->newLine ();
160-
161- foreach ($ skippedMasks as $ skippedMask ) {
162- $ this ->printMask ($ skippedMask );
163- }
164-
165- $ this ->symfonyStyle ->newLine ();
166- }
167- }
168-
16987 private function printMask (AbstractMask $ unusedMask ): void
17088 {
17189 $ this ->symfonyStyle ->writeln ($ unusedMask ->mask );
0 commit comments