rubocop 0.75.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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +341 -316
  4. data/lib/rubocop.rb +48 -31
  5. data/lib/rubocop/ast/builder.rb +43 -41
  6. data/lib/rubocop/ast/node.rb +5 -1
  7. data/lib/rubocop/ast/node/block_node.rb +2 -0
  8. data/lib/rubocop/ast/node/def_node.rb +11 -0
  9. data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
  10. data/lib/rubocop/ast/node/return_node.rb +24 -0
  11. data/lib/rubocop/ast/traversal.rb +11 -3
  12. data/lib/rubocop/cli.rb +11 -227
  13. data/lib/rubocop/cli/command.rb +21 -0
  14. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  15. data/lib/rubocop/cli/command/base.rb +33 -0
  16. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  17. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  18. data/lib/rubocop/cli/command/show_cops.rb +80 -0
  19. data/lib/rubocop/cli/command/version.rb +17 -0
  20. data/lib/rubocop/cli/environment.rb +21 -0
  21. data/lib/rubocop/comment_config.rb +2 -2
  22. data/lib/rubocop/config.rb +8 -1
  23. data/lib/rubocop/config_loader.rb +20 -20
  24. data/lib/rubocop/config_loader_resolver.rb +2 -1
  25. data/lib/rubocop/config_obsoletion.rb +73 -11
  26. data/lib/rubocop/config_validator.rb +77 -110
  27. data/lib/rubocop/cop/autocorrect_logic.rb +7 -4
  28. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
  30. data/lib/rubocop/cop/commissioner.rb +15 -7
  31. data/lib/rubocop/cop/cop.rb +31 -6
  32. data/lib/rubocop/cop/corrector.rb +8 -7
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  34. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
  35. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  36. data/lib/rubocop/cop/generator.rb +3 -4
  37. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  38. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  40. data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
  41. data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
  42. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +3 -2
  43. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  44. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  45. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
  46. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
  47. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
  48. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  49. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  50. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
  51. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
  52. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
  53. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  54. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +16 -8
  55. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +5 -5
  56. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  57. data/lib/rubocop/cop/{metrics → layout}/line_length.rb +41 -114
  58. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  59. data/lib/rubocop/cop/layout/multiline_block_layout.rb +14 -5
  60. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  61. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  62. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  63. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  64. data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
  65. data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
  66. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  67. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +7 -4
  68. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  69. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  70. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  71. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  72. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  73. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  74. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  75. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
  76. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  77. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  78. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
  79. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  80. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
  81. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +10 -12
  82. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  83. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
  84. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
  85. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  86. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  87. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  88. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
  89. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  90. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  91. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
  92. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  93. data/lib/rubocop/cop/lint/void.rb +7 -26
  94. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  95. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  96. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  97. data/lib/rubocop/cop/migration/department_name.rb +16 -1
  98. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  99. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -7
  100. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  101. data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
  102. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  103. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  104. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  105. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
  106. data/lib/rubocop/cop/mixin/trailing_comma.rb +14 -9
  107. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  108. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  109. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
  110. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +4 -4
  111. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  112. data/lib/rubocop/cop/offense.rb +11 -0
  113. data/lib/rubocop/cop/registry.rb +8 -3
  114. data/lib/rubocop/cop/style/alias.rb +1 -1
  115. data/lib/rubocop/cop/style/array_join.rb +1 -1
  116. data/lib/rubocop/cop/style/attr.rb +10 -2
  117. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +6 -6
  118. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  119. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -2
  120. data/lib/rubocop/cop/style/copyright.rb +11 -7
  121. data/lib/rubocop/cop/style/documentation_method.rb +44 -0
  122. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +2 -2
  123. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  124. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  125. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  126. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  127. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  128. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  129. data/lib/rubocop/cop/style/format_string.rb +10 -7
  130. data/lib/rubocop/cop/style/format_string_token.rb +15 -34
  131. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +10 -0
  132. data/lib/rubocop/cop/style/guard_clause.rb +3 -2
  133. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  134. data/lib/rubocop/cop/style/if_unless_modifier.rb +45 -3
  135. data/lib/rubocop/cop/style/infinite_loop.rb +5 -4
  136. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  137. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  138. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  139. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +24 -227
  140. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +168 -0
  141. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
  142. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  143. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  144. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  145. data/lib/rubocop/cop/style/multiline_when_then.rb +6 -2
  146. data/lib/rubocop/cop/style/nested_modifier.rb +4 -2
  147. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
  148. data/lib/rubocop/cop/style/next.rb +5 -5
  149. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  150. data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
  151. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -3
  152. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  153. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
  154. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  155. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  156. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  157. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -3
  158. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  159. data/lib/rubocop/cop/style/redundant_return.rb +39 -29
  160. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
  161. data/lib/rubocop/cop/style/safe_navigation.rb +19 -8
  162. data/lib/rubocop/cop/style/semicolon.rb +13 -2
  163. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  164. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
  165. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  166. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  167. data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
  168. data/lib/rubocop/cop/team.rb +5 -0
  169. data/lib/rubocop/cop/util.rb +1 -1
  170. data/lib/rubocop/cop/utils/format_string.rb +10 -18
  171. data/lib/rubocop/cop/variable_force.rb +7 -5
  172. data/lib/rubocop/formatter/base_formatter.rb +2 -2
  173. data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
  174. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -12
  175. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  176. data/lib/rubocop/formatter/formatter_set.rb +16 -16
  177. data/lib/rubocop/formatter/json_formatter.rb +6 -5
  178. data/lib/rubocop/formatter/pacman_formatter.rb +3 -3
  179. data/lib/rubocop/formatter/simple_text_formatter.rb +7 -3
  180. data/lib/rubocop/formatter/tap_formatter.rb +9 -6
  181. data/lib/rubocop/node_pattern.rb +4 -2
  182. data/lib/rubocop/options.rb +20 -26
  183. data/lib/rubocop/processed_source.rb +1 -1
  184. data/lib/rubocop/rake_task.rb +1 -0
  185. data/lib/rubocop/result_cache.rb +24 -8
  186. data/lib/rubocop/rspec/shared_contexts.rb +5 -0
  187. data/lib/rubocop/runner.rb +50 -29
  188. data/lib/rubocop/target_finder.rb +12 -6
  189. data/lib/rubocop/target_ruby.rb +151 -0
  190. data/lib/rubocop/version.rb +1 -1
  191. metadata +50 -34
  192. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
