reek 4.5.4 → 4.5.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +11 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile +2 -2
- data/features/configuration_files/exclude_paths_directives.feature +24 -0
- data/features/samples.feature +3 -8
- data/features/step_definitions/reek_steps.rb +2 -2
- data/lib/reek/cli/application.rb +1 -1
- data/lib/reek/code_comment.rb +4 -2
- data/lib/reek/context_builder.rb +2 -1
- data/lib/reek/smell_detectors/manual_dispatch.rb +4 -5
- data/lib/reek/version.rb +1 -1
- data/spec/quality/reek_source_spec.rb +5 -3
- data/spec/reek/cli/application_spec.rb +24 -0
- data/spec/reek/code_comment_spec.rb +7 -0
- data/spec/reek/report/yaml_report_spec.rb +4 -4
- data/spec/reek/smell_detectors/feature_envy_spec.rb +12 -7
- data/spec/reek/smell_detectors/manual_dispatch_spec.rb +13 -0
- data/spec/reek/smell_detectors/nested_iterators_spec.rb +1 -1
- data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -5
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f744d82cb65c9d8b3d9f360ed948e1bf7944299a
|
4
|
+
data.tar.gz: e74921da8bed3e617aeb1a80d9085f0876c80f38
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04bc673256d4145a067b4cbe45d9d0d7a2bfd5170779a6ee2520dedc73ec09abbbad073e17d40dd2cbbd70dbab2f5ea297608a244b448fd71020c4525dc76cc9
|
7
|
+
data.tar.gz: d43b2c46f59d642e127edc26813058937e90ee10811ca5484f6487f2a2908c3bd313a53317a7c00c166b4553d54dbb35b894cc7d8dc9d068fcd3f34c0fe98052
|
data/.rubocop.yml
CHANGED
@@ -12,6 +12,11 @@ Lint/HandleExceptions:
|
|
12
12
|
Exclude:
|
13
13
|
- 'spec/reek/configuration/configuration_file_finder_spec.rb'
|
14
14
|
|
15
|
+
# Spec blocks can be any size
|
16
|
+
Metrics/BlockLength:
|
17
|
+
Exclude:
|
18
|
+
- 'spec/**/*'
|
19
|
+
|
15
20
|
# FIXME: Make the class shorter
|
16
21
|
Metrics/ClassLength:
|
17
22
|
Exclude:
|
@@ -44,6 +49,12 @@ RSpec/DescribeClass:
|
|
44
49
|
RSpec/ExampleLength:
|
45
50
|
Enabled: false
|
46
51
|
|
52
|
+
# FIXME: Find a better way to block output during specs, and fix relevant examples.
|
53
|
+
RSpec/ExpectOutput:
|
54
|
+
Exclude:
|
55
|
+
- 'spec/reek/cli/command/todo_list_command_spec.rb'
|
56
|
+
- 'spec/reek/source/source_code_spec.rb'
|
57
|
+
|
47
58
|
# FIXME: Split up files to avoid offenses
|
48
59
|
RSpec/MultipleDescribes:
|
49
60
|
Exclude:
|
@@ -65,7 +76,6 @@ RSpec/MultipleExpectations:
|
|
65
76
|
|
66
77
|
# FIXME: Update specs to avoid offenses
|
67
78
|
RSpec/NestedGroups:
|
68
|
-
MaxNesting: 3
|
69
79
|
Exclude:
|
70
80
|
- 'spec/reek/cli/application_spec.rb'
|
71
81
|
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## 4.5.5 (2017-02-05)
|
4
|
+
|
5
|
+
* (mvz) Load YAML in code comments safely
|
6
|
+
* (mvz) Combine lines for manual dispatch smells
|
7
|
+
* (mvz) Respect exclude_paths when passing sources on the command line
|
8
|
+
* (mvz) Ensure explicit arguments of super() are processed
|
9
|
+
|
3
10
|
## 4.5.4 (2017-01-17)
|
4
11
|
|
5
12
|
* (troessner) Improve documentation and fix PrimaDonnaMethod detector configuration via comment.
|
data/Gemfile
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: Exclude paths directives
|
2
|
+
In order to avoid Reek wasting time on files that cannot be fixed
|
3
|
+
As a user
|
4
|
+
I want to be able to exclude specific paths from being checked
|
5
|
+
|
6
|
+
Scenario: Exclude some paths
|
7
|
+
Given a file named "bad_files_live_here/smelly.rb" with:
|
8
|
+
"""
|
9
|
+
# A smelly example class
|
10
|
+
class Smelly
|
11
|
+
def alfa(bravo); end
|
12
|
+
end
|
13
|
+
"""
|
14
|
+
When I run `reek .`
|
15
|
+
Then the exit status indicates smells
|
16
|
+
Given a file named "config.reek" with:
|
17
|
+
"""
|
18
|
+
---
|
19
|
+
exclude_paths:
|
20
|
+
- bad_files_live_here
|
21
|
+
"""
|
22
|
+
When I run `reek -c config.reek .`
|
23
|
+
Then it succeeds
|
24
|
+
And it reports nothing
|
data/features/samples.feature
CHANGED
@@ -63,7 +63,7 @@ Feature: Basic smell detection
|
|
63
63
|
UncommunicativeVariableName: Inline::C#module_name has the variable name 'x' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
|
64
64
|
UncommunicativeVariableName: Inline::C#parse_signature has the variable name 'x' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
|
65
65
|
UtilityFunction: Inline::C#strip_comments doesn't depend on instance state (maybe move it to another class?) [https://github.com/troessner/reek/blob/master/docs/Utility-Function.md]
|
66
|
-
optparse.rb --
|
66
|
+
optparse.rb -- 126 warnings:
|
67
67
|
Attribute: OptionParser#banner is a writable attribute [https://github.com/troessner/reek/blob/master/docs/Attribute.md]
|
68
68
|
Attribute: OptionParser#default_argv is a writable attribute [https://github.com/troessner/reek/blob/master/docs/Attribute.md]
|
69
69
|
Attribute: OptionParser#program_name is a writable attribute [https://github.com/troessner/reek/blob/master/docs/Attribute.md]
|
@@ -127,10 +127,6 @@ Feature: Basic smell detection
|
|
127
127
|
LongParameterList: OptionParser::Switch#initialize has 7 parameters [https://github.com/troessner/reek/blob/master/docs/Long-Parameter-List.md]
|
128
128
|
LongParameterList: OptionParser::Switch#summarize has 5 parameters [https://github.com/troessner/reek/blob/master/docs/Long-Parameter-List.md]
|
129
129
|
ManualDispatch: OptionParser#make_switch manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
130
|
-
ManualDispatch: OptionParser#make_switch manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
131
|
-
ManualDispatch: OptionParser#make_switch manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
132
|
-
ManualDispatch: OptionParser::List#accept manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
133
|
-
ManualDispatch: OptionParser::List#accept manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
134
130
|
ManualDispatch: OptionParser::List#accept manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
135
131
|
ManualDispatch: OptionParser::List#add_banner manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
136
132
|
ManualDispatch: OptionParser::List#summarize manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
@@ -194,7 +190,7 @@ Feature: Basic smell detection
|
|
194
190
|
UnusedParameters: OptionParser::Completion#convert has unused parameter 'opt' [https://github.com/troessner/reek/blob/master/docs/Unused-Parameters.md]
|
195
191
|
UnusedParameters: OptionParser::Switch::NoArgument#parse has unused parameter 'argv' [https://github.com/troessner/reek/blob/master/docs/Unused-Parameters.md]
|
196
192
|
UnusedParameters: OptionParser::Switch::OptionalArgument#parse has unused parameter 'argv' [https://github.com/troessner/reek/blob/master/docs/Unused-Parameters.md]
|
197
|
-
redcloth.rb --
|
193
|
+
redcloth.rb -- 110 warnings:
|
198
194
|
Attribute: RedCloth#filter_html is a writable attribute [https://github.com/troessner/reek/blob/master/docs/Attribute.md]
|
199
195
|
Attribute: RedCloth#filter_styles is a writable attribute [https://github.com/troessner/reek/blob/master/docs/Attribute.md]
|
200
196
|
Attribute: RedCloth#hard_breaks is a writable attribute [https://github.com/troessner/reek/blob/master/docs/Attribute.md]
|
@@ -238,7 +234,6 @@ Feature: Basic smell detection
|
|
238
234
|
LongParameterList: RedCloth#textile_fn_ has 5 parameters [https://github.com/troessner/reek/blob/master/docs/Long-Parameter-List.md]
|
239
235
|
LongParameterList: RedCloth#textile_p has 4 parameters [https://github.com/troessner/reek/blob/master/docs/Long-Parameter-List.md]
|
240
236
|
ManualDispatch: RedCloth#block_textile_prefix manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
241
|
-
ManualDispatch: RedCloth#block_textile_prefix manually dispatches method call [https://github.com/troessner/reek/blob/master/docs/Manual-Dispatch.md]
|
242
237
|
NestedIterators: RedCloth#block_textile_lists contains iterators nested 3 deep [https://github.com/troessner/reek/blob/master/docs/Nested-Iterators.md]
|
243
238
|
NestedIterators: RedCloth#block_textile_table contains iterators nested 2 deep [https://github.com/troessner/reek/blob/master/docs/Nested-Iterators.md]
|
244
239
|
NestedIterators: RedCloth#block_textile_table contains iterators nested 3 deep [https://github.com/troessner/reek/blob/master/docs/Nested-Iterators.md]
|
@@ -306,5 +301,5 @@ Feature: Basic smell detection
|
|
306
301
|
UtilityFunction: RedCloth#lT doesn't depend on instance state (maybe move it to another class?) [https://github.com/troessner/reek/blob/master/docs/Utility-Function.md]
|
307
302
|
UtilityFunction: RedCloth#no_textile doesn't depend on instance state (maybe move it to another class?) [https://github.com/troessner/reek/blob/master/docs/Utility-Function.md]
|
308
303
|
UtilityFunction: RedCloth#v_align doesn't depend on instance state (maybe move it to another class?) [https://github.com/troessner/reek/blob/master/docs/Utility-Function.md]
|
309
|
-
|
304
|
+
287 total warnings
|
310
305
|
"""
|
@@ -46,8 +46,8 @@ Then /^it reports:$/ do |report|
|
|
46
46
|
end
|
47
47
|
|
48
48
|
Then /^it reports this yaml:$/ do |expected_yaml|
|
49
|
-
expected_warnings = YAML.
|
50
|
-
actual_warnings = YAML.
|
49
|
+
expected_warnings = YAML.safe_load(expected_yaml.chomp)
|
50
|
+
actual_warnings = YAML.safe_load(last_command_started.stdout)
|
51
51
|
expect(actual_warnings).to eq expected_warnings
|
52
52
|
end
|
53
53
|
|
data/lib/reek/cli/application.rb
CHANGED
data/lib/reek/code_comment.rb
CHANGED
@@ -46,7 +46,8 @@ module Reek
|
|
46
46
|
line: line,
|
47
47
|
source: source,
|
48
48
|
options: options).validate
|
49
|
-
@config.merge! detector_name => YAML.
|
49
|
+
@config.merge! detector_name => YAML.safe_load(options || DISABLE_DETECTOR_CONFIGURATION,
|
50
|
+
[Regexp])
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
@@ -130,7 +131,8 @@ module Reek
|
|
130
131
|
end
|
131
132
|
|
132
133
|
def escalate_bad_detector_configuration
|
133
|
-
@parsed_options = YAML.
|
134
|
+
@parsed_options = YAML.safe_load(options || CodeComment::DISABLE_DETECTOR_CONFIGURATION,
|
135
|
+
[Regexp])
|
134
136
|
rescue Psych::SyntaxError
|
135
137
|
raise Errors::GarbageDetectorConfigurationInCommentError, detector_name: detector_name,
|
136
138
|
original_comment: original_comment,
|
data/lib/reek/context_builder.rb
CHANGED
@@ -20,11 +20,10 @@ module Reek
|
|
20
20
|
#
|
21
21
|
# :reek:FeatureEnvy
|
22
22
|
def sniff(ctx)
|
23
|
-
ctx.each_node(:send).
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end.compact
|
23
|
+
smelly_nodes = ctx.each_node(:send).select { |node| node.name == :respond_to? }
|
24
|
+
return [] if smelly_nodes.empty?
|
25
|
+
lines = smelly_nodes.map(&:line)
|
26
|
+
[smell_warning(context: ctx, lines: lines, message: MESSAGE)]
|
28
27
|
end
|
29
28
|
end
|
30
29
|
end
|
data/lib/reek/version.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require_relative '../spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe 'Reek source code' do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
Pathname.glob('lib/**/*.rb').each do |pathname|
|
5
|
+
describe pathname do
|
6
|
+
it 'has no smells' do
|
7
|
+
expect(pathname).not_to reek
|
8
|
+
end
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
@@ -100,6 +100,30 @@ RSpec.describe Reek::CLI::Application do
|
|
100
100
|
configuration: Reek::Configuration::AppConfiguration,
|
101
101
|
options: Reek::CLI::Options)
|
102
102
|
end
|
103
|
+
|
104
|
+
context 'when source files are excluded through configuration' do
|
105
|
+
let(:app) { described_class.new ['--config', 'some_file.reek', '.'] }
|
106
|
+
|
107
|
+
before do
|
108
|
+
allow(Reek::Configuration::AppConfiguration).
|
109
|
+
to receive(:from_path).
|
110
|
+
with(Pathname.new('some_file.reek')).
|
111
|
+
and_return configuration
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'uses configuration for excluded paths' do
|
115
|
+
expected_sources = Reek::Source::SourceLocator.
|
116
|
+
new(['.'], configuration: configuration).sources
|
117
|
+
expect(expected_sources).not_to include(path_excluded_in_configuration)
|
118
|
+
|
119
|
+
app.execute
|
120
|
+
|
121
|
+
expect(Reek::CLI::Command::ReportCommand).to have_received(:new).
|
122
|
+
with(sources: expected_sources,
|
123
|
+
configuration: configuration,
|
124
|
+
options: Reek::CLI::Options)
|
125
|
+
end
|
126
|
+
end
|
103
127
|
end
|
104
128
|
end
|
105
129
|
end
|
@@ -161,6 +161,13 @@ RSpec.describe Reek::CodeComment::CodeCommentValidator do
|
|
161
161
|
FactoryGirl.build(:code_comment, comment: comment)
|
162
162
|
end.not_to raise_error
|
163
163
|
end
|
164
|
+
|
165
|
+
it 'does not raise on regexps' do
|
166
|
+
expect do
|
167
|
+
comment = '# :reek:UncommunicativeMethodName { exclude: !ruby/regexp /alfa/ }'
|
168
|
+
FactoryGirl.build(:code_comment, comment: comment)
|
169
|
+
end.not_to raise_error
|
170
|
+
end
|
164
171
|
end
|
165
172
|
|
166
173
|
context 'unknown custom options' do
|
@@ -30,8 +30,8 @@ RSpec.describe Reek::Report::YAMLReport do
|
|
30
30
|
out = StringIO.new
|
31
31
|
instance.show(out)
|
32
32
|
out.rewind
|
33
|
-
result = YAML.
|
34
|
-
expected = YAML.
|
33
|
+
result = YAML.safe_load(out.read)
|
34
|
+
expected = YAML.safe_load <<-EOS
|
35
35
|
---
|
36
36
|
- context: "simple"
|
37
37
|
lines:
|
@@ -57,8 +57,8 @@ RSpec.describe Reek::Report::YAMLReport do
|
|
57
57
|
out = StringIO.new
|
58
58
|
instance.show(out)
|
59
59
|
out.rewind
|
60
|
-
result = YAML.
|
61
|
-
expected = YAML.
|
60
|
+
result = YAML.safe_load(out.read)
|
61
|
+
expected = YAML.safe_load <<-EOS
|
62
62
|
---
|
63
63
|
- context: "simple"
|
64
64
|
lines:
|
@@ -97,11 +97,16 @@ RSpec.describe Reek::SmellDetectors::FeatureEnvy do
|
|
97
97
|
expect(src).not_to reek_of(:FeatureEnvy)
|
98
98
|
end
|
99
99
|
|
100
|
-
it 'does not report parameter method called with super
|
100
|
+
it 'does not report parameter method called with super' do
|
101
101
|
src = 'def alfa(bravo) super(bravo.to_s); end'
|
102
102
|
expect(src).not_to reek_of(:FeatureEnvy)
|
103
103
|
end
|
104
104
|
|
105
|
+
it 'reports parameter method called with super and elsewhere' do
|
106
|
+
src = 'def alfa(bravo) bravo.charley; super(bravo.to_s); end'
|
107
|
+
expect(src).to reek_of(:FeatureEnvy)
|
108
|
+
end
|
109
|
+
|
105
110
|
it 'ignores multiple ivars' do
|
106
111
|
src = <<-EOS
|
107
112
|
def func
|
@@ -147,7 +152,7 @@ RSpec.describe Reek::SmellDetectors::FeatureEnvy do
|
|
147
152
|
and reek_of(:FeatureEnvy, name: 'bravo')
|
148
153
|
end
|
149
154
|
|
150
|
-
it 'is not
|
155
|
+
it 'is not fooled by duplication' do
|
151
156
|
src = <<-EOS
|
152
157
|
def alfa(bravo)
|
153
158
|
@charlie.delta(bravo.echo)
|
@@ -155,18 +160,18 @@ RSpec.describe Reek::SmellDetectors::FeatureEnvy do
|
|
155
160
|
end
|
156
161
|
EOS
|
157
162
|
|
158
|
-
expect(src).to reek_only_of(:DuplicateMethodCall)
|
163
|
+
expect(src).to reek_only_of(:DuplicateMethodCall, name: 'bravo.echo')
|
159
164
|
end
|
160
165
|
|
161
|
-
it '
|
166
|
+
it 'counts local calls' do
|
162
167
|
src = <<-EOS
|
163
168
|
def alfa(bravo)
|
164
|
-
|
165
|
-
|
169
|
+
charlie.delta(bravo.echo)
|
170
|
+
foxtrot.delta(bravo.echo)
|
166
171
|
end
|
167
172
|
EOS
|
168
173
|
|
169
|
-
expect(src).to reek_only_of(:DuplicateMethodCall)
|
174
|
+
expect(src).to reek_only_of(:DuplicateMethodCall, name: 'bravo.echo')
|
170
175
|
end
|
171
176
|
|
172
177
|
it 'reports many calls to lvar' do
|
@@ -59,4 +59,17 @@ RSpec.describe Reek::SmellDetectors::ManualDispatch do
|
|
59
59
|
|
60
60
|
expect(src).to reek_of(:ManualDispatch)
|
61
61
|
end
|
62
|
+
|
63
|
+
it 'reports occurences in a single method as one smell warning' do
|
64
|
+
src = <<-EOS
|
65
|
+
class Alfa
|
66
|
+
def bravo(charlie, delta)
|
67
|
+
return true if charlie.respond_to?(:to_a)
|
68
|
+
true if delta.respond_to?(:to_a)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
EOS
|
72
|
+
|
73
|
+
expect(src).to reek_of(:ManualDispatch, lines: [3, 4], context: 'Alfa#bravo')
|
74
|
+
end
|
62
75
|
end
|
@@ -155,7 +155,7 @@ RSpec.describe Reek::SmellDetectors::NestedIterators do
|
|
155
155
|
it 'handles the case where super receives a block and arguments' do
|
156
156
|
src = <<-EOS
|
157
157
|
def alfa
|
158
|
-
super do |bravo|
|
158
|
+
super(delta) do |bravo|
|
159
159
|
bravo.each { |charlie| charlie }
|
160
160
|
end
|
161
161
|
end
|
@@ -45,11 +45,6 @@ RSpec.describe Reek::SmellDetectors::SubclassedFromCoreClass do
|
|
45
45
|
expect(src).not_to reek_of(:SubclassedFromCoreClass)
|
46
46
|
end
|
47
47
|
|
48
|
-
it 'reports if we inherit from a core class using Class#new' do
|
49
|
-
src = 'Alfa = Class.new(Array)'
|
50
|
-
expect(src).to reek_of(:SubclassedFromCoreClass)
|
51
|
-
end
|
52
|
-
|
53
48
|
it 'reports if inner class inherit from a core class' do
|
54
49
|
src = <<-EOS
|
55
50
|
class Alfa
|
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: 4.5.
|
4
|
+
version: 4.5.5
|
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: 2017-
|
14
|
+
date: 2017-02-05 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: codeclimate-engine-rb
|
@@ -151,6 +151,7 @@ files:
|
|
151
151
|
- features/configuration_files/accept_setting.feature
|
152
152
|
- features/configuration_files/directory_specific_directives.feature
|
153
153
|
- features/configuration_files/exclude_directives.feature
|
154
|
+
- features/configuration_files/exclude_paths_directives.feature
|
154
155
|
- features/configuration_files/masking_smells.feature
|
155
156
|
- features/configuration_files/mix_accept_reject_setting.feature
|
156
157
|
- features/configuration_files/reject_setting.feature
|
@@ -434,7 +435,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
434
435
|
version: '0'
|
435
436
|
requirements: []
|
436
437
|
rubyforge_project:
|
437
|
-
rubygems_version: 2.
|
438
|
+
rubygems_version: 2.6.8
|
438
439
|
signing_key:
|
439
440
|
specification_version: 4
|
440
441
|
summary: Code smell detector for Ruby
|