Skip to content

Use minimum_severity when reporting issues #47

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 19, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,17 @@ engines:
- app/src/test/**
```

### Severity
Ignore issues with severity below the minimum:
```
engines:
sonar-java:
enabled: true
config:
minimum_severity: critical # default: major
# valid values are: info, minor, major, critical, blocker
```

## Sonar Documentation

http://www.sonarlint.org/commandline
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/cc/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static void execute(System2 system) {
Charset charset = config.getCharset();

InputFileFinder fileFinder = new Finder(config.getIncludePaths(), config.getTestsPatterns(), charset);
ReportFactory reportFactory = new cc.report.ReportFactory(charset);
ReportFactory reportFactory = new cc.report.ReportFactory(charset, config.getMinimumSeverity());
ConfigurationReader reader = new ConfigurationReader();
SonarLintFactory sonarLintFactory = new SonarLintFactory(reader, config.getSonarlintDir());
Path projectHome = getProjectHome(system);
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/cc/Config.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cc;

import cc.models.Severity;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
Expand Down Expand Up @@ -38,6 +39,11 @@ public Path getSonarlintDir() {
return Paths.get("/tmp/sonarlint");
}

public Severity getMinimumSeverity() {
String severity = (String) config.get("minimum_severity");
return Severity.from(severity, Severity.MAJOR);
}

@Override
public Properties properties() {
Properties properties = super.properties();
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/cc/models/CodeClimateIssue.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
public class CodeClimateIssue {
public final String type = "issue";
public final String checkName;
public final String severity;
public final Severity severity;
public final String description;
public final Content content;
public final Location location;
public final Categories categories;

public CodeClimateIssue(String checkName, String severity, String description, Content content, Location location, Categories categories) {
public CodeClimateIssue(String checkName, Severity severity, String description, Content content, Location location, Categories categories) {
this.checkName = checkName;
this.severity = severity;
this.description = description;
Expand All @@ -24,7 +24,7 @@ public CodeClimateIssue(String checkName, String severity, String description, C
public static CodeClimateIssue from(Issue issue, RuleDetails ruleDetails, String baseDir) {
String checkName = issue.getRuleKey();
String description = issue.getMessage();
String severity = Severity.from(ruleDetails);
Severity severity = Severity.from(ruleDetails);
Content content = Content.from(ruleDetails);
Location location = Location.from(baseDir, issue);
Categories categories = Categories.from(ruleDetails);
Expand Down
28 changes: 24 additions & 4 deletions src/main/java/cc/models/Severity.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,33 @@
import com.google.gson.annotations.SerializedName;
import org.sonarsource.sonarlint.core.client.api.common.RuleDetails;

public class Severity {
import static java.util.Optional.ofNullable;

public static String from(RuleDetails ruleDetails) {
public enum Severity {
@SerializedName("info")
INFO,
@SerializedName("minor")
MINOR,
@SerializedName("major")
MAJOR,
@SerializedName("critical")
CRITICAL,
@SerializedName("blocker")
BLOCKER;

public static Severity from(RuleDetails ruleDetails) {
String severity = ruleDetails.getSeverity();
if(severity == null) {
return from(severity);
}

public static Severity from(String severity) {
if (severity == null) {
return null;
}
return severity.toLowerCase();
return valueOf(severity.toUpperCase());
}

public static Severity from(String severity, Severity defaultValue) {
return ofNullable(from(severity)).orElse(defaultValue);
}
}
10 changes: 8 additions & 2 deletions src/main/java/cc/report/JsonReport.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cc.report;

import cc.models.CodeClimateIssue;
import cc.models.Severity;
import cc.serialization.GsonFactory;
import com.google.gson.Gson;
import org.sonarsource.sonarlint.core.client.api.common.RuleDetails;
Expand All @@ -15,9 +16,11 @@
public class JsonReport implements org.sonarlint.cli.report.Reporter {

final Gson gson;
final Severity minimumSeverity;
final String baseDir;

public JsonReport(String baseDir) {
public JsonReport(Severity minimumSeverity, String baseDir) {
this.minimumSeverity = minimumSeverity;
this.baseDir = baseDir;
this.gson = new GsonFactory().create();
}
Expand All @@ -29,7 +32,10 @@ public void execute(String projectName, Date date, Collection<Trackable> trackab
RuleDetails ruleDetails = ruleDescriptionProducer.apply(issue.getRuleKey());

CodeClimateIssue codeClimateIssue = CodeClimateIssue.from(issue, ruleDetails, baseDir);
System.out.println(gson.toJson(codeClimateIssue) + "\0");
Severity severity = codeClimateIssue.severity;
if (severity!= null && severity.compareTo(minimumSeverity) >= 0) {
System.out.println(gson.toJson(codeClimateIssue) + "\0");
}
}
}
}
9 changes: 7 additions & 2 deletions src/main/java/cc/report/ReportFactory.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cc.report;

import cc.models.Severity;
import org.sonarlint.cli.report.Reporter;

import java.nio.charset.Charset;
Expand All @@ -8,12 +9,16 @@
import java.util.List;

public class ReportFactory extends org.sonarlint.cli.report.ReportFactory {
public ReportFactory(Charset charset) {

Severity minimumSeverity;

public ReportFactory(Charset charset, Severity minimumSeverity) {
super(charset);
this.minimumSeverity = minimumSeverity;
}

@Override
public List<Reporter> createReporters(Path basePath) {
return Arrays.asList(new JsonReport(basePath.toString()));
return Arrays.asList(new JsonReport(minimumSeverity, basePath.toString()));
}
}
14 changes: 14 additions & 0 deletions src/test/java/cc/ConfigTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cc;

import cc.models.Severity;
import org.junit.Test;

import java.nio.charset.Charset;
Expand Down Expand Up @@ -33,6 +34,18 @@ public void defaults_charset_to_utf8() throws Exception {
assertThat(config.getCharset()).isEqualTo(Charset.forName("UTF-8"));
}

@Test
public void fetch_minimum_severity() throws Exception {
Config config = Config.gson().fromJson("{\"config\":{\"minimum_severity\":\"critical\"}}", Config.class);
assertThat(config.getMinimumSeverity()).isEqualTo(Severity.CRITICAL);
}

@Test
public void defaults_minimum_severity_to_major() throws Exception {
Config config = Config.gson().fromJson("{}", Config.class);
assertThat(config.getMinimumSeverity()).isEqualTo(Severity.MAJOR);
}

@Test
public void fetch_tests_patterns() throws Exception {
Config config = Config.gson().fromJson("{\"config\":{\"tests_patterns\":[\"src/test/**\",\"src/test2/**\"]}}", Config.class);
Expand All @@ -44,6 +57,7 @@ public void null_tests_patterns_does_not_cause_error() throws Exception {
Config config = Config.gson().fromJson("{\"config\":{}}", Config.class);
assertThat(config.getTestsPatterns()).isNull();
}

@Test
public void has_default_work_dir() throws Exception {
Config config = Config.gson().fromJson("{}", Config.class);
Expand Down
10 changes: 4 additions & 6 deletions src/test/java/cc/models/CodeClimateIssueTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,15 @@

public class CodeClimateIssueTest {

private Gson gson = new GsonFactory().create();

@Test
public void down_case_severities() throws Exception {
assertThat(createIssueForSeverity("MAJOR").severity).isEqualTo("major");
assertThat(createIssueForSeverity("MINOR").severity).isEqualTo("minor");
assertThat(createIssueForSeverity("CRITICAL").severity).isEqualTo("critical");
assertThat(createIssueForSeverity(null).severity).isNull();
public void down_case_severities_uppon_serialization() throws Exception {
assertThat(gson.toJson(createIssueForSeverity("CRITICAL"))).contains("critical");
}

@Test
public void properly_serialize_severity() throws Exception {
Gson gson = new GsonFactory().create();
assertThat(gson.toJson(createIssueForSeverity("INFO"))).contains("\"severity\":\"info\"");
}

Expand Down
16 changes: 16 additions & 0 deletions src/test/java/cc/models/SeverityTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package cc.models;

import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class SeverityTest {

@Test
public void has_order_of_importance() throws Exception {
assertThat(Severity.BLOCKER).isGreaterThan(Severity.CRITICAL);
assertThat(Severity.CRITICAL).isGreaterThan(Severity.MAJOR);
assertThat(Severity.MAJOR).isGreaterThan(Severity.MINOR);
assertThat(Severity.MINOR).isGreaterThan(Severity.INFO);
}
}
29 changes: 20 additions & 9 deletions src/test/java/cc/report/JsonReportTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cc.report;

import cc.models.Severity;
import org.junit.Before;
import org.junit.Test;
import org.sonarsource.sonarlint.core.client.api.common.RuleDetails;
Expand Down Expand Up @@ -36,28 +37,38 @@ public void serialize_issue_relative_path() throws Exception {
assertThat(output.stdout.toString()).contains("\"path\":\"dir/file.java\"");
}

@Test
public void does_not_include_unknown_severity() throws Exception {
executeReport(null, new FakeIssue("file.java", 0, 1));
assertThat(output.stdout.toString()).doesNotContain("severity");
}

@Test
public void does_not_include_unknown_path() throws Exception {
executeReport("major", new FakeIssue(null, 1, 0));
assertThat(output.stdout.toString()).doesNotContain("path");
}

@Test
public void does_not_report_issue_below_minimum_severity() throws Exception {
executeReport(Severity.INFO,null, new FakeIssue(null, 1, 0));
assertThat(output.stdout.toString()).isEmpty();

executeReport(Severity.CRITICAL,"major", new FakeIssue(null, 1, 0));
assertThat(output.stdout.toString()).isEmpty();

executeReport(Severity.CRITICAL,"critical", new FakeIssue(null, 1, 0));
assertThat(output.stdout.toString()).contains("issue");
}

@Test
public void unknown_location_defaults_to_first_line() throws Exception {
executeReport("major", new FakeIssue("file.java", null, null));
assertThat(output.stdout.toString()).contains("\"lines\":{\"begin\":1,\"end\":1}");
assertThat(output.stderr.toString()).contains("File location was not provided, defaulting to line 1");
}

void executeReport(String severity, FakeIssue issue) {
RuleDetails ruleDetails = new FakeRuleDetails(severity);
void executeReport(String ruleSeverity, FakeIssue issue) {
executeReport(Severity.MAJOR, ruleSeverity, issue);
}

void executeReport(Severity minimumSeverity, String ruleSeverity, FakeIssue issue) {
RuleDetails ruleDetails = new FakeRuleDetails(ruleSeverity);
List<Trackable> trackables = asList(new FakeTrackable(issue));
new JsonReport("/tmp").execute("prj", new Date(0), trackables, null, _ruleKey -> ruleDetails);
new JsonReport(minimumSeverity, "/tmp").execute("prj", new Date(0), trackables, null, _ruleKey -> ruleDetails);
}
}
15 changes: 0 additions & 15 deletions src/test/resources/sanity_check_expected_issues.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,6 @@
"Bug Risk"
]
},
{
"type": "issue",
"check_name": "squid:S1220",
"severity": "minor",
"description": "Move this file to a named package.",
"content": {
"body": "<p>According to the Java Language Specification:</p>\n<blockquote>\n <p>Unnamed packages are provided by the Java platform principally for convenience when developing small or temporary applications or when just\n beginning development.</p>\n</blockquote>\n<p>To enforce this best practice, classes located in default package can no longer be accessed from named ones since Java 1.4.</p>\n<h2>Noncompliant Code Example</h2>\n<pre>\npublic class MyClass { /* ... */ }\n</pre>\n<h2>Compliant Solution</h2>\n<pre>\npackage org.example;\n\npublic class MyClass{ /* ... */ }\n</pre>"
},
"location": {
"path": "main/java/Library.java"
},
"categories": [
"Bug Risk"
]
},
{
"type": "issue",
"check_name": "squid:S1186",
Expand Down