Skip to content

Commit 159c53d

Browse files
committed
SONARPY-201 Use InputFile API to read files
1 parent 9b6ed08 commit 159c53d

5 files changed

Lines changed: 149 additions & 21 deletions

File tree

sonar-python-plugin/src/main/java/org/sonar/plugins/python/PythonScanner.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.sonar.python.PythonCheck;
4646
import org.sonar.python.PythonCheck.PreciseIssue;
4747
import org.sonar.python.PythonConfiguration;
48+
import org.sonar.python.PythonFile;
4849
import org.sonar.python.PythonVisitorContext;
4950
import org.sonar.python.metrics.FileLinesVisitor;
5051
import org.sonar.python.metrics.MetricVisitor;
@@ -84,7 +85,7 @@ public void scanFiles() {
8485
}
8586

8687
private void scanFile(InputFile inputFile) {
87-
SonarQubePythonFile pythonFile = new SonarQubePythonFile(inputFile, context.fileSystem().encoding());
88+
PythonFile pythonFile = SonarQubePythonFile.create(inputFile, context);
8889
PythonVisitorContext visitorContext;
8990
try {
9091
visitorContext = new PythonVisitorContext(parser.parse(pythonFile.content()), pythonFile);

sonar-python-plugin/src/main/java/org/sonar/plugins/python/SonarQubePythonFile.java

Lines changed: 75 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,96 @@
2020
package org.sonar.plugins.python;
2121

2222
import com.google.common.io.Files;
23-
import java.io.File;
2423
import java.io.IOException;
2524
import java.nio.charset.Charset;
2625
import org.sonar.api.batch.fs.InputFile;
26+
import org.sonar.api.batch.sensor.SensorContext;
27+
import org.sonar.api.utils.Version;
2728
import org.sonar.python.PythonFile;
2829

29-
public class SonarQubePythonFile implements PythonFile {
30+
public abstract class SonarQubePythonFile implements PythonFile {
3031

31-
private final File file;
32-
private final Charset charset;
32+
private static final Version V6_0 = Version.create(6, 0);
33+
private static final Version V6_2 = Version.create(6, 2);
3334

34-
public SonarQubePythonFile(InputFile inputFile, Charset charset) {
35-
this.file = inputFile.file();
36-
this.charset = charset;
35+
private final InputFile inputFile;
36+
37+
private SonarQubePythonFile(InputFile inputFile) {
38+
this.inputFile = inputFile;
39+
}
40+
41+
public static PythonFile create(InputFile inputFile, SensorContext context) {
42+
Version version = context.getSonarQubeVersion();
43+
if (version.isGreaterThanOrEqual(V6_2)) {
44+
return new Sq62File(inputFile);
45+
}
46+
if (version.isGreaterThanOrEqual(V6_0)) {
47+
return new Sq60File(inputFile);
48+
}
49+
return new Sq56File(inputFile, context.fileSystem().encoding());
3750
}
3851

3952
@Override
40-
public String content() {
53+
public String fileName() {
54+
return inputFile.file().getName();
55+
}
56+
57+
public InputFile inputFile() {
58+
return inputFile;
59+
}
60+
61+
private static String contentForCharset(InputFile inputFile, Charset charset) {
4162
try {
42-
return Files.toString(file, charset);
63+
return Files.toString(inputFile.file(), charset);
4364
} catch (IOException e) {
44-
throw new IllegalStateException("Cannot read " + file, e);
65+
throw new IllegalStateException("Could not read content of input file " + inputFile, e);
4566
}
4667
}
4768

48-
@Override
49-
public String fileName() {
50-
return file.getName();
69+
private static class Sq56File extends SonarQubePythonFile {
70+
71+
private final Charset fileSystemEncoding;
72+
73+
public Sq56File(InputFile inputFile, Charset fileSystemEncoding) {
74+
super(inputFile);
75+
this.fileSystemEncoding = fileSystemEncoding;
76+
}
77+
78+
@Override
79+
public String content() {
80+
return contentForCharset(inputFile(), fileSystemEncoding);
81+
}
82+
83+
}
84+
85+
private static class Sq60File extends SonarQubePythonFile {
86+
87+
public Sq60File(InputFile inputFile) {
88+
super(inputFile);
89+
}
90+
91+
@Override
92+
public String content() {
93+
return contentForCharset(inputFile(), inputFile().charset());
94+
}
95+
96+
}
97+
98+
private static class Sq62File extends SonarQubePythonFile {
99+
100+
public Sq62File(InputFile inputFile) {
101+
super(inputFile);
102+
}
103+
104+
@Override
105+
public String content() {
106+
try {
107+
return inputFile().contents();
108+
} catch (IOException e) {
109+
throw new IllegalStateException("Could not read content of input file " + inputFile(), e);
110+
}
111+
}
112+
51113
}
52114

53115
}

sonar-python-plugin/src/test/java/org/sonar/plugins/python/PythonSquidSensorTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.sonar.plugins.python;
2121

2222
import java.io.File;
23+
import java.nio.charset.StandardCharsets;
2324
import java.util.Iterator;
2425
import org.junit.Before;
2526
import org.junit.Test;
@@ -38,7 +39,6 @@
3839
import org.sonar.api.batch.sensor.issue.Issue;
3940
import org.sonar.api.batch.sensor.issue.IssueLocation;
4041
import org.sonar.api.internal.SonarRuntimeImpl;
41-
import org.sonar.api.internal.google.common.base.Charsets;
4242
import org.sonar.api.issue.NoSonarFilter;
4343
import org.sonar.api.measures.CoreMetrics;
4444
import org.sonar.api.measures.FileLinesContext;
@@ -203,10 +203,11 @@ private PythonSquidSensor sensor() {
203203
private InputFile inputFile(String name) {
204204
DefaultInputFile inputFile = new DefaultInputFile("moduleKey", name)
205205
.setModuleBaseDir(baseDir.toPath())
206+
.setCharset(StandardCharsets.UTF_8)
206207
.setType(Type.MAIN)
207208
.setLanguage(Python.KEY);
208209
context.fileSystem().add(inputFile);
209-
inputFile.initMetadata(new FileMetadata().readMetadata(inputFile.file(), Charsets.UTF_8));
210+
inputFile.initMetadata(new FileMetadata().readMetadata(inputFile.file(), StandardCharsets.UTF_8));
210211
return inputFile;
211212
}
212213

sonar-python-plugin/src/test/java/org/sonar/plugins/python/SonarQubePythonFileTest.java

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,87 @@
2020
package org.sonar.plugins.python;
2121

2222
import java.io.File;
23+
import java.io.FileNotFoundException;
2324
import java.nio.charset.StandardCharsets;
2425
import org.junit.Rule;
2526
import org.junit.Test;
2627
import org.junit.rules.ExpectedException;
28+
import org.sonar.api.SonarQubeSide;
2729
import org.sonar.api.batch.fs.InputFile;
28-
import org.sonar.api.batch.fs.internal.DefaultInputFile;
30+
import org.sonar.api.batch.fs.internal.DefaultFileSystem;
31+
import org.sonar.api.batch.sensor.internal.SensorContextTester;
32+
import org.sonar.api.internal.SonarRuntimeImpl;
33+
import org.sonar.api.utils.Version;
34+
import org.sonar.python.PythonFile;
35+
36+
import static org.assertj.core.api.Assertions.assertThat;
37+
import static org.mockito.Mockito.mock;
38+
import static org.mockito.Mockito.when;
2939

3040
public class SonarQubePythonFileTest {
3141

42+
private File baseDir = new File("src/test/resources/org/sonar/plugins/python");
43+
private File file = new File(baseDir, "SonarQubePythonFile.txt");
44+
private File unkownFile = new File(baseDir, "xxx");
45+
private SensorContextTester context = SensorContextTester.create(baseDir);
46+
private InputFile inputFile = mock(InputFile.class);
47+
3248
@Rule
3349
public ExpectedException thrown = ExpectedException.none();
3450

3551
@Test
36-
public void unknown_file() throws Exception {
37-
InputFile inputFile = new DefaultInputFile("key", "xxx").setModuleBaseDir(new File(".").toPath());
38-
SonarQubePythonFile pythonFile = new SonarQubePythonFile(inputFile, StandardCharsets.UTF_8);
52+
public void sq62() throws Exception {
53+
setRuntime(Version.create(6, 2));
54+
when(inputFile.contents()).thenReturn("Hello 6.2!");
55+
PythonFile PythonFile = SonarQubePythonFile.create(inputFile, context);
56+
assertThat(PythonFile.content()).isEqualTo("Hello 6.2!");
57+
}
58+
59+
@Test
60+
public void sq62_with_unknown_file() throws Exception {
61+
setRuntime(Version.create(6, 2));
62+
when(inputFile.contents()).thenThrow(new FileNotFoundException());
63+
PythonFile PythonFile = SonarQubePythonFile.create(inputFile, context);
3964
thrown.expect(IllegalStateException.class);
40-
pythonFile.content();
65+
PythonFile.content();
66+
}
67+
68+
@Test
69+
public void sq60() throws Exception {
70+
setRuntime(Version.create(6, 0));
71+
DefaultFileSystem fs = mock(DefaultFileSystem.class);
72+
when(fs.encoding()).thenReturn(StandardCharsets.US_ASCII);
73+
context.setFileSystem(fs);
74+
when(inputFile.file()).thenReturn(file);
75+
when(inputFile.charset()).thenReturn(StandardCharsets.UTF_8);
76+
PythonFile PythonFile = SonarQubePythonFile.create(inputFile, context);
77+
assertThat(PythonFile.content()).isEqualTo("¡Hello!");
78+
}
79+
80+
@Test
81+
public void sq60_with_unknown_file() throws Exception {
82+
setRuntime(Version.create(6, 0));
83+
when(inputFile.file()).thenReturn(unkownFile);
84+
when(inputFile.charset()).thenReturn(StandardCharsets.UTF_8);
85+
PythonFile PythonFile = SonarQubePythonFile.create(inputFile, context);
86+
thrown.expect(IllegalStateException.class);
87+
PythonFile.content();
88+
}
89+
90+
@Test
91+
public void sq56() {
92+
setRuntime(Version.create(5, 6));
93+
DefaultFileSystem fs = mock(DefaultFileSystem.class);
94+
when(fs.encoding()).thenReturn(StandardCharsets.UTF_8);
95+
when(inputFile.file()).thenReturn(file);
96+
context.setFileSystem(fs);
97+
PythonFile PythonFile = SonarQubePythonFile.create(inputFile, context);
98+
assertThat(PythonFile.content()).isEqualTo("¡Hello!");
99+
assertThat(PythonFile.fileName()).isEqualTo(file.getName());
100+
}
101+
102+
private void setRuntime(Version version) {
103+
context.setRuntime(SonarRuntimeImpl.forSonarQube(version, SonarQubeSide.SERVER));
41104
}
42105

43106
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
¡Hello!

0 commit comments

Comments
 (0)