reek 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +5 -0
  3. data/README.md +70 -92
  4. data/config/defaults.reek +3 -0
  5. data/features/samples.feature +24 -20
  6. data/features/step_definitions/reek_steps.rb +1 -1
  7. data/features/support/env.rb +7 -7
  8. data/lib/reek/core/code_context.rb +1 -1
  9. data/lib/reek/core/code_parser.rb +19 -18
  10. data/lib/reek/core/method_context.rb +8 -7
  11. data/lib/reek/core/module_context.rb +1 -1
  12. data/lib/reek/core/smell_repository.rb +1 -0
  13. data/lib/reek/core/sniffer.rb +3 -1
  14. data/lib/reek/rake/task.rb +1 -5
  15. data/lib/reek/smell_description.rb +26 -0
  16. data/lib/reek/smell_warning.rb +35 -49
  17. data/lib/reek/smells.rb +1 -0
  18. data/lib/reek/smells/attribute.rb +1 -1
  19. data/lib/reek/smells/control_parameter.rb +14 -7
  20. data/lib/reek/smells/data_clump.rb +1 -1
  21. data/lib/reek/smells/duplicate_method_call.rb +2 -9
  22. data/lib/reek/smells/module_initialize.rb +38 -0
  23. data/lib/reek/smells/nested_iterators.rb +1 -1
  24. data/lib/reek/smells/nil_check.rb +3 -3
  25. data/lib/reek/smells/repeated_conditional.rb +3 -2
  26. data/lib/reek/smells/smell_detector.rb +1 -1
  27. data/lib/reek/smells/too_many_instance_variables.rb +1 -1
  28. data/lib/reek/smells/too_many_methods.rb +1 -1
  29. data/lib/reek/smells/uncommunicative_method_name.rb +0 -4
  30. data/lib/reek/smells/uncommunicative_parameter_name.rb +0 -4
  31. data/lib/reek/smells/uncommunicative_variable_name.rb +11 -9
  32. data/lib/reek/smells/utility_function.rb +2 -2
  33. data/lib/reek/source/ast_node.rb +40 -0
  34. data/lib/reek/source/ast_node_class_map.rb +37 -0
  35. data/lib/reek/source/reference_collector.rb +3 -3
  36. data/lib/reek/source/sexp_extensions.rb +133 -59
  37. data/lib/reek/source/sexp_formatter.rb +10 -4
  38. data/lib/reek/source/sexp_node.rb +25 -17
  39. data/lib/reek/source/source_code.rb +21 -9
  40. data/lib/reek/source/tree_dresser.rb +10 -33
  41. data/lib/reek/version.rb +1 -1
  42. data/reek.gemspec +2 -4
  43. data/spec/matchers/smell_of_matcher.rb +9 -1
  44. data/spec/quality/reek_source_spec.rb +0 -35
  45. data/spec/reek/core/code_context_spec.rb +22 -8
  46. data/spec/reek/core/method_context_spec.rb +10 -10
  47. data/spec/reek/smell_description_spec.rb +43 -0
  48. data/spec/reek/smell_warning_spec.rb +0 -3
  49. data/spec/reek/smells/control_parameter_spec.rb +24 -0
  50. data/spec/reek/smells/feature_envy_spec.rb +50 -17
  51. data/spec/reek/smells/irresponsible_module_spec.rb +25 -17
  52. data/spec/reek/smells/module_initialize_spec.rb +20 -0
  53. data/spec/reek/smells/prima_donna_method_spec.rb +2 -2
  54. data/spec/reek/smells/repeated_conditional_spec.rb +10 -4
  55. data/spec/reek/smells/too_many_instance_variables_spec.rb +47 -21
  56. data/spec/reek/smells/too_many_statements_spec.rb +11 -1
  57. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +1 -1
  58. data/spec/reek/smells/utility_function_spec.rb +26 -25
  59. data/spec/reek/source/sexp_extensions_spec.rb +164 -91
  60. data/spec/reek/source/sexp_formatter_spec.rb +13 -1
  61. data/spec/reek/source/sexp_node_spec.rb +5 -5
  62. data/spec/reek/source/source_code_spec.rb +18 -6
  63. data/spec/reek/source/tree_dresser_spec.rb +5 -5
  64. data/spec/spec_helper.rb +8 -4
  65. metadata +16 -50
