reek 5.0.2 → 5.1.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/.rubocop.yml +9 -70
- data/.rubocop_todo.yml +63 -0
- data/.simplecov +4 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile +12 -17
- data/README.md +21 -29
- data/Rakefile +2 -2
- data/docs/templates/default/docstring/setup.rb +3 -0
- data/features/command_line_interface/options.feature +5 -3
- data/features/configuration_files/schema_validation.feature +3 -3
- data/features/configuration_files/show_configuration_file.feature +44 -0
- data/features/rake_task/rake_task.feature +1 -1
- data/features/reports/json.feature +3 -3
- data/features/reports/reports.feature +4 -4
- data/features/reports/yaml.feature +3 -3
- data/features/rspec_matcher.feature +1 -0
- data/features/step_definitions/sample_file_steps.rb +6 -8
- data/features/todo_list.feature +39 -26
- data/lib/reek.rb +7 -0
- data/lib/reek/ast/node.rb +4 -0
- data/lib/reek/ast/sexp_extensions/if.rb +20 -0
- data/lib/reek/ast/sexp_extensions/methods.rb +1 -0
- data/lib/reek/cli/application.rb +25 -0
- data/lib/reek/cli/command/todo_list_command.rb +17 -7
- data/lib/reek/cli/options.rb +21 -14
- data/lib/reek/code_comment.rb +2 -0
- data/lib/reek/configuration/app_configuration.rb +0 -3
- data/lib/reek/configuration/configuration_converter.rb +4 -4
- data/lib/reek/configuration/directory_directives.rb +1 -0
- data/lib/reek/configuration/schema_validator.rb +1 -0
- data/lib/reek/context/method_context.rb +1 -0
- data/lib/reek/context/module_context.rb +5 -4
- data/lib/reek/context/visibility_tracker.rb +7 -4
- data/lib/reek/context_builder.rb +1 -0
- data/lib/reek/detector_repository.rb +1 -0
- data/lib/reek/errors/incomprehensible_source_error.rb +2 -2
- data/lib/reek/errors/syntax_error.rb +4 -0
- data/lib/reek/examiner.rb +1 -0
- data/lib/reek/report/text_report.rb +1 -0
- data/lib/reek/smell_detectors/control_parameter.rb +13 -107
- data/lib/reek/smell_detectors/control_parameter_helpers/call_in_condition_finder.rb +91 -0
- data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +38 -0
- data/lib/reek/smell_detectors/control_parameter_helpers/control_parameter_finder.rb +94 -0
- data/lib/reek/smell_detectors/duplicate_method_call.rb +1 -0
- data/lib/reek/smell_detectors/feature_envy.rb +2 -0
- data/lib/reek/smell_detectors/irresponsible_module.rb +1 -0
- data/lib/reek/smell_detectors/long_parameter_list.rb +1 -0
- data/lib/reek/smell_detectors/manual_dispatch.rb +1 -0
- data/lib/reek/smell_detectors/missing_safe_method.rb +1 -0
- data/lib/reek/smell_detectors/nested_iterators.rb +1 -0
- data/lib/reek/smell_detectors/repeated_conditional.rb +1 -0
- data/lib/reek/smell_detectors/too_many_instance_variables.rb +1 -0
- data/lib/reek/smell_detectors/too_many_methods.rb +1 -0
- data/lib/reek/smell_detectors/too_many_statements.rb +1 -0
- data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +2 -0
- data/lib/reek/smell_detectors/unused_parameters.rb +1 -0
- data/lib/reek/source/source_locator.rb +1 -0
- data/lib/reek/spec/should_reek_of.rb +2 -2
- data/lib/reek/spec/should_reek_only_of.rb +1 -0
- data/lib/reek/spec/smell_matcher.rb +1 -0
- data/lib/reek/tree_dresser.rb +1 -0
- data/lib/reek/version.rb +1 -1
- data/samples/smelly_source/ruby.rb +368 -0
- data/spec/factories/factories.rb +10 -9
- data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +17 -0
- data/spec/quality/documentation_spec.rb +40 -0
- data/spec/reek/ast/sexp_extensions_spec.rb +20 -20
- data/spec/reek/cli/application_spec.rb +29 -0
- data/spec/reek/cli/command/todo_list_command_spec.rb +64 -46
- data/spec/reek/configuration/app_configuration_spec.rb +8 -8
- data/spec/reek/configuration/configuration_file_finder_spec.rb +3 -3
- data/spec/reek/configuration/schema_validator_spec.rb +10 -10
- data/spec/reek/detector_repository_spec.rb +2 -2
- data/spec/reek/smell_detectors/control_parameter_spec.rb +17 -0
- data/spec/reek/source/source_locator_spec.rb +0 -2
- data/spec/spec_helper.rb +2 -0
- data/tasks/configuration.rake +2 -1
- data/tasks/test.rake +4 -0
- metadata +11 -5
- data/ataru_setup.rb +0 -13
- data/tasks/ataru.rake +0 -5
@@ -0,0 +1,44 @@
|
|
1
|
+
Feature: Show configuration file
|
2
|
+
With Reeks dynamic mechanism of finding a configuration file you might run into a situation where you are not
|
3
|
+
100% sure what configuration file Reek is using. E.g. you have a project specific configuration file in your
|
4
|
+
project root and also another Reek configuration in your HOME directory that you use for all your other projects
|
5
|
+
and for whatever reasons Reek seems to be using another configuration file than the one you assumed it would.
|
6
|
+
In this case you can pass the flag `--show-configuration-path` to Reek which will cause Reek to output the path
|
7
|
+
to the configuration file it is using.
|
8
|
+
|
9
|
+
Scenario: Default configuration file present
|
10
|
+
Given the clean file "clean.rb"
|
11
|
+
And an empty file named ".reek.yml"
|
12
|
+
When I run reek --show-configuration-path clean.rb
|
13
|
+
Then it reports:
|
14
|
+
"""
|
15
|
+
Using '.reek.yml' as configuration file.
|
16
|
+
"""
|
17
|
+
|
18
|
+
Scenario: Non-default configuration file passed via CLI
|
19
|
+
Given the clean file "clean.rb"
|
20
|
+
And an empty file named "config.reek"
|
21
|
+
When I run reek --show-configuration-path -c config.reek clean.rb
|
22
|
+
Then it reports:
|
23
|
+
"""
|
24
|
+
Using 'config.reek' as configuration file.
|
25
|
+
"""
|
26
|
+
|
27
|
+
Scenario: Display the right configuration file even when there are multiple files present
|
28
|
+
Given the clean file "clean.rb"
|
29
|
+
And an empty file named ".reek.yml"
|
30
|
+
And an empty file named "config.reek"
|
31
|
+
When I run reek --show-configuration-path -c config.reek clean.rb
|
32
|
+
Then it reports:
|
33
|
+
"""
|
34
|
+
Using 'config.reek' as configuration file.
|
35
|
+
"""
|
36
|
+
|
37
|
+
Scenario: Use configuration file we find when traversing up the directory tree
|
38
|
+
Given the clean file "clean.rb"
|
39
|
+
And with a configuration file that is further up in the directory tree
|
40
|
+
When I run reek --show-configuration-path clean.rb
|
41
|
+
Then it reports:
|
42
|
+
"""
|
43
|
+
Using '../../.reek.yml' as configuration file.
|
44
|
+
"""
|
@@ -117,7 +117,7 @@ Feature: Reek can be driven through its Task
|
|
117
117
|
|
118
118
|
Scenario: REEK_SRC overrides the files to check
|
119
119
|
Given the smelly file 'smelly.rb'
|
120
|
-
And the clean file
|
120
|
+
And the clean file "clean.rb"
|
121
121
|
And a file "Rakefile" with:
|
122
122
|
"""
|
123
123
|
require 'reek/rake/task'
|
@@ -24,7 +24,7 @@ Feature: Report smells using simple JSON layout
|
|
24
24
|
"context": "Smelly#x",
|
25
25
|
"lines": [ 4 ],
|
26
26
|
"message": "has the name 'x'",
|
27
|
-
"documentation_link": "https://github.com/troessner/reek/blob/v5.0
|
27
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v5.1.0/docs/Uncommunicative-Method-Name.md",
|
28
28
|
"name": "x"
|
29
29
|
},
|
30
30
|
{
|
@@ -33,7 +33,7 @@ Feature: Report smells using simple JSON layout
|
|
33
33
|
"context": "Smelly#x",
|
34
34
|
"lines": [ 5 ],
|
35
35
|
"message": "has the variable name 'y'",
|
36
|
-
"documentation_link": "https://github.com/troessner/reek/blob/v5.0
|
36
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v5.1.0/docs/Uncommunicative-Variable-Name.md",
|
37
37
|
"name": "y"
|
38
38
|
}
|
39
39
|
]
|
@@ -53,7 +53,7 @@ Feature: Report smells using simple JSON layout
|
|
53
53
|
1
|
54
54
|
],
|
55
55
|
"message": "has no descriptive comment",
|
56
|
-
"documentation_link": "https://github.com/troessner/reek/blob/v5.0
|
56
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v5.1.0/docs/Irresponsible-Module.md"
|
57
57
|
}
|
58
58
|
]
|
59
59
|
"""
|
@@ -182,8 +182,8 @@ Feature: Correctly formatted reports
|
|
182
182
|
And it reports:
|
183
183
|
"""
|
184
184
|
smelly.rb -- 2 warnings:
|
185
|
-
[4]:UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/v5.0
|
186
|
-
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v5.0
|
185
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/v5.1.0/docs/Uncommunicative-Method-Name.md]
|
186
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v5.1.0/docs/Uncommunicative-Variable-Name.md]
|
187
187
|
"""
|
188
188
|
|
189
189
|
Examples:
|
@@ -209,8 +209,8 @@ Feature: Correctly formatted reports
|
|
209
209
|
And it reports:
|
210
210
|
"""
|
211
211
|
smelly.rb -- 2 warnings:
|
212
|
-
UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/v5.0
|
213
|
-
UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v5.0
|
212
|
+
UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/v5.1.0/docs/Uncommunicative-Method-Name.md]
|
213
|
+
UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v5.1.0/docs/Uncommunicative-Variable-Name.md]
|
214
214
|
"""
|
215
215
|
|
216
216
|
Examples:
|
@@ -25,7 +25,7 @@ Feature: Report smells using simple YAML layout
|
|
25
25
|
smell_type: UncommunicativeMethodName
|
26
26
|
source: smelly.rb
|
27
27
|
name: x
|
28
|
-
documentation_link: https://github.com/troessner/reek/blob/v5.0
|
28
|
+
documentation_link: https://github.com/troessner/reek/blob/v5.1.0/docs/Uncommunicative-Method-Name.md
|
29
29
|
- context: Smelly#x
|
30
30
|
lines:
|
31
31
|
- 5
|
@@ -33,7 +33,7 @@ Feature: Report smells using simple YAML layout
|
|
33
33
|
smell_type: UncommunicativeVariableName
|
34
34
|
source: smelly.rb
|
35
35
|
name: y
|
36
|
-
documentation_link: https://github.com/troessner/reek/blob/v5.0
|
36
|
+
documentation_link: https://github.com/troessner/reek/blob/v5.1.0/docs/Uncommunicative-Variable-Name.md
|
37
37
|
"""
|
38
38
|
|
39
39
|
Scenario: Indicate smells and print them as yaml when using STDIN
|
@@ -48,5 +48,5 @@ Feature: Report smells using simple YAML layout
|
|
48
48
|
lines:
|
49
49
|
- 1
|
50
50
|
message: has no descriptive comment
|
51
|
-
documentation_link: https://github.com/troessner/reek/blob/v5.0
|
51
|
+
documentation_link: https://github.com/troessner/reek/blob/v5.1.0/docs/Irresponsible-Module.md
|
52
52
|
"""
|
@@ -4,8 +4,8 @@ Given(/^the smelly file '(.+)'$/) do |filename|
|
|
4
4
|
write_file(filename, SAMPLES_DIR.join('smelly_source').join(filename).read)
|
5
5
|
end
|
6
6
|
|
7
|
-
Given(/^the clean file
|
8
|
-
write_file(
|
7
|
+
Given(/^the clean file "(.*)"$/) do |filename|
|
8
|
+
write_file(filename, CLEAN_FILE.read)
|
9
9
|
end
|
10
10
|
|
11
11
|
Given(/^a directory called 'clean' containing two clean files$/) do
|
@@ -48,12 +48,10 @@ When(/^I run "reek (.*?)" in a subdirectory$/) do |args|
|
|
48
48
|
reek(args)
|
49
49
|
end
|
50
50
|
|
51
|
-
Given(/^a configuration file '(.+)' in a subdirectory$/) do |filename|
|
52
|
-
contents = CONFIGURATION_DIR.join(filename).read
|
53
|
-
|
54
|
-
write_file("subdir/#{filename}", contents)
|
55
|
-
end
|
56
|
-
|
57
51
|
Then(/^it does not report private or protected methods$/) do
|
58
52
|
# Pseudo step for feature clarity.
|
59
53
|
end
|
54
|
+
|
55
|
+
Given('with a configuration file that is further up in the directory tree') do
|
56
|
+
# Pseudo step for feature clarity. We have an empty .reek.yml in our root directory already.
|
57
|
+
end
|
data/features/todo_list.feature
CHANGED
@@ -1,14 +1,11 @@
|
|
1
1
|
Feature: Auto-generate a todo file
|
2
2
|
Write a Reek configuration as a kind of todo list that will prevent Reek
|
3
|
-
from reporting smells on the current code.
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
- exclude the "old" smells from getting reported
|
8
|
-
- fix them step by step
|
9
|
-
- get rid of the todo file
|
3
|
+
from reporting smells on the current code. This can then be worked on later on.
|
4
|
+
The main goal here would be to ease the Reek adoption by allowing developers to
|
5
|
+
introduce Reek right away (e.g. for CI), exclude the "old" smells from getting reported
|
6
|
+
and then fix them step by step.
|
10
7
|
|
11
|
-
Scenario: Generate
|
8
|
+
Scenario: Generate the default configuration file that disables all found smells
|
12
9
|
Given the smelly file 'smelly.rb'
|
13
10
|
When I run reek smelly.rb
|
14
11
|
Then the exit status indicates smells
|
@@ -23,10 +20,10 @@ Feature: Auto-generate a todo file
|
|
23
20
|
And it reports:
|
24
21
|
"""
|
25
22
|
|
26
|
-
'.
|
23
|
+
'.reek.yml' generated! You can now use this as a starting point.
|
27
24
|
"""
|
28
|
-
And a file named ".
|
29
|
-
And the file ".
|
25
|
+
And a file named ".reek.yml" should exist
|
26
|
+
And the file ".reek.yml" should contain:
|
30
27
|
"""
|
31
28
|
---
|
32
29
|
detectors:
|
@@ -37,48 +34,52 @@ Feature: Auto-generate a todo file
|
|
37
34
|
exclude:
|
38
35
|
- Smelly#x
|
39
36
|
"""
|
40
|
-
When I run reek
|
37
|
+
When I run reek smelly.rb
|
41
38
|
Then it succeeds
|
42
39
|
|
43
40
|
Scenario: Reacts appropiately when there are no smells
|
44
|
-
Given the clean file
|
41
|
+
Given the clean file "clean.rb"
|
45
42
|
When I run reek --todo clean.rb
|
46
|
-
Then a file named ".
|
43
|
+
Then a file named ".reek.yml" should not exist
|
47
44
|
And it reports:
|
48
45
|
"""
|
49
46
|
|
50
|
-
|
47
|
+
No smells found - nothing to do, exiting.
|
51
48
|
"""
|
52
49
|
|
53
|
-
Scenario:
|
50
|
+
Scenario: Don't overwrite existing .reek.yml files
|
54
51
|
Given the smelly file 'smelly.rb'
|
55
|
-
And a file named ".
|
52
|
+
And a file named ".reek.yml" with:
|
56
53
|
"""
|
57
54
|
---
|
58
55
|
detectors:
|
59
|
-
# smelly.rb reeks of UncommunicativeMethodName and UncommunicativeVariableName
|
60
|
-
# so the configuration below will partially mask this
|
61
56
|
UncommunicativeMethodName:
|
62
57
|
enabled: false
|
63
58
|
"""
|
64
|
-
When I run reek
|
59
|
+
When I run reek smelly.rb
|
65
60
|
Then it reports:
|
66
61
|
"""
|
67
62
|
smelly.rb -- 1 warning:
|
68
63
|
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
69
64
|
"""
|
70
65
|
When I run reek --todo smelly.rb
|
71
|
-
Then it
|
72
|
-
|
73
|
-
|
66
|
+
Then it reports:
|
67
|
+
"""
|
68
|
+
|
69
|
+
Existing '.reek.yml' detected - aborting.
|
70
|
+
"""
|
71
|
+
When I run reek smelly.rb
|
72
|
+
Then it reports:
|
73
|
+
"""
|
74
|
+
smelly.rb -- 1 warning:
|
75
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
|
76
|
+
"""
|
74
77
|
|
75
78
|
Scenario: Ignore existing other configuration files that are passed explicitly
|
76
79
|
Given the smelly file 'smelly.rb'
|
77
80
|
And a file named "config.reek" with:
|
78
81
|
"""
|
79
82
|
---
|
80
|
-
# smelly.rb reeks of UncommunicativeMethodName and UncommunicativeVariableName
|
81
|
-
# so the configuration below will partially mask this
|
82
83
|
detectors:
|
83
84
|
UncommunicativeMethodName:
|
84
85
|
enabled: false
|
@@ -91,5 +92,17 @@ Feature: Auto-generate a todo file
|
|
91
92
|
"""
|
92
93
|
When I run reek -c config.reek --todo smelly.rb
|
93
94
|
Then it succeeds
|
94
|
-
|
95
|
+
And a file named ".reek.yml" should exist
|
96
|
+
And the file ".reek.yml" should contain:
|
97
|
+
"""
|
98
|
+
---
|
99
|
+
detectors:
|
100
|
+
UncommunicativeMethodName:
|
101
|
+
exclude:
|
102
|
+
- Smelly#x
|
103
|
+
UncommunicativeVariableName:
|
104
|
+
exclude:
|
105
|
+
- Smelly#x
|
106
|
+
"""
|
107
|
+
When I run reek smelly.rb
|
95
108
|
Then it reports nothing
|
data/lib/reek.rb
CHANGED
@@ -6,3 +6,10 @@
|
|
6
6
|
require_relative 'reek/version'
|
7
7
|
require_relative 'reek/examiner'
|
8
8
|
require_relative 'reek/report'
|
9
|
+
|
10
|
+
module Reek
|
11
|
+
DEFAULT_CONFIGURATION_FILE_NAME = '.reek.yml'
|
12
|
+
DETECTORS_KEY = 'detectors'
|
13
|
+
EXCLUDE_PATHS_KEY = 'exclude_paths'
|
14
|
+
DIRECTORIES_KEY = 'directories'
|
15
|
+
end
|
data/lib/reek/ast/node.rb
CHANGED
@@ -102,6 +102,9 @@ module Reek
|
|
102
102
|
loc.expression.source_buffer.name
|
103
103
|
end
|
104
104
|
|
105
|
+
# Method will be overridden by the code in the IfNode, CaseNode, and LogicOperatorBase sexp extensions.
|
106
|
+
def condition; end
|
107
|
+
|
105
108
|
protected
|
106
109
|
|
107
110
|
# See ".each_node" for documentation.
|
@@ -119,6 +122,7 @@ module Reek
|
|
119
122
|
def look_for_recurse(target_types, ignoring, &blk)
|
120
123
|
yield self if target_types.include? type
|
121
124
|
return if ignoring.include? type
|
125
|
+
|
122
126
|
each_sexp do |elem|
|
123
127
|
elem.look_for_recurse(target_types, ignoring, &blk)
|
124
128
|
end
|
@@ -5,6 +5,26 @@ module Reek
|
|
5
5
|
module SexpExtensions
|
6
6
|
# Utility methods for :if nodes.
|
7
7
|
module IfNode
|
8
|
+
#
|
9
|
+
# @return [Reek::AST::Node] the condition that is associated with a conditional node.
|
10
|
+
# For instance, this code
|
11
|
+
#
|
12
|
+
# if charlie(bravo) then delta end
|
13
|
+
#
|
14
|
+
# would be parsed into this AST:
|
15
|
+
#
|
16
|
+
# s(:if,
|
17
|
+
# s(:send, nil, :charlie,
|
18
|
+
# s(:lvar, :bravo)),
|
19
|
+
# s(:send, nil, :delta), nil)
|
20
|
+
#
|
21
|
+
# so in this case we would return this
|
22
|
+
#
|
23
|
+
# s(:send, nil, :charlie,
|
24
|
+
# s(:lvar, :bravo))
|
25
|
+
#
|
26
|
+
# as condition.
|
27
|
+
#
|
8
28
|
def condition
|
9
29
|
children.first
|
10
30
|
end
|
data/lib/reek/cli/application.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require_relative 'options'
|
4
4
|
require_relative 'status'
|
5
5
|
require_relative '../configuration/app_configuration'
|
6
|
+
require_relative '../configuration/configuration_file_finder'
|
6
7
|
require_relative '../source/source_locator'
|
7
8
|
require_relative 'command/report_command'
|
8
9
|
require_relative 'command/todo_list_command'
|
@@ -27,6 +28,7 @@ module Reek
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def execute
|
31
|
+
show_configuration_path
|
30
32
|
command.execute
|
31
33
|
end
|
32
34
|
|
@@ -48,6 +50,29 @@ module Reek
|
|
48
50
|
exit Status::DEFAULT_ERROR_EXIT_CODE
|
49
51
|
end
|
50
52
|
|
53
|
+
def show_configuration_path
|
54
|
+
return unless options.show_configuration_path
|
55
|
+
|
56
|
+
path = Configuration::ConfigurationFileFinder.find(path: options.config_file)
|
57
|
+
if path
|
58
|
+
puts "Using '#{path_relative_to_working_directory(path)}' as configuration file."
|
59
|
+
else
|
60
|
+
puts 'Not using any configuration file.'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns the path that is relative to the current working directory given an absolute path.
|
65
|
+
# E.g. if the given absolute path is "/foo/bar/baz/.reek.yml" and your working directory is
|
66
|
+
# "/foo/bar" this method would return "baz/.reek.yml"
|
67
|
+
#
|
68
|
+
# @param path [String] Absolute path
|
69
|
+
# @return [Pathname], e.g. 'config/.reek.yml'
|
70
|
+
#
|
71
|
+
# :reek:UtilityFunction
|
72
|
+
def path_relative_to_working_directory(path)
|
73
|
+
Pathname(path).realpath.relative_path_from(Pathname.pwd)
|
74
|
+
end
|
75
|
+
|
51
76
|
def command_class
|
52
77
|
options.generate_todo_list ? Command::TodoListCommand : Command::ReportCommand
|
53
78
|
end
|
@@ -12,17 +12,19 @@ module Reek
|
|
12
12
|
# file that can serve as a todo list.
|
13
13
|
#
|
14
14
|
class TodoListCommand < BaseCommand
|
15
|
-
|
15
|
+
HEADER = "# Auto generated by Reeks --todo flag\n"
|
16
|
+
EXISTING_FILE_MESSAGE = "\nExisting '#{DEFAULT_CONFIGURATION_FILE_NAME}' detected - aborting.\n"
|
17
|
+
NO_SMELLS_FOUND_MESSAGE = "\nNo smells found - nothing to do, exiting.\n"
|
16
18
|
|
17
19
|
def execute
|
18
20
|
if smells.empty?
|
19
|
-
puts
|
20
|
-
|
21
|
+
puts NO_SMELLS_FOUND_MESSAGE
|
22
|
+
elsif File.exist?(DEFAULT_CONFIGURATION_FILE_NAME)
|
23
|
+
puts EXISTING_FILE_MESSAGE
|
21
24
|
else
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
'this as a starting point for your configuration.'
|
25
|
+
write_to_file
|
26
|
+
puts "\n'#{DEFAULT_CONFIGURATION_FILE_NAME}' generated! "\
|
27
|
+
'You can now use this as a starting point.'
|
26
28
|
end
|
27
29
|
options.success_exit_code
|
28
30
|
end
|
@@ -44,6 +46,14 @@ module Reek
|
|
44
46
|
todos.inject(&:merge)
|
45
47
|
end
|
46
48
|
end
|
49
|
+
|
50
|
+
# :reek:FeatureEnvy
|
51
|
+
def write_to_file
|
52
|
+
File.open(DEFAULT_CONFIGURATION_FILE_NAME, 'w') do |configuration_file|
|
53
|
+
configuration_file.write HEADER
|
54
|
+
configuration_file.write({ DETECTORS_KEY => groups }.to_yaml)
|
55
|
+
end
|
56
|
+
end
|
47
57
|
end
|
48
58
|
end
|
49
59
|
end
|
data/lib/reek/cli/options.rb
CHANGED
@@ -14,7 +14,7 @@ module Reek
|
|
14
14
|
#
|
15
15
|
# See {file:docs/Command-Line-Options.md} for details.
|
16
16
|
#
|
17
|
-
# @quality :reek:TooManyInstanceVariables { max_instance_variables:
|
17
|
+
# @quality :reek:TooManyInstanceVariables { max_instance_variables: 13 }
|
18
18
|
# @quality :reek:TooManyMethods { max_methods: 18 }
|
19
19
|
# @quality :reek:Attribute { enabled: false }
|
20
20
|
#
|
@@ -32,21 +32,23 @@ module Reek
|
|
32
32
|
:success_exit_code,
|
33
33
|
:failure_exit_code,
|
34
34
|
:generate_todo_list,
|
35
|
-
:force_exclusion
|
35
|
+
:force_exclusion,
|
36
|
+
:show_configuration_path
|
36
37
|
|
37
38
|
def initialize(argv = [])
|
38
|
-
@argv
|
39
|
-
@parser
|
40
|
-
@report_format
|
41
|
-
@location_format
|
42
|
-
@progress_format
|
43
|
-
@show_links
|
44
|
-
@smells_to_detect
|
45
|
-
@colored
|
46
|
-
@success_exit_code
|
47
|
-
@failure_exit_code
|
48
|
-
@generate_todo_list
|
49
|
-
@force_exclusion
|
39
|
+
@argv = argv
|
40
|
+
@parser = OptionParser.new
|
41
|
+
@report_format = :text
|
42
|
+
@location_format = :numbers
|
43
|
+
@progress_format = tty_output? ? :dots : :quiet
|
44
|
+
@show_links = true
|
45
|
+
@smells_to_detect = []
|
46
|
+
@colored = tty_output?
|
47
|
+
@success_exit_code = Status::DEFAULT_SUCCESS_EXIT_CODE
|
48
|
+
@failure_exit_code = Status::DEFAULT_FAILURE_EXIT_CODE
|
49
|
+
@generate_todo_list = false
|
50
|
+
@force_exclusion = false
|
51
|
+
@show_configuration_path = false
|
50
52
|
|
51
53
|
set_up_parser
|
52
54
|
end
|
@@ -153,6 +155,7 @@ module Reek
|
|
153
155
|
end
|
154
156
|
end
|
155
157
|
|
158
|
+
# @quality :reek:TooManyStatements { max_statements: 6 }
|
156
159
|
def set_up_verbosity_options
|
157
160
|
parser.on('-V', '--[no-]empty-headings',
|
158
161
|
'Show headings for smell-free source files (default: false)') do |show_empty|
|
@@ -162,6 +165,10 @@ module Reek
|
|
162
165
|
'Show link to related documentation page for each smell (default: true)') do |show_links|
|
163
166
|
self.show_links = show_links
|
164
167
|
end
|
168
|
+
parser.on(nil, '--[no-]show-configuration-path',
|
169
|
+
'Show which configuration file Reek is using (default: false)') do |show_configuration_path|
|
170
|
+
self.show_configuration_path = show_configuration_path
|
171
|
+
end
|
165
172
|
end
|
166
173
|
|
167
174
|
def set_up_location_formatting_options
|