reek 3.7.1 → 3.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -1
- data/CHANGELOG.md +5 -0
- data/README.md +1 -1
- data/defaults.reek +3 -0
- data/docs/Code-Smells.md +1 -0
- data/docs/How-reek-works-internally.md +3 -2
- data/docs/Unused-Private-Method.md +47 -0
- data/features/samples.feature +22 -2
- data/features/step_definitions/sample_file_steps.rb +3 -0
- data/lib/reek/ast/node.rb +1 -2
- data/lib/reek/ast/object_refs.rb +30 -7
- data/lib/reek/code_comment.rb +25 -19
- data/lib/reek/context/class_context.rb +11 -0
- data/lib/reek/context/code_context.rb +58 -78
- data/lib/reek/context/module_context.rb +18 -0
- data/lib/reek/context/send_context.rb +17 -0
- data/lib/reek/context/singleton_method_context.rb +0 -3
- data/lib/reek/context/statement_counter.rb +32 -0
- data/lib/reek/context/visibility_tracker.rb +54 -0
- data/lib/reek/context_builder.rb +473 -0
- data/lib/reek/examiner.rb +14 -14
- data/lib/reek/smells/feature_envy.rb +3 -3
- data/lib/reek/smells/smell_detector.rb +1 -0
- data/lib/reek/smells/smell_repository.rb +11 -0
- data/lib/reek/smells/too_many_statements.rb +1 -1
- data/lib/reek/smells/unused_private_method.rb +82 -0
- data/lib/reek/smells/utility_function.rb +1 -1
- data/lib/reek/smells.rb +1 -0
- data/lib/reek/version.rb +1 -1
- data/spec/reek/ast/object_refs_spec.rb +20 -20
- data/spec/reek/cli/input_spec.rb +55 -0
- data/spec/reek/code_comment_spec.rb +10 -0
- data/spec/reek/context/code_context_spec.rb +8 -0
- data/spec/reek/context/module_context_spec.rb +10 -8
- data/spec/reek/context_builder_spec.rb +221 -0
- data/spec/reek/examiner_spec.rb +13 -0
- data/spec/reek/smells/boolean_parameter_spec.rb +2 -0
- data/spec/reek/smells/duplicate_method_call_spec.rb +1 -1
- data/spec/reek/smells/feature_envy_spec.rb +1 -1
- data/spec/reek/smells/too_many_statements_spec.rb +3 -3
- data/spec/reek/smells/unused_private_method_spec.rb +110 -0
- data/spec/spec_helper.rb +7 -0
- data/tasks/console.rake +5 -0
- metadata +13 -5
- data/lib/reek/tree_walker.rb +0 -237
- data/spec/reek/context/singleton_method_context_spec.rb +0 -16
- data/spec/reek/tree_walker_spec.rb +0 -237
@@ -1,237 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
require_lib 'reek/tree_walker'
|
3
|
-
require_lib 'reek/source/source_code'
|
4
|
-
|
5
|
-
# Dummy repository to inject into TreeWalker in order to count statements in
|
6
|
-
# all contexts.
|
7
|
-
class TestSmellRepository
|
8
|
-
attr_accessor :num_statements
|
9
|
-
def examine(context)
|
10
|
-
self.num_statements = context.num_statements
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def process_method(source)
|
15
|
-
exp = Reek::Source::SourceCode.from(source).syntax_tree
|
16
|
-
repository = TestSmellRepository.new
|
17
|
-
Reek::TreeWalker.new(repository, exp).walk
|
18
|
-
repository
|
19
|
-
end
|
20
|
-
|
21
|
-
def process_singleton_method(source)
|
22
|
-
exp = Reek::Source::SourceCode.from(source).syntax_tree
|
23
|
-
repository = TestSmellRepository.new
|
24
|
-
Reek::TreeWalker.new(repository, exp).walk
|
25
|
-
repository
|
26
|
-
end
|
27
|
-
|
28
|
-
RSpec.describe Reek::TreeWalker, 'statement counting' do
|
29
|
-
it 'counts 1 assignment' do
|
30
|
-
method = process_method('def one() val = 4; end')
|
31
|
-
expect(method.num_statements).to eq(1)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'counts 3 assignments' do
|
35
|
-
method = process_method('def one() val = 4; val = 4; val = 4; end')
|
36
|
-
expect(method.num_statements).to eq(3)
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'counts 1 attr assignment' do
|
40
|
-
method = process_method('def one() val[0] = 4; end')
|
41
|
-
expect(method.num_statements).to eq(1)
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'counts 1 increment assignment' do
|
45
|
-
method = process_method('def one() val += 4; end')
|
46
|
-
expect(method.num_statements).to eq(1)
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'counts 1 increment attr assignment' do
|
50
|
-
method = process_method('def one() val[0] += 4; end')
|
51
|
-
expect(method.num_statements).to eq(1)
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'counts 1 nested assignment' do
|
55
|
-
method = process_method('def one() val = fred = 4; end')
|
56
|
-
expect(method.num_statements).to eq(1)
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'counts returns' do
|
60
|
-
method = process_method('def one() val = 4; true; end')
|
61
|
-
expect(method.num_statements).to eq(2)
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'counts nil returns' do
|
65
|
-
method = process_method('def one() val = 4; nil; end')
|
66
|
-
expect(method.num_statements).to eq(2)
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'with control statements' do
|
70
|
-
it 'counts 1 statement in a conditional expression' do
|
71
|
-
method = process_method('def one() if val == 4; callee(); end; end')
|
72
|
-
expect(method.num_statements).to eq(1)
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'counts 3 statements in a conditional expression' do
|
76
|
-
method = process_method('def one() if val == 4; callee(); callee(); callee(); end; end')
|
77
|
-
expect(method.num_statements).to eq(3)
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'counts 1 statements in an else' do
|
81
|
-
method = process_method('def one() if val == 4; callee(); else; callee(); end; end')
|
82
|
-
expect(method.num_statements).to eq(2)
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'counts 3 statements in an else' do
|
86
|
-
method = process_method('
|
87
|
-
def one()
|
88
|
-
if val == 4
|
89
|
-
callee(); callee(); callee()
|
90
|
-
else
|
91
|
-
callee(); callee(); callee()
|
92
|
-
end
|
93
|
-
end
|
94
|
-
')
|
95
|
-
expect(method.num_statements).to eq(6)
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'does not count constant assignment with or equals' do
|
99
|
-
source = 'class Hi; CONST ||= 1; end'
|
100
|
-
klass = process_method(source)
|
101
|
-
expect(klass.num_statements).to eq(0)
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'does not count multi constant assignment' do
|
105
|
-
source = 'class Hi; CONST, OTHER_CONST = 1, 2; end'
|
106
|
-
klass = process_method(source)
|
107
|
-
expect(klass.num_statements).to eq(0)
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'does not count empty conditional expression' do
|
111
|
-
method = process_method('def one() if val == 4; ; end; end')
|
112
|
-
expect(method.num_statements).to eq(0)
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'does not count empty else' do
|
116
|
-
method = process_method('def one() if val == 4; ; else; ; end; end')
|
117
|
-
expect(method.num_statements).to eq(0)
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'counts extra statements in an if condition' do
|
121
|
-
method = process_method('def one() if begin val = callee(); val < 4 end; end; end')
|
122
|
-
expect(method.num_statements).to eq(1)
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'counts 1 statement in a while loop' do
|
126
|
-
method = process_method('def one() while val < 4; callee(); end; end')
|
127
|
-
expect(method.num_statements).to eq(1)
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'counts 3 statements in a while loop' do
|
131
|
-
source = 'def one() while val < 4; callee(); callee(); callee(); end; end'
|
132
|
-
expect(process_method(source).num_statements).to eq(3)
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'counts extra statements in a while condition' do
|
136
|
-
method = process_method('def one() while begin val = callee(); val < 4 end; end; end')
|
137
|
-
expect(method.num_statements).to eq(1)
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'counts 1 statement in a until loop' do
|
141
|
-
method = process_method('def one() until val < 4; callee(); end; end')
|
142
|
-
expect(method.num_statements).to eq(1)
|
143
|
-
end
|
144
|
-
|
145
|
-
it 'counts 3 statements in a until loop' do
|
146
|
-
source = 'def one() until val < 4; callee(); callee(); callee(); end; end'
|
147
|
-
expect(process_method(source).num_statements).to eq(3)
|
148
|
-
end
|
149
|
-
|
150
|
-
it 'counts 1 statement in a for loop' do
|
151
|
-
method = process_method('def one() for i in 0..4; callee(); end; end')
|
152
|
-
expect(method.num_statements).to eq(1)
|
153
|
-
end
|
154
|
-
|
155
|
-
it 'counts 3 statements in a for loop' do
|
156
|
-
source = 'def one() for i in 0..4; callee(); callee(); callee(); end; end'
|
157
|
-
expect(process_method(source).num_statements).to eq(3)
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'counts 1 statement in a rescue' do
|
161
|
-
method = process_method('def one() begin; callee(); rescue; callee(); end; end')
|
162
|
-
expect(method.num_statements).to eq(2)
|
163
|
-
end
|
164
|
-
|
165
|
-
it 'counts 3 statements in a rescue' do
|
166
|
-
method = process_method('
|
167
|
-
def one()
|
168
|
-
begin
|
169
|
-
callee(); callee(); callee()
|
170
|
-
rescue
|
171
|
-
callee(); callee(); callee()
|
172
|
-
end
|
173
|
-
end
|
174
|
-
')
|
175
|
-
expect(method.num_statements).to eq(6)
|
176
|
-
end
|
177
|
-
|
178
|
-
it 'counts 1 statement in a when' do
|
179
|
-
method = process_method('def one() case fred; when "hi"; callee(); end; end')
|
180
|
-
expect(method.num_statements).to eq(1)
|
181
|
-
end
|
182
|
-
|
183
|
-
it 'counts 3 statements in a when' do
|
184
|
-
method = process_method('
|
185
|
-
def one()
|
186
|
-
case fred
|
187
|
-
when "hi" then callee(); callee()
|
188
|
-
when "lo" then callee()
|
189
|
-
end
|
190
|
-
end
|
191
|
-
')
|
192
|
-
expect(method.num_statements).to eq(3)
|
193
|
-
end
|
194
|
-
|
195
|
-
it 'counts 1 statement in a case else' do
|
196
|
-
source = 'def one() case fred; when "hi"; callee(); else; callee(); end; end'
|
197
|
-
expect(process_method(source).num_statements).to eq(2)
|
198
|
-
end
|
199
|
-
|
200
|
-
it 'counts 3 statements in a case else' do
|
201
|
-
method = process_method('
|
202
|
-
def one()
|
203
|
-
case fred
|
204
|
-
when "hi" then callee(); callee(); callee()
|
205
|
-
else callee(); callee(); callee()
|
206
|
-
end
|
207
|
-
end
|
208
|
-
')
|
209
|
-
expect(method.num_statements).to eq(6)
|
210
|
-
end
|
211
|
-
|
212
|
-
it 'does not count empty case' do
|
213
|
-
method = process_method('def one() case fred; when "hi"; ; when "lo"; ; end; end')
|
214
|
-
expect(method.num_statements).to eq(0)
|
215
|
-
end
|
216
|
-
|
217
|
-
it 'does not count empty case else' do
|
218
|
-
method = process_method('def one() case fred; when "hi"; ; else; ; end; end')
|
219
|
-
expect(method.num_statements).to eq(0)
|
220
|
-
end
|
221
|
-
|
222
|
-
it 'counts 2 statement in an iterator' do
|
223
|
-
method = process_method('def one() fred.each do; callee(); end; end')
|
224
|
-
expect(method.num_statements).to eq(2)
|
225
|
-
end
|
226
|
-
|
227
|
-
it 'counts 4 statements in an iterator' do
|
228
|
-
source = 'def one() fred.each do; callee(); callee(); callee(); end; end'
|
229
|
-
expect(process_method(source).num_statements).to eq(4)
|
230
|
-
end
|
231
|
-
|
232
|
-
it 'counts 1 statement in a singleton method' do
|
233
|
-
method = process_singleton_method('def self.foo; callee(); end')
|
234
|
-
expect(method.num_statements).to eq(1)
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end
|