@@ -11,8 +11,20 @@ describe SexpFormatter do
11
11
  end
12
12
 
13
13
  it 'formats a more complex s-expression' do
14
- result = SexpFormatter.format s(:call, nil, :foo, s(:arglist, s(:lvar, :bar)))
14
+ result = SexpFormatter.format s(:send, nil, :foo, s(:lvar, :bar))
15
15
  expect(result).to eq('foo(bar)')
16
16
  end
17
+
18
+ it 'reduces very large ASTs to a single line' do
19
+ ast = s(:if,
20
+ s(:send, nil, :foo),
21
+ s(:send, nil, :bar),
22
+ s(:begin,
23
+ s(:send, nil, :baz),
24
+ s(:send, nil, :qux)))
25
+ result = SexpFormatter.format ast
26
+
27
+ expect(result).to eq 'if foo ... end'
28
+ end
17
29
  end
18
30
  end
@@ -7,20 +7,20 @@ describe SexpNode do
7
7
  context 'format' do
8
8
  it 'formats self' do
9
9
  @node = s(:self)
10
- @node.extend(SexpNode)
11
10
  expect(@node.format_ruby).to eq('self')
12
11
  end
13
12
  end
14
13
 
15
14
  context 'hash' do
16
15
  it 'hashes equal for equal sexps' do
17
- node1 = ast(:defn, s(:const2, :Fred, :jim), s(:call, :+, s(:lit, 4), :fred))
18
- node2 = ast(:defn, s(:const2, :Fred, :jim), s(:call, :+, s(:lit, 4), :fred))
16
+ node1 = s(:def, :jim, s(:args), s(:send, s(:int, 4), :+, s(:send, nil, :fred)))
17
+ node2 = s(:def, :jim, s(:args), s(:send, s(:int, 4), :+, s(:send, nil, :fred)))
19
18
  expect(node1.hash).to eq(node2.hash)
20
19
  end
20
+
21
21
  it 'hashes diferent for diferent sexps' do
22
- node1 = ast(:defn, s(:const2, :Fred, :jim), s(:call, :+, s(:lit, 4), :fred))
23
- node2 = ast(:defn, s(:const2, :Fred, :jim), s(:call, :+, s(:lit, 3), :fred))
22
+ node1 = s(:def, :jim, s(:args), s(:send, s(:int, 4), :+, s(:send, nil, :fred)))
23
+ node2 = s(:def, :jim, s(:args), s(:send, s(:int, 3), :+, s(:send, nil, :fred)))
24
24
  expect(node1.hash).not_to eq(node2.hash)
25
25
  end
26
26
  end
@@ -5,6 +5,14 @@ require 'reek/source/source_code'
5
5
  include Reek::Source
6
6
 
7
7
  describe SourceCode do
8
+ describe '#syntax_tree' do
9
+ it 'associates comments with the AST' do
10
+ source_code = SourceCode.new("# this is\n# a comment\ndef foo; end", '(string)')
11
+ result = source_code.syntax_tree
12
+ expect(result.comments).to eq "# this is\n# a comment"
13
+ end
14
+ end
15
+
8
16
  context 'when the parser fails' do
9
17
  let(:source_name) { 'Test source' }
10
18
  let(:error_message) { 'Error message' }
@@ -23,7 +31,7 @@ describe SourceCode do
23
31
  end
24
32
 
25
33
  it 'returns an empty syntax tree' do
26
- expect(src.syntax_tree).to eq(s())
34
+ expect(src.syntax_tree).to eq(s(:empty))
27
35
  end
28
36
 
29
37
  it 'records the syntax error' do
@@ -42,11 +50,13 @@ describe SourceCode do
42
50
  end
43
51
  end
44
52
 
45
- context 'with a RubyParser::SyntaxError' do
46
- let(:error_class) { RubyParser::SyntaxError }
53
+ context 'with a Parser::SyntaxError' do
54
+ let(:error_class) { Parser::SyntaxError }
55
+ let(:diagnostic) { double('diagnostic', message: error_message) }
47
56
 
48
57
  before do
