rubycritic 0.0.6 → 0.0.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ff62ecc1acf094e82a10bf40ef08f3e99f503994
4
- data.tar.gz: b72615619b79aeff062110b689f0795768a81ab4
3
+ metadata.gz: a776a51f8d90b8d2b65bb2e81f6b4dea87cd63a4
4
+ data.tar.gz: 4f35ecbef41031dd622513ef120ca1fab15e1e10
5
5
  SHA512:
6
- metadata.gz: 678cf22b3f926a270505432a1c7c473d782b05e93b647c3cb0754c25d606d35a76ff7af26d44182bfaeeddbc5845e07a8a6c219228b880f562940e5f8b1ec814
7
- data.tar.gz: 46abcfc03b41e1824bc7acdd017955a2850095faf8ed3996cb698615e74f34d01ef108727dee9df7095d754bbf23c55ca4bdba6fa890106f33fd9893d1d570fb
6
+ metadata.gz: 078000998ba31e7c53c637dfda9184e8dfcdc90e28750afd88a4c35949f86feb38b785be71a2038d7704d2acd12d9182b905f19cafa00329ae20f99db51f1592
7
+ data.tar.gz: fff0b984ed7ebe0e120ceb0ed13947eacea027162312e80e84d7dbe9e96b1f998ecd8be4cd9dfd8e3fc659a50a252261a8ec63ba6310b323b42eda3885327d17
@@ -16,3 +16,5 @@ UncommunicativeVariableName:
16
16
  reject:
17
17
  - !ruby/regexp /^.$/
18
18
  - !ruby/regexp /[0-9]$/
19
+ NestedIterators:
20
+ max_allowed_nesting: 2
@@ -0,0 +1,15 @@
1
+ require "flay"
2
+
3
+ module Rubycritic
4
+ module Analyser
5
+
6
+ class Flay < ::Flay
7
+ def initialize(paths)
8
+ super()
9
+ process(*paths)
10
+ analyze
11
+ end
12
+ end
13
+
14
+ end
15
+ end
@@ -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 |pathname|
39
- file_smells = @smelly_pathnames[pathname]
40
- FileGenerator.new(pathname, file_smells)
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 = method_location(context)
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 method_location(context)
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.sort.map do |file_line|
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
 
@@ -8,7 +8,7 @@ module Rubycritic
8
8
  end
9
9
 
10
10
  def load
11
- Marshal.load(File.read(@file_name))
11
+ Marshal.load(File.binread(@file_name))
12
12
  end
13
13
 
14
14
  def dump(smelly_pathnames)
@@ -7,7 +7,7 @@ module Rubycritic
7
7
  RUBY_FILES = File.join("**", "*#{RUBY_EXTENSION}")
8
8
 
9
9
  def initialize(paths)
10
- @user_paths = paths
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
- @user_paths.map do |path|
24
+ @initial_paths.map do |path|
25
25
  if File.directory?(path)
26
- Pathname.glob(files_contained_in(path))
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
 
@@ -1,3 +1,3 @@
1
1
  module Rubycritic
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
data/rubycritic.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.require_path = "lib"
22
22
 
23
23
  spec.add_runtime_dependency "virtus", "~> 1.0"
24
+ spec.add_runtime_dependency "flay", "2.4.0"
24
25
  spec.add_runtime_dependency "flog", "4.2.0"
25
26
  spec.add_runtime_dependency "reek", "1.3.6"
26
27
 
@@ -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
- paths = ["dir1/file1.rb", "file0.rb"]
23
- Rubycritic::SourceLocator.new(["."]).paths.must_equal paths
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 "finds all the files inside a given directory" do
27
- paths = ["dir1/file1.rb"]
28
- Rubycritic::SourceLocator.new(["dir1"]).paths.must_equal paths
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
- paths = ["non_existent_dir1/non_existent_file1.rb", "non_existent_file0.rb"]
33
- Rubycritic::SourceLocator.new(paths).paths.must_equal []
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
- paths = ["file_with_no_extension", "file_with_different_extension.py"]
38
- Rubycritic::SourceLocator.new(paths).paths.must_equal []
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
 
@@ -0,0 +1,17 @@
1
+ class Ramsay
2
+ def flay(parts)
3
+ parts -= 1
4
+ parts -= 2
5
+ parts -= 3
6
+ parts -= 4
7
+ end
8
+ end
9
+
10
+ class Roose
11
+ def flay(parts)
12
+ parts -= 1
13
+ parts -= 2
14
+ parts -= 3
15
+ parts -= 4
16
+ end
17
+ end
@@ -1,7 +1,14 @@
1
- class Perfumed
2
- attr_reader :perfume
1
+ class Perfume
2
+ attr_reader :perfumed
3
3
 
4
- def ignoresRubyStyle(oneParameter)
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.6
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-22 00:00:00.000000000 Z
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