Skip to content

Commit b7aee2f

Browse files
committed
DiffParser #95
1 parent 513d19e commit b7aee2f

File tree

8 files changed

+213
-0
lines changed

8 files changed

+213
-0
lines changed

CHANGELOG.md

+9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@
33

44
Changelog of Violations lib.
55

6+
## Unreleased
7+
### GitHub [#95](https://github.com/tomasbjerre/violations-lib/issues/95) Add support for "suggested change" *enhancement*
8+
9+
**DiffParser**
10+
11+
12+
[e282c85c4e58980](https://github.com/tomasbjerre/violations-lib/commit/e282c85c4e58980) Tomas Bjerre *2020-09-06 07:03:03*
13+
14+
615
## 1.127
716
### GitHub [#95](https://github.com/tomasbjerre/violations-lib/issues/95) Add support for "suggested change" *enhancement*
817

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ A number of **parsers** have been implemented. Some **parsers** can parse output
5353
| [_PHPCS_](https://github.com/squizlabs/PHP_CodeSniffer) | `CHECKSTYLE` | With `phpcs api.php --report=checkstyle`.
5454
| [_PHPPMD_](https://phpmd.org/) | `PMD` | With `phpmd api.php xml ruleset.xml`.
5555
| [_PMD_](https://pmd.github.io/) | `PMD` |
56+
| [_Patch_](https://en.wikipedia.org/wiki/Diff) | `DIFF` | Unidiff, often used by the `patch` program.
5657
| [_Pep8_](https://github.com/PyCQA/pycodestyle) | `FLAKE8` |
5758
| [_PerlCritic_](https://github.com/Perl-Critic) | `PERLCRITIC` |
5859
| [_PiTest_](http://pitest.org/) | `PITEST` |

build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@ apply from: project.buildscript.classLoader.getResource('release.gradle').toURI(
2121

2222
dependencies {
2323
compile 'com.google.code.gson:gson:2.8.2'
24+
compile 'io.github.java-diff-utils:java-diff-utils:4.8-SNAPSHOT'
2425
compileOnly 'com.github.spotbugs:spotbugs-annotations:3.1.12'
2526
testCompile 'junit:junit:4.12'
2627
testCompile 'org.assertj:assertj-core:2.3.0'
2728
testCompile 'uk.co.jemos.podam:podam:7.2.1.RELEASE'
2829
}
2930

3031
shadowJar {
32+
relocate 'io.github', safeJavaIdentidier(project.group + '.' + project.name + '.io.github')
3133
relocate 'com.google', safeJavaIdentidier(project.group + '.' + project.name + '.com.google')
3234
relocate 'com.jakewharton', safeJavaIdentidier(project.group + '.' + project.name + '.com.jakewharton')
3335
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package se.bjurr.violations.lib.parsers;
2+
3+
import static com.github.difflib.patch.DeltaType.CHANGE;
4+
import static com.github.difflib.patch.DeltaType.DELETE;
5+
import static com.github.difflib.patch.DeltaType.EQUAL;
6+
import static com.github.difflib.patch.DeltaType.INSERT;
7+
import static java.nio.charset.StandardCharsets.UTF_8;
8+
import static java.util.stream.Collectors.joining;
9+
import static se.bjurr.violations.lib.model.SEVERITY.ERROR;
10+
import static se.bjurr.violations.lib.model.Violation.violationBuilder;
11+
import static se.bjurr.violations.lib.reports.Parser.DIFF;
12+
13+
import com.github.difflib.patch.AbstractDelta;
14+
import com.github.difflib.patch.Patch;
15+
import com.github.difflib.unifieddiff.UnifiedDiff;
16+
import com.github.difflib.unifieddiff.UnifiedDiffFile;
17+
import com.github.difflib.unifieddiff.UnifiedDiffReader;
18+
import java.io.ByteArrayInputStream;
19+
import java.io.InputStream;
20+
import java.util.List;
21+
import java.util.Set;
22+
import java.util.TreeSet;
23+
import se.bjurr.violations.lib.ViolationsLogger;
24+
import se.bjurr.violations.lib.model.Violation;
25+
26+
public class DiffParser implements ViolationsParser {
27+
28+
@Override
29+
public Set<Violation> parseReportOutput(String reportContent, ViolationsLogger violationsLogger)
30+
throws Exception {
31+
Set<Violation> violations = new TreeSet<>();
32+
InputStream reportContentStream = new ByteArrayInputStream(reportContent.getBytes(UTF_8));
33+
UnifiedDiff parsedDiff = UnifiedDiffReader.parseUnifiedDiff(reportContentStream);
34+
for (UnifiedDiffFile diffFile : parsedDiff.getFiles()) {
35+
String file = diffFile.getFromFile();
36+
Patch<String> patch = diffFile.getPatch();
37+
for (AbstractDelta<String> delta : patch.getDeltas()) {
38+
String fromString = toString(delta.getSource().getLines());
39+
int fromLine = delta.getSource().getPosition();
40+
String toString = toString(delta.getTarget().getLines());
41+
int toLine = delta.getTarget().getPosition();
42+
43+
String message = "";
44+
45+
if (delta.getType() == CHANGE) {
46+
message =
47+
"Change line "
48+
+ fromLine
49+
+ ":\n\n"
50+
+ fromString
51+
+ "\n\nTo line "
52+
+ toLine
53+
+ ":\n\n"
54+
+ toString;
55+
} else if (delta.getType() == DELETE) {
56+
message =
57+
"Delete line "
58+
+ fromLine
59+
+ ":\n\n"
60+
+ fromString
61+
+ "\n\nTo line "
62+
+ toLine
63+
+ ":\n\n"
64+
+ toString;
65+
} else if (delta.getType() == EQUAL) {
66+
message =
67+
"Equal line "
68+
+ fromLine
69+
+ ":\n\n"
70+
+ fromString
71+
+ "\n\nTo line "
72+
+ toLine
73+
+ ":\n\n"
74+
+ toString;
75+
} else if (delta.getType() == INSERT) {
76+
message =
77+
"Insert line "
78+
+ fromLine
79+
+ ":\n\n"
80+
+ fromString
81+
+ "\n\nTo line "
82+
+ toLine
83+
+ ":\n\n"
84+
+ toString;
85+
}
86+
87+
violations.add(
88+
violationBuilder()
89+
.setParser(DIFF)
90+
.setFile(file)
91+
.setStartLine(fromLine)
92+
.setMessage(message)
93+
.setSeverity(ERROR)
94+
.build());
95+
}
96+
}
97+
return violations;
98+
}
99+
100+
private String toString(List<String> lines) {
101+
return lines.stream().collect(joining("\n")).trim();
102+
}
103+
}

src/main/java/se/bjurr/violations/lib/reports/Parser.java

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import se.bjurr.violations.lib.parsers.CodeClimateParser;
2121
import se.bjurr.violations.lib.parsers.CodeNarcParser;
2222
import se.bjurr.violations.lib.parsers.CppLintParser;
23+
import se.bjurr.violations.lib.parsers.DiffParser;
2324
import se.bjurr.violations.lib.parsers.DocFXParser;
2425
import se.bjurr.violations.lib.parsers.FindbugsParser;
2526
import se.bjurr.violations.lib.parsers.Flake8Parser;
@@ -79,6 +80,7 @@ public enum Parser {
7980
KOTLINGRADLE(new KotlinGradleParser()), //
8081
MSCPP(new MSCPPParser()), //
8182
MYPY(new MyPyParser()), //
83+
DIFF(new DiffParser()), //
8284
GOLINT(new GoLintParser()), //
8385
GOOGLEERRORPRONE(new GoogleErrorProneParser()), //
8486
PERLCRITIC(new PerlCriticParser()), //

src/main/java/se/bjurr/violations/lib/reports/Reporter.java

+5
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ public enum Reporter {
9797
Parser.GOOGLEERRORPRONE,
9898
"https://github.com/uber/NullAway",
9999
"Same format as Google Error Prone."),
100+
DIFF(
101+
"Patch",
102+
Parser.DIFF,
103+
"https://en.wikipedia.org/wiki/Diff",
104+
"Unidiff, often used by the `patch` program."),
100105
PCLINT(
101106
"PCLint",
102107
Parser.PCLINT,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package se.bjurr.violations.lib;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static se.bjurr.violations.lib.TestUtils.getRootFolder;
5+
import static se.bjurr.violations.lib.ViolationsApi.violationsApi;
6+
import static se.bjurr.violations.lib.model.SEVERITY.ERROR;
7+
import static se.bjurr.violations.lib.reports.Parser.DIFF;
8+
9+
import java.util.ArrayList;
10+
import java.util.Set;
11+
import org.junit.Test;
12+
import se.bjurr.violations.lib.model.Violation;
13+
14+
public class DiffTest {
15+
16+
@Test
17+
public void testChange() {
18+
final String rootFolder = getRootFolder();
19+
20+
final Set<Violation> actual =
21+
violationsApi() //
22+
.withPattern(".*/diff/0001-.*") //
23+
.inFolder(rootFolder) //
24+
.findAll(DIFF) //
25+
.violations();
26+
27+
assertThat(actual) //
28+
.hasSize(2);
29+
30+
Violation v0 = new ArrayList<>(actual).get(0);
31+
assertThat(v0.getMessage()) //
32+
.contains("Changelog of Violations lib");
33+
assertThat(v0.getFile()) //
34+
.isEqualTo("CHANGELOG.md");
35+
assertThat(v0.getSeverity()) //
36+
.isEqualTo(ERROR);
37+
assertThat(v0.getStartLine()) //
38+
.isEqualTo(2);
39+
40+
Violation v1 = new ArrayList<>(actual).get(1);
41+
assertThat(v1.getMessage()) //
42+
.contains("version = 1.127");
43+
assertThat(v1.getFile()) //
44+
.isEqualTo("gradle.properties");
45+
assertThat(v1.getSeverity()) //
46+
.isEqualTo(ERROR);
47+
assertThat(v1.getStartLine()) //
48+
.isEqualTo(0);
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
From 513d19e33d0a78b778bc2cd33551a300e7605975 Mon Sep 17 00:00:00 2001
2+
From: Tomas Bjerre <[email protected]>
3+
Date: Sun, 6 Sep 2020 07:26:13 +0200
4+
Subject: [PATCH] [Gradle Release Plugin] - new version commit:
5+
'1.128-SNAPSHOT'.
6+
7+
---
8+
CHANGELOG.md | 9 +++++++++
9+
gradle.properties | 2 +-
10+
2 files changed, 10 insertions(+), 1 deletion(-)
11+
12+
diff --git a/CHANGELOG.md b/CHANGELOG.md
13+
index 7b2cb23..a1ee761 100644
14+
--- a/CHANGELOG.md
15+
+++ b/CHANGELOG.md
16+
@@ -3,6 +3,15 @@
17+
18+
Changelog of Violations lib.
19+
20+
+## 1.127
21+
+### GitHub [#95](https://github.com/tomasbjerre/violations-lib/issues/95) Add support for &quot;suggested change&quot; *enhancement*
22+
+
23+
+**Moving PatchParser from violation-comments-lib**
24+
+
25+
+
26+
+[5c52a3933792d14](https://github.com/tomasbjerre/violations-lib/commit/5c52a3933792d14) Tomas Bjerre *2020-09-06 05:24:56*
27+
+
28+
+
29+
## 1.126
30+
### GitHub [#95](https://github.com/tomasbjerre/violations-lib/issues/95) Add support for &quot;suggested change&quot; *enhancement*
31+
32+
diff --git a/gradle.properties b/gradle.properties
33+
index aca4c1a..eda4430 100644
34+
--- a/gradle.properties
35+
+++ b/gradle.properties
36+
@@ -1 +1 @@
37+
-version = 1.127
38+
+version = 1.128-SNAPSHOT
39+
--
40+
2.25.1
41+

0 commit comments

Comments
 (0)