Skip to content

Filter out statements not in source roots #167

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 8, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@ package scoverage.report

import java.io.File

class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File) {
import scoverage.Coverage

class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File, ignoreStatementsNotInSrcDirs: Boolean) {

// Source paths in canonical form WITH trailing file separator
private val formattedSourcePaths: Seq[String] = sourceDirectories filter ( _.isDirectory ) map ( _.getCanonicalPath + File.separator )

/**
* Converts absolute path to relative one if any of the source directories is it's parent.
* If there is no parent directory, the path is returned unchanged (absolute).
*
*
* @param src absolute file path in canonical form
*/
def relativeSource(src: String): String = relativeSource(src, formattedSourcePaths)
Expand All @@ -27,4 +29,32 @@ class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File) {
}
}

def preprocessCoverage(coverage: Coverage): Coverage = {
if (ignoreStatementsNotInSrcDirs)
filteredCoverage(coverage)
else
coverage
}

/**
* Filters out statements not in source roots
* @return new Coverage instance with statements whose src paths are in root source paths.
*/
private def filteredCoverage(coverage: Coverage): Coverage = {
val filteredCoverage = Coverage()
coverage.statements.foreach { stmt =>
if (isInSourceRoots(stmt.source))
filteredCoverage.add(stmt)
}
coverage.ignoredStatements.foreach { stmt =>
if (isInSourceRoots(stmt.source))
filteredCoverage.addIgnoredStatement(stmt)
}
filteredCoverage
}

private def isInSourceRoots(src: String): Boolean = {
formattedSourcePaths.exists(sourcePath => src.startsWith(sourcePath))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,17 @@ import scoverage._
import scala.xml.{Node, PrettyPrinter}

/** @author Stephen Samuel */
class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File) extends BaseReportWriter(sourceDirectories, outputDir) {
class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File, ignoreStatementsNotInSrcDirs: Boolean)
extends BaseReportWriter(sourceDirectories, outputDir, ignoreStatementsNotInSrcDirs) {

def this (baseDir: File, outputDir: File) {
this(Seq(baseDir), outputDir)
def this (baseDir: File, outputDir: File, ignoreStatementsNotInSrcDirs: Boolean = false) {
this(Seq(baseDir), outputDir, ignoreStatementsNotInSrcDirs)
}

def write(coverage: Coverage): Unit = {
val file = new File(outputDir, "cobertura.xml")
IOUtils.writeToFile(file, "<?xml version=\"1.0\"?>\n<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/coverage-04.dtd\">\n" +
new PrettyPrinter(120, 4).format(xml(coverage)))
new PrettyPrinter(120, 4).format(xml(preprocessCoverage(coverage))))
}

def method(method: MeasuredMethod): Node = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import scoverage._
import scala.xml.Node

/** @author Stephen Samuel */
class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File, sourceEncoding: Option[String]) extends BaseReportWriter(sourceDirectories, outputDir) {
class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File, sourceEncoding: Option[String], ignoreStatementsNotInSrcDirs: Boolean)
extends BaseReportWriter(sourceDirectories, outputDir, ignoreStatementsNotInSrcDirs) {

// for backward compatibility only
def this (sourceDirectories: Seq[File], outputDir: File) {
this(sourceDirectories, outputDir, None);
def this (sourceDirectories: Seq[File], outputDir: File, ignoreStatementsNotInSrcDirs: Boolean = false) {
this(sourceDirectories, outputDir, None, ignoreStatementsNotInSrcDirs)
}

// for backward compatibility only
Expand All @@ -21,16 +22,18 @@ class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File, sourceE
}

def write(coverage: Coverage): Unit = {
val preprocessedCoverage = preprocessCoverage(coverage)

val indexFile = new File(outputDir.getAbsolutePath + "/index.html")
val packageFile = new File(outputDir.getAbsolutePath + "/packages.html")
val overviewFile = new File(outputDir.getAbsolutePath + "/overview.html")

val index = IOUtils.readStreamAsString(getClass.getResourceAsStream("/scoverage/index.html"))
IOUtils.writeToFile(indexFile, index)
IOUtils.writeToFile(packageFile, packageList(coverage).toString())
IOUtils.writeToFile(overviewFile, overview(coverage).toString())
IOUtils.writeToFile(packageFile, packageList(preprocessedCoverage).toString())
IOUtils.writeToFile(overviewFile, overview(preprocessedCoverage).toString())

coverage.packages.foreach(writePackage)
preprocessedCoverage.packages.foreach(writePackage)
}

private def writePackage(pkg: MeasuredPackage): Unit = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@ import scoverage._
import scala.xml.{Node, PrettyPrinter}

/** @author Stephen Samuel */
class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: Boolean) extends BaseReportWriter(sourceDirectories, outputDir) {
class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: Boolean, ignoreStatementsNotInSrcDirs: Boolean)
extends BaseReportWriter(sourceDirectories, outputDir, ignoreStatementsNotInSrcDirs) {

def this (sourceDir: File, outputDir: File, debug: Boolean) {
this(Seq(sourceDir), outputDir, debug)
def this (sourceDir: File, outputDir: File, debug: Boolean, ignoreStatementsNotInSrcDirs: Boolean = false) {
this(Seq(sourceDir), outputDir, debug, ignoreStatementsNotInSrcDirs)
}

def write(coverage: Coverage): Unit = {
val file = IOUtils.reportFile(outputDir, debug)
IOUtils.writeToFile(file, new PrettyPrinter(120, 4).format(xml(coverage)))
IOUtils.writeToFile(file, new PrettyPrinter(120, 4).format(xml(preprocessCoverage(coverage))))
}

private def xml(coverage: Coverage): Node = {
Expand Down