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
@@ -47,7 +47,7 @@ RSpec.describe Reek::Smells::DuplicateMethodCall do
|
|
47
47
|
|
48
48
|
it 'reports call parameters' do
|
49
49
|
src = 'def double_thing() @other.thing(2,3) + @other.thing(2,3) end'
|
50
|
-
expect(src).to reek_of(:DuplicateMethodCall, name: '@other.thing(2,
|
50
|
+
expect(src).to reek_of(:DuplicateMethodCall, name: '@other.thing(2,3)')
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'should report nested calls' do
|
@@ -34,7 +34,6 @@ RSpec.describe Reek::TreeDresser do
|
|
34
34
|
|
35
35
|
it 'dresses `def` nodes properly' do
|
36
36
|
expect(def_node).to be_a Reek::AST::SexpExtensions::DefNode
|
37
|
-
expect(def_node).to be_a Reek::AST::SexpExtensions::SingletonMethod
|
38
37
|
expect(def_node).to be_a Reek::AST::SexpExtensions::MethodNodeBase
|
39
38
|
end
|
40
39
|
|
data/spec/samples/checkstyle.xml
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
<file name='spec/samples/two_smelly_files/dirty_one.rb'>
|
4
4
|
<error column='0' line='4' message='calls @s.title 2 times' severity='warning' source='DuplicateMethodCall'/>
|
5
5
|
<error column='0' line='6' message='calls @s.title 2 times' severity='warning' source='DuplicateMethodCall'/>
|
6
|
-
<error column='0' line='4' message='calls puts
|
7
|
-
<error column='0' line='6' message='calls puts
|
6
|
+
<error column='0' line='4' message='calls puts @s.title 2 times' severity='warning' source='DuplicateMethodCall'/>
|
7
|
+
<error column='0' line='6' message='calls puts @s.title 2 times' severity='warning' source='DuplicateMethodCall'/>
|
8
8
|
<error column='0' line='5' message='contains iterators nested 2 deep' severity='warning' source='NestedIterators'/>
|
9
9
|
<error column='0' line='3' message='has the name 'a'' severity='warning' source='UncommunicativeMethodName'/>
|
10
10
|
<error column='0' line='5' message='has the variable name '@s'' severity='warning' source='UncommunicativeVariableName'/>
|
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: 3.
|
4
|
+
version: 3.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Rutherford
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2016-01-
|
14
|
+
date: 2016-01-22 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: codeclimate-engine-rb
|
@@ -33,20 +33,14 @@ dependencies:
|
|
33
33
|
requirements:
|
34
34
|
- - "~>"
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: '2.
|
37
|
-
- - ">="
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: 2.2.2.5
|
36
|
+
version: '2.3'
|
40
37
|
type: :runtime
|
41
38
|
prerelease: false
|
42
39
|
version_requirements: !ruby/object:Gem::Requirement
|
43
40
|
requirements:
|
44
41
|
- - "~>"
|
45
42
|
- !ruby/object:Gem::Version
|
46
|
-
version: '2.
|
47
|
-
- - ">="
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: 2.2.2.5
|
43
|
+
version: '2.3'
|
50
44
|
- !ruby/object:Gem::Dependency
|
51
45
|
name: private_attr
|
52
46
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,146 +69,6 @@ dependencies:
|
|
75
69
|
- - "~>"
|
76
70
|
- !ruby/object:Gem::Version
|
77
71
|
version: '2.0'
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: unparser
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
81
|
-
requirements:
|
82
|
-
- - "~>"
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
version: 0.2.2
|
85
|
-
type: :runtime
|
86
|
-
prerelease: false
|
87
|
-
version_requirements: !ruby/object:Gem::Requirement
|
88
|
-
requirements:
|
89
|
-
- - "~>"
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version: 0.2.2
|
92
|
-
- !ruby/object:Gem::Dependency
|
93
|
-
name: activesupport
|
94
|
-
requirement: !ruby/object:Gem::Requirement
|
95
|
-
requirements:
|
96
|
-
- - "~>"
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
version: '4.2'
|
99
|
-
type: :development
|
100
|
-
prerelease: false
|
101
|
-
version_requirements: !ruby/object:Gem::Requirement
|
102
|
-
requirements:
|
103
|
-
- - "~>"
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: '4.2'
|
106
|
-
- !ruby/object:Gem::Dependency
|
107
|
-
name: aruba
|
108
|
-
requirement: !ruby/object:Gem::Requirement
|
109
|
-
requirements:
|
110
|
-
- - "~>"
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
version: 0.10.0
|
113
|
-
type: :development
|
114
|
-
prerelease: false
|
115
|
-
version_requirements: !ruby/object:Gem::Requirement
|
116
|
-
requirements:
|
117
|
-
- - "~>"
|
118
|
-
- !ruby/object:Gem::Version
|
119
|
-
version: 0.10.0
|
120
|
-
- !ruby/object:Gem::Dependency
|
121
|
-
name: ataru
|
122
|
-
requirement: !ruby/object:Gem::Requirement
|
123
|
-
requirements:
|
124
|
-
- - "~>"
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
version: 0.2.0
|
127
|
-
type: :development
|
128
|
-
prerelease: false
|
129
|
-
version_requirements: !ruby/object:Gem::Requirement
|
130
|
-
requirements:
|
131
|
-
- - "~>"
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: 0.2.0
|
134
|
-
- !ruby/object:Gem::Dependency
|
135
|
-
name: bundler
|
136
|
-
requirement: !ruby/object:Gem::Requirement
|
137
|
-
requirements:
|
138
|
-
- - "~>"
|
139
|
-
- !ruby/object:Gem::Version
|
140
|
-
version: '1.1'
|
141
|
-
type: :development
|
142
|
-
prerelease: false
|
143
|
-
version_requirements: !ruby/object:Gem::Requirement
|
144
|
-
requirements:
|
145
|
-
- - "~>"
|
146
|
-
- !ruby/object:Gem::Version
|
147
|
-
version: '1.1'
|
148
|
-
- !ruby/object:Gem::Dependency
|
149
|
-
name: cucumber
|
150
|
-
requirement: !ruby/object:Gem::Requirement
|
151
|
-
requirements:
|
152
|
-
- - "~>"
|
153
|
-
- !ruby/object:Gem::Version
|
154
|
-
version: '2.0'
|
155
|
-
type: :development
|
156
|
-
prerelease: false
|
157
|
-
version_requirements: !ruby/object:Gem::Requirement
|
158
|
-
requirements:
|
159
|
-
- - "~>"
|
160
|
-
- !ruby/object:Gem::Version
|
161
|
-
version: '2.0'
|
162
|
-
- !ruby/object:Gem::Dependency
|
163
|
-
name: factory_girl
|
164
|
-
requirement: !ruby/object:Gem::Requirement
|
165
|
-
requirements:
|
166
|
-
- - "~>"
|
167
|
-
- !ruby/object:Gem::Version
|
168
|
-
version: '4.0'
|
169
|
-
type: :development
|
170
|
-
prerelease: false
|
171
|
-
version_requirements: !ruby/object:Gem::Requirement
|
172
|
-
requirements:
|
173
|
-
- - "~>"
|
174
|
-
- !ruby/object:Gem::Version
|
175
|
-
version: '4.0'
|
176
|
-
- !ruby/object:Gem::Dependency
|
177
|
-
name: rake
|
178
|
-
requirement: !ruby/object:Gem::Requirement
|
179
|
-
requirements:
|
180
|
-
- - "~>"
|
181
|
-
- !ruby/object:Gem::Version
|
182
|
-
version: '10.0'
|
183
|
-
type: :development
|
184
|
-
prerelease: false
|
185
|
-
version_requirements: !ruby/object:Gem::Requirement
|
186
|
-
requirements:
|
187
|
-
- - "~>"
|
188
|
-
- !ruby/object:Gem::Version
|
189
|
-
version: '10.0'
|
190
|
-
- !ruby/object:Gem::Dependency
|
191
|
-
name: rspec
|
192
|
-
requirement: !ruby/object:Gem::Requirement
|
193
|
-
requirements:
|
194
|
-
- - "~>"
|
195
|
-
- !ruby/object:Gem::Version
|
196
|
-
version: '3.0'
|
197
|
-
type: :development
|
198
|
-
prerelease: false
|
199
|
-
version_requirements: !ruby/object:Gem::Requirement
|
200
|
-
requirements:
|
201
|
-
- - "~>"
|
202
|
-
- !ruby/object:Gem::Version
|
203
|
-
version: '3.0'
|
204
|
-
- !ruby/object:Gem::Dependency
|
205
|
-
name: rubocop
|
206
|
-
requirement: !ruby/object:Gem::Requirement
|
207
|
-
requirements:
|
208
|
-
- - "~>"
|
209
|
-
- !ruby/object:Gem::Version
|
210
|
-
version: 0.34.0
|
211
|
-
type: :development
|
212
|
-
prerelease: false
|
213
|
-
version_requirements: !ruby/object:Gem::Requirement
|
214
|
-
requirements:
|
215
|
-
- - "~>"
|
216
|
-
- !ruby/object:Gem::Version
|
217
|
-
version: 0.34.0
|
218
72
|
description: |2
|
219
73
|
Reek is a tool that examines Ruby classes, modules and methods and reports
|
220
74
|
any code smells it finds.
|
@@ -320,13 +174,13 @@ files:
|
|
320
174
|
- lib/reek/ast/sexp_extensions/methods.rb
|
321
175
|
- lib/reek/ast/sexp_extensions/module.rb
|
322
176
|
- lib/reek/ast/sexp_extensions/nested_assignables.rb
|
177
|
+
- lib/reek/ast/sexp_extensions/self.rb
|
323
178
|
- lib/reek/ast/sexp_extensions/send.rb
|
324
179
|
- lib/reek/ast/sexp_extensions/super.rb
|
325
180
|
- lib/reek/ast/sexp_extensions/symbols.rb
|
326
181
|
- lib/reek/ast/sexp_extensions/variables.rb
|
327
182
|
- lib/reek/ast/sexp_extensions/when.rb
|
328
183
|
- lib/reek/ast/sexp_extensions/yield.rb
|
329
|
-
- lib/reek/ast/sexp_formatter.rb
|
330
184
|
- lib/reek/cli/application.rb
|
331
185
|
- lib/reek/cli/command.rb
|
332
186
|
- lib/reek/cli/input.rb
|
@@ -345,10 +199,12 @@ files:
|
|
345
199
|
- lib/reek/context/attribute_context.rb
|
346
200
|
- lib/reek/context/class_context.rb
|
347
201
|
- lib/reek/context/code_context.rb
|
202
|
+
- lib/reek/context/ghost_context.rb
|
348
203
|
- lib/reek/context/method_context.rb
|
349
204
|
- lib/reek/context/module_context.rb
|
350
205
|
- lib/reek/context/root_context.rb
|
351
206
|
- lib/reek/context/send_context.rb
|
207
|
+
- lib/reek/context/singleton_attribute_context.rb
|
352
208
|
- lib/reek/context/singleton_method_context.rb
|
353
209
|
- lib/reek/context/statement_counter.rb
|
354
210
|
- lib/reek/context/visibility_tracker.rb
|
@@ -414,7 +270,6 @@ files:
|
|
414
270
|
- spec/reek/ast/object_refs_spec.rb
|
415
271
|
- spec/reek/ast/reference_collector_spec.rb
|
416
272
|
- spec/reek/ast/sexp_extensions_spec.rb
|
417
|
-
- spec/reek/ast/sexp_formatter_spec.rb
|
418
273
|
- spec/reek/cli/input_spec.rb
|
419
274
|
- spec/reek/cli/option_interpreter_spec.rb
|
420
275
|
- spec/reek/cli/options_spec.rb
|
@@ -426,6 +281,7 @@ files:
|
|
426
281
|
- spec/reek/configuration/directory_directives_spec.rb
|
427
282
|
- spec/reek/configuration/excluded_paths_spec.rb
|
428
283
|
- spec/reek/context/code_context_spec.rb
|
284
|
+
- spec/reek/context/ghost_context_spec.rb
|
429
285
|
- spec/reek/context/method_context_spec.rb
|
430
286
|
- spec/reek/context/module_context_spec.rb
|
431
287
|
- spec/reek/context/root_context_spec.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require_relative '../cli/silencer'
|
2
|
-
|
3
|
-
Reek::CLI::Silencer.silently do
|
4
|
-
require 'unparser'
|
5
|
-
end
|
6
|
-
|
7
|
-
module Reek
|
8
|
-
module AST
|
9
|
-
#
|
10
|
-
# Formats snippets of syntax tree back into Ruby source code.
|
11
|
-
#
|
12
|
-
class SexpFormatter
|
13
|
-
# Formats the given sexp.
|
14
|
-
#
|
15
|
-
# @param [AST::Node, #to_s] sexp - The expression to format
|
16
|
-
#
|
17
|
-
# @return [String] a formatted string representation.
|
18
|
-
#
|
19
|
-
# :reek:DuplicateMethodCall { max_calls: 2 } is ok for lines.first
|
20
|
-
def self.format(sexp)
|
21
|
-
return sexp.to_s unless sexp.is_a? ::Parser::AST::Node
|
22
|
-
lines = Unparser.unparse(sexp).split "\n"
|
23
|
-
case lines.length
|
24
|
-
when 1 then lines.first
|
25
|
-
when 2 then lines.join('; ')
|
26
|
-
else [lines.first, lines.last].join(' ... ')
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/ast/sexp_formatter'
|
3
|
-
|
4
|
-
RSpec.describe Reek::AST::SexpFormatter do
|
5
|
-
describe '::format' do
|
6
|
-
it 'formats a simple s-expression' do
|
7
|
-
result = described_class.format sexp(:lvar, :foo)
|
8
|
-
expect(result).to eq('foo')
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'formats a more complex s-expression' do
|
12
|
-
ast = sexp(:send, nil, :foo, sexp(:lvar, :bar))
|
13
|
-
result = described_class.format(ast)
|
14
|
-
expect(result).to eq('foo(bar)')
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'reduces very large ASTs to a single line' do
|
18
|
-
ast = sexp(:if,
|
19
|
-
sexp(:send, nil, :foo),
|
20
|
-
sexp(:send, nil, :bar),
|
21
|
-
sexp(:begin,
|
22
|
-
sexp(:send, nil, :baz),
|
23
|
-
sexp(:send, nil, :qux)))
|
24
|
-
result = described_class.format ast
|
25
|
-
|
26
|
-
expect(result).to eq 'if foo ... end'
|
27
|
-
end
|
28
|
-
|
29
|
-
it "doesn't reduce two-line ASTs" do
|
30
|
-
ast = sexp(:def, 'my_method', sexp(:args))
|
31
|
-
result = described_class.format ast
|
32
|
-
expect(result).to eq 'def my_method; end'
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|