reek 3.2 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/reek/ast/ast_node_class_map.rb +1 -5
- data/lib/reek/ast/node.rb +2 -4
- data/lib/reek/ast/object_refs.rb +5 -9
- data/lib/reek/ast/reference_collector.rb +2 -4
- data/lib/reek/cli/application.rb +9 -12
- data/lib/reek/cli/command.rb +0 -4
- data/lib/reek/cli/input.rb +4 -4
- data/lib/reek/cli/option_interpreter.rb +7 -11
- data/lib/reek/cli/options.rb +40 -42
- data/lib/reek/cli/reek_command.rb +3 -3
- data/lib/reek/cli/warning_collector.rb +3 -7
- data/lib/reek/code_comment.rb +1 -5
- data/lib/reek/context/code_context.rb +17 -19
- data/lib/reek/examiner.rb +6 -8
- data/lib/reek/rake/task.rb +22 -12
- data/lib/reek/report/formatter.rb +1 -5
- data/lib/reek/report/report.rb +13 -22
- data/lib/reek/smells/attribute.rb +6 -9
- data/lib/reek/smells/control_parameter.rb +13 -21
- data/lib/reek/smells/data_clump.rb +9 -17
- data/lib/reek/smells/duplicate_method_call.rb +6 -12
- data/lib/reek/smells/long_parameter_list.rb +2 -2
- data/lib/reek/smells/long_yield_list.rb +4 -4
- data/lib/reek/smells/nested_iterators.rb +2 -4
- data/lib/reek/smells/nil_check.rb +2 -6
- data/lib/reek/smells/repeated_conditional.rb +2 -2
- data/lib/reek/smells/smell_configuration.rb +7 -15
- data/lib/reek/smells/smell_detector.rb +10 -23
- data/lib/reek/smells/smell_warning.rb +6 -6
- data/lib/reek/smells/too_many_instance_variables.rb +2 -2
- data/lib/reek/smells/too_many_methods.rb +2 -2
- data/lib/reek/smells/too_many_statements.rb +4 -4
- data/lib/reek/smells/uncommunicative_method_name.rb +5 -5
- data/lib/reek/smells/uncommunicative_module_name.rb +5 -5
- data/lib/reek/smells/uncommunicative_parameter_name.rb +4 -8
- data/lib/reek/smells/uncommunicative_variable_name.rb +4 -8
- data/lib/reek/source/source_code.rb +1 -5
- data/lib/reek/spec/should_reek.rb +4 -9
- data/lib/reek/spec/should_reek_of.rb +5 -8
- data/lib/reek/spec/should_reek_only_of.rb +8 -12
- data/lib/reek/tree_dresser.rb +2 -6
- data/lib/reek/tree_walker.rb +22 -28
- data/lib/reek/version.rb +1 -1
- metadata +1 -1
@@ -51,8 +51,8 @@ module Reek
|
|
51
51
|
# @return [Array<SmellWarning>]
|
52
52
|
#
|
53
53
|
def examine_context(ctx)
|
54
|
-
|
55
|
-
|
54
|
+
@reject_names = value(REJECT_KEY, ctx, DEFAULT_REJECT_SET)
|
55
|
+
@accept_names = value(ACCEPT_KEY, ctx, DEFAULT_ACCEPT_SET)
|
56
56
|
variable_names(ctx.exp).select do |name, _lines|
|
57
57
|
bad_name?(name, ctx)
|
58
58
|
end.map do |name, lines|
|
@@ -66,8 +66,8 @@ module Reek
|
|
66
66
|
|
67
67
|
def bad_name?(name, _ctx)
|
68
68
|
var = name.to_s.gsub(/^[@\*\&]*/, '')
|
69
|
-
return false if accept_names.include?(var)
|
70
|
-
reject_names.find { |patt| patt =~ var }
|
69
|
+
return false if @accept_names.include?(var)
|
70
|
+
@reject_names.find { |patt| patt =~ var }
|
71
71
|
end
|
72
72
|
|
73
73
|
def variable_names(exp)
|
@@ -121,10 +121,6 @@ module Reek
|
|
121
121
|
var = varname.to_sym
|
122
122
|
accumulator[var].push(exp.line)
|
123
123
|
end
|
124
|
-
|
125
|
-
private
|
126
|
-
|
127
|
-
private_attr_accessor :accept_names, :reject_names
|
128
124
|
end
|
129
125
|
end
|
130
126
|
end
|
@@ -82,7 +82,7 @@ module Reek
|
|
82
82
|
@syntax_tree ||=
|
83
83
|
begin
|
84
84
|
begin
|
85
|
-
ast, comments = parser.parse_with_comments(source, description)
|
85
|
+
ast, comments = @parser.parse_with_comments(@source, @description)
|
86
86
|
rescue Racc::ParseError, Parser::SyntaxError => error
|
87
87
|
$stderr.puts "#{description}: #{error.class.name}: #{error}"
|
88
88
|
end
|
@@ -92,10 +92,6 @@ module Reek
|
|
92
92
|
TreeDresser.new.dress(ast, comment_map)
|
93
93
|
end
|
94
94
|
end
|
95
|
-
|
96
|
-
private
|
97
|
-
|
98
|
-
private_attr_reader :parser, :source
|
99
95
|
end
|
100
96
|
end
|
101
97
|
end
|
@@ -13,23 +13,18 @@ module Reek
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def matches?(actual)
|
16
|
-
|
17
|
-
examiner.smelly?
|
16
|
+
@examiner = Examiner.new(actual, configuration: @configuration)
|
17
|
+
@examiner.smelly?
|
18
18
|
end
|
19
19
|
|
20
20
|
def failure_message
|
21
|
-
"Expected #{examiner.description} to reek, but it didn't"
|
21
|
+
"Expected #{@examiner.description} to reek, but it didn't"
|
22
22
|
end
|
23
23
|
|
24
24
|
def failure_message_when_negated
|
25
|
-
rpt = Report::Formatter.format_list(examiner.smells)
|
25
|
+
rpt = Report::Formatter.format_list(@examiner.smells)
|
26
26
|
"Expected no smells, but got:\n#{rpt}"
|
27
27
|
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
private_attr_reader :configuration
|
32
|
-
private_attr_accessor :examiner
|
33
28
|
end
|
34
29
|
end
|
35
30
|
end
|
@@ -17,24 +17,21 @@ module Reek
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def matches?(actual)
|
20
|
-
|
21
|
-
|
22
|
-
all_smells.any? { |warning| warning.matches?(smell_category, smell_details) }
|
20
|
+
@examiner = Examiner.new(actual, configuration: @configuration)
|
21
|
+
@all_smells = @examiner.smells
|
22
|
+
@all_smells.any? { |warning| warning.matches?(@smell_category, @smell_details) }
|
23
23
|
end
|
24
24
|
|
25
25
|
def failure_message
|
26
|
-
"Expected #{examiner.description} to reek of #{smell_category}, but it didn't"
|
26
|
+
"Expected #{@examiner.description} to reek of #{@smell_category}, but it didn't"
|
27
27
|
end
|
28
28
|
|
29
29
|
def failure_message_when_negated
|
30
|
-
"Expected #{examiner.description} not to reek of #{smell_category}, but it did"
|
30
|
+
"Expected #{@examiner.description} not to reek of #{@smell_category}, but it did"
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
-
private_attr_reader :configuration, :smell_category, :smell_details
|
36
|
-
private_attr_accessor :all_smells, :examiner
|
37
|
-
|
38
35
|
def normalize(smell_category_or_type)
|
39
36
|
# In theory, users can give us many different types of input (see the documentation for
|
40
37
|
# reek_of below), however we're basically ignoring all of those subleties and just
|
@@ -10,28 +10,24 @@ module Reek
|
|
10
10
|
# @api private
|
11
11
|
class ShouldReekOnlyOf < ShouldReekOf
|
12
12
|
def matches?(actual)
|
13
|
-
matches_examiner?(Examiner.new(actual, configuration: configuration))
|
13
|
+
matches_examiner?(Examiner.new(actual, configuration: @configuration))
|
14
14
|
end
|
15
15
|
|
16
16
|
def matches_examiner?(examiner)
|
17
|
-
|
18
|
-
|
19
|
-
return false if warnings.empty?
|
20
|
-
warnings.all? { |warning| warning.matches?(smell_category) }
|
17
|
+
@examiner = examiner
|
18
|
+
@warnings = @examiner.smells
|
19
|
+
return false if @warnings.empty?
|
20
|
+
@warnings.all? { |warning| warning.matches?(@smell_category) }
|
21
21
|
end
|
22
22
|
|
23
23
|
def failure_message
|
24
|
-
rpt = Report::Formatter.format_list(warnings)
|
25
|
-
"Expected #{examiner.description} to reek only of #{smell_category}, but got:\n#{rpt}"
|
24
|
+
rpt = Report::Formatter.format_list(@warnings)
|
25
|
+
"Expected #{@examiner.description} to reek only of #{@smell_category}, but got:\n#{rpt}"
|
26
26
|
end
|
27
27
|
|
28
28
|
def failure_message_when_negated
|
29
|
-
"Expected #{examiner.description} not to reek only of #{smell_category}, but it did"
|
29
|
+
"Expected #{@examiner.description} not to reek only of #{@smell_category}, but it did"
|
30
30
|
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
private_attr_accessor :warnings
|
35
31
|
end
|
36
32
|
end
|
37
33
|
end
|
data/lib/reek/tree_dresser.rb
CHANGED
@@ -25,12 +25,8 @@ module Reek
|
|
25
25
|
type = sexp.type
|
26
26
|
children = sexp.children.map { |child| dress(child, comment_map, sexp) }
|
27
27
|
comments = comment_map[sexp]
|
28
|
-
klass_map.klass_for(type).new(type, children,
|
29
|
-
|
28
|
+
@klass_map.klass_for(type).new(type, children,
|
29
|
+
location: sexp.loc, comments: comments, parent: parent)
|
30
30
|
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
private_attr_reader :klass_map
|
35
31
|
end
|
36
32
|
end
|
data/lib/reek/tree_walker.rb
CHANGED
@@ -24,20 +24,14 @@ module Reek
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def walk
|
27
|
-
result
|
28
|
-
|
27
|
+
@result ||= process(@exp)
|
28
|
+
@result.each do |element|
|
29
|
+
@smell_repository.examine(element)
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
33
|
private
|
33
34
|
|
34
|
-
private_attr_accessor :element
|
35
|
-
private_attr_reader :exp, :smell_repository
|
36
|
-
|
37
|
-
def result
|
38
|
-
@result ||= process(exp)
|
39
|
-
end
|
40
|
-
|
41
35
|
def process(exp)
|
42
36
|
context_processor = "process_#{exp.type}"
|
43
37
|
if context_processor_exists?(context_processor)
|
@@ -45,7 +39,7 @@ module Reek
|
|
45
39
|
else
|
46
40
|
process_default exp
|
47
41
|
end
|
48
|
-
element
|
42
|
+
@element
|
49
43
|
end
|
50
44
|
|
51
45
|
def process_module(exp)
|
@@ -92,28 +86,28 @@ module Reek
|
|
92
86
|
|
93
87
|
def process_send(exp)
|
94
88
|
if visibility_modifier? exp
|
95
|
-
element.track_visibility(exp.method_name, exp.arg_names)
|
89
|
+
@element.track_visibility(exp.method_name, exp.arg_names)
|
96
90
|
end
|
97
|
-
element.record_call_to(exp)
|
91
|
+
@element.record_call_to(exp)
|
98
92
|
process_default(exp)
|
99
93
|
end
|
100
94
|
|
101
95
|
def process_attrasgn(exp)
|
102
|
-
element.record_call_to(exp)
|
96
|
+
@element.record_call_to(exp)
|
103
97
|
process_default(exp)
|
104
98
|
end
|
105
99
|
|
106
100
|
alias_method :process_op_asgn, :process_attrasgn
|
107
101
|
|
108
102
|
def process_ivar(exp)
|
109
|
-
element.record_use_of_self
|
103
|
+
@element.record_use_of_self
|
110
104
|
process_default(exp)
|
111
105
|
end
|
112
106
|
|
113
107
|
alias_method :process_ivasgn, :process_ivar
|
114
108
|
|
115
109
|
def process_self(_)
|
116
|
-
element.record_use_of_self
|
110
|
+
@element.record_use_of_self
|
117
111
|
end
|
118
112
|
|
119
113
|
alias_method :process_zsuper, :process_self
|
@@ -129,7 +123,7 @@ module Reek
|
|
129
123
|
|
130
124
|
def process_begin(exp)
|
131
125
|
count_statement_list(exp.children)
|
132
|
-
element.count_statements(-1)
|
126
|
+
@element.count_statements(-1)
|
133
127
|
process_default(exp)
|
134
128
|
end
|
135
129
|
|
@@ -138,13 +132,13 @@ module Reek
|
|
138
132
|
def process_if(exp)
|
139
133
|
count_clause(exp[2])
|
140
134
|
count_clause(exp[3])
|
141
|
-
element.count_statements(-1)
|
135
|
+
@element.count_statements(-1)
|
142
136
|
process_default(exp)
|
143
137
|
end
|
144
138
|
|
145
139
|
def process_while(exp)
|
146
140
|
count_clause(exp[2])
|
147
|
-
element.count_statements(-1)
|
141
|
+
@element.count_statements(-1)
|
148
142
|
process_default(exp)
|
149
143
|
end
|
150
144
|
|
@@ -152,13 +146,13 @@ module Reek
|
|
152
146
|
|
153
147
|
def process_for(exp)
|
154
148
|
count_clause(exp[3])
|
155
|
-
element.count_statements(-1)
|
149
|
+
@element.count_statements(-1)
|
156
150
|
process_default(exp)
|
157
151
|
end
|
158
152
|
|
159
153
|
def process_rescue(exp)
|
160
154
|
count_clause(exp[1])
|
161
|
-
element.count_statements(-1)
|
155
|
+
@element.count_statements(-1)
|
162
156
|
process_default(exp)
|
163
157
|
end
|
164
158
|
|
@@ -169,7 +163,7 @@ module Reek
|
|
169
163
|
|
170
164
|
def process_case(exp)
|
171
165
|
count_clause(exp.else_body)
|
172
|
-
element.count_statements(-1)
|
166
|
+
@element.count_statements(-1)
|
173
167
|
process_default(exp)
|
174
168
|
end
|
175
169
|
|
@@ -183,16 +177,16 @@ module Reek
|
|
183
177
|
end
|
184
178
|
|
185
179
|
def count_clause(sexp)
|
186
|
-
element.count_statements(1) if sexp
|
180
|
+
@element.count_statements(1) if sexp
|
187
181
|
end
|
188
182
|
|
189
183
|
def count_statement_list(statement_list)
|
190
|
-
element.count_statements statement_list.length
|
184
|
+
@element.count_statements statement_list.length
|
191
185
|
end
|
192
186
|
|
193
187
|
def inside_new_context(klass, exp)
|
194
|
-
scope = klass.new(element, exp)
|
195
|
-
element.append_child_context(scope)
|
188
|
+
scope = klass.new(@element, exp)
|
189
|
+
@element.append_child_context(scope)
|
196
190
|
push(scope) do
|
197
191
|
yield
|
198
192
|
end
|
@@ -200,10 +194,10 @@ module Reek
|
|
200
194
|
end
|
201
195
|
|
202
196
|
def push(scope)
|
203
|
-
orig = element
|
204
|
-
|
197
|
+
orig = @element
|
198
|
+
@element = scope
|
205
199
|
yield
|
206
|
-
|
200
|
+
@element = orig
|
207
201
|
end
|
208
202
|
|
209
203
|
# FIXME: Move to SendNode?
|
data/lib/reek/version.rb
CHANGED