rubocop 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/default.yml +8 -5
- data/lib/rubocop/config_loader.rb +11 -3
- data/lib/rubocop/cop/generator.rb +1 -8
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +15 -3
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +6 -15
- data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +8 -1
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -1
- data/lib/rubocop/target_finder.rb +1 -1
- data/lib/rubocop/target_ruby.rb +12 -4
- data/lib/rubocop/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4238df3546a63ce2c279ced4bba228a61c137b083a3fad76b45365954555f690
|
4
|
+
data.tar.gz: bf3bd7a2409203b911212906d013aec7219f1a21825352bc92e0b897faafbd66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a87bd4426855a7278963b8c3e4373b7c995994b5685318aad04bc2b0832c0db44e705d50d4ea21d81eb47074137fde56665f8317121caae8a81e208e044ce4a7
|
7
|
+
data.tar.gz: 3bb4cb7794129ac95c70876bc009a4ed07425a7a346acaf77279c4e0fc8b1c20f31e82e9590e1d880fa011ddddc08c93bb3851f6f815718b9de8ff7a0dd78c6f
|
data/config/default.yml
CHANGED
@@ -1176,7 +1176,7 @@ Layout/SpaceBeforeBlockBraces:
|
|
1176
1176
|
SupportedStylesForEmptyBraces:
|
1177
1177
|
- space
|
1178
1178
|
- no_space
|
1179
|
-
VersionChanged: '0.52
|
1179
|
+
VersionChanged: '0.52'
|
1180
1180
|
|
1181
1181
|
Layout/SpaceBeforeComma:
|
1182
1182
|
Description: 'No spaces before commas.'
|
@@ -1401,7 +1401,10 @@ Lint/ConstantDefinitionInBlock:
|
|
1401
1401
|
Enabled: true
|
1402
1402
|
VersionAdded: '0.91'
|
1403
1403
|
VersionChanged: '1.3'
|
1404
|
-
|
1404
|
+
# `enums` for Typed Enums via T::Enum in Sorbet.
|
1405
|
+
# https://sorbet.org/docs/tenum
|
1406
|
+
AllowedMethods:
|
1407
|
+
- enums
|
1405
1408
|
|
1406
1409
|
Lint/ConstantResolution:
|
1407
1410
|
Description: 'Check that constants are fully qualified with `::`.'
|
@@ -1862,7 +1865,7 @@ Lint/RescueException:
|
|
1862
1865
|
StyleGuide: '#no-blind-rescues'
|
1863
1866
|
Enabled: true
|
1864
1867
|
VersionAdded: '0.9'
|
1865
|
-
VersionChanged: '0.27
|
1868
|
+
VersionChanged: '0.27'
|
1866
1869
|
|
1867
1870
|
Lint/RescueType:
|
1868
1871
|
Description: 'Avoid rescuing from non constants that could result in a `TypeError`.'
|
@@ -3917,7 +3920,7 @@ Style/PercentLiteralDelimiters:
|
|
3917
3920
|
'%r': '{}'
|
3918
3921
|
'%w': '[]'
|
3919
3922
|
'%W': '[]'
|
3920
|
-
VersionChanged: '0.48
|
3923
|
+
VersionChanged: '0.48'
|
3921
3924
|
|
3922
3925
|
Style/PercentQLiterals:
|
3923
3926
|
Description: 'Checks if uses of %Q/%q match the configured preference.'
|
@@ -4324,7 +4327,7 @@ Style/StringMethods:
|
|
4324
4327
|
Description: 'Checks if configured preferred methods are used over non-preferred.'
|
4325
4328
|
Enabled: false
|
4326
4329
|
VersionAdded: '0.34'
|
4327
|
-
VersionChanged: '0.34
|
4330
|
+
VersionChanged: '0.34'
|
4328
4331
|
# Mapping from undesired method to desired_method
|
4329
4332
|
# e.g. to use `to_sym` over `intern`:
|
4330
4333
|
#
|
@@ -255,10 +255,18 @@ module RuboCop
|
|
255
255
|
"Configuration file not found: #{absolute_path}"
|
256
256
|
end
|
257
257
|
|
258
|
-
|
258
|
+
def yaml_safe_load(yaml_code, filename)
|
259
|
+
yaml_safe_load!(yaml_code, filename)
|
260
|
+
rescue ::StandardError
|
261
|
+
if defined?(::SafeYAML)
|
262
|
+
raise 'SafeYAML is unmaintained, no longer needed and should be removed'
|
263
|
+
end
|
264
|
+
|
265
|
+
raise
|
266
|
+
end
|
259
267
|
|
260
268
|
if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0')
|
261
|
-
def yaml_safe_load(yaml_code, filename)
|
269
|
+
def yaml_safe_load!(yaml_code, filename)
|
262
270
|
YAML.safe_load(yaml_code,
|
263
271
|
permitted_classes: [Regexp, Symbol],
|
264
272
|
permitted_symbols: [],
|
@@ -266,7 +274,7 @@ module RuboCop
|
|
266
274
|
filename: filename)
|
267
275
|
end
|
268
276
|
else # Ruby < 2.6
|
269
|
-
def yaml_safe_load(yaml_code, filename)
|
277
|
+
def yaml_safe_load!(yaml_code, filename)
|
270
278
|
YAML.safe_load(yaml_code, [Regexp, Symbol], [], true, filename)
|
271
279
|
end
|
272
280
|
end
|
@@ -17,7 +17,6 @@ module RuboCop
|
|
17
17
|
SOURCE_TEMPLATE = <<-RUBY.gsub(/^ {8}/, '')
|
18
18
|
# frozen_string_literal: true
|
19
19
|
|
20
|
-
# TODO: when finished, run `rake generate_cops_documentation` to update the docs
|
21
20
|
module RuboCop
|
22
21
|
module Cop
|
23
22
|
module %<department>s
|
@@ -134,7 +133,7 @@ module RuboCop
|
|
134
133
|
end
|
135
134
|
|
136
135
|
def inject_config(config_file_path: 'config/default.yml',
|
137
|
-
version_added:
|
136
|
+
version_added: '<<next>>')
|
138
137
|
injector =
|
139
138
|
ConfigurationInjector.new(configuration_file_path: config_file_path,
|
140
139
|
badge: badge,
|
@@ -213,12 +212,6 @@ module RuboCop
|
|
213
212
|
.gsub(/([A-Z])([A-Z][^A-Z\d]+)/, '\1_\2')
|
214
213
|
.downcase
|
215
214
|
end
|
216
|
-
|
217
|
-
def bump_minor_version
|
218
|
-
versions = RuboCop::Version::STRING.split('.')
|
219
|
-
|
220
|
-
"#{versions[0]}.#{versions[1].succ}"
|
221
|
-
end
|
222
215
|
end
|
223
216
|
end
|
224
217
|
end
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
VersionAdded: '%<version_added>s'
|
15
15
|
YAML
|
16
16
|
|
17
|
-
def initialize(configuration_file_path:, badge:, version_added:)
|
17
|
+
def initialize(configuration_file_path:, badge:, version_added: '<<next>>')
|
18
18
|
@configuration_file_path = configuration_file_path
|
19
19
|
@badge = badge
|
20
20
|
@version_added = version_added
|
@@ -147,6 +147,10 @@ module RuboCop
|
|
147
147
|
MSG = '`%<category>s` is supposed to appear before ' \
|
148
148
|
'`%<previous>s`.'
|
149
149
|
|
150
|
+
def_node_matcher :dynamic_constant?, <<~PATTERN
|
151
|
+
(casgn nil? _ (send ...))
|
152
|
+
PATTERN
|
153
|
+
|
150
154
|
# Validates code style on class declaration.
|
151
155
|
# Add offense when find a node out of expected order.
|
152
156
|
def on_class(class_node)
|
@@ -168,11 +172,10 @@ module RuboCop
|
|
168
172
|
|
169
173
|
# Autocorrect by swapping between two nodes autocorrecting them
|
170
174
|
def autocorrect(corrector, node)
|
171
|
-
node_classification = classify(node)
|
172
175
|
previous = node.left_siblings.find do |sibling|
|
173
|
-
|
174
|
-
!ignore?(classification) && node_classification != classification
|
176
|
+
!ignore_for_autocorrect?(node, sibling)
|
175
177
|
end
|
178
|
+
return unless previous
|
176
179
|
|
177
180
|
current_range = source_range_with_comment(node)
|
178
181
|
previous_range = source_range_with_comment(previous)
|
@@ -241,6 +244,15 @@ module RuboCop
|
|
241
244
|
expected_order.index(classification).nil?
|
242
245
|
end
|
243
246
|
|
247
|
+
def ignore_for_autocorrect?(node, sibling)
|
248
|
+
classification = classify(node)
|
249
|
+
sibling_class = classify(sibling)
|
250
|
+
|
251
|
+
ignore?(sibling_class) ||
|
252
|
+
classification == sibling_class ||
|
253
|
+
dynamic_constant?(node)
|
254
|
+
end
|
255
|
+
|
244
256
|
def humanize_node(node)
|
245
257
|
if node.def_type?
|
246
258
|
return :initializer if node.method?(:initialize)
|
@@ -50,8 +50,11 @@ module RuboCop
|
|
50
50
|
# end
|
51
51
|
# end
|
52
52
|
#
|
53
|
-
# @example AllowedMethods: ['enums']
|
53
|
+
# @example AllowedMethods: ['enums'] (default)
|
54
54
|
# # good
|
55
|
+
#
|
56
|
+
# # `enums` for Typed Enums via `T::Enum` in Sorbet.
|
57
|
+
# # https://sorbet.org/docs/tenum
|
55
58
|
# class TestEnum < T::Enum
|
56
59
|
# enums do
|
57
60
|
# Foo = new("foo")
|
@@ -8,23 +8,14 @@ module RuboCop
|
|
8
8
|
#
|
9
9
|
# @example
|
10
10
|
# # bad
|
11
|
-
# def
|
12
|
-
# return to_enum(
|
11
|
+
# def foo(x, y = 1)
|
12
|
+
# return to_enum(__callee__, x) # `y` is missing
|
13
13
|
# end
|
14
14
|
#
|
15
15
|
# # good
|
16
|
-
# def
|
17
|
-
# return to_enum(
|
18
|
-
#
|
19
|
-
#
|
20
|
-
# # bad
|
21
|
-
# def method(required:)
|
22
|
-
# return to_enum(:method, required: something) # `required` has incorrect value
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# # good
|
26
|
-
# def method(required:)
|
27
|
-
# return to_enum(:method, required: required)
|
16
|
+
# def foo(x, y = 1)
|
17
|
+
# return to_enum(__callee__, x, y)
|
18
|
+
# # alternatives to `__callee__` are `__method__` and `:foo`
|
28
19
|
# end
|
29
20
|
#
|
30
21
|
class ToEnumArguments < Base
|
@@ -37,7 +28,7 @@ module RuboCop
|
|
37
28
|
PATTERN
|
38
29
|
|
39
30
|
def_node_matcher :method_name?, <<~PATTERN
|
40
|
-
{(send nil? :__method__) (sym %1)}
|
31
|
+
{(send nil? {:__method__ :__callee__}) (sym %1)}
|
41
32
|
PATTERN
|
42
33
|
|
43
34
|
def_node_matcher :passing_keyword_arg?, <<~PATTERN
|
@@ -8,9 +8,9 @@ module RuboCop
|
|
8
8
|
include ConfigurableFormatting
|
9
9
|
|
10
10
|
FORMATS = {
|
11
|
-
snake_case: /(?:\D|_\d+)
|
12
|
-
normalcase: /(?:\D|[^_\d]\d+)
|
13
|
-
non_integer:
|
11
|
+
snake_case: /(?:\D|_\d+|\A\d+)\z/,
|
12
|
+
normalcase: /(?:\D|[^_\d]\d+|\A\d+)\z/,
|
13
|
+
non_integer: /(\D|\A\d+)\z/
|
14
14
|
}.freeze
|
15
15
|
end
|
16
16
|
end
|
@@ -68,6 +68,12 @@ module RuboCop
|
|
68
68
|
# end
|
69
69
|
# EOT
|
70
70
|
# )
|
71
|
+
#
|
72
|
+
# # bad - interpolated string without comment
|
73
|
+
# class_eval("def #{unsafe_method}!(*params); end")
|
74
|
+
#
|
75
|
+
# # good - with inline comment or replace it with block comment using heredoc
|
76
|
+
# class_eval("def #{unsafe_method}!(*params); end # def capitalize!(*params); end")
|
71
77
|
class DocumentDynamicEvalDefinition < Base
|
72
78
|
BLOCK_COMMENT_REGEXP = /^\s*#(?!{)/.freeze
|
73
79
|
COMMENT_REGEXP = /\s*#(?!{).*/.freeze
|
@@ -79,7 +85,8 @@ module RuboCop
|
|
79
85
|
arg_node = node.first_argument
|
80
86
|
|
81
87
|
return unless arg_node&.dstr_type? && interpolated?(arg_node)
|
82
|
-
return if inline_comment_docs?(arg_node) ||
|
88
|
+
return if inline_comment_docs?(arg_node) ||
|
89
|
+
arg_node.heredoc? && comment_block_docs?(arg_node)
|
83
90
|
|
84
91
|
add_offense(node.loc.selector)
|
85
92
|
end
|
@@ -35,6 +35,8 @@ module RuboCop
|
|
35
35
|
|
36
36
|
NEGATED_EQUALITY_METHODS = %i[!= !~].freeze
|
37
37
|
|
38
|
+
def_node_matcher :double_negation?, '(send (send _ :!) :!)'
|
39
|
+
|
38
40
|
def self.autocorrect_incompatible_with
|
39
41
|
[Style::InverseMethods, Style::Not]
|
40
42
|
end
|
@@ -47,7 +49,7 @@ module RuboCop
|
|
47
49
|
return unless if_else?(node)
|
48
50
|
|
49
51
|
condition = node.condition
|
50
|
-
return
|
52
|
+
return if double_negation?(condition) || !negated_condition?(condition)
|
51
53
|
|
52
54
|
type = node.ternary? ? 'ternary' : 'if-else'
|
53
55
|
add_offense(node, message: format(MSG, type: type)) do |corrector|
|
@@ -94,7 +94,7 @@ module RuboCop
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def wanted_dir_patterns(base_dir, exclude_pattern, flags)
|
97
|
-
dirs = Dir.glob(File.join(base_dir, '*/'), flags)
|
97
|
+
dirs = Dir.glob(File.join(base_dir.gsub('/**/', '/\**/'), '*/'), flags)
|
98
98
|
.reject do |dir|
|
99
99
|
dir.end_with?('/./', '/../') || File.fnmatch?(exclude_pattern, dir, flags)
|
100
100
|
end
|
data/lib/rubocop/target_ruby.rb
CHANGED
@@ -123,6 +123,10 @@ module RuboCop
|
|
123
123
|
(send _ :required_ruby_version= $_)
|
124
124
|
PATTERN
|
125
125
|
|
126
|
+
def_node_matcher :gem_requirement?, <<~PATTERN
|
127
|
+
(send (const(const _ :Gem):Requirement) :new $str)
|
128
|
+
PATTERN
|
129
|
+
|
126
130
|
def name
|
127
131
|
"`required_ruby_version` parameter (in #{gemspec_filename})"
|
128
132
|
end
|
@@ -136,10 +140,9 @@ module RuboCop
|
|
136
140
|
version = version_from_gemspec_file(file)
|
137
141
|
return if version.nil?
|
138
142
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
end
|
143
|
+
requirement = version.children.last
|
144
|
+
return version_from_array(version) if version.array_type?
|
145
|
+
return version_from_array(requirement) if gem_requirement? version
|
143
146
|
|
144
147
|
version_from_str(version.str_content)
|
145
148
|
end
|
@@ -161,6 +164,11 @@ module RuboCop
|
|
161
164
|
required_ruby_version(processed_source.ast).first
|
162
165
|
end
|
163
166
|
|
167
|
+
def version_from_array(array)
|
168
|
+
versions = array.children.map { |v| version_from_str(v.is_a?(String) ? v : v.str_content) }
|
169
|
+
versions.compact.min
|
170
|
+
end
|
171
|
+
|
164
172
|
def version_from_str(str)
|
165
173
|
str.match(/^(?:>=|<=)?\s*(?<version>\d+(?:\.\d+)*)/) do |md|
|
166
174
|
md[:version].to_f
|
data/lib/rubocop/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bozhidar Batsov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2020-11-
|
13
|
+
date: 2020-11-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: parallel
|