reek 6.1.1 → 6.1.4
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 +4 -0
- data/.github/workflows/ruby.yml +6 -6
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +12 -0
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +6 -6
- data/README.md +1 -1
- data/lib/reek/ast/sexp_extensions/arguments.rb +9 -0
- data/lib/reek/cli/command/todo_list_command.rb +1 -1
- data/lib/reek/cli/options.rb +5 -5
- data/lib/reek/configuration/configuration_file_finder.rb +2 -1
- data/lib/reek/rake/task.rb +5 -5
- data/lib/reek/report/code_climate/code_climate_configuration.yml +3 -3
- data/lib/reek/smell_detectors/class_variable.rb +2 -2
- data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
- data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
- data/lib/reek/spec/should_reek_of.rb +7 -7
- data/lib/reek/spec.rb +1 -1
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75ed5064f626b7d8ae34f869ee17d53960804381fb73db707c866202bb71490a
|
4
|
+
data.tar.gz: 07f819f93d3ac3f84deb0a0a113dfbc3136e70f9b097f72e1c535f4352fb8b7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71313200963b12c5c2edb8cd84d5ee4ea8fd99241c1fa0f6c6329e332ba41538b5a11990b54f24a136a748bc2492fd87f5ffcd78ef358bdd4f1420970bd2915b
|
7
|
+
data.tar.gz: 2f39a6f2ea9cf9a4d8eb629bc5542883ecccfb8811c1fc062a2c0aa8deb41ceacd47de2a76a2f9cb8f6b0e6b56da63551f403edc14e55cd35ae7bac62822a2b3
|
data/.github/dependabot.yml
CHANGED
data/.github/workflows/ruby.yml
CHANGED
@@ -4,11 +4,11 @@
|
|
4
4
|
|
5
5
|
name: CI
|
6
6
|
|
7
|
-
on:
|
7
|
+
"on":
|
8
8
|
push:
|
9
|
-
branches: [
|
9
|
+
branches: [master]
|
10
10
|
pull_request:
|
11
|
-
branches: [
|
11
|
+
branches: [master]
|
12
12
|
schedule:
|
13
13
|
- cron: '16 4 12 * *'
|
14
14
|
|
@@ -22,10 +22,10 @@ jobs:
|
|
22
22
|
|
23
23
|
strategy:
|
24
24
|
matrix:
|
25
|
-
ruby: [2.6, 2.7, "3.0", "3.1", jruby-9.3]
|
25
|
+
ruby: ["2.6", "2.7", "3.0", "3.1", "3.2", "jruby-9.3", "jruby-9.4"]
|
26
26
|
|
27
27
|
steps:
|
28
|
-
- uses: actions/checkout@
|
28
|
+
- uses: actions/checkout@v3
|
29
29
|
- name: Set up Ruby
|
30
30
|
uses: ruby/setup-ruby@v1
|
31
31
|
with:
|
@@ -47,7 +47,7 @@ jobs:
|
|
47
47
|
runs-on: ubuntu-latest
|
48
48
|
|
49
49
|
steps:
|
50
|
-
- uses: actions/checkout@
|
50
|
+
- uses: actions/checkout@v3
|
51
51
|
- name: Set up Ruby
|
52
52
|
uses: ruby/setup-ruby@v1
|
53
53
|
with:
|
data/.rubocop.yml
CHANGED
@@ -48,7 +48,7 @@ Layout/MultilineOperationIndentation:
|
|
48
48
|
Lint/AmbiguousBlockAssociation:
|
49
49
|
Enabled: false
|
50
50
|
|
51
|
-
# Some of our source examples include interpolation
|
51
|
+
# Some of our source examples include interpolation explicitly.
|
52
52
|
Lint/InterpolationCheck:
|
53
53
|
Exclude:
|
54
54
|
- 'spec/**/*'
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## 6.1.4 (2023-01-13)
|
4
|
+
|
5
|
+
* (mvz) Update parser dependency to the 3.2.x series
|
6
|
+
|
7
|
+
## 6.1.3 (2022-12-29)
|
8
|
+
|
9
|
+
* (gonubana) Allow failing safely when trying to recursively find a configuration
|
10
|
+
|
11
|
+
## 6.1.2 (2022-11-21)
|
12
|
+
|
13
|
+
* (mvz) Add support for keyword nil arguments
|
14
|
+
|
3
15
|
## 6.1.1 (2022-04-20)
|
4
16
|
|
5
17
|
* (ydah) UnusedPrivateMethod to be detect use of methods via `Method#to_proc`
|
data/CONTRIBUTING.md
CHANGED
@@ -142,7 +142,7 @@ Once you’re happy with your feature / fix – or want to
|
|
142
142
|
share it as a work-in-progress and request comments – once
|
143
143
|
again make sure all of the tests pass. This will also run
|
144
144
|
[RuboCop](https://github.com/bbatsov/rubocop) – fix any
|
145
|
-
|
145
|
+
offenses RuboCop finds (or discuss them in the pull request):
|
146
146
|
|
147
147
|
```
|
148
148
|
bundle exec rake
|
data/Gemfile
CHANGED
@@ -5,18 +5,18 @@ gemspec
|
|
5
5
|
ruby RUBY_VERSION
|
6
6
|
|
7
7
|
group :development do
|
8
|
-
gem 'aruba', '~> 2.
|
8
|
+
gem 'aruba', '~> 2.1'
|
9
9
|
gem 'codeclimate-engine-rb', '~> 0.4.0'
|
10
|
-
gem 'cucumber', '
|
10
|
+
gem 'cucumber', '~> 8.0'
|
11
11
|
gem 'kramdown', '~> 2.1'
|
12
12
|
gem 'kramdown-parser-gfm', '~> 1.0'
|
13
13
|
gem 'rake', '~> 13.0'
|
14
14
|
gem 'rspec', '~> 3.0'
|
15
15
|
gem 'rspec-benchmark', '~> 0.6.0'
|
16
|
-
gem 'rubocop', '~> 1.
|
17
|
-
gem 'rubocop-performance', '~> 1.
|
18
|
-
gem 'rubocop-rspec', '~> 2.
|
19
|
-
gem 'simplecov',
|
16
|
+
gem 'rubocop', '~> 1.43.0'
|
17
|
+
gem 'rubocop-performance', '~> 1.15.0'
|
18
|
+
gem 'rubocop-rspec', '~> 2.17.0'
|
19
|
+
gem 'simplecov', '>= 0.18.0', '< 0.23.0'
|
20
20
|
gem 'yard', '~> 0.9.5'
|
21
21
|
|
22
22
|
platforms :mri do
|
data/README.md
CHANGED
@@ -411,7 +411,7 @@ def smelly_method foo
|
|
411
411
|
end
|
412
412
|
```
|
413
413
|
|
414
|
-
This is an incredibly powerful feature and further explained under [Smell
|
414
|
+
This is an incredibly powerful feature and further explained under [Smell Suppression](docs/Smell-Suppression.md).
|
415
415
|
|
416
416
|
#### Debugging trouble with the configuration
|
417
417
|
|
@@ -115,6 +115,15 @@ module Reek
|
|
115
115
|
end
|
116
116
|
end
|
117
117
|
# rubocop:enable Naming/ClassAndModuleCamelCase
|
118
|
+
|
119
|
+
# Utility methods for :kwnilarg nodes.
|
120
|
+
module KwnilargNode
|
121
|
+
include ArgNodeBase
|
122
|
+
|
123
|
+
def anonymous_splat?
|
124
|
+
true
|
125
|
+
end
|
126
|
+
end
|
118
127
|
end
|
119
128
|
end
|
120
129
|
end
|
@@ -23,7 +23,7 @@ module Reek
|
|
23
23
|
puts EXISTING_FILE_MESSAGE
|
24
24
|
else
|
25
25
|
write_to_file
|
26
|
-
puts "\n'#{DEFAULT_CONFIGURATION_FILE_NAME}' generated! "\
|
26
|
+
puts "\n'#{DEFAULT_CONFIGURATION_FILE_NAME}' generated! " \
|
27
27
|
'You can now use this as a starting point.'
|
28
28
|
end
|
29
29
|
options.success_exit_code
|
data/lib/reek/cli/options.rb
CHANGED
@@ -110,12 +110,12 @@ module Reek
|
|
110
110
|
parser.on('--smell SMELL',
|
111
111
|
'Only look for a specific smell.',
|
112
112
|
'Call it like this: reek --smell MissingSafeMethod source.rb',
|
113
|
-
"Check out #{DocumentationLink.build('Code Smells')} "\
|
113
|
+
"Check out #{DocumentationLink.build('Code Smells')} " \
|
114
114
|
'for a list of smells') do |smell|
|
115
115
|
smells_to_detect << smell
|
116
116
|
end
|
117
117
|
parser.on('--stdin-filename FILE',
|
118
|
-
'When passing code in via pipe, assume this filename when '\
|
118
|
+
'When passing code in via pipe, assume this filename when ' \
|
119
119
|
'checking file or directory rules in the config.') do |file|
|
120
120
|
self.stdin_filename = file
|
121
121
|
end
|
@@ -210,12 +210,12 @@ module Reek
|
|
210
210
|
def set_exit_codes
|
211
211
|
parser.separator "\nExit codes:"
|
212
212
|
parser.on('--success-exit-code CODE',
|
213
|
-
'The exit code when no smells are found '\
|
213
|
+
'The exit code when no smells are found ' \
|
214
214
|
"(default: #{Status::DEFAULT_SUCCESS_EXIT_CODE})") do |option|
|
215
215
|
self.success_exit_code = Integer(option)
|
216
216
|
end
|
217
217
|
parser.on('--failure-exit-code CODE',
|
218
|
-
'The exit code when smells are found '\
|
218
|
+
'The exit code when smells are found ' \
|
219
219
|
"(default: #{Status::DEFAULT_FAILURE_EXIT_CODE})") do |option|
|
220
220
|
self.failure_exit_code = Integer(option)
|
221
221
|
end
|
@@ -231,7 +231,7 @@ module Reek
|
|
231
231
|
parser.on_tail('-l', '--list', 'List all available smell detectors') do
|
232
232
|
puts "All available smell detectors:\n\n"
|
233
233
|
puts DetectorRepository.available_detector_names
|
234
|
-
puts "\nCheck out #{DocumentationLink.build('Code Smells')} "\
|
234
|
+
puts "\nCheck out #{DocumentationLink.build('Code Smells')} " \
|
235
235
|
'for a details on each detector'
|
236
236
|
exit
|
237
237
|
end
|
data/lib/reek/rake/task.rb
CHANGED
@@ -69,15 +69,15 @@ module Reek
|
|
69
69
|
|
70
70
|
# @public
|
71
71
|
def initialize(name = :reek)
|
72
|
-
@config_file = ENV
|
72
|
+
@config_file = ENV.fetch('REEK_CFG', nil)
|
73
73
|
@name = name
|
74
|
-
@reek_opts = ENV
|
74
|
+
@reek_opts = ENV.fetch('REEK_OPTS', '')
|
75
75
|
@fail_on_error = true
|
76
76
|
@verbose = false
|
77
77
|
|
78
78
|
yield self if block_given?
|
79
79
|
|
80
|
-
if (reek_src = ENV
|
80
|
+
if (reek_src = ENV.fetch('REEK_SRC', nil))
|
81
81
|
@source_files = FileList[reek_src]
|
82
82
|
end
|
83
83
|
@source_files ||= FileList['lib/**/*.rb']
|
@@ -87,8 +87,8 @@ module Reek
|
|
87
87
|
# @public
|
88
88
|
def source_files=(files)
|
89
89
|
unless files.is_a?(String) || files.is_a?(FileList)
|
90
|
-
raise ArgumentError, 'File list should be a FileList or a String that can contain'\
|
91
|
-
"
|
90
|
+
raise ArgumentError, 'File list should be a FileList or a String that can contain ' \
|
91
|
+
"a glob pattern, e.g. '{app,lib,spec}/**/*.rb'"
|
92
92
|
end
|
93
93
|
@source_files = FileList[files]
|
94
94
|
end
|
@@ -63,7 +63,7 @@ BooleanParameter:
|
|
63
63
|
|
64
64
|
* Move everything in the `if` branch into a separate method
|
65
65
|
* Move everything in the `else` branch into a separate method
|
66
|
-
* Get rid of the `hit_the_switch` method
|
66
|
+
* Get rid of the `hit_the_switch` method altogether
|
67
67
|
* Make the decision what method to call in the initial caller of `hit_the_switch`
|
68
68
|
ClassVariable:
|
69
69
|
remediation_points: 350_000
|
@@ -119,7 +119,7 @@ ControlParameter:
|
|
119
119
|
end
|
120
120
|
```
|
121
121
|
|
122
|
-
Fixing those problems is out of the scope of this document but an easy solution could be to remove the "write" method
|
122
|
+
Fixing those problems is out of the scope of this document but an easy solution could be to remove the "write" method altogether and to move the calls to "write_quoted" / "write_unquoted" in the initial caller of "write".
|
123
123
|
DataClump:
|
124
124
|
remediation_points: 250_000
|
125
125
|
content: |
|
@@ -768,7 +768,7 @@ TooManyStatements:
|
|
768
768
|
end
|
769
769
|
```
|
770
770
|
|
771
|
-
(You might argue that the two
|
771
|
+
(You might argue that the two assignments within the first @if@ should count as statements, and that perhaps the nested assignment should count as +2.)
|
772
772
|
UncommunicativeMethodName:
|
773
773
|
remediation_points: 150_000
|
774
774
|
content: |
|
@@ -25,8 +25,8 @@ module Reek
|
|
25
25
|
# @return [Array<SmellWarning>]
|
26
26
|
#
|
27
27
|
def sniff
|
28
|
-
class_variables_in_context.map do |variable,
|
29
|
-
lines =
|
28
|
+
class_variables_in_context.map do |variable, occurrences|
|
29
|
+
lines = occurrences.map(&:line)
|
30
30
|
smell_warning(
|
31
31
|
lines: lines,
|
32
32
|
message: "declares the class variable '#{variable}'",
|
@@ -9,20 +9,20 @@ module Reek
|
|
9
9
|
class Candidate
|
10
10
|
#
|
11
11
|
# @param parameter [Symbol] the parameter name
|
12
|
-
# @param
|
12
|
+
# @param occurrences [Array<Reek::AST::Node>] the occurrences of the ControlParameter smell
|
13
13
|
# e.g. [s(:lvar, :bravo), s(:lvar, :bravo)]
|
14
14
|
#
|
15
|
-
def initialize(parameter,
|
15
|
+
def initialize(parameter, occurrences)
|
16
16
|
@parameter = parameter
|
17
|
-
@
|
17
|
+
@occurrences = occurrences
|
18
18
|
end
|
19
19
|
|
20
20
|
def smells?
|
21
|
-
|
21
|
+
occurrences.any?
|
22
22
|
end
|
23
23
|
|
24
24
|
def lines
|
25
|
-
|
25
|
+
occurrences.map(&:line)
|
26
26
|
end
|
27
27
|
|
28
28
|
def name
|
@@ -31,7 +31,7 @@ module Reek
|
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
|
-
attr_reader :
|
34
|
+
attr_reader :occurrences, :parameter
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -67,11 +67,11 @@ module Reek
|
|
67
67
|
class FoundCall
|
68
68
|
def initialize(call_node)
|
69
69
|
@call_node = call_node
|
70
|
-
@
|
70
|
+
@occurrences = []
|
71
71
|
end
|
72
72
|
|
73
73
|
def record(occurence)
|
74
|
-
|
74
|
+
occurrences.push occurence
|
75
75
|
end
|
76
76
|
|
77
77
|
def call
|
@@ -79,16 +79,16 @@ module Reek
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def occurs
|
82
|
-
|
82
|
+
occurrences.length
|
83
83
|
end
|
84
84
|
|
85
85
|
def lines
|
86
|
-
|
86
|
+
occurrences.map(&:line)
|
87
87
|
end
|
88
88
|
|
89
89
|
private
|
90
90
|
|
91
|
-
attr_reader :call_node, :
|
91
|
+
attr_reader :call_node, :occurrences
|
92
92
|
end
|
93
93
|
|
94
94
|
private_constant :FoundCall
|
@@ -69,21 +69,21 @@ module Reek
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def set_failure_messages_for_smell_type
|
72
|
-
self.failure_message = "Expected #{origin} to reek of #{smell_type}, "\
|
72
|
+
self.failure_message = "Expected #{origin} to reek of #{smell_type}, " \
|
73
73
|
'but it didn\'t'
|
74
|
-
self.failure_message_when_negated = "Expected #{origin} not to reek "\
|
74
|
+
self.failure_message_when_negated = "Expected #{origin} not to reek " \
|
75
75
|
"of #{smell_type}, but it did"
|
76
76
|
end
|
77
77
|
|
78
78
|
def set_failure_messages_for_smell_details
|
79
79
|
self.failure_message =
|
80
|
-
"Expected #{origin} to reek of #{smell_type} "\
|
81
|
-
"(which it did) with smell details #{smell_details}, which it didn't.\n"\
|
82
|
-
"The number of smell details I had to compare with the given one was #{matching_smell_types.count} "\
|
83
|
-
"and here they are:\n"\
|
80
|
+
"Expected #{origin} to reek of #{smell_type} " \
|
81
|
+
"(which it did) with smell details #{smell_details}, which it didn't.\n" \
|
82
|
+
"The number of smell details I had to compare with the given one was #{matching_smell_types.count} " \
|
83
|
+
"and here they are:\n" \
|
84
84
|
"#{all_relevant_smell_details_formatted}"
|
85
85
|
self.failure_message_when_negated =
|
86
|
-
"Expected #{origin} not to reek of "\
|
86
|
+
"Expected #{origin} not to reek of " \
|
87
87
|
"#{smell_type} with smell details #{smell_details}, but it did"
|
88
88
|
end
|
89
89
|
|
data/lib/reek/spec.rb
CHANGED
data/lib/reek/version.rb
CHANGED
data/reek.gemspec
CHANGED
@@ -32,6 +32,6 @@ Gem::Specification.new do |spec|
|
|
32
32
|
}
|
33
33
|
|
34
34
|
spec.add_runtime_dependency 'kwalify', '~> 0.7.0'
|
35
|
-
spec.add_runtime_dependency 'parser', '~> 3.
|
35
|
+
spec.add_runtime_dependency 'parser', '~> 3.2.0'
|
36
36
|
spec.add_runtime_dependency 'rainbow', '>= 2.0', '< 4.0'
|
37
37
|
end
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reek
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.1.
|
4
|
+
version: 6.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Rutherford
|
8
8
|
- Timo Roessner
|
9
9
|
- Matijs van Zuijlen
|
10
10
|
- Piotr Szotkowski
|
11
|
-
autorequire:
|
11
|
+
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2023-01-14 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: kwalify
|
@@ -33,14 +33,14 @@ dependencies:
|
|
33
33
|
requirements:
|
34
34
|
- - "~>"
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: 3.
|
36
|
+
version: 3.2.0
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
41
|
- - "~>"
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 3.
|
43
|
+
version: 3.2.0
|
44
44
|
- !ruby/object:Gem::Dependency
|
45
45
|
name: rainbow
|
46
46
|
requirement: !ruby/object:Gem::Requirement
|
@@ -244,7 +244,7 @@ metadata:
|
|
244
244
|
changelog_uri: https://github.com/troessner/reek/CHANGELOG.md
|
245
245
|
documentation_uri: https://www.rubydoc.info/gems/reek
|
246
246
|
rubygems_mfa_required: 'true'
|
247
|
-
post_install_message:
|
247
|
+
post_install_message:
|
248
248
|
rdoc_options:
|
249
249
|
- "--main"
|
250
250
|
- README.md
|
@@ -263,8 +263,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
263
263
|
- !ruby/object:Gem::Version
|
264
264
|
version: '0'
|
265
265
|
requirements: []
|
266
|
-
rubygems_version: 3.1
|
267
|
-
signing_key:
|
266
|
+
rubygems_version: 3.4.1
|
267
|
+
signing_key:
|
268
268
|
specification_version: 4
|
269
269
|
summary: Code smell detector for Ruby
|
270
270
|
test_files: []
|