rubocop 1.23.0 → 1.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/default.yml +45 -1
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_docs_url.rb +48 -0
- data/lib/rubocop/cli/command/suggest_extensions.rb +1 -1
- data/lib/rubocop/cli.rb +1 -0
- data/lib/rubocop/config_loader_resolver.rb +1 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/if_then_corrector.rb +55 -0
- data/lib/rubocop/cop/documentation.rb +19 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +5 -5
- data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +3 -1
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/comment_indentation.rb +31 -2
- data/lib/rubocop/cop/layout/dot_position.rb +4 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -0
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +16 -4
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +6 -0
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +4 -0
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -9
- data/lib/rubocop/cop/metrics/method_length.rb +1 -0
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +5 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +4 -3
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +56 -0
- data/lib/rubocop/cop/naming/block_forwarding.rb +102 -0
- data/lib/rubocop/cop/security/open.rb +11 -1
- data/lib/rubocop/cop/style/character_literal.rb +8 -1
- data/lib/rubocop/cop/style/collection_compact.rb +31 -13
- data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
- data/lib/rubocop/cop/style/empty_case_condition.rb +10 -0
- data/lib/rubocop/cop/style/file_read.rb +112 -0
- data/lib/rubocop/cop/style/file_write.rb +98 -0
- data/lib/rubocop/cop/style/hash_conversion.rb +2 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +22 -0
- data/lib/rubocop/cop/style/if_inside_else.rb +15 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +68 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +10 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +18 -39
- data/lib/rubocop/cop/style/redundant_interpolation.rb +17 -3
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +5 -1
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +1 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +3 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/options.rb +6 -1
- data/lib/rubocop/remote_config.rb +1 -3
- data/lib/rubocop/result_cache.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +7 -0
- metadata +13 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3080860c5102e2d42274c71316c7d9910e6e26019c9f39005e38fba136657c8e
|
4
|
+
data.tar.gz: 879fa716afcb1051f05f0ebc6832291cfb06655763e1aaac752cf6997096bcf2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21bd87b421b7cae8c95a44cdfc9ef85e4b4259fc08bfd53b37f02f16d9808ef487d1ec385a4e5047fed1d3358cf185f8bc2ca2bfa504eeedd05c47d4ea9cb411
|
7
|
+
data.tar.gz: 933d030bae14fbaf659e21901ab49db9418dcb8afcaff33b68d765c9fa47576f6c957fe1b0771f23a3faa94c100353f739298d85b68c8a96e65b6b15c1a8f60e
|
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.24', 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
@@ -78,6 +78,8 @@ AllCops:
|
|
78
78
|
# When specifying style guide URLs, any paths and/or fragments will be
|
79
79
|
# evaluated relative to the base URL.
|
80
80
|
StyleGuideBaseURL: https://rubystyle.guide
|
81
|
+
# Documentation URLs will be constructed using the base URL.
|
82
|
+
DocumentationBaseURL: https://docs.rubocop.org/rubocop
|
81
83
|
# Extra details are not displayed in offense messages by default. Change
|
82
84
|
# behavior by overriding ExtraDetails, or by giving the
|
83
85
|
# `-E/--extra-details` option.
|
@@ -449,7 +451,11 @@ Layout/ClosingParenthesisIndentation:
|
|
449
451
|
Layout/CommentIndentation:
|
450
452
|
Description: 'Indentation of comments.'
|
451
453
|
Enabled: true
|
454
|
+
# When true, allows comments to have extra indentation if that aligns them
|
455
|
+
# with a comment on the preceding line.
|
456
|
+
AllowForAlignment: false
|
452
457
|
VersionAdded: '0.49'
|
458
|
+
VersionChanged: '1.24'
|
453
459
|
|
454
460
|
Layout/ConditionPosition:
|
455
461
|
Description: >-
|
@@ -1796,7 +1802,9 @@ Lint/ImplicitStringConcatenation:
|
|
1796
1802
|
Lint/IncompatibleIoSelectWithFiberScheduler:
|
1797
1803
|
Description: 'Checks for `IO.select` that is incompatible with Fiber Scheduler.'
|
1798
1804
|
Enabled: pending
|
1805
|
+
SafeAutoCorrect: false
|
1799
1806
|
VersionAdded: '1.21'
|
1807
|
+
VersionChanged: '1.24'
|
1800
1808
|
|
1801
1809
|
Lint/IneffectiveAccessModifier:
|
1802
1810
|
Description: >-
|
@@ -2479,6 +2487,15 @@ Naming/BinaryOperatorParameterName:
|
|
2479
2487
|
VersionAdded: '0.50'
|
2480
2488
|
VersionChanged: '1.2'
|
2481
2489
|
|
2490
|
+
Naming/BlockForwarding:
|
2491
|
+
Description: 'Use anonymous block forwarding.'
|
2492
|
+
Enabled: pending
|
2493
|
+
VersionAdded: '1.24'
|
2494
|
+
EnforcedStyle: anonymous
|
2495
|
+
SupportedStyles:
|
2496
|
+
- anonymous
|
2497
|
+
- explicit
|
2498
|
+
|
2482
2499
|
Naming/BlockParameterName:
|
2483
2500
|
Description: >-
|
2484
2501
|
Checks for block parameter names that contain capital letters,
|
@@ -3492,6 +3509,18 @@ Style/ExponentialNotation:
|
|
3492
3509
|
- engineering
|
3493
3510
|
- integral
|
3494
3511
|
|
3512
|
+
Style/FileRead:
|
3513
|
+
Description: 'Favor `File.(bin)read` convenience methods.'
|
3514
|
+
StyleGuide: '#file-read'
|
3515
|
+
Enabled: pending
|
3516
|
+
VersionAdded: '1.24'
|
3517
|
+
|
3518
|
+
Style/FileWrite:
|
3519
|
+
Description: 'Favor `File.(bin)write` convenience methods.'
|
3520
|
+
StyleGuide: '#file-write'
|
3521
|
+
Enabled: pending
|
3522
|
+
VersionAdded: '1.24'
|
3523
|
+
|
3495
3524
|
Style/FloatDivision:
|
3496
3525
|
Description: 'For performing float division, coerce one side only.'
|
3497
3526
|
StyleGuide: '#float-division'
|
@@ -3650,7 +3679,7 @@ Style/HashSyntax:
|
|
3650
3679
|
StyleGuide: '#hash-literals'
|
3651
3680
|
Enabled: true
|
3652
3681
|
VersionAdded: '0.9'
|
3653
|
-
VersionChanged: '
|
3682
|
+
VersionChanged: '1.24'
|
3654
3683
|
EnforcedStyle: ruby19
|
3655
3684
|
SupportedStyles:
|
3656
3685
|
# checks for 1.9 syntax (e.g. {a: 1}) for all symbol keys
|
@@ -3661,6 +3690,13 @@ Style/HashSyntax:
|
|
3661
3690
|
- no_mixed_keys
|
3662
3691
|
# enforces both ruby19 and no_mixed_keys styles
|
3663
3692
|
- ruby19_no_mixed_keys
|
3693
|
+
# Force hashes that have a hash value omission
|
3694
|
+
EnforcedShorthandSyntax: always
|
3695
|
+
SupportedShorthandSyntax:
|
3696
|
+
# forces use of the 3.1 syntax (e.g. {foo:}) when the hash key and value are the same.
|
3697
|
+
- always
|
3698
|
+
# forces use of explicit hash literal value.
|
3699
|
+
- never
|
3664
3700
|
# Force hashes that have a symbol value to use hash rockets
|
3665
3701
|
UseHashRocketsWithSymbolValues: false
|
3666
3702
|
# Do not suggest { a?: 1 } over { :a? => 1 } in ruby19 style
|
@@ -3837,6 +3873,12 @@ Style/LineEndConcatenation:
|
|
3837
3873
|
VersionAdded: '0.18'
|
3838
3874
|
VersionChanged: '0.64'
|
3839
3875
|
|
3876
|
+
Style/MapToHash:
|
3877
|
+
Description: 'Prefer `to_h` with a block over `map.to_h`.'
|
3878
|
+
Enabled: pending
|
3879
|
+
VersionAdded: '1.24'
|
3880
|
+
Safe: false
|
3881
|
+
|
3840
3882
|
Style/MethodCallWithArgsParentheses:
|
3841
3883
|
Description: 'Use parentheses for method calls with arguments.'
|
3842
3884
|
StyleGuide: '#method-invocation-parens'
|
@@ -4205,6 +4247,8 @@ Style/NumericLiterals:
|
|
4205
4247
|
VersionChanged: '0.48'
|
4206
4248
|
MinDigits: 5
|
4207
4249
|
Strict: false
|
4250
|
+
# You can specify allowed numbers. (e.g. port number 3000, 8080, and etc)
|
4251
|
+
AllowedNumbers: []
|
4208
4252
|
|
4209
4253
|
Style/NumericPredicate:
|
4210
4254
|
Description: >-
|
@@ -124,7 +124,7 @@ module RuboCop
|
|
124
124
|
lines = /\S/.match?(rubocop_yml_contents) ? rubocop_yml_contents.split("\n", -1) : []
|
125
125
|
doc_start_index = lines.index { |line| YAML_OPTIONAL_DOC_START.match?(line) } || -1
|
126
126
|
lines.insert(doc_start_index + 1, "inherit_from:#{file_string}\n")
|
127
|
-
File.
|
127
|
+
File.write(file_name, lines.join("\n"))
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
class CLI
|
5
|
+
module Command
|
6
|
+
# Prints out url to documentation of provided cops
|
7
|
+
# or documentation base url by default.
|
8
|
+
# @api private
|
9
|
+
class ShowDocsUrl < Base
|
10
|
+
self.command_name = :show_docs_url
|
11
|
+
|
12
|
+
def initialize(env)
|
13
|
+
super
|
14
|
+
|
15
|
+
@config = @config_store.for(Dir.pwd)
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
print_documentation_url
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def print_documentation_url
|
25
|
+
puts Cop::Documentation.default_base_url if cops_array.empty?
|
26
|
+
|
27
|
+
cops_array.each do |cop_name|
|
28
|
+
cop = registry_hash[cop_name]
|
29
|
+
|
30
|
+
next if cop.empty?
|
31
|
+
|
32
|
+
puts Cop::Documentation.url_for(cop.first, @config)
|
33
|
+
end
|
34
|
+
|
35
|
+
puts
|
36
|
+
end
|
37
|
+
|
38
|
+
def cops_array
|
39
|
+
@cops_array ||= @options[:show_docs_url]
|
40
|
+
end
|
41
|
+
|
42
|
+
def registry_hash
|
43
|
+
@registry_hash ||= Cop::Registry.global.to_h
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
'RuboCop extension libraries might be helpful:'
|
23
23
|
|
24
24
|
extensions.sort.each do |extension|
|
25
|
-
puts " * #{extension} (https://
|
25
|
+
puts " * #{extension} (https://rubygems.org/gems/#{extension})"
|
26
26
|
end
|
27
27
|
|
28
28
|
puts
|
data/lib/rubocop/cli.rb
CHANGED
@@ -74,7 +74,7 @@ module RuboCop
|
|
74
74
|
# Merges the given configuration with the default one. If
|
75
75
|
# AllCops:DisabledByDefault is true, it changes the Enabled params so that
|
76
76
|
# only cops from user configuration are enabled. If
|
77
|
-
# AllCops
|
77
|
+
# AllCops:EnabledByDefault is true, it changes the Enabled params so that
|
78
78
|
# only cops explicitly disabled in user configuration are disabled.
|
79
79
|
def merge_with_default(config, config_file, unset_nil:)
|
80
80
|
default_configuration = ConfigLoader.default_configuration
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def conditional_declaration?(nodes)
|
71
|
-
parent = nodes[0].
|
71
|
+
parent = nodes[0].each_ancestor.find { |ancestor| !ancestor.begin_type? }
|
72
72
|
return false unless parent&.if_type? || parent&.when_type?
|
73
73
|
|
74
74
|
root_conditional_node = parent.if_type? ? parent : parent.parent
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
# This class auto-corrects `if...then` structures to a multiline `if` statement
|
6
|
+
class IfThenCorrector
|
7
|
+
DEFAULT_INDENTATION_WIDTH = 2
|
8
|
+
|
9
|
+
def initialize(if_node, indentation: nil)
|
10
|
+
@if_node = if_node
|
11
|
+
@indentation = indentation || DEFAULT_INDENTATION_WIDTH
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(corrector)
|
15
|
+
corrector.replace(if_node, replacement)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
attr_reader :if_node, :indentation
|
21
|
+
|
22
|
+
def replacement(node = if_node, indentation = nil)
|
23
|
+
indentation = ' ' * node.source_range.column if indentation.nil?
|
24
|
+
if_branch_source = node.if_branch&.source || 'nil'
|
25
|
+
elsif_indentation = indentation if node.respond_to?(:elsif?) && node.elsif?
|
26
|
+
|
27
|
+
if_branch = <<~RUBY
|
28
|
+
#{elsif_indentation}#{node.keyword} #{node.condition.source}
|
29
|
+
#{indentation}#{branch_body_indentation}#{if_branch_source}
|
30
|
+
RUBY
|
31
|
+
|
32
|
+
else_branch = rewrite_else_branch(node.else_branch, indentation)
|
33
|
+
if_branch + else_branch
|
34
|
+
end
|
35
|
+
|
36
|
+
def rewrite_else_branch(else_branch, indentation)
|
37
|
+
if else_branch.nil?
|
38
|
+
'end'
|
39
|
+
elsif else_branch.if_type? && else_branch.elsif?
|
40
|
+
replacement(else_branch, indentation)
|
41
|
+
else
|
42
|
+
<<~RUBY.chomp
|
43
|
+
#{indentation}else
|
44
|
+
#{indentation}#{branch_body_indentation}#{else_branch.source}
|
45
|
+
#{indentation}end
|
46
|
+
RUBY
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def branch_body_indentation
|
51
|
+
@branch_body_indentation ||= (' ' * indentation).freeze
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -12,10 +12,27 @@ module RuboCop
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# @api private
|
15
|
-
def url_for(cop_class)
|
15
|
+
def url_for(cop_class, config = nil)
|
16
16
|
base = department_to_basename(cop_class.department)
|
17
17
|
fragment = cop_class.cop_name.downcase.gsub(/[^a-z]/, '')
|
18
|
-
|
18
|
+
base_url = base_url_for(cop_class, config)
|
19
|
+
|
20
|
+
"#{base_url}/#{base}.html##{fragment}"
|
21
|
+
end
|
22
|
+
|
23
|
+
# @api private
|
24
|
+
def base_url_for(cop_class, config)
|
25
|
+
return default_base_url unless config
|
26
|
+
|
27
|
+
department_name = cop_class.department.to_s
|
28
|
+
|
29
|
+
config.for_department(department_name)['DocumentationBaseURL'] ||
|
30
|
+
config.for_all_cops['DocumentationBaseURL']
|
31
|
+
end
|
32
|
+
|
33
|
+
# @api private
|
34
|
+
def default_base_url
|
35
|
+
'https://docs.rubocop.org/rubocop'
|
19
36
|
end
|
20
37
|
end
|
21
38
|
end
|
@@ -6,18 +6,18 @@ module RuboCop
|
|
6
6
|
# Requires a gemspec to have `rubygems_mfa_required` metadata set.
|
7
7
|
#
|
8
8
|
# This setting tells RubyGems that MFA is required for accounts to
|
9
|
-
# be able perform
|
9
|
+
# be able perform privileged operations, such as (see
|
10
|
+
# RubyGems' documentation for the full list of privileged operations):
|
10
11
|
#
|
11
|
-
# * gem push
|
12
|
-
# * gem yank
|
13
|
-
# * gem owner --add/remove
|
12
|
+
# * `gem push`
|
13
|
+
# * `gem yank`
|
14
|
+
# * `gem owner --add/remove`
|
14
15
|
# * adding or removing owners using gem ownership page
|
15
16
|
#
|
16
17
|
# This helps make your gem more secure, as users can be more
|
17
18
|
# confident that gem updates were pushed by maintainers.
|
18
19
|
#
|
19
20
|
# @example
|
20
|
-
#
|
21
21
|
# # bad
|
22
22
|
# Gem::Specification.new do |spec|
|
23
23
|
# # no `rubygems_mfa_required` metadata specified
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# Checks for redundant `send_node` method dispatch node.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # bad
|
11
|
+
# node.send_node.method_name
|
12
|
+
#
|
13
|
+
# # good
|
14
|
+
# node.method_name
|
15
|
+
#
|
16
|
+
# # bad
|
17
|
+
# node.send_node.receiver
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# node.receiver
|
21
|
+
#
|
22
|
+
class RedundantMethodDispatchNode < Base
|
23
|
+
include RangeHelp
|
24
|
+
extend AutoCorrector
|
25
|
+
|
26
|
+
MSG = 'Remove the redundant `send_node`.'
|
27
|
+
RESTRICT_ON_SEND = %i[method_name receiver].freeze
|
28
|
+
|
29
|
+
# @!method dispatch_method(node)
|
30
|
+
def_node_matcher :dispatch_method, <<~PATTERN
|
31
|
+
(send $(send _ :send_node) _)
|
32
|
+
PATTERN
|
33
|
+
|
34
|
+
def on_send(node)
|
35
|
+
return unless (dispatch_node = dispatch_method(node))
|
36
|
+
|
37
|
+
range = range_between(dispatch_node.loc.dot.begin_pos, dispatch_node.loc.selector.end_pos)
|
38
|
+
|
39
|
+
add_offense(range) do |corrector|
|
40
|
+
corrector.remove(range)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -14,7 +14,9 @@ module RuboCop
|
|
14
14
|
|
15
15
|
# @!method cop_class_def(node)
|
16
16
|
def_node_search :cop_class_def, <<~PATTERN
|
17
|
-
(class _
|
17
|
+
(class _
|
18
|
+
(const {nil? (const nil? :Cop) (const (const {cbase nil?} :RuboCop) :Cop)}
|
19
|
+
{:Base :Cop}) ...)
|
18
20
|
PATTERN
|
19
21
|
|
20
22
|
# @!method cop_config_accessor?(node)
|
@@ -13,6 +13,7 @@ require_relative 'internal_affairs/redundant_described_class_as_subject'
|
|
13
13
|
require_relative 'internal_affairs/redundant_let_rubocop_config_new'
|
14
14
|
require_relative 'internal_affairs/redundant_location_argument'
|
15
15
|
require_relative 'internal_affairs/redundant_message_argument'
|
16
|
+
require_relative 'internal_affairs/redundant_method_dispatch_node'
|
16
17
|
require_relative 'internal_affairs/style_detected_api_use'
|
17
18
|
require_relative 'internal_affairs/undefined_config'
|
18
19
|
require_relative 'internal_affairs/useless_message_assertion'
|
@@ -32,6 +32,19 @@ module RuboCop
|
|
32
32
|
# true
|
33
33
|
# end
|
34
34
|
#
|
35
|
+
# @example AllowForAlignment: false (default)
|
36
|
+
# # bad
|
37
|
+
# a = 1 # A really long comment
|
38
|
+
# # spanning two lines.
|
39
|
+
#
|
40
|
+
# # good
|
41
|
+
# # A really long comment spanning one line.
|
42
|
+
# a = 1
|
43
|
+
#
|
44
|
+
# @example AllowForAlignment: true
|
45
|
+
# # good
|
46
|
+
# a = 1 # A really long comment
|
47
|
+
# # spanning two lines.
|
35
48
|
class CommentIndentation < Base
|
36
49
|
include Alignment
|
37
50
|
extend AutoCorrector
|
@@ -40,7 +53,7 @@ module RuboCop
|
|
40
53
|
'instead of %<correct_comment_indentation>d).'
|
41
54
|
|
42
55
|
def on_new_investigation
|
43
|
-
processed_source.comments.
|
56
|
+
processed_source.comments.each_with_index { |comment, ix| check(comment, ix) }
|
44
57
|
end
|
45
58
|
|
46
59
|
private
|
@@ -76,7 +89,7 @@ module RuboCop
|
|
76
89
|
AlignmentCorrector.correct(corrector, processed_source, comment, @column_delta)
|
77
90
|
end
|
78
91
|
|
79
|
-
def check(comment)
|
92
|
+
def check(comment, comment_index)
|
80
93
|
return unless own_line_comment?(comment)
|
81
94
|
|
82
95
|
next_line = line_after_comment(comment)
|
@@ -94,11 +107,27 @@ module RuboCop
|
|
94
107
|
return if column == correct_comment_indentation
|
95
108
|
end
|
96
109
|
|
110
|
+
return if correctly_aligned_with_preceding_comment?(comment_index, column)
|
111
|
+
|
97
112
|
add_offense(comment, message: message(column, correct_comment_indentation)) do |corrector|
|
98
113
|
autocorrect(corrector, comment)
|
99
114
|
end
|
100
115
|
end
|
101
116
|
|
117
|
+
# Returns true if:
|
118
|
+
# a) the cop is configured to allow extra indentation for alignment, and
|
119
|
+
# b) the currently inspected comment is aligned with the nearest preceding end-of-line
|
120
|
+
# comment.
|
121
|
+
def correctly_aligned_with_preceding_comment?(comment_index, column)
|
122
|
+
return false unless cop_config['AllowForAlignment']
|
123
|
+
|
124
|
+
processed_source.comments[0...comment_index].reverse_each do |other_comment|
|
125
|
+
return other_comment.loc.column == column unless own_line_comment?(other_comment)
|
126
|
+
end
|
127
|
+
|
128
|
+
false
|
129
|
+
end
|
130
|
+
|
102
131
|
def message(column, correct_comment_indentation)
|
103
132
|
format(MSG, column: column, correct_comment_indentation: correct_comment_indentation)
|
104
133
|
end
|
@@ -313,7 +313,7 @@ module RuboCop
|
|
313
313
|
# just give each lambda the same reference and they would all get the
|
314
314
|
# last value of each. A local variable fixes the problem.
|
315
315
|
|
316
|
-
if node.value
|
316
|
+
if node.value && node.respond_to?(:value_omission?) && !node.value_omission?
|
317
317
|
correct_key_value(corrector, delta, node.key.source_range,
|
318
318
|
node.value.source_range,
|
319
319
|
node.loc.operator)
|
@@ -28,6 +28,10 @@ module RuboCop
|
|
28
28
|
|
29
29
|
MSG = 'Put one space between the method name and the first argument.'
|
30
30
|
|
31
|
+
def self.autocorrect_incompatible_with
|
32
|
+
[Style::MethodCallWithArgsParentheses]
|
33
|
+
end
|
34
|
+
|
31
35
|
def on_send(node)
|
32
36
|
return unless regular_method_call_with_arguments?(node)
|
33
37
|
|
@@ -12,6 +12,7 @@ module RuboCop
|
|
12
12
|
# File.exists?(some_path)
|
13
13
|
# Dir.exists?(some_path)
|
14
14
|
# iterator?
|
15
|
+
# ENV.freeze # Calling `Env.freeze` raises `TypeError` since Ruby 2.7.
|
15
16
|
# Socket.gethostbyname(host)
|
16
17
|
# Socket.gethostbyaddr(host)
|
17
18
|
#
|
@@ -22,6 +23,7 @@ module RuboCop
|
|
22
23
|
# File.exist?(some_path)
|
23
24
|
# Dir.exist?(some_path)
|
24
25
|
# block_given?
|
26
|
+
# ENV # `ENV.freeze` cannot prohibit changes to environment variables.
|
25
27
|
# Addrinfo.getaddrinfo(nodename, service)
|
26
28
|
# Addrinfo.tcp(host, port).getnameinfo
|
27
29
|
class DeprecatedClassMethods < Base
|
@@ -106,6 +108,9 @@ module RuboCop
|
|
106
108
|
|
107
109
|
DeprecatedClassMethod.new(:iterator?) => Replacement.new(:block_given?),
|
108
110
|
|
111
|
+
DeprecatedClassMethod.new(:freeze, class_constant: :ENV) =>
|
112
|
+
Replacement.new(nil, class_constant: :ENV),
|
113
|
+
|
109
114
|
DeprecatedClassMethod.new(:gethostbyaddr, class_constant: :Socket, correctable: false) =>
|
110
115
|
Replacement.new(:getnameinfo, class_constant: :Addrinfo, instance_method: true),
|
111
116
|
|
@@ -120,11 +125,18 @@ module RuboCop
|
|
120
125
|
|
121
126
|
def on_send(node)
|
122
127
|
check(node) do |deprecated|
|
123
|
-
|
128
|
+
prefer = replacement(deprecated)
|
129
|
+
message = format(MSG, current: deprecated, prefer: prefer)
|
130
|
+
current_method = node.loc.selector
|
131
|
+
|
132
|
+
add_offense(current_method, message: message) do |corrector|
|
133
|
+
next unless deprecated.correctable?
|
124
134
|
|
125
|
-
|
126
|
-
|
127
|
-
|
135
|
+
if (preferred_method = prefer.method)
|
136
|
+
corrector.replace(current_method, preferred_method)
|
137
|
+
else
|
138
|
+
corrector.remove(node.loc.dot)
|
139
|
+
corrector.remove(current_method)
|
128
140
|
end
|
129
141
|
end
|
130
142
|
end
|
@@ -55,8 +55,14 @@ module RuboCop
|
|
55
55
|
...)
|
56
56
|
PATTERN
|
57
57
|
|
58
|
+
# @!method digest_const?(node)
|
59
|
+
def_node_matcher :digest_const?, <<~PATTERN
|
60
|
+
(const _ :Digest)
|
61
|
+
PATTERN
|
62
|
+
|
58
63
|
def on_send(node)
|
59
64
|
return if node.arguments.any? { |arg| arg.variable? || arg.send_type? || arg.const_type? }
|
65
|
+
return if digest_const?(node.receiver)
|
60
66
|
return unless algorithm_const(node)
|
61
67
|
|
62
68
|
message = message(node)
|
@@ -20,6 +20,10 @@ module RuboCop
|
|
20
20
|
# # good
|
21
21
|
# io.wait_writable(timeout)
|
22
22
|
#
|
23
|
+
# @safety
|
24
|
+
# This cop's autocorrection is unsafe because `NoMethodError` occurs
|
25
|
+
# if `require 'io/wait'` is not called.
|
26
|
+
#
|
23
27
|
class IncompatibleIoSelectWithFiberScheduler < Base
|
24
28
|
extend AutoCorrector
|
25
29
|
|
@@ -46,15 +46,6 @@ module RuboCop
|
|
46
46
|
1
|
47
47
|
end
|
48
48
|
|
49
|
-
def block_method(node)
|
50
|
-
case node.type
|
51
|
-
when :block
|
52
|
-
node.method_name
|
53
|
-
when :block_pass
|
54
|
-
node.parent.method_name
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
49
|
def count_block?(block)
|
59
50
|
KNOWN_ITERATING_METHODS.include? block.method_name
|
60
51
|
end
|
@@ -44,7 +44,7 @@ module RuboCop
|
|
44
44
|
|
45
45
|
# @!method module_definition?(node)
|
46
46
|
def_node_matcher :module_definition?, <<~PATTERN
|
47
|
-
(casgn nil? _ (block (send (const {nil? cbase} :Module) :new) ...))
|
47
|
+
(casgn nil? _ ({block numblock} (send (const {nil? cbase} :Module) :new) ...))
|
48
48
|
PATTERN
|
49
49
|
|
50
50
|
def message(length, max_length)
|