49
- allow(parser).to receive(:parse).and_raise(error_class.new(error_message))
58
+ allow(parser).to receive(:parse_with_comments).
59
+ and_raise error_class.new(diagnostic)
50
60
  end
51
61
 
52
62
  it_should_behave_like 'handling and recording the error'
@@ -56,7 +66,8 @@ describe SourceCode do
56
66
  let(:error_class) { Racc::ParseError }
57
67
 
58
68
  before do
59
- allow(parser).to receive(:parse).and_raise(error_class.new(error_message))
69
+ allow(parser).to receive(:parse_with_comments).
70
+ and_raise(error_class.new(error_message))
60
71
  end
61
72
 
62
73
  it_should_behave_like 'handling and recording the error'
@@ -66,7 +77,8 @@ describe SourceCode do
66
77
  let(:error_class) { RuntimeError }
67
78
 
68
79
  before do
69
- allow(parser).to receive(:parse).and_raise(error_class.new(error_message))
80
+ allow(parser).to receive(:parse_with_comments).
81
+ and_raise(error_class.new(error_message))
70
82
  end
71
83
 
72
84
  it 'raises the error' do
@@ -4,15 +4,15 @@ require 'reek/source/tree_dresser'
4
4
  include Reek::Source
5
5
 
6
6
  describe TreeDresser do
7
- let(:ifnode) { Sexp.new(:if) }
8
- let(:callnode) { Sexp.new(:call) }
7
+ let(:ifnode) { Parser::AST::Node.new(:if) }
8
+ let(:sendnode) { Parser::AST::Node.new(:send) }
9
9
  let(:dresser) { TreeDresser.new }
10
10
 
11
11
  it 'dresses :if sexp with IfNode' do
12
- expect(dresser.dress(ifnode)).to be_a Reek::Source::SexpExtensions::IfNode
12
+ expect(dresser.dress(ifnode, {})).to be_a Reek::Source::SexpExtensions::IfNode
13
13
  end
14
14
 
15
- it 'dresses :call sexp with CallNode' do
16
- expect(dresser.dress(callnode)).to be_a Reek::Source::SexpExtensions::CallNode
15
+ it 'dresses :send sexp with SendNode' do
16
+ expect(dresser.dress(sendnode, {})).to be_a Reek::Source::SexpExtensions::SendNode
17
17
  end
18
18
  end
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,18 @@
1
1
  require 'reek/spec'
2
- require 'reek/source/tree_dresser'
2
+ require 'reek/source/ast_node_class_map'
3
3
 
4
4
  require 'matchers/smell_of_matcher'
5
5
 
6
6
  SAMPLES_DIR = 'spec/samples'
7
7
 
8
+ # :reek:UncommunicativeMethodName
9
+ def s(type, *children)
10
+ @klass_map ||= Reek::Source::AstNodeClassMap.new
11
+ @klass_map.klass_for(type).new(type, children)
12
+ end
13
+
8
14
  def ast(*args)
9
- result = Reek::Source::TreeDresser.new.dress(s(*args))
10
- result.line = 1
11
- result
15
+ s(*args)
12
16
  end
13
17
 
14
18
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reek
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Rutherford
@@ -10,62 +10,36 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-11-09 00:00:00.000000000 Z
13
+ date: 2014-12-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: ruby_parser
17
- requirement: !ruby/object:Gem::Requirement
18
- requirements:
19
- - - ">="
20
- - !ruby/object:Gem::Version
21
- version: 3.5.0
22
- - - "<"
23
- - !ruby/object:Gem::Version
24
- version: '4.0'
25
- type: :runtime
26
- prerelease: false
27
- version_requirements: !ruby/object:Gem::Requirement
28
- requirements:
29
- - - ">="
30
- - !ruby/object:Gem::Version
31
- version: 3.5.0
32
- - - "<"
33
- - !ruby/object:Gem::Version
34
- version: '4.0'
35
- - !ruby/object:Gem::Dependency
36
- name: sexp_processor
16
+ name: parser
37
17
  requirement: !ruby/object:Gem::Requirement
38
18
  requirements:
39
19
  - - "~>"
40
20
  - !ruby/object:Gem::Version
