Skip to content

Commit

Permalink
.
Browse files Browse the repository at this point in the history
  • Loading branch information
RadoBuransky committed Feb 5, 2014
1 parent 158bf60 commit 58d0d1f
Show file tree
Hide file tree
Showing 9 changed files with 211 additions and 52 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.buransky.plugins.scoverage;

import com.buransky.plugins.scoverage.measure.ScalaMetrics;
import com.buransky.plugins.scoverage.sensor.ScoverageSensor;
import com.buransky.plugins.scoverage.language.Scala;
import com.buransky.plugins.scoverage.sensor.ScoverageSourceImporterSensor;
import com.buransky.plugins.scoverage.widget.ScoverageWidget;
import org.sonar.api.Extension;
import org.sonar.api.SonarPlugin;

Expand All @@ -13,9 +15,11 @@ public class ScoveragePlugin extends SonarPlugin {

public List<Class<? extends Extension>> getExtensions() {
final List<Class<? extends Extension>> extensions = new ArrayList<Class<? extends Extension>>();
extensions.add(ScalaMetrics.class);
extensions.add(Scala.class);
extensions.add(ScoverageSourceImporterSensor.class);
extensions.add(ScoverageSensor.class);
extensions.add(ScoverageWidget.class);

return extensions;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.buransky.plugins.scoverage.measure;

import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.Metric;
import org.sonar.api.measures.Metrics;

import java.util.Arrays;
import java.util.List;

public final class ScalaMetrics implements Metrics {
public static final String STATEMENT_COVERAGE_KEY = "scoverage";
public static final Metric STATEMENT_COVERAGE = new Metric.Builder(STATEMENT_COVERAGE_KEY,
"Statement coverage", Metric.ValueType.PERCENT)
.setDescription("Statement coverage by unit tests")
.setDirection(Metric.DIRECTION_BETTER)
.setQualitative(true)
.setDomain(CoreMetrics.DOMAIN_TESTS)
.setWorstValue(0.0)
.setBestValue(100.0)
.create();

@Override
public List<Metric> getMetrics() {
return Arrays.asList(STATEMENT_COVERAGE);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.buransky.plugins.scoverage.resource;

import com.buransky.plugins.scoverage.language.Scala;
import org.sonar.api.resources.Directory;
import org.sonar.api.resources.Language;
import org.sonar.api.resources.Resource;

public class ScalaDirectory extends Directory {
private final String name;
private final ScalaDirectory parent;

public ScalaDirectory(String key) {
super(key);

int i = getKey().lastIndexOf(SEPARATOR);
if (i > 0) {
parent = new ScalaDirectory(key.substring(0, i));
name = key.substring(i + 1);
}
else {
name = key;
parent = null;
}
}

@Override
public String getName() {
return name;
}

@Override
public Language getLanguage() {
return Scala.INSTANCE;
}

@Override
public Resource getParent() {
return parent;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.buransky.plugins.scoverage.resource;

import com.buransky.plugins.scoverage.language.Scala;
import org.sonar.api.resources.File;
import org.sonar.api.resources.Language;
import org.sonar.api.resources.Resource;

public class ScalaFile extends Resource<ScalaDirectory> {
private final File file;
private ScalaDirectory parent;

public ScalaFile(String key) {
if (key == null)
throw new IllegalArgumentException("Key cannot be null!");

file = new File(key);
setKey(key);
}

@Override
public String getName() {
return file.getName();
}

@Override
public String getLongName() {
return file.getLongName();
}

@Override
public String getDescription() {
return file.getDescription();
}

@Override
public Language getLanguage() {
return Scala.INSTANCE;
}

@Override
public String getScope() {
return file.getScope();
}

@Override
public String getQualifier() {
return file.getQualifier();
}

@Override
public ScalaDirectory getParent() {
if (parent == null) {
parent = new ScalaDirectory(file.getParent().getKey());
}
return parent;
}

@Override
public boolean matchFilePattern(String antPattern) {
return file.matchFilePattern(antPattern);
}

@Override
public String toString() {
return file.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,19 @@
import com.buransky.plugins.scoverage.ScoverageParser;
import com.buransky.plugins.scoverage.StatementCoverage;
import com.buransky.plugins.scoverage.language.Scala;
import com.buransky.plugins.scoverage.language.ScalaFile;
import com.buransky.plugins.scoverage.measure.ScalaMetrics;
import com.buransky.plugins.scoverage.resource.ScalaDirectory;
import com.buransky.plugins.scoverage.resource.ScalaFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.batch.CoverageExtension;
import org.sonar.api.batch.Sensor;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.CoverageMeasuresBuilder;
import org.sonar.api.measures.Measure;
import org.sonar.api.resources.*;
import org.sonar.api.resources.File;
import scala.collection.JavaConversions;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

Expand All @@ -42,60 +41,46 @@ public String toString() {
private void processProject(ParentStatementCoverage projectCoverage,
Project project, SensorContext context) {
// Save project measure
context.saveMeasure(project, new Measure(CoreMetrics.COVERAGE, projectCoverage.rate()));
context.saveMeasure(project, createStatementCoverage(projectCoverage.rate()));
log("Project coverage = " + projectCoverage.rate());

// Process children
processChildren(projectCoverage.children(), project, context, "");
processChildren(projectCoverage.children(), context, "");
}

private void processDirectory(ParentStatementCoverage directoryCoverage,
Project project, SensorContext context,
String directory) {
log("Process directory [" + directoryCoverage.name() + "]");
private void processDirectory(ParentStatementCoverage directoryCoverage, SensorContext context,
String parentDirectory) {
String currentDirectory = appendFilePath(parentDirectory, directoryCoverage.name());

// Save directory measure
//context.saveMeasure(project, new Measure(CoreMetrics.COVERAGE, directoryCoverage.rate()));
ScalaDirectory directory = new ScalaDirectory(currentDirectory);
context.saveMeasure(directory, createStatementCoverage(directoryCoverage.rate()));

// Process children
processChildren(directoryCoverage.children(), project, context,
appendFilePath(directory, directoryCoverage.name()));
}
log("Process directory [" + directory.getKey() + ", " + directoryCoverage.rate() + "]");

private String appendFilePath(String src, String name) {
String result;
if (!src.isEmpty())
result = src + java.io.File.separator;
else
result = "";

return result + name;
// Process children
processChildren(directoryCoverage.children(), context, currentDirectory);
}

private void processFile(FileStatementCoverage fileCoverage, SensorContext context,
String directory) {
File scalaSourcefile = new ScalaFile(appendFilePath(directory, fileCoverage.name()));
context.saveMeasure(scalaSourcefile, new Measure(CoreMetrics.COVERAGE, fileCoverage.rate()));
ScalaFile scalaSourcefile = new ScalaFile(appendFilePath(directory, fileCoverage.name()));
context.saveMeasure(scalaSourcefile, createStatementCoverage(fileCoverage.rate()));

log("Process file [" + scalaSourcefile.getKey() + ", " + fileCoverage.rate() + "]");
}

private void processChildren(scala.collection.Iterable<StatementCoverage> children,
Project project, SensorContext context,
private void processChildren(scala.collection.Iterable<StatementCoverage> children, SensorContext context,
String directory) {
log("Process children [" + directory + "]");

// Process children
for (StatementCoverage child: JavaConversions.asJavaIterable(children)) {
processChild(child, project, context, directory);
processChild(child, context, directory);
}
}

private void processChild(StatementCoverage dirOrFile,
Project project, SensorContext context,
private void processChild(StatementCoverage dirOrFile, SensorContext context,
String directory) {
if (dirOrFile instanceof ParentStatementCoverage) {
processDirectory((ParentStatementCoverage) dirOrFile, project, context, directory);
processDirectory((ParentStatementCoverage) dirOrFile, context, directory);
}
else {
if (dirOrFile instanceof FileStatementCoverage) {
Expand All @@ -108,6 +93,21 @@ private void processChild(StatementCoverage dirOrFile,
}
}

private Measure createStatementCoverage(Double rate) {
return new Measure(ScalaMetrics.STATEMENT_COVERAGE, rate);
}

private String appendFilePath(String src, String name) {
String result;
if (!src.isEmpty())
result = src + java.io.File.separator;
else
result = "";

return result + name;
}


private static void log(String message) {
log.info("[Scoverage] " + message);
}
Expand All @@ -117,7 +117,7 @@ private void parseFakeReport(Project project, final SensorContext context) {

HashMap<String, Directory> dirs = new HashMap<String, Directory>();
for (InputFile sourceFile : fileSystem.mainFiles("scala")) {
File scalaSourcefile = new ScalaFile(File.fromIOFile(sourceFile.getFile(), project).getKey());
ScalaFile scalaSourcefile = new ScalaFile(File.fromIOFile(sourceFile.getFile(), project).getKey());

context.saveMeasure(scalaSourcefile, new Measure(CoreMetrics.COVERAGE, 51.4));
log("Process fake file [" + scalaSourcefile.getKey() + "]");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.buransky.plugins.scoverage.sensor;

import com.buransky.plugins.scoverage.language.Scala;
import com.buransky.plugins.scoverage.language.ScalaFile;
import com.buransky.plugins.scoverage.resource.ScalaFile;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -39,15 +39,18 @@ public void analyse(Project project, SensorContext sensorContext) {
}
}

@Override
public String toString() {
return "Scoverage source importer";
}

private void addFileToSonar(Project project, SensorContext sensorContext, InputFile inputFile,
String charset) {
try {
String source = FileUtils.readFileToString(inputFile.getFile(), charset);
ScalaFile resource = new ScalaFile(File.fromIOFile(inputFile.getFile(), project).getKey());
if (resource == null) {
LOGGER.warn("[ScoverageSourceImporterSensor] Resource null! " + inputFile.getRelativePath());
return;
}

String key = File.fromIOFile(inputFile.getFile(), project).getKey();
ScalaFile resource = new ScalaFile(key);

sensorContext.index(resource);
sensorContext.saveSource(resource, source);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.buransky.plugins.scoverage.widget;

import org.sonar.api.web.AbstractRubyTemplate;
import org.sonar.api.web.RubyRailsWidget;

public class ScoverageWidget extends AbstractRubyTemplate implements RubyRailsWidget {

public String getId() {
return "scoverage";
}

public String getTitle() {
return "Statement coverage";
}

@Override
protected String getTemplatePath() {
return "/com/buransky/plugins/scoverage/widget.html.erb";
}
}
10 changes: 10 additions & 0 deletions src/main/resources/com/buransky/plugins/scoverage/widget.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<% measure=measure('scoverage')
if measure
%>
<div class="dashbox">
<h3>
Statement coverage : <%= format_measure(measure, :suffix => ' %') %>
<%= dashboard_configuration.selected_period? ? format_variation(measure) : trend_icon(measure) -%>
</h3>
</div>
<% end %>

0 comments on commit 58d0d1f

Please sign in to comment.