@@ -32,13 +32,14 @@ module RuboCop
32
32
  return unless node.body
33
33
 
34
34
  max = cop_config['Max']
35
- complexity = complexity(node.body)
35
+ complexity, abc_vector = complexity(node.body)
36
36
 
37
37
  return unless complexity > max
38
38
 
39
39
  msg = format(self.class::MSG,
40
40
  method: method_name,
41
41
  complexity: complexity,
42
+ abc_vector: abc_vector,
42
43
  max: max)
43
44
 
44
45
  add_offense(node, message: msg) do
@@ -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
@@ -41,17 +41,20 @@ module RuboCop
41
41
  end
42
42
 
43
43
  def length_in_modifier_form(node, cond, body_length)
44
- indentation = node.loc.keyword.column * indentation_multiplier
45
- kw_length = node.loc.keyword.size
44
+ keyword = node.loc.keyword
45
+
46
+ indentation = keyword.column * indentation_multiplier
47
+ kw_length = keyword.size
46
48
  cond_length = cond.source_range.size
47
49
  space = 1
50
+
48
51
  indentation + body_length + space + kw_length + space + cond_length
49
52
  end
50
53
 
51
54
  def max_line_length
52
- return unless config.for_cop('Metrics/LineLength')['Enabled']
55
+ return unless config.for_cop('Layout/LineLength')['Enabled']
53
56
 
54
- config.for_cop('Metrics/LineLength')['Max']
57
+ config.for_cop('Layout/LineLength')['Max']
55
58
  end
56
59
 
57
60
  def indentation_multiplier
@@ -18,12 +18,7 @@ module RuboCop
18
18
 
19
19
  def check(node, items, kind, begin_pos, end_pos)
20
20
  after_last_item = range_between(begin_pos, end_pos)
