reek 1.4.0 → 1.5.0

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.
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