reek 6.0.1 → 6.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +9 -0
- data/.github/workflows/ruby.yml +52 -0
- data/.rubocop.yml +2 -20
- data/.rubocop_todo.yml +27 -20
- data/CHANGELOG.md +22 -0
- data/CONTRIBUTING.md +3 -0
- data/Dockerfile +1 -1
- data/Gemfile +6 -6
- data/README.md +1 -1
- data/bin/code_climate_reek +2 -3
- data/lib/reek.rb +1 -0
- data/lib/reek/ast/ast_node_class_map.rb +1 -1
- data/lib/reek/ast/node.rb +1 -1
- data/lib/reek/cli/options.rb +1 -1
- data/lib/reek/configuration/app_configuration.rb +4 -3
- data/lib/reek/configuration/directory_directives.rb +2 -2
- data/lib/reek/configuration/excluded_paths.rb +2 -1
- data/lib/reek/context/code_context.rb +1 -1
- data/lib/reek/context/module_context.rb +3 -1
- data/lib/reek/context/refinement_context.rb +16 -0
- data/lib/reek/context_builder.rb +16 -2
- data/lib/reek/report/code_climate/code_climate_configuration.yml +1 -1
- data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
- data/lib/reek/smell_detectors/base_detector.rb +1 -1
- data/lib/reek/smell_detectors/boolean_parameter.rb +3 -1
- data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +1 -1
- data/lib/reek/smell_warning.rb +2 -3
- data/lib/reek/source/source_locator.rb +14 -13
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +14 -3
- metadata +29 -232
- data/.travis.yml +0 -36
- data/docs/API.md +0 -174
- data/docs/Attribute.md +0 -39
- data/docs/Basic-Smell-Options.md +0 -85
- data/docs/Boolean-Parameter.md +0 -54
- data/docs/Class-Variable.md +0 -40
- data/docs/Code-Smells.md +0 -39
- data/docs/Command-Line-Options.md +0 -119
- data/docs/Control-Couple.md +0 -26
- data/docs/Control-Parameter.md +0 -32
- data/docs/Data-Clump.md +0 -46
- data/docs/Duplicate-Method-Call.md +0 -264
- data/docs/Feature-Envy.md +0 -93
- data/docs/How-To-Write-New-Detectors.md +0 -132
- data/docs/How-reek-works-internally.md +0 -114
- data/docs/Instance-Variable-Assumption.md +0 -163
- data/docs/Irresponsible-Module.md +0 -47
- data/docs/Large-Class.md +0 -16
- data/docs/Long-Parameter-List.md +0 -39
- data/docs/Long-Yield-List.md +0 -37
- data/docs/Manual-Dispatch.md +0 -30
- data/docs/Missing-Safe-Method.md +0 -92
- data/docs/Module-Initialize.md +0 -62
- data/docs/Nested-Iterators.md +0 -59
- data/docs/Nil-Check.md +0 -47
- data/docs/RSpec-matchers.md +0 -129
- data/docs/Rake-Task.md +0 -66
- data/docs/Reek-4-to-Reek-5-migration.md +0 -188
- data/docs/Reek-Driven-Development.md +0 -46
- data/docs/Repeated-Conditional.md +0 -47
- data/docs/Simulated-Polymorphism.md +0 -16
- data/docs/Smell-Suppression.md +0 -96
- data/docs/Style-Guide.md +0 -19
- data/docs/Subclassed-From-Core-Class.md +0 -79
- data/docs/Too-Many-Constants.md +0 -37
- data/docs/Too-Many-Instance-Variables.md +0 -43
- data/docs/Too-Many-Methods.md +0 -56
- data/docs/Too-Many-Statements.md +0 -54
- data/docs/Uncommunicative-Method-Name.md +0 -94
- data/docs/Uncommunicative-Module-Name.md +0 -92
- data/docs/Uncommunicative-Name.md +0 -18
- data/docs/Uncommunicative-Parameter-Name.md +0 -90
- data/docs/Uncommunicative-Variable-Name.md +0 -96
- data/docs/Unused-Parameters.md +0 -28
- data/docs/Unused-Private-Method.md +0 -101
- data/docs/Utility-Function.md +0 -56
- data/docs/Versioning-Policy.md +0 -7
- data/docs/YAML-Reports.md +0 -93
- data/docs/defaults.reek.yml +0 -129
- data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
- data/docs/templates/default/docstring/setup.rb +0 -37
- data/docs/templates/default/fulldoc/html/css/common.css +0 -1
- data/docs/yard_plugin.rb +0 -17
- data/features/command_line_interface/basic_usage.feature +0 -15
- data/features/command_line_interface/options.feature +0 -123
- data/features/command_line_interface/show_progress.feature +0 -33
- data/features/command_line_interface/smell_selection.feature +0 -15
- data/features/command_line_interface/smells_count.feature +0 -38
- data/features/command_line_interface/stdin.feature +0 -65
- data/features/configuration_files/accept_setting.feature +0 -87
- data/features/configuration_files/directory_specific_directives.feature +0 -274
- data/features/configuration_files/exclude_directives.feature +0 -35
- data/features/configuration_files/exclude_paths_directives.feature +0 -42
- data/features/configuration_files/masking_smells.feature +0 -94
- data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
- data/features/configuration_files/reject_setting.feature +0 -89
- data/features/configuration_files/schema_validation.feature +0 -59
- data/features/configuration_files/show_configuration_file.feature +0 -44
- data/features/configuration_files/unused_private_method.feature +0 -68
- data/features/configuration_loading.feature +0 -91
- data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
- data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
- data/features/locales.feature +0 -32
- data/features/programmatic_access.feature +0 -41
- data/features/rake_task/rake_task.feature +0 -138
- data/features/reports/codeclimate.feature +0 -59
- data/features/reports/json.feature +0 -59
- data/features/reports/reports.feature +0 -219
- data/features/reports/yaml.feature +0 -52
- data/features/rspec_matcher.feature +0 -41
- data/features/samples.feature +0 -305
- data/features/step_definitions/.rubocop.yml +0 -5
- data/features/step_definitions/reek_steps.rb +0 -102
- data/features/step_definitions/sample_file_steps.rb +0 -63
- data/features/support/env.rb +0 -33
- data/features/todo_list.feature +0 -108
- data/samples/checkstyle.xml +0 -7
- data/samples/clean_source/clean.rb +0 -6
- data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
- data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
- data/samples/configuration/corrupt.reek +0 -1
- data/samples/configuration/empty.reek +0 -0
- data/samples/configuration/full_configuration.reek +0 -13
- data/samples/configuration/full_mask.reek +0 -6
- data/samples/configuration/home/home.reek.yml +0 -4
- data/samples/configuration/partial_mask.reek +0 -4
- data/samples/configuration/regular_configuration/.reek.yml +0 -4
- data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
- data/samples/configuration/with_excluded_paths.reek +0 -5
- data/samples/no_config_file/.keep +0 -0
- data/samples/paths.rb +0 -5
- data/samples/smelly_source/inline.rb +0 -704
- data/samples/smelly_source/optparse.rb +0 -1788
- data/samples/smelly_source/redcloth.rb +0 -1130
- data/samples/smelly_source/ruby.rb +0 -368
- data/samples/smelly_source/smelly.rb +0 -7
- data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
- data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
- data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
- data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
- data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
- data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
- data/samples/source_with_non_ruby_files/gibberish +0 -1
- data/samples/source_with_non_ruby_files/python_source.py +0 -1
- data/samples/source_with_non_ruby_files/ruby.rb +0 -6
- data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -17
- data/spec/quality/documentation_spec.rb +0 -40
- data/spec/quality/reek_source_spec.rb +0 -11
- data/spec/reek/ast/node_spec.rb +0 -211
- data/spec/reek/ast/object_refs_spec.rb +0 -83
- data/spec/reek/ast/reference_collector_spec.rb +0 -47
- data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
- data/spec/reek/cli/application_spec.rb +0 -168
- data/spec/reek/cli/command/report_command_spec.rb +0 -44
- data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
- data/spec/reek/cli/options_spec.rb +0 -51
- data/spec/reek/cli/silencer_spec.rb +0 -28
- data/spec/reek/code_comment_spec.rb +0 -184
- data/spec/reek/configuration/app_configuration_spec.rb +0 -195
- data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
- data/spec/reek/configuration/default_directive_spec.rb +0 -13
- data/spec/reek/configuration/directory_directives_spec.rb +0 -122
- data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
- data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
- data/spec/reek/configuration/schema_validator_spec.rb +0 -165
- data/spec/reek/context/code_context_spec.rb +0 -192
- data/spec/reek/context/ghost_context_spec.rb +0 -60
- data/spec/reek/context/method_context_spec.rb +0 -72
- data/spec/reek/context/module_context_spec.rb +0 -55
- data/spec/reek/context/root_context_spec.rb +0 -12
- data/spec/reek/context/statement_counter_spec.rb +0 -24
- data/spec/reek/context_builder_spec.rb +0 -457
- data/spec/reek/detector_repository_spec.rb +0 -22
- data/spec/reek/documentation_link_spec.rb +0 -20
- data/spec/reek/errors/base_error_spec.rb +0 -13
- data/spec/reek/examiner_spec.rb +0 -309
- data/spec/reek/logging_error_handler_spec.rb +0 -24
- data/spec/reek/rake/task_spec.rb +0 -56
- data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
- data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
- data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
- data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
- data/spec/reek/report/html_report_spec.rb +0 -19
- data/spec/reek/report/json_report_spec.rb +0 -58
- data/spec/reek/report/location_formatter_spec.rb +0 -32
- data/spec/reek/report/progress_formatter_spec.rb +0 -68
- data/spec/reek/report/text_report_spec.rb +0 -89
- data/spec/reek/report/xml_report_spec.rb +0 -24
- data/spec/reek/report/yaml_report_spec.rb +0 -55
- data/spec/reek/report_spec.rb +0 -28
- data/spec/reek/smell_configuration_spec.rb +0 -56
- data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
- data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
- data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
- data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
- data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
- data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
- data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
- data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
- data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
- data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
- data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
- data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
- data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
- data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
- data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
- data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
- data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
- data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
- data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
- data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
- data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
- data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
- data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
- data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
- data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
- data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
- data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
- data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
- data/spec/reek/smell_warning_spec.rb +0 -137
- data/spec/reek/source/source_code_spec.rb +0 -79
- data/spec/reek/source/source_locator_spec.rb +0 -166
- data/spec/reek/spec/should_reek_of_spec.rb +0 -153
- data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
- data/spec/reek/spec/should_reek_spec.rb +0 -52
- data/spec/reek/spec/smell_matcher_spec.rb +0 -87
- data/spec/reek/tree_dresser_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -110
- data/tasks/configuration.rake +0 -19
- data/tasks/console.rake +0 -5
- data/tasks/reek.rake +0 -6
- data/tasks/rubocop.rake +0 -11
- data/tasks/test.rake +0 -32
data/.travis.yml
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
|
3
|
-
dist: xenial
|
4
|
-
|
5
|
-
cache:
|
6
|
-
bundler: true
|
7
|
-
|
8
|
-
bundler_args: --without debugging
|
9
|
-
|
10
|
-
script: bundle exec rake ci
|
11
|
-
|
12
|
-
rvm:
|
13
|
-
- 2.4
|
14
|
-
- 2.5
|
15
|
-
- 2.6
|
16
|
-
- 2.7
|
17
|
-
- jruby-9.2
|
18
|
-
- jruby-head
|
19
|
-
- ruby-head
|
20
|
-
|
21
|
-
matrix:
|
22
|
-
allow_failures:
|
23
|
-
- rvm: jruby-head
|
24
|
-
- rvm: ruby-head
|
25
|
-
fast_finish: true
|
26
|
-
|
27
|
-
notifications:
|
28
|
-
email:
|
29
|
-
- timo.roessner@googlemail.com
|
30
|
-
- matijs@matijs.net
|
31
|
-
- chastell@chastell.net
|
32
|
-
irc: irc.freenode.org#reek
|
33
|
-
|
34
|
-
branches:
|
35
|
-
only:
|
36
|
-
- master
|
data/docs/API.md
DELETED
@@ -1,174 +0,0 @@
|
|
1
|
-
# Using Reek inside your Ruby application
|
2
|
-
|
3
|
-
## Installation
|
4
|
-
|
5
|
-
Either standalone via
|
6
|
-
|
7
|
-
```bash
|
8
|
-
gem install reek
|
9
|
-
```
|
10
|
-
|
11
|
-
or by adding
|
12
|
-
|
13
|
-
```
|
14
|
-
gem 'reek'
|
15
|
-
```
|
16
|
-
|
17
|
-
to your Gemfile.
|
18
|
-
|
19
|
-
## Quick start
|
20
|
-
|
21
|
-
Code says more than a thousand words:
|
22
|
-
|
23
|
-
```ruby
|
24
|
-
require 'reek'
|
25
|
-
|
26
|
-
source = <<-RUBY
|
27
|
-
class Dirty
|
28
|
-
def m(a,b,c)
|
29
|
-
puts a,b
|
30
|
-
end
|
31
|
-
end
|
32
|
-
RUBY
|
33
|
-
|
34
|
-
reporter = Reek::Report::TextReport.new
|
35
|
-
examiner = Reek::Examiner.new source
|
36
|
-
reporter.add_examiner examiner
|
37
|
-
reporter.show
|
38
|
-
```
|
39
|
-
|
40
|
-
This would output the following on STDOUT:
|
41
|
-
|
42
|
-
```
|
43
|
-
string -- 5 warnings:
|
44
|
-
Dirty has no descriptive comment (IrresponsibleModule)
|
45
|
-
Dirty#m has the name 'm' (UncommunicativeMethodName)
|
46
|
-
Dirty#m has the parameter name 'a' (UncommunicativeParameterName)
|
47
|
-
Dirty#m has the parameter name 'b' (UncommunicativeParameterName)
|
48
|
-
Dirty#m has unused parameter 'c' (UnusedParameters)
|
49
|
-
```
|
50
|
-
|
51
|
-
Note that `Reek::Examiner.new` can take `source` as `String`, `Pathname`, `File` or `IO`.
|
52
|
-
|
53
|
-
## API stability
|
54
|
-
|
55
|
-
Everything that is mentioned in this document can be considered stable in the
|
56
|
-
sense that it will only change across major versions.
|
57
|
-
|
58
|
-
There is one thing in this API documentation you can't and shouldn't rely on:
|
59
|
-
The `SmellWarning` messages itself.
|
60
|
-
|
61
|
-
Something like this
|
62
|
-
|
63
|
-
```
|
64
|
-
Dirty#m has the parameter name 'a' (UncommunicativeParameterName)
|
65
|
-
```
|
66
|
-
|
67
|
-
might change even across minor versions.
|
68
|
-
|
69
|
-
You should not need to be specific about those messages anyways.
|
70
|
-
In case you'd like to be specific about `SmellWarnings` please have a look at
|
71
|
-
[accessing the smell warnings directly](#accessing-the-smell-warnings-directly).
|
72
|
-
|
73
|
-
Additionally you can use one of our structured [outputs formats](#choosing-your-output-format)
|
74
|
-
like JSON or YAML if you need a more fine-grained access to our
|
75
|
-
`SmellWarnings`.
|
76
|
-
|
77
|
-
## Choosing your output format
|
78
|
-
|
79
|
-
Besides normal text output, Reek can generate output in YAML,
|
80
|
-
JSON, HTML and XML by using the following Report types:
|
81
|
-
|
82
|
-
```
|
83
|
-
TextReport
|
84
|
-
YAMLReport
|
85
|
-
JSONReport
|
86
|
-
HTMLReport
|
87
|
-
XMLReport
|
88
|
-
```
|
89
|
-
|
90
|
-
## Configuration
|
91
|
-
|
92
|
-
Given you have the following configuration file called `.reek.yml` in your root directory:
|
93
|
-
|
94
|
-
```Yaml
|
95
|
-
---
|
96
|
-
IrresponsibleModule:
|
97
|
-
enabled: false
|
98
|
-
```
|
99
|
-
|
100
|
-
Reek will load this file automatically by default. If you want to load the
|
101
|
-
configuration explicitely, you can use one of the methods below.
|
102
|
-
|
103
|
-
You can now use either
|
104
|
-
|
105
|
-
```Ruby
|
106
|
-
Reek::Configuration::AppConfiguration.from_path Pathname.new('config.reek')
|
107
|
-
```
|
108
|
-
|
109
|
-
but you can also pass a hash with the contents of the `.reek.yml` YAML file
|
110
|
-
to `Reek::Configuration::AppConfiguration.from_hash`.
|
111
|
-
|
112
|
-
Given the example above you would load that as follows:
|
113
|
-
|
114
|
-
```Ruby
|
115
|
-
require 'reek'
|
116
|
-
|
117
|
-
config_hash = { 'IrresponsibleModule' => { 'enabled' => false } }
|
118
|
-
configuration = Reek::Configuration::AppConfiguration.from_hash config_hash
|
119
|
-
|
120
|
-
source = <<-RUBY
|
121
|
-
class Dirty
|
122
|
-
def call_me(a,b)
|
123
|
-
puts a,b
|
124
|
-
end
|
125
|
-
end
|
126
|
-
RUBY
|
127
|
-
|
128
|
-
reporter = Reek::Report::TextReport.new
|
129
|
-
examiner = Reek::Examiner.new(source, configuration: configuration); nil
|
130
|
-
reporter.add_examiner examiner; nil
|
131
|
-
reporter.show
|
132
|
-
```
|
133
|
-
|
134
|
-
This would now only report `UncommunicativeParameterName` but not
|
135
|
-
`IrresponsibleModule` for the `Dirty` class:
|
136
|
-
|
137
|
-
```
|
138
|
-
string -- 2 warnings:
|
139
|
-
Dirty#call_me has the parameter name 'a' (UncommunicativeParameterName)
|
140
|
-
Dirty#call_me has the parameter name 'b' (UncommunicativeParameterName)
|
141
|
-
```
|
142
|
-
|
143
|
-
Of course, directory specific configuration and excluded paths are supported as
|
144
|
-
well:
|
145
|
-
|
146
|
-
```
|
147
|
-
config_hash = {
|
148
|
-
'IrresponsibleModule' => { 'enabled' => false }
|
149
|
-
'spec/samples/three_clean_files/' =>
|
150
|
-
{ 'UtilityFunction' => { "enabled" => false } }
|
151
|
-
'exclude_paths' =>
|
152
|
-
[ 'spec/samples/two_smelly_files' ]
|
153
|
-
}
|
154
|
-
```
|
155
|
-
|
156
|
-
## Accessing the smell warnings directly
|
157
|
-
|
158
|
-
You can also access the smells detected by an examiner directly:
|
159
|
-
|
160
|
-
```ruby
|
161
|
-
require 'reek'
|
162
|
-
|
163
|
-
source = <<-END
|
164
|
-
class C
|
165
|
-
end
|
166
|
-
END
|
167
|
-
|
168
|
-
examiner = Reek::Examiner.new source
|
169
|
-
examiner.smells.each do |smell|
|
170
|
-
puts smell.message
|
171
|
-
end
|
172
|
-
```
|
173
|
-
|
174
|
-
`Examiner#smells` returns a list of `SmellWarning` objects.
|
data/docs/Attribute.md
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# Attribute
|
2
|
-
|
3
|
-
## Introduction
|
4
|
-
|
5
|
-
A class that publishes a setter for an instance variable invites
|
6
|
-
client classes to become too intimate with its inner workings, and in
|
7
|
-
particular with its representation of state.
|
8
|
-
|
9
|
-
The same holds to a lesser extent for getters, but Reek doesn't flag those.
|
10
|
-
|
11
|
-
## Example
|
12
|
-
|
13
|
-
Given:
|
14
|
-
|
15
|
-
```Ruby
|
16
|
-
class Klass
|
17
|
-
attr_accessor :dummy
|
18
|
-
end
|
19
|
-
```
|
20
|
-
|
21
|
-
Reek would emit the following warning:
|
22
|
-
|
23
|
-
```
|
24
|
-
reek test.rb
|
25
|
-
|
26
|
-
test.rb -- 1 warning:
|
27
|
-
[2]:Attribute: Klass#dummy is a writable attribute
|
28
|
-
```
|
29
|
-
|
30
|
-
## Support in Reek
|
31
|
-
|
32
|
-
This detector raises a warning for every public `attr_writer`,
|
33
|
-
`attr_accessor`, and `attr` with the writable flag set to `true`.
|
34
|
-
|
35
|
-
Reek does not raise warnings for read-only attributes.
|
36
|
-
|
37
|
-
## Configuration
|
38
|
-
|
39
|
-
_Attribute_ supports only the [Basic Smell Options](Basic-Smell-Options.md).
|
data/docs/Basic-Smell-Options.md
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
# Basic Smell Options
|
2
|
-
|
3
|
-
## Introduction
|
4
|
-
|
5
|
-
Every smell detector in Reek offers at least the following configuration options:
|
6
|
-
|
7
|
-
| Option | Value | Effect |
|
8
|
-
| ---------------|-------------|---------|
|
9
|
-
| `enabled` | Boolean | Determines whether the smell detector is active. Defaults to `true` |
|
10
|
-
| `exclude` | an array of strings that will be converted into regular expressions | Ignores any context whose full description matches any element of this array. |
|
11
|
-
|
12
|
-
The file `docs/defaults.reek.yml` (shipped with the Reek gem) lists any default
|
13
|
-
exclusions for each smell.
|
14
|
-
|
15
|
-
## Examples
|
16
|
-
|
17
|
-
**An easy one:**
|
18
|
-
|
19
|
-
To stop Reek reporting smells in any method called `write` you might create a configuration file containing this:
|
20
|
-
|
21
|
-
```yaml
|
22
|
-
DuplicateMethodCall:
|
23
|
-
exclude:
|
24
|
-
- write
|
25
|
-
```
|
26
|
-
|
27
|
-
Internally Reek will convert this to the Regexp /write/.
|
28
|
-
|
29
|
-
**A more sophisticated one:**
|
30
|
-
|
31
|
-
```yaml
|
32
|
-
FeatureEnvy:
|
33
|
-
exclude:
|
34
|
-
- "MyModel#do_things"
|
35
|
-
- "MyHelper"
|
36
|
-
- "ApplicationController#respond"
|
37
|
-
```
|
38
|
-
|
39
|
-
This would not report FeatureEnvy for the instance method `MyModel#do_things`, the whole module `MyHelper` and the `respond` instance method of `ApplicationController`
|
40
|
-
|
41
|
-
## Advanced configuration
|
42
|
-
|
43
|
-
Sometimes just strings are not enough for configuration. E.g. consider this code sample:
|
44
|
-
|
45
|
-
```Ruby
|
46
|
-
class Klass
|
47
|
-
def foo1; end
|
48
|
-
def foo1bar; end
|
49
|
-
end
|
50
|
-
```
|
51
|
-
Both "Klass#foo1" and "Klass#foo1bar" will smell of UncommunicativeMethodName. Now let's assume
|
52
|
-
you are ok with "Klass#foo1" but not "Klass#foo1bar".
|
53
|
-
Just having this configuration
|
54
|
-
|
55
|
-
```yaml
|
56
|
-
UncommunicativeMethodName:
|
57
|
-
exclude:
|
58
|
-
- "Klass#foo1"
|
59
|
-
```
|
60
|
-
|
61
|
-
wouldn't work because now "Klass#foo1bar" wouldn't smell as well.
|
62
|
-
|
63
|
-
For this reason Reek has a special syntax that allows you to use regexes by using a forward slash at the beginning and the end of the string.
|
64
|
-
Everything within the forward slashes will be loaded as a regex.
|
65
|
-
|
66
|
-
A possible configuration that hat excludes "Klass#foo1" from this scan but not "Klass#foo1bar" could look like this:
|
67
|
-
|
68
|
-
```yaml
|
69
|
-
UncommunicativeMethodName:
|
70
|
-
exclude:
|
71
|
-
- "/Klass#foo1$/"
|
72
|
-
```
|
73
|
-
|
74
|
-
## Reek 4
|
75
|
-
|
76
|
-
In Reek 4 you could also pass regexes to `exclude`, meaning this was perfectly valid as well:
|
77
|
-
|
78
|
-
```yaml
|
79
|
-
DuplicateMethodCall:
|
80
|
-
exclude:
|
81
|
-
- !ruby/regexp /write/
|
82
|
-
```
|
83
|
-
|
84
|
-
Support for this has been scrapped with Reek 5 to make the Reek configuration more yaml standard compliant.
|
85
|
-
You can still pass in regexes, you just have to wrap them into a string. Please see "Advanced configuration" above.
|
data/docs/Boolean-Parameter.md
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
# Boolean Parameter
|
2
|
-
|
3
|
-
## Introduction
|
4
|
-
|
5
|
-
_Boolean Parameter_ is a case of [Control Couple](Control-Couple.md), where a
|
6
|
-
method parameter is defaulted to true or false. A _Boolean Parameter_
|
7
|
-
effectively permits a method's caller to decide which execution path to take.
|
8
|
-
This is a case of bad cohesion. You're creating a dependency between methods
|
9
|
-
that is not really necessary, thus increasing coupling.
|
10
|
-
|
11
|
-
## Example
|
12
|
-
|
13
|
-
Given
|
14
|
-
|
15
|
-
```Ruby
|
16
|
-
class Dummy
|
17
|
-
def hit_the_switch(switch = true)
|
18
|
-
if switch
|
19
|
-
puts 'Hitting the switch'
|
20
|
-
# do other things...
|
21
|
-
else
|
22
|
-
puts 'Not hitting the switch'
|
23
|
-
# do other things...
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
```
|
28
|
-
|
29
|
-
Reek would emit the following warning:
|
30
|
-
|
31
|
-
```
|
32
|
-
test.rb -- 3 warnings:
|
33
|
-
[1]:Dummy#hit_the_switch has boolean parameter 'switch' (BooleanParameter)
|
34
|
-
[2]:Dummy#hit_the_switch is controlled by argument switch (ControlParameter)
|
35
|
-
```
|
36
|
-
|
37
|
-
Note that both smells are reported, _Boolean Parameter_ and _Control Parameter_.
|
38
|
-
|
39
|
-
## Getting rid of the smell
|
40
|
-
|
41
|
-
This is highly dependant on your exact architecture, but looking at the example above what you could do is:
|
42
|
-
|
43
|
-
* Move everything in the `if` branch into a separate method
|
44
|
-
* Move everything in the `else` branch into a separate method
|
45
|
-
* Get rid of the `hit_the_switch` method alltogether
|
46
|
-
* Make the decision what method to call in the initial caller of `hit_the_switch`
|
47
|
-
|
48
|
-
## Current support in Reek
|
49
|
-
|
50
|
-
Reek can only detect a _Boolean Parameter_ when it has a default initializer like in the example above.
|
51
|
-
|
52
|
-
## Configuration
|
53
|
-
|
54
|
-
_Boolean Parameter_ supports the [Basic Smell Options](Basic-Smell-Options.md).
|
data/docs/Class-Variable.md
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# Class Variable
|
2
|
-
|
3
|
-
## Introduction
|
4
|
-
|
5
|
-
Class variables form part of the global runtime state, and as such make it easy for one part of the system to accidentally or inadvertently depend on another part of the system. So the system becomes more prone to problems where changing something over here breaks something over there. In particular, class variables can make it hard to set up tests (because the context of the test includes all global state).
|
6
|
-
|
7
|
-
For a detailed explanation, check out [this article](http://4thmouse.com/index.php/2011/03/20/why-class-variables-in-ruby-are-a-bad-idea/).
|
8
|
-
|
9
|
-
## Example
|
10
|
-
|
11
|
-
Given
|
12
|
-
|
13
|
-
```Ruby
|
14
|
-
class Dummy
|
15
|
-
@@class_variable = :whatever
|
16
|
-
end
|
17
|
-
```
|
18
|
-
|
19
|
-
Reek would emit the following warning:
|
20
|
-
|
21
|
-
```
|
22
|
-
reek test.rb
|
23
|
-
|
24
|
-
test.rb -- 1 warning:
|
25
|
-
[2]:Dummy declares the class variable @@class_variable (ClassVariable)
|
26
|
-
```
|
27
|
-
|
28
|
-
## Getting rid of the smell
|
29
|
-
|
30
|
-
You can use class-instance variable to mitigate the problem (as also suggested in the linked article above):
|
31
|
-
|
32
|
-
```Ruby
|
33
|
-
class Dummy
|
34
|
-
@class_variable = :whatever
|
35
|
-
end
|
36
|
-
```
|
37
|
-
|
38
|
-
## Configuration
|
39
|
-
|
40
|
-
_Class Variable_ supports the [Basic Smell Options](Basic-Smell-Options.md).
|
data/docs/Code-Smells.md
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# Code Smells
|
2
|
-
|
3
|
-
Smells are indicators of where your code might be hard to read, maintain or evolve, rather than things that are specifically _wrong_. Naturally this means that Reek is looking towards your code's future (and that can make its reports seem somewhat subjective, of course).
|
4
|
-
|
5
|
-
Reek currently includes checks for the following smells:
|
6
|
-
|
7
|
-
* [Attribute](Attribute.md)
|
8
|
-
* [Class Variable](Class-Variable.md)
|
9
|
-
* [Control Couple](Control-Couple.md), including
|
10
|
-
* [Boolean Parameter](Boolean-Parameter.md)
|
11
|
-
* [Control Parameter](Control-Parameter.md)
|
12
|
-
* [Data Clump](Data-Clump.md)
|
13
|
-
* [Duplicate Method Call](Duplicate-Method-Call.md)
|
14
|
-
* [Instance Variable Assumption](Instance-Variable-Assumption.md)
|
15
|
-
* [Irresponsible Module](Irresponsible-Module.md)
|
16
|
-
* [Large Class](Large-Class.md), including
|
17
|
-
* [Too Many Constants](Too-Many-Constants.md)
|
18
|
-
* [Too Many Instance Variables](Too-Many-Instance-Variables.md)
|
19
|
-
* [Too Many Methods](Too-Many-Methods.md)
|
20
|
-
* [Long Parameter List](Long-Parameter-List.md), and its special case [Long Yield List](Long-Yield-List.md)
|
21
|
-
* Low Cohesion, including
|
22
|
-
* [Feature Envy](Feature-Envy.md)
|
23
|
-
* [Utility Function](Utility-Function.md)
|
24
|
-
* [Module Initialize](Module-Initialize.md)
|
25
|
-
* [Nested Iterators](Nested-Iterators.md)
|
26
|
-
* [Missing Safe Method](Missing-Safe-Method.md), formerly known as Prima Donna Method
|
27
|
-
* [Simulated Polymorphism](Simulated-Polymorphism.md), including
|
28
|
-
* [Manual Dispatch](Manual-Dispatch.md)
|
29
|
-
* [Nil Check](Nil-Check.md)
|
30
|
-
* [Repeated Conditional](Repeated-Conditional.md)
|
31
|
-
* [Subclassed From Core Class](Subclassed-From-Core-Class.md)
|
32
|
-
* [Too Many Statements](Too-Many-Statements.md)
|
33
|
-
* [Uncommunicative Name](Uncommunicative-Name.md), including
|
34
|
-
* [Uncommunicative Method Name](Uncommunicative-Method-Name.md)
|
35
|
-
* [Uncommunicative Module Name](Uncommunicative-Module-Name.md)
|
36
|
-
* [Uncommunicative Parameter Name](Uncommunicative-Parameter-Name.md)
|
37
|
-
* [Uncommunicative Variable Name](Uncommunicative-Variable-Name.md)
|
38
|
-
* [Unused Parameters](Unused-Parameters.md)
|
39
|
-
* [Unused Private Method](Unused-Private-Method.md)
|