21
-
22
- # If there is any heredoc in items, then match the comma succeeding
23
- # any whitespace (except newlines), otherwise allow for newlines
24
- comma_regex = any_heredoc?(items) ? /\A[^\S\n]*,/ : /\A\s*,/
25
- comma_offset = after_last_item.source =~ comma_regex &&
26
- after_last_item.source.index(',')
21
+ comma_offset = comma_offset(items, after_last_item)
27
22
 
28
23
  if comma_offset && !inside_comment?(after_last_item, comma_offset)
29
24
  check_comma(node, kind, after_last_item.begin_pos + comma_offset)
@@ -32,6 +27,13 @@ module RuboCop
32
27
  end
33
28
  end
34
29
 
30
+ def comma_offset(items, range)
31
+ # If there is any heredoc in items, then match the comma succeeding
32
+ # any whitespace (except newlines), otherwise allow for newlines
33
+ comma_regex = any_heredoc?(items) ? /\A[^\S\n]*,/ : /\A\s*,/
34
+ range.source =~ comma_regex && range.source.index(',')
35
+ end
36
+
35
37
  def check_comma(node, kind, comma_pos)
36
38
  return if should_have_comma?(style, node)
37
39
 
@@ -91,9 +93,12 @@ module RuboCop
91
93
  end
92
94
 
93
95
  def method_name_and_arguments_on_same_line?(node)
94
- %i[send csend].include?(node.type) &&
95
- node.loc.selector.line == node.arguments.last.last_line &&
96
- 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
97
102
  end
98
103
 
99
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)
@@ -50,14 +50,11 @@ module RuboCop
50
50
  def for_bad_filename(file_path)
51
51
  basename = File.basename(file_path)
52
52
  msg = if filename_good?(basename)
53
- return unless expect_matching_definition?
54
- return if find_class_or_module(processed_source.ast,
55
- to_namespace(file_path))
53
+ return if matching_definition?(file_path)
56
54
 
57
55
  no_definition_message(basename, file_path)
58
56
  else
59
- return if ignore_executable_scripts? &&
60
- processed_source.start_with?('#!')
57
+ return if bad_filename_allowed?
61
58
 
62
59
  other_message(basename)
63
60
  end
@@ -65,6 +62,16 @@ module RuboCop
65
62
  yield source_range(processed_source.buffer, 1, 0), msg
66
63
  end
67
64
 
65
+ def matching_definition?(file_path)
66
+ return true unless expect_matching_definition?
67
+
68
+ find_class_or_module(processed_source.ast, to_namespace(file_path))
69
+ end
70
+
71
+ def bad_filename_allowed?
72
+ ignore_executable_scripts? && processed_source.start_with?('#!')
73
+ end
74
+
68
75
  def no_definition_message(basename, file_path)
69
76
  format(MSG_NO_DEFINITION,
70
77
  basename: basename,
@@ -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?
@@ -122,7 +122,7 @@ module RuboCop
122
122
  def unqualified_cop_names
123
123
  @unqualified_cop_names ||=
124
124
  Set.new(@cops_by_cop_name.keys.map { |qn| File.basename(qn) }) <<
125
- 'UnneededCopDisableDirective'
125
+ 'RedundantCopDisableDirective'
126
126
  end
127
127
 
128
128
  # @return [Hash{String => Array<Class>}]
@@ -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
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses of "*" as a substitute for *join*.
6
+ # This cop checks for uses of "\*" as a substitute for *join*.
7
7
  #
8
8
  # Not all cases can reliably checked, due to Ruby's dynamic
9
9
  # types, so we consider only cases when the first argument is an
@@ -21,6 +21,10 @@ module RuboCop
21
21
 
22
22
  def on_send(node)
23
23
  return unless node.command?(:attr) && node.arguments?
24
+ # check only for method definitions in class/module body
25
+ return if node.parent &&
26
+ !node.parent.class_type? &&
27
+ !class_eval?(node.parent)
24
28
 
25
29
  add_offense(node, location: :selector)
26
30
  end
@@ -31,7 +35,7 @@ module RuboCop
31
35
  node_expr = node.source_range
32
36
  attr_expr = attr_name.source_range
33
37
 
34
- if setter && (setter.true_type? || setter.false_type?)
38
+ if setter&.boolean_type?
35
39
  remove = range_between(attr_expr.end_pos, node_expr.end_pos)
36
40
  end
37
41
 
@@ -50,12 +54,16 @@ module RuboCop
50
54
  def replacement_method(node)
51
55
  setter = node.last_argument
52
56
 
53
- if setter && (setter.true_type? || setter.false_type?)
57
+ if setter&.boolean_type?
54
58
  setter.true_type? ? 'attr_accessor' : 'attr_reader'
55
59
  else
56
60
  'attr_reader'
57
61
  end
58
62
  end
63
+
64
+ def_node_matcher :class_eval?, <<~PATTERN
65
+ (block (send _ {:class_eval :module_eval}) ...)
66
+ PATTERN
59
67
  end
60
68
  end
61
69
  end
@@ -147,16 +147,16 @@ module RuboCop
147
147
  end
148
148
 
149
149
  def remove_braces_with_whitespace(corrector, node, space)
150
+ loc = node.loc
151
+
150
152
  if node.multiline?
151
153
  remove_braces_with_range(corrector,
152
- left_whole_line_range(node.loc.begin),
153
- right_whole_line_range(node.loc.end))
154
+ left_whole_line_range(loc.begin),
155
+ right_whole_line_range(loc.end))
154
156
  else
