@@ -4,39 +4,22 @@ import sbt.Keys._
4
4
import sbt ._
5
5
import scoverage .report .{CoverageAggregator , CoberturaXmlWriter , ScoverageHtmlWriter , ScoverageXmlWriter }
6
6
7
- object ScoverageSbtPlugin extends ScoverageSbtPlugin
8
-
9
- class ScoverageSbtPlugin extends sbt.AutoPlugin {
7
+ object ScoverageSbtPlugin extends AutoPlugin {
10
8
11
9
val OrgScoverage = " org.scoverage"
12
10
val ScalacRuntimeArtifact = " scalac-scoverage-runtime"
13
11
val ScalacPluginArtifact = " scalac-scoverage-plugin"
14
12
val ScoverageVersion = " 1.1.0"
15
-
16
- object ScoverageKeys {
17
- lazy val coverage = taskKey[Unit ](" enable compiled code with instrumentation" )
18
- lazy val coverageOff = taskKey[Unit ](" disable compiled code with instrumentation" )
19
- lazy val coverageReport = taskKey[Unit ](" run report generation" )
20
- lazy val coverageAggregate = taskKey[Unit ](" aggregate reports from subprojects" )
21
- val coverageExcludedPackages = settingKey[String ](" regex for excluded packages" )
22
- val coverageExcludedFiles = settingKey[String ](" regex for excluded file paths" )
23
- val coverageMinimum = settingKey[Double ](" scoverage-minimum-coverage" )
24
- val coverageFailOnMinimum = settingKey[Boolean ](" if coverage is less than this value then fail build" )
25
- val coverageHighlighting = settingKey[Boolean ](" enables range positioning for highlighting" )
26
- val coverageOutputCobertura = settingKey[Boolean ](" enables cobertura XML report generation" )
27
- val coverageOutputXML = settingKey[Boolean ](" enables xml report generation" )
28
- val coverageOutputHTML = settingKey[Boolean ](" enables html report generation" )
29
- val coverageOutputDebug = settingKey[Boolean ](" turn on the debug report" )
30
- val coverageCleanSubprojectFiles = settingKey[Boolean ](" removes subproject data after an aggregation" )
31
- }
32
-
13
+ val autoImport = ScoverageKeys
33
14
var enabled = false
34
15
35
- import ScoverageKeys ._
16
+ import autoImport ._
36
17
37
18
val aggregateFilter = ScopeFilter ( inAggregates(ThisProject ), inConfigurations(Compile ) ) // must be outside of the 'coverageAggregate' task (see: https://github.com/sbt/sbt/issues/1095 or https://github.com/sbt/sbt/issues/780)
38
19
20
+ override def requires = plugins.JvmPlugin
39
21
override def trigger = allRequirements
22
+
40
23
override lazy val projectSettings = Seq (
41
24
42
25
coverage := {
@@ -49,31 +32,31 @@ class ScoverageSbtPlugin extends sbt.AutoPlugin {
49
32
50
33
coverageReport := {
51
34
val target = crossTarget.value
52
- val s = ( streams in Global ) .value
35
+ val log = streams.value.log
53
36
54
- streams.value. log.info(s " Waiting for measurement data to sync... " )
37
+ log.info(s " Waiting for measurement data to sync... " )
55
38
Thread .sleep(1000 ) // have noticed some delay in writing on windows, hacky but works
56
39
57
- loadCoverage(target, s ) match {
40
+ loadCoverage(target, log ) match {
58
41
case Some (cov) => writeReports(target,
59
42
(sourceDirectories in Compile ).value,
60
43
cov,
61
44
coverageOutputCobertura.value,
62
45
coverageOutputXML.value,
63
46
coverageOutputHTML.value,
64
47
coverageOutputDebug.value,
65
- s )
66
- case None => s. log.warn(" No coverage data, skipping reports" )
48
+ log )
49
+ case None => log.warn(" No coverage data, skipping reports" )
67
50
}
68
51
},
69
52
70
- testOptions in Test < += postTestReport,
53
+ testOptions in Test += postTestReport.value ,
71
54
72
- testOptions in IntegrationTest < += postTestReport,
55
+ testOptions in IntegrationTest += postTestReport.value ,
73
56
74
57
coverageAggregate := {
75
- val s = ( streams in Global ) .value
76
- s. log.info(s " Aggregating coverage from subprojects... " )
58
+ val log = streams.value.log
59
+ log.info(s " Aggregating coverage from subprojects... " )
77
60
78
61
val xmlReportFiles = crossTarget.all(aggregateFilter).value map (_ / " scoverage-report" / Constants .XMLReportFilename ) filter (_.isFile())
79
62
CoverageAggregator .aggregate(xmlReportFiles, coverageCleanSubprojectFiles.value) match {
@@ -85,11 +68,11 @@ class ScoverageSbtPlugin extends sbt.AutoPlugin {
85
68
coverageOutputXML.value,
86
69
coverageOutputHTML.value,
87
70
coverageOutputDebug.value,
88
- s )
71
+ log )
89
72
val cfmt = cov.statementCoverageFormatted
90
- s. log.info(s " Aggregation complete. Coverage was [ $cfmt] " )
73
+ log.info(s " Aggregation complete. Coverage was [ $cfmt] " )
91
74
case None =>
92
- s. log.info(" No subproject data to aggregate, skipping reports" )
75
+ log.info(" No subproject data to aggregate, skipping reports" )
93
76
}
94
77
},
95
78
@@ -125,26 +108,26 @@ class ScoverageSbtPlugin extends sbt.AutoPlugin {
125
108
coverageCleanSubprojectFiles := true
126
109
)
127
110
128
- private def postTestReport = {
129
- (crossTarget, sourceDirectories in Compile , coverageMinimum, coverageFailOnMinimum, coverageOutputCobertura, coverageOutputXML, coverageOutputHTML, coverageOutputDebug, streams in Global ) map {
130
- (target, compileSources, min, failOnMin, outputCobertura, outputXML, outputHTML, coverageDebug, streams) =>
131
- Tests .Cleanup {
132
- () => if (enabled) {
133
- loadCoverage(target, streams) foreach {
134
- c =>
135
- writeReports(target,
136
- compileSources,
137
- c,
138
- outputCobertura,
139
- outputXML,
140
- outputHTML,
141
- coverageDebug,
142
- streams)
143
- checkCoverage(c, streams, min, failOnMin)
144
- }
145
- ()
146
- }
111
+ private def postTestReport = Def .task {
112
+ val log = streams.value.log
113
+ val target = crossTarget.value
114
+ Tests .Cleanup {
115
+ () => if (enabled) {
116
+ loadCoverage(target, log) foreach { c =>
117
+ writeReports(
118
+ target,
119
+ (sourceDirectories in Compile ).value,
120
+ c,
121
+ coverageOutputCobertura.value,
122
+ coverageOutputXML.value,
123
+ coverageOutputHTML.value,
124
+ coverageOutputDebug.value,
125
+ log
126
+ )
127
+ checkCoverage(c, log, coverageMinimum.value, coverageFailOnMinimum.value)
147
128
}
129
+ ()
130
+ }
148
131
}
149
132
}
150
133
@@ -174,47 +157,47 @@ class ScoverageSbtPlugin extends sbt.AutoPlugin {
174
157
coverageOutputXML : Boolean ,
175
158
coverageOutputHTML : Boolean ,
176
159
coverageDebug : Boolean ,
177
- s : TaskStreams ): Unit = {
178
- s. log.info(s " Generating scoverage reports... " )
160
+ log : Logger ): Unit = {
161
+ log.info(s " Generating scoverage reports... " )
179
162
180
163
val coberturaDir = crossTarget / " coverage-report"
181
164
val reportDir = crossTarget / " scoverage-report"
182
165
coberturaDir.mkdirs()
183
166
reportDir.mkdirs()
184
167
185
168
if (coverageOutputCobertura) {
186
- s. log.info(s " Written Cobertura report [ ${coberturaDir.getAbsolutePath}/cobertura.xml] " )
169
+ log.info(s " Written Cobertura report [ ${coberturaDir.getAbsolutePath}/cobertura.xml] " )
187
170
new CoberturaXmlWriter (compileSourceDirectories, coberturaDir).write(coverage)
188
171
}
189
172
190
173
if (coverageOutputXML) {
191
- s. log.info(s " Written XML coverage report [ ${reportDir.getAbsolutePath}/scoverage.xml] " )
174
+ log.info(s " Written XML coverage report [ ${reportDir.getAbsolutePath}/scoverage.xml] " )
192
175
new ScoverageXmlWriter (compileSourceDirectories, reportDir, false ).write(coverage)
193
176
if (coverageDebug) {
194
177
new ScoverageXmlWriter (compileSourceDirectories, reportDir, true ).write(coverage)
195
178
}
196
179
}
197
180
198
181
if (coverageOutputHTML) {
199
- s. log.info(s " Written HTML coverage report [ ${reportDir.getAbsolutePath}/index.html] " )
182
+ log.info(s " Written HTML coverage report [ ${reportDir.getAbsolutePath}/index.html] " )
200
183
new ScoverageHtmlWriter (compileSourceDirectories, reportDir).write(coverage)
201
184
}
202
185
203
- s. log.info(" Coverage reports completed" )
186
+ log.info(" Coverage reports completed" )
204
187
}
205
188
206
- private def loadCoverage (crossTarget : File , s : TaskStreams ): Option [Coverage ] = {
189
+ private def loadCoverage (crossTarget : File , log : Logger ): Option [Coverage ] = {
207
190
208
191
val dataDir = crossTarget / " /scoverage-data"
209
192
val coverageFile = Serializer .coverageFile(dataDir)
210
193
211
- s. log.info(s " Reading scoverage instrumentation [ $coverageFile] " )
194
+ log.info(s " Reading scoverage instrumentation [ $coverageFile] " )
212
195
213
196
if (coverageFile.exists) {
214
197
215
198
val coverage = Serializer .deserialize(coverageFile)
216
199
217
- s. log.info(s " Reading scoverage measurements... " )
200
+ log.info(s " Reading scoverage measurements... " )
218
201
val measurementFiles = IOUtils .findMeasurementFiles(dataDir)
219
202
val measurements = IOUtils .invoked(measurementFiles)
220
203
coverage.apply(measurements)
@@ -226,7 +209,7 @@ class ScoverageSbtPlugin extends sbt.AutoPlugin {
226
209
}
227
210
228
211
private def checkCoverage (coverage : Coverage ,
229
- s : TaskStreams ,
212
+ log : Logger ,
230
213
min : Double ,
231
214
failOnMin : Boolean ): Unit = {
232
215
@@ -238,16 +221,16 @@ class ScoverageSbtPlugin extends sbt.AutoPlugin {
238
221
def is100 (d : Double ) = Math .abs(100 - d) <= 0.00001
239
222
240
223
if (is100(min) && is100(cper)) {
241
- s. log.info(s " 100% Coverage ! " )
224
+ log.info(s " 100% Coverage ! " )
242
225
} else if (min > cper) {
243
- s. log.error(s " Coverage is below minimum [ $cfmt% < $min%] " )
226
+ log.error(s " Coverage is below minimum [ $cfmt% < $min%] " )
244
227
if (failOnMin)
245
228
throw new RuntimeException (" Coverage minimum was not reached" )
246
229
} else {
247
- s. log.info(s " Coverage is above minimum [ $cfmt% > $min%] " )
230
+ log.info(s " Coverage is above minimum [ $cfmt% > $min%] " )
248
231
}
249
232
}
250
233
251
- s. log.info(s " All done. Coverage was [ $cfmt%] " )
234
+ log.info(s " All done. Coverage was [ $cfmt%] " )
252
235
}
253
236
}
0 commit comments