Skip to content

Commit dec2bfd

Browse files
committed
Merge branch 'sonar45'
Conflicts: README.md plugin/README.md plugin/pom.xml plugin/src/main/scala/com/buransky/plugins/scoverage/sensor/ScoverageSensor.scala samples/sbt/multi-module/build.sbt samples/sbt/multi-module/module1/build.sbt samples/sbt/multi-module/module2/build.sbt
2 parents 4e53f99 + af20fed commit dec2bfd

File tree

9 files changed

+156
-117
lines changed

9 files changed

+156
-117
lines changed

README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#Sonar Scoverage Plugin 5.1.0#
1+
#Scoverage Plugin for Sonar#
22

33
[![Build Status](https://travis-ci.org/RadoBuransky/sonar-scoverage-plugin.png)](https://travis-ci.org/RadoBuransky/sonar-scoverage-plugin)
44
[![Analytics](https://ga-beacon.appspot.com/UA-55603212-2/sonar-scoverage-plugin)](https://github.com/igrigorik/ga-beacon)
@@ -28,7 +28,7 @@ just plain average of coverage rates for sub-projects.
2828

2929
## Installation ##
3030

31-
Download and copy [sonar-scoverage-plugin-5.1.0-SNAPSHOT.jar] [LatestPluginJar] to the Sonar plugins directory
31+
Download and copy [sonar-scoverage-plugin-1.0.1.jar] [PluginJar] to the Sonar plugins directory
3232
(usually <SONAR_INSTALLATION_ROOT>/extensions/plugins). Restart Sonar.
3333

3434
### Support for older versions of Sonar ###
@@ -104,5 +104,3 @@ Source code markup with covered and uncovered lines:
104104
[SonarQube]: http://www.sonarqube.org/ "SonarQube"
105105
[Scoverage]: https://github.com/scoverage/scalac-scoverage-plugin "Scoverage"
106106
[sbt-scoverage]: https://github.com/scoverage/sbt-scoverage
107-
[Plugin351]: https://github.com/RadoBuransky/sonar-scoverage-plugin/tree/sonar3.5.1
108-
[Plugin351Jar]: https://github.com/RadoBuransky/sonar-scoverage-plugin/releases/download/v1.0.2-Sonar3.5.1/sonar-scoverage-plugin-sonar3.5.1-1.0.2.jar

plugin/README.md

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
11
# Sonar Scoverage Plugin source code #
22

33
Useful bash script for plugin development to stop Sonar server, build plugin, copy it to Sonar plugin
4-
directory and start Sonar server again:
5-
6-
<SONAR_INSTALL_DIR>/bin/linux-x86-64/sonar.sh stop
7-
8-
mvn install
9-
cp ./target/sonar-scoverage-plugin-5.1.0-SNAPSHOT.jar <SONAR_INSTALL_DIR>/extensions/plugins/
10-
11-
<SONAR_INSTALL_DIR>/bin/linux-x86-64/sonar.sh start
4+
directory and start Sonar server again is in the `dev.sh` file.

plugin/dev.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/bin/bash
2+
3+
SONAR_HOME=~/bin/sonarqube-4.5.4
4+
PLUGIN_VERSION=4.5.0
5+
6+
mvn install
7+
8+
PLUGIN_FILE="./target/sonar-scoverage-plugin-$PLUGIN_VERSION.jar"
9+
if [ ! -f $PLUGIN_FILE ]; then
10+
echo "Plugin jar not found! [$PLUGIN_FILE]"
11+
exit 1
12+
fi
13+
14+
$SONAR_HOME/bin/linux-x86-64/sonar.sh stop
15+
16+
rm $SONAR_HOME/extensions/plugins/sonar-scoverage-plugin-*
17+
cp $PLUGIN_FILE $SONAR_HOME/extensions/plugins/sonar-scoverage-plugin-$PLUGIN_VERSION.jar
18+
19+
$SONAR_HOME/bin/linux-x86-64/sonar.sh start

plugin/src/main/scala/com/buransky/plugins/scoverage/measure/ScalaMetrics.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import scala.collection.mutable.ListBuffer
3030
* @author Rado Buransky
3131
*/
3232
class ScalaMetrics extends Metrics {
33-
override def getMetrics = ListBuffer(ScalaMetrics.statementCoverage, ScalaMetrics.coveredStatements)
33+
override def getMetrics = ListBuffer(ScalaMetrics.statementCoverage, ScalaMetrics.coveredStatements).toList
3434
}
3535

3636
object ScalaMetrics {
@@ -45,7 +45,7 @@ object ScalaMetrics {
4545
.setDomain(CoreMetrics.DOMAIN_TESTS)
4646
.setWorstValue(0.0)
4747
.setBestValue(100.0)
48-
.create()
48+
.create[java.lang.Double]()
4949

5050
lazy val coveredStatements = new Metric.Builder(COVERED_STATEMENTS_KEY,
5151
"Covered statements", Metric.ValueType.INT)
@@ -54,5 +54,5 @@ object ScalaMetrics {
5454
.setQualitative(false)
5555
.setDomain(CoreMetrics.DOMAIN_SIZE)
5656
.setFormula(new org.sonar.api.measures.SumChildValuesFormula(false))
57-
.create()
57+
.create[java.lang.Integer]()
5858
}

plugin/src/main/scala/com/buransky/plugins/scoverage/sensor/ScoverageSensor.scala

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ class ScoverageSensor(settings: Settings, pathResolver: PathResolver, fileSystem
4747
protected val SCOVERAGE_REPORT_PATH_PROPERTY = "sonar.scoverage.reportPath"
4848
protected lazy val scoverageReportParser: ScoverageReportParser = XmlScoverageReportParser()
4949

50-
override def shouldExecuteOnProject(project: Project): Boolean =
51-
project.getAnalysisType.isDynamic(true) && fileSystem.languages().contains(scala.getKey)
50+
override def shouldExecuteOnProject(project: Project): Boolean = fileSystem.languages().contains(scala.getKey)
5251

5352
override def analyse(project: Project, context: SensorContext) {
5453
scoverageReportPath match {
@@ -105,7 +104,7 @@ class ScoverageSensor(settings: Settings, pathResolver: PathResolver, fileSystem
105104
case null =>
106105
log.debug(LogUtil.f("Module has no statement coverage. [" + module.name + "]"))
107106
0
108-
case moduleCoveredStatementCount: Measure =>
107+
case moduleCoveredStatementCount: Measure[_] =>
109108
log.debug(LogUtil.f("Covered statement count for " + module.name + " module. [" +
110109
moduleCoveredStatementCount.getValue + "]"))
111110

@@ -120,7 +119,7 @@ class ScoverageSensor(settings: Settings, pathResolver: PathResolver, fileSystem
120119
log.debug(LogUtil.f("Module has no number of statements. [" + module.name + "]"))
121120
0
122121

123-
case moduleStatementCount: Measure =>
122+
case moduleStatementCount: Measure[_] =>
124123
log.debug(LogUtil.f("Statement count for " + module.name + " module. [" +
125124
moduleStatementCount.getValue + "]"))
126125

@@ -147,8 +146,6 @@ class ScoverageSensor(settings: Settings, pathResolver: PathResolver, fileSystem
147146
private def processFile(fileCoverage: FileStatementCoverage, context: SensorContext, directory: String) {
148147
val path = appendFilePath(directory, fileCoverage.name)
149148
val p = fileSystem.predicates()
150-
val files = fileSystem.inputFiles(p.and(p.matchesPathPattern("**/" + relativePath),
151-
p.hasLanguage(scala.getKey), p.hasType(InputFile.Type.MAIN)))
152149

153150
val pathPredicate = if (new io.File(path).isAbsolute) p.hasAbsolutePath(path) else p.matchesPathPattern("**/" + path)
154151
val files = fileSystem.inputFiles(p.and(
@@ -177,7 +174,8 @@ class ScoverageSensor(settings: Settings, pathResolver: PathResolver, fileSystem
177174

178175
private def saveMeasures(context: SensorContext, resource: Resource, statementCoverage: StatementCoverage) {
179176
context.saveMeasure(resource, createStatementCoverage(statementCoverage.rate))
180-
context.saveMeasure(resource, createStatementCount(statementCoverage.statementCount))
177+
if (context.getMeasure(CoreMetrics.STATEMENTS) == null)
178+
context.saveMeasure(resource, createStatementCount(statementCoverage.statementCount))
181179
context.saveMeasure(resource, createCoveredStatementCount(statementCoverage.coveredStatementsCount))
182180

183181
log.debug(LogUtil.f("Save measures [" + statementCoverage.rate + ", " + statementCoverage.statementCount +
@@ -212,12 +210,14 @@ class ScoverageSensor(settings: Settings, pathResolver: PathResolver, fileSystem
212210
}
213211
}
214212

215-
private def createStatementCoverage(rate: Double): Measure = new Measure(ScalaMetrics.statementCoverage, rate)
213+
private def createStatementCoverage[T <: Serializable](rate: Double): Measure[T] =
214+
new Measure[T](ScalaMetrics.statementCoverage, rate)
216215

217-
private def createStatementCount(statements: Int): Measure = new Measure(CoreMetrics.STATEMENTS, statements)
216+
private def createStatementCount[T <: Serializable](statements: Int): Measure[T] =
217+
new Measure(CoreMetrics.STATEMENTS, statements.toDouble, 0)
218218

219-
private def createCoveredStatementCount(coveredStatements: Int): Measure =
220-
new Measure(ScalaMetrics.coveredStatements, coveredStatements);
219+
private def createCoveredStatementCount[T <: Serializable](coveredStatements: Int): Measure[T] =
220+
new Measure(ScalaMetrics.coveredStatements, coveredStatements.toDouble, 0)
221221

222222
private def appendFilePath(src: String, name: String) = {
223223
val result = src match {

plugin/src/test/scala/com/buransky/plugins/scoverage/sensor/ScoverageSensorSpec.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,11 @@ class ScoverageSensorSpec extends FlatSpec with Matchers with MockitoSugar {
5858
protected def checkShouldExecuteOnProject(languages: Iterable[String], expectedResult: Boolean) {
5959
// Setup
6060
val project = mock[Project]
61-
when(project.getAnalysisType).thenReturn(AnalysisType.DYNAMIC)
6261
when(fileSystem.languages()).thenReturn(new util.TreeSet(languages))
6362

6463
// Execute & asser
6564
shouldExecuteOnProject(project) should equal(expectedResult)
6665

67-
verify(project, times(1)).getAnalysisType
6866
verify(fileSystem, times(1)).languages
6967

7068
}

plugin/src/test/scala/com/buransky/plugins/scoverage/sensor/TestSensorContext.scala

Lines changed: 76 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,51 +19,87 @@
1919
*/
2020
package com.buransky.plugins.scoverage.sensor
2121

22-
import java.lang
22+
import java.lang.Double
23+
import java.util.Date
24+
import java.{io, util}
25+
26+
import org.sonar.api.batch.fs.{InputFile, InputPath}
27+
import org.sonar.api.batch.{Event, SensorContext}
28+
import org.sonar.api.design.Dependency
29+
import org.sonar.api.measures.{Measure, MeasuresFilter, Metric}
30+
import org.sonar.api.resources.{ProjectLink, Resource}
31+
import org.sonar.api.rules.Violation
2332

24-
import org.sonar.api.batch.SensorContext
25-
import org.sonar.api.batch.fs.InputFile
26-
import org.sonar.api.resources.Resource
27-
import org.sonar.api.measures.{Measure, Metric}
2833
import scala.collection.mutable
2934

3035
class TestSensorContext extends SensorContext {
31-
private val measures = mutable.Map[String, Measure]()
32-
33-
def createEvent(x$1: org.sonar.api.resources.Resource,x$2: String,x$3: String,x$4: String,x$5: java.util.Date): org.sonar.api.batch.Event = ???
34-
def deleteEvent(x$1: org.sonar.api.batch.Event): Unit = ???
35-
def deleteLink(x$1: String): Unit = ???
36-
def getChildren(x$1: org.sonar.api.resources.Resource): java.util.Collection[org.sonar.api.resources.Resource] = ???
37-
def getDependencies(): java.util.Set[org.sonar.api.design.Dependency] = ???
38-
def getEvents(x$1: org.sonar.api.resources.Resource): java.util.List[org.sonar.api.batch.Event] = ???
39-
def getIncomingDependencies(x$1: org.sonar.api.resources.Resource): java.util.Collection[org.sonar.api.design.Dependency] = ???
40-
def getMeasure(x$1: org.sonar.api.resources.Resource,x$2: org.sonar.api.measures.Metric): org.sonar.api.measures.Measure = ???
41-
def getMeasure(x$1: org.sonar.api.measures.Metric): org.sonar.api.measures.Measure = ???
42-
def getMeasures[M](x$1: org.sonar.api.resources.Resource,x$2: org.sonar.api.measures.MeasuresFilter[M]): M = ???
43-
def getMeasures[M](x$1: org.sonar.api.measures.MeasuresFilter[M]): M = ???
44-
def getOutgoingDependencies(x$1: org.sonar.api.resources.Resource): java.util.Collection[org.sonar.api.design.Dependency] = ???
45-
def getParent(x$1: org.sonar.api.resources.Resource): org.sonar.api.resources.Resource = ???
46-
def getResource[R <: org.sonar.api.resources.Resource](x$1: R): R = ???
47-
def index(x$1: org.sonar.api.resources.Resource,x$2: org.sonar.api.resources.Resource): Boolean = ???
48-
def index(x$1: org.sonar.api.resources.Resource): Boolean = ???
49-
def isExcluded(x$1: org.sonar.api.resources.Resource): Boolean = ???
50-
def isIndexed(x$1: org.sonar.api.resources.Resource,x$2: Boolean): Boolean = ???
51-
def saveDependency(x$1: org.sonar.api.design.Dependency): org.sonar.api.design.Dependency = ???
52-
def saveLink(x$1: org.sonar.api.resources.ProjectLink): Unit = ???
53-
54-
def saveMeasure(resource: Resource, measure: Measure): Measure = {
36+
37+
private val measures = mutable.Map[String, Measure[_ <: io.Serializable]]()
38+
39+
override def saveDependency(dependency: Dependency): Dependency = ???
40+
41+
override def isExcluded(reference: Resource): Boolean = ???
42+
43+
override def deleteLink(key: String): Unit = ???
44+
45+
override def isIndexed(reference: Resource, acceptExcluded: Boolean): Boolean = ???
46+
47+
override def saveViolations(violations: util.Collection[Violation]): Unit = ???
48+
49+
override def getParent(reference: Resource): Resource = ???
50+
51+
override def getOutgoingDependencies(from: Resource): util.Collection[Dependency] = ???
52+
53+
override def saveSource(reference: Resource, source: String): Unit = ???
54+
55+
override def getMeasures[M](filter: MeasuresFilter[M]): M = ???
56+
57+
override def getMeasures[M](resource: Resource, filter: MeasuresFilter[M]): M = ???
58+
59+
override def deleteEvent(event: Event): Unit = ???
60+
61+
override def saveViolation(violation: Violation, force: Boolean): Unit = ???
62+
63+
override def saveViolation(violation: Violation): Unit = ???
64+
65+
override def saveResource(resource: Resource): String = ???
66+
67+
override def getEvents(resource: Resource): util.List[Event] = ???
68+
69+
override def getDependencies: util.Set[Dependency] = ???
70+
71+
override def getIncomingDependencies(to: Resource): util.Collection[Dependency] = ???
72+
73+
override def index(resource: Resource): Boolean = ???
74+
75+
override def index(resource: Resource, parentReference: Resource): Boolean = ???
76+
77+
override def saveLink(link: ProjectLink): Unit = ???
78+
79+
override def getMeasure[G <: io.Serializable](metric: Metric[G]): Measure[G] = measures.get(metric.getKey).orNull.asInstanceOf[Measure[G]]
80+
81+
override def getMeasure[G <: io.Serializable](resource: Resource, metric: Metric[G]): Measure[G] = ???
82+
83+
override def getChildren(reference: Resource): util.Collection[Resource] = ???
84+
85+
override def createEvent(resource: Resource, name: String, description: String, category: String, date: Date): Event = ???
86+
87+
override def getResource[R <: Resource](reference: R): R = ???
88+
89+
override def getResource(inputPath: InputPath): Resource = ???
90+
91+
override def saveMeasure(measure: Measure[_ <: io.Serializable]): Measure[_ <: io.Serializable] = ???
92+
93+
override def saveMeasure(metric: Metric[_ <: io.Serializable], value: Double): Measure[_ <: io.Serializable] = ???
94+
95+
override def saveMeasure(resource: Resource, metric: Metric[_ <: io.Serializable], value: Double): Measure[_ <: io.Serializable] = ???
96+
97+
override def saveMeasure(resource: Resource, measure: Measure[_ <: io.Serializable]): Measure[_ <: io.Serializable] = {
5598
measures.put(resource.getKey, measure)
5699
measure
57100
}
58101

59-
def saveMeasure(x$1: Resource,x$2: Metric,x$3: java.lang.Double): Measure = ???
60-
def saveMeasure(x$1: org.sonar.api.measures.Metric,x$2: java.lang.Double): org.sonar.api.measures.Measure = ???
61-
def saveMeasure(x$1: org.sonar.api.measures.Measure): org.sonar.api.measures.Measure = ???
62-
def saveResource(x$1: org.sonar.api.resources.Resource): String = ???
63-
def saveSource(x$1: org.sonar.api.resources.Resource,x$2: String): Unit = ???
64-
def saveViolation(x$1: org.sonar.api.rules.Violation): Unit = ???
65-
def saveViolation(x$1: org.sonar.api.rules.Violation,x$2: Boolean): Unit = ???
66-
def saveViolations(x$1: java.util.Collection[org.sonar.api.rules.Violation]): Unit = ???
67-
override def saveMeasure(p1: InputFile, p2: Metric, p3: lang.Double): Measure = ???
68-
override def saveMeasure(p1: InputFile, p2: Measure): Measure = ???
69-
}
102+
override def saveMeasure(inputFile: InputFile, metric: Metric[_ <: io.Serializable], value: Double): Measure[_ <: io.Serializable] = ???
103+
104+
override def saveMeasure(inputFile: InputFile, measure: Measure[_ <: io.Serializable]): Measure[_ <: io.Serializable] = ???
105+
}

plugin/src/test/scala/com/buransky/plugins/scoverage/xml/XmlScoverageReportConstructingParserSpec.scala

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,7 @@ class XmlScoverageReportConstructingParserSpec extends FlatSpec with Matchers {
4141
assert(projectCoverage.children.size.toInt === 1)
4242
projectCoverage.children.head match {
4343
case rootDir: DirectoryStatementCoverage =>
44-
assert(rootDir.name == "/")
45-
rootDir.children.head match {
46-
case homeDir: DirectoryStatementCoverage =>
47-
assert(homeDir.name == "home")
48-
case other => fail(s"This is not a home statement coverage! [$other]")
49-
}
44+
assert(rootDir.name == "a1b2c3")
5045
case other => fail(s"This is not a directory statement coverage! [$other]")
5146
}
5247
}

0 commit comments

Comments
 (0)