1
1
package scoverage
2
2
3
- import sbt ._
4
3
import sbt .Keys ._
5
- import scoverage . report ._
4
+ import sbt ._
6
5
7
6
object ScoverageSbtPlugin extends ScoverageSbtPlugin
8
7
@@ -21,96 +20,69 @@ class ScoverageSbtPlugin extends sbt.Plugin {
21
20
22
21
import ScoverageKeys ._
23
22
24
- lazy val Scoverage : Configuration = config(" scoverage" ) extend Test
23
+ lazy val Scoverage : Configuration = config(" scoverage" ) extend Compile
24
+ lazy val ScoverageTest : Configuration = config(" scoverage-test" ) extend Scoverage
25
25
26
26
lazy val instrumentSettings : Seq [Setting [_]] = {
27
27
inConfig(Scoverage )(Defaults .compileSettings) ++
28
- inConfig(Scoverage )(Defaults .testSettings) ++
28
+ inConfig(ScoverageTest )(Defaults .testSettings) ++
29
29
Seq (
30
- // ivyConfigurations ++= Seq(Scoverage.hide, Scoverage .hide),
31
- libraryDependencies in( Scoverage , compile) += {
32
- OrgScoverage % (ArtifactId + " _" + scalaBinaryVersion.value) % ScoverageVersion
30
+ ivyConfigurations ++= Seq (Scoverage .hide, ScoverageTest .hide),
31
+ libraryDependencies += {
32
+ OrgScoverage % (ArtifactId + " _" + scalaBinaryVersion.value) % ScoverageVersion % Scoverage .name
33
33
},
34
-
34
+ sources in Scoverage := (sources in Compile ).value,
35
+ sourceDirectory in Scoverage := (sourceDirectory in Compile ).value,
36
+ resourceDirectory in Scoverage := (resourceDirectory in Compile ).value,
37
+ resourceGenerators in Scoverage := (resourceGenerators in Compile ).value,
38
+ javacOptions in Scoverage := (javacOptions in Compile ).value,
39
+ javaOptions in Scoverage := (javaOptions in Compile ).value,
40
+
41
+ minimumCoverage := 0 , // default is no minimum
42
+ failOnMinimumCoverage := false ,
43
+ highlighting := false ,
35
44
excludedPackages in Scoverage := " " ,
36
- minimumCoverage in Scoverage := 0 , // default is no minimum
37
- failOnMinimumCoverage in Scoverage := false ,
38
- highlighting in Scoverage := false ,
39
45
40
- scalacOptions in( Scoverage , compile) ++ = {
46
+ scalacOptions in Scoverage : = {
41
47
val target = crossTarget.value
42
- val scoverageDeps = ( update in( Scoverage , compile)) .value matching configurationFilter(Scoverage .name)
48
+ val scoverageDeps = update.value matching configurationFilter(Scoverage .name)
43
49
scoverageDeps.find(_.getAbsolutePath.contains(ArtifactId )) match {
44
50
case None => throw new Exception (s " Fatal: $ArtifactId not in libraryDependencies " )
45
51
case Some (classpath) =>
46
52
Seq (
47
53
" -Xplugin:" + classpath.getAbsolutePath,
48
- " -P:scoverage:excludedPackages:" + Option (( excludedPackages in Scoverage ) .value).getOrElse(" " ),
54
+ " -P:scoverage:excludedPackages:" + Option (excludedPackages.value).getOrElse(" " ),
49
55
" -P:scoverage:dataDir:" + target.getAbsolutePath + " /scoverage-data"
50
56
)
51
57
}
52
58
},
53
59
54
- scalacOptions in(Scoverage , compile) ++= (if ((highlighting in Scoverage ).value) List (" -Yrangepos" ) else Nil ),
55
-
56
- test in Scoverage := {
57
- (test in Scoverage ).value
58
- streams.value.log.info(s " [scoverage] Waiting for measurement data to sync... " )
59
- Thread .sleep(2000 ) // have noticed some delay in writing, hacky but works
60
-
61
- val targetPath = crossTarget.value
62
-
63
- val dataDir = targetPath / " /scoverage-data"
64
- val coberturaDir = targetPath / " coverage-report"
65
- val reportDir = targetPath / " scoverage-report"
66
- coberturaDir.mkdirs()
67
- reportDir.mkdirs()
68
-
69
- val coverageFile = IOUtils .coverageFile(dataDir)
70
- val measurementFiles = IOUtils .findMeasurementFiles(dataDir)
71
-
72
- streams.value.log.info(s " [scoverage] Reading scoverage instrumentation [ $coverageFile] " )
73
- streams.value.log.info(s " [scoverage] Reading scoverage measurements... " )
74
-
75
- val coverage = IOUtils .deserialize(coverageFile)
76
- val measurements = IOUtils .invoked(measurementFiles)
77
- coverage.apply(measurements)
78
-
79
- streams.value.log
80
- .info(s " [scoverage] Generating Cobertura report [ ${coberturaDir.getAbsolutePath}/cobertura.xml] " )
81
- new CoberturaXmlWriter (baseDirectory.value, coberturaDir).write(coverage)
82
-
83
- streams.value.log.info(s " [scoverage] Generating XML report [ ${reportDir.getAbsolutePath}/scoverage.xml] " )
84
- new ScoverageXmlWriter ((scalaSource in Compile ).value, reportDir, false ).write(coverage)
85
- new ScoverageXmlWriter ((scalaSource in Compile ).value, reportDir, true ).write(coverage)
86
-
87
- streams.value.log.info(s " [scoverage] Generating HTML report [ ${reportDir.getAbsolutePath}/index.html] " )
88
- new ScoverageHtmlWriter ((scalaSource in Compile ).value, reportDir).write(coverage)
89
-
90
- streams.value.log.info(" [scoverage] Reports completed" )
91
-
92
- // check for default minimum
93
- val min = (minimumCoverage in Scoverage ).value
94
- val failOnMin = (failOnMinimumCoverage in Scoverage ).value
95
- if (min > 0 ) {
96
- def is100 (d : Double ) = Math .abs(100 - d) <= 0.00001
60
+ scalacOptions in Scoverage ++= (if (highlighting.value) List (" -Yrangepos" ) else Nil ),
61
+
62
+ sources in ScoverageTest <<= (sources in Test ),
63
+ sourceDirectory in ScoverageTest <<= (sourceDirectory in Test ),
64
+ resourceDirectory in ScoverageTest <<= (resourceDirectory in Test ),
65
+ resourceGenerators in ScoverageTest <<= (resourceGenerators in Test ),
66
+ unmanagedResources in ScoverageTest <<= (unmanagedResources in Test ),
67
+ javacOptions in ScoverageTest <<= (javacOptions in Test ),
68
+ javaOptions in ScoverageTest <<= (javaOptions in Test ),
69
+ fork in ScoverageTest <<= (fork in Test ),
70
+
71
+ externalDependencyClasspath in Scoverage <<= Classpaths
72
+ .concat(externalDependencyClasspath in Scoverage , externalDependencyClasspath in Compile ),
73
+ externalDependencyClasspath in ScoverageTest <<= Classpaths
74
+ .concat(externalDependencyClasspath in ScoverageTest , externalDependencyClasspath in Test ),
75
+
76
+ internalDependencyClasspath in Scoverage <<= (internalDependencyClasspath in Compile ),
77
+ internalDependencyClasspath in ScoverageTest <<= (internalDependencyClasspath in Test , internalDependencyClasspath in ScoverageTest , classDirectory in Compile ) map {
78
+ (testDeps, scoverageDeps, oldClassDir) =>
79
+ scoverageDeps ++ testDeps.filter(_.data != oldClassDir)
80
+ },
97
81
98
- if (is100(coverage.statementCoveragePercent)) {
99
- streams.value.log.info(s " [scoverage] 100% Coverage " )
100
- } else if (min > coverage.statementCoveragePercent) {
101
- streams.value.log
102
- .error(s " [scoverage] Coverage is below minimum [ ${coverage.statementCoverageFormatted}% < $min%] " )
103
- if (failOnMin)
104
- throw new RuntimeException (" Coverage minimum was not reached" )
105
- } else {
106
- streams.value.log
107
- .info(s " [scoverage] Coverage is above minimum [ ${coverage.statementCoverageFormatted}% > $min%] " )
108
- }
109
- }
82
+ testOptions in ScoverageTest <<= (testOptions in Test ),
110
83
111
- streams.value.log.info(s " [scoverage] All done. Coverage was [ ${coverage.statementCoverageFormatted}%] " )
112
- ()
113
- }
84
+ // copy the test task into compile so we can do scoverage:test instead of scoverage-test:test
85
+ test in Scoverage <<= (test in ScoverageTest )
114
86
)
115
87
}
116
88
}
0 commit comments