reek 4.5.1 → 4.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +1 -1
- data/README.md +38 -25
- data/features/configuration_files/warn_about_multiple_configuration_files.feature +44 -0
- data/features/step_definitions/reek_steps.rb +3 -3
- data/lib/reek/cli/application.rb +5 -4
- data/lib/reek/cli/options.rb +5 -8
- data/lib/reek/cli/status.rb +10 -0
- data/lib/reek/configuration/configuration_file_finder.rb +87 -27
- data/lib/reek/smell_detectors/module_initialize.rb +5 -7
- data/lib/reek/version.rb +1 -1
- data/samples/configuration/{.reek → more_than_one_configuration_file/regular.reek} +0 -0
- data/samples/configuration/more_than_one_configuration_file/todo.reek +0 -0
- data/samples/configuration/single_configuration_file/.reek +0 -0
- data/spec/reek/cli/application_spec.rb +1 -1
- data/spec/reek/cli/command/report_command_spec.rb +2 -2
- data/spec/reek/cli/command/todo_list_command_spec.rb +2 -2
- data/spec/reek/configuration/configuration_file_finder_spec.rb +38 -15
- data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +1 -1
- data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +2 -2
- data/spec/reek/smell_detectors/feature_envy_spec.rb +2 -2
- data/spec/reek/smell_detectors/module_initialize_spec.rb +12 -2
- data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +2 -2
- data/spec/reek/smell_detectors/unused_parameters_spec.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 602cbf9c7a40f8103d514b8d4088192cbfd7fdff
|
4
|
+
data.tar.gz: 39c4099443c81b23662e3c640374a0af287001ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfd0a2c1dfa98ca1e4edbf1967d973f17bf10ad9e15c9b205c68a222bb23dd46084488c942f0570ca58e1baa86258e9f8fb6f953ac3f7ad2077f8441fd56b9b2
|
7
|
+
data.tar.gz: d46599e1cbb959026843db0d87c3cd8749baa517ff9db172c4ab37e73fcb3c3b827ae8ef425ead5553dea452b91bddeefa898eb80e8e091152855a9346b83116
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -16,8 +16,9 @@
|
|
16
16
|
- [Configuration file](#configuration-file)
|
17
17
|
- [Configuration loading](#configuration-loading)
|
18
18
|
- [Configuration options](#configuration-options)
|
19
|
-
- [Source code comments](#source-code-comments)
|
20
19
|
- [Generating a 'todo' list](#generating-a-todo-list)
|
20
|
+
- [Beware of multiple configuration files](#beware-of-multiple-configuration-files)
|
21
|
+
- [Source code comments](#source-code-comments)
|
21
22
|
- [Usage](#usage)
|
22
23
|
- [Developing Reek / Contributing](#developing-reek--contributing)
|
23
24
|
- [Output formats](#output-formats)
|
@@ -355,30 +356,6 @@ configurations you can also check out [the `default.reek` file in this repositor
|
|
355
356
|
Note that you do not need a configuration file at all.
|
356
357
|
If you're fine with all the [defaults](defaults.reek) we set you can skip this completely.
|
357
358
|
|
358
|
-
### Source code comments
|
359
|
-
|
360
|
-
In case you need to suppress a smell warning and you can't or don't want to
|
361
|
-
use configuration files for whatever reasons you can also use special
|
362
|
-
source code comments like this:
|
363
|
-
|
364
|
-
```Ruby
|
365
|
-
# This method smells of :reek:NestedIterators
|
366
|
-
def smelly_method foo
|
367
|
-
foo.each {|bar| bar.each {|baz| baz.qux}}
|
368
|
-
end
|
369
|
-
```
|
370
|
-
|
371
|
-
You can even pass in smell specific configuration settings:
|
372
|
-
|
373
|
-
```Ruby
|
374
|
-
# :reek:NestedIterators { max_allowed_nesting: 2 }
|
375
|
-
def smelly_method foo
|
376
|
-
foo.each {|bar| bar.each {|baz| baz.qux}}
|
377
|
-
end
|
378
|
-
```
|
379
|
-
|
380
|
-
This is an incredible powerful feature and further explained under [Smell Suppresion](docs/Smell-Suppression.md).
|
381
|
-
|
382
359
|
### Generating a 'todo' list
|
383
360
|
|
384
361
|
Integrating tools like Reek into an existing larger codebase can be daunting when you have to fix
|
@@ -425,6 +402,42 @@ reek -c other_configuration.reek --todo lib/
|
|
425
402
|
`other_configuration.reek` will simply be ignored (as outlined before, Reek
|
426
403
|
is supposed to have one configuration file and one file only).
|
427
404
|
|
405
|
+
### Beware of multiple configuration files
|
406
|
+
|
407
|
+
Reek takes one configuration file and one configuration file only.
|
408
|
+
|
409
|
+
If you have more than one configuration file in the same directory Reek
|
410
|
+
will not know what configuration file to use. If this happens Reek will
|
411
|
+
print a warning on STDERR and exit with the failure exit status 1.
|
412
|
+
|
413
|
+
In case you have to have one or more configuration files in the directory (e.g. you're
|
414
|
+
toying around with different, mutually exclusive settings) you need to tell Reek
|
415
|
+
explicitly which file to use via `reek -c config.reek`.
|
416
|
+
|
417
|
+
### Source code comments
|
418
|
+
|
419
|
+
In case you need to suppress a smell warning and you can't or don't want to
|
420
|
+
use configuration files for whatever reasons you can also use special
|
421
|
+
source code comments like this:
|
422
|
+
|
423
|
+
```Ruby
|
424
|
+
# This method smells of :reek:NestedIterators
|
425
|
+
def smelly_method foo
|
426
|
+
foo.each {|bar| bar.each {|baz| baz.qux}}
|
427
|
+
end
|
428
|
+
```
|
429
|
+
|
430
|
+
You can even pass in smell specific configuration settings:
|
431
|
+
|
432
|
+
```Ruby
|
433
|
+
# :reek:NestedIterators { max_allowed_nesting: 2 }
|
434
|
+
def smelly_method foo
|
435
|
+
foo.each {|bar| bar.each {|baz| baz.qux}}
|
436
|
+
end
|
437
|
+
```
|
438
|
+
|
439
|
+
This is an incredible powerful feature and further explained under [Smell Suppresion](docs/Smell-Suppression.md).
|
440
|
+
|
428
441
|
## Usage
|
429
442
|
|
430
443
|
Besides the obvious
|
@@ -0,0 +1,44 @@
|
|
1
|
+
Feature: Warn on multiple configuration files
|
2
|
+
Reek is designed for one configuration file and for one configuration file only.
|
3
|
+
We should make this clear to the user by warning him when we detect multiple
|
4
|
+
configuration files and then exiting the program.
|
5
|
+
|
6
|
+
Scenario: Warn on more than one configuration file
|
7
|
+
Given the smelly file 'smelly.rb'
|
8
|
+
And a file named "config.reek" with:
|
9
|
+
"""
|
10
|
+
---
|
11
|
+
UncommunicativeMethodName:
|
12
|
+
enabled: false
|
13
|
+
"""
|
14
|
+
And a file named ".todo.reek" with:
|
15
|
+
"""
|
16
|
+
---
|
17
|
+
UtilityFunction:
|
18
|
+
enabled: false
|
19
|
+
"""
|
20
|
+
When I run reek smelly.rb
|
21
|
+
Then it reports the error "Error: Found multiple configuration files '.todo.reek', 'config.reek'"
|
22
|
+
And it reports the error "Reek supports only one configuration file. You have 2 options now:"
|
23
|
+
And it reports the error "1) Remove all offending files"
|
24
|
+
And it reports the error "2) Be specific about which one you want to load via the -c switch"
|
25
|
+
And the exit status indicates an error
|
26
|
+
|
27
|
+
Scenario: Do not warn on more than one when we explicitly specify one configuration file
|
28
|
+
Given the smelly file 'smelly.rb'
|
29
|
+
And a file named "config.reek" with:
|
30
|
+
"""
|
31
|
+
---
|
32
|
+
UncommunicativeMethodName:
|
33
|
+
enabled: false
|
34
|
+
"""
|
35
|
+
And a file named ".todo.reek" with:
|
36
|
+
"""
|
37
|
+
---
|
38
|
+
UtilityFunction:
|
39
|
+
enabled: false
|
40
|
+
"""
|
41
|
+
When I run reek -c config.reek smelly.rb
|
42
|
+
Then the exit status indicates smells
|
43
|
+
And it reports no errors
|
44
|
+
|
@@ -23,17 +23,17 @@ Then /^stdout includes "(.*)"$/ do |text|
|
|
23
23
|
end
|
24
24
|
|
25
25
|
Then /^it succeeds$/ do
|
26
|
-
success = Reek::CLI::
|
26
|
+
success = Reek::CLI::Status::DEFAULT_SUCCESS_EXIT_CODE
|
27
27
|
expect(last_command_started).to have_exit_status(success)
|
28
28
|
end
|
29
29
|
|
30
30
|
Then /^the exit status indicates an error$/ do
|
31
|
-
error = Reek::CLI::
|
31
|
+
error = Reek::CLI::Status::DEFAULT_ERROR_EXIT_CODE
|
32
32
|
expect(last_command_started).to have_exit_status(error)
|
33
33
|
end
|
34
34
|
|
35
35
|
Then /^the exit status indicates smells$/ do
|
36
|
-
smells = Reek::CLI::
|
36
|
+
smells = Reek::CLI::Status::DEFAULT_FAILURE_EXIT_CODE
|
37
37
|
expect(last_command_started).to have_exit_status(smells)
|
38
38
|
end
|
39
39
|
|
data/lib/reek/cli/application.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require_relative 'options'
|
3
|
+
require_relative 'status'
|
3
4
|
require_relative '../configuration/app_configuration'
|
4
5
|
require_relative '../source/source_locator'
|
5
6
|
require_relative 'command/report_command'
|
@@ -36,15 +37,15 @@ module Reek
|
|
36
37
|
def configure_options(argv)
|
37
38
|
Options.new(argv).parse
|
38
39
|
rescue OptionParser::InvalidOption => error
|
39
|
-
|
40
|
-
exit
|
40
|
+
warn "Error: #{error}"
|
41
|
+
exit Status::DEFAULT_ERROR_EXIT_CODE
|
41
42
|
end
|
42
43
|
|
43
44
|
def configure_app_configuration(config_file)
|
44
45
|
Configuration::AppConfiguration.from_path(config_file)
|
45
46
|
rescue Reek::Configuration::ConfigFileException => error
|
46
|
-
|
47
|
-
exit
|
47
|
+
warn "Error: #{error}"
|
48
|
+
exit Status::DEFAULT_ERROR_EXIT_CODE
|
48
49
|
end
|
49
50
|
|
50
51
|
def command_class
|
data/lib/reek/cli/options.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'optparse'
|
3
3
|
require 'rainbow'
|
4
4
|
require_relative '../version'
|
5
|
+
require_relative 'status'
|
5
6
|
|
6
7
|
module Reek
|
7
8
|
module CLI
|
@@ -15,10 +16,6 @@ module Reek
|
|
15
16
|
# :reek:Attribute: { enabled: false }
|
16
17
|
#
|
17
18
|
class Options
|
18
|
-
DEFAULT_SUCCESS_EXIT_CODE = 0
|
19
|
-
DEFAULT_ERROR_EXIT_CODE = 1
|
20
|
-
DEFAULT_FAILURE_EXIT_CODE = 2
|
21
|
-
|
22
19
|
attr_reader :argv, :parser, :smells_to_detect
|
23
20
|
attr_accessor :colored,
|
24
21
|
:config_file,
|
@@ -41,8 +38,8 @@ module Reek
|
|
41
38
|
@show_links = true
|
42
39
|
@smells_to_detect = []
|
43
40
|
@colored = tty_output?
|
44
|
-
@success_exit_code = DEFAULT_SUCCESS_EXIT_CODE
|
45
|
-
@failure_exit_code = DEFAULT_FAILURE_EXIT_CODE
|
41
|
+
@success_exit_code = Status::DEFAULT_SUCCESS_EXIT_CODE
|
42
|
+
@failure_exit_code = Status::DEFAULT_FAILURE_EXIT_CODE
|
46
43
|
@generate_todo_list = false
|
47
44
|
|
48
45
|
set_up_parser
|
@@ -179,12 +176,12 @@ module Reek
|
|
179
176
|
parser.separator "\nExit codes:"
|
180
177
|
parser.on('--success-exit-code CODE',
|
181
178
|
'The exit code when no smells are found '\
|
182
|
-
"(default: #{DEFAULT_SUCCESS_EXIT_CODE})") do |option|
|
179
|
+
"(default: #{Status::DEFAULT_SUCCESS_EXIT_CODE})") do |option|
|
183
180
|
self.success_exit_code = Integer(option)
|
184
181
|
end
|
185
182
|
parser.on('--failure-exit-code CODE',
|
186
183
|
'The exit code when smells are found '\
|
187
|
-
"(default: #{DEFAULT_FAILURE_EXIT_CODE})") do |option|
|
184
|
+
"(default: #{Status::DEFAULT_FAILURE_EXIT_CODE})") do |option|
|
188
185
|
self.failure_exit_code = Integer(option)
|
189
186
|
end
|
190
187
|
end
|
@@ -17,42 +17,102 @@ module Reek
|
|
17
17
|
# The order in which ConfigurationFileFinder tries to find such a
|
18
18
|
# configuration file is exactly like above.
|
19
19
|
module ConfigurationFileFinder
|
20
|
-
|
20
|
+
TOO_MANY_CONFIGURATION_FILES_MESSAGE = <<-EOS.freeze
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
end
|
22
|
+
Error: Found multiple configuration files %s
|
23
|
+
while scanning directory %s.
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
Reek supports only one configuration file. You have 2 options now:
|
26
|
+
1) Remove all offending files.
|
27
|
+
2) Be specific about which one you want to load via the -c switch.
|
28
|
+
|
29
|
+
EOS
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
class << self
|
32
|
+
#
|
33
|
+
# Finds and loads a configuration file from a given path.
|
34
|
+
#
|
35
|
+
# @return [Hash]
|
36
|
+
#
|
37
|
+
def find_and_load(path: nil)
|
38
|
+
load_from_file(find(path: path))
|
35
39
|
end
|
36
|
-
end
|
37
40
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
41
|
+
#
|
42
|
+
# Tries to find a configuration file via:
|
43
|
+
# * given path (e.g. via cli switch)
|
44
|
+
# * ascending down from the current directory
|
45
|
+
# * looking into the home directory
|
46
|
+
#
|
47
|
+
# @return [File|nil]
|
48
|
+
#
|
49
|
+
# :reek:ControlParameter
|
50
|
+
def find(path: nil, current: Pathname.pwd, home: Pathname.new(Dir.home))
|
51
|
+
path || find_by_dir(current) || find_in_dir(home)
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Loads a configuration file from a given path.
|
56
|
+
# Raises on invalid data.
|
57
|
+
#
|
58
|
+
# @param path [String]
|
59
|
+
# @return [Hash]
|
60
|
+
#
|
61
|
+
# :reek:TooManyStatements: { max_statements: 6 }
|
62
|
+
def load_from_file(path)
|
63
|
+
return {} unless path
|
64
|
+
begin
|
65
|
+
configuration = YAML.load_file(path) || {}
|
66
|
+
rescue => error
|
67
|
+
raise ConfigFileException, "Invalid configuration file #{path}, error is #{error}"
|
68
|
+
end
|
69
|
+
|
70
|
+
unless configuration.is_a? Hash
|
71
|
+
raise ConfigFileException, "Invalid configuration file \"#{path}\" -- Not a hash"
|
72
|
+
end
|
73
|
+
configuration
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
#
|
79
|
+
# Recursively traverse directories down to find a configuration file.
|
80
|
+
#
|
81
|
+
# @return [File|nil]
|
82
|
+
#
|
83
|
+
def find_by_dir(start)
|
84
|
+
start.ascend do |dir|
|
85
|
+
file = find_in_dir(dir)
|
86
|
+
return file if file
|
87
|
+
end
|
88
|
+
end
|
42
89
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
90
|
+
#
|
91
|
+
# Checks a given directory for a configuration file and returns it.
|
92
|
+
# Raises an exception if we find more than one.
|
93
|
+
#
|
94
|
+
# @return [File|nil]
|
95
|
+
#
|
96
|
+
# :reek:FeatureEnvy
|
97
|
+
def find_in_dir(dir)
|
98
|
+
found = dir.children.select { |item| item.file? && item.to_s.end_with?('.reek') }.sort
|
99
|
+
if found.size > 1
|
100
|
+
escalate_too_many_configuration_files found, dir
|
101
|
+
else
|
102
|
+
found.first
|
103
|
+
end
|
50
104
|
end
|
51
105
|
|
52
|
-
|
53
|
-
|
106
|
+
#
|
107
|
+
# Writes a proper warning message to STDERR and then exits the program.
|
108
|
+
#
|
109
|
+
# @return [undefined]
|
110
|
+
#
|
111
|
+
def escalate_too_many_configuration_files(found, directory)
|
112
|
+
offensive_files = found.map { |file| "'#{file.basename}'" }.join(', ')
|
113
|
+
warn format(TOO_MANY_CONFIGURATION_FILES_MESSAGE, offensive_files, directory)
|
114
|
+
exit 1
|
54
115
|
end
|
55
|
-
configuration
|
56
116
|
end
|
57
117
|
end
|
58
118
|
end
|
@@ -23,13 +23,11 @@ module Reek
|
|
23
23
|
# :reek:FeatureEnvy
|
24
24
|
def sniff(ctx)
|
25
25
|
ctx.local_nodes(:def) do |node|
|
26
|
-
if node.name
|
27
|
-
return
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
message: 'has initialize method')
|
32
|
-
]
|
26
|
+
if node.name == :initialize
|
27
|
+
return smell_warning(
|
28
|
+
context: ctx,
|
29
|
+
lines: [ctx.exp.line],
|
30
|
+
message: 'has initialize method')
|
33
31
|
end
|
34
32
|
end
|
35
33
|
[]
|
data/lib/reek/version.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
@@ -10,7 +10,7 @@ RSpec.describe Reek::CLI::Application do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
expect(call).to raise_error(SystemExit) do |error|
|
13
|
-
expect(error.status).to eq Reek::CLI::
|
13
|
+
expect(error.status).to eq Reek::CLI::Status::DEFAULT_ERROR_EXIT_CODE
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -26,7 +26,7 @@ RSpec.describe Reek::CLI::Command::ReportCommand do
|
|
26
26
|
result = Reek::CLI::Silencer.silently do
|
27
27
|
command.execute
|
28
28
|
end
|
29
|
-
expect(result).to eq Reek::CLI::
|
29
|
+
expect(result).to eq Reek::CLI::Status::DEFAULT_SUCCESS_EXIT_CODE
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -37,7 +37,7 @@ RSpec.describe Reek::CLI::Command::ReportCommand do
|
|
37
37
|
result = Reek::CLI::Silencer.silently do
|
38
38
|
command.execute
|
39
39
|
end
|
40
|
-
expect(result).to eq Reek::CLI::
|
40
|
+
expect(result).to eq Reek::CLI::Status::DEFAULT_FAILURE_EXIT_CODE
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -40,7 +40,7 @@ RSpec.describe Reek::CLI::Command::TodoListCommand do
|
|
40
40
|
|
41
41
|
it 'returns a success code' do
|
42
42
|
result = command.execute
|
43
|
-
expect(result).to eq(Reek::CLI::
|
43
|
+
expect(result).to eq(Reek::CLI::Status::DEFAULT_SUCCESS_EXIT_CODE)
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'writes a todo file' do
|
@@ -111,7 +111,7 @@ RSpec.describe Reek::CLI::Command::TodoListCommand do
|
|
111
111
|
|
112
112
|
it 'returns a success code' do
|
113
113
|
result = command.execute
|
114
|
-
expect(result).to eq Reek::CLI::
|
114
|
+
expect(result).to eq Reek::CLI::Status::DEFAULT_SUCCESS_EXIT_CODE
|
115
115
|
end
|
116
116
|
|
117
117
|
it 'does not write a todo file' do
|
@@ -32,8 +32,9 @@ RSpec.describe Reek::Configuration::ConfigurationFileFinder do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'returns the file even if it’s just ‘.reek’' do
|
35
|
-
|
36
|
-
|
35
|
+
single_configuration_file_dir = CONFIG_PATH.join('single_configuration_file')
|
36
|
+
found = described_class.find(current: single_configuration_file_dir)
|
37
|
+
expect(found).to eq(single_configuration_file_dir.join('.reek'))
|
37
38
|
end
|
38
39
|
|
39
40
|
it 'returns the file in home if traversing from the current dir fails' do
|
@@ -91,25 +92,47 @@ RSpec.describe Reek::Configuration::ConfigurationFileFinder do
|
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
94
|
-
|
95
|
-
let(:
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
95
|
+
context 'more than one configuration file' do
|
96
|
+
let(:path) { CONFIG_PATH.join('more_than_one_configuration_file') }
|
97
|
+
|
98
|
+
it 'prints a message on STDERR' do
|
99
|
+
expected_message = "Error: Found multiple configuration files 'regular.reek', 'todo.reek'"
|
100
|
+
expect do
|
101
|
+
begin
|
102
|
+
described_class.find(current: path)
|
103
|
+
rescue SystemExit
|
104
|
+
end
|
105
|
+
end.to output(/#{expected_message}/).to_stderr
|
100
106
|
end
|
101
107
|
|
102
|
-
it '
|
103
|
-
|
104
|
-
|
108
|
+
it 'exits' do
|
109
|
+
Reek::CLI::Silencer.silently do
|
110
|
+
expect do
|
111
|
+
described_class.find(current: path)
|
112
|
+
end.to raise_error(SystemExit)
|
113
|
+
end
|
105
114
|
end
|
106
115
|
end
|
116
|
+
end
|
107
117
|
|
108
|
-
|
118
|
+
describe '.load_from_file' do
|
119
|
+
let(:sample_configuration_loaded) do
|
120
|
+
{
|
121
|
+
'UncommunicativeVariableName' => { 'enabled' => false },
|
122
|
+
'UncommunicativeMethodName' => { 'enabled' => false }
|
123
|
+
}
|
124
|
+
end
|
109
125
|
|
110
|
-
|
111
|
-
|
112
|
-
|
126
|
+
it 'loads the configuration from given file' do
|
127
|
+
configuration = described_class.load_from_file(CONFIG_PATH.join('full_mask.reek'))
|
128
|
+
expect(configuration).to eq(sample_configuration_loaded)
|
113
129
|
end
|
114
130
|
end
|
131
|
+
|
132
|
+
private
|
133
|
+
|
134
|
+
def skip_if_a_config_in_tempdir
|
135
|
+
found = described_class.find(current: Pathname.new(Dir.tmpdir))
|
136
|
+
skip "skipped: #{found} exists and would fail this test" if found
|
137
|
+
end
|
115
138
|
end
|
@@ -10,7 +10,7 @@ RSpec.describe Reek::Report::CodeClimateConfiguration do
|
|
10
10
|
smell_types.each do |name|
|
11
11
|
config = yml.fetch(name)
|
12
12
|
it "provides remediation_points for #{name}" do
|
13
|
-
expect(config['remediation_points']).to be_a
|
13
|
+
expect(config['remediation_points']).to be_a Integer
|
14
14
|
end
|
15
15
|
|
16
16
|
it "provides content for #{name}" do
|
@@ -37,8 +37,8 @@ RSpec.describe Reek::SmellDetectors::DuplicateMethodCall do
|
|
37
37
|
EOS
|
38
38
|
|
39
39
|
expect(src).
|
40
|
-
to reek_of(:DuplicateMethodCall, lines: [3, 4], name:
|
41
|
-
and reek_of(:DuplicateMethodCall, lines: [8, 9], name:
|
40
|
+
to reek_of(:DuplicateMethodCall, lines: [3, 4], name: 'charlie.delta', count: 2).
|
41
|
+
and reek_of(:DuplicateMethodCall, lines: [8, 9], name: 'foxtrot.golf', count: 2)
|
42
42
|
end
|
43
43
|
|
44
44
|
context 'with repeated method calls' do
|
@@ -33,8 +33,8 @@ RSpec.describe Reek::SmellDetectors::FeatureEnvy do
|
|
33
33
|
EOS
|
34
34
|
|
35
35
|
expect(src).
|
36
|
-
to reek_of(:FeatureEnvy, lines: [3, 3], name:
|
37
|
-
and reek_of(:FeatureEnvy, lines: [7, 7], name:
|
36
|
+
to reek_of(:FeatureEnvy, lines: [3, 3], name: 'charlie').
|
37
|
+
and reek_of(:FeatureEnvy, lines: [7, 7], name: 'hotel')
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'does not report use of self' do
|
@@ -16,7 +16,17 @@ RSpec.describe Reek::SmellDetectors::ModuleInitialize do
|
|
16
16
|
source: 'string')
|
17
17
|
end
|
18
18
|
|
19
|
-
it '
|
19
|
+
it 'reports nothing for a method with a different name' do
|
20
|
+
src = <<-EOF
|
21
|
+
module Alfa
|
22
|
+
def bravo; end
|
23
|
+
end
|
24
|
+
EOF
|
25
|
+
|
26
|
+
expect(src).not_to reek_of(:ModuleInitialize)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'reports nothing for a method named initialize in a nested class' do
|
20
30
|
src = <<-EOF
|
21
31
|
module Alfa
|
22
32
|
class Bravo
|
@@ -28,7 +38,7 @@ RSpec.describe Reek::SmellDetectors::ModuleInitialize do
|
|
28
38
|
expect(src).not_to reek_of(:ModuleInitialize)
|
29
39
|
end
|
30
40
|
|
31
|
-
it '
|
41
|
+
it 'reports nothing for a method named initialize in a nested struct' do
|
32
42
|
src = <<-EOF
|
33
43
|
module Alfa
|
34
44
|
Bravo = Struct.new(:charlie) do
|
@@ -25,8 +25,8 @@ RSpec.describe Reek::SmellDetectors::UncommunicativeVariableName do
|
|
25
25
|
end
|
26
26
|
EOS
|
27
27
|
|
28
|
-
expect(src).to reek_of(:UncommunicativeVariableName, lines: [2], name:
|
29
|
-
and reek_of(:UncommunicativeVariableName, lines: [3], name:
|
28
|
+
expect(src).to reek_of(:UncommunicativeVariableName, lines: [2], name: 'x').
|
29
|
+
and reek_of(:UncommunicativeVariableName, lines: [3], name: 'y')
|
30
30
|
end
|
31
31
|
|
32
32
|
context 'instance variables' do
|
@@ -24,7 +24,7 @@ RSpec.describe Reek::SmellDetectors::UnusedParameters do
|
|
24
24
|
|
25
25
|
expect(src).
|
26
26
|
to reek_of(:UnusedParameters, lines: [1], name: 'bravo').
|
27
|
-
and reek_of(:UnusedParameters, lines: [1], name:
|
27
|
+
and reek_of(:UnusedParameters, lines: [1], name: 'charlie')
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'reports nothing for no parameters' do
|
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.2
|
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-
|
14
|
+
date: 2016-11-06 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: codeclimate-engine-rb
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- features/configuration_files/mix_accept_reject_setting.feature
|
156
156
|
- features/configuration_files/reject_setting.feature
|
157
157
|
- features/configuration_files/unused_private_method.feature
|
158
|
+
- features/configuration_files/warn_about_multiple_configuration_files.feature
|
158
159
|
- features/configuration_loading.feature
|
159
160
|
- features/configuration_via_source_comments/erroneous_source_comments.feature
|
160
161
|
- features/configuration_via_source_comments/well_formed_source_comments.feature
|
@@ -200,6 +201,7 @@ files:
|
|
200
201
|
- lib/reek/cli/command/todo_list_command.rb
|
201
202
|
- lib/reek/cli/options.rb
|
202
203
|
- lib/reek/cli/silencer.rb
|
204
|
+
- lib/reek/cli/status.rb
|
203
205
|
- lib/reek/code_comment.rb
|
204
206
|
- lib/reek/configuration/app_configuration.rb
|
205
207
|
- lib/reek/configuration/configuration_file_finder.rb
|
@@ -297,13 +299,15 @@ files:
|
|
297
299
|
- reek.gemspec
|
298
300
|
- samples/checkstyle.xml
|
299
301
|
- samples/clean.rb
|
300
|
-
- samples/configuration/.reek
|
301
302
|
- samples/configuration/corrupt.reek
|
302
303
|
- samples/configuration/empty.reek
|
303
304
|
- samples/configuration/full_configuration.reek
|
304
305
|
- samples/configuration/full_mask.reek
|
306
|
+
- samples/configuration/more_than_one_configuration_file/regular.reek
|
307
|
+
- samples/configuration/more_than_one_configuration_file/todo.reek
|
305
308
|
- samples/configuration/non_public_modifiers_mask.reek
|
306
309
|
- samples/configuration/partial_mask.reek
|
310
|
+
- samples/configuration/single_configuration_file/.reek
|
307
311
|
- samples/configuration/with_excluded_paths.reek
|
308
312
|
- samples/exceptions.reek
|
309
313
|
- samples/inline.rb
|