reek 5.3.2 → 5.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +4 -0
- data/CONTRIBUTING.md +17 -0
- data/Gemfile +2 -2
- data/README.md +8 -2
- data/docs/Reek-4-to-Reek-5-migration.md +6 -11
- data/features/command_line_interface/options.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/lib/reek/configuration/directory_directives.rb +28 -1
- data/lib/reek/examiner.rb +2 -2
- data/lib/reek/version.rb +1 -1
- data/spec/reek/configuration/directory_directives_spec.rb +42 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5c7a7193dd76b11cd88c3e3f031784a0bb54f3bcaa35a4e3b430dd550749facc
|
4
|
+
data.tar.gz: 0d2f96071b27301ebbd2b3ff82b8e1fbbde2aaf647125e3903d017074c4d061b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc75695b17d58bf820bf6b874e747c3a7f81c43b0e8c80a33144118b1dbbbb0e0cd294ae386026937ee0799d0a7fa7cd12c65470bfd217faaa9c66dcbd22a03c
|
7
|
+
data.tar.gz: cb9bfef6dd9f799c2f2733b020952909010f489b1cf621d64828a2982cc64ea912211a7bf0f9e21fc1246ce4068edb5bb1571acdd16445df6ddebca2c3c9a84b
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/CONTRIBUTING.md
CHANGED
@@ -190,3 +190,20 @@ We are following [semantic versioning](http://semver.org/).
|
|
190
190
|
If you're working on a change that is breaking backwards-compatibility
|
191
191
|
just go ahead with your pull request like normal. We'll discuss this then in
|
192
192
|
the pull request and help you to point your pull request to the right branch.
|
193
|
+
|
194
|
+
### Releasing Reek
|
195
|
+
|
196
|
+
In this example we assume the current version is 5.3.1 and you want to update to 5.3.2.
|
197
|
+
|
198
|
+
* Create a branch with a name like "prepare-v.5.3.2"
|
199
|
+
* Update the version in `lib/reek/version.rb`
|
200
|
+
* List all relevant changes in `CHANGELOG.md`
|
201
|
+
* Update the version number in our cucumber features, otherwise the build will fail. You can do this quite easily via
|
202
|
+
```Bash
|
203
|
+
find features/ -type f -exec sed -i '' 's/v5.3.1/v5.3.2/g' {} +
|
204
|
+
```
|
205
|
+
* Push the branch, create a pull request, have it reviewed and merged
|
206
|
+
* Pull the latest master and then do a
|
207
|
+
```Bash
|
208
|
+
bundle exec rake release
|
209
|
+
```
|
data/Gemfile
CHANGED
@@ -12,8 +12,8 @@ group :development do
|
|
12
12
|
gem 'kramdown-parser-gfm', '~> 1.0'
|
13
13
|
gem 'rake', '~> 12.0'
|
14
14
|
gem 'rspec', '~> 3.0'
|
15
|
-
gem 'rspec-benchmark', '~> 0.
|
16
|
-
gem 'rubocop', '~> 0.
|
15
|
+
gem 'rspec-benchmark', '~> 0.5.0'
|
16
|
+
gem 'rubocop', '~> 0.67.2'
|
17
17
|
gem 'rubocop-rspec', '~> 1.32.0'
|
18
18
|
gem 'simplecov', '~> 0.16.1'
|
19
19
|
gem 'yard', '~> 0.9.5'
|
data/README.md
CHANGED
@@ -309,12 +309,18 @@ detectors:
|
|
309
309
|
# You can configure smells on a per-directory base.
|
310
310
|
# E.g. the classic Rails case: controllers smell of NestedIterators (see /docs/Nested-Iterators.md) and
|
311
311
|
# helpers smell of UtilityFunction (see docs/Utility-Function.md)
|
312
|
-
#
|
312
|
+
#
|
313
|
+
# Note that we only allow configuration on a directory level, not a file level,
|
314
|
+
# so all paths have to point to directories.
|
315
|
+
# A Dir.glob pattern can be used.
|
313
316
|
directories:
|
314
317
|
"web_app/app/controllers":
|
315
318
|
NestedIterators:
|
316
319
|
enabled: false
|
317
|
-
"web_app/app/helpers
|
320
|
+
"web_app/app/helpers**:
|
321
|
+
UtilityFunction:
|
322
|
+
enabled: false
|
323
|
+
"web_app/lib/**/test/**":
|
318
324
|
UtilityFunction:
|
319
325
|
enabled: false
|
320
326
|
|
@@ -175,18 +175,13 @@ reek_of('DuplicateMethodCall')
|
|
175
175
|
* `wiki-links` flag has been renamed to `documentation` flag
|
176
176
|
* Reek assumes the default configuration file to be named ".reek.yml" and will ignore all other files. You can
|
177
177
|
still use any name you want though by passing in a name via the `-c` flag
|
178
|
-
* We have dropped the legacy code comment separator
|
179
|
-
a smell detector via comment
|
178
|
+
* We have dropped the legacy code comment separator `:` at the end of a detector name. Before this release,
|
179
|
+
to configure a smell detector via comment, you had to end with a colon after the detector name.
|
180
|
+
This syntax is disallowed with Reek 5 - now you have to drop the `:` at the end, like this:
|
180
181
|
|
181
|
-
```
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
Mind the ":" at the end of "UnusedPrivateMethod". This syntax is disallowed with Reek 5 - you have to drop the ":"
|
186
|
-
at the end now like this:
|
187
|
-
|
188
|
-
```
|
189
|
-
# :reek:UnusedPrivateMethod { exclude: [ bravo ] }
|
182
|
+
```diff
|
183
|
+
-# :reek:UnusedPrivateMethod: { exclude: [ bravo ] }
|
184
|
+
+# :reek:UnusedPrivateMethod { exclude: [ bravo ] }
|
190
185
|
```
|
191
186
|
|
192
187
|
* We have dropped support for Ruby 2.1 and 2.2 since they are officially not supported by the Ruby core team anymore
|
@@ -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/v5.
|
46
|
+
Check out https://github.com/troessner/reek/blob/v5.4.0/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:
|
@@ -120,5 +120,5 @@ Feature: Reek can be controlled using command-line options
|
|
120
120
|
UnusedPrivateMethod
|
121
121
|
UtilityFunction
|
122
122
|
|
123
|
-
Check out https://github.com/troessner/reek/blob/v5.
|
123
|
+
Check out https://github.com/troessner/reek/blob/v5.4.0/docs/Code-Smells.md for a details on each detector
|
124
124
|
"""
|
@@ -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.
|
27
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v5.4.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.
|
36
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v5.4.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.
|
56
|
+
"documentation_link": "https://github.com/troessner/reek/blob/v5.4.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.
|
186
|
-
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v5.
|
185
|
+
[4]:UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/v5.4.0/docs/Uncommunicative-Method-Name.md]
|
186
|
+
[5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v5.4.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.
|
213
|
-
UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v5.
|
212
|
+
UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/v5.4.0/docs/Uncommunicative-Method-Name.md]
|
213
|
+
UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/v5.4.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.
|
28
|
+
documentation_link: https://github.com/troessner/reek/blob/v5.4.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.
|
36
|
+
documentation_link: https://github.com/troessner/reek/blob/v5.4.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.
|
51
|
+
documentation_link: https://github.com/troessner/reek/blob/v5.4.0/docs/Irresponsible-Module.md
|
52
52
|
"""
|
@@ -53,10 +53,37 @@ module Reek
|
|
53
53
|
# @quality :reek:FeatureEnvy
|
54
54
|
def best_match_for(source_base_dir)
|
55
55
|
keys.
|
56
|
-
select { |pathname| source_base_dir.to_s.match(
|
56
|
+
select { |pathname| source_base_dir.to_s.match(glob_to_regexp(pathname.to_s)) }.
|
57
57
|
max_by { |pathname| pathname.to_s.length }
|
58
58
|
end
|
59
59
|
|
60
|
+
# Transform a glob pattern to a regexp.
|
61
|
+
#
|
62
|
+
# It changes:
|
63
|
+
# - /** to .*,
|
64
|
+
# - ** to .*,
|
65
|
+
# - * to [^\/]*.
|
66
|
+
#
|
67
|
+
# @quality :reek:FeatureEnvy
|
68
|
+
# @quality :reek:UtilityFunction
|
69
|
+
def glob_to_regexp(glob)
|
70
|
+
is_glob_pattern = glob.include?('*')
|
71
|
+
|
72
|
+
regexp = if is_glob_pattern
|
73
|
+
glob.
|
74
|
+
gsub(%r{/\*\*$}, '<<to_eol_wildcards>>').
|
75
|
+
gsub('**', '<<to_wildcards>>').
|
76
|
+
gsub('*', '[^/]*').
|
77
|
+
gsub('.', '\.').
|
78
|
+
gsub('<<to_eol_wildcards>>', '.*').
|
79
|
+
gsub('<<to_wildcards>>', '.*')
|
80
|
+
else
|
81
|
+
glob + '.*'
|
82
|
+
end
|
83
|
+
|
84
|
+
Regexp.new("^#{regexp}$", Regexp::IGNORECASE)
|
85
|
+
end
|
86
|
+
|
60
87
|
def error_message_for_invalid_smell_type(klass)
|
61
88
|
"You are trying to configure smell type #{klass} but we can't find one with that name.\n" \
|
62
89
|
"Please make sure you spelled it right. (See 'docs/defaults.reek' in the Reek\n" \
|
data/lib/reek/examiner.rb
CHANGED
data/lib/reek/version.rb
CHANGED
@@ -44,9 +44,12 @@ RSpec.describe Reek::Configuration::DirectoryDirectives do
|
|
44
44
|
describe '#best_match_for' do
|
45
45
|
let(:directives) do
|
46
46
|
{
|
47
|
-
Pathname.new('foo/bar/baz')
|
48
|
-
Pathname.new('foo/bar')
|
49
|
-
Pathname.new('bar/boo')
|
47
|
+
Pathname.new('foo/bar/baz') => {},
|
48
|
+
Pathname.new('foo/bar') => {},
|
49
|
+
Pathname.new('bar/boo') => {},
|
50
|
+
Pathname.new('bar/**/test/**') => {},
|
51
|
+
Pathname.new('bar/**/spec/*') => {},
|
52
|
+
Pathname.new('bar/**/.spec/*') => {}
|
50
53
|
}.extend(described_class)
|
51
54
|
end
|
52
55
|
|
@@ -62,6 +65,42 @@ RSpec.describe Reek::Configuration::DirectoryDirectives do
|
|
62
65
|
expect(hit.to_s).to eq('foo/bar')
|
63
66
|
end
|
64
67
|
|
68
|
+
it 'returns the corresponding directory when source_base_dir matches the Dir.glob like pattern' do
|
69
|
+
source_base_dir = 'bar/something/test'
|
70
|
+
hit = directives.send :best_match_for, source_base_dir
|
71
|
+
expect(hit.to_s).to eq('bar/**/test/**')
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'returns the corresponding directory when source_base_dir is a leaf of the Dir.glob like pattern' do
|
75
|
+
source_base_dir = 'bar/something/test/with/some/subdirectory'
|
76
|
+
hit = directives.send :best_match_for, source_base_dir
|
77
|
+
expect(hit.to_s).to eq('bar/**/test/**')
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'returns the corresponding directory when source_base_dir is a direct leaf of the Dir.glob like pattern' do
|
81
|
+
source_base_dir = 'bar/something/spec/direct'
|
82
|
+
hit = directives.send :best_match_for, source_base_dir
|
83
|
+
expect(hit.to_s).to eq('bar/**/spec/*')
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'returns the corresponding directory when source_base_dir contains a . character' do
|
87
|
+
source_base_dir = 'bar/something/.spec/direct'
|
88
|
+
hit = directives.send :best_match_for, source_base_dir
|
89
|
+
expect(hit.to_s).to eq('bar/**/.spec/*')
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'does not match an arbitrary directory when source_base_dir contains a character that could match the .' do
|
93
|
+
source_base_dir = 'bar/something/aspec/direct'
|
94
|
+
hit = directives.send :best_match_for, source_base_dir
|
95
|
+
expect(hit.to_s).to eq('')
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'returns nil when source_base_dir is a not direct leaf of the Dir.glob one-folder pattern' do
|
99
|
+
source_base_dir = 'bar/something/spec/with/some/subdirectory'
|
100
|
+
hit = directives.send :best_match_for, source_base_dir
|
101
|
+
expect(hit).to be_nil
|
102
|
+
end
|
103
|
+
|
65
104
|
it 'returns nil we are on top of the tree and all other directories are below' do
|
66
105
|
source_base_dir = 'foo'
|
67
106
|
hit = directives.send :best_match_for, source_base_dir
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reek
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Rutherford
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2019-
|
14
|
+
date: 2019-04-24 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: codeclimate-engine-rb
|
@@ -500,7 +500,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
500
500
|
version: '0'
|
501
501
|
requirements: []
|
502
502
|
rubyforge_project:
|
503
|
-
rubygems_version: 2.
|
503
|
+
rubygems_version: 2.7.7
|
504
504
|
signing_key:
|
505
505
|
specification_version: 4
|
506
506
|
summary: Code smell detector for Ruby
|