41
- version: '4.4'
21
+ version: 2.2.0.pre.7
42
22
  type: :runtime
43
23
  prerelease: false
44
24
  version_requirements: !ruby/object:Gem::Requirement
45
25
  requirements:
46
26
  - - "~>"
47
27
  - !ruby/object:Gem::Version
48
- version: '4.4'
28
+ version: 2.2.0.pre.7
49
29
  - !ruby/object:Gem::Dependency
50
- name: ruby2ruby
30
+ name: unparser
51
31
  requirement: !ruby/object:Gem::Requirement
52
32
  requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: 2.0.8
56
- - - "<"
33
+ - - "~>"
57
34
  - !ruby/object:Gem::Version
58
- version: '3.0'
35
+ version: 0.1.16
59
36
  type: :runtime
60
37
  prerelease: false
61
38
  version_requirements: !ruby/object:Gem::Requirement
62
39
  requirements:
63
- - - ">="
64
- - !ruby/object:Gem::Version
65
- version: 2.0.8
66
- - - "<"
40
+ - - "~>"
67
41
  - !ruby/object:Gem::Version
68
- version: '3.0'
42
+ version: 0.1.16
69
43
  - !ruby/object:Gem::Dependency
70
44
  name: rainbow
71
45
  requirement: !ruby/object:Gem::Requirement
@@ -142,20 +116,6 @@ dependencies:
142
116
  - - "~>"
143
117
  - !ruby/object:Gem::Version
144
118
  version: '3.0'
145
- - !ruby/object:Gem::Dependency
146
- name: flay
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: '2.4'
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - "~>"
157
- - !ruby/object:Gem::Version
158
- version: '2.4'
159
119
  - !ruby/object:Gem::Dependency
160
120
  name: yard
161
121
  requirement: !ruby/object:Gem::Requirement
@@ -233,6 +193,7 @@ files:
233
193
  - lib/reek/core/warning_collector.rb
234
194
  - lib/reek/examiner.rb
235
195
  - lib/reek/rake/task.rb
196
+ - lib/reek/smell_description.rb
236
197
  - lib/reek/smell_warning.rb
237
198
  - lib/reek/smells.rb
238
199
  - lib/reek/smells/attribute.rb
@@ -245,6 +206,7 @@ files:
245
206
  - lib/reek/smells/irresponsible_module.rb
246
207
  - lib/reek/smells/long_parameter_list.rb
247
208
  - lib/reek/smells/long_yield_list.rb
209
+ - lib/reek/smells/module_initialize.rb
248
210
  - lib/reek/smells/nested_iterators.rb
249
211
  - lib/reek/smells/nil_check.rb
250
212
  - lib/reek/smells/prima_donna_method.rb
@@ -260,6 +222,8 @@ files:
260
222
  - lib/reek/smells/unused_parameters.rb
261
223
  - lib/reek/smells/utility_function.rb
262
224
  - lib/reek/source.rb
225
+ - lib/reek/source/ast_node.rb
226
+ - lib/reek/source/ast_node_class_map.rb
263
227
  - lib/reek/source/code_comment.rb
264
228
  - lib/reek/source/config_file.rb
265
229
  - lib/reek/source/core_extras.rb
@@ -295,6 +259,7 @@ files:
295
259
  - spec/reek/core/stop_context_spec.rb
296
260
  - spec/reek/core/warning_collector_spec.rb
297
261
  - spec/reek/examiner_spec.rb
262
+ - spec/reek/smell_description_spec.rb
298
263
  - spec/reek/smell_warning_spec.rb
299
264
  - spec/reek/smells/attribute_spec.rb
300
265
  - spec/reek/smells/behaves_like_variable_detector.rb
@@ -307,6 +272,7 @@ files:
307
272
  - spec/reek/smells/irresponsible_module_spec.rb
308
273
  - spec/reek/smells/long_parameter_list_spec.rb
309
274
  - spec/reek/smells/long_yield_list_spec.rb
275
+ - spec/reek/smells/module_initialize_spec.rb
310
276
  - spec/reek/smells/nested_iterators_spec.rb
311
277
  - spec/reek/smells/nil_check_spec.rb
312
278
  - spec/reek/smells/prima_donna_method_spec.rb