forked from pica/ruby-sonar-plugin
-
Notifications
You must be signed in to change notification settings - Fork 33
Expand file tree
/
Copy pathRubySensor.java
More file actions
executable file
·93 lines (81 loc) · 2.99 KB
/
RubySensor.java
File metadata and controls
executable file
·93 lines (81 loc) · 2.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.godaddy.sonar.ruby;
import java.io.File;
import java.io.Reader;
import java.io.StringReader;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.sonar.api.batch.Sensor;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.batch.fs.FilePredicate;
import org.sonar.api.batch.fs.FileSystem;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.config.Settings;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.resources.Project;
import org.sonar.squid.measures.Metric;
import org.sonar.squid.text.Source;
import com.godaddy.sonar.ruby.core.RubyFile;
import com.godaddy.sonar.ruby.core.RubyPackage;
import com.godaddy.sonar.ruby.core.RubyRecognizer;
import com.godaddy.sonar.ruby.parsers.CommentCountParser;
import com.google.common.collect.Lists;
public class RubySensor implements Sensor
{
// private ModuleFileSystem moduleFileSystem;
private Settings settings;
private FileSystem fs;
public RubySensor(Settings settings, FileSystem fs) {
this.settings = settings;
this.fs = fs;
}
@Override
public boolean shouldExecuteOnProject(Project project) {
// This sensor is executed only when there are Ruby files
return fs.hasFiles(fs.predicates().hasLanguage("ruby"));
}
public void analyse(Project project, SensorContext context)
{
computeBaseMetrics(context, project);
}
protected void computeBaseMetrics(SensorContext sensorContext, Project project)
{
Reader reader = null;
FilePredicate filePredicate = fs.predicates().hasLanguage("ruby");
List<InputFile> sourceFiles = Lists.newArrayList(fs.inputFiles(filePredicate));
Set<RubyPackage> packageList = new HashSet<RubyPackage>();
for (InputFile rubyFile : sourceFiles)
{
try
{
File fileRuby = rubyFile.file();
reader = new StringReader(FileUtils.readFileToString(fileRuby, fs.encoding().name()));
RubyFile resource = new RubyFile(fileRuby, sourceFiles);
Source source = new Source(reader, new RubyRecognizer());
packageList.add(new RubyPackage(resource.getParent().getKey()));
sensorContext.saveMeasure(rubyFile, CoreMetrics.NCLOC, (double) source.getMeasure(Metric.LINES_OF_CODE));
int numCommentLines = CommentCountParser.countLinesOfComment(fileRuby);
sensorContext.saveMeasure(rubyFile, CoreMetrics.COMMENT_LINES, (double) numCommentLines);
sensorContext.saveMeasure(rubyFile, CoreMetrics.FILES, 1.0);
sensorContext.saveMeasure(rubyFile, CoreMetrics.CLASSES, 1.0);
} catch (Exception e)
{
throw new IllegalStateException("Error computing base metrics for project.", e);
} finally
{
IOUtils.closeQuietly(reader);
}
}
for (RubyPackage pack : packageList)
{
sensorContext.saveMeasure(pack, CoreMetrics.PACKAGES, 1.0);
}
}
@Override
public String toString()
{
return getClass().getSimpleName();
}
}