rubycritic 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +10 -0
- data/README.md +4 -0
- data/lib/rubycritic/report_generators/base_generator.rb +5 -7
- data/lib/rubycritic/report_generators/code_index_generator.rb +12 -3
- data/lib/rubycritic/report_generators/file_generator.rb +2 -6
- data/lib/rubycritic/report_generators/line_generator.rb +2 -2
- data/lib/rubycritic/report_generators/reporter.rb +1 -1
- data/lib/rubycritic/report_generators/smells_index_generator.rb +1 -1
- data/lib/rubycritic/report_generators/templates/code_index.html.erb +4 -2
- data/lib/rubycritic/report_generators/templates/file.html.erb +1 -1
- data/lib/rubycritic/report_generators/view_helpers.rb +5 -2
- data/lib/rubycritic/smell_adapters/flay.rb +13 -13
- data/lib/rubycritic/smell_adapters/flog.rb +15 -16
- data/lib/rubycritic/smell_adapters/reek.rb +6 -6
- data/lib/rubycritic/version.rb +1 -1
- data/rubycritic.gemspec +1 -0
- data/test/lib/rubycritic/analysers_runner_test.rb +1 -1
- data/test/lib/rubycritic/source_locator_test.rb +3 -4
- data/test/samples/analysers_runner/empty.rb +0 -0
- metadata +6 -4
- data/SPEC.md +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 256bd2cbd360e7435d0ad68b21db192854b49461
|
4
|
+
data.tar.gz: 6bb7d80fb6ec8cf0b7fe1e8aa460c368ce9239fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd11682da1d3f86e750fe53e60e0efbe1104e4dc1b2bf75706e1add54d493bf7dcabf3e67961b7ba89a00211f6ad773299251235395adbb821ad82a9a5f5f976
|
7
|
+
data.tar.gz: 11e0c3069c482a01200cf6f166b843478edca25ba366795b2ae9c7ebd1d8887760520b0892b0a2ee6e1779d31f46d8426cbfac9dab2ceb0adfc3500019708e52
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
RubyCritic
|
2
2
|
===========
|
3
3
|
|
4
|
+
[](http://badge.fury.io/rb/rubycritic)
|
5
|
+
[](https://travis-ci.org/whitesmith/rubycritic)
|
6
|
+
[](https://codeclimate.com/github/whitesmith/rubycritic)
|
7
|
+
|
4
8
|
RubyCritic is a gem that wraps around static analysis gems such as [Reek][1]
|
5
9
|
and [Flay][2] to provide a quality report of your Ruby code.
|
6
10
|
|
@@ -4,8 +4,12 @@ require "rubycritic/report_generators/view_helpers"
|
|
4
4
|
module Rubycritic
|
5
5
|
|
6
6
|
class BaseGenerator
|
7
|
+
def self.erb_template(template_path)
|
8
|
+
ERB.new(File.read(File.join(TEMPLATES_DIR, template_path)))
|
9
|
+
end
|
10
|
+
|
7
11
|
TEMPLATES_DIR = File.expand_path("../templates", __FILE__)
|
8
|
-
LAYOUT_TEMPLATE =
|
12
|
+
LAYOUT_TEMPLATE = erb_template(File.join("layouts", "application.html.erb"))
|
9
13
|
|
10
14
|
include ViewHelpers
|
11
15
|
|
@@ -32,12 +36,6 @@ module Rubycritic
|
|
32
36
|
def get_binding
|
33
37
|
binding
|
34
38
|
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def root_directory
|
39
|
-
::Rubycritic.configuration.root
|
40
|
-
end
|
41
39
|
end
|
42
40
|
|
43
41
|
end
|
@@ -4,10 +4,11 @@ require "rubycritic/report_generators/base_generator"
|
|
4
4
|
module Rubycritic
|
5
5
|
|
6
6
|
class CodeIndexGenerator < BaseGenerator
|
7
|
-
TEMPLATE =
|
7
|
+
TEMPLATE = erb_template("code_index.html.erb")
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
@
|
9
|
+
def initialize(source_pathnames, smelly_pathnames)
|
10
|
+
@source_pathnames = source_pathnames.sort { |a, b| a.basename <=> b.basename }
|
11
|
+
@smelly_pathnames = smelly_pathnames
|
11
12
|
end
|
12
13
|
|
13
14
|
def file_name
|
@@ -18,6 +19,14 @@ module Rubycritic
|
|
18
19
|
index_body = TEMPLATE.result(get_binding)
|
19
20
|
LAYOUT_TEMPLATE.result(get_binding { index_body })
|
20
21
|
end
|
22
|
+
|
23
|
+
def file_path(path)
|
24
|
+
File.join(root_directory, path.sub_ext(".html"))
|
25
|
+
end
|
26
|
+
|
27
|
+
def smells_count(pathname)
|
28
|
+
(@smelly_pathnames[pathname] || []).length
|
29
|
+
end
|
21
30
|
end
|
22
31
|
|
23
32
|
end
|
@@ -6,7 +6,7 @@ module Rubycritic
|
|
6
6
|
|
7
7
|
class FileGenerator < BaseGenerator
|
8
8
|
LINE_NUMBER_OFFSET = 1
|
9
|
-
TEMPLATE =
|
9
|
+
TEMPLATE = erb_template("file.html.erb")
|
10
10
|
|
11
11
|
def initialize(pathname, smells)
|
12
12
|
@pathname = pathname
|
@@ -18,11 +18,7 @@ module Rubycritic
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def file_name
|
21
|
-
"
|
22
|
-
end
|
23
|
-
|
24
|
-
def analysed_file_name
|
25
|
-
@pathname.basename.sub_ext("")
|
21
|
+
@pathname.basename.sub_ext(".html")
|
26
22
|
end
|
27
23
|
|
28
24
|
def render
|
@@ -5,8 +5,8 @@ require "cgi"
|
|
5
5
|
module Rubycritic
|
6
6
|
|
7
7
|
class LineGenerator < BaseGenerator
|
8
|
-
NORMAL_TEMPLATE =
|
9
|
-
SMELLY_TEMPLATE =
|
8
|
+
NORMAL_TEMPLATE = erb_template("line.html.erb")
|
9
|
+
SMELLY_TEMPLATE = erb_template("smelly_line.html.erb")
|
10
10
|
|
11
11
|
def initialize(text, smells)
|
12
12
|
@text = CGI::escapeHTML(text.chomp)
|
@@ -4,7 +4,7 @@ require "rubycritic/report_generators/base_generator"
|
|
4
4
|
module Rubycritic
|
5
5
|
|
6
6
|
class SmellsIndexGenerator < BaseGenerator
|
7
|
-
TEMPLATE =
|
7
|
+
TEMPLATE = erb_template("smells_index.html.erb")
|
8
8
|
|
9
9
|
def initialize(smells)
|
10
10
|
@smells = smells.sort { |a, b| a.type <=> b.type }
|
@@ -2,12 +2,14 @@
|
|
2
2
|
<thead>
|
3
3
|
<tr>
|
4
4
|
<th>Name</th>
|
5
|
+
<th>Smells</th>
|
5
6
|
</tr>
|
6
7
|
</thead>
|
7
8
|
<tbody>
|
8
|
-
<% @
|
9
|
+
<% @source_pathnames.each do |pathname| %>
|
9
10
|
<tr>
|
10
|
-
<td><a href="<%=
|
11
|
+
<td><a href="<%= file_path(pathname) %>"><%= analysed_file_name(pathname) %></a></td>
|
12
|
+
<td><%= smells_count(pathname) %></td>
|
11
13
|
</tr>
|
12
14
|
<% end %>
|
13
15
|
</tbody>
|
@@ -26,9 +26,12 @@ module Rubycritic
|
|
26
26
|
File.join(root_directory, "smells_index.html")
|
27
27
|
end
|
28
28
|
|
29
|
-
# Includers must override
|
30
29
|
def root_directory
|
31
|
-
|
30
|
+
::Rubycritic.configuration.root
|
31
|
+
end
|
32
|
+
|
33
|
+
def analysed_file_name(pathname)
|
34
|
+
pathname.basename.sub_ext("")
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
@@ -17,20 +17,12 @@ module Rubycritic
|
|
17
17
|
private
|
18
18
|
|
19
19
|
def create_smell(structural_hash, nodes)
|
20
|
-
is_identical = @flay.identical[structural_hash]
|
21
|
-
similarity = is_identical ? "Identical" : "Similar"
|
22
|
-
|
23
|
-
locations = smell_locations(nodes)
|
24
|
-
context = "#{similarity} code"
|
25
|
-
message = "found in #{nodes.size} nodes"
|
26
|
-
score = @flay.masses[structural_hash]
|
27
|
-
|
28
20
|
Smell.new(
|
29
|
-
:locations =>
|
30
|
-
:context
|
31
|
-
:message
|
32
|
-
:score
|
33
|
-
:type
|
21
|
+
:locations => smell_locations(nodes),
|
22
|
+
:context => "#{similarity(structural_hash)} code",
|
23
|
+
:message => "found in #{nodes.size} nodes",
|
24
|
+
:score => @flay.masses[structural_hash],
|
25
|
+
:type => "DuplicateCode"
|
34
26
|
)
|
35
27
|
end
|
36
28
|
|
@@ -39,6 +31,14 @@ module Rubycritic
|
|
39
31
|
Location.new(node.file, node.line)
|
40
32
|
end.sort
|
41
33
|
end
|
34
|
+
|
35
|
+
def similarity(structural_hash)
|
36
|
+
if @flay.identical[structural_hash]
|
37
|
+
"Identical"
|
38
|
+
else
|
39
|
+
"Similar"
|
40
|
+
end
|
41
|
+
end
|
42
42
|
end
|
43
43
|
|
44
44
|
end
|
@@ -23,28 +23,27 @@ module Rubycritic
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def create_smell(context, score)
|
26
|
-
location = smell_location(context)
|
27
|
-
message = "has a flog score of #{score}"
|
28
|
-
type =
|
29
|
-
if score >= VERY_HIGH_COMPLEXITY_SCORE_THRESHOLD
|
30
|
-
"VeryHighComplexity"
|
31
|
-
else
|
32
|
-
"HighComplexity"
|
33
|
-
end
|
34
|
-
|
35
26
|
Smell.new(
|
36
|
-
:locations =>
|
37
|
-
:context
|
38
|
-
:message
|
39
|
-
:score
|
40
|
-
:type
|
27
|
+
:locations => smell_locations(context),
|
28
|
+
:context => context,
|
29
|
+
:message => "has a flog score of #{score}",
|
30
|
+
:score => score,
|
31
|
+
:type => type(score)
|
41
32
|
)
|
42
33
|
end
|
43
34
|
|
44
|
-
def
|
35
|
+
def smell_locations(context)
|
45
36
|
line = @flog.method_locations[context]
|
46
37
|
file_path, file_line = line.split(":")
|
47
|
-
Location.new(file_path, file_line)
|
38
|
+
[Location.new(file_path, file_line)]
|
39
|
+
end
|
40
|
+
|
41
|
+
def type(score)
|
42
|
+
if score >= VERY_HIGH_COMPLEXITY_SCORE_THRESHOLD
|
43
|
+
"VeryHighComplexity"
|
44
|
+
else
|
45
|
+
"HighComplexity"
|
46
|
+
end
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
@@ -17,12 +17,12 @@ module Rubycritic
|
|
17
17
|
private
|
18
18
|
|
19
19
|
def create_smell(smell)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
Smell.new(
|
21
|
+
:locations => smell_locations(smell.source, smell.lines),
|
22
|
+
:context => smell.context,
|
23
|
+
:message => smell.message,
|
24
|
+
:type => smell.subclass
|
25
|
+
)
|
26
26
|
end
|
27
27
|
|
28
28
|
def smell_locations(file_path, file_lines)
|
data/lib/rubycritic/version.rb
CHANGED
data/rubycritic.gemspec
CHANGED
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.summary = "Ruby code smell detector"
|
15
15
|
spec.homepage = "https://github.com/whitesmith/rubycritic"
|
16
16
|
spec.license = "MIT"
|
17
|
+
spec.required_ruby_version = ">= 1.9.3"
|
17
18
|
|
18
19
|
spec.files = `git ls-files`.split("\n")
|
19
20
|
spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
@@ -4,7 +4,7 @@ require "rubycritic/analysers_runner"
|
|
4
4
|
describe Rubycritic::AnalysersRunner do
|
5
5
|
describe "#run" do
|
6
6
|
it "returns an array containing smell adapters" do
|
7
|
-
smell_adapters = Rubycritic::AnalysersRunner.new("test/samples/
|
7
|
+
smell_adapters = Rubycritic::AnalysersRunner.new("test/samples/analysers_runner/empty.rb").run
|
8
8
|
smell_adapters.each { |adapter| adapter.must_respond_to(:smells) }
|
9
9
|
end
|
10
10
|
end
|
@@ -51,10 +51,9 @@ describe Rubycritic::SourceLocator do
|
|
51
51
|
|
52
52
|
describe "#pathnames" do
|
53
53
|
it "finds a single file" do
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
Rubycritic::SourceLocator.new(paths).pathnames.must_equal result
|
54
|
+
initial_paths = ["file0.rb"]
|
55
|
+
final_pathnames = [Pathname.new("file0.rb")]
|
56
|
+
Rubycritic::SourceLocator.new(initial_paths).pathnames.must_equal final_pathnames
|
58
57
|
end
|
59
58
|
end
|
60
59
|
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubycritic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guilherme Simoes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|
@@ -132,12 +132,12 @@ extensions: []
|
|
132
132
|
extra_rdoc_files: []
|
133
133
|
files:
|
134
134
|
- ".gitignore"
|
135
|
+
- ".travis.yml"
|
135
136
|
- CONTRIBUTING.md
|
136
137
|
- Gemfile
|
137
138
|
- LICENSE.txt
|
138
139
|
- README.md
|
139
140
|
- Rakefile
|
140
|
-
- SPEC.md
|
141
141
|
- bin/rubycritic
|
142
142
|
- lib/rubycritic.rb
|
143
143
|
- lib/rubycritic/active_support/methods.rb
|
@@ -193,6 +193,7 @@ files:
|
|
193
193
|
- test/lib/rubycritic/source_control_systems/source_control_system_test.rb
|
194
194
|
- test/lib/rubycritic/source_locator_test.rb
|
195
195
|
- test/lib/rubycritic/version_test.rb
|
196
|
+
- test/samples/analysers_runner/empty.rb
|
196
197
|
- test/samples/flay/smelly.rb
|
197
198
|
- test/samples/flog/smelly.rb
|
198
199
|
- test/samples/location/dir1/file1.rb
|
@@ -214,7 +215,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
214
215
|
requirements:
|
215
216
|
- - ">="
|
216
217
|
- !ruby/object:Gem::Version
|
217
|
-
version:
|
218
|
+
version: 1.9.3
|
218
219
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
219
220
|
requirements:
|
220
221
|
- - ">="
|
@@ -240,6 +241,7 @@ test_files:
|
|
240
241
|
- test/lib/rubycritic/source_control_systems/source_control_system_test.rb
|
241
242
|
- test/lib/rubycritic/source_locator_test.rb
|
242
243
|
- test/lib/rubycritic/version_test.rb
|
244
|
+
- test/samples/analysers_runner/empty.rb
|
243
245
|
- test/samples/flay/smelly.rb
|
244
246
|
- test/samples/flog/smelly.rb
|
245
247
|
- test/samples/location/dir1/file1.rb
|
data/SPEC.md
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
Ruby Critic
|
2
|
-
===========
|
3
|
-
|
4
|
-
Ruby Critic is a tool that detects and reports smells in Ruby code.
|
5
|
-
|
6
|
-
Inspired by [RuboCop][1], [Rails Best Practices][2] and [Code Climate][3], Ruby Critic aims to better help you refactor your code. By making use of Ruby's rich ecosystem of code metrics tools, Ruby Critic generates high-quality visualizations and insightful code quality reports.
|
7
|
-
|
8
|
-
[1]: https://github.com/bbatsov/rubocop/
|
9
|
-
[2]: https://github.com/railsbp/rails_best_practices
|
10
|
-
[3]: https://codeclimate.com/
|
11
|
-
|
12
|
-
Installation
|
13
|
-
------------
|
14
|
-
|
15
|
-
Add this line to your application's Gemfile:
|
16
|
-
|
17
|
-
```ruby
|
18
|
-
gem "rubycritic"
|
19
|
-
```
|
20
|
-
|
21
|
-
And then execute:
|
22
|
-
|
23
|
-
```bash
|
24
|
-
$ bundle
|
25
|
-
```
|
26
|
-
|
27
|
-
Or just install it yourself:
|
28
|
-
|
29
|
-
```bash
|
30
|
-
$ gem install rubycritic
|
31
|
-
```
|
32
|
-
|
33
|
-
Usage
|
34
|
-
-----
|
35
|
-
|
36
|
-
Running `rubycritic` with no arguments will check all Ruby source files in the
|
37
|
-
current directory:
|
38
|
-
|
39
|
-
```bash
|
40
|
-
$ rubycritic
|
41
|
-
```
|
42
|
-
|
43
|
-
Alternatively you can pass `rubycritic` a list of files and directories to check:
|
44
|
-
|
45
|
-
```bash
|
46
|
-
$ rubycritic app lib/foo.rb
|
47
|
-
```
|
48
|
-
|
49
|
-
Options
|
50
|
-
-------
|
51
|
-
|
52
|
-
To specify an output file for the results:
|
53
|
-
|
54
|
-
```bash
|
55
|
-
$ rubycritic -o output_file
|
56
|
-
```
|
57
|
-
|
58
|
-
The output format is determined by the file extension or by using the `-f` option. Current options are: `text`, `html`, `yaml` and `json`.
|