rubycritic 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rubycritic/analysers/config.reek +2 -0
- data/lib/rubycritic/analysers/flay.rb +15 -0
- data/lib/rubycritic/analysers_runner.rb +3 -1
- data/lib/rubycritic/report_generators/reporter.rb +3 -3
- data/lib/rubycritic/smell_adapters/flay.rb +45 -0
- data/lib/rubycritic/smell_adapters/flog.rb +3 -2
- data/lib/rubycritic/smell_adapters/reek.rb +4 -3
- data/lib/rubycritic/smelly_pathnames_serializer.rb +1 -1
- data/lib/rubycritic/source_locator.rb +4 -8
- data/lib/rubycritic/version.rb +1 -1
- data/rubycritic.gemspec +1 -0
- data/test/lib/rubycritic/metric_adapters/flay_adapter_test.rb +25 -0
- data/test/lib/rubycritic/source_locator_test.rb +19 -9
- data/test/samples/flay/smelly.rb +17 -0
- data/test/samples/reek/not_smelly.rb +10 -3
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a776a51f8d90b8d2b65bb2e81f6b4dea87cd63a4
|
4
|
+
data.tar.gz: 4f35ecbef41031dd622513ef120ca1fab15e1e10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 078000998ba31e7c53c637dfda9184e8dfcdc90e28750afd88a4c35949f86feb38b785be71a2038d7704d2acd12d9182b905f19cafa00329ae20f99db51f1592
|
7
|
+
data.tar.gz: fff0b984ed7ebe0e120ceb0ed13947eacea027162312e80e84d7dbe9e96b1f998ecd8be4cd9dfd8e3fc659a50a252261a8ec63ba6310b323b42eda3885327d17
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require "rubycritic/active_support/methods"
|
2
|
+
require "rubycritic/analysers/flay"
|
3
|
+
require "rubycritic/smell_adapters/flay"
|
2
4
|
require "rubycritic/analysers/reek"
|
3
5
|
require "rubycritic/smell_adapters/reek"
|
4
6
|
|
@@ -7,7 +9,7 @@ module Rubycritic
|
|
7
9
|
class AnalysersRunner
|
8
10
|
include ActiveSupport
|
9
11
|
|
10
|
-
ANALYSERS = ["Reek"]
|
12
|
+
ANALYSERS = ["Flay", "Reek"]
|
11
13
|
|
12
14
|
def initialize(paths)
|
13
15
|
@paths = paths
|
@@ -35,9 +35,9 @@ module Rubycritic
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def file_generators
|
38
|
-
@file_generators ||= @source_pathnames.map do |
|
39
|
-
file_smells = @smelly_pathnames[
|
40
|
-
FileGenerator.new(
|
38
|
+
@file_generators ||= @source_pathnames.map do |file_pathname|
|
39
|
+
file_smells = @smelly_pathnames[file_pathname]
|
40
|
+
FileGenerator.new(file_pathname, file_smells)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "rubycritic/smell"
|
2
|
+
|
3
|
+
module Rubycritic
|
4
|
+
module SmellAdapter
|
5
|
+
|
6
|
+
class Flay
|
7
|
+
def initialize(flay)
|
8
|
+
@flay = flay
|
9
|
+
end
|
10
|
+
|
11
|
+
def smells
|
12
|
+
@flay.hashes.map do |structural_hash, nodes|
|
13
|
+
create_smell(structural_hash, nodes)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
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
|
+
Smell.new(
|
29
|
+
:locations => locations,
|
30
|
+
:context => context,
|
31
|
+
:message => message,
|
32
|
+
:score => score,
|
33
|
+
:type => "DuplicateCode"
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def smell_locations(nodes)
|
38
|
+
nodes.map do |node|
|
39
|
+
Location.new(node.file, node.line)
|
40
|
+
end.sort
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -19,8 +19,9 @@ module Rubycritic
|
|
19
19
|
private
|
20
20
|
|
21
21
|
def create_smell(context, score)
|
22
|
-
location =
|
22
|
+
location = smell_location(context)
|
23
23
|
message = "has a complexity of #{score.round}"
|
24
|
+
|
24
25
|
Smell.new(
|
25
26
|
:locations => [location],
|
26
27
|
:context => context,
|
@@ -30,7 +31,7 @@ module Rubycritic
|
|
30
31
|
)
|
31
32
|
end
|
32
33
|
|
33
|
-
def
|
34
|
+
def smell_location(context)
|
34
35
|
line = @flog.method_locations[context]
|
35
36
|
file_path, file_line = line.split(":")
|
36
37
|
Location.new(file_path, file_line)
|
@@ -18,16 +18,17 @@ module Rubycritic
|
|
18
18
|
|
19
19
|
def create_smell(smell)
|
20
20
|
locations = smell_locations(smell.source, smell.lines)
|
21
|
-
message = smell.message
|
22
21
|
context = smell.context
|
22
|
+
message = smell.message
|
23
23
|
type = smell.subclass
|
24
|
+
|
24
25
|
Smell.new(:locations => locations, :context => context, :message => message, :type => type)
|
25
26
|
end
|
26
27
|
|
27
28
|
def smell_locations(file_path, file_lines)
|
28
|
-
file_lines.uniq.
|
29
|
+
file_lines.uniq.map do |file_line|
|
29
30
|
Location.new(file_path, file_line)
|
30
|
-
end
|
31
|
+
end.sort
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
@@ -7,7 +7,7 @@ module Rubycritic
|
|
7
7
|
RUBY_FILES = File.join("**", "*#{RUBY_EXTENSION}")
|
8
8
|
|
9
9
|
def initialize(paths)
|
10
|
-
@
|
10
|
+
@initial_paths = paths
|
11
11
|
end
|
12
12
|
|
13
13
|
def pathnames
|
@@ -21,17 +21,13 @@ module Rubycritic
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def expand_paths
|
24
|
-
@
|
24
|
+
@initial_paths.map do |path|
|
25
25
|
if File.directory?(path)
|
26
|
-
Pathname.glob(
|
26
|
+
Pathname.glob(File.join(path, RUBY_FILES))
|
27
27
|
elsif File.exists?(path) && File.extname(path) == RUBY_EXTENSION
|
28
28
|
Pathname.new(path)
|
29
29
|
end
|
30
|
-
end.flatten.compact.sort
|
31
|
-
end
|
32
|
-
|
33
|
-
def files_contained_in(path)
|
34
|
-
(path == ".") ? RUBY_FILES : File.join(path, RUBY_FILES)
|
30
|
+
end.flatten.compact.map(&:cleanpath).sort
|
35
31
|
end
|
36
32
|
end
|
37
33
|
|
data/lib/rubycritic/version.rb
CHANGED
data/rubycritic.gemspec
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "rubycritic/analysers/flay"
|
3
|
+
require "rubycritic/smell_adapters/flay"
|
4
|
+
|
5
|
+
describe Rubycritic::SmellAdapter::Flay do
|
6
|
+
before do
|
7
|
+
sample_path = "test/samples/flay/smelly.rb"
|
8
|
+
flay = Rubycritic::Analyser::Flay.new([sample_path])
|
9
|
+
@adapter = Rubycritic::SmellAdapter::Flay.new(flay)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "detects smells" do
|
13
|
+
@adapter.smells.wont_be_empty
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has smells with messages" do
|
17
|
+
smell = @adapter.smells.first
|
18
|
+
smell.message.must_equal "found in 2 nodes"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "has smells with messages" do
|
22
|
+
smell = @adapter.smells.first
|
23
|
+
smell.score.must_be_kind_of Numeric
|
24
|
+
end
|
25
|
+
end
|
@@ -18,24 +18,34 @@ describe Rubycritic::SourceLocator do
|
|
18
18
|
Rubycritic::SourceLocator.new(paths).paths.must_equal paths
|
19
19
|
end
|
20
20
|
|
21
|
+
it "finds all the files inside a given directory" do
|
22
|
+
initial_paths = ["dir1"]
|
23
|
+
final_paths = ["dir1/file1.rb"]
|
24
|
+
Rubycritic::SourceLocator.new(initial_paths).paths.must_equal final_paths
|
25
|
+
end
|
26
|
+
|
21
27
|
it "finds all the files" do
|
22
|
-
|
23
|
-
|
28
|
+
initial_paths = ["."]
|
29
|
+
final_paths = ["dir1/file1.rb", "file0.rb"]
|
30
|
+
Rubycritic::SourceLocator.new(initial_paths).paths.must_equal final_paths
|
24
31
|
end
|
25
32
|
|
26
|
-
it "
|
27
|
-
|
28
|
-
|
33
|
+
it "cleans paths of consecutive slashes and useless dots" do
|
34
|
+
initial_paths = [".//file0.rb"]
|
35
|
+
final_paths = ["file0.rb"]
|
36
|
+
Rubycritic::SourceLocator.new(initial_paths).paths.must_equal final_paths
|
29
37
|
end
|
30
38
|
|
31
39
|
it "ignores paths to non-existent files" do
|
32
|
-
|
33
|
-
|
40
|
+
initial_paths = ["non_existent_dir1/non_existent_file1.rb", "non_existent_file0.rb"]
|
41
|
+
final_paths = []
|
42
|
+
Rubycritic::SourceLocator.new(initial_paths).paths.must_equal final_paths
|
34
43
|
end
|
35
44
|
|
36
45
|
it "ignores paths to files that do not match the Ruby extension" do
|
37
|
-
|
38
|
-
|
46
|
+
initial_paths = ["file_with_no_extension", "file_with_different_extension.py"]
|
47
|
+
final_paths = []
|
48
|
+
Rubycritic::SourceLocator.new(initial_paths).paths.must_equal final_paths
|
39
49
|
end
|
40
50
|
end
|
41
51
|
|
@@ -1,7 +1,14 @@
|
|
1
|
-
class
|
2
|
-
attr_reader :
|
1
|
+
class Perfume
|
2
|
+
attr_reader :perfumed
|
3
3
|
|
4
|
-
def
|
4
|
+
def ignoreRubyStyle(oneParameter)
|
5
5
|
oneVariable = oneParameter
|
6
6
|
end
|
7
|
+
|
8
|
+
def allowNestingIteratorsTwoLevelsDeep
|
9
|
+
loop do
|
10
|
+
loop do
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
7
14
|
end
|
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.7
|
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-04-
|
11
|
+
date: 2014-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: flay
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.4.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.4.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: flog
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,6 +142,7 @@ files:
|
|
128
142
|
- lib/rubycritic.rb
|
129
143
|
- lib/rubycritic/active_support/methods.rb
|
130
144
|
- lib/rubycritic/analysers/config.reek
|
145
|
+
- lib/rubycritic/analysers/flay.rb
|
131
146
|
- lib/rubycritic/analysers/flog.rb
|
132
147
|
- lib/rubycritic/analysers/reek.rb
|
133
148
|
- lib/rubycritic/analysers_runner.rb
|
@@ -151,6 +166,7 @@ files:
|
|
151
166
|
- lib/rubycritic/report_generators/view_helpers.rb
|
152
167
|
- lib/rubycritic/revision_comparator.rb
|
153
168
|
- lib/rubycritic/smell.rb
|
169
|
+
- lib/rubycritic/smell_adapters/flay.rb
|
154
170
|
- lib/rubycritic/smell_adapters/flog.rb
|
155
171
|
- lib/rubycritic/smell_adapters/reek.rb
|
156
172
|
- lib/rubycritic/smells_aggregator.rb
|
@@ -163,6 +179,7 @@ files:
|
|
163
179
|
- rubycritic.gemspec
|
164
180
|
- test/lib/rubycritic/analysers_runner_test.rb
|
165
181
|
- test/lib/rubycritic/location_test.rb
|
182
|
+
- test/lib/rubycritic/metric_adapters/flay_adapter_test.rb
|
166
183
|
- test/lib/rubycritic/metric_adapters/flog_adapter_test.rb
|
167
184
|
- test/lib/rubycritic/metric_adapters/reek_adapter_test.rb
|
168
185
|
- test/lib/rubycritic/smell_test.rb
|
@@ -172,6 +189,7 @@ files:
|
|
172
189
|
- test/lib/rubycritic/source_control_systems/source_control_system_test.rb
|
173
190
|
- test/lib/rubycritic/source_locator_test.rb
|
174
191
|
- test/lib/rubycritic/version_test.rb
|
192
|
+
- test/samples/flay/smelly.rb
|
175
193
|
- test/samples/flog/smelly.rb
|
176
194
|
- test/samples/location/dir1/file1.rb
|
177
195
|
- test/samples/location/file0.rb
|
@@ -207,6 +225,7 @@ summary: Ruby code smell detector
|
|
207
225
|
test_files:
|
208
226
|
- test/lib/rubycritic/analysers_runner_test.rb
|
209
227
|
- test/lib/rubycritic/location_test.rb
|
228
|
+
- test/lib/rubycritic/metric_adapters/flay_adapter_test.rb
|
210
229
|
- test/lib/rubycritic/metric_adapters/flog_adapter_test.rb
|
211
230
|
- test/lib/rubycritic/metric_adapters/reek_adapter_test.rb
|
212
231
|
- test/lib/rubycritic/smell_test.rb
|
@@ -216,6 +235,7 @@ test_files:
|
|
216
235
|
- test/lib/rubycritic/source_control_systems/source_control_system_test.rb
|
217
236
|
- test/lib/rubycritic/source_locator_test.rb
|
218
237
|
- test/lib/rubycritic/version_test.rb
|
238
|
+
- test/samples/flay/smelly.rb
|
219
239
|
- test/samples/flog/smelly.rb
|
220
240
|
- test/samples/location/dir1/file1.rb
|
221
241
|
- test/samples/location/file0.rb
|