4
4
5
5
namespace CoveragePathFixer \Command ;
6
6
7
- use RecursiveDirectoryIterator ;
8
- use RecursiveIteratorIterator ;
9
- use RecursiveRegexIterator ;
10
- use RegexIterator ;
11
- use SebastianBergmann \CodeCoverage \CodeCoverage ;
12
- use SebastianBergmann \CodeCoverage \Filter ;
13
- use SebastianBergmann \CodeCoverage \Report \Clover ;
14
- use SebastianBergmann \CodeCoverage \Report \PHP ;
15
- use Symfony \Component \Console \Command \Command ;
16
- use Symfony \Component \Console \Input \InputArgument ;
17
- use Symfony \Component \Console \Input \InputInterface ;
18
- use Symfony \Component \Console \Input \InputOption ;
19
- use Symfony \Component \Console \Output \OutputInterface ;
7
+ use CoveragePathFixer \Service \{CoverageLoader , FileFinder , FileWriter , PathFixer };
8
+ use SebastianBergmann \CodeCoverage \{CodeCoverage , Filter };
9
+ use Symfony \Component \Console \{Command \Command ,
10
+ Input \InputArgument ,
11
+ Input \InputInterface ,
12
+ Input \InputOption ,
13
+ Output \OutputInterface };
20
14
21
15
class ChangePathPrefix extends Command
22
16
{
17
+ /**
18
+ * @var string Name of the command
19
+ */
23
20
protected static $ defaultName = 'fix ' ;
24
21
22
+ /**
23
+ * @var FileFinder
24
+ */
25
+ private $ finder ;
26
+
27
+ /**
28
+ * @var CoverageLoader
29
+ */
30
+ private $ loader ;
31
+
32
+ /**
33
+ * @var FileWriter
34
+ */
35
+ private $ writer ;
36
+
37
+ public function __construct (FileFinder $ finder , CoverageLoader $ loader , FileWriter $ writer )
38
+ {
39
+ parent ::__construct (self ::$ defaultName );
40
+
41
+ $ this ->finder = $ finder ;
42
+ $ this ->loader = $ loader ;
43
+ $ this ->writer = $ writer ;
44
+ }
45
+
25
46
protected function configure (): void
26
47
{
27
48
$ this ->setDescription ('Swaps a given path prefix with another in your coverage files ' )
@@ -66,46 +87,42 @@ protected function configure(): void
66
87
67
88
protected function execute (InputInterface $ input , OutputInterface $ output ): int
68
89
{
90
+ $ fixer = new PathFixer (
91
+ $ input ->getArgument ('original_prefix ' ),
92
+ $ input ->getArgument ('replacement_prefix ' )
93
+ );
94
+
69
95
try {
70
- $ files = $ this ->findCoverageFiles ($ input ->getArgument ('directory_to_search ' ));
96
+ $ files = $ this ->finder ->findCoverage ($ input ->getArgument ('directory_to_search ' ));
97
+ $ output ->writeln (sprintf ('%d .cov files found ' , count ($ files )));
71
98
72
99
$ files = $ this ->iterateCoverageFiles (
73
100
$ files ,
74
- $ input ->getArgument ('original_prefix ' ),
75
- $ input ->getArgument ('replacement_prefix ' )
101
+ $ fixer
76
102
);
77
103
104
+ $ this ->writer ->setFiles ($ files );
105
+
78
106
if ($ path = $ input ->getOption ('merge ' )) {
79
- $ files = $ this ->mergeCoverageFiles ( $ files , $ path );
107
+ $ this ->writer -> merge ( $ path );
80
108
}
81
109
82
- $ this ->outputCoverageFiles ( $ files , $ input ->getOption ('clover ' ));
110
+ $ this ->writer -> write ( $ input ->getOption ('clover ' ));
83
111
} catch (\Exception $ ex ) {
84
- return $ ex ->getCode ();
112
+ $ output ->writeln ($ ex ->getMessage ());
113
+ return 1 ;
85
114
}
86
115
87
116
return 0 ;
88
117
}
89
118
90
- private function changePrefix (array $ data , string $ originalPrefix , string $ replacementPrefix ): array
119
+ protected function iterateCoverageFiles (array $ files , PathFixer $ fixer ): array
91
120
{
92
- return array_combine (array_map (function ($ el ) use ($ originalPrefix , $ replacementPrefix ) {
93
- $ el = preg_replace ('#^ ' . $ originalPrefix . '# ' , $ replacementPrefix , $ el );
94
- return $ el ;
95
- }, array_keys ($ data )), array_values ($ data ));
96
- }
121
+ return array_map (function (array $ file ) use ($ fixer ) {
122
+ $ coverage = $ this ->loader ->loadCoverage ($ file [0 ]);
97
123
98
- private function iterateCoverageFiles (array $ files , string $ originalPrefix , string $ replacementPrefix ): array
99
- {
100
- return array_map (function (array $ file ) use ($ originalPrefix , $ replacementPrefix ) {
101
- $ coverage = $ this ->loadCoverageFile ($ file [0 ]);
102
-
103
- $ data = $ this ->changePrefix ($ coverage ->getData (), $ originalPrefix , $ replacementPrefix );
104
- $ whiteList = $ this ->changePrefix (
105
- $ coverage ->filter ()->getWhitelistedFiles (),
106
- $ originalPrefix ,
107
- $ replacementPrefix
108
- );
124
+ $ data = $ fixer ->fix ($ coverage ->getData ());
125
+ $ whiteList = $ fixer ->fix ( $ coverage ->filter ()->getWhitelistedFiles ());
109
126
110
127
$ filter = new Filter ();
111
128
$ filter ->setWhitelistedFiles ($ whiteList );
@@ -116,54 +133,4 @@ private function iterateCoverageFiles(array $files, string $originalPrefix, stri
116
133
return $ coverage ;
117
134
}, $ files );
118
135
}
119
-
120
- private function findCoverageFiles (string $ directory ): array
121
- {
122
- $ path = realpath ($ directory );
123
-
124
- $ directory = new RecursiveDirectoryIterator ($ path );
125
- $ iterator = new RecursiveIteratorIterator ($ directory );
126
- $ filtered = new RegexIterator ($ iterator , '/^.+\.cov$/i ' , RecursiveRegexIterator::GET_MATCH );
127
-
128
- return iterator_to_array ($ filtered );
129
- }
130
-
131
- private function loadCoverageFile (string $ file ): CodeCoverage
132
- {
133
- $ coverage = include $ file ;
134
-
135
- if (!($ coverage instanceof CodeCoverage)) {
136
- unset($ coverage );
137
- throw new \Exception ('File with coverage extension not resolved to CodeCoverage class ' );
138
- }
139
-
140
- return $ coverage ;
141
- }
142
-
143
- private function mergeCoverageFiles (array $ files , string $ path ): array
144
- {
145
- $ coverage = new CodeCoverage ();
146
-
147
- foreach ($ files as $ file => $ coverage ) {
148
- $ coverage ->merge ($ coverage );
149
- }
150
-
151
- return [$ path => $ coverage ];
152
- }
153
-
154
- private function outputCoverageFiles (array $ files , bool $ asClover = false ): void
155
- {
156
- array_walk ($ files , function ($ coverage , $ path ) use ($ asClover ) {
157
- if ($ asClover ) {
158
- $ filename = basename ($ path , '.cov ' );
159
- $ directory = dirname ($ path );
160
-
161
- $ reportWriter = new Clover ();
162
- $ reportWriter ->process ($ coverage , $ directory . DIRECTORY_SEPARATOR . $ filename . '.xml ' );
163
- }
164
-
165
- $ reportWriter = new PHP ();
166
- $ reportWriter ->process ($ coverage , $ path );
167
- });
168
- }
169
136
}
0 commit comments