Skip to content

Commit fa287dc

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

File tree

7 files changed

+261
-4
lines changed

7 files changed

+261
-4
lines changed

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` | Often called 'patch'.
5657
| [_Pep8_](https://github.com/PyCQA/pycodestyle) | `FLAKE8` |
5758
| [_PerlCritic_](https://github.com/Perl-Critic) | `PERLCRITIC` |
5859
| [_PiTest_](http://pitest.org/) | `PITEST` |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package se.bjurr.violations.lib.parsers;
2+
3+
import static se.bjurr.violations.lib.model.Violation.violationBuilder;
4+
import static se.bjurr.violations.lib.parsers.DiffParser.DiffState.ADDED;
5+
import static se.bjurr.violations.lib.parsers.DiffParser.DiffState.CHANGED;
6+
import static se.bjurr.violations.lib.parsers.DiffParser.DiffState.DELETED;
7+
8+
import java.util.Arrays;
9+
import java.util.Iterator;
10+
import java.util.Set;
11+
import java.util.TreeSet;
12+
import java.util.logging.Level;
13+
import java.util.logging.Logger;
14+
import java.util.regex.Matcher;
15+
import java.util.regex.Pattern;
16+
17+
import se.bjurr.violations.lib.ViolationsLogger;
18+
import se.bjurr.violations.lib.model.Violation;
19+
20+
public class DiffParser implements ViolationsParser {
21+
public class CommonParsed {
22+
private final Integer startLineBefore;
23+
private final Integer endLineBefore;
24+
private final Integer startLineAfter;
25+
private final Integer endLineAfter;
26+
27+
public CommonParsed(Integer startLineBefore, Integer endLineBefore, Integer startLineAfter,
28+
Integer endLineAfter) {
29+
super();
30+
this.startLineBefore = startLineBefore;
31+
this.endLineBefore = endLineBefore;
32+
this.startLineAfter = startLineAfter;
33+
this.endLineAfter = endLineAfter;
34+
}
35+
36+
@Override
37+
public String toString() {
38+
return "CommonParsed [startLineBefore=" + startLineBefore + ", endLineBefore=" + endLineBefore
39+
+ ", startLineAfter=" + startLineAfter + ", endLineAfter=" + endLineAfter + "]";
40+
}
41+
42+
}
43+
44+
private static Logger LOG = Logger.getLogger(DiffParser.class.getSimpleName());
45+
private static final String LINE_PATTERN_STR = "([0-9]+),?([0-9]+)?";
46+
private static final Pattern LINE_PATTERN = Pattern.compile(LINE_PATTERN_STR);
47+
48+
public enum DiffState {
49+
ADDED("a"), DELETED("d"), CHANGED("c");
50+
51+
private final Pattern pattern;
52+
53+
private DiffState(String letter) {
54+
this.pattern = Pattern.compile("^" + LINE_PATTERN_STR + letter + LINE_PATTERN_STR);
55+
}
56+
57+
public Pattern getScopePattern() {
58+
return pattern;
59+
}
60+
61+
public boolean matches(String line) {
62+
return this.pattern.matcher(line).find();
63+
}
64+
}
65+
66+
@Override
67+
public Set<Violation> parseReportOutput(String reportContent, ViolationsLogger violationsLogger) throws Exception {
68+
Set<Violation> violations = new TreeSet<>();
69+
Iterator<String> linesItr = Arrays.asList(reportContent.split("\\r?\\n")).iterator();
70+
while (linesItr.hasNext()) {
71+
String line = linesItr.next();
72+
if (ADDED.matches(line)) {
73+
violations.add(parseAdded(line, linesItr));
74+
} else if (DELETED.matches(line)) {
75+
violations.add(parseDeleted(line, linesItr));
76+
} else if (CHANGED.matches(line)) {
77+
violations.add(parseChanged(line, linesItr));
78+
} else {
79+
LOG.log(Level.FINE, "Was unable to detect diff state " + line);
80+
}
81+
}
82+
return violations;
83+
}
84+
85+
private CommonParsed parseCommon(String line) {
86+
String[] orignalAndNew = line.split("[acd]");
87+
88+
String originalLines = orignalAndNew[0];
89+
Matcher originalMatcher = LINE_PATTERN.matcher(originalLines);
90+
int startLineBefore = Integer.parseInt(originalMatcher.group(0));
91+
Integer endLineBefore = null;
92+
if (originalMatcher.groupCount() > 1) {
93+
endLineBefore = Integer.parseInt(originalMatcher.group(1));
94+
}
95+
96+
String newLines = orignalAndNew[1];
97+
Matcher newMatcher = LINE_PATTERN.matcher(newLines);
98+
int startLineAfter = Integer.parseInt(newMatcher.group(0));
99+
Integer endLineAfter = null;
100+
if (newMatcher.groupCount() > 1) {
101+
endLineAfter = Integer.parseInt(newMatcher.group(1));
102+
}
103+
return new CommonParsed(startLineBefore, endLineBefore, startLineAfter, endLineAfter);
104+
}
105+
106+
private Violation parseChanged(String line, Iterator<String> linesItr) {
107+
CommonParsed commonParsed = parseCommon(line);
108+
new StringBuilder();
109+
while (linesItr.hasNext()) {
110+
line = linesItr.next();
111+
if (line.equals("---")) {
112+
break;
113+
}
114+
}
115+
return violationBuilder()
116+
.setStartLine(commonParsed.startLineBefore)
117+
.setEndLine(commonParsed.endLineBefore)
118+
.setSpecific("START_LINE_AFTER", commonParsed.startLineAfter)
119+
.setSpecific("END_LINE_AFTER", commonParsed.endLineAfter)
120+
.build();
121+
}
122+
123+
private Violation parseDeleted(String line, Iterator<String> linesItr) {
124+
CommonParsed commonParsed = parseCommon(line);
125+
return violationBuilder()
126+
.setStartLine(commonParsed.startLineBefore)
127+
.setEndLine(commonParsed.endLineBefore)
128+
.setSpecific("START_LINE_AFTER", commonParsed.startLineAfter)
129+
.setSpecific("END_LINE_AFTER", commonParsed.endLineAfter)
130+
.build();
131+
}
132+
133+
private Violation parseAdded(String line, Iterator<String> linesItr) {
134+
CommonParsed commonParsed = parseCommon(line);
135+
return violationBuilder()
136+
.setStartLine(commonParsed.startLineBefore)
137+
.setEndLine(commonParsed.endLineBefore)
138+
.setSpecific("START_LINE_AFTER", commonParsed.startLineAfter)
139+
.setSpecific("END_LINE_AFTER", commonParsed.endLineAfter)
140+
.build();
141+
}
142+
143+
}

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

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.Set;
1010
import java.util.TreeSet;
1111
import java.util.logging.Logger;
12+
1213
import se.bjurr.violations.lib.ViolationsLogger;
1314
import se.bjurr.violations.lib.model.Violation;
1415
import se.bjurr.violations.lib.parsers.AndroidLintParser;
@@ -39,6 +40,7 @@
3940
import se.bjurr.violations.lib.parsers.MyPyParser;
4041
import se.bjurr.violations.lib.parsers.PCLintParser;
4142
import se.bjurr.violations.lib.parsers.PMDParser;
43+
import se.bjurr.violations.lib.parsers.DiffParser;
4244
import se.bjurr.violations.lib.parsers.PerlCriticParser;
4345
import se.bjurr.violations.lib.parsers.PiTestParser;
4446
import se.bjurr.violations.lib.parsers.ProtoLintParser;
@@ -79,6 +81,7 @@ public enum Parser {
7981
KOTLINGRADLE(new KotlinGradleParser()), //
8082
MSCPP(new MSCPPParser()), //
8183
MYPY(new MyPyParser()), //
84+
DIFF(new DiffParser()), //
8285
GOLINT(new GoLintParser()), //
8386
GOOGLEERRORPRONE(new GoogleErrorProneParser()), //
8487
PERLCRITIC(new PerlCriticParser()), //

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

+9-4
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,15 @@ public enum Reporter {
9393
MYPY("MyPy", Parser.MYPY, "https://pypi.python.org/pypi/mypy-lang", ""),
9494
MSCPP("MSCpp", Parser.MSCPP, "https://visualstudio.microsoft.com/vs/features/cplusplus/", ""),
9595
NULLAWAY(
96-
"NullAway",
97-
Parser.GOOGLEERRORPRONE,
98-
"https://github.com/uber/NullAway",
99-
"Same format as Google Error Prone."),
96+
"NullAway",
97+
Parser.GOOGLEERRORPRONE,
98+
"https://github.com/uber/NullAway",
99+
"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,42 @@
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.INFO;
7+
import static se.bjurr.violations.lib.reports.Parser.DIFF;
8+
9+
import java.util.ArrayList;
10+
import java.util.Set;
11+
12+
import org.junit.Test;
13+
14+
import se.bjurr.violations.lib.model.Violation;
15+
16+
public class DiffTest {
17+
18+
@Test
19+
public void testThatGoVetViolationsCanBeParsed() {
20+
final String rootFolder = getRootFolder();
21+
22+
final Set<Violation> actual =
23+
violationsApi() //
24+
.withPattern(".*/diff/diff-1\\.txt$") //
25+
.inFolder(rootFolder) //
26+
.findAll(DIFF) //
27+
.violations();
28+
29+
assertThat(actual) //
30+
.hasSize(3);
31+
32+
Violation violation0 = new ArrayList<>(actual).get(0);
33+
assertThat(violation0.getMessage()) //
34+
.isEqualTo("this is a message");
35+
assertThat(violation0.getFile()) //
36+
.isEqualTo("my_file.go");
37+
assertThat(violation0.getSeverity()) //
38+
.isEqualTo(INFO);
39+
assertThat(violation0.getStartLine()) //
40+
.isEqualTo(46);
41+
}
42+
}
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+

src/test/resources/diff/diff-1.txt

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
0a1,6
2+
> This is an important
3+
> notice! It should
4+
> therefore be located at
5+
> the beginning of this
6+
> document!
7+
>
8+
11,15d16
9+
< This paragraph contains
10+
< text that is outdated.
11+
< It will be deleted in the
12+
< near future.
13+
<
14+
17c18
15+
< check this dokument. On
16+
---
17+
> check this document. On
18+
24a26,29
19+
>
20+
> This paragraph contains
21+
> important new additions
22+
> to this document.

0 commit comments

Comments
 (0)