reek 4.5.0 → 4.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/CHANGELOG.md +4 -0
- data/features/configuration_via_source_comments/erroneous_source_comments.feature +15 -0
- data/lib/reek/code_comment.rb +45 -5
- data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +36 -0
- data/lib/reek/examiner.rb +2 -1
- data/lib/reek/report/code_climate/code_climate_configuration.rb +12 -0
- data/lib/reek/report/code_climate/code_climate_configuration.yml +156 -0
- data/lib/reek/report/code_climate/code_climate_fingerprint.rb +4 -2
- data/lib/reek/report/code_climate/code_climate_formatter.rb +2 -2
- data/lib/reek/smell_detectors/base_detector.rb +19 -0
- data/lib/reek/version.rb +1 -1
- data/spec/reek/code_comment_spec.rb +40 -0
- data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +24 -0
- data/spec/reek/smell_detectors/base_detector_spec.rb +18 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e73dfbe510f33f5080c142589e06141d394590c4
|
4
|
+
data.tar.gz: c97e989ed22ab395217099122515d0b1e02ca8e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27c163213eee8653498e261dc44b3e6b8a1c7e9a17dfeb19bafdd914a7b7ec741168cc1f1505b71b7f8653c8eff889dbb0cbb3f953220bd46876ca4a12e310d4
|
7
|
+
data.tar.gz: 3884c786a8deda2eab21427011f595b0484c61075ab96beb759bbe1ecbefc92f244650a9ef045850ce261783ef397516d5cf8fd16956cbdec16ab712fe86546b
|
data/.rubocop.yml
CHANGED
@@ -74,6 +74,7 @@ RSpec/VerifiedDoubles:
|
|
74
74
|
# rubocop-rspec expects a CodeClimate namespace to go with the code_climate directory.
|
75
75
|
RSpec/FilePath:
|
76
76
|
Exclude:
|
77
|
+
- 'spec/reek/report/code_climate/code_climate_configuration_spec.rb'
|
77
78
|
- 'spec/reek/report/code_climate/code_climate_fingerprint_spec.rb'
|
78
79
|
- 'spec/reek/report/code_climate/code_climate_formatter_spec.rb'
|
79
80
|
- 'spec/reek/report/code_climate/code_climate_report_spec.rb'
|
data/CHANGELOG.md
CHANGED
@@ -51,3 +51,18 @@ Feature: Erroneous source comments are handled properly
|
|
51
51
|
And it reports the error "Unfortunately we can not parse the configuration you have given."
|
52
52
|
And it reports the error "The source is 'bad_comment.rb'"
|
53
53
|
And it reports the error "the comment belongs to the expression starting in line 3"
|
54
|
+
|
55
|
+
Scenario: Bad configuration key
|
56
|
+
Given a file named "bad_comment.rb" with:
|
57
|
+
"""
|
58
|
+
# Test class
|
59
|
+
# exclude -> elude and accept -> accipt are bad keys
|
60
|
+
# :reek:UncommunicativeMethodName { elude: 'foo', accipt: 'bar' }
|
61
|
+
def x
|
62
|
+
end
|
63
|
+
"""
|
64
|
+
When I run reek bad_comment.rb
|
65
|
+
Then it reports the error "Error: You are trying to configure the smell detector 'UncommunicativeMethodName'"
|
66
|
+
And it reports the error "in one of your source code comments with the unknown option 'elude', 'accipt'"
|
67
|
+
And it reports the error "The source is 'bad_comment.rb'"
|
68
|
+
And it reports the error "the comment belongs to the expression starting in line 4"
|
data/lib/reek/code_comment.rb
CHANGED
@@ -4,6 +4,7 @@ require 'yaml'
|
|
4
4
|
|
5
5
|
require_relative 'smell_detectors/base_detector'
|
6
6
|
require_relative 'errors/bad_detector_in_comment_error'
|
7
|
+
require_relative 'errors/bad_detector_configuration_key_in_comment_error'
|
7
8
|
require_relative 'errors/garbage_detector_configuration_in_comment_error'
|
8
9
|
|
9
10
|
module Reek
|
@@ -75,10 +76,10 @@ module Reek
|
|
75
76
|
# 2.) Garbage in the detector configuration like { thats: a: bad: config }
|
76
77
|
# 3.) Unknown configuration keys (e.g. by doing a simple typo: "exclude" vs. "exlude" )
|
77
78
|
# 4.) Bad data types given as values for those keys
|
78
|
-
# This class validates [1] and [
|
79
|
-
#
|
79
|
+
# This class validates [1], [2] and [3] at the moment but will also validate
|
80
|
+
# [4] in the future.
|
80
81
|
#
|
81
|
-
# :reek:TooManyInstanceVariables: { max_instance_variables:
|
82
|
+
# :reek:TooManyInstanceVariables: { max_instance_variables: 7 }
|
82
83
|
class CodeCommentValidator
|
83
84
|
#
|
84
85
|
# @param detector_name [String] - the detector class that was parsed out of the original
|
@@ -94,16 +95,20 @@ module Reek
|
|
94
95
|
@line = line
|
95
96
|
@source = source
|
96
97
|
@options = options
|
98
|
+
@detector_class = nil # We only know this one after our first initial checks
|
99
|
+
@parsed_options = nil # We only know this one after our first initial checks
|
97
100
|
end
|
98
101
|
|
99
102
|
#
|
100
103
|
# Method can raise the following errors:
|
101
104
|
# * Errors::BadDetectorInCommentError
|
102
105
|
# * Errors::GarbageDetectorConfigurationInCommentError
|
106
|
+
# * Errors::BadDetectorConfigurationKeyInCommentError
|
103
107
|
# @return [undefined]
|
104
108
|
def validate
|
105
109
|
escalate_bad_detector
|
106
110
|
escalate_bad_detector_configuration
|
111
|
+
escalate_unknown_configuration_key
|
107
112
|
end
|
108
113
|
|
109
114
|
private
|
@@ -112,7 +117,9 @@ module Reek
|
|
112
117
|
:original_comment,
|
113
118
|
:line,
|
114
119
|
:source,
|
115
|
-
:options
|
120
|
+
:options,
|
121
|
+
:detector_class,
|
122
|
+
:parsed_options
|
116
123
|
|
117
124
|
def escalate_bad_detector
|
118
125
|
return if SmellDetectors::BaseDetector.valid_detector?(detector_name)
|
@@ -123,13 +130,46 @@ module Reek
|
|
123
130
|
end
|
124
131
|
|
125
132
|
def escalate_bad_detector_configuration
|
126
|
-
YAML.load(options || CodeComment::DISABLE_DETECTOR_CONFIGURATION)
|
133
|
+
@parsed_options = YAML.load(options || CodeComment::DISABLE_DETECTOR_CONFIGURATION)
|
127
134
|
rescue Psych::SyntaxError
|
128
135
|
raise Errors::GarbageDetectorConfigurationInCommentError, detector_name: detector_name,
|
129
136
|
original_comment: original_comment,
|
130
137
|
source: source,
|
131
138
|
line: line
|
132
139
|
end
|
140
|
+
|
141
|
+
def escalate_unknown_configuration_key
|
142
|
+
@detector_class = SmellDetectors::BaseDetector.to_detector(detector_name)
|
143
|
+
|
144
|
+
return if given_keys_legit?
|
145
|
+
raise Errors::BadDetectorConfigurationKeyInCommentError, detector_name: detector_name,
|
146
|
+
offensive_keys: configuration_keys_difference,
|
147
|
+
original_comment: original_comment,
|
148
|
+
source: source,
|
149
|
+
line: line
|
150
|
+
end
|
151
|
+
|
152
|
+
# @return [Boolean] - all keys in code comment are applicable to the detector in question
|
153
|
+
def given_keys_legit?
|
154
|
+
given_configuration_keys.subset? valid_detector_keys
|
155
|
+
end
|
156
|
+
|
157
|
+
# @return [Set] - the configuration keys that are found in the code comment
|
158
|
+
def given_configuration_keys
|
159
|
+
parsed_options.keys.map(&:to_sym).to_set
|
160
|
+
end
|
161
|
+
|
162
|
+
# @return [String] - all keys from the code comment that look bad
|
163
|
+
def configuration_keys_difference
|
164
|
+
given_configuration_keys.difference(valid_detector_keys).
|
165
|
+
to_a.map { |key| "'#{key}'" }.
|
166
|
+
join(', ')
|
167
|
+
end
|
168
|
+
|
169
|
+
# @return [Set] - all keys that are legit for the given detector
|
170
|
+
def valid_detector_keys
|
171
|
+
detector_class.configuration_keys
|
172
|
+
end
|
133
173
|
end
|
134
174
|
end
|
135
175
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Reek
|
4
|
+
module Errors
|
5
|
+
# Gets raised when trying to configure a detector with an option
|
6
|
+
# which is unknown to it.
|
7
|
+
class BadDetectorConfigurationKeyInCommentError < RuntimeError
|
8
|
+
UNKNOWN_SMELL_DETECTOR_MESSAGE = <<-EOS.freeze
|
9
|
+
|
10
|
+
Error: You are trying to configure the smell detector '%s'
|
11
|
+
in one of your source code comments with the unknown option %s.
|
12
|
+
The source is '%s' and the comment belongs to the expression starting in line %d.
|
13
|
+
Here's the original comment:
|
14
|
+
|
15
|
+
%s
|
16
|
+
|
17
|
+
Please see the Reek docs for:
|
18
|
+
* how to configure Reek via source code comments: https://github.com/troessner/reek/blob/master/docs/Smell-Suppression.md
|
19
|
+
* what basic options are available: https://github.com/troessner/reek/blob/master/docs/Basic-Smell-Options.md
|
20
|
+
* what custom options are available by checking the detector specific documentation in /docs
|
21
|
+
Update the offensive comment (or remove it if no longer applicable) and re-run Reek.
|
22
|
+
|
23
|
+
EOS
|
24
|
+
|
25
|
+
def initialize(detector_name:, offensive_keys:, source:, line:, original_comment:)
|
26
|
+
message = format(UNKNOWN_SMELL_DETECTOR_MESSAGE,
|
27
|
+
detector_name,
|
28
|
+
offensive_keys,
|
29
|
+
source,
|
30
|
+
line,
|
31
|
+
original_comment)
|
32
|
+
super message
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/reek/examiner.rb
CHANGED
@@ -121,7 +121,8 @@ module Reek
|
|
121
121
|
begin
|
122
122
|
examine_tree
|
123
123
|
rescue Errors::BadDetectorInCommentError,
|
124
|
-
Errors::GarbageDetectorConfigurationInCommentError
|
124
|
+
Errors::GarbageDetectorConfigurationInCommentError,
|
125
|
+
Errors::BadDetectorConfigurationKeyInCommentError => exception
|
125
126
|
warn exception
|
126
127
|
[]
|
127
128
|
rescue StandardError => exception
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Reek
|
3
|
+
module Report
|
4
|
+
# loads the smell type metadata to present in Code Climate
|
5
|
+
module CodeClimateConfiguration
|
6
|
+
def self.load
|
7
|
+
config_file = File.expand_path('../code_climate_configuration.yml', __FILE__)
|
8
|
+
YAML.load_file config_file
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -222,6 +222,135 @@ FeatureEnvy:
|
|
222
222
|
```
|
223
223
|
|
224
224
|
belongs to the Item class, not the Warehouse.
|
225
|
+
InstanceVariableAssumption:
|
226
|
+
remediation_points: 350_000
|
227
|
+
content: |
|
228
|
+
Classes should not assume that instance variables are set or present outside of the current class definition.
|
229
|
+
|
230
|
+
Good:
|
231
|
+
|
232
|
+
```Ruby
|
233
|
+
class Foo
|
234
|
+
def initialize
|
235
|
+
@bar = :foo
|
236
|
+
end
|
237
|
+
|
238
|
+
def foo?
|
239
|
+
@bar == :foo
|
240
|
+
end
|
241
|
+
end
|
242
|
+
```
|
243
|
+
|
244
|
+
Good as well:
|
245
|
+
|
246
|
+
```Ruby
|
247
|
+
class Foo
|
248
|
+
def foo?
|
249
|
+
bar == :foo
|
250
|
+
end
|
251
|
+
|
252
|
+
def bar
|
253
|
+
@bar ||= :foo
|
254
|
+
end
|
255
|
+
end
|
256
|
+
```
|
257
|
+
|
258
|
+
Bad:
|
259
|
+
|
260
|
+
```Ruby
|
261
|
+
class Foo
|
262
|
+
def go_foo!
|
263
|
+
@bar = :foo
|
264
|
+
end
|
265
|
+
|
266
|
+
def foo?
|
267
|
+
@bar == :foo
|
268
|
+
end
|
269
|
+
end
|
270
|
+
```
|
271
|
+
|
272
|
+
## Example
|
273
|
+
|
274
|
+
Running Reek on:
|
275
|
+
|
276
|
+
```Ruby
|
277
|
+
class Dummy
|
278
|
+
def test
|
279
|
+
@ivar
|
280
|
+
end
|
281
|
+
end
|
282
|
+
```
|
283
|
+
|
284
|
+
would report:
|
285
|
+
|
286
|
+
```Bash
|
287
|
+
[1]:InstanceVariableAssumption: Dummy assumes too much for instance variable @ivar [https://github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md]
|
288
|
+
```
|
289
|
+
|
290
|
+
Note that this example would trigger this smell warning as well:
|
291
|
+
|
292
|
+
```Ruby
|
293
|
+
class Parent
|
294
|
+
def initialize(omg)
|
295
|
+
@omg = omg
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
class Child < Parent
|
300
|
+
def foo
|
301
|
+
@omg
|
302
|
+
end
|
303
|
+
end
|
304
|
+
```
|
305
|
+
|
306
|
+
The way to address the smell warning is that you should create an `attr_reader` to use `@omg` in the subclass and not access `@omg` directly like this:
|
307
|
+
|
308
|
+
```Ruby
|
309
|
+
class Parent
|
310
|
+
attr_reader :omg
|
311
|
+
|
312
|
+
def initialize(omg)
|
313
|
+
@omg = omg
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
class Child < Parent
|
318
|
+
def foo
|
319
|
+
omg
|
320
|
+
end
|
321
|
+
end
|
322
|
+
```
|
323
|
+
|
324
|
+
Directly accessing instance variables is considered a smell because it [breaks encapsulation](http://designisrefactoring.com/2015/03/29/organizing-data-self-encapsulation/) and makes it harder to reason about code.
|
325
|
+
|
326
|
+
If you don't want to expose those methods as public API just make them private like this:
|
327
|
+
|
328
|
+
```Ruby
|
329
|
+
class Parent
|
330
|
+
def initialize(omg)
|
331
|
+
@omg = omg
|
332
|
+
end
|
333
|
+
|
334
|
+
private
|
335
|
+
attr_reader :omg
|
336
|
+
end
|
337
|
+
|
338
|
+
class Child < Parent
|
339
|
+
def foo
|
340
|
+
omg
|
341
|
+
end
|
342
|
+
end
|
343
|
+
```
|
344
|
+
|
345
|
+
|
346
|
+
## Current Support in Reek
|
347
|
+
|
348
|
+
An instance variable must:
|
349
|
+
|
350
|
+
* be set in the constructor
|
351
|
+
* or be accessed through a method with lazy initialization / memoization.
|
352
|
+
|
353
|
+
If not, _Instance Variable Assumption_ will be reported.
|
225
354
|
IrresponsibleModule:
|
226
355
|
remediation_points: 350_000
|
227
356
|
content: |
|
@@ -300,6 +429,33 @@ LongYieldList:
|
|
300
429
|
```
|
301
430
|
|
302
431
|
A common solution to this problem would be the introduction of parameter objects.
|
432
|
+
ManualDispatch:
|
433
|
+
remediation_points: 350_000
|
434
|
+
content: |
|
435
|
+
Reek reports a _Manual Dispatch_ smell if it finds source code that manually checks whether an object responds to a method before that method is called. Manual dispatch is a type of [Simulated Polymorphism](Simulated-Polymorphism.md) which leads to code that is harder to reason about, debug, and refactor.
|
436
|
+
|
437
|
+
## Example
|
438
|
+
|
439
|
+
```Ruby
|
440
|
+
class MyManualDispatcher
|
441
|
+
attr_reader :foo
|
442
|
+
|
443
|
+
def initialize(foo)
|
444
|
+
@foo = foo
|
445
|
+
end
|
446
|
+
|
447
|
+
def call
|
448
|
+
foo.bar if foo.respond_to?(:bar)
|
449
|
+
end
|
450
|
+
end
|
451
|
+
```
|
452
|
+
|
453
|
+
Reek would emit the following warning:
|
454
|
+
|
455
|
+
```
|
456
|
+
test.rb -- 1 warning:
|
457
|
+
[9]: MyManualDispatcher manually dispatches method call (ManualDispatch)
|
458
|
+
```
|
303
459
|
ModuleInitialize:
|
304
460
|
remediation_points: 350_000
|
305
461
|
content: |
|
@@ -1,4 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require 'digest'
|
3
|
+
|
2
4
|
module Reek
|
3
5
|
module Report
|
4
6
|
# Generates a string to uniquely identify a smell
|
@@ -14,7 +16,7 @@ module Reek
|
|
14
16
|
|
15
17
|
identify_warning
|
16
18
|
|
17
|
-
identifying_aspects.hexdigest
|
19
|
+
identifying_aspects.hexdigest.freeze
|
18
20
|
end
|
19
21
|
|
20
22
|
private
|
@@ -33,7 +35,7 @@ module Reek
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def parameters
|
36
|
-
warning.parameters.
|
38
|
+
warning.parameters.reject { |key, _| NON_IDENTIFYING_PARAMETERS.include?(key) }.sort.to_s
|
37
39
|
end
|
38
40
|
|
39
41
|
def warning_uniquely_identifiable?
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'codeclimate_engine'
|
3
|
+
require_relative 'code_climate_configuration'
|
3
4
|
|
4
5
|
module Reek
|
5
6
|
module Report
|
@@ -56,8 +57,7 @@ module Reek
|
|
56
57
|
|
57
58
|
def configuration
|
58
59
|
@configuration ||= begin
|
59
|
-
|
60
|
-
YAML.load_file config_file
|
60
|
+
CodeClimateConfiguration.load
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
@@ -14,6 +14,7 @@ module Reek
|
|
14
14
|
# for details.
|
15
15
|
#
|
16
16
|
# :reek:UnusedPrivateMethod: { exclude: [ smell_warning ] }
|
17
|
+
# :reek:TooManyMethods: { max_methods: 18 }
|
17
18
|
class BaseDetector
|
18
19
|
attr_reader :config
|
19
20
|
# The name of the config field that lists the names of code contexts
|
@@ -122,6 +123,24 @@ module Reek
|
|
122
123
|
descendants.map { |descendant| descendant.to_s.split('::').last }.
|
123
124
|
include?(detector)
|
124
125
|
end
|
126
|
+
|
127
|
+
#
|
128
|
+
# Transform a detector name to the corresponding constant.
|
129
|
+
# Note that we assume a valid name - exceptions are not handled here.
|
130
|
+
#
|
131
|
+
# @param detector_name [String] the detector in question, e.g. 'DuplicateMethodCall'
|
132
|
+
# @return [SmellDetector] - this will return the class, not an instance
|
133
|
+
#
|
134
|
+
def to_detector(detector_name)
|
135
|
+
SmellDetectors.const_get detector_name
|
136
|
+
end
|
137
|
+
|
138
|
+
#
|
139
|
+
# @return [Set<Symbol>] - all configuration keys that are available for this detector
|
140
|
+
#
|
141
|
+
def configuration_keys
|
142
|
+
Set.new(default_config.keys.map(&:to_sym))
|
143
|
+
end
|
125
144
|
end
|
126
145
|
end
|
127
146
|
end
|
data/lib/reek/version.rb
CHANGED
@@ -142,4 +142,44 @@ RSpec.describe Reek::CodeComment::CodeCommentValidator do
|
|
142
142
|
end.to raise_error(Reek::Errors::GarbageDetectorConfigurationInCommentError)
|
143
143
|
end
|
144
144
|
end
|
145
|
+
|
146
|
+
describe 'validating configuration keys' do
|
147
|
+
context 'basic options mispelled' do
|
148
|
+
it 'raises BadDetectorConfigurationKeyInCommentError' do
|
149
|
+
expect do
|
150
|
+
# exclude -> exlude and enabled -> nabled
|
151
|
+
comment = '# :reek:UncommunicativeMethodName { exlude: alfa, nabled: true }'
|
152
|
+
FactoryGirl.build(:code_comment, comment: comment)
|
153
|
+
end.to raise_error(Reek::Errors::BadDetectorConfigurationKeyInCommentError)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'basic options not mispelled' do
|
158
|
+
it 'does not raise' do
|
159
|
+
expect do
|
160
|
+
comment = '# :reek:UncommunicativeMethodName { exclude: alfa, enabled: true }'
|
161
|
+
FactoryGirl.build(:code_comment, comment: comment)
|
162
|
+
end.not_to raise_error
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'unknown custom options' do
|
167
|
+
it 'raises BadDetectorConfigurationKeyInCommentError' do
|
168
|
+
expect do
|
169
|
+
# max_copies -> mx_copies and min_clump_size -> mn_clump_size
|
170
|
+
comment = '# :reek:DataClump { mx_copies: 4, mn_clump_size: 3 }'
|
171
|
+
FactoryGirl.build(:code_comment, comment: comment)
|
172
|
+
end.to raise_error(Reek::Errors::BadDetectorConfigurationKeyInCommentError)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
context 'valid custom options' do
|
177
|
+
it 'does not raise' do
|
178
|
+
expect do
|
179
|
+
comment = '# :reek:DataClump { max_copies: 4, min_clump_size: 3 }'
|
180
|
+
FactoryGirl.build(:code_comment, comment: comment)
|
181
|
+
end.not_to raise_error
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
145
185
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../../../spec_helper'
|
2
|
+
require_lib 'reek/report/code_climate/code_climate_configuration'
|
3
|
+
|
4
|
+
RSpec.describe Reek::Report::CodeClimateConfiguration do
|
5
|
+
yml = described_class.load
|
6
|
+
smell_types = Reek::SmellDetectors::BaseDetector.descendants.map do |descendant|
|
7
|
+
descendant.name.demodulize
|
8
|
+
end
|
9
|
+
|
10
|
+
smell_types.each do |name|
|
11
|
+
config = yml.fetch(name)
|
12
|
+
it "provides remediation_points for #{name}" do
|
13
|
+
expect(config['remediation_points']).to be_a Fixnum
|
14
|
+
end
|
15
|
+
|
16
|
+
it "provides content for #{name}" do
|
17
|
+
expect(config['content']).to be_a String
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'does not include extraneous configuration' do
|
22
|
+
expect(smell_types).to match_array(yml.keys)
|
23
|
+
end
|
24
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative '../../spec_helper'
|
2
2
|
require_lib 'reek/smell_detectors/base_detector'
|
3
|
+
require_lib 'reek/smell_detectors/duplicate_method_call'
|
3
4
|
|
4
5
|
RSpec.describe Reek::SmellDetectors::BaseDetector do
|
5
6
|
describe '.todo_configuration_for' do
|
@@ -43,4 +44,21 @@ RSpec.describe Reek::SmellDetectors::BaseDetector do
|
|
43
44
|
expect(described_class.valid_detector?('Unknown')).to be false
|
44
45
|
end
|
45
46
|
end
|
47
|
+
|
48
|
+
describe '.to_detector' do
|
49
|
+
it 'returns the right detector' do
|
50
|
+
expect(described_class.to_detector('DuplicateMethodCall')).to eq(Reek::SmellDetectors::DuplicateMethodCall)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'raise NameError for an invalid detector name' do
|
54
|
+
expect { described_class.to_detector('Unknown') }.to raise_error(NameError)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '.configuration_keys' do
|
59
|
+
it 'returns the right keys' do
|
60
|
+
expected_keys = Reek::SmellDetectors::DuplicateMethodCall.configuration_keys.to_a
|
61
|
+
expect(expected_keys).to eq([:enabled, :exclude, :max_calls, :allow_calls])
|
62
|
+
end
|
63
|
+
end
|
46
64
|
end
|
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.1
|
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-10-
|
14
|
+
date: 2016-10-16 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: codeclimate-engine-rb
|
@@ -220,6 +220,7 @@ files:
|
|
220
220
|
- lib/reek/context/statement_counter.rb
|
221
221
|
- lib/reek/context/visibility_tracker.rb
|
222
222
|
- lib/reek/context_builder.rb
|
223
|
+
- lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb
|
223
224
|
- lib/reek/errors/bad_detector_in_comment_error.rb
|
224
225
|
- lib/reek/errors/garbage_detector_configuration_in_comment_error.rb
|
225
226
|
- lib/reek/examiner.rb
|
@@ -227,6 +228,7 @@ files:
|
|
227
228
|
- lib/reek/report.rb
|
228
229
|
- lib/reek/report/base_report.rb
|
229
230
|
- lib/reek/report/code_climate.rb
|
231
|
+
- lib/reek/report/code_climate/code_climate_configuration.rb
|
230
232
|
- lib/reek/report/code_climate/code_climate_configuration.yml
|
231
233
|
- lib/reek/report/code_climate/code_climate_fingerprint.rb
|
232
234
|
- lib/reek/report/code_climate/code_climate_formatter.rb
|
@@ -344,6 +346,7 @@ files:
|
|
344
346
|
- spec/reek/context_builder_spec.rb
|
345
347
|
- spec/reek/examiner_spec.rb
|
346
348
|
- spec/reek/rake/task_spec.rb
|
349
|
+
- spec/reek/report/code_climate/code_climate_configuration_spec.rb
|
347
350
|
- spec/reek/report/code_climate/code_climate_fingerprint_spec.rb
|
348
351
|
- spec/reek/report/code_climate/code_climate_formatter_spec.rb
|
349
352
|
- spec/reek/report/code_climate/code_climate_report_spec.rb
|