155
- right_brace_and_space = right_brace_and_space(node.loc.end, space)
156
- left_brace_and_space = left_brace_and_space(node.loc.begin, space)
157
157
  remove_braces_with_range(corrector,
158
- left_brace_and_space,
159
- right_brace_and_space)
158
+ left_brace_and_space(loc.begin, space),
159
+ right_brace_and_space(loc.end, space))
160
160
  end
161
161
  end
162
162
 
@@ -49,10 +49,10 @@ module RuboCop
49
49
  next unless annotation?(comment) &&
50
50
  !correct_annotation?(first_word, colon, space, note)
51
51
 
52
- length = concat_length(first_word, colon, space)
53
52
  add_offense(
54
53
  comment,
55
- location: annotation_range(comment, margin, length),
54
+ location: annotation_range(comment, margin,
55
+ first_word, colon, space),
56
56
  message: format(note ? MSG : MISSING_NOTE, keyword: first_word)
57
57
  )
58
58
  end
@@ -62,8 +62,7 @@ module RuboCop
62
62
  margin, first_word, colon, space, note = split_comment(comment)
63
63
  return if note.nil?
64
64
 
65
- length = concat_length(first_word, colon, space)
66
- range = annotation_range(comment, margin, length)
65
+ range = annotation_range(comment, margin, first_word, colon, space)
67
66
 
68
67
  ->(corrector) { corrector.replace(range, "#{first_word.upcase}: ") }
69
68
  end
@@ -79,8 +78,9 @@ module RuboCop
79
78
  !comment_line?(comment.loc.expression.source_line)
80
79
  end
81
80
 
82
- def annotation_range(comment, margin, length)
81
+ def annotation_range(comment, margin, first_word, colon, space)
83
82
  start = comment.loc.expression.begin_pos + margin.length
83
+ length = concat_length(first_word, colon, space)
84
84
  range_between(start, start + length)
85
85
  end
86
86
 
@@ -212,7 +212,7 @@ module RuboCop
212
212
  %i[casgn cvasgn gvasgn ivasgn lvasgn].freeze
213
213
  ASSIGNMENT_TYPES = VARIABLE_ASSIGNMENT_TYPES +
214
214
  %i[and_asgn or_asgn op_asgn masgn].freeze
215
- LINE_LENGTH = 'Metrics/LineLength'
215
+ LINE_LENGTH = 'Layout/LineLength'
216
216
  INDENTATION_WIDTH = 'Layout/IndentationWidth'
217
217
  ENABLED = 'Enabled'
218
218
  MAX = 'Max'
@@ -376,7 +376,7 @@ module RuboCop
376
376
  assignment_types_match?(*statements)
377
377
  end
378
378
 
379
- # If `Metrics/LineLength` is enabled, we do not want to introduce an
379
+ # If `Layout/LineLength` is enabled, we do not want to introduce an
380
380
  # offense by auto-correcting this cop. Find the max configured line
381
381
  # length. Find the longest line of condition. Remove the assignment
382
382
  # from lines that contain the offending assignment because after