rubocop 1.22.3 → 1.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/default.yml +37 -4
- data/lib/rubocop/cop/gemspec/date_assignment.rb +2 -10
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -10
- data/lib/rubocop/cop/gemspec/require_mfa.rb +146 -0
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -10
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +22 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +11 -5
- data/lib/rubocop/cop/lint/ambiguous_range.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +5 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +117 -0
- data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
- data/lib/rubocop/cop/mixin/gemspec_help.rb +30 -0
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -5
- data/lib/rubocop/cop/naming/file_name.rb +37 -4
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +2 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +69 -0
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +12 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +11 -1
- data/lib/rubocop/formatter/html_formatter.rb +5 -2
- data/lib/rubocop/formatter/json_formatter.rb +4 -1
- data/lib/rubocop/remote_config.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop/yaml_duplication_checker.rb +1 -1
- data/lib/rubocop.rb +4 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf11fe2d8f8be8879d6afc63d6f3be50b970c7910c83f1d22847d1fc9654d4aa
|
4
|
+
data.tar.gz: fd4c7ef3838a286efe3d1729672cc7a0e72f47cfb4c8d815699d53d2a974a372
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4014183525b58378a0e628ae5136d17c148a41c6c25dd51eddc810ca08fbd89d652f6c715b58eef149005af1145469936416864869b6e63a4c9e521627ab1cb4
|
7
|
+
data.tar.gz: 6e0e2a9a9d6fae829b73bd49814965a28d447207aaf7d1dda073f34130343557df965c77cc998d6ddb0d59eca09f1307d6ca56cbd3fcade575ca52950d1a56d3
|
data/README.md
CHANGED
@@ -54,7 +54,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
|
|
54
54
|
in your `Gemfile`:
|
55
55
|
|
56
56
|
```rb
|
57
|
-
gem 'rubocop', '~> 1.
|
57
|
+
gem 'rubocop', '~> 1.23', require: false
|
58
58
|
```
|
59
59
|
|
60
60
|
See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
|
data/config/default.yml
CHANGED
@@ -150,6 +150,7 @@ AllCops:
|
|
150
150
|
rubocop-minitest: [minitest]
|
151
151
|
rubocop-sequel: [sequel]
|
152
152
|
rubocop-rake: [rake]
|
153
|
+
rubocop-graphql: [graphql]
|
153
154
|
|
154
155
|
#################### Bundler ###############################
|
155
156
|
|
@@ -258,6 +259,15 @@ Gemspec/OrderedDependencies:
|
|
258
259
|
Include:
|
259
260
|
- '**/*.gemspec'
|
260
261
|
|
262
|
+
Gemspec/RequireMFA:
|
263
|
+
Description: 'Checks that the gemspec has metadata to require MFA from RubyGems.'
|
264
|
+
Enabled: pending
|
265
|
+
VersionAdded: '1.23'
|
266
|
+
Reference:
|
267
|
+
- https://guides.rubygems.org/mfa-requirement-opt-in/
|
268
|
+
Include:
|
269
|
+
- '**/*.gemspec'
|
270
|
+
|
261
271
|
Gemspec/RequiredRubyVersion:
|
262
272
|
Description: 'Checks that `required_ruby_version` of gemspec is specified and equal to `TargetRubyVersion` of .rubocop.yml.'
|
263
273
|
Enabled: true
|
@@ -511,13 +521,13 @@ Layout/EmptyLineBetweenDefs:
|
|
511
521
|
StyleGuide: '#empty-lines-between-methods'
|
512
522
|
Enabled: true
|
513
523
|
VersionAdded: '0.49'
|
514
|
-
VersionChanged: '1.
|
524
|
+
VersionChanged: '1.23'
|
515
525
|
EmptyLineBetweenMethodDefs: true
|
516
526
|
EmptyLineBetweenClassDefs: true
|
517
527
|
EmptyLineBetweenModuleDefs: true
|
518
|
-
#
|
519
|
-
# need an empty line between them.
|
520
|
-
AllowAdjacentOneLineDefs:
|
528
|
+
# `AllowAdjacentOneLineDefs` means that single line method definitions don't
|
529
|
+
# need an empty line between them. `true` by default.
|
530
|
+
AllowAdjacentOneLineDefs: true
|
521
531
|
# Can be array to specify minimum and maximum number of empty lines, e.g. [1, 2]
|
522
532
|
NumberOfEmptyLines: 1
|
523
533
|
|
@@ -2308,6 +2318,11 @@ Lint/UselessMethodDefinition:
|
|
2308
2318
|
Safe: false
|
2309
2319
|
AllowComments: true
|
2310
2320
|
|
2321
|
+
Lint/UselessRuby2Keywords:
|
2322
|
+
Description: 'Finds unnecessary uses of `ruby2_keywords`.'
|
2323
|
+
Enabled: pending
|
2324
|
+
VersionAdded: '1.23'
|
2325
|
+
|
2311
2326
|
Lint/UselessSetterCall:
|
2312
2327
|
Description: 'Checks for useless setter call to a local variable.'
|
2313
2328
|
Enabled: true
|
@@ -2501,6 +2516,7 @@ Naming/FileName:
|
|
2501
2516
|
StyleGuide: '#snake-case-files'
|
2502
2517
|
Enabled: true
|
2503
2518
|
VersionAdded: '0.50'
|
2519
|
+
VersionChanged: '1.23'
|
2504
2520
|
# Camel case file names listed in `AllCops:Include` and all file names listed
|
2505
2521
|
# in `AllCops:Exclude` are excluded by default. Add extra excludes here.
|
2506
2522
|
Exclude: []
|
@@ -2513,6 +2529,13 @@ Naming/FileName:
|
|
2513
2529
|
# whether each source file's class or module name matches the file name --
|
2514
2530
|
# not whether the nested module hierarchy matches the subdirectory path.
|
2515
2531
|
CheckDefinitionPathHierarchy: true
|
2532
|
+
# paths that are considered root directories, for example "lib" in most ruby projects
|
2533
|
+
# or "app/models" in rails projects
|
2534
|
+
CheckDefinitionPathHierarchyRoots:
|
2535
|
+
- lib
|
2536
|
+
- spec
|
2537
|
+
- test
|
2538
|
+
- src
|
2516
2539
|
# If non-`nil`, expect all source file names to match the following regex.
|
2517
2540
|
# Only the file name itself is matched, not the entire file path.
|
2518
2541
|
# Use anchors as necessary if you want to match the entire name rather than
|
@@ -4216,6 +4239,16 @@ Style/OneLineConditional:
|
|
4216
4239
|
VersionAdded: '0.9'
|
4217
4240
|
VersionChanged: '0.90'
|
4218
4241
|
|
4242
|
+
Style/OpenStructUse:
|
4243
|
+
Description: >-
|
4244
|
+
Avoid using OpenStruct. As of Ruby 3.0, use is officially discouraged due to performance,
|
4245
|
+
version compatibility, and potential security issues.
|
4246
|
+
Reference:
|
4247
|
+
- https://docs.ruby-lang.org/en/3.0.0/OpenStruct.html#class-OpenStruct-label-Caveats
|
4248
|
+
|
4249
|
+
Enabled: pending
|
4250
|
+
VersionAdded: '1.23'
|
4251
|
+
|
4219
4252
|
Style/OptionHash:
|
4220
4253
|
Description: "Don't use option hashes when you can use keyword arguments."
|
4221
4254
|
Enabled: false
|
@@ -21,21 +21,13 @@ module RuboCop
|
|
21
21
|
#
|
22
22
|
class DateAssignment < Base
|
23
23
|
include RangeHelp
|
24
|
+
include GemspecHelp
|
24
25
|
extend AutoCorrector
|
25
26
|
|
26
27
|
MSG = 'Do not use `date =` in gemspec, it is set automatically when the gem is packaged.'
|
27
28
|
|
28
|
-
# @!method gem_specification(node)
|
29
|
-
def_node_matcher :gem_specification, <<~PATTERN
|
30
|
-
(block
|
31
|
-
(send
|
32
|
-
(const
|
33
|
-
(const {cbase nil?} :Gem) :Specification) :new)
|
34
|
-
...)
|
35
|
-
PATTERN
|
36
|
-
|
37
29
|
def on_block(block_node)
|
38
|
-
return unless gem_specification(block_node)
|
30
|
+
return unless gem_specification?(block_node)
|
39
31
|
|
40
32
|
block_parameter = block_node.arguments.first.source
|
41
33
|
|
@@ -36,20 +36,11 @@ module RuboCop
|
|
36
36
|
# end
|
37
37
|
class DuplicatedAssignment < Base
|
38
38
|
include RangeHelp
|
39
|
+
include GemspecHelp
|
39
40
|
|
40
41
|
MSG = '`%<assignment>s` method calls already given on line '\
|
41
42
|
'%<line_of_first_occurrence>d of the gemspec.'
|
42
43
|
|
43
|
-
# @!method gem_specification(node)
|
44
|
-
def_node_search :gem_specification, <<~PATTERN
|
45
|
-
(block
|
46
|
-
(send
|
47
|
-
(const
|
48
|
-
(const {cbase nil?} :Gem) :Specification) :new)
|
49
|
-
(args
|
50
|
-
(arg $_)) ...)
|
51
|
-
PATTERN
|
52
|
-
|
53
44
|
# @!method assignment_method_declarations(node)
|
54
45
|
def_node_search :assignment_method_declarations, <<~PATTERN
|
55
46
|
(send
|
@@ -0,0 +1,146 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Gemspec
|
6
|
+
# Requires a gemspec to have `rubygems_mfa_required` metadata set.
|
7
|
+
#
|
8
|
+
# This setting tells RubyGems that MFA is required for accounts to
|
9
|
+
# be able perform any of these privileged operations:
|
10
|
+
#
|
11
|
+
# * gem push
|
12
|
+
# * gem yank
|
13
|
+
# * gem owner --add/remove
|
14
|
+
# * adding or removing owners using gem ownership page
|
15
|
+
#
|
16
|
+
# This helps make your gem more secure, as users can be more
|
17
|
+
# confident that gem updates were pushed by maintainers.
|
18
|
+
#
|
19
|
+
# @example
|
20
|
+
#
|
21
|
+
# # bad
|
22
|
+
# Gem::Specification.new do |spec|
|
23
|
+
# # no `rubygems_mfa_required` metadata specified
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# Gem::Specification.new do |spec|
|
28
|
+
# spec.metadata = {
|
29
|
+
# 'rubygems_mfa_required' => 'true'
|
30
|
+
# }
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# # good
|
34
|
+
# Gem::Specification.new do |spec|
|
35
|
+
# spec.metadata['rubygems_mfa_required'] = 'true'
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# # bad
|
39
|
+
# Gem::Specification.new do |spec|
|
40
|
+
# spec.metadata = {
|
41
|
+
# 'rubygems_mfa_required' => 'false'
|
42
|
+
# }
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# # good
|
46
|
+
# Gem::Specification.new do |spec|
|
47
|
+
# spec.metadata = {
|
48
|
+
# 'rubygems_mfa_required' => 'true'
|
49
|
+
# }
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# # bad
|
53
|
+
# Gem::Specification.new do |spec|
|
54
|
+
# spec.metadata['rubygems_mfa_required'] = 'false'
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# # good
|
58
|
+
# Gem::Specification.new do |spec|
|
59
|
+
# spec.metadata['rubygems_mfa_required'] = 'true'
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
class RequireMFA < Base
|
63
|
+
include GemspecHelp
|
64
|
+
extend AutoCorrector
|
65
|
+
|
66
|
+
MSG = "`metadata['rubygems_mfa_required']` must be set to `'true'`."
|
67
|
+
|
68
|
+
# @!method metadata(node)
|
69
|
+
def_node_matcher :metadata, <<~PATTERN
|
70
|
+
`{
|
71
|
+
(send _ :metadata= $_)
|
72
|
+
(send (send _ :metadata) :[]= (str "rubygems_mfa_required") $_)
|
73
|
+
}
|
74
|
+
PATTERN
|
75
|
+
|
76
|
+
# @!method rubygems_mfa_required(node)
|
77
|
+
def_node_search :rubygems_mfa_required, <<~PATTERN
|
78
|
+
(pair (str "rubygems_mfa_required") $_)
|
79
|
+
PATTERN
|
80
|
+
|
81
|
+
# @!method true_string?(node)
|
82
|
+
def_node_matcher :true_string?, <<~PATTERN
|
83
|
+
(str "true")
|
84
|
+
PATTERN
|
85
|
+
|
86
|
+
def on_block(node) # rubocop:disable Metrics/MethodLength
|
87
|
+
gem_specification(node) do |block_var|
|
88
|
+
metadata_value = metadata(node)
|
89
|
+
mfa_value = mfa_value(metadata_value)
|
90
|
+
|
91
|
+
if mfa_value
|
92
|
+
unless true_string?(mfa_value)
|
93
|
+
add_offense(mfa_value) do |corrector|
|
94
|
+
change_value(corrector, mfa_value)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
else
|
98
|
+
add_offense(node) do |corrector|
|
99
|
+
autocorrect(corrector, node, block_var, metadata_value)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def mfa_value(metadata_value)
|
108
|
+
return unless metadata_value
|
109
|
+
return metadata_value if metadata_value.str_type?
|
110
|
+
|
111
|
+
rubygems_mfa_required(metadata_value).first
|
112
|
+
end
|
113
|
+
|
114
|
+
def autocorrect(corrector, node, block_var, metadata)
|
115
|
+
if metadata
|
116
|
+
return unless metadata.hash_type?
|
117
|
+
|
118
|
+
correct_metadata(corrector, metadata)
|
119
|
+
else
|
120
|
+
correct_missing_metadata(corrector, node, block_var)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def correct_metadata(corrector, metadata)
|
125
|
+
if metadata.pairs.any?
|
126
|
+
corrector.insert_after(metadata.pairs.last, ",\n'rubygems_mfa_required' => 'true'")
|
127
|
+
else
|
128
|
+
corrector.insert_before(metadata.loc.end, "'rubygems_mfa_required' => 'true'")
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def correct_missing_metadata(corrector, node, block_var)
|
133
|
+
corrector.insert_before(node.loc.end, <<~RUBY)
|
134
|
+
#{block_var}.metadata = {
|
135
|
+
'rubygems_mfa_required' => 'true'
|
136
|
+
}
|
137
|
+
RUBY
|
138
|
+
end
|
139
|
+
|
140
|
+
def change_value(corrector, value)
|
141
|
+
corrector.replace(value, "'true'")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -26,20 +26,13 @@ module RuboCop
|
|
26
26
|
# end
|
27
27
|
#
|
28
28
|
class RubyVersionGlobalsUsage < Base
|
29
|
+
include GemspecHelp
|
30
|
+
|
29
31
|
MSG = 'Do not use `RUBY_VERSION` in gemspec file.'
|
30
32
|
|
31
33
|
# @!method ruby_version?(node)
|
32
34
|
def_node_matcher :ruby_version?, '(const {cbase nil?} :RUBY_VERSION)'
|
33
35
|
|
34
|
-
# @!method gem_specification?(node)
|
35
|
-
def_node_search :gem_specification?, <<~PATTERN
|
36
|
-
(block
|
37
|
-
(send
|
38
|
-
(const
|
39
|
-
(const {cbase nil?} :Gem) :Specification) :new)
|
40
|
-
...)
|
41
|
-
PATTERN
|
42
|
-
|
43
36
|
def on_const(node)
|
44
37
|
return unless gem_spec_with_ruby_version?(node)
|
45
38
|
|
@@ -49,7 +42,7 @@ module RuboCop
|
|
49
42
|
private
|
50
43
|
|
51
44
|
def gem_spec_with_ruby_version?(node)
|
52
|
-
gem_specification
|
45
|
+
gem_specification(processed_source.ast) && ruby_version?(node)
|
53
46
|
end
|
54
47
|
end
|
55
48
|
end
|
@@ -150,7 +150,7 @@ module RuboCop
|
|
150
150
|
1. Modify the description of #{badge} in config/default.yml
|
151
151
|
2. Implement your new cop in the generated file!
|
152
152
|
3. Commit your new cop with a message such as
|
153
|
-
e.g. "Add new `#{badge}` cop
|
153
|
+
e.g. "Add new `#{badge}` cop"
|
154
154
|
4. Run `bundle exec rake changelog:new` to generate a changelog entry
|
155
155
|
for your new cop.
|
156
156
|
TODO
|
@@ -77,13 +77,34 @@ module RuboCop
|
|
77
77
|
# def b
|
78
78
|
# end
|
79
79
|
#
|
80
|
-
# @example AllowAdjacentOneLineDefs: true
|
80
|
+
# @example AllowAdjacentOneLineDefs: true (default)
|
81
81
|
#
|
82
82
|
# # good
|
83
83
|
# class ErrorA < BaseError; end
|
84
84
|
# class ErrorB < BaseError; end
|
85
85
|
# class ErrorC < BaseError; end
|
86
86
|
#
|
87
|
+
# # good
|
88
|
+
# class ErrorA < BaseError; end
|
89
|
+
#
|
90
|
+
# class ErrorB < BaseError; end
|
91
|
+
#
|
92
|
+
# class ErrorC < BaseError; end
|
93
|
+
#
|
94
|
+
# @example AllowAdjacentOneLineDefs: false
|
95
|
+
#
|
96
|
+
# # bad
|
97
|
+
# class ErrorA < BaseError; end
|
98
|
+
# class ErrorB < BaseError; end
|
99
|
+
# class ErrorC < BaseError; end
|
100
|
+
#
|
101
|
+
# # good
|
102
|
+
# class ErrorA < BaseError; end
|
103
|
+
#
|
104
|
+
# class ErrorB < BaseError; end
|
105
|
+
#
|
106
|
+
# class ErrorC < BaseError; end
|
107
|
+
#
|
87
108
|
class EmptyLineBetweenDefs < Base
|
88
109
|
include RangeHelp
|
89
110
|
extend AutoCorrector
|
@@ -30,15 +30,17 @@ module RuboCop
|
|
30
30
|
def on_send(node)
|
31
31
|
return unless arrow_lambda_with_args?(node)
|
32
32
|
|
33
|
-
lambda_node = range_of_offense(node)
|
34
|
-
|
35
33
|
if style == :require_space && !space_after_arrow?(node)
|
34
|
+
lambda_node = range_of_offense(node)
|
35
|
+
|
36
36
|
add_offense(lambda_node, message: MSG_REQUIRE_SPACE) do |corrector|
|
37
|
-
corrector.insert_before(node
|
37
|
+
corrector.insert_before(lambda_arguments(node), ' ')
|
38
38
|
end
|
39
39
|
elsif style == :require_no_space && space_after_arrow?(node)
|
40
|
-
|
41
|
-
|
40
|
+
space = space_after_arrow(node)
|
41
|
+
|
42
|
+
add_offense(space, message: MSG_REQUIRE_NO_SPACE) do |corrector|
|
43
|
+
corrector.remove(space)
|
42
44
|
end
|
43
45
|
end
|
44
46
|
end
|
@@ -66,6 +68,10 @@ module RuboCop
|
|
66
68
|
node.parent.arguments.loc.expression.end_pos
|
67
69
|
)
|
68
70
|
end
|
71
|
+
|
72
|
+
def lambda_arguments(node)
|
73
|
+
node.parent.children[1]
|
74
|
+
end
|
69
75
|
end
|
70
76
|
end
|
71
77
|
end
|
@@ -8,7 +8,7 @@ module RuboCop
|
|
8
8
|
# Ranges have quite low precedence, which leads to unexpected behaviour when
|
9
9
|
# using a range with other operators. This cop avoids that by making ranges
|
10
10
|
# explicit by requiring parenthesis around complex range boundaries (anything
|
11
|
-
# that is not a
|
11
|
+
# that is not a literal: numerics, strings, symbols, etc.).
|
12
12
|
#
|
13
13
|
# This cop can be configured with `RequireParenthesesForMethodChains` in order to
|
14
14
|
# specify whether method chains (including `self.foo`) should be wrapped in parens
|
@@ -81,7 +81,7 @@ module RuboCop
|
|
81
81
|
|
82
82
|
def acceptable?(node)
|
83
83
|
node.begin_type? ||
|
84
|
-
node.
|
84
|
+
node.literal? ||
|
85
85
|
node.variable? || node.const_type? || node.self_type? ||
|
86
86
|
(node.call_type? && acceptable_call?(node))
|
87
87
|
end
|
@@ -30,6 +30,7 @@ module RuboCop
|
|
30
30
|
# '10'.to_i
|
31
31
|
# '10.2'.to_f
|
32
32
|
# '10'.to_c
|
33
|
+
# '1/3'.to_r
|
33
34
|
# ['1', '2', '3'].map(&:to_i)
|
34
35
|
# foo.try(:to_f)
|
35
36
|
# bar.send(:to_c)
|
@@ -39,6 +40,7 @@ module RuboCop
|
|
39
40
|
# Integer('10', 10)
|
40
41
|
# Float('10.2')
|
41
42
|
# Complex('10')
|
43
|
+
# Rational('1/3')
|
42
44
|
# ['1', '2', '3'].map { |i| Integer(i, 10) }
|
43
45
|
# foo.try { |i| Float(i) }
|
44
46
|
# bar.send { |i| Complex(i) }
|
@@ -59,13 +61,14 @@ module RuboCop
|
|
59
61
|
CONVERSION_METHOD_CLASS_MAPPING = {
|
60
62
|
to_i: "#{Integer.name}(%<number_object>s, 10)",
|
61
63
|
to_f: "#{Float.name}(%<number_object>s)",
|
62
|
-
to_c: "#{Complex.name}(%<number_object>s)"
|
64
|
+
to_c: "#{Complex.name}(%<number_object>s)",
|
65
|
+
to_r: "#{Rational.name}(%<number_object>s)"
|
63
66
|
}.freeze
|
64
67
|
MSG = 'Replace unsafe number conversion with number '\
|
65
68
|
'class parsing, instead of using '\
|
66
69
|
'`%<current>s`, use stricter '\
|
67
70
|
'`%<corrected_method>s`.'
|
68
|
-
CONVERSION_METHODS = %i[Integer Float Complex to_i to_f to_c].freeze
|
71
|
+
CONVERSION_METHODS = %i[Integer Float Complex Rational to_i to_f to_c to_r].freeze
|
69
72
|
METHODS = CONVERSION_METHOD_CLASS_MAPPING.keys.map(&:inspect).join(' ')
|
70
73
|
|
71
74
|
# @!method to_method(node)
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop looks for `ruby2_keywords` calls for methods that do not need it.
|
7
|
+
#
|
8
|
+
# `ruby2_keywords` should only be called on methods that accept an argument splat
|
9
|
+
# (`*args`) but do not explicit keyword arguments (`k:` or `k: true`) or
|
10
|
+
# a keyword splat (`**kwargs`).
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# # good (splat argument without keyword arguments)
|
14
|
+
# ruby2_keywords def foo(*args); end
|
15
|
+
#
|
16
|
+
# # bad (no arguments)
|
17
|
+
# ruby2_keywords def foo; end
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# def foo; end
|
21
|
+
#
|
22
|
+
# # bad (positional argument)
|
23
|
+
# ruby2_keywords def foo(arg); end
|
24
|
+
#
|
25
|
+
# # good
|
26
|
+
# def foo(arg); end
|
27
|
+
#
|
28
|
+
# # bad (double splatted argument)
|
29
|
+
# ruby2_keywords def foo(**args); end
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# def foo(**args); end
|
33
|
+
#
|
34
|
+
# # bad (keyword arguments)
|
35
|
+
# ruby2_keywords def foo(i:, j:); end
|
36
|
+
#
|
37
|
+
# # good
|
38
|
+
# def foo(i:, j:); end
|
39
|
+
#
|
40
|
+
# # bad (splat argument with keyword arguments)
|
41
|
+
# ruby2_keywords def foo(*args, i:, j:); end
|
42
|
+
#
|
43
|
+
# # good
|
44
|
+
# def foo(*args, i:, j:); end
|
45
|
+
#
|
46
|
+
# # bad (splat argument with double splat)
|
47
|
+
# ruby2_keywords def foo(*args, **kwargs); end
|
48
|
+
#
|
49
|
+
# # good
|
50
|
+
# def foo(*args, **kwargs); end
|
51
|
+
#
|
52
|
+
# # bad (ruby2_keywords given a symbol)
|
53
|
+
# def foo; end
|
54
|
+
# ruby2_keywords :foo
|
55
|
+
#
|
56
|
+
# # good
|
57
|
+
# def foo; end
|
58
|
+
#
|
59
|
+
# # bad (ruby2_keywords with dynamic method)
|
60
|
+
# define_method(:foo) { |arg| }
|
61
|
+
# ruby2_keywords :foo
|
62
|
+
#
|
63
|
+
# # good
|
64
|
+
# define_method(:foo) { |arg| }
|
65
|
+
#
|
66
|
+
class UselessRuby2Keywords < Base
|
67
|
+
MSG = '`ruby2_keywords` is unnecessary for method `%<method_name>s`.'
|
68
|
+
RESTRICT_ON_SEND = %i[ruby2_keywords].freeze
|
69
|
+
|
70
|
+
# Looks for statically or dynamically defined methods with a given name
|
71
|
+
# @!method method_definition(node, method_name)
|
72
|
+
def_node_matcher :method_definition, <<~PATTERN
|
73
|
+
{
|
74
|
+
(def %1 ...)
|
75
|
+
({block numblock} (send _ :define_method (sym %1)) ...)
|
76
|
+
}
|
77
|
+
PATTERN
|
78
|
+
|
79
|
+
def on_send(node)
|
80
|
+
if node.first_argument.def_type?
|
81
|
+
inspect_def(node, node.first_argument)
|
82
|
+
elsif node.first_argument.sym_type?
|
83
|
+
inspect_sym(node, node.first_argument)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def inspect_def(node, def_node)
|
90
|
+
return if allowed_arguments(def_node.arguments)
|
91
|
+
|
92
|
+
add_offense(node.loc.selector, message: format(MSG, method_name: def_node.method_name))
|
93
|
+
end
|
94
|
+
|
95
|
+
def inspect_sym(node, sym_node)
|
96
|
+
return unless node.parent
|
97
|
+
|
98
|
+
method_name = sym_node.value
|
99
|
+
definition = node.parent.each_child_node.detect { |n| method_definition(n, method_name) }
|
100
|
+
|
101
|
+
return unless definition
|
102
|
+
return if allowed_arguments(definition.arguments)
|
103
|
+
|
104
|
+
add_offense(node, message: format(MSG, method_name: method_name))
|
105
|
+
end
|
106
|
+
|
107
|
+
# `ruby2_keywords` is only allowed if there's a `restarg` and no keyword arguments
|
108
|
+
def allowed_arguments(arguments)
|
109
|
+
return false if arguments.empty?
|
110
|
+
|
111
|
+
arguments.each_child_node(:restarg).any? &&
|
112
|
+
arguments.each_child_node(:kwarg, :kwoptarg, :kwrestarg).none?
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
# as they add less complexity than positional or optional parameters.
|
11
11
|
#
|
12
12
|
# NOTE: Explicit block argument `&block` is not counted to prevent
|
13
|
-
#
|
13
|
+
# erroneous change that is avoided by making block argument implicit.
|
14
14
|
#
|
15
15
|
# @example Max: 3
|
16
16
|
# # good
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# Common functionality for checking gem declarations.
|
6
|
+
module GemspecHelp
|
7
|
+
extend NodePattern::Macros
|
8
|
+
|
9
|
+
# @!method gem_specification?(node)
|
10
|
+
def_node_matcher :gem_specification?, <<~PATTERN
|
11
|
+
(block
|
12
|
+
(send
|
13
|
+
(const
|
14
|
+
(const {cbase nil?} :Gem) :Specification) :new)
|
15
|
+
(args
|
16
|
+
(arg $_)) ...)
|
17
|
+
PATTERN
|
18
|
+
|
19
|
+
# @!method gem_specification(node)
|
20
|
+
def_node_search :gem_specification, <<~PATTERN
|
21
|
+
(block
|
22
|
+
(send
|
23
|
+
(const
|
24
|
+
(const {cbase nil?} :Gem) :Specification) :new)
|
25
|
+
(args
|
26
|
+
(arg $_)) ...)
|
27
|
+
PATTERN
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -13,11 +13,7 @@ module RuboCop
|
|
13
13
|
if style == :single_quotes
|
14
14
|
!double_quotes_required?(src)
|
15
15
|
else
|
16
|
-
|
17
|
-
# 1. It contains a double quote
|
18
|
-
# 2. It contains text that would become an escape sequence with double quotes
|
19
|
-
# 3. It contains text that would become an interpolation with double quotes
|
20
|
-
!/" | (?<!\\)\\[aAbcdefkMnprsStuUxzZ0-7] | \#[@{$]/x.match?(src)
|
16
|
+
!/" | \\[^'\\] | \#[@{$]/x.match?(src)
|
21
17
|
end
|
22
18
|
end
|
23
19
|
end
|
@@ -14,6 +14,18 @@ module RuboCop
|
|
14
14
|
# (i.e. `bundler-console` becomes `Bundler::Console`). As such, the
|
15
15
|
# gemspec is supposed to be named `bundler-console.gemspec`.
|
16
16
|
#
|
17
|
+
# When `ExpectMatchingDefinition` (default: `false`) is `true`, the cop requires
|
18
|
+
# each file to have a class, module or `Struct` defined in it that matches
|
19
|
+
# the filename. This can be further configured using
|
20
|
+
# `CheckDefinitionPathHierarchy` (default: `true`) to determine whether the
|
21
|
+
# path should match the namespace of the above definition.
|
22
|
+
#
|
23
|
+
# When `IgnoreExecutableScripts` (default: `true`) is `true`, files that start
|
24
|
+
# with a shebang line are not considered by the cop.
|
25
|
+
#
|
26
|
+
# When `Regex` is set, the cop will flag any filename that does not match
|
27
|
+
# the regular expression.
|
28
|
+
#
|
17
29
|
# @example
|
18
30
|
# # bad
|
19
31
|
# lib/layoutManager.rb
|
@@ -28,11 +40,19 @@ module RuboCop
|
|
28
40
|
include RangeHelp
|
29
41
|
|
30
42
|
MSG_SNAKE_CASE = 'The name of this source file (`%<basename>s`) should use snake_case.'
|
31
|
-
MSG_NO_DEFINITION = '
|
43
|
+
MSG_NO_DEFINITION = '`%<basename>s` should define a class or module called `%<namespace>s`.'
|
32
44
|
MSG_REGEX = '`%<basename>s` should match `%<regex>s`.'
|
33
45
|
|
34
46
|
SNAKE_CASE = /^[\d[[:lower:]]_.?!]+$/.freeze
|
35
47
|
|
48
|
+
# @!method struct_definition(node)
|
49
|
+
def_node_matcher :struct_definition, <<~PATTERN
|
50
|
+
{
|
51
|
+
(casgn $_ $_ (send (const {nil? cbase} :Struct) :new ...))
|
52
|
+
(casgn $_ $_ (block (send (const {nil? cbase} :Struct) :new ...) ...))
|
53
|
+
}
|
54
|
+
PATTERN
|
55
|
+
|
36
56
|
def on_new_investigation
|
37
57
|
file_path = processed_source.file_path
|
38
58
|
return if config.file_to_exclude?(file_path) || config.allowed_camel_case_file?(file_path)
|
@@ -103,6 +123,10 @@ module RuboCop
|
|
103
123
|
cop_config['CheckDefinitionPathHierarchy']
|
104
124
|
end
|
105
125
|
|
126
|
+
def definition_path_hierarchy_roots
|
127
|
+
cop_config['CheckDefinitionPathHierarchyRoots'] || []
|
128
|
+
end
|
129
|
+
|
106
130
|
def regex
|
107
131
|
cop_config['Regex']
|
108
132
|
end
|
@@ -126,7 +150,7 @@ module RuboCop
|
|
126
150
|
name = namespace.pop
|
127
151
|
|
128
152
|
on_node(%i[class module casgn], node) do |child|
|
129
|
-
next unless (const = child
|
153
|
+
next unless (const = find_definition(child))
|
130
154
|
|
131
155
|
const_namespace, const_name = *const
|
132
156
|
next if name != const_name && !match_acronym?(name, const_name)
|
@@ -138,6 +162,15 @@ module RuboCop
|
|
138
162
|
nil
|
139
163
|
end
|
140
164
|
|
165
|
+
def find_definition(node)
|
166
|
+
node.defined_module || defined_struct(node)
|
167
|
+
end
|
168
|
+
|
169
|
+
def defined_struct(node)
|
170
|
+
namespace, name = *struct_definition(node)
|
171
|
+
s(:const, namespace, name) if name
|
172
|
+
end
|
173
|
+
|
141
174
|
def match_namespace(node, namespace, expected)
|
142
175
|
match_partial = partial_matcher!(expected)
|
143
176
|
|
@@ -177,13 +210,13 @@ module RuboCop
|
|
177
210
|
allowed_acronyms.any? { |acronym| expected.gsub(acronym.capitalize, acronym) == name }
|
178
211
|
end
|
179
212
|
|
180
|
-
def to_namespace(path)
|
213
|
+
def to_namespace(path) # rubocop:disable Metrics/AbcSize
|
181
214
|
components = Pathname(path).each_filename.to_a
|
182
215
|
# To convert a pathname to a Ruby namespace, we need a starting point
|
183
216
|
# But RC can be run from any working directory, and can check any path
|
184
217
|
# We can't assume that the working directory, or any other, is the
|
185
218
|
# "starting point" to build a namespace.
|
186
|
-
start =
|
219
|
+
start = definition_path_hierarchy_roots
|
187
220
|
start_index = nil
|
188
221
|
|
189
222
|
# To find the closest namespace root take the path components, and
|
@@ -102,7 +102,8 @@ module RuboCop
|
|
102
102
|
end
|
103
103
|
|
104
104
|
def use_ignored_method?(node)
|
105
|
-
|
105
|
+
send_parent = node.each_ancestor(:send).first
|
106
|
+
send_parent && ignored_method?(send_parent.method_name)
|
106
107
|
end
|
107
108
|
|
108
109
|
def unannotated_format?(node, detected_style)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop flags uses of OpenStruct, as it is now officially discouraged
|
7
|
+
# to be used for performance, version compatibility, and potential security issues.
|
8
|
+
#
|
9
|
+
# @safety
|
10
|
+
#
|
11
|
+
# Note that this cop may flag false positives; for instance, the following legal
|
12
|
+
# use of a hand-rolled `OpenStruct` type would be considered an offense:
|
13
|
+
#
|
14
|
+
# ```
|
15
|
+
# module MyNamespace
|
16
|
+
# class OpenStruct # not the OpenStruct we're looking for
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# def new_struct
|
20
|
+
# OpenStruct.new # resolves to MyNamespace::OpenStruct
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
# ```
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
#
|
27
|
+
# # bad
|
28
|
+
# point = OpenStruct.new(x: 0, y: 1)
|
29
|
+
#
|
30
|
+
# # good
|
31
|
+
# Point = Struct.new(:x, :y)
|
32
|
+
# point = Point.new(0, 1)
|
33
|
+
#
|
34
|
+
# # also good
|
35
|
+
# point = { x: 0, y: 1 }
|
36
|
+
#
|
37
|
+
# # bad
|
38
|
+
# test_double = OpenStruct.new(a: 'b')
|
39
|
+
#
|
40
|
+
# # good (assumes test using rspec-mocks)
|
41
|
+
# test_double = double
|
42
|
+
# allow(test_double).to receive(:a).and_return('b')
|
43
|
+
#
|
44
|
+
class OpenStructUse < Base
|
45
|
+
MSG = 'Avoid using `OpenStruct`; use `Struct`, `Hash`, a class or test doubles instead.'
|
46
|
+
|
47
|
+
# @!method uses_open_struct?(node)
|
48
|
+
def_node_matcher :uses_open_struct?, <<-PATTERN
|
49
|
+
(const {nil? (cbase)} :OpenStruct)
|
50
|
+
PATTERN
|
51
|
+
|
52
|
+
def on_const(node)
|
53
|
+
return unless uses_open_struct?(node)
|
54
|
+
return if custom_class_or_module_definition?(node)
|
55
|
+
|
56
|
+
add_offense(node)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def custom_class_or_module_definition?(node)
|
62
|
+
parent = node.parent
|
63
|
+
|
64
|
+
(parent.class_type? || parent.module_type?) && node.left_siblings.empty?
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -56,6 +56,7 @@ module RuboCop
|
|
56
56
|
class ParenthesesAroundCondition < Base
|
57
57
|
include SafeAssignment
|
58
58
|
include Parentheses
|
59
|
+
include RangeHelp
|
59
60
|
extend AutoCorrector
|
60
61
|
|
61
62
|
def on_if(node)
|
@@ -73,13 +74,14 @@ module RuboCop
|
|
73
74
|
|
74
75
|
# @!method control_op_condition(node)
|
75
76
|
def_node_matcher :control_op_condition, <<~PATTERN
|
76
|
-
(begin $_
|
77
|
+
(begin $_ $...)
|
77
78
|
PATTERN
|
78
79
|
|
79
80
|
def process_control_op(node)
|
80
81
|
cond = node.condition
|
81
82
|
|
82
|
-
control_op_condition(cond) do |first_child|
|
83
|
+
control_op_condition(cond) do |first_child, rest_children|
|
84
|
+
return if semicolon_separated_expressions?(first_child, rest_children)
|
83
85
|
return if modifier_op?(first_child)
|
84
86
|
return if parens_allowed?(cond)
|
85
87
|
|
@@ -90,6 +92,14 @@ module RuboCop
|
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
95
|
+
def semicolon_separated_expressions?(first_exp, rest_exps)
|
96
|
+
return false unless (second_exp = rest_exps.first)
|
97
|
+
|
98
|
+
range = range_between(first_exp.source_range.end_pos, second_exp.source_range.begin_pos)
|
99
|
+
|
100
|
+
range.source.include?(';')
|
101
|
+
end
|
102
|
+
|
93
103
|
def modifier_op?(node)
|
94
104
|
return false if node.if_type? && node.ternary?
|
95
105
|
return true if node.rescue_type?
|
@@ -46,7 +46,7 @@ module RuboCop
|
|
46
46
|
|
47
47
|
message = style == :single_quotes ? MSG_SINGLE : MSG_DOUBLE
|
48
48
|
|
49
|
-
if wrong_quotes?(node)
|
49
|
+
if wrong_quotes?(node) || invalid_double_quotes?(node.source)
|
50
50
|
add_offense(node, message: message) do |corrector|
|
51
51
|
opposite_style_detected
|
52
52
|
autocorrect(corrector, node)
|
@@ -58,6 +58,16 @@ module RuboCop
|
|
58
58
|
|
59
59
|
private
|
60
60
|
|
61
|
+
def invalid_double_quotes?(source)
|
62
|
+
return false unless style == :double_quotes
|
63
|
+
|
64
|
+
# The string needs single quotes if:
|
65
|
+
# 1. It contains a double quote
|
66
|
+
# 2. It contains text that would become an escape sequence with double quotes
|
67
|
+
# 3. It contains text that would become an interpolation with double quotes
|
68
|
+
!/" | (?<!\\)\\[aAbcdefkMnprsStuUxzZ0-7] | \#[@{$]/x.match?(source)
|
69
|
+
end
|
70
|
+
|
61
71
|
def autocorrect(corrector, node)
|
62
72
|
str = if hash_colon_key?(node)
|
63
73
|
# strip quotes
|
@@ -23,12 +23,15 @@ module RuboCop
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
Summary = Struct.new(:offense_count, :inspected_files, :target_files, keyword_init: true)
|
27
|
+
FileOffenses = Struct.new(:path, :offenses, keyword_init: true)
|
28
|
+
|
26
29
|
attr_reader :files, :summary
|
27
30
|
|
28
31
|
def initialize(output, options = {})
|
29
32
|
super
|
30
33
|
@files = []
|
31
|
-
@summary =
|
34
|
+
@summary = Summary.new(offense_count: 0)
|
32
35
|
end
|
33
36
|
|
34
37
|
def started(target_files)
|
@@ -36,7 +39,7 @@ module RuboCop
|
|
36
39
|
end
|
37
40
|
|
38
41
|
def file_finished(file, offenses)
|
39
|
-
files <<
|
42
|
+
files << FileOffenses.new(path: file, offenses: offenses)
|
40
43
|
summary.offense_count += offenses.count
|
41
44
|
end
|
42
45
|
|
@@ -59,12 +59,15 @@ module RuboCop
|
|
59
59
|
end
|
60
60
|
|
61
61
|
# TODO: Consider better solution for Offense#real_column.
|
62
|
+
# The minimum value of `start_column: real_column` is 1.
|
63
|
+
# So, the minimum value of `last_column` should be 1.
|
64
|
+
# And non-zero value of `last_column` should be used as is.
|
62
65
|
def hash_for_location(offense)
|
63
66
|
{
|
64
67
|
start_line: offense.line,
|
65
68
|
start_column: offense.real_column,
|
66
69
|
last_line: offense.last_line,
|
67
|
-
last_column: offense.last_column,
|
70
|
+
last_column: offense.last_column.zero? ? 1 : offense.last_column,
|
68
71
|
length: offense.location.length,
|
69
72
|
# `line` and `column` exist for compatibility.
|
70
73
|
# Use `start_line` and `start_column` instead.
|
data/lib/rubocop/version.rb
CHANGED
@@ -23,7 +23,7 @@ module RuboCop
|
|
23
23
|
when Psych::Nodes::Mapping
|
24
24
|
tree.children.each_slice(2).with_object([]) do |(key, value), keys|
|
25
25
|
exist = keys.find { |key2| key2.value == key.value }
|
26
|
-
|
26
|
+
yield(exist, key) if exist
|
27
27
|
keys << key
|
28
28
|
traverse(value, &on_duplicated)
|
29
29
|
end
|
data/lib/rubocop.rb
CHANGED
@@ -83,6 +83,7 @@ require_relative 'rubocop/cop/mixin/enforce_superclass'
|
|
83
83
|
require_relative 'rubocop/cop/mixin/first_element_line_break'
|
84
84
|
require_relative 'rubocop/cop/mixin/frozen_string_literal'
|
85
85
|
require_relative 'rubocop/cop/mixin/gem_declaration'
|
86
|
+
require_relative 'rubocop/cop/mixin/gemspec_help'
|
86
87
|
require_relative 'rubocop/cop/mixin/hash_alignment_styles'
|
87
88
|
require_relative 'rubocop/cop/mixin/hash_transform_method'
|
88
89
|
require_relative 'rubocop/cop/mixin/ignored_pattern'
|
@@ -160,6 +161,7 @@ require_relative 'rubocop/cop/bundler/ordered_gems'
|
|
160
161
|
require_relative 'rubocop/cop/gemspec/date_assignment'
|
161
162
|
require_relative 'rubocop/cop/gemspec/duplicated_assignment'
|
162
163
|
require_relative 'rubocop/cop/gemspec/ordered_dependencies'
|
164
|
+
require_relative 'rubocop/cop/gemspec/require_mfa'
|
163
165
|
require_relative 'rubocop/cop/gemspec/required_ruby_version'
|
164
166
|
require_relative 'rubocop/cop/gemspec/ruby_version_globals_usage'
|
165
167
|
|
@@ -382,6 +384,7 @@ require_relative 'rubocop/cop/lint/useless_access_modifier'
|
|
382
384
|
require_relative 'rubocop/cop/lint/useless_assignment'
|
383
385
|
require_relative 'rubocop/cop/lint/useless_else_without_rescue'
|
384
386
|
require_relative 'rubocop/cop/lint/useless_method_definition'
|
387
|
+
require_relative 'rubocop/cop/lint/useless_ruby2_keywords'
|
385
388
|
require_relative 'rubocop/cop/lint/useless_setter_call'
|
386
389
|
require_relative 'rubocop/cop/lint/useless_times'
|
387
390
|
require_relative 'rubocop/cop/lint/void'
|
@@ -514,6 +517,7 @@ require_relative 'rubocop/cop/style/method_call_without_args_parentheses'
|
|
514
517
|
require_relative 'rubocop/cop/style/method_call_with_args_parentheses'
|
515
518
|
require_relative 'rubocop/cop/style/multiline_in_pattern_then'
|
516
519
|
require_relative 'rubocop/cop/style/numbered_parameters'
|
520
|
+
require_relative 'rubocop/cop/style/open_struct_use'
|
517
521
|
require_relative 'rubocop/cop/style/redundant_assignment'
|
518
522
|
require_relative 'rubocop/cop/style/redundant_fetch_block'
|
519
523
|
require_relative 'rubocop/cop/style/redundant_file_extension_in_require'
|
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.
|
4
|
+
version: 1.23.0
|
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: 2021-
|
13
|
+
date: 2021-11-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: parallel
|
@@ -250,6 +250,7 @@ files:
|
|
250
250
|
- lib/rubocop/cop/gemspec/date_assignment.rb
|
251
251
|
- lib/rubocop/cop/gemspec/duplicated_assignment.rb
|
252
252
|
- lib/rubocop/cop/gemspec/ordered_dependencies.rb
|
253
|
+
- lib/rubocop/cop/gemspec/require_mfa.rb
|
253
254
|
- lib/rubocop/cop/gemspec/required_ruby_version.rb
|
254
255
|
- lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb
|
255
256
|
- lib/rubocop/cop/generator.rb
|
@@ -493,6 +494,7 @@ files:
|
|
493
494
|
- lib/rubocop/cop/lint/useless_assignment.rb
|
494
495
|
- lib/rubocop/cop/lint/useless_else_without_rescue.rb
|
495
496
|
- lib/rubocop/cop/lint/useless_method_definition.rb
|
497
|
+
- lib/rubocop/cop/lint/useless_ruby2_keywords.rb
|
496
498
|
- lib/rubocop/cop/lint/useless_setter_call.rb
|
497
499
|
- lib/rubocop/cop/lint/useless_times.rb
|
498
500
|
- lib/rubocop/cop/lint/void.rb
|
@@ -538,6 +540,7 @@ files:
|
|
538
540
|
- lib/rubocop/cop/mixin/first_element_line_break.rb
|
539
541
|
- lib/rubocop/cop/mixin/frozen_string_literal.rb
|
540
542
|
- lib/rubocop/cop/mixin/gem_declaration.rb
|
543
|
+
- lib/rubocop/cop/mixin/gemspec_help.rb
|
541
544
|
- lib/rubocop/cop/mixin/hash_alignment_styles.rb
|
542
545
|
- lib/rubocop/cop/mixin/hash_transform_method.rb
|
543
546
|
- lib/rubocop/cop/mixin/heredoc.rb
|
@@ -740,6 +743,7 @@ files:
|
|
740
743
|
- lib/rubocop/cop/style/numeric_literals.rb
|
741
744
|
- lib/rubocop/cop/style/numeric_predicate.rb
|
742
745
|
- lib/rubocop/cop/style/one_line_conditional.rb
|
746
|
+
- lib/rubocop/cop/style/open_struct_use.rb
|
743
747
|
- lib/rubocop/cop/style/option_hash.rb
|
744
748
|
- lib/rubocop/cop/style/optional_arguments.rb
|
745
749
|
- lib/rubocop/cop/style/optional_boolean_parameter.rb
|
@@ -899,8 +903,9 @@ metadata:
|
|
899
903
|
homepage_uri: https://rubocop.org/
|
900
904
|
changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
|
901
905
|
source_code_uri: https://github.com/rubocop/rubocop/
|
902
|
-
documentation_uri: https://docs.rubocop.org/rubocop/1.
|
906
|
+
documentation_uri: https://docs.rubocop.org/rubocop/1.23/
|
903
907
|
bug_tracker_uri: https://github.com/rubocop/rubocop/issues
|
908
|
+
rubygems_mfa_required: 'true'
|
904
909
|
post_install_message:
|
905
910
|
rdoc_options: []
|
906
911
|
require_paths:
|