Skip to content

Commit 1a851de

Browse files
author
demerson
committed
commit updates for compatibility with Sonar 4.5.2 and up
1 parent deec9c4 commit 1a851de

20 files changed

Lines changed: 769 additions & 736 deletions

pom.xml

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,34 @@
66
<groupId>com.godaddy.sonar</groupId>
77
<artifactId>sonar-ruby-plugin</artifactId>
88
<packaging>sonar-plugin</packaging>
9-
<version>1.0.0</version>
9+
<version>1.0.1</version>
1010

1111
<name>Sonar Ruby Plugin</name>
1212
<description>Plugin to report ruby code coverage into sonar</description>
1313

1414
<properties>
1515
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
16-
<sonar.buildVersion>3.5.1</sonar.buildVersion>
16+
<sonar.buildVersion>4.5.2</sonar.buildVersion>
1717
<jdk.min.version>1.6</jdk.min.version>
18+
<jacoco-maven-version>0.7.4.201502262128</jacoco-maven-version>
1819
</properties>
1920

2021
<dependencies>
2122
<dependency>
2223
<groupId>org.yaml</groupId>
2324
<artifactId>snakeyaml</artifactId>
24-
<version>1.12</version>
25+
<version>1.16</version>
2526
</dependency>
2627

2728
<dependency>
2829
<groupId>org.codehaus.sonar</groupId>
2930
<artifactId>sonar-plugin-api</artifactId>
3031
<version>${sonar.buildVersion}</version>
31-
<scope>provided</scope>
32+
</dependency>
33+
<dependency>
34+
<groupId>org.codehaus.sonar</groupId>
35+
<artifactId>sonar-batch</artifactId>
36+
<version>${sonar.buildVersion}</version>
3237
</dependency>
3338

3439
<!-- unit tests -->
@@ -47,7 +52,7 @@
4752
<dependency>
4853
<groupId>org.easymock</groupId>
4954
<artifactId>easymock</artifactId>
50-
<version>3.2</version>
55+
<version>3.3.1</version>
5156
<scope>test</scope>
5257
</dependency>
5358
<dependency>
@@ -68,6 +73,16 @@
6873
<version>2.2.1</version>
6974
<scope>test</scope>
7075
</dependency>
76+
<dependency>
77+
<groupId>org.slf4j</groupId>
78+
<artifactId>slf4j-log4j12</artifactId>
79+
<version>1.7.12</version>
80+
</dependency>
81+
<dependency>
82+
<groupId>commons-configuration</groupId>
83+
<artifactId>commons-configuration</artifactId>
84+
<version>1.9</version>
85+
</dependency>
7186

7287
</dependencies>
7388

@@ -85,7 +100,7 @@
85100
<plugin>
86101
<groupId>org.apache.maven.plugins</groupId>
87102
<artifactId>maven-compiler-plugin</artifactId>
88-
<version>2.5.1</version>
103+
<version>3.2</version>
89104
<configuration>
90105
<source>${jdk.min.version}</source>
91106
<target>${jdk.min.version}</target>
@@ -108,7 +123,7 @@
108123
<plugin>
109124
<groupId>org.jacoco</groupId>
110125
<artifactId>jacoco-maven-plugin</artifactId>
111-
<version>0.6.3.201306030806</version>
126+
<version>${jacoco-maven-version}</version>
112127
<configuration>
113128
<destfile>${basedir}/target/jacoco.exec</destfile>
114129
</configuration>
@@ -131,12 +146,12 @@
131146
<plugin>
132147
<groupId>org.apache.maven.plugins</groupId>
133148
<artifactId>maven-surefire-plugin</artifactId>
134-
<version>2.15</version>
149+
<version>2.18.1</version>
135150
<dependencies>
136151
<dependency>
137152
<groupId>org.apache.maven.surefire</groupId>
138153
<artifactId>surefire-junit47</artifactId>
139-
<version>2.15</version>
154+
<version>2.18.1</version>
140155
</dependency>
141156
</dependencies>
142157
</plugin>
@@ -190,6 +205,19 @@
190205
</lifecycleMappingMetadata>
191206
</configuration>
192207
</plugin>
208+
<plugin>
209+
<groupId>org.apache.maven.plugins</groupId>
210+
<artifactId>maven-source-plugin</artifactId>
211+
<version>2.2.1</version>
212+
<executions>
213+
<execution>
214+
<id>attach-sources</id>
215+
<goals>
216+
<goal>jar</goal>
217+
</goals>
218+
</execution>
219+
</executions>
220+
</plugin>
193221
</plugins>
194222
</pluginManagement>
195223
</build>
Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,82 @@
11
package com.godaddy.sonar.ruby;
22

