rubocop 1.21.0 → 1.22.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 +43 -6
- data/lib/rubocop/config.rb +5 -0
- data/lib/rubocop/config_loader.rb +2 -0
- data/lib/rubocop/config_validator.rb +9 -1
- data/lib/rubocop/cop/base.rb +1 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +34 -11
- data/lib/rubocop/cop/bundler/ordered_gems.rb +3 -12
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +11 -10
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -12
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
- data/lib/rubocop/cop/generator.rb +14 -8
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +25 -2
- data/lib/rubocop/cop/layout/line_length.rb +7 -5
- data/lib/rubocop/cop/layout/redundant_line_break.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_parens.rb +74 -24
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +5 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +7 -7
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -5
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +18 -5
- data/lib/rubocop/cop/lint/boolean_symbol.rb +5 -0
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +24 -1
- data/lib/rubocop/cop/lint/else_layout.rb +9 -5
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +12 -3
- data/lib/rubocop/cop/lint/interpolation_check.rb +5 -0
- data/lib/rubocop/cop/lint/loop.rb +4 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +5 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +5 -0
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +4 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +17 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +10 -0
- data/lib/rubocop/cop/lint/raise_exception.rb +4 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +5 -4
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +49 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +8 -3
- data/lib/rubocop/cop/lint/useless_method_definition.rb +3 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +7 -4
- data/lib/rubocop/cop/lint/useless_times.rb +3 -2
- data/lib/rubocop/cop/metrics/abc_size.rb +6 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +5 -1
- data/lib/rubocop/cop/mixin/heredoc.rb +1 -3
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +9 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +6 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +5 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +7 -0
- data/lib/rubocop/cop/security/io_methods.rb +49 -0
- data/lib/rubocop/cop/security/json_load.rb +8 -7
- data/lib/rubocop/cop/security/open.rb +4 -0
- data/lib/rubocop/cop/security/yaml_load.rb +4 -0
- data/lib/rubocop/cop/style/and_or.rb +4 -3
- data/lib/rubocop/cop/style/arguments_forwarding.rb +13 -2
- data/lib/rubocop/cop/style/array_coercion.rb +21 -3
- data/lib/rubocop/cop/style/case_like_if.rb +5 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +9 -0
- data/lib/rubocop/cop/style/collection_compact.rb +7 -5
- data/lib/rubocop/cop/style/collection_methods.rb +6 -5
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +4 -1
- data/lib/rubocop/cop/style/date_time.rb +5 -0
- data/lib/rubocop/cop/style/double_negation.rb +15 -5
- data/lib/rubocop/cop/style/float_division.rb +10 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -1
- data/lib/rubocop/cop/style/global_std_stream.rb +4 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -0
- data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -6
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -6
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +18 -16
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +15 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +4 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +9 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +13 -0
- data/lib/rubocop/cop/style/module_function.rb +8 -9
- data/lib/rubocop/cop/style/mutable_constant.rb +12 -7
- data/lib/rubocop/cop/style/numbered_parameters.rb +46 -0
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +50 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +7 -8
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -0
- data/lib/rubocop/cop/style/optional_arguments.rb +4 -0
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +14 -4
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -4
- data/lib/rubocop/cop/style/redundant_argument.rb +14 -7
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +12 -3
- data/lib/rubocop/cop/style/redundant_freeze.rb +0 -1
- data/lib/rubocop/cop/style/redundant_self.rb +10 -0
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -3
- data/lib/rubocop/cop/style/redundant_sort.rb +47 -29
- data/lib/rubocop/cop/style/safe_navigation.rb +13 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +106 -0
- data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
- data/lib/rubocop/cop/style/slicing_with_range.rb +13 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +4 -0
- data/lib/rubocop/cop/style/static_class.rb +4 -3
- data/lib/rubocop/cop/style/string_chars.rb +4 -2
- data/lib/rubocop/cop/style/string_concatenation.rb +4 -0
- data/lib/rubocop/cop/style/string_hash_keys.rb +4 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -2
- data/lib/rubocop/cop/style/swap_values.rb +4 -2
- data/lib/rubocop/cop/style/symbol_proc.rb +26 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +19 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +20 -0
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -0
- data/lib/rubocop/cop/util.rb +2 -2
- data/lib/rubocop/cops_documentation_generator.rb +17 -5
- data/lib/rubocop/options.rb +126 -112
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +5 -0
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08520f6dcf324dcb95ce7191673f070e86c3b5c2613942d19e4c951119a43476'
|
4
|
+
data.tar.gz: 90fd28bb4692e3feb9973d0b711a181c90608b205741b4b68cc23df9a9d42142
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27a14f94b096be10618d7670ff591f4443ab4e09d8fce7f2604e686a1f7ab5544aaf53136c09a6ec62198f9f56950b5ab0c3cea64ee0ccd565e328b7ba131a5d
|
7
|
+
data.tar.gz: 419cf3d94cf235cf31b09d26cbed550937dcb1930797e3e28c97cfb27116b160732aeec5434de8e0c3417f6900bf795c1826d7941e49cf8f12e9a15c245472b4
|
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.22', 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
@@ -130,7 +130,7 @@ AllCops:
|
|
130
130
|
# What MRI version of the Ruby interpreter is the inspected code intended to
|
131
131
|
# run on? (If there is more than one, set this to the lowest version.)
|
132
132
|
# If a value is specified for TargetRubyVersion then it is used. Acceptable
|
133
|
-
# values are
|
133
|
+
# values are specified as a float (i.e. 3.0); the teeny version of Ruby
|
134
134
|
# should not be included. If the project specifies a Ruby version in the
|
135
135
|
# .tool-versions or .ruby-version files, Gemfile or gems.rb file, RuboCop will
|
136
136
|
# try to determine the desired version of Ruby by inspecting the
|
@@ -209,6 +209,7 @@ Bundler/InsecureProtocolSource:
|
|
209
209
|
'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
|
210
210
|
Enabled: true
|
211
211
|
VersionAdded: '0.50'
|
212
|
+
AllowHttpProtocol: true
|
212
213
|
Include:
|
213
214
|
- '**/*.gemfile'
|
214
215
|
- '**/Gemfile'
|
@@ -1360,10 +1361,11 @@ Layout/SpaceInsideParens:
|
|
1360
1361
|
StyleGuide: '#spaces-braces'
|
1361
1362
|
Enabled: true
|
1362
1363
|
VersionAdded: '0.49'
|
1363
|
-
VersionChanged: '
|
1364
|
+
VersionChanged: '1.22'
|
1364
1365
|
EnforcedStyle: no_space
|
1365
1366
|
SupportedStyles:
|
1366
1367
|
- space
|
1368
|
+
- compact
|
1367
1369
|
- no_space
|
1368
1370
|
|
1369
1371
|
Layout/SpaceInsidePercentLiteralDelimiters:
|
@@ -1491,9 +1493,9 @@ Lint/BinaryOperatorWithIdenticalOperands:
|
|
1491
1493
|
Lint/BooleanSymbol:
|
1492
1494
|
Description: 'Check for `:true` and `:false` symbols.'
|
1493
1495
|
Enabled: true
|
1494
|
-
|
1496
|
+
SafeAutoCorrect: false
|
1495
1497
|
VersionAdded: '0.50'
|
1496
|
-
VersionChanged: '
|
1498
|
+
VersionChanged: '1.22'
|
1497
1499
|
|
1498
1500
|
Lint/CircularArgumentReference:
|
1499
1501
|
Description: "Default values in optional keyword arguments and optional ordinal arguments should not refer back to the name of the argument."
|
@@ -2045,6 +2047,11 @@ Lint/RequireParentheses:
|
|
2045
2047
|
Enabled: true
|
2046
2048
|
VersionAdded: '0.18'
|
2047
2049
|
|
2050
|
+
Lint/RequireRelativeSelfPath:
|
2051
|
+
Description: 'Checks for uses a file requiring itself with `require_relative`.'
|
2052
|
+
Enabled: pending
|
2053
|
+
VersionAdded: '1.22'
|
2054
|
+
|
2048
2055
|
Lint/RescueException:
|
2049
2056
|
Description: 'Avoid rescuing the Exception class.'
|
2050
2057
|
StyleGuide: '#no-blind-rescues'
|
@@ -2732,6 +2739,14 @@ Security/Eval:
|
|
2732
2739
|
Enabled: true
|
2733
2740
|
VersionAdded: '0.47'
|
2734
2741
|
|
2742
|
+
Security/IoMethods:
|
2743
|
+
Description: >-
|
2744
|
+
Checks for the first argument to `IO.read`, `IO.binread`, `IO.write`, `IO.binwrite`,
|
2745
|
+
`IO.foreach`, and `IO.readlines`.
|
2746
|
+
Enabled: pending
|
2747
|
+
Safe: false
|
2748
|
+
VersionAdded: '1.22'
|
2749
|
+
|
2735
2750
|
Security/JSONLoad:
|
2736
2751
|
Description: >-
|
2737
2752
|
Prefer usage of `JSON.parse` over `JSON.load` due to potential
|
@@ -3703,7 +3718,7 @@ Style/InPatternThen:
|
|
3703
3718
|
Style/InfiniteLoop:
|
3704
3719
|
Description: >-
|
3705
3720
|
Use Kernel#loop for infinite loops.
|
3706
|
-
This cop is unsafe
|
3721
|
+
This cop is unsafe if the body may raise a `StopIteration` exception.
|
3707
3722
|
Safe: false
|
3708
3723
|
StyleGuide: '#infinite-loop'
|
3709
3724
|
Enabled: true
|
@@ -4129,6 +4144,21 @@ Style/Not:
|
|
4129
4144
|
VersionAdded: '0.9'
|
4130
4145
|
VersionChanged: '0.20'
|
4131
4146
|
|
4147
|
+
Style/NumberedParameters:
|
4148
|
+
Description: 'Restrict the usage of numbered parameters.'
|
4149
|
+
Enabled: pending
|
4150
|
+
VersionAdded: '1.22'
|
4151
|
+
EnforcedStyle: allow_single_line
|
4152
|
+
SupportedStyles:
|
4153
|
+
- allow_single_line
|
4154
|
+
- disallow
|
4155
|
+
|
4156
|
+
Style/NumberedParametersLimit:
|
4157
|
+
Description: 'Avoid excessive numbered params in a single block.'
|
4158
|
+
Enabled: pending
|
4159
|
+
VersionAdded: '1.22'
|
4160
|
+
Max: 1
|
4161
|
+
|
4132
4162
|
Style/NumericLiteralPrefix:
|
4133
4163
|
Description: 'Use smallcase prefixes for numeric literals.'
|
4134
4164
|
StyleGuide: '#numeric-literal-prefixes'
|
@@ -4139,7 +4169,6 @@ Style/NumericLiteralPrefix:
|
|
4139
4169
|
- zero_with_o
|
4140
4170
|
- zero_only
|
4141
4171
|
|
4142
|
-
|
4143
4172
|
Style/NumericLiterals:
|
4144
4173
|
Description: >-
|
4145
4174
|
Add underscores to large numeric literals to improve their
|
@@ -4460,6 +4489,8 @@ Style/RedundantSort:
|
|
4460
4489
|
`max_by` instead of `sort_by...last`, etc.
|
4461
4490
|
Enabled: true
|
4462
4491
|
VersionAdded: '0.76'
|
4492
|
+
VersionChanged: '1.22'
|
4493
|
+
Safe: false
|
4463
4494
|
|
4464
4495
|
Style/RedundantSortBy:
|
4465
4496
|
Description: 'Use `sort` instead of `sort_by { |x| x }`.'
|
@@ -4540,6 +4571,12 @@ Style/Sample:
|
|
4540
4571
|
Enabled: true
|
4541
4572
|
VersionAdded: '0.30'
|
4542
4573
|
|
4574
|
+
Style/SelectByRegexp:
|
4575
|
+
Description: 'Prefer grep/grep_v to select/reject with a regexp match.'
|
4576
|
+
Enabled: pending
|
4577
|
+
SafeAutoCorrect: false
|
4578
|
+
VersionAdded: '1.22'
|
4579
|
+
|
4543
4580
|
Style/SelfAssignment:
|
4544
4581
|
Description: >-
|
4545
4582
|
Checks for places where self-assignment shorthand should have
|
data/lib/rubocop/config.rb
CHANGED
@@ -51,6 +51,11 @@ module RuboCop
|
|
51
51
|
self
|
52
52
|
end
|
53
53
|
|
54
|
+
def validate_after_resolution
|
55
|
+
@validator.validate_after_resolution
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
54
59
|
def_delegators :@hash, :[], :[]=, :delete, :dig, :each, :key?, :keys, :each_key,
|
55
60
|
:fetch, :map, :merge, :replace, :to_h, :to_hash, :transform_values
|
56
61
|
def_delegators :@validator, :validate, :target_ruby_version
|
@@ -101,6 +101,8 @@ module RuboCop
|
|
101
101
|
return default_configuration if config_file == DEFAULT_FILE
|
102
102
|
|
103
103
|
config = load_file(config_file, check: check)
|
104
|
+
config.validate_after_resolution if check
|
105
|
+
|
104
106
|
if ignore_parent_exclusion?
|
105
107
|
print 'Ignoring AllCops/Exclude from parent folders' if debug?
|
106
108
|
else
|
@@ -44,7 +44,6 @@ module RuboCop
|
|
44
44
|
check_obsoletions
|
45
45
|
|
46
46
|
alert_about_unrecognized_cops(invalid_cop_names)
|
47
|
-
check_target_ruby
|
48
47
|
validate_new_cops_parameter
|
49
48
|
validate_parameter_names(valid_cop_names)
|
50
49
|
validate_enforced_styles(valid_cop_names)
|
@@ -52,6 +51,15 @@ module RuboCop
|
|
52
51
|
reject_mutually_exclusive_defaults
|
53
52
|
end
|
54
53
|
|
54
|
+
# Validations that should only be run after all config resolving has
|
55
|
+
# taken place:
|
56
|
+
# * The target ruby version is only checked once the entire inheritance
|
57
|
+
# chain has been loaded so that only the final value is validated, and
|
58
|
+
# any obsolete but overridden values are ignored.
|
59
|
+
def validate_after_resolution
|
60
|
+
check_target_ruby
|
61
|
+
end
|
62
|
+
|
55
63
|
def target_ruby_version
|
56
64
|
target_ruby.version
|
57
65
|
end
|
data/lib/rubocop/cop/base.rb
CHANGED
@@ -24,7 +24,7 @@ module RuboCop
|
|
24
24
|
# `add_global_offense`. Use the `processed_source` method to
|
25
25
|
# get the currently processed source being investigated.
|
26
26
|
#
|
27
|
-
# In case of invalid syntax /
|
27
|
+
# In case of invalid syntax / unparsable content,
|
28
28
|
# the callback `on_other_file` is called instead of all the other
|
29
29
|
# `on_...` callbacks.
|
30
30
|
#
|
@@ -16,6 +16,9 @@ module RuboCop
|
|
16
16
|
# However, you should strongly prefer `https://` where possible, as it is
|
17
17
|
# more secure.
|
18
18
|
#
|
19
|
+
# If you don't allow `http://`, please set `false` to `AllowHttpProtocol`.
|
20
|
+
# This option is `true` by default for safe autocorrection.
|
21
|
+
#
|
19
22
|
# @example
|
20
23
|
# # bad
|
21
24
|
# source :gemcutter
|
@@ -24,8 +27,17 @@ module RuboCop
|
|
24
27
|
#
|
25
28
|
# # good
|
26
29
|
# source 'https://rubygems.org' # strongly recommended
|
30
|
+
#
|
31
|
+
# @example AllowHttpProtocol: true (default)
|
32
|
+
#
|
33
|
+
# # good
|
27
34
|
# source 'http://rubygems.org' # use only if HTTPS is unavailable
|
28
35
|
#
|
36
|
+
# @example AllowHttpProtocol: false
|
37
|
+
#
|
38
|
+
# # bad
|
39
|
+
# source 'http://rubygems.org'
|
40
|
+
#
|
29
41
|
class InsecureProtocolSource < Base
|
30
42
|
include RangeHelp
|
31
43
|
extend AutoCorrector
|
@@ -34,29 +46,40 @@ module RuboCop
|
|
34
46
|
'are insecure. ' \
|
35
47
|
"Please change your source to 'https://rubygems.org' " \
|
36
48
|
"if possible, or 'http://rubygems.org' if not."
|
49
|
+
MSG_HTTP_PROTOCOL = 'Use `https://rubygems.org` instead of `http://rubygems.org`.'
|
37
50
|
|
38
51
|
RESTRICT_ON_SEND = %i[source].freeze
|
39
52
|
|
40
53
|
# @!method insecure_protocol_source?(node)
|
41
54
|
def_node_matcher :insecure_protocol_source?, <<~PATTERN
|
42
55
|
(send nil? :source
|
43
|
-
$(sym
|
56
|
+
${(sym :gemcutter) (sym :rubygems) (sym :rubyforge) (:str "http://rubygems.org")})
|
44
57
|
PATTERN
|
45
58
|
|
46
59
|
def on_send(node)
|
47
|
-
insecure_protocol_source?(node) do |source_node
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
60
|
+
insecure_protocol_source?(node) do |source_node|
|
61
|
+
source = source_node.value
|
62
|
+
use_http_protocol = source == 'http://rubygems.org'
|
63
|
+
|
64
|
+
return if allow_http_protocol? && use_http_protocol
|
65
|
+
|
66
|
+
message = if use_http_protocol
|
67
|
+
MSG_HTTP_PROTOCOL
|
68
|
+
else
|
69
|
+
format(MSG, source: source)
|
70
|
+
end
|
71
|
+
|
72
|
+
add_offense(source_node, message: message) do |corrector|
|
73
|
+
corrector.replace(source_node, "'https://rubygems.org'")
|
57
74
|
end
|
58
75
|
end
|
59
76
|
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def allow_http_protocol?
|
81
|
+
cop_config.fetch('AllowHttpProtocol', true)
|
82
|
+
end
|
60
83
|
end
|
61
84
|
end
|
62
85
|
end
|
@@ -24,15 +24,15 @@ module RuboCop
|
|
24
24
|
# gem 'rubocop'
|
25
25
|
# # For tests
|
26
26
|
# gem 'rspec'
|
27
|
-
class OrderedGems <
|
28
|
-
|
27
|
+
class OrderedGems < Base
|
28
|
+
extend AutoCorrector
|
29
29
|
include OrderedGemNode
|
30
30
|
|
31
31
|
MSG = 'Gems should be sorted in an alphabetical order within their '\
|
32
32
|
'section of the Gemfile. '\
|
33
33
|
'Gem `%<previous>s` should appear before `%<current>s`.'
|
34
34
|
|
35
|
-
def
|
35
|
+
def on_new_investigation
|
36
36
|
return if processed_source.blank?
|
37
37
|
|
38
38
|
gem_declarations(processed_source.ast)
|
@@ -44,15 +44,6 @@ module RuboCop
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def autocorrect(node)
|
48
|
-
OrderedGemCorrector.correct(
|
49
|
-
processed_source,
|
50
|
-
node,
|
51
|
-
previous_declaration(node),
|
52
|
-
treat_comments_as_separators
|
53
|
-
)
|
54
|
-
end
|
55
|
-
|
56
47
|
private
|
57
48
|
|
58
49
|
def previous_declaration(node)
|
@@ -4,9 +4,10 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# This auto-corrects gem dependency order
|
6
6
|
class OrderedGemCorrector
|
7
|
-
extend OrderedGemNode
|
8
|
-
|
9
7
|
class << self
|
8
|
+
include OrderedGemNode
|
9
|
+
include RangeHelp
|
10
|
+
|
10
11
|
attr_reader :processed_source, :comments_as_separators
|
11
12
|
|
12
13
|
def correct(processed_source, node,
|
@@ -17,24 +18,24 @@ module RuboCop
|
|
17
18
|
current_range = declaration_with_comment(node)
|
18
19
|
previous_range = declaration_with_comment(previous_declaration)
|
19
20
|
|
20
|
-
->(corrector)
|
21
|
+
->(corrector) { swap_range(corrector, current_range, previous_range) }
|
21
22
|
end
|
22
23
|
|
23
24
|
private
|
24
25
|
|
25
26
|
def declaration_with_comment(node)
|
26
27
|
buffer = processed_source.buffer
|
27
|
-
begin_pos = get_source_range(node, comments_as_separators).begin_pos
|
28
|
+
begin_pos = range_by_whole_lines(get_source_range(node, comments_as_separators)).begin_pos
|
28
29
|
end_line = buffer.line_for_position(node.loc.expression.end_pos)
|
29
|
-
end_pos = buffer.line_range(end_line)
|
30
|
-
|
30
|
+
end_pos = range_by_whole_lines(buffer.line_range(end_line),
|
31
|
+
include_final_newline: true).end_pos
|
32
|
+
|
33
|
+
range_between(begin_pos, end_pos)
|
31
34
|
end
|
32
35
|
|
33
36
|
def swap_range(corrector, range1, range2)
|
34
|
-
|
35
|
-
|
36
|
-
corrector.replace(range1, src2)
|
37
|
-
corrector.replace(range2, src1)
|
37
|
+
corrector.insert_before(range2, range1.source)
|
38
|
+
corrector.remove(range1)
|
38
39
|
end
|
39
40
|
end
|
40
41
|
end
|
@@ -50,15 +50,15 @@ module RuboCop
|
|
50
50
|
# spec.add_dependency 'rubocop'
|
51
51
|
# # For tests
|
52
52
|
# spec.add_dependency 'rspec'
|
53
|
-
class OrderedDependencies <
|
54
|
-
|
53
|
+
class OrderedDependencies < Base
|
54
|
+
extend AutoCorrector
|
55
55
|
include OrderedGemNode
|
56
56
|
|
57
57
|
MSG = 'Dependencies should be sorted in an alphabetical order within ' \
|
58
58
|
'their section of the gemspec. '\
|
59
59
|
'Dependency `%<previous>s` should appear before `%<current>s`.'
|
60
60
|
|
61
|
-
def
|
61
|
+
def on_new_investigation
|
62
62
|
return if processed_source.blank?
|
63
63
|
|
64
64
|
dependency_declarations(processed_source.ast)
|
@@ -71,15 +71,6 @@ module RuboCop
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
def autocorrect(node)
|
75
|
-
OrderedGemCorrector.correct(
|
76
|
-
processed_source,
|
77
|
-
node,
|
78
|
-
previous_declaration(node),
|
79
|
-
treat_comments_as_separators
|
80
|
-
)
|
81
|
-
end
|
82
|
-
|
83
74
|
private
|
84
75
|
|
85
76
|
def previous_declaration(node)
|
@@ -42,7 +42,7 @@ module RuboCop
|
|
42
42
|
# end
|
43
43
|
#
|
44
44
|
# # accepted but not recommended, since
|
45
|
-
# # Ruby does not really follow semantic
|
45
|
+
# # Ruby does not really follow semantic versioning
|
46
46
|
# Gem::Specification.new do |spec|
|
47
47
|
# spec.required_ruby_version = '~> 2.5'
|
48
48
|
# end
|
@@ -24,6 +24,11 @@ module RuboCop
|
|
24
24
|
# `SupportedStyle` and unique configuration, there needs to be examples.
|
25
25
|
# Examples must have valid Ruby syntax. Do not use upticks.
|
26
26
|
#
|
27
|
+
# @safety
|
28
|
+
# Delete this section if the cop is not unsafe (`Safe: false` or
|
29
|
+
# `SafeAutoCorrect: false`), or use it to explain how the cop is
|
30
|
+
# unsafe.
|
31
|
+
#
|
27
32
|
# @example EnforcedStyle: bar (default)
|
28
33
|
# # Description of the `bar` style.
|
29
34
|
#
|
@@ -106,9 +111,8 @@ module RuboCop
|
|
106
111
|
'[modify] A configuration for the cop is added into ' \
|
107
112
|
'%<configuration_file_path>s.'
|
108
113
|
|
109
|
-
def initialize(name,
|
114
|
+
def initialize(name, output: $stdout)
|
110
115
|
@badge = Badge.parse(name)
|
111
|
-
@github_user = github_user
|
112
116
|
@output = output
|
113
117
|
return if badge.qualified?
|
114
118
|
|
@@ -142,17 +146,19 @@ module RuboCop
|
|
142
146
|
|
143
147
|
def todo
|
144
148
|
<<~TODO
|
145
|
-
Do
|
146
|
-
1.
|
147
|
-
|
148
|
-
|
149
|
-
|
149
|
+
Do 4 steps:
|
150
|
+
1. Modify the description of #{badge} in config/default.yml
|
151
|
+
2. Implement your new cop in the generated file!
|
152
|
+
3. Commit your new cop with a message such as
|
153
|
+
e.g. "Add new `#{badge}` cop."
|
154
|
+
4. Run `bundle exec rake changelog:new` to generate a changelog entry
|
155
|
+
for your new cop.
|
150
156
|
TODO
|
151
157
|
end
|
152
158
|
|
153
159
|
private
|
154
160
|
|
155
|
-
attr_reader :badge, :
|
161
|
+
attr_reader :badge, :output
|
156
162
|
|
157
163
|
def write_unless_file_exists(path, contents)
|
158
164
|
if File.exist?(path)
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
23
23
|
extend AutoCorrector
|
24
24
|
include RangeHelp
|
25
25
|
|
26
|
-
MSG = '
|
26
|
+
MSG = 'Precede `%<method>s` with a `@!method` YARD directive.'
|
27
27
|
MSG_WRONG_NAME = '`@!method` YARD directive has invalid method name, ' \
|
28
28
|
'use `%<expected>s` instead of `%<actual>s`.'
|
29
29
|
MSG_TOO_MANY = 'Multiple `@!method` YARD directives found for this matcher.'
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def proper_dot_position?(node)
|
71
|
-
receiver_line = node.receiver
|
71
|
+
receiver_line = receiver_end_line(node.receiver)
|
72
72
|
selector_line = selector_range(node).line
|
73
73
|
|
74
74
|
# receiver and selector are on the same line
|
@@ -80,7 +80,10 @@ module RuboCop
|
|
80
80
|
# dot and the selector otherwise, we might break the code while
|
81
81
|
# "correcting" it (even if there is just an extra blank line, treat
|
82
82
|
# it the same)
|
83
|
-
|
83
|
+
# Also, in the case of a heredoc, the receiver will end after the dot,
|
84
|
+
# because the heredoc body is on subsequent lines, so use the highest
|
85
|
+
# line to compare to.
|
86
|
+
return true if line_between?(selector_line, [receiver_line, dot_line].max)
|
84
87
|
|
85
88
|
correct_dot_position_style?(dot_line, selector_line)
|
86
89
|
end
|
@@ -96,6 +99,26 @@ module RuboCop
|
|
96
99
|
end
|
97
100
|
end
|
98
101
|
|
102
|
+
def receiver_end_line(node)
|
103
|
+
if (line = last_heredoc_line(node))
|
104
|
+
line
|
105
|
+
else
|
106
|
+
node.source_range.end.line
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def last_heredoc_line(node)
|
111
|
+
if node.send_type?
|
112
|
+
node.arguments.select { |arg| heredoc?(arg) }.map { |arg| arg.loc.heredoc_end.line }.max
|
113
|
+
elsif heredoc?(node)
|
114
|
+
node.loc.heredoc_end.line
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def heredoc?(node)
|
119
|
+
(node.str_type? || node.dstr_type?) && node.heredoc?
|
120
|
+
end
|
121
|
+
|
99
122
|
def selector_range(node)
|
100
123
|
# l.(1) has no selector, so we use the opening parenthesis instead
|
101
124
|
node.loc.selector || node.loc.begin
|
@@ -183,8 +183,8 @@ module RuboCop
|
|
183
183
|
line_index.zero? && line.start_with?('#!')
|
184
184
|
end
|
185
185
|
|
186
|
-
def register_offense(loc, line, line_index)
|
187
|
-
message = format(MSG, length:
|
186
|
+
def register_offense(loc, line, line_index, length: line_length(line))
|
187
|
+
message = format(MSG, length: length, max: max)
|
188
188
|
|
189
189
|
self.breakable_range = breakable_range_by_line_index[line_index]
|
190
190
|
|
@@ -241,9 +241,10 @@ module RuboCop
|
|
241
241
|
end
|
242
242
|
|
243
243
|
def check_directive_line(line, line_index)
|
244
|
-
|
244
|
+
length_without_directive = line_length_without_directive(line)
|
245
|
+
return if length_without_directive <= max
|
245
246
|
|
246
|
-
range = max..(
|
247
|
+
range = max..(length_without_directive - 1)
|
247
248
|
register_offense(
|
248
249
|
source_range(
|
249
250
|
processed_source.buffer,
|
@@ -251,7 +252,8 @@ module RuboCop
|
|
251
252
|
range
|
252
253
|
),
|
253
254
|
line,
|
254
|
-
line_index
|
255
|
+
line_index,
|
256
|
+
length: length_without_directive
|
255
257
|
)
|
256
258
|
end
|
257
259
|
|
@@ -127,6 +127,7 @@ module RuboCop
|
|
127
127
|
.gsub(/" *\\\n\s*'/, %q(" + ')) # Double quote, backslash, and then single quote
|
128
128
|
.gsub(/' *\\\n\s*"/, %q(' + ")) # Single quote, backslash, and then double quote
|
129
129
|
.gsub(/(["']) *\\\n\s*\1/, '') # Double or single quote, backslash, then same quote
|
130
|
+
.gsub(/\n\s*(?=\.\w)/, '') # Extra space within method chaining
|
130
131
|
.gsub(/\s*\\?\n\s*/, ' ') # Any other line break, with or without backslash
|
131
132
|
end
|
132
133
|
|