reek 3.8.3 → 3.9.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/.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
|