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.
- checksums.yaml +4 -4
- data/CHANGELOG +5 -0
- data/README.md +70 -92
- data/config/defaults.reek +3 -0
- data/features/samples.feature +24 -20
- data/features/step_definitions/reek_steps.rb +1 -1
- data/features/support/env.rb +7 -7
- data/lib/reek/core/code_context.rb +1 -1
- data/lib/reek/core/code_parser.rb +19 -18
- data/lib/reek/core/method_context.rb +8 -7
- data/lib/reek/core/module_context.rb +1 -1
- data/lib/reek/core/smell_repository.rb +1 -0
- data/lib/reek/core/sniffer.rb +3 -1
- data/lib/reek/rake/task.rb +1 -5
- data/lib/reek/smell_description.rb +26 -0
- data/lib/reek/smell_warning.rb +35 -49
- data/lib/reek/smells.rb +1 -0
- data/lib/reek/smells/attribute.rb +1 -1
- data/lib/reek/smells/control_parameter.rb +14 -7
- data/lib/reek/smells/data_clump.rb +1 -1
- data/lib/reek/smells/duplicate_method_call.rb +2 -9
- data/lib/reek/smells/module_initialize.rb +38 -0
- data/lib/reek/smells/nested_iterators.rb +1 -1
- data/lib/reek/smells/nil_check.rb +3 -3
- data/lib/reek/smells/repeated_conditional.rb +3 -2
- data/lib/reek/smells/smell_detector.rb +1 -1
- data/lib/reek/smells/too_many_instance_variables.rb +1 -1
- data/lib/reek/smells/too_many_methods.rb +1 -1
- data/lib/reek/smells/uncommunicative_method_name.rb +0 -4
- data/lib/reek/smells/uncommunicative_parameter_name.rb +0 -4
- data/lib/reek/smells/uncommunicative_variable_name.rb +11 -9
- data/lib/reek/smells/utility_function.rb +2 -2
- data/lib/reek/source/ast_node.rb +40 -0
- data/lib/reek/source/ast_node_class_map.rb +37 -0
- data/lib/reek/source/reference_collector.rb +3 -3
- data/lib/reek/source/sexp_extensions.rb +133 -59
- data/lib/reek/source/sexp_formatter.rb +10 -4
- data/lib/reek/source/sexp_node.rb +25 -17
- data/lib/reek/source/source_code.rb +21 -9
- data/lib/reek/source/tree_dresser.rb +10 -33
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +2 -4
- data/spec/matchers/smell_of_matcher.rb +9 -1
- data/spec/quality/reek_source_spec.rb +0 -35
- data/spec/reek/core/code_context_spec.rb +22 -8
- data/spec/reek/core/method_context_spec.rb +10 -10
- data/spec/reek/smell_description_spec.rb +43 -0
- data/spec/reek/smell_warning_spec.rb +0 -3
- data/spec/reek/smells/control_parameter_spec.rb +24 -0
- data/spec/reek/smells/feature_envy_spec.rb +50 -17
- data/spec/reek/smells/irresponsible_module_spec.rb +25 -17
- data/spec/reek/smells/module_initialize_spec.rb +20 -0
- data/spec/reek/smells/prima_donna_method_spec.rb +2 -2
- data/spec/reek/smells/repeated_conditional_spec.rb +10 -4
- data/spec/reek/smells/too_many_instance_variables_spec.rb +47 -21
- data/spec/reek/smells/too_many_statements_spec.rb +11 -1
- data/spec/reek/smells/uncommunicative_variable_name_spec.rb +1 -1
- data/spec/reek/smells/utility_function_spec.rb +26 -25
- data/spec/reek/source/sexp_extensions_spec.rb +164 -91
- data/spec/reek/source/sexp_formatter_spec.rb +13 -1
- data/spec/reek/source/sexp_node_spec.rb +5 -5
- data/spec/reek/source/source_code_spec.rb +18 -6
- data/spec/reek/source/tree_dresser_spec.rb +5 -5
- data/spec/spec_helper.rb +8 -4
- 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(:
|
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 =
|
18
|
-
node2 =
|
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 =
|
23
|
-
node2 =
|
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
|
46
|
-
let(:error_class) {
|
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(:
|
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(:
|
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(:
|
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) {
|
8
|
-
let(:
|
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 :
|
16
|
-
expect(dresser.dress(
|
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/
|
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
|
-
|
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
|
+
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-
|
13
|
+
date: 2014-12-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
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:
|
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:
|
28
|
+
version: 2.2.0.pre.7
|
49
29
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
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:
|
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:
|
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
|