Skip to content
This repository was archived by the owner on Dec 3, 2020. It is now read-only.

Commit 8a46d1d

Browse files
author
Daniel Reigada
committed
Allow the coverage parser to be specified
1 parent 960e448 commit 8a46d1d

File tree

3 files changed

+42
-22
lines changed

3 files changed

+42
-22
lines changed
Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.codacy.parsers
22

3+
import java.io.File
4+
35
import com.codacy.api.{CoverageReport, Language}
46
import com.codacy.parsers.implementation.{CoberturaParser, JacocoParser}
57
import com.codacy.parsers.util.XML
6-
import java.io.File
8+
79
import scala.util.Try
810
import scala.xml.Elem
911

@@ -25,9 +27,17 @@ trait XMLCoverageParser extends CoverageParser {
2527

2628
}
2729

30+
trait CoverageParserFactory {
31+
def apply(language: Language.Value, rootProject: File, reportFile: File): CoverageParser
32+
}
33+
2834
object CoverageParserFactory {
2935

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] = {
3141
val isEmptyReport = {
3242
// just starting by detecting the simplest case: a single report file
3343
Try(reportFile.isFile && reportFile.length() == 0).getOrElse(false)
@@ -36,27 +46,27 @@ object CoverageParserFactory {
3646
if (isEmptyReport) {
3747
Left(s"report file is empty: ${reportFile.getAbsolutePath}")
3848
} 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)
4555
}
4656
}
4757
}
4858

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+
}
5565

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())))
6070
}
6171

6272
}

src/main/scala/com/codacy/parsers/implementation/CoberturaParser.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@ import java.text.NumberFormat
55
import java.util.Locale
66

77
import com.codacy.api.{CoverageFileReport, CoverageReport, Language}
8-
import com.codacy.parsers.XMLCoverageParser
98
import com.codacy.parsers.util.LanguageUtils
9+
import com.codacy.parsers.{CoverageParser, CoverageParserFactory, XMLCoverageParser}
1010

1111
import scala.util.Try
1212
import scala.xml.Node
1313

14+
object CoberturaParser extends CoverageParserFactory {
15+
override def apply(language: Language.Value, rootProject: File, reportFile: File): CoverageParser =
16+
new CoberturaParser(language, rootProject, reportFile)
17+
}
18+
1419
class CoberturaParser(val language: Language.Value, val rootProject: File, val coverageReport: File) extends XMLCoverageParser {
1520

1621
val rootProjectDir = sanitiseFilename(rootProject.getAbsolutePath + File.separator)

src/main/scala/com/codacy/parsers/implementation/JacocoParser.scala

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@ package com.codacy.parsers.implementation
33
import java.io.File
44

55
import com.codacy.api._
6-
import com.codacy.parsers.XMLCoverageParser
6+
import com.codacy.parsers.{CoverageParser, CoverageParserFactory, XMLCoverageParser}
77

88
import scala.xml.Node
99

1010
private case class LineCoverage(missedInstructions: Int, coveredInstructions: Int)
1111

12+
object JacocoParser extends CoverageParserFactory {
13+
override def apply(language: Language.Value, rootProject: File, reportFile: File): CoverageParser =
14+
new JacocoParser(language, rootProject, reportFile)
15+
}
16+
1217
class JacocoParser(val language: Language.Value, val rootProject: File, val coverageReport: File) extends XMLCoverageParser {
1318

1419
val rootProjectDir = rootProject.getAbsolutePath + File.separator
@@ -52,9 +57,9 @@ class JacocoParser(val language: Language.Value, val rootProject: File, val cove
5257
line =>
5358
(line \ "@nr").text.toInt -> LineCoverage((line \ "@mi").text.toInt, (line \ "@ci").text.toInt)
5459
}.toMap.collect {
55-
case (key, lineCoverage) if lineCoverage.missedInstructions+ lineCoverage.coveredInstructions > 0 =>
60+
case (key, lineCoverage) if lineCoverage.missedInstructions + lineCoverage.coveredInstructions > 0 =>
5661

57-
key -> (if(lineCoverage.coveredInstructions > 0) 1 else 0)
62+
key -> (if (lineCoverage.coveredInstructions > 0) 1 else 0)
5863
}
5964

6065
CoverageFileReport(sourceFilename.stripPrefix(rootProjectDir), fileHit, lineHitMap)

0 commit comments

Comments
 (0)