1
1
package com .codacy .parsers
2
2
3
+ import java .io .File
4
+
3
5
import com .codacy .api .{CoverageReport , Language }
4
6
import com .codacy .parsers .implementation .{CoberturaParser , JacocoParser }
5
7
import com .codacy .parsers .util .XML
6
- import java . io . File
8
+
7
9
import scala .util .Try
8
10
import scala .xml .Elem
9
11
@@ -25,9 +27,17 @@ trait XMLCoverageParser extends CoverageParser {
25
27
26
28
}
27
29
30
+ trait CoverageParserFactory {
31
+ def apply (language : Language .Value , rootProject : File , reportFile : File ): CoverageParser
32
+ }
33
+
28
34
object CoverageParserFactory {
29
35
30
- def withCoverageReport [A ](language : Language .Value , rootProject : File , reportFile : File )(block : CoverageReport => A ): Either [String , A ] = {
36
+ def withCoverageReport [A ](language : Language .Value ,
37
+ rootProject : File ,
38
+ reportFile : File ,
39
+ parserFactory : Option [CoverageParserFactory ] = None
40
+ )(block : CoverageReport => A ): Either [String , A ] = {
31
41
val isEmptyReport = {
32
42
// just starting by detecting the simplest case: a single report file
33
43
Try (reportFile.isFile && reportFile.length() == 0 ).getOrElse(false )
@@ -36,27 +46,27 @@ object CoverageParserFactory {
36
46
if (isEmptyReport) {
37
47
Left (s " report file is empty: ${reportFile.getAbsolutePath}" )
38
48
} else {
39
- create(language, rootProject, reportFile).map {
40
- parser =>
41
- val report = parser.generateReport( )
42
- Right (block(report))
43
- }.getOrElse {
44
- Left ( s " no parser for $language " )
49
+ parserFactory.fold[ Either [ String , A ]] {
50
+ val parsers = allParsers(language, rootProject, reportFile)
51
+ withReport(parsers)( s " could not parse report with any parser" )(block )
52
+ } { parserFactory =>
53
+ val parser = parserFactory(language, rootProject, reportFile)
54
+ withReport( Seq (parser))( " could not parse report with the provided parser " )(block )
45
55
}
46
56
}
47
57
}
48
58
49
- private def create (language : Language .Value , rootProject : File , reportFile : File ): Option [CoverageParser ] = {
50
- val implementations =
51
- Seq (
52
- new CoberturaParser (language, rootProject, reportFile),
53
- new JacocoParser (language, rootProject, reportFile )
54
- )
59
+ private def allParsers (language : Language .Value , rootProject : File , reportFile : File ): Seq [CoverageParser ] = {
60
+ Seq (
61
+ new CoberturaParser (language, rootProject, reportFile),
62
+ new JacocoParser (language, rootProject, reportFile)
63
+ )
64
+ }
55
65
56
- implementations.collectFirst {
57
- case implementation if implementation.isValidReport =>
58
- implementation
59
- }
66
+ private def withReport [ A ]( parsers : Seq [ CoverageParser ])( errorMessage : String )( block : CoverageReport => A ) : Either [ String , A ] = {
67
+ parsers
68
+ .find(_.isValidReport)
69
+ .fold[ Either [ String , A ]]( Left (errorMessage))(parser => Right (block(parser.generateReport())))
60
70
}
61
71
62
72
}
0 commit comments