reek 3.8.3 → 3.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile +16 -6
- data/README.md +1 -0
- data/features/command_line_interface/smells_count.feature +1 -1
- data/features/command_line_interface/stdin.feature +1 -1
- data/features/configuration_loading.feature +2 -2
- data/features/programmatic_access.feature +2 -2
- data/features/rake_task/rake_task.feature +4 -4
- data/features/reports/json.feature +2 -2
- data/features/reports/reports.feature +6 -6
- data/features/reports/yaml.feature +2 -2
- data/features/samples.feature +19 -19
- data/features/step_definitions/sample_file_steps.rb +1 -1
- data/lib/reek/ast/node.rb +12 -1
- data/lib/reek/ast/sexp_extensions.rb +1 -0
- data/lib/reek/ast/sexp_extensions/constant.rb +9 -0
- data/lib/reek/ast/sexp_extensions/methods.rb +1 -20
- data/lib/reek/ast/sexp_extensions/module.rb +2 -2
- data/lib/reek/ast/sexp_extensions/self.rb +12 -0
- data/lib/reek/ast/sexp_extensions/send.rb +4 -9
- data/lib/reek/ast/sexp_extensions/super.rb +1 -1
- data/lib/reek/ast/sexp_extensions/variables.rb +5 -0
- data/lib/reek/context/attribute_context.rb +12 -0
- data/lib/reek/context/code_context.rb +28 -26
- data/lib/reek/context/ghost_context.rb +54 -0
- data/lib/reek/context/method_context.rb +28 -1
- data/lib/reek/context/module_context.rb +55 -1
- data/lib/reek/context/root_context.rb +8 -0
- data/lib/reek/context/singleton_attribute_context.rb +15 -0
- data/lib/reek/context/singleton_method_context.rb +20 -0
- data/lib/reek/context/visibility_tracker.rb +25 -16
- data/lib/reek/context_builder.rb +61 -31
- data/lib/reek/examiner.rb +0 -6
- data/lib/reek/smells/control_parameter.rb +1 -1
- data/lib/reek/smells/nested_iterators.rb +1 -1
- data/lib/reek/smells/nil_check.rb +2 -2
- data/lib/reek/smells/utility_function.rb +1 -2
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +1 -12
- data/spec/reek/ast/node_spec.rb +51 -3
- data/spec/reek/ast/sexp_extensions_spec.rb +16 -3
- data/spec/reek/context/code_context_spec.rb +12 -31
- data/spec/reek/context/ghost_context_spec.rb +60 -0
- data/spec/reek/context/module_context_spec.rb +22 -2
- data/spec/reek/context_builder_spec.rb +225 -2
- data/spec/reek/examiner_spec.rb +1 -1
- data/spec/reek/smells/attribute_spec.rb +35 -0
- data/spec/reek/smells/duplicate_method_call_spec.rb +1 -1
- data/spec/reek/tree_dresser_spec.rb +0 -1
- data/spec/samples/checkstyle.xml +2 -2
- metadata +8 -152
- data/lib/reek/ast/sexp_formatter.rb +0 -31
- data/spec/reek/ast/sexp_formatter_spec.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06a12fafe3940db75ef71b4c2a1b94d690156bf5
|
4
|
+
data.tar.gz: e38b40afe0d1be94dc9f449274d57568c42018d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 01fadfe2c811ab7762ccb7994767dc6e4e4c78b7e425a089c551c609fd289fd542fdde5ab2fe3c891af243b240d74148618efb5c84c10dc8ff83c287a6b87224
|
7
|
+
data.tar.gz: 98d4b2aa2a433892b4b65943d8a3f98ba9c5b0645acc1eed971225d1543fc2ab3d318fd60cf4a321348efa9339dbcd572c29e87e6eb49dcda96eb61e8b9579b4
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -1,16 +1,26 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
# The gem's dependencies are specified in the gemspec
|
4
3
|
gemspec
|
5
4
|
|
6
|
-
group :
|
7
|
-
gem '
|
8
|
-
gem '
|
5
|
+
group :development do
|
6
|
+
gem 'aruba', '~> 0.10.0'
|
7
|
+
gem 'ataru', '~> 0.2.0'
|
8
|
+
gem 'cucumber', '~> 2.0'
|
9
|
+
gem 'factory_girl', '~> 4.0'
|
10
|
+
gem 'rake', '~> 10.0'
|
11
|
+
gem 'rspec', '~> 3.0'
|
12
|
+
gem 'rubocop', '~> 0.34.0'
|
13
|
+
gem 'yard', '~> 0.8.7'
|
9
14
|
|
15
|
+
platforms :mri do
|
16
|
+
gem 'redcarpet', '~> 3.3.1'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
group :debugging do
|
21
|
+
gem 'pry'
|
10
22
|
platforms :mri do
|
11
23
|
gem 'pry-byebug'
|
12
24
|
gem 'pry-stack_explorer'
|
13
|
-
|
14
|
-
gem 'redcarpet', '~> 3.3.1'
|
15
25
|
end
|
16
26
|
end
|
data/README.md
CHANGED
@@ -403,6 +403,7 @@ Be careful though, Reek does not merge your configuration entries, so if you alr
|
|
403
403
|
* [Vim plugin](https://github.com/rainerborene/vim-reek)
|
404
404
|
* [TextMate Bundle](https://github.com/peeyush1234/reek.tmbundle)
|
405
405
|
* [Atom plugin](https://atom.io/packages/linter-reek)
|
406
|
+
* [SublimeLinter plugin](https://packagecontrol.io/packages/SublimeLinter-contrib-reek)
|
406
407
|
|
407
408
|
### Projects that use or support us
|
408
409
|
|
@@ -10,7 +10,7 @@ Feature: Reports total number of code smells
|
|
10
10
|
"""
|
11
11
|
smelly.rb -- 3 warnings:
|
12
12
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
13
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
13
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
14
14
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
15
15
|
"""
|
16
16
|
|
@@ -33,7 +33,7 @@ Feature: Reek reads from $stdin when no files are given
|
|
33
33
|
"""
|
34
34
|
|
35
35
|
Scenario: syntax error causes the source to be ignored
|
36
|
-
When I pass "
|
36
|
+
When I pass "= invalid syntax =" to reek
|
37
37
|
Then it reports a parsing error
|
38
38
|
Then it succeeds
|
39
39
|
And it reports nothing
|
@@ -18,7 +18,7 @@ Feature: Offer different ways how to load configuration
|
|
18
18
|
"""
|
19
19
|
smelly.rb -- 3 warnings:
|
20
20
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
21
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
21
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
22
22
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
23
23
|
"""
|
24
24
|
|
@@ -46,6 +46,6 @@ Feature: Offer different ways how to load configuration
|
|
46
46
|
"""
|
47
47
|
smelly.rb -- 3 warnings:
|
48
48
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
49
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
49
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
50
50
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
51
51
|
"""
|
@@ -18,7 +18,7 @@ Feature: Using Reek programmatically
|
|
18
18
|
And it reports:
|
19
19
|
"""
|
20
20
|
calls @foo.bar 2 times
|
21
|
-
calls puts
|
21
|
+
calls puts @foo.bar 2 times
|
22
22
|
has the name 'm'
|
23
23
|
"""
|
24
24
|
|
@@ -38,6 +38,6 @@ Feature: Using Reek programmatically
|
|
38
38
|
"""
|
39
39
|
smelly.rb -- 3 warnings:
|
40
40
|
DuplicateMethodCall: Smelly#m calls @foo.bar 2 times
|
41
|
-
DuplicateMethodCall: Smelly#m calls puts
|
41
|
+
DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times
|
42
42
|
UncommunicativeMethodName: Smelly#m has the name 'm'
|
43
43
|
"""
|
@@ -16,7 +16,7 @@ Feature: Reek can be driven through its Task
|
|
16
16
|
"""
|
17
17
|
smelly.rb -- 3 warnings:
|
18
18
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
19
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
19
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
20
20
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
21
21
|
"""
|
22
22
|
|
@@ -34,7 +34,7 @@ Feature: Reek can be driven through its Task
|
|
34
34
|
"""
|
35
35
|
smelly.rb -- 3 warnings:
|
36
36
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
37
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
37
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
38
38
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
39
39
|
"""
|
40
40
|
|
@@ -52,7 +52,7 @@ Feature: Reek can be driven through its Task
|
|
52
52
|
"""
|
53
53
|
smelly.rb -- 3 warnings:
|
54
54
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
55
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
55
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
56
56
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
57
57
|
"""
|
58
58
|
|
@@ -84,7 +84,7 @@ Feature: Reek can be driven through its Task
|
|
84
84
|
"""
|
85
85
|
smelly.rb -- 3 warnings:
|
86
86
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
87
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
87
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
88
88
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
89
89
|
"""
|
90
90
|
|
@@ -35,8 +35,8 @@ Feature: Report smells using simple JSON layout
|
|
35
35
|
"source": "smelly.rb",
|
36
36
|
"context": "Smelly#m",
|
37
37
|
"lines": [ 4, 5 ],
|
38
|
-
"message": "calls puts
|
39
|
-
"name": "puts
|
38
|
+
"message": "calls puts @foo.bar 2 times",
|
39
|
+
"name": "puts @foo.bar",
|
40
40
|
"wiki_link": "https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md",
|
41
41
|
"count": 2
|
42
42
|
},
|
@@ -115,7 +115,7 @@ Feature: Correctly formatted reports
|
|
115
115
|
"""
|
116
116
|
smelly.rb -- 3 warnings:
|
117
117
|
DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
118
|
-
DuplicateMethodCall: Smelly#m calls puts
|
118
|
+
DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
119
119
|
UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
120
120
|
"""
|
121
121
|
|
@@ -133,7 +133,7 @@ Feature: Correctly formatted reports
|
|
133
133
|
"""
|
134
134
|
smelly.rb -- 3 warnings:
|
135
135
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
136
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
136
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
137
137
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
138
138
|
"""
|
139
139
|
|
@@ -151,7 +151,7 @@ Feature: Correctly formatted reports
|
|
151
151
|
"""
|
152
152
|
smelly.rb -- 3 warnings:
|
153
153
|
smelly.rb:4: DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
154
|
-
smelly.rb:4: DuplicateMethodCall: Smelly#m calls puts
|
154
|
+
smelly.rb:4: DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
155
155
|
smelly.rb:3: UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
156
156
|
"""
|
157
157
|
|
@@ -191,7 +191,7 @@ Feature: Correctly formatted reports
|
|
191
191
|
"""
|
192
192
|
smelly.rb -- 3 warnings:
|
193
193
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
194
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
194
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
195
195
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
196
196
|
"""
|
197
197
|
|
@@ -208,7 +208,7 @@ Feature: Correctly formatted reports
|
|
208
208
|
"""
|
209
209
|
smelly.rb -- 3 warnings:
|
210
210
|
[4, 5]:DuplicateMethodCall: Smelly#m calls @foo.bar 2 times
|
211
|
-
[4, 5]:DuplicateMethodCall: Smelly#m calls puts
|
211
|
+
[4, 5]:DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times
|
212
212
|
[3]:UncommunicativeMethodName: Smelly#m has the name 'm'
|
213
213
|
"""
|
214
214
|
|
@@ -220,7 +220,7 @@ Feature: Correctly formatted reports
|
|
220
220
|
"""
|
221
221
|
smelly.rb -- 3 warnings:
|
222
222
|
DuplicateMethodCall: Smelly#m calls @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
223
|
-
DuplicateMethodCall: Smelly#m calls puts
|
223
|
+
DuplicateMethodCall: Smelly#m calls puts @foo.bar 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
224
224
|
UncommunicativeMethodName: Smelly#m has the name 'm' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
|
225
225
|
"""
|
226
226
|
|
@@ -36,8 +36,8 @@ Feature: Report smells using simple YAML layout
|
|
36
36
|
lines:
|
37
37
|
- 4
|
38
38
|
- 5
|
39
|
-
message: calls puts
|
40
|
-
name: puts
|
39
|
+
message: calls puts @foo.bar 2 times
|
40
|
+
name: puts @foo.bar
|
41
41
|
count: 2
|
42
42
|
wiki_link: https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md
|
43
43
|
- smell_category: UncommunicativeName
|
data/features/samples.feature
CHANGED
@@ -21,14 +21,14 @@ Feature: Basic smell detection
|
|
21
21
|
DuplicateMethodCall: Inline#self.rootdir calls env.nil? 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
22
22
|
DuplicateMethodCall: Inline::C#build calls $? != 0 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
23
23
|
DuplicateMethodCall: Inline::C#build calls Inline.directory 5 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
24
|
+
DuplicateMethodCall: Inline::C#build calls io.puts "#endif" 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
25
|
+
DuplicateMethodCall: Inline::C#build calls io.puts "#ifdef __cplusplus" 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
24
26
|
DuplicateMethodCall: Inline::C#build calls io.puts 6 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
25
|
-
DuplicateMethodCall: Inline::C#build calls
|
26
|
-
DuplicateMethodCall: Inline::C#
|
27
|
-
DuplicateMethodCall: Inline::C#
|
28
|
-
DuplicateMethodCall: Inline::C#
|
29
|
-
DuplicateMethodCall: Inline::C#generate calls
|
30
|
-
DuplicateMethodCall: Inline::C#generate calls signature["args"] 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
31
|
-
DuplicateMethodCall: Inline::C#generate calls signature["args"].map 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
27
|
+
DuplicateMethodCall: Inline::C#build calls warn "Output:\n#{result}" 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
28
|
+
DuplicateMethodCall: Inline::C#crap_for_windoze calls Config::CONFIG['libdir'] 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
29
|
+
DuplicateMethodCall: Inline::C#generate calls result.sub!(/\A\n/, '') 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
30
|
+
DuplicateMethodCall: Inline::C#generate calls signature['args'] 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
31
|
+
DuplicateMethodCall: Inline::C#generate calls signature['args'].map 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
32
32
|
DuplicateMethodCall: Inline::C#initialize calls stack.empty? 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
33
33
|
DuplicateMethodCall: Module#inline calls Inline.const_get(lang) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
34
34
|
DuplicateMethodCall: Module#inline calls options[:testing] 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
@@ -40,7 +40,7 @@ Feature: Basic smell detection
|
|
40
40
|
NilCheck: Inline#self.rootdir performs a nil-check [https://github.com/troessner/reek/blob/master/docs/Nil-Check.md]
|
41
41
|
RepeatedConditional: Inline::C tests $DEBUG at least 7 times [https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md]
|
42
42
|
RepeatedConditional: Inline::C tests $TESTING at least 4 times [https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md]
|
43
|
-
RepeatedConditional: Inline::C tests @@type_map.has_key?
|
43
|
+
RepeatedConditional: Inline::C tests @@type_map.has_key? type at least 3 times [https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md]
|
44
44
|
TooManyInstanceVariables: Inline::C has at least 13 instance variables [https://github.com/troessner/reek/blob/master/docs/Too-Many-Instance-Variables.md]
|
45
45
|
TooManyMethods: Inline::C has at least 25 methods [https://github.com/troessner/reek/blob/master/docs/Too-Many-Methods.md]
|
46
46
|
TooManyStatements: File#self.write_with_backup has approx 6 statements [https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md]
|
@@ -77,8 +77,8 @@ Feature: Basic smell detection
|
|
77
77
|
DuplicateMethodCall: OptionParser#getopts calls result[opt] = false 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
78
78
|
DuplicateMethodCall: OptionParser#make_switch calls default_style.guess(arg = a) 4 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
79
79
|
DuplicateMethodCall: OptionParser#make_switch calls long << (o = q.downcase) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
80
|
-
DuplicateMethodCall: OptionParser#make_switch calls notwice(NilClass, klass,
|
81
|
-
DuplicateMethodCall: OptionParser#make_switch calls notwice(
|
80
|
+
DuplicateMethodCall: OptionParser#make_switch calls notwice(NilClass, klass, 'type') 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
81
|
+
DuplicateMethodCall: OptionParser#make_switch calls notwice(a ? Object : TrueClass, klass, 'type') 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
82
82
|
DuplicateMethodCall: OptionParser#make_switch calls pattern.method(:convert) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
83
83
|
DuplicateMethodCall: OptionParser#make_switch calls pattern.method(:convert).to_proc 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
84
84
|
DuplicateMethodCall: OptionParser#make_switch calls pattern.respond_to?(:convert) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
@@ -90,7 +90,7 @@ Feature: Basic smell detection
|
|
90
90
|
DuplicateMethodCall: OptionParser#parse calls argv[0] 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
91
91
|
DuplicateMethodCall: OptionParser#parse_in_order calls $!.set_option(arg, true) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
92
92
|
DuplicateMethodCall: OptionParser#parse_in_order calls cb.call(val) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
93
|
-
DuplicateMethodCall: OptionParser#parse_in_order calls raise
|
93
|
+
DuplicateMethodCall: OptionParser#parse_in_order calls raise $!.set_option(arg, true) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
94
94
|
DuplicateMethodCall: OptionParser#parse_in_order calls raise(*exc) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
95
95
|
DuplicateMethodCall: OptionParser#parse_in_order calls setter.call(sw.switch_name, val) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
96
96
|
DuplicateMethodCall: OptionParser#parse_in_order calls sw.block 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
@@ -101,11 +101,11 @@ Feature: Basic smell detection
|
|
101
101
|
DuplicateMethodCall: OptionParser::Switch#parse_arg calls s.length 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
102
102
|
DuplicateMethodCall: OptionParser::Switch#summarize calls indent + l 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
103
103
|
DuplicateMethodCall: OptionParser::Switch#summarize calls left.collect 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
104
|
-
DuplicateMethodCall: OptionParser::Switch#summarize calls left.collect
|
105
|
-
DuplicateMethodCall: OptionParser::Switch#summarize calls left.collect
|
106
|
-
DuplicateMethodCall: OptionParser::Switch#summarize calls left.collect
|
104
|
+
DuplicateMethodCall: OptionParser::Switch#summarize calls left.collect {|s| s.length} 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
105
|
+
DuplicateMethodCall: OptionParser::Switch#summarize calls left.collect {|s| s.length}.max 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
106
|
+
DuplicateMethodCall: OptionParser::Switch#summarize calls left.collect {|s| s.length}.max.to_i 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
107
107
|
DuplicateMethodCall: OptionParser::Switch#summarize calls left.shift 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
108
|
-
DuplicateMethodCall: OptionParser::Switch#summarize calls left[
|
108
|
+
DuplicateMethodCall: OptionParser::Switch#summarize calls left[-1] 3 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
109
109
|
DuplicateMethodCall: OptionParser::Switch#summarize calls s.length 3 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
110
110
|
FeatureEnvy: OptionParser#order refers to argv more than self (maybe move it to another class?) [https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md]
|
111
111
|
FeatureEnvy: OptionParser#parse refers to argv more than self (maybe move it to another class?) [https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md]
|
@@ -124,8 +124,8 @@ Feature: Basic smell detection
|
|
124
124
|
NestedIterators: OptionParser#make_switch contains iterators nested 2 deep [https://github.com/troessner/reek/blob/master/docs/Nested-Iterators.md]
|
125
125
|
NilCheck: OptionParser#make_switch performs a nil-check [https://github.com/troessner/reek/blob/master/docs/Nil-Check.md]
|
126
126
|
NilCheck: OptionParser#self.inc performs a nil-check [https://github.com/troessner/reek/blob/master/docs/Nil-Check.md]
|
127
|
-
RepeatedConditional: OptionParser tests (argv.size == 1) && (Array === argv[0]) at least 3 times [https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md]
|
128
127
|
RepeatedConditional: OptionParser tests a at least 7 times [https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md]
|
128
|
+
RepeatedConditional: OptionParser tests argv.size == 1 and Array === argv[0] at least 3 times [https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md]
|
129
129
|
RepeatedConditional: OptionParser tests default_pattern at least 7 times [https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md]
|
130
130
|
RepeatedConditional: OptionParser tests not_style at least 3 times [https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md]
|
131
131
|
RepeatedConditional: OptionParser tests s at least 7 times [https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md]
|
@@ -198,14 +198,14 @@ Feature: Basic smell detection
|
|
198
198
|
DuplicateMethodCall: RedCloth#block_textile_lists calls tl.length 3 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
199
199
|
DuplicateMethodCall: RedCloth#clean_html calls tags[tag] 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
200
200
|
DuplicateMethodCall: RedCloth#pba calls $1.length 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
201
|
-
DuplicateMethodCall: RedCloth#rip_offtags calls (codepre - used_offtags.length) > 0 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
202
201
|
DuplicateMethodCall: RedCloth#rip_offtags calls @pre_list.last 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
203
202
|
DuplicateMethodCall: RedCloth#rip_offtags calls @pre_list.last << line 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
204
203
|
DuplicateMethodCall: RedCloth#rip_offtags calls codepre - used_offtags.length 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
204
|
+
DuplicateMethodCall: RedCloth#rip_offtags calls codepre - used_offtags.length > 0 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
205
205
|
DuplicateMethodCall: RedCloth#rip_offtags calls codepre.zero? 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
206
|
-
DuplicateMethodCall: RedCloth#rip_offtags calls htmlesc(line, :NoQuotes) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
206
|
+
DuplicateMethodCall: RedCloth#rip_offtags calls htmlesc( line, :NoQuotes ) 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
207
207
|
DuplicateMethodCall: RedCloth#rip_offtags calls used_offtags.length 2 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
208
|
-
DuplicateMethodCall: RedCloth#rip_offtags calls used_offtags[
|
208
|
+
DuplicateMethodCall: RedCloth#rip_offtags calls used_offtags['notextile'] 3 times [https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md]
|
209
209
|
FeatureEnvy: RedCloth#block_markdown_atx refers to text more than self (maybe move it to another class?) [https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md]
|
210
210
|
FeatureEnvy: RedCloth#block_markdown_setext refers to text more than self (maybe move it to another class?) [https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md]
|
211
211
|
FeatureEnvy: RedCloth#block_textile_lists refers to depth more than self (maybe move it to another class?) [https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md]
|
data/lib/reek/ast/node.rb
CHANGED
@@ -87,8 +87,19 @@ module Reek
|
|
87
87
|
false
|
88
88
|
end
|
89
89
|
|
90
|
+
# :reek:DuplicateMethodCall { max_calls: 2 } is ok for lines.first
|
91
|
+
# :reek:FeatureEnvy
|
90
92
|
def format_to_ruby
|
91
|
-
|
93
|
+
if location
|
94
|
+
lines = location.expression.source.split("\n").map(&:strip)
|
95
|
+
case lines.length
|
96
|
+
when 1 then lines.first
|
97
|
+
when 2 then lines.join('; ')
|
98
|
+
else [lines.first, lines.last].join(' ... ')
|
99
|
+
end
|
100
|
+
else
|
101
|
+
to_s
|
102
|
+
end
|
92
103
|
end
|
93
104
|
|
94
105
|
protected
|
@@ -11,6 +11,7 @@ require_relative 'sexp_extensions/logical_operators'
|
|
11
11
|
require_relative 'sexp_extensions/methods'
|
12
12
|
require_relative 'sexp_extensions/module'
|
13
13
|
require_relative 'sexp_extensions/nested_assignables'
|
14
|
+
require_relative 'sexp_extensions/self'
|
14
15
|
require_relative 'sexp_extensions/send'
|
15
16
|
require_relative 'sexp_extensions/super'
|
16
17
|
require_relative 'sexp_extensions/symbols'
|
@@ -3,6 +3,15 @@ module Reek
|
|
3
3
|
module SexpExtensions
|
4
4
|
# Utility methods for :const nodes.
|
5
5
|
module ConstNode
|
6
|
+
def name
|
7
|
+
namespace = children.first
|
8
|
+
if namespace
|
9
|
+
"#{namespace.format_to_ruby}::#{simple_name}"
|
10
|
+
else
|
11
|
+
simple_name.to_s
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
6
15
|
def simple_name
|
7
16
|
children.last
|
8
17
|
end
|
@@ -36,28 +36,9 @@ module Reek
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
# Checking if a method is a singleton method.
|
40
|
-
module SingletonMethod
|
41
|
-
def singleton_method?
|
42
|
-
singleton_method_via_class_self_notation?
|
43
|
-
end
|
44
|
-
|
45
|
-
# Ruby allows us to make a method a singleton_method using the
|
46
|
-
# class << self syntax.
|
47
|
-
#
|
48
|
-
# To check for this we check if the parent node is of type :sclass.
|
49
|
-
#
|
50
|
-
# @return [Boolean]
|
51
|
-
def singleton_method_via_class_self_notation?
|
52
|
-
return unless parent
|
53
|
-
parent.type == :sclass
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
39
|
# Utility methods for :def nodes.
|
58
40
|
module DefNode
|
59
41
|
include MethodNodeBase
|
60
|
-
include SingletonMethod
|
61
42
|
|
62
43
|
def name
|
63
44
|
children.first
|
@@ -102,7 +83,7 @@ module Reek
|
|
102
83
|
|
103
84
|
def full_name(outer)
|
104
85
|
prefix = outer == '' ? '' : "#{outer}#"
|
105
|
-
"#{prefix}#{
|
86
|
+
"#{prefix}#{receiver.name}.#{name}"
|
106
87
|
end
|
107
88
|
|
108
89
|
def depends_on_instance?
|
@@ -32,7 +32,7 @@ module Reek
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def name
|
35
|
-
|
35
|
+
children.first.format_to_ruby
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -63,7 +63,7 @@ module Reek
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def name
|
66
|
-
|
66
|
+
children[1].to_s
|
67
67
|
end
|
68
68
|
|
69
69
|
# there are two valid forms of the casgn sexp
|