3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
import org.sonar.api.CoreProperties;
8+
import org.sonar.api.Properties;
9+
import org.sonar.api.PropertyType;
10+
import org.sonar.api.SonarPlugin;
11+
import org.sonar.api.config.PropertyDefinition;
12+
import org.sonar.api.resources.Qualifiers;
13+
314
import com.godaddy.sonar.ruby.core.Ruby;
415
import com.godaddy.sonar.ruby.core.RubySourceCodeColorizer;
5-
import com.godaddy.sonar.ruby.core.RubySourceImporter;
616
import com.godaddy.sonar.ruby.core.profiles.SonarWayProfile;
717
import com.godaddy.sonar.ruby.metricfu.MetricfuComplexitySensor;
818
import com.godaddy.sonar.ruby.metricfu.MetricfuComplexityYamlParserImpl;
919
import com.godaddy.sonar.ruby.simplecovrcov.SimpleCovRcovJsonParserImpl;
1020
import com.godaddy.sonar.ruby.simplecovrcov.SimpleCovRcovSensor;
1121

12-
import org.sonar.api.Extension;
13-
import org.sonar.api.Properties;
14-
import org.sonar.api.SonarPlugin;
15-
16-
import java.util.ArrayList;
17-
import java.util.List;
18-
1922
/**
2023
* This class is the entry point for all extensions
2124
*/
2225
@Properties({})
2326
public final class RubyPlugin extends SonarPlugin
2427
{
28+
public static final String SIMPLECOVRCOV_REPORT_PATH_PROPERTY = "sonar.simplecovrcov.reportPath";
29+
public static final String METRICFU_REPORT_PATH_PROPERTY = "sonar.metricfu.reportPath";
30+
public static final String METRICFU_COMPLEXITY_METRIC_PROPERTY = "sonar.metricfu.complexityMetric";
31+
32+
public List<Object> getExtensions()
33+
{
34+
List<Object> extensions = new ArrayList<Object>();
35+
extensions.add(Ruby.class);
36+
extensions.add(SimpleCovRcovSensor.class);
37+
extensions.add(SimpleCovRcovJsonParserImpl.class);
38+
extensions.add(MetricfuComplexityYamlParserImpl.class);
39+
extensions.add(RubySourceCodeColorizer.class);
40+
extensions.add(RubySensor.class);
41+
extensions.add(MetricfuComplexitySensor.class);
42+
43+
// Profiles
44+
extensions.add(SonarWayProfile.class);
45+
46+
PropertyDefinition metricfuReportPath = PropertyDefinition.builder(METRICFU_REPORT_PATH_PROPERTY)
47+
.category(CoreProperties.CATEGORY_CODE_COVERAGE)
48+
.subCategory("Ruby Coverage")
49+
.name("MetricFu Report path")
50+
.description("Path (absolute or relative) to MetricFu yml report file.")
51+
.defaultValue("tmp/metric_fu/report.yml")
52+
.onQualifiers(Qualifiers.PROJECT)
53+
.build();
54+
extensions.add(metricfuReportPath);
55+
56+
PropertyDefinition simplecovrcovReportPath = PropertyDefinition.builder(SIMPLECOVRCOV_REPORT_PATH_PROPERTY)
57+
.category(CoreProperties.CATEGORY_CODE_COVERAGE)
58+
.subCategory("Ruby Coverage")
59+
.name("SimpleCovRcov Report path")
60+
.description("Path (absolute or relative) to SimpleCovRcov json report file.")
61+
.defaultValue("coverage/.resultset.json")
62+
.onQualifiers(Qualifiers.PROJECT)
63+
.build();
64+
extensions.add(simplecovrcovReportPath);
65+
66+
List<String> options = Arrays.asList("Saikuro", "Cane");
67+
68+
PropertyDefinition ComplexityMetric = PropertyDefinition.builder(METRICFU_COMPLEXITY_METRIC_PROPERTY)
69+
.category(CoreProperties.CATEGORY_CODE_COVERAGE)
70+
.subCategory("Ruby Coverage")
71+
.name("MetricFu Complexity Metric")
72+
.description("Type of complexity, Saikuro or Cane")
73+
.defaultValue("Saikuro")
74+
.onQualifiers(Qualifiers.PROJECT)
75+
.type(PropertyType.SINGLE_SELECT_LIST)
76+
.options(options)
77+
.build();
78+
extensions.add(ComplexityMetric);
2579

26-
public List<Class<? extends Extension>> getExtensions()
27-
{
28-
List<Class<? extends Extension>> extensions = new ArrayList<Class<? extends Extension>>();
29-
extensions.add(Ruby.class);
30-
extensions.add(SimpleCovRcovSensor.class);
31-
extensions.add(SimpleCovRcovJsonParserImpl.class);
32-
extensions.add(MetricfuComplexityYamlParserImpl.class);
33-
extensions.add(RubySourceImporter.class);
34-
extensions.add(RubySourceCodeColorizer.class);
35-
extensions.add(RubySensor.class);
36-
extensions.add(MetricfuComplexitySensor.class);
37-
38-
// Profiles
39-
extensions.add(SonarWayProfile.class);
40-
41-
return extensions;
42-
}
80+
return extensions;
81+
}
4382
}
Lines changed: 68 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,94 @@
11
package com.godaddy.sonar.ruby;
22

3-
import com.godaddy.sonar.ruby.core.Ruby;
4-
import com.godaddy.sonar.ruby.core.RubyFile;
5-
import com.godaddy.sonar.ruby.core.RubyPackage;
6-
import com.godaddy.sonar.ruby.core.RubyRecognizer;
7-
import com.godaddy.sonar.ruby.parsers.CommentCountParser;
3+
import java.io.File;
4+
import java.io.Reader;
5+
import java.io.StringReader;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Set;
89

910
import org.apache.commons.io.FileUtils;
1011
import org.apache.commons.io.IOUtils;
1112
import org.sonar.api.batch.Sensor;
1213
import org.sonar.api.batch.SensorContext;
14+
import org.sonar.api.batch.fs.FilePredicate;
15+
import org.sonar.api.batch.fs.FilePredicates;
16+
import org.sonar.api.batch.fs.FileSystem;
17+
import org.sonar.api.batch.fs.InputFile;
18+
import org.sonar.api.config.Settings;
1319
import org.sonar.api.measures.CoreMetrics;
1420
import org.sonar.api.resources.Project;
15-
import org.sonar.api.scan.filesystem.FileQuery;
16-
import org.sonar.api.scan.filesystem.ModuleFileSystem;
17-
import org.sonar.api.utils.SonarException;
1821
import org.sonar.squid.measures.Metric;
1922
import org.sonar.squid.text.Source;
2023

21-
import java.io.File;
22-
import java.io.Reader;
23-
import java.io.StringReader;
24-
import java.util.HashSet;
25-
import java.util.List;
26-
import java.util.Set;
24+
import com.godaddy.sonar.ruby.core.RubyFile;
25+
import com.godaddy.sonar.ruby.core.RubyPackage;
26+
import com.godaddy.sonar.ruby.core.RubyRecognizer;
27+
import com.godaddy.sonar.ruby.parsers.CommentCountParser;
28+
import com.google.common.collect.Lists;
2729

2830
public class RubySensor implements Sensor
2931
{
30-
private ModuleFileSystem moduleFileSystem;
32+
// private ModuleFileSystem moduleFileSystem;
33+
private Settings settings;
34+
private FileSystem fs;
3135

32-
public RubySensor(ModuleFileSystem moduleFileSystem)
33-
{
34-
this.moduleFileSystem = moduleFileSystem;
35-
}
36+
public RubySensor(Settings settings, FileSystem fs) {
37+
this.settings = settings;
38+
this.fs = fs;
39+
}
3640

37-
public boolean shouldExecuteOnProject(Project project)
38-
{
39-
return Ruby.KEY.equals(project.getLanguageKey());
40-
}
41+
@Override
42+
public boolean shouldExecuteOnProject(Project project) {
43+
// This sensor is executed only when there are Ruby files
44+
return fs.hasFiles(fs.predicates().hasLanguage("ruby"));
45+
}
4146

42-
public void analyse(Project project, SensorContext context)
43-
{
44-
computeBaseMetrics(context, project);
45-
}
47+
public void analyse(Project project, SensorContext context)
48+
{
49+
computeBaseMetrics(context, project);
50+
}
4651

47-
protected void computeBaseMetrics(SensorContext sensorContext, Project project)
52+
protected void computeBaseMetrics(SensorContext sensorContext, Project project)
53+
{
54+
Reader reader = null;
55+
FilePredicate filePredicate = fs.predicates().hasLanguage("ruby");
56+
List<InputFile> sourceFiles = Lists.newArrayList(fs.inputFiles(filePredicate));
57+
58+
Set<RubyPackage> packageList = new HashSet<RubyPackage>();
59+
for (InputFile rubyFile : sourceFiles)
4860
{
49-
Reader reader = null;
50-
List<File> sourceDirs = moduleFileSystem.sourceDirs();
61+
try
62+
{
63+
File fileRuby = rubyFile.file();
64+
reader = new StringReader(FileUtils.readFileToString(fileRuby, fs.encoding().name()));
65+
RubyFile resource = new RubyFile(fileRuby, sourceFiles);
66+
Source source = new Source(reader, new RubyRecognizer());
67+
packageList.add(new RubyPackage(resource.getParent().getKey()));
5168

52-
Set<RubyPackage> packageList = new HashSet<RubyPackage>();
53-
for (File rubyFile : moduleFileSystem.files(FileQuery.onSource().onLanguage(project.getLanguageKey())))
54-
{
55-
try
56-
{
57-
reader = new StringReader(FileUtils.readFileToString(rubyFile, moduleFileSystem.sourceCharset().name()));
58-
RubyFile resource = new RubyFile(rubyFile, sourceDirs);
59-
Source source = new Source(reader, new RubyRecognizer());
60-
packageList.add(new RubyPackage(resource.getParent().getKey()));
69+
sensorContext.saveMeasure(rubyFile, CoreMetrics.NCLOC, (double) source.getMeasure(Metric.LINES_OF_CODE));
70+
int numCommentLines = CommentCountParser.countLinesOfComment(fileRuby);
6171

62-
sensorContext.saveMeasure(resource, CoreMetrics.LINES, (double) source.getMeasure(Metric.LINES));
63-
sensorContext.saveMeasure(resource, CoreMetrics.NCLOC, (double) source.getMeasure(Metric.LINES_OF_CODE));
64-
int numCommentLines = CommentCountParser.countLinesOfComment(rubyFile);
65-
sensorContext.saveMeasure(resource, CoreMetrics.COMMENT_LINES, (double) numCommentLines);
66-
sensorContext.saveMeasure(resource, CoreMetrics.FILES, 1.0);
67-
sensorContext.saveMeasure(resource, CoreMetrics.CLASSES, 1.0);
68-
} catch (Exception e)
69-
{
70-
throw new SonarException("Error computing base metrics for project.", e);
71-
} finally
72-
{
73-
IOUtils.closeQuietly(reader);
74-
}
75-
}
76-
for (RubyPackage pack : packageList)
77-
{
78-
sensorContext.saveMeasure(pack, CoreMetrics.PACKAGES, 1.0);
79-
}
72+
sensorContext.saveMeasure(rubyFile, CoreMetrics.COMMENT_LINES, (double) numCommentLines);
73+
sensorContext.saveMeasure(rubyFile, CoreMetrics.FILES, 1.0);
74+
sensorContext.saveMeasure(rubyFile, CoreMetrics.CLASSES, 1.0);
75+
} catch (Exception e)
76+
{
77+
throw new IllegalStateException("Error computing base metrics for project.", e);
78+
} finally
79+
{
80+
IOUtils.closeQuietly(reader);
81+
}
8082
}
81-
82-
@Override
83-
public String toString()
83+
for (RubyPackage pack : packageList)
8484
{
85-
return getClass().getSimpleName();
85+
sensorContext.saveMeasure(pack, CoreMetrics.PACKAGES, 1.0);
8686
}
87+
}
88+
89+
@Override
90+
public String toString()
91+
{
92+
return getClass().getSimpleName();
93+
}
8794
}

0 commit comments

Comments
 (0)