reek 5.6.0 → 6.0.3
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/.github/dependabot.yml +9 -0
- data/.github/workflows/ruby.yml +52 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +3 -1
- data/.rubocop_todo.yml +27 -20
- data/.simplecov +1 -0
- data/CHANGELOG.md +24 -0
- data/Dockerfile +1 -0
- data/Gemfile +14 -17
- data/README.md +11 -11
- data/bin/code_climate_reek +12 -2
- data/docs/Attribute.md +1 -1
- data/docs/Boolean-Parameter.md +2 -2
- data/docs/Control-Couple.md +1 -1
- data/docs/Nil-Check.md +4 -1
- data/docs/templates/default/docstring/setup.rb +1 -3
- data/features/command_line_interface/options.feature +2 -3
- data/features/configuration_files/schema_validation.feature +1 -1
- data/features/reports/codeclimate.feature +2 -2
- data/features/reports/json.feature +3 -3
- data/features/reports/reports.feature +4 -4
- data/features/reports/yaml.feature +3 -3
- data/features/step_definitions/reek_steps.rb +5 -1
- data/features/step_definitions/sample_file_steps.rb +2 -2
- data/features/support/env.rb +0 -1
- data/lib/reek/ast/node.rb +1 -1
- data/lib/reek/ast/sexp_extensions/arguments.rb +11 -0
- data/lib/reek/cli/options.rb +3 -3
- data/lib/reek/code_comment.rb +36 -29
- data/lib/reek/configuration/app_configuration.rb +4 -3
- data/lib/reek/configuration/configuration_converter.rb +2 -2
- data/lib/reek/configuration/directory_directives.rb +9 -3
- 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/errors/legacy_comment_separator_error.rb +36 -0
- data/lib/reek/report/code_climate/code_climate_configuration.yml +1 -1
- data/lib/reek/report/code_climate/code_climate_report.rb +2 -1
- data/lib/reek/report/simple_warning_formatter.rb +0 -7
- data/lib/reek/report.rb +5 -7
- data/lib/reek/smell_detectors/base_detector.rb +1 -9
- data/lib/reek/smell_detectors/boolean_parameter.rb +3 -1
- data/lib/reek/smell_detectors/data_clump.rb +23 -56
- data/lib/reek/smell_detectors/nil_check.rb +1 -12
- data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +1 -1
- data/lib/reek/smell_warning.rb +1 -2
- data/lib/reek/source/source_locator.rb +13 -10
- data/lib/reek/spec/smell_matcher.rb +2 -1
- data/lib/reek/version.rb +1 -1
- data/lib/reek.rb +1 -0
- data/reek.gemspec +13 -6
- data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +2 -4
- data/spec/quality/documentation_spec.rb +2 -1
- data/spec/reek/ast/sexp_extensions_spec.rb +15 -33
- data/spec/reek/code_comment_spec.rb +41 -42
- data/spec/reek/configuration/directory_directives_spec.rb +6 -0
- data/spec/reek/configuration/excluded_paths_spec.rb +12 -3
- data/spec/reek/context_builder_spec.rb +110 -113
- data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +1 -3
- data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +26 -26
- data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +6 -6
- data/spec/reek/report/location_formatter_spec.rb +3 -3
- data/spec/reek/smell_detectors/base_detector_spec.rb +3 -13
- data/spec/reek/smell_detectors/data_clump_spec.rb +14 -0
- data/spec/reek/smell_detectors/missing_safe_method_spec.rb +8 -2
- data/spec/reek/smell_detectors/nil_check_spec.rb +3 -3
- data/spec/reek/smell_detectors/utility_function_spec.rb +16 -0
- data/spec/reek/smell_warning_spec.rb +12 -12
- data/spec/reek/source/source_code_spec.rb +13 -0
- data/spec/reek/spec/should_reek_of_spec.rb +0 -1
- data/spec/reek/spec/should_reek_only_of_spec.rb +6 -6
- data/spec/reek/spec/smell_matcher_spec.rb +1 -1
- data/spec/spec_helper.rb +19 -5
- data/tasks/configuration.rake +1 -2
- metadata +24 -42
- data/.travis.yml +0 -35
- data/spec/factories/factories.rb +0 -37
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 967e95555fe823e1924a78ff2a8c94c40bdb4d16d031bacd51b885d1475bce30
|
|
4
|
+
data.tar.gz: c9760389b64b3bb9f96f1896192a540a4de8b7f395808299b9a67e47238e8c42
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ea4c588166903c10bed44c2a459e43e4db479943f8f489ca1eaefbb6db375605e06ff678f5411def292e19ef8c2754245bca78eb24373532474091b0ab8eadbe
|
|
7
|
+
data.tar.gz: 9e0804841d54d4278149422d66c7e379597e3f99275ba8b9ab4aef6e7041bde6c928db5f3c62a3b5c3d1d6fc4da0216ba5d13aa5562f9e0b565ec31bb115d0fe
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and
|
|
2
|
+
# run tests with Rake
|
|
3
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
|
4
|
+
|
|
5
|
+
name: Ruby
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [ master ]
|
|
10
|
+
pull_request:
|
|
11
|
+
branches: [ master ]
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
test:
|
|
15
|
+
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
|
|
18
|
+
strategy:
|
|
19
|
+
matrix:
|
|
20
|
+
ruby: [2.4, 2.5, 2.6, 2.7, jruby-9.2]
|
|
21
|
+
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v2
|
|
24
|
+
- name: Set up Ruby
|
|
25
|
+
uses: ruby/setup-ruby@v1
|
|
26
|
+
with:
|
|
27
|
+
ruby-version: ${{ matrix.ruby }}
|
|
28
|
+
bundler-cache: true
|
|
29
|
+
- name: Run specs
|
|
30
|
+
run: bundle exec rake test:spec
|
|
31
|
+
- name: Run performance tests
|
|
32
|
+
run: bundle exec rake test:performance
|
|
33
|
+
- name: Update default configuration
|
|
34
|
+
run: bundle exec rake configuration:update_default_configuration
|
|
35
|
+
- name: Run cucumber features
|
|
36
|
+
run: bundle exec rake test:features
|
|
37
|
+
- name: Run code quality specs
|
|
38
|
+
run: bundle exec rake test:quality
|
|
39
|
+
|
|
40
|
+
rubocop:
|
|
41
|
+
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
|
|
44
|
+
steps:
|
|
45
|
+
- uses: actions/checkout@v2
|
|
46
|
+
- name: Set up Ruby
|
|
47
|
+
uses: ruby/setup-ruby@v1
|
|
48
|
+
with:
|
|
49
|
+
ruby-version: 2.7
|
|
50
|
+
bundler-cache: true
|
|
51
|
+
- name: Run RuboCop
|
|
52
|
+
run: bundle exec rubocop -P
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -9,7 +9,8 @@ AllCops:
|
|
|
9
9
|
- 'samples/**/*'
|
|
10
10
|
- 'tmp/**/*'
|
|
11
11
|
- 'vendor/**/*'
|
|
12
|
-
|
|
12
|
+
NewCops: enable
|
|
13
|
+
TargetRubyVersion: 2.4
|
|
13
14
|
|
|
14
15
|
# Tables are nice
|
|
15
16
|
Layout/HashAlignment:
|
|
@@ -57,6 +58,7 @@ Lint/BooleanSymbol:
|
|
|
57
58
|
# Spec blocks can be any size
|
|
58
59
|
Metrics/BlockLength:
|
|
59
60
|
Exclude:
|
|
61
|
+
- '**/*.gemspec'
|
|
60
62
|
- 'spec/**/*'
|
|
61
63
|
|
|
62
64
|
# Keyword arguments make long parameter lists readable
|
data/.rubocop_todo.yml
CHANGED
|
@@ -1,22 +1,36 @@
|
|
|
1
1
|
# This configuration was generated by
|
|
2
2
|
# `rubocop --auto-gen-config`
|
|
3
|
-
# on
|
|
3
|
+
# on 2021-01-03 18:17:11 UTC using RuboCop version 1.7.0.
|
|
4
4
|
# The point is for the user to remove these configuration records
|
|
5
5
|
# one by one as the offenses are removed from the code base.
|
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
|
8
8
|
|
|
9
|
-
# Offense count:
|
|
9
|
+
# Offense count: 2
|
|
10
|
+
Lint/MissingSuper:
|
|
11
|
+
Exclude:
|
|
12
|
+
- 'lib/reek/rake/task.rb'
|
|
13
|
+
- 'lib/reek/smell_detectors/base_detector.rb'
|
|
14
|
+
|
|
15
|
+
# Offense count: 2
|
|
16
|
+
# Configuration parameters: IgnoredPatterns.
|
|
17
|
+
# IgnoredPatterns: (?-mix:(exactly|at_least|at_most)\(\d+\)\.times)
|
|
18
|
+
Lint/UnreachableLoop:
|
|
19
|
+
Exclude:
|
|
20
|
+
- 'spec/reek/ast/node_spec.rb'
|
|
21
|
+
|
|
22
|
+
# Offense count: 2
|
|
23
|
+
# Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
|
|
10
24
|
Metrics/AbcSize:
|
|
11
25
|
Max: 21
|
|
12
26
|
|
|
13
27
|
# Offense count: 1
|
|
14
|
-
# Configuration parameters: CountComments.
|
|
28
|
+
# Configuration parameters: CountComments, CountAsOne.
|
|
15
29
|
Metrics/ClassLength:
|
|
16
|
-
Max:
|
|
30
|
+
Max: 170
|
|
17
31
|
|
|
18
|
-
# Offense count:
|
|
19
|
-
# Configuration parameters: CountComments, ExcludedMethods.
|
|
32
|
+
# Offense count: 13
|
|
33
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
|
20
34
|
Metrics/MethodLength:
|
|
21
35
|
Max: 16
|
|
22
36
|
|
|
@@ -25,17 +39,6 @@ RSpec/AnyInstance:
|
|
|
25
39
|
Exclude:
|
|
26
40
|
- 'spec/reek/cli/application_spec.rb'
|
|
27
41
|
|
|
28
|
-
# Offense count: 1
|
|
29
|
-
# Configuration parameters: CustomIncludeMethods.
|
|
30
|
-
RSpec/EmptyExampleGroup:
|
|
31
|
-
Exclude:
|
|
32
|
-
- 'spec/factories/factories.rb'
|
|
33
|
-
|
|
34
|
-
# Offense count: 1
|
|
35
|
-
RSpec/MissingExampleGroupArgument:
|
|
36
|
-
Exclude:
|
|
37
|
-
- 'spec/factories/factories.rb'
|
|
38
|
-
|
|
39
42
|
# Offense count: 4
|
|
40
43
|
RSpec/MultipleDescribes:
|
|
41
44
|
Exclude:
|
|
@@ -44,12 +47,16 @@ RSpec/MultipleDescribes:
|
|
|
44
47
|
- 'spec/reek/report/location_formatter_spec.rb'
|
|
45
48
|
- 'spec/reek/report/progress_formatter_spec.rb'
|
|
46
49
|
|
|
47
|
-
# Offense count:
|
|
48
|
-
# Configuration parameters: AggregateFailuresByDefault.
|
|
50
|
+
# Offense count: 30
|
|
49
51
|
RSpec/MultipleExpectations:
|
|
50
52
|
Max: 5
|
|
51
53
|
|
|
52
|
-
# Offense count:
|
|
54
|
+
# Offense count: 16
|
|
55
|
+
# Configuration parameters: AllowSubject.
|
|
56
|
+
RSpec/MultipleMemoizedHelpers:
|
|
57
|
+
Max: 9
|
|
58
|
+
|
|
59
|
+
# Offense count: 27
|
|
53
60
|
RSpec/NestedGroups:
|
|
54
61
|
Max: 5
|
|
55
62
|
|
data/.simplecov
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Change log
|
|
2
2
|
|
|
3
|
+
## 6.0.3 (2021-01-11)
|
|
4
|
+
|
|
5
|
+
* (mvz) Require parser 3.0
|
|
6
|
+
* (mvz) In a refinement, assign smells to the refined module or class
|
|
7
|
+
|
|
8
|
+
## 6.0.3 (2020-10-17)
|
|
9
|
+
|
|
10
|
+
* (mvz) Loosen dependency on psych. This should resolve installation problems on
|
|
11
|
+
mingw32
|
|
12
|
+
* (Cesario Uy) Fix typo in docs for "Boolean Parameter" smell
|
|
13
|
+
* (mvz) Set link metadata in gemspec
|
|
14
|
+
|
|
15
|
+
## 6.0.1 (2020-05-26)
|
|
16
|
+
|
|
17
|
+
* (Maxim Pertsov) Handle absolute paths for directories correctly
|
|
18
|
+
|
|
19
|
+
## 6.0.0 (2020-03-30)
|
|
20
|
+
|
|
21
|
+
* (mvz) Make codeclimate-engine-rb a development dependency
|
|
22
|
+
* (mvz) Drop support for Ruby 2.3
|
|
23
|
+
* (mvz) Raise error when legacy code comment format is used
|
|
24
|
+
* (mvz) Stop reporting NilCheck for safe navigation
|
|
25
|
+
* (likeath) Properly handle "Forward all" syntax
|
|
26
|
+
|
|
3
27
|
## 5.6.0 (2020-01-20)
|
|
4
28
|
|
|
5
29
|
* (mvz) Support Ruby 2.7
|
data/Dockerfile
CHANGED
data/Gemfile
CHANGED
|
@@ -5,19 +5,19 @@ gemspec
|
|
|
5
5
|
ruby RUBY_VERSION
|
|
6
6
|
|
|
7
7
|
group :development do
|
|
8
|
-
gem 'aruba',
|
|
9
|
-
gem '
|
|
10
|
-
gem '
|
|
11
|
-
gem 'kramdown',
|
|
12
|
-
gem 'kramdown-parser-gfm',
|
|
13
|
-
gem 'rake',
|
|
14
|
-
gem 'rspec',
|
|
15
|
-
gem 'rspec-benchmark',
|
|
16
|
-
gem 'rubocop',
|
|
17
|
-
gem 'rubocop-performance',
|
|
18
|
-
gem 'rubocop-rspec',
|
|
19
|
-
gem 'simplecov',
|
|
20
|
-
gem 'yard',
|
|
8
|
+
gem 'aruba', '~> 1.0'
|
|
9
|
+
gem 'codeclimate-engine-rb', '~> 0.4.0'
|
|
10
|
+
gem 'cucumber', ['>= 4.0', '< 6.0']
|
|
11
|
+
gem 'kramdown', '~> 2.1'
|
|
12
|
+
gem 'kramdown-parser-gfm', '~> 1.0'
|
|
13
|
+
gem 'rake', '~> 13.0'
|
|
14
|
+
gem 'rspec', '~> 3.0'
|
|
15
|
+
gem 'rspec-benchmark', '~> 0.6.0'
|
|
16
|
+
gem 'rubocop', '~> 1.7.0'
|
|
17
|
+
gem 'rubocop-performance', '~> 1.9.1'
|
|
18
|
+
gem 'rubocop-rspec', '~> 2.1.0'
|
|
19
|
+
gem 'simplecov', ['>= 0.18.0', '< 0.21.0']
|
|
20
|
+
gem 'yard', '~> 0.9.5'
|
|
21
21
|
|
|
22
22
|
platforms :mri do
|
|
23
23
|
gem 'redcarpet', '~> 3.4'
|
|
@@ -25,8 +25,5 @@ group :development do
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
group :debugging do
|
|
28
|
-
gem 'pry'
|
|
29
|
-
platforms :mri do
|
|
30
|
-
gem 'pry-byebug'
|
|
31
|
-
end
|
|
28
|
+
gem 'pry', '~> 0.13.0'
|
|
32
29
|
end
|
data/README.md
CHANGED
|
@@ -45,12 +45,6 @@
|
|
|
45
45
|
* 
|
|
46
46
|
* 
|
|
47
47
|
|
|
48
|
-
## Reek 5 is out!
|
|
49
|
-
|
|
50
|
-
Reek 5 is out and with it a bunch of breaking changes. If you're a new user you can just
|
|
51
|
-
continue with the quickstart below. If you're a Reek 4 user and would like to upgrade to 5, don't
|
|
52
|
-
worry, this shouldn't take you more than 10 minutes. Check out our [Upgrade Guide](docs/Reek-4-to-Reek-5-migration.md).
|
|
53
|
-
|
|
54
48
|
## Quickstart
|
|
55
49
|
|
|
56
50
|
Reek is a tool that examines Ruby classes, modules and methods and reports any
|
|
@@ -100,7 +94,7 @@ demo.rb -- 2 warnings:
|
|
|
100
94
|
|
|
101
95
|
## Supported Ruby versions
|
|
102
96
|
|
|
103
|
-
Reek is officially supported for CRuby 2.
|
|
97
|
+
Reek is officially supported for CRuby 2.4 to 2.7 and for JRuby 9.2.
|
|
104
98
|
Other Ruby implementations (like Rubinius) are not officially supported but
|
|
105
99
|
should work as well.
|
|
106
100
|
|
|
@@ -292,7 +286,7 @@ detectors:
|
|
|
292
286
|
# You can disable smells completely
|
|
293
287
|
IrresponsibleModule:
|
|
294
288
|
enabled: false
|
|
295
|
-
|
|
289
|
+
|
|
296
290
|
# You can use filters to silence Reek warnings.
|
|
297
291
|
# Either because you simply disagree with Reek (we are not the police) or
|
|
298
292
|
# because you want to fix this at a later point in time.
|
|
@@ -300,7 +294,7 @@ detectors:
|
|
|
300
294
|
exclude:
|
|
301
295
|
- "MyWorker#self.class_method" # should be refactored
|
|
302
296
|
- "AnotherWorker#instance_method" # should be refactored as well
|
|
303
|
-
|
|
297
|
+
|
|
304
298
|
# A lot of smells allow fine tuning their configuration. You can look up all available options
|
|
305
299
|
# in the corresponding smell documentation in /docs. In most cases you probably can just go
|
|
306
300
|
# with the defaults as documented in defaults.reek.yml.
|
|
@@ -355,9 +349,14 @@ This configuration for instance:
|
|
|
355
349
|
detectors:
|
|
356
350
|
IrresponsibleModule:
|
|
357
351
|
enabled: false
|
|
358
|
-
|
|
352
|
+
|
|
359
353
|
TooManyStatements:
|
|
360
354
|
max_statements: 5
|
|
355
|
+
|
|
356
|
+
directories:
|
|
357
|
+
"app/controllers":
|
|
358
|
+
TooManyStatements:
|
|
359
|
+
max_statements: 10
|
|
361
360
|
```
|
|
362
361
|
|
|
363
362
|
translates to:
|
|
@@ -374,7 +373,7 @@ are documented in the corresponding smell type /docs page (if you want to get a
|
|
|
374
373
|
configurations you can also check out [the `defaults.reek.yml` file in this repository](docs/defaults.reek.yml).
|
|
375
374
|
|
|
376
375
|
Note that you do not need a configuration file at all.
|
|
377
|
-
If you're fine with all the [defaults
|
|
376
|
+
If you're fine with all the [defaults](docs/defaults.reek.yml) we set you can skip this completely.
|
|
378
377
|
|
|
379
378
|
Don't worry about introducing a mistake in your configuration file that might go unnoticed - Reek uses a
|
|
380
379
|
schema to validate your configuration against on start up and will faily loudly in case you
|
|
@@ -613,6 +612,7 @@ Be careful though, Reek does not merge your configuration entries, so if you alr
|
|
|
613
612
|
Reek
|
|
614
613
|
* [ruby-critic](https://github.com/whitesmith/rubycritic) - gem that wraps around static analysis gems such as Reek, [flay](https://github.com/seattlerb/flay) and [flog](https://github.com/seattlerb/flog)
|
|
615
614
|
* [pronto-reek](https://github.com/mmozuras/pronto-reek) - Reek integration for [pronto](https://github.com/mmozuras/pronto)
|
|
615
|
+
* [action-reek](https://github.com/reviewdog/action-reek) - GitHub Action to run reek with [reviewdog](https://github.com/reviewdog/reviewdog) 🐶
|
|
616
616
|
|
|
617
617
|
### Misc
|
|
618
618
|
|
data/bin/code_climate_reek
CHANGED
|
@@ -6,15 +6,16 @@
|
|
|
6
6
|
|
|
7
7
|
require_relative '../lib/reek'
|
|
8
8
|
require_relative '../lib/reek/cli/application'
|
|
9
|
+
require_relative '../lib/reek/report/code_climate'
|
|
9
10
|
|
|
10
11
|
# Map input coming from CodeClimate to Reek.
|
|
11
12
|
class CodeClimateToReek
|
|
12
13
|
# Following the spec (https://github.com/codeclimate/spec/blob/master/SPEC.md)
|
|
13
14
|
# we have to exit with a zero for both failure and success.
|
|
14
15
|
ENGINE_CONFIGURATION = [
|
|
15
|
-
'-f', 'code_climate',
|
|
16
16
|
'--failure-exit-code', '0',
|
|
17
|
-
'--success-exit-code', '0'
|
|
17
|
+
'--success-exit-code', '0',
|
|
18
|
+
'.'
|
|
18
19
|
].freeze
|
|
19
20
|
|
|
20
21
|
attr_reader :configuration_file_path, :include_paths_key, :include_paths_default
|
|
@@ -54,6 +55,15 @@ class CodeClimateToReek
|
|
|
54
55
|
end
|
|
55
56
|
end
|
|
56
57
|
|
|
58
|
+
# Override for ReportCommand to force the use of CodeClimateReport.
|
|
59
|
+
module ReportClassOverride
|
|
60
|
+
def report_class
|
|
61
|
+
Reek::Report::CodeClimateReport
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
Reek::CLI::Command::ReportCommand.prepend ReportClassOverride
|
|
66
|
+
|
|
57
67
|
application = Reek::CLI::Application.new(CodeClimateToReek.new.cli_arguments)
|
|
58
68
|
|
|
59
69
|
exit application.execute
|
data/docs/Attribute.md
CHANGED
|
@@ -29,7 +29,7 @@ test.rb -- 1 warning:
|
|
|
29
29
|
|
|
30
30
|
## Support in Reek
|
|
31
31
|
|
|
32
|
-
This detector
|
|
32
|
+
This detector raises a warning for every public `attr_writer`,
|
|
33
33
|
`attr_accessor`, and `attr` with the writable flag set to `true`.
|
|
34
34
|
|
|
35
35
|
Reek does not raise warnings for read-only attributes.
|
data/docs/Boolean-Parameter.md
CHANGED
|
@@ -38,11 +38,11 @@ Note that both smells are reported, _Boolean Parameter_ and _Control Parameter_.
|
|
|
38
38
|
|
|
39
39
|
## Getting rid of the smell
|
|
40
40
|
|
|
41
|
-
This is highly
|
|
41
|
+
This is highly dependent on your exact architecture, but looking at the example above what you could do is:
|
|
42
42
|
|
|
43
43
|
* Move everything in the `if` branch into a separate method
|
|
44
44
|
* Move everything in the `else` branch into a separate method
|
|
45
|
-
* Get rid of the `hit_the_switch` method
|
|
45
|
+
* Get rid of the `hit_the_switch` method altogether
|
|
46
46
|
* Make the decision what method to call in the initial caller of `hit_the_switch`
|
|
47
47
|
|
|
48
48
|
## Current support in Reek
|
data/docs/Control-Couple.md
CHANGED
|
@@ -14,7 +14,7 @@ controlling parameter must be reflected on both sides of the call. A _Control
|
|
|
14
14
|
Couple_ also reveals a loss of simplicity: the called method probably has more
|
|
15
15
|
than one responsibility, because it includes at least two different code paths.
|
|
16
16
|
|
|
17
|
-
You can find a good write-up regarding this problem [here](
|
|
17
|
+
You can find a good write-up regarding this problem [here](https://solnic.codes/2012/04/11/get-rid-of-that-code-smell-control-couple/).
|
|
18
18
|
|
|
19
19
|
## Current Support in Reek
|
|
20
20
|
|
data/docs/Nil-Check.md
CHANGED
|
@@ -37,7 +37,10 @@ _Nil Check_ reports use of
|
|
|
37
37
|
* <code>.nil?</code> method
|
|
38
38
|
* <code>==</code> and <code>===</code> operators when checking vs. <code>nil</code>
|
|
39
39
|
* case statements that use syntax like <code>when nil</code>
|
|
40
|
-
|
|
40
|
+
|
|
41
|
+
_Nil Check_ allows use of
|
|
42
|
+
|
|
43
|
+
* the safe navigation operator like `foo&.bar`
|
|
41
44
|
|
|
42
45
|
## Configuration
|
|
43
46
|
|
|
@@ -43,7 +43,7 @@ Feature: Reek can be controlled using command-line options
|
|
|
43
43
|
-c, --config FILE Read configuration options from FILE
|
|
44
44
|
--smell SMELL Only look for a specific smell.
|
|
45
45
|
Call it like this: reek --smell MissingSafeMethod source.rb
|
|
46
|
-
Check out https://github.com/troessner/reek/blob/
|
|
46
|
+
Check out https://github.com/troessner/reek/blob/v6.0.3/docs/Code-Smells.md for a list of smells
|
|
47
47
|
--stdin-filename FILE When passing code in via pipe, assume this filename when checking file or directory rules in the config.
|
|
48
48
|
|
|
49
49
|
Generate a todo list:
|
|
@@ -56,7 +56,6 @@ Feature: Reek can be controlled using command-line options
|
|
|
56
56
|
yaml
|
|
57
57
|
json
|
|
58
58
|
xml
|
|
59
|
-
code_climate
|
|
60
59
|
|
|
61
60
|
Text format options:
|
|
62
61
|
--[no-]color Use colors for the output (default: true)
|
|
@@ -120,5 +119,5 @@ Feature: Reek can be controlled using command-line options
|
|
|
120
119
|
UnusedPrivateMethod
|
|
121
120
|
UtilityFunction
|
|
122
121
|
|
|
123
|
-
Check out https://github.com/troessner/reek/blob/
|
|
122
|
+
Check out https://github.com/troessner/reek/blob/v6.0.3/docs/Code-Smells.md for a details on each detector
|
|
124
123
|
"""
|
|
@@ -6,7 +6,7 @@ Feature: Validate schema
|
|
|
6
6
|
Scenario: Our generated default configuration
|
|
7
7
|
Given our default configuration file
|
|
8
8
|
And the clean file "clean.rb"
|
|
9
|
-
When I run reek -c defaults.reek clean.rb
|
|
9
|
+
When I run reek -c defaults.reek.yml clean.rb
|
|
10
10
|
Then it succeeds
|
|
11
11
|
And it reports nothing
|
|
12
12
|
|
|
@@ -4,7 +4,7 @@ Feature: Report smells using Code Climate format
|
|
|
4
4
|
|
|
5
5
|
Scenario: output is empty when there are no smells
|
|
6
6
|
Given a directory called 'clean' containing two clean files
|
|
7
|
-
When I run
|
|
7
|
+
When I run the code climate reek runner
|
|
8
8
|
Then it succeeds
|
|
9
9
|
And it reports this Code Climate output:
|
|
10
10
|
"""
|
|
@@ -12,7 +12,7 @@ Feature: Report smells using Code Climate format
|
|
|
12
12
|
|
|
13
13
|
Scenario: Indicate smells and print them as JSON when using files
|
|
14
14
|
Given the smelly file 'smelly.rb'
|
|
15
|
-
When I run
|
|
15
|
+
When I run the code climate reek runner
|
|
16
16
|
Then it reports this Code Climate output:
|
|
17
17
|
"""
|
|
18
18
|
{
|
|
@@ -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/
|
|
27
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v6.0.3/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/
|
|
36
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v6.0.3/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/
|
|
56
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v6.0.3/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/
|
|
186
|
-
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/
|
|
185
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/v6.0.3/docs/Uncommunicative-Method-Name.md]
|
|
186
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v6.0.3/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/
|
|
213
|
-
UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/
|
|
212
|
+
UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/v6.0.3/docs/Uncommunicative-Method-Name.md]
|
|
213
|
+
UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v6.0.3/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/
|
|
28
|
+
documentation_link: https://github.com/troessner/reek/blob/v6.0.3/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/
|
|
36
|
+
documentation_link: https://github.com/troessner/reek/blob/v6.0.3/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/
|
|
51
|
+
documentation_link: https://github.com/troessner/reek/blob/v6.0.3/docs/Irresponsible-Module.md
|
|
52
52
|
"""
|
|
@@ -2,7 +2,11 @@ When /^I run reek (.*)$/ do |args|
|
|
|
2
2
|
reek(args)
|
|
3
3
|
end
|
|
4
4
|
|
|
5
|
-
When
|
|
5
|
+
When 'I run the code climate reek runner' do
|
|
6
|
+
run_command_and_stop 'code_climate_reek'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
When /^I pass "([^"]*)" to reek *(.*)$/ do |stdin, args|
|
|
6
10
|
reek_with_pipe(stdin, args)
|
|
7
11
|
end
|
|
8
12
|
|
|
@@ -44,8 +44,8 @@ Given(/^a configuration file '(.+)'$/) do |filename|
|
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
Given(/^our default configuration file$/) do
|
|
47
|
-
default_configuration = File.read
|
|
48
|
-
write_file('defaults.reek', default_configuration)
|
|
47
|
+
default_configuration = File.read Reek::DEFAULT_SMELL_CONFIGURATION
|
|
48
|
+
write_file('defaults.reek.yml', default_configuration)
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
When(/^I run "reek (.*?)" in a subdirectory$/) do |args|
|
data/features/support/env.rb
CHANGED
data/lib/reek/ast/node.rb
CHANGED
|
@@ -60,7 +60,7 @@ module Reek
|
|
|
60
60
|
#
|
|
61
61
|
# Returns an array with all matching nodes.
|
|
62
62
|
def each_node(target_types, ignoring = [], &blk)
|
|
63
|
-
return enum_for(:each_node, target_types, ignoring) unless
|
|
63
|
+
return enum_for(:each_node, target_types, ignoring) unless blk
|
|
64
64
|
|
|
65
65
|
look_for(Array(target_types), ignoring, &blk)
|
|
66
66
|
end
|
|
@@ -93,6 +93,17 @@ module Reek
|
|
|
93
93
|
module ShadowargNode
|
|
94
94
|
include ArgNodeBase
|
|
95
95
|
end
|
|
96
|
+
|
|
97
|
+
# Utility methods for :forward_args nodes.
|
|
98
|
+
# rubocop:disable Naming/ClassAndModuleCamelCase
|
|
99
|
+
module Forward_ArgsNode
|
|
100
|
+
include ArgNodeBase
|
|
101
|
+
|
|
102
|
+
def anonymous_splat?
|
|
103
|
+
true
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
# rubocop:enable Naming/ClassAndModuleCamelCase
|
|
96
107
|
end
|
|
97
108
|
end
|
|
98
109
|
end
|