rubocop 0.76.0 → 0.79.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.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +290 -264
  4. data/lib/rubocop/ast/builder.rb +43 -42
  5. data/lib/rubocop/ast/node/block_node.rb +2 -0
  6. data/lib/rubocop/ast/node/def_node.rb +11 -0
  7. data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
  8. data/lib/rubocop/ast/node.rb +1 -1
  9. data/lib/rubocop/ast/traversal.rb +11 -3
  10. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  11. data/lib/rubocop/cli/command/base.rb +33 -0
  12. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  13. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  14. data/lib/rubocop/cli/command/show_cops.rb +80 -0
  15. data/lib/rubocop/cli/command/version.rb +17 -0
  16. data/lib/rubocop/cli/command.rb +21 -0
  17. data/lib/rubocop/cli/environment.rb +21 -0
  18. data/lib/rubocop/cli.rb +11 -230
  19. data/lib/rubocop/config.rb +1 -1
  20. data/lib/rubocop/config_loader.rb +19 -19
  21. data/lib/rubocop/config_obsoletion.rb +65 -12
  22. data/lib/rubocop/config_validator.rb +56 -98
  23. data/lib/rubocop/cop/autocorrect_logic.rb +7 -4
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  25. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
  26. data/lib/rubocop/cop/cop.rb +21 -0
  27. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
  28. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  29. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  30. data/lib/rubocop/cop/generator.rb +3 -4
  31. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  32. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  33. data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
  34. data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
  35. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +1 -1
  36. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  37. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +5 -5
  38. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
  39. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +3 -3
  40. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  41. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +10 -6
  42. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +5 -5
  43. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  44. data/lib/rubocop/cop/{metrics → layout}/line_length.rb +40 -110
  45. data/lib/rubocop/cop/layout/multiline_block_layout.rb +14 -5
  46. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  47. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  48. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  49. data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
  50. data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
  51. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  52. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  53. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  54. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  55. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  56. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  57. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
  58. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  59. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +3 -3
  60. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -4
  61. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  62. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
  63. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  64. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  65. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
  66. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
  67. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  68. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  69. data/lib/rubocop/cop/migration/department_name.rb +16 -1
  70. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  71. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -7
  72. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  73. data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
  74. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  75. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  76. data/lib/rubocop/cop/mixin/statement_modifier.rb +2 -2
  77. data/lib/rubocop/cop/mixin/trailing_comma.rb +6 -3
  78. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  79. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
  80. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +4 -4
  81. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  82. data/lib/rubocop/cop/offense.rb +11 -0
  83. data/lib/rubocop/cop/registry.rb +7 -2
  84. data/lib/rubocop/cop/style/alias.rb +1 -1
  85. data/lib/rubocop/cop/style/array_join.rb +1 -1
  86. data/lib/rubocop/cop/style/attr.rb +8 -0
  87. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
  88. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  89. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  90. data/lib/rubocop/cop/style/guard_clause.rb +3 -2
  91. data/lib/rubocop/cop/style/if_unless_modifier.rb +38 -3
  92. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  93. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  94. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +168 -0
  95. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
  96. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -207
  97. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  98. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  99. data/lib/rubocop/cop/style/multiline_when_then.rb +5 -1
  100. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
  101. data/lib/rubocop/cop/style/next.rb +5 -5
  102. data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
  103. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -3
  104. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  105. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
  106. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -3
  107. data/lib/rubocop/cop/style/redundant_return.rb +2 -8
  108. data/lib/rubocop/cop/style/redundant_sort.rb +1 -1
  109. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
  110. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  111. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  112. data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
  113. data/lib/rubocop/cop/team.rb +5 -0
  114. data/lib/rubocop/formatter/base_formatter.rb +2 -2
  115. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -3
  116. data/lib/rubocop/formatter/json_formatter.rb +6 -5
  117. data/lib/rubocop/formatter/tap_formatter.rb +1 -3
  118. data/lib/rubocop/node_pattern.rb +1 -1
  119. data/lib/rubocop/options.rb +8 -8
  120. data/lib/rubocop/processed_source.rb +1 -1
  121. data/lib/rubocop/rake_task.rb +1 -0
  122. data/lib/rubocop/result_cache.rb +23 -7
  123. data/lib/rubocop/rspec/shared_contexts.rb +5 -0
  124. data/lib/rubocop/runner.rb +18 -2
  125. data/lib/rubocop/target_ruby.rb +151 -0
  126. data/lib/rubocop/version.rb +1 -1
  127. data/lib/rubocop.rb +38 -22
  128. metadata +40 -25
  129. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
@@ -19,9 +19,9 @@ module RuboCop
19
19
  #
20
20
  # @example
21
21
  # # bad
22
- # # rubocop:disable Metrics/LineLength
22
+ # # rubocop:disable Layout/LineLength
23
23
  # x += 1
24
- # # rubocop:enable Metrics/LineLength
24
+ # # rubocop:enable Layout/LineLength
25
25
  #
26
26
  # # good
27
27
  # x += 1
@@ -213,7 +213,7 @@ module RuboCop
213
213
  end
214
214
 
215
215
  def matching_range(haystack, needle)
216
- offset = (haystack.source =~ Regexp.new(Regexp.escape(needle)))
216
+ offset = haystack.source.index(needle)
217
217
  return unless offset
218
218
 
219
219
  offset += haystack.begin_pos
@@ -15,20 +15,20 @@ module RuboCop
15
15
  # @example
16
16
  # # bad
17
17
  # foo = 1
18
- # # rubocop:enable Metrics/LineLength
18
+ # # rubocop:enable Layout/LineLength
19
19
  #
20
20
  # # good
21
21
  # foo = 1
22
22
  # @example
23
23
  # # bad
24
- # # rubocop:disable Metrics/LineLength
24
+ # # rubocop:disable Layout/LineLength
25
25
  # baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
26
- # # rubocop:enable Metrics/LineLength
26
+ # # rubocop:enable Layout/LineLength
27
27
  # baz
28
28
  # # rubocop:enable all
29
29
  #
30
30
  # # good
31
- # # rubocop:disable Metrics/LineLength
31
+ # # rubocop:disable Layout/LineLength
32
32
  # baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrr
33
33
  # # rubocop:enable all
34
34
  # baz
@@ -146,7 +146,7 @@ module RuboCop
146
146
  grandparent = node.parent.parent
147
147
 
148
148
  parent.when_type? || parent.send_type? || part_of_an_array?(node) ||
149
- (grandparent&.resbody_type?)
149
+ grandparent&.resbody_type?
150
150
  end
151
151
 
152
152
  def remove_brackets(array)
@@ -17,7 +17,7 @@ module RuboCop
17
17
  # # good
18
18
  #
19
19
  # "result is #{something}"
20
- class StringConversionInInterpolation < Cop
20
+ class RedundantStringCoercion < Cop
21
21
  include Interpolation
22
22
 
23
23
  MSG_DEFAULT = 'Redundant use of `Object#to_s` in interpolation.'
@@ -50,7 +50,7 @@ module RuboCop
50
50
  def autocorrect(node)
51
51
  lambda do |corrector|
52
52
  redundant_with_index?(node) do |send|
53
- if send.method_name == :each_with_index
53
+ if send.method?(:each_with_index)
54
54
  corrector.replace(send.loc.selector, 'each')
55
55
  else
56
56
  corrector.remove(with_index_range(send))
@@ -63,7 +63,7 @@ module RuboCop
63
63
  private
64
64
 
65
65
  def message(node)
66
- if node.method_name == :each_with_index
66
+ if node.method?(:each_with_index)
67
67
  MSG_EACH_WITH_INDEX
68
68
  else
69
69
  MSG_WITH_INDEX
@@ -51,7 +51,7 @@ module RuboCop
51
51
  def autocorrect(node)
52
52
  lambda do |corrector|
53
53
  redundant_with_object?(node) do |send|
54
- if send.method_name == :each_with_object
54
+ if send.method?(:each_with_object)
55
55
  corrector.replace(with_object_range(send), 'each')
56
56
  else
57
57
  corrector.remove(with_object_range(send))
@@ -64,7 +64,7 @@ module RuboCop
64
64
  private
65
65
 
66
66
  def message(node)
67
- if node.method_name == :each_with_object
67
+ if node.method?(:each_with_object)
68
68
  MSG_EACH_WITH_OBJECT
69
69
  else
70
70
  MSG_WITH_OBJECT
@@ -74,7 +74,7 @@ module RuboCop
74
74
  # rescue
75
75
  # # do nothing but comment
76
76
  # end
77
- class HandleExceptions < Cop
77
+ class SuppressedException < Cop
78
78
  MSG = 'Do not suppress exceptions.'
79
79
 
80
80
  def on_resbody(node)
@@ -9,23 +9,64 @@ module RuboCop
9
9
  # always being defined, and thus access modifiers guarding such methods
10
10
  # are not redundant.
11
11
  #
12
- # @example
12
+ # This cop has `ContextCreatingMethods` option. The default setting value
13
+ # is an empty array that means no method is specified.
14
+ # This setting is an array of methods which, when called, are known to
15
+ # create its own context in the module's current access context.
16
+ #
17
+ # It also has `MethodCreatingMethods` option. The default setting value
18
+ # is an empty array that means no method is specified.
19
+ # This setting is an array of methods which, when called, are known to
20
+ # create other methods in the module's current access context.
13
21
  #
22
+ # @example
23
+ # # bad
14
24
  # class Foo
15
25
  # public # this is redundant (default access is public)
16
26
  #
17
27
  # def method
18
28
  # end
29
+ # end
19
30
  #
20
- # private # this is not redundant (a method is defined)
21
- # def method2
31
+ # # bad
32
+ # class Foo
33
+ # # The following is redundant (methods defined on the class'
34
+ # # singleton class are not affected by the public modifier)
35
+ # public
36
+ #
37
+ # def self.method3
22
38
  # end
39
+ # end
23
40
  #
41
+ # # bad
42
+ # class Foo
43
+ # protected
44
+ #
45
+ # define_method(:method2) do
46
+ # end
47
+ #
48
+ # protected # this is redundant (repeated from previous modifier)
49
+ #
50
+ # [1,2,3].each do |i|
51
+ # define_method("foo#{i}") do
52
+ # end
53
+ # end
54
+ # end
55
+ #
56
+ # # bad
57
+ # class Foo
24
58
  # private # this is redundant (no following methods are defined)
25
59
  # end
26
60
  #
27
- # @example
61
+ # # good
62
+ # class Foo
63
+ # private # this is not redundant (a method is defined)
64
+ #
65
+ # def method2
66
+ # end
67
+ # end
28
68
  #
69
+ # # good
29
70
  # class Foo
30
71
  # # The following is not redundant (conditionally defined methods are
31
72
  # # considered as always defining a method)
@@ -35,31 +76,22 @@ module RuboCop
35
76
  # def method
36
77
  # end
37
78
  # end
79
+ # end
38
80
  #
39
- # protected # this is not redundant (method is defined)
81
+ # # good
82
+ # class Foo
83
+ # protected # this is not redundant (a method is defined)
40
84
  #
41
85
  # define_method(:method2) do
42
86
  # end
43
- #
44
- # protected # this is redundant (repeated from previous modifier)
45
- #
46
- # [1,2,3].each do |i|
47
- # define_method("foo#{i}") do
48
- # end
49
- # end
50
- #
51
- # # The following is redundant (methods defined on the class'
52
- # # singleton class are not affected by the public modifier)
53
- # public
54
- #
55
- # def self.method3
56
- # end
57
87
  # end
58
88
  #
59
- # @example
89
+ # @example ContextCreatingMethods: concerning
60
90
  # # Lint/UselessAccessModifier:
61
91
  # # ContextCreatingMethods:
62
92
  # # - concerning
93
+ #
94
+ # # good
63
95
  # require 'active_support/concern'
64
96
  # class Foo
65
97
  # concerning :Bar do
@@ -79,10 +111,12 @@ module RuboCop
79
111
  # end
80
112
  # end
81
113
  #
82
- # @example
114
+ # @example MethodCreatingMethods: delegate
83
115
  # # Lint/UselessAccessModifier:
84
116
  # # MethodCreatingMethods:
85
117
  # # - delegate
118
+ #
119
+ # # good
86
120
  # require 'active_support/core_ext/module/delegation'
87
121
  # class Foo
88
122
  # # this is not redundant because `delegate` creates methods
@@ -141,7 +175,7 @@ module RuboCop
141
175
 
142
176
  def access_modifier?(node)
143
177
  node.bare_access_modifier? ||
144
- node.method_name == :private_class_method
178
+ node.method?(:private_class_method)
145
179
  end
146
180
 
147
181
  def check_scope(node)
@@ -169,7 +203,7 @@ module RuboCop
169
203
  def check_send_node(node, cur_vis, unused)
170
204
  if node.bare_access_modifier?
171
205
  check_new_visibility(node, unused, node.method_name, cur_vis)
172
- elsif node.method_name == :private_class_method && !node.arguments?
206
+ elsif node.method?(:private_class_method) && !node.arguments?
173
207
  add_offense(node, message: format(MSG, current: node.method_name))
174
208
  [cur_vis, unused]
175
209
  end
@@ -155,7 +155,7 @@ module RuboCop
155
155
  return true if node.literal?
156
156
  return false unless node.send_type?
157
157
 
158
- node.method_name == :new
158
+ node.method?(:new)
159
159
  end
160
160
  end
161
161
  end
@@ -20,7 +20,7 @@ module RuboCop
20
20
  alias on_defs on_def
21
21
 
22
22
  def on_block(node)
23
- return unless node.send_node.method_name == :define_method
23
+ return unless node.send_node.method?(:define_method)
24
24
 
25
25
  check_code_length(node)
26
26
  end
@@ -10,13 +10,24 @@ module RuboCop
10
10
 
11
11
  MSG = 'Department name is missing.'
12
12
 
13
+ DISABLE_COMMENT_FORMAT =
14
+ /\A(# *rubocop *: *((dis|en)able|todo) +)(.*)/.freeze
15
+
16
+ # The token that makes up a disable comment.
17
+ # The token used after `# rubocop: disable` are `A-z`, `/`, and `,`.
18
+ # Also `A-z` includes `all`.
19
+ DISABLING_COPS_CONTENT_TOKEN = %r{[A-z/,]+}.freeze
20
+
13
21
  def investigate(processed_source)
14
22
  processed_source.each_comment do |comment|
15
- next if comment.text !~ /\A(# *rubocop:((dis|en)able|todo) +)(.*)/
23
+ next if comment.text !~ DISABLE_COMMENT_FORMAT
16
24
 
17
25
  offset = Regexp.last_match(1).length
18
26
  Regexp.last_match(4).scan(%r{[\w/]+|\W+}) do |name|
27
+ break unless valid_content_token?(name.strip)
28
+
19
29
  check_cop_name(name, comment, offset)
30
+
20
31
  offset += name.length
21
32
  end
22
33
  end
@@ -38,6 +49,10 @@ module RuboCop
38
49
  range = range_between(start, start + name.length)
39
50
  add_offense(range, location: range)
40
51
  end
52
+
53
+ def valid_content_token?(content_token)
54
+ !DISABLING_COPS_CONTENT_TOKEN.match(content_token).nil?
55
+ end
41
56
  end
42
57
  end
43
58
  end
@@ -35,7 +35,7 @@ module RuboCop
35
35
  # If this offense is within a line range that is already being
36
36
  # realigned by autocorrect, we report the offense without
37
37
  # autocorrecting it. Two rewrites in the same area by the same
38
- # cop can not be handled. The next iteration will find the
38
+ # cop cannot be handled. The next iteration will find the
39
39
  # offense again and correct it.
40
40
  add_offense(nil, location: expr)
41
41
  else
@@ -40,13 +40,7 @@ module RuboCop
40
40
  end
41
41
 
42
42
  def leading_comment_lines
43
- comments = processed_source.comments
44
-
45
- comments.each_with_object([]) do |comment, leading_comments|
46
- next if comment.loc.line > 3
47
-
48
- leading_comments << comment.text
49
- end
43
+ processed_source.comments.first(3).map(&:text)
50
44
  end
51
45
  end
52
46
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  # Common functionality for checking hash alignment.
6
- module HashAlignment
6
+ module HashAlignmentStyles
7
7
  # Handles calculation of deltas when the enforced style is 'key'.
8
8
  class KeyAlignment
9
9
  def checkable_layout?(_node)
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Help methods for determining if a line is too long.
6
+ module LineLengthHelp
7
+ private
8
+
9
+ def ignore_cop_directives?
10
+ config.for_cop('Layout/LineLength')['IgnoreCopDirectives']
11
+ end
12
+
13
+ def directive_on_source_line?(line_index)
14
+ source_line_number = line_index + processed_source.buffer.first_line
15
+ comment =
16
+ processed_source.comments
17
+ .detect { |e| e.location.line == source_line_number }
18
+
19
+ return false unless comment
20
+
21
+ comment.text.match(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
22
+ end
23
+
24
+ def allow_uri?
25
+ config.for_cop('Layout/LineLength')['AllowURI']
26
+ end
27
+
28
+ def allowed_uri_position?(line, uri_range)
29
+ uri_range.begin < max_line_length &&
30
+ (uri_range.end == line_length(line) ||
31
+ uri_range.end == line_length(line) - 1)
32
+ end
33
+
34
+ def line_length(line)
35
+ line.length + indentation_difference(line)
36
+ end
37
+
38
+ def find_excessive_uri_range(line)
39
+ last_uri_match = match_uris(line).last
40
+ return nil unless last_uri_match
41
+
42
+ begin_position, end_position = last_uri_match.offset(0).map do |pos|
43
+ pos + indentation_difference(line)
44
+ end
45
+ return nil if begin_position < max_line_length &&
46
+ end_position < max_line_length
47
+
48
+ begin_position...end_position
49
+ end
50
+
51
+ def match_uris(string)
52
+ matches = []
53
+ string.scan(uri_regexp) do
54
+ matches << $LAST_MATCH_INFO if valid_uri?($LAST_MATCH_INFO[0])
55
+ end
56
+ matches
57
+ end
58
+
59
+ def indentation_difference(line)
60
+ return 0 unless tab_indentation_width
61
+
62
+ line.match(/^\t*/)[0].size * (tab_indentation_width - 1)
63
+ end
64
+
65
+ def tab_indentation_width
66
+ config.for_cop('Layout/Tab')['IndentationWidth']
67
+ end
68
+
69
+ def uri_regexp
70
+ @uri_regexp ||=
71
+ URI::DEFAULT_PARSER
72
+ .make_regexp(config.for_cop('Layout/LineLength')['URISchemes'])
73
+ end
74
+
75
+ def valid_uri?(uri_ish_string)
76
+ URI.parse(uri_ish_string)
77
+ true
78
+ rescue URI::InvalidURIError, NoMethodError
79
+ false
80
+ end
81
+
82
+ def line_length_without_directive(line)
83
+ before_comment, = line.split(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
84
+ before_comment.rstrip.length
85
+ end
86
+ end
87
+ end
88
+ end
@@ -5,20 +5,20 @@ module RuboCop
5
5
  # This module provides a list of methods that are:
6
6
  # 1. In the NilClass by default
7
7
  # 2. Added to NilClass by explicitly requiring any standard libraries
8
- # 3. Cop's configuration parameter Whitelist.
8
+ # 3. Cop's configuration parameter AllowedMethods.
9
9
  module NilMethods
10
10
  private
11
11
 
12
12
  def nil_methods
13
- nil.methods + other_stdlib_methods + whitelist
13
+ nil.methods + other_stdlib_methods + allowed_methods
14
14
  end
15
15
 
16
16
  def other_stdlib_methods
17
17
  [:to_d]
18
18
  end
19
19
 
20
- def whitelist
21
- cop_config['Whitelist'].map(&:to_sym)
20
+ def allowed_methods
21
+ cop_config['AllowedMethods'].map(&:to_sym)
22
22
  end
23
23
  end
24
24
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Common functionality for handling Rational literals.
6
+ module RationalLiteral
7
+ extend NodePattern::Macros
8
+
9
+ private
10
+
11
+ def_node_matcher :rational_literal?, <<~PATTERN
12
+ (send
13
+ (int _) :/
14
+ (rational _))
15
+ PATTERN
16
+ end
17
+ end
18
+ end
@@ -52,9 +52,9 @@ module RuboCop
52
52
  end
53
53
 
54
54
  def max_line_length
55
- return unless config.for_cop('Metrics/LineLength')['Enabled']
55
+ return unless config.for_cop('Layout/LineLength')['Enabled']
56
56
 
57
- config.for_cop('Metrics/LineLength')['Max']
57
+ config.for_cop('Layout/LineLength')['Max']
58
58
  end
59
59
 
60
60
  def indentation_multiplier
@@ -93,9 +93,12 @@ module RuboCop
93
93
  end
94
94
 
95
95
  def method_name_and_arguments_on_same_line?(node)
96
- %i[send csend].include?(node.type) &&
97
- node.loc.selector.line == node.arguments.last.last_line &&
98
- node.last_line == node.arguments.last.last_line
96
+ return false unless node.call_type?
97
+
98
+ line = node.loc.selector.nil? ? node.loc.line : node.loc.selector.line
99
+
100
+ line == node.last_argument.last_line &&
101
+ node.last_line == node.last_argument.last_line
99
102
  end
100
103
 
101
104
  # A single argument with the closing bracket on the same line as the end
@@ -11,9 +11,9 @@ module RuboCop
11
11
  # The `AllowNamesEndingInNumbers` config option takes a boolean. When
12
12
  # set to false, this cop will register offenses for names ending with
13
13
  # numbers. Its default is false. The `AllowedNames` config option
14
- # takes an array of whitelisted names that will never register an
14
+ # takes an array of permitted names that will never register an
15
15
  # offense. The `ForbiddenNames` config option takes an array of
16
- # blacklisted names that will always register an offense.
16
+ # restricted names that will always register an offense.
17
17
  #
18
18
  # @example
19
19
  # # bad
@@ -35,7 +35,7 @@ module RuboCop
35
35
  # foo { |speed, distance| speed * distance }
36
36
  #
37
37
  # baz { |age, height, gender| do_stuff(age, height, gender) }
38
- class UncommunicativeBlockParamName < Cop
38
+ class BlockParameterName < Cop
39
39
  include UncommunicativeName
40
40
 
41
41
  def on_block(node)
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module Naming
6
6
  # This cop checks that your heredocs are using meaningful delimiters.
7
7
  # By default it disallows `END` and `EO*`, and can be configured through
8
- # blacklisting additional delimiters.
8
+ # forbidden listing additional delimiters.
9
9
  #
10
10
  # @example
11
11
  #
@@ -41,13 +41,13 @@ module RuboCop
41
41
 
42
42
  return false unless delimiters =~ /\w/
43
43
 
44
- blacklisted_delimiters.none? do |blacklisted_delimiter|
45
- delimiters =~ Regexp.new(blacklisted_delimiter)
44
+ forbidden_delimiters.none? do |forbidden_delimiter|
45
+ delimiters =~ Regexp.new(forbidden_delimiter)
46
46
  end
47
47
  end
48
48
 
49
- def blacklisted_delimiters
50
- cop_config['Blacklist'] || []
49
+ def forbidden_delimiters
50
+ cop_config['ForbiddenDelimiters'] || []
51
51
  end
52
52
  end
53
53
  end
@@ -11,9 +11,9 @@ module RuboCop
11
11
  # The `AllowNamesEndingInNumbers` config option takes a boolean. When
12
12
  # set to false, this cop will register offenses for names ending with
13
13
  # numbers. Its default is false. The `AllowedNames` config option
14
- # takes an array of whitelisted names that will never register an
14
+ # takes an array of permitted names that will never register an
15
15
  # offense. The `ForbiddenNames` config option takes an array of
16
- # blacklisted names that will always register an offense.
16
+ # restricted names that will always register an offense.
17
17
  #
18
18
  # @example
19
19
  # # bad
@@ -43,13 +43,13 @@ module RuboCop
43
43
  # def baz(age_a, height_b, gender_c)
44
44
  # do_stuff(age_a, height_b, gender_c)
45
45
  # end
46
- class UncommunicativeMethodParamName < Cop
46
+ class MethodParameterName < Cop
47
47
  include UncommunicativeName
48
48
 
49
49
  def on_def(node)
50
50
  return unless node.arguments?
51
51
 
52
- check(node, node.arguments)
52
+ check(node, node.arguments.reject(&:forward_args_type?))
53
53
  end
54
54
  alias on_defs on_def
55
55
  end
@@ -70,11 +70,11 @@ module RuboCop
70
70
  !method_name.match(/^#{prefix}[^0-9]/) ||
71
71
  method_name == expected_name(method_name, prefix) ||
72
72
  method_name.end_with?('=') ||
73
- predicate_whitelist.include?(method_name)
73
+ allowed_methods.include?(method_name)
74
74
  end
75
75
 
76
76
  def expected_name(method_name, prefix)
77
- new_name = if prefix_blacklist.include?(prefix)
77
+ new_name = if forbidden_prefixes.include?(prefix)
78
78
  method_name.sub(prefix, '')
79
79
  else
80
80
  method_name.dup
@@ -87,16 +87,16 @@ module RuboCop
87
87
  "Rename `#{method_name}` to `#{new_name}`."
88
88
  end
89
89
 
90
- def prefix_blacklist
91
- cop_config['NamePrefixBlacklist']
90
+ def forbidden_prefixes
91
+ cop_config['ForbiddenPrefixes']
92
92
  end
93
93
 
94
94
  def predicate_prefixes
95
95
  cop_config['NamePrefix']
96
96
  end
97
97
 
98
- def predicate_whitelist
99
- cop_config['NameWhitelist']
98
+ def allowed_methods
99
+ cop_config['AllowedMethods']
100
100
  end
101
101
 
102
102
  def method_definition_macros(macro_name)
@@ -65,6 +65,17 @@ module RuboCop
65
65
  freeze
66
66
  end
67
67
 
68
+ # @api public
69
+ #
70
+ # @!attribute [r] correctable?
71
+ #
72
+ # @return [Boolean]
73
+ # whether this offense can be automatically corrected via
74
+ # autocorrect or a todo.
75
+ def correctable?
76
+ @status != :unsupported
77
+ end
78
+
68
79
  # @api public
69
80
  #
70
81
  # @!attribute [r] corrected?
@@ -146,10 +146,15 @@ module RuboCop
146
146
 
147
147
  def enabled?(cop, config, only_safe)
148
148
  cfg = config.for_cop(cop)
149
+
150
+ # cfg['Enabled'] might be a string `pending`, which is considered
151
+ # disabled
152
+ cop_enabled = cfg.fetch('Enabled') == true
153
+
149
154
  if only_safe
150
- cfg.fetch('Enabled') && cfg.fetch('Safe', true)
155
+ cop_enabled && cfg.fetch('Safe', true)
151
156
  else
152
- cfg.fetch('Enabled')
157
+ cop_enabled
153
158
  end
154
159
  end
155
160
 
@@ -91,7 +91,7 @@ module RuboCop
91
91
  when :def, :defs
92
92
  return :dynamic
93
93
  when :block
94
- return :instance_eval if parent.method_name == :instance_eval
94
+ return :instance_eval if parent.method?(:instance_eval)
95
95
 
96
96
  return :dynamic
97
97
  end