rubocop 0.74.0 → 0.78.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 (213) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/config/default.yml +366 -318
  4. data/lib/rubocop.rb +48 -32
  5. data/lib/rubocop/ast/builder.rb +1 -0
  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/mixin/method_dispatch_node.rb +1 -12
  9. data/lib/rubocop/ast/node/return_node.rb +24 -0
  10. data/lib/rubocop/cli.rb +11 -227
  11. data/lib/rubocop/cli/command.rb +21 -0
  12. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  13. data/lib/rubocop/cli/command/base.rb +33 -0
  14. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  15. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  16. data/lib/rubocop/cli/command/show_cops.rb +73 -0
  17. data/lib/rubocop/cli/command/version.rb +17 -0
  18. data/lib/rubocop/cli/environment.rb +21 -0
  19. data/lib/rubocop/comment_config.rb +5 -4
  20. data/lib/rubocop/config.rb +12 -1
  21. data/lib/rubocop/config_loader.rb +21 -3
  22. data/lib/rubocop/config_loader_resolver.rb +4 -3
  23. data/lib/rubocop/config_obsoletion.rb +85 -11
  24. data/lib/rubocop/config_validator.rb +28 -19
  25. data/lib/rubocop/cop/autocorrect_logic.rb +3 -3
  26. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  27. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
  28. data/lib/rubocop/cop/commissioner.rb +15 -7
  29. data/lib/rubocop/cop/cop.rb +35 -9
  30. data/lib/rubocop/cop/corrector.rb +8 -7
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
  32. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  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/generator.rb +3 -3
  36. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  37. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  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} +11 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
  46. data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
  47. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
  48. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
  50. data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
  51. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -7
  52. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
  53. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
  54. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
  55. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  56. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +8 -4
  57. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +6 -6
  58. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  59. data/lib/rubocop/cop/{metrics → layout}/line_length.rb +41 -114
  60. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  64. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  67. data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
  68. data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
  69. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
  70. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
  71. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
  72. data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
  73. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -0
  74. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  75. data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
  76. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  77. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  78. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  79. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  80. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  81. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
  82. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
  83. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  84. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
  85. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
  86. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  87. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  88. data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
  89. data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +10 -12
  90. data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
  91. data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
  92. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
  93. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  94. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  95. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
  96. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  97. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
  98. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  99. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  100. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
  101. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  102. data/lib/rubocop/cop/lint/void.rb +7 -26
  103. data/lib/rubocop/cop/message_annotator.rb +16 -7
  104. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  105. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  106. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
  107. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  108. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  109. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  110. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  111. data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
  112. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  113. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  114. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  115. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
  116. data/lib/rubocop/cop/mixin/trailing_comma.rb +14 -9
  117. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  118. data/lib/rubocop/cop/naming/file_name.rb +12 -5
  119. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
  120. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  121. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
  122. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  123. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  124. data/lib/rubocop/cop/offense.rb +29 -7
  125. data/lib/rubocop/cop/registry.rb +22 -1
  126. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  127. data/lib/rubocop/cop/style/alias.rb +1 -1
  128. data/lib/rubocop/cop/style/array_join.rb +1 -1
  129. data/lib/rubocop/cop/style/attr.rb +10 -2
  130. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  131. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
  132. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  133. data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
  134. data/lib/rubocop/cop/style/commented_keyword.rb +8 -2
  135. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -6
  136. data/lib/rubocop/cop/style/copyright.rb +11 -7
  137. data/lib/rubocop/cop/style/documentation_method.rb +44 -0
  138. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +10 -4
  139. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  140. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  141. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  142. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  143. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  144. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  145. data/lib/rubocop/cop/style/format_string.rb +10 -7
  146. data/lib/rubocop/cop/style/format_string_token.rb +19 -68
  147. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
  148. data/lib/rubocop/cop/style/guard_clause.rb +3 -2
  149. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  150. data/lib/rubocop/cop/style/if_unless_modifier.rb +93 -15
  151. data/lib/rubocop/cop/style/infinite_loop.rb +6 -5
  152. data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
  153. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  154. data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
  155. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
  156. data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
  157. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  158. data/lib/rubocop/cop/style/mixin_usage.rb +11 -1
  159. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  160. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  161. data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
  162. data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
  163. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
  164. data/lib/rubocop/cop/style/next.rb +5 -5
  165. data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
  166. data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
  167. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  168. data/lib/rubocop/cop/style/or_assignment.rb +6 -1
  169. data/lib/rubocop/cop/style/parentheses_around_condition.rb +14 -0
  170. data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
  171. data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
  172. data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
  173. data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -7
  174. data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
  175. data/lib/rubocop/cop/style/redundant_return.rb +39 -29
  176. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  177. data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
  178. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  179. data/lib/rubocop/cop/style/safe_navigation.rb +23 -3
  180. data/lib/rubocop/cop/style/semicolon.rb +13 -2
  181. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  182. data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
  183. data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
  184. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
  185. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  186. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  187. data/lib/rubocop/cop/team.rb +5 -0
  188. data/lib/rubocop/cop/util.rb +1 -1
  189. data/lib/rubocop/cop/utils/format_string.rb +120 -0
  190. data/lib/rubocop/cop/variable_force.rb +7 -5
  191. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  192. data/lib/rubocop/core_ext/string.rb +0 -24
  193. data/lib/rubocop/formatter/base_formatter.rb +2 -2
  194. data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
  195. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  196. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  197. data/lib/rubocop/formatter/formatter_set.rb +16 -15
  198. data/lib/rubocop/formatter/json_formatter.rb +6 -5
  199. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  200. data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
  201. data/lib/rubocop/formatter/tap_formatter.rb +18 -7
  202. data/lib/rubocop/magic_comment.rb +4 -0
  203. data/lib/rubocop/node_pattern.rb +4 -2
  204. data/lib/rubocop/options.rb +21 -26
  205. data/lib/rubocop/processed_source.rb +1 -1
  206. data/lib/rubocop/rake_task.rb +1 -0
  207. data/lib/rubocop/result_cache.rb +24 -8
  208. data/lib/rubocop/runner.rb +60 -33
  209. data/lib/rubocop/target_finder.rb +12 -6
  210. data/lib/rubocop/version.rb +1 -1
  211. metadata +48 -33
  212. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
  213. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
@@ -46,7 +46,7 @@ module RuboCop
46
46
 
47
47
  add_missing_namespaces(path, hash)
48
48
 
49
- resolver.resolve_inheritance_from_gems(hash, hash.delete('inherit_gem'))
49
+ resolver.resolve_inheritance_from_gems(hash)
50
50
  resolver.resolve_inheritance(path, hash, file, debug?)
51
51
 
52
52
  hash.delete('inherit_from')
@@ -199,6 +199,8 @@ module RuboCop
199
199
  raise(TypeError, "Malformed configuration in #{absolute_path}")
200
200
  end
201
201
 
202
+ check_cop_config_value(hash)
203
+
202
204
  hash
203
205
  end
204
206
 
@@ -220,6 +222,22 @@ module RuboCop
220
222
  end
221
223
  end
222
224
 
225
+ def check_cop_config_value(hash, parent = nil)
226
+ hash.each do |key, value|
227
+ check_cop_config_value(value, key) if value.is_a?(Hash)
228
+
229
+ next unless %w[Enabled
230
+ Safe
231
+ SafeAutoCorrect
232
+ AutoCorrect].include?(key) && value.is_a?(String)
233
+
234
+ abort(
235
+ "Property #{Rainbow(key).yellow} of cop #{Rainbow(parent).yellow}" \
236
+ " is supposed to be a boolean and #{Rainbow(value).yellow} is not."
237
+ )
238
+ end
239
+ end
240
+
223
241
  # Read the specified file, or exit with a friendly, concise message on
224
242
  # stderr. Care is taken to use the standard OS exit code for a "file not
225
243
  # found" error.
@@ -240,11 +258,11 @@ module RuboCop
240
258
  yaml_code,
241
259
  permitted_classes: [Regexp, Symbol],
242
260
  permitted_symbols: [],
243
- aliases: false,
261
+ aliases: true,
244
262
  filename: filename
245
263
  )
246
264
  else
247
- YAML.safe_load(yaml_code, [Regexp, Symbol], [], false, filename)
265
+ YAML.safe_load(yaml_code, [Regexp, Symbol], [], true, filename)
248
266
  end
249
267
  end
250
268
  end
@@ -35,7 +35,8 @@ module RuboCop
35
35
  end
36
36
  end
37
37
 
38
- def resolve_inheritance_from_gems(hash, gems)
38
+ def resolve_inheritance_from_gems(hash)
39
+ gems = hash.delete('inherit_gem')
39
40
  (gems || {}).each_pair do |gem_name, config_path|
40
41
  if gem_name == 'rubocop'
41
42
  raise ArgumentError,
@@ -73,7 +74,7 @@ module RuboCop
73
74
 
74
75
  opts = { inherit_mode: config['inherit_mode'] || {},
75
76
  unset_nil: unset_nil }
76
- Config.new(merge(default_configuration, config, opts), config_file)
77
+ Config.new(merge(default_configuration, config, **opts), config_file)
77
78
  end
78
79
 
79
80
  # Return a recursive merge of two hashes. That is, a normal hash merge,
@@ -92,7 +93,7 @@ module RuboCop
92
93
  elsif should_union?(base_hash, key, opts[:inherit_mode])
93
94
  result[key] = base_hash[key] | derived_hash[key]
94
95
  elsif opts[:debug]
95
- warn_on_duplicate_setting(base_hash, derived_hash, key, opts)
96
+ warn_on_duplicate_setting(base_hash, derived_hash, key, **opts)
96
97
  end
97
98
  end
98
99
  result
@@ -4,13 +4,39 @@ module RuboCop
4
4
  # This class handles obsolete configuration.
5
5
  class ConfigObsoletion
6
6
  RENAMED_COPS = {
7
- 'Style/SingleSpaceBeforeFirstArg' => 'Layout/SpaceBeforeFirstArg',
8
- 'Style/MethodCallParentheses' => 'Style/MethodCallWithoutArgsParentheses',
7
+ 'Layout/AlignArguments' => 'Layout/ArgumentAlignment',
8
+ 'Layout/AlignArray' => 'Layout/ArrayAlignment',
9
+ 'Layout/AlignHash' => 'Layout/HashAlignment',
10
+ 'Layout/AlignParameters' => 'Layout/ParameterAlignment',
11
+ 'Layout/IndentArray' => 'Layout/FirstArrayElementIndentation',
12
+ 'Layout/IndentAssignment' => 'Layout/AssignmentIndentation',
13
+ 'Layout/IndentFirstArgument' => 'Layout/FirstArgumentIndentation',
14
+ 'Layout/IndentFirstArrayElement' => 'Layout/FirstArrayElementIndentation',
15
+ 'Layout/IndentFirstHashElement' => 'Layout/FirstHashElementIndentation',
16
+ 'Layout/IndentFirstParameter' => 'Layout/FirstParameterIndentation',
17
+ 'Layout/IndentHash' => 'Layout/FirstHashElementIndentation',
18
+ 'Layout/IndentHeredoc' => 'Layout/HeredocIndentation',
19
+ 'Layout/LeadingBlankLines' => 'Layout/LeadingEmptyLines',
20
+ 'Layout/TrailingBlankLines' => 'Layout/TrailingEmptyLines',
21
+ 'Lint/DuplicatedKey' => 'Lint/DuplicateHashKey',
22
+ 'Lint/HandleExceptions' => 'Lint/SuppressedException',
23
+ 'Lint/MultipleCompare' => 'Lint/MultipleComparison',
24
+ 'Lint/StringConversionInInterpolation' => 'Lint/RedundantStringCoercion',
25
+ 'Lint/UnneededCopDisableDirective' => 'Lint/RedundantCopDisableDirective',
26
+ 'Lint/UnneededCopEnableDirective' => 'Lint/RedundantCopEnableDirective',
27
+ 'Lint/UnneededRequireStatement' => 'Lint/RedundantRequireStatement',
28
+ 'Lint/UnneededSplatExpansion' => 'Lint/RedundantSplatExpansion',
29
+ 'Naming/UncommunicativeBlockParamName' => 'Naming/BlockParameterName',
30
+ 'Naming/UncommunicativeMethodParamName' => 'Naming/MethodParameterName',
9
31
  'Style/DeprecatedHashMethods' => 'Style/PreferredHashMethods',
32
+ 'Style/MethodCallParentheses' => 'Style/MethodCallWithoutArgsParentheses',
10
33
  'Style/OpMethod' => 'Naming/BinaryOperatorParameterName',
11
- 'Layout/FirstParameterIndentation' => 'Layout/IndentFirstArgument',
12
- 'Layout/IndentArray' => 'Layout/IndentFirstArrayElement',
13
- 'Layout/IndentHash' => 'Layout/IndentFirstHashElement'
34
+ 'Style/SingleSpaceBeforeFirstArg' => 'Layout/SpaceBeforeFirstArg',
35
+ 'Style/UnneededCapitalW' => 'Style/RedundantCapitalW',
36
+ 'Style/UnneededCondition' => 'Style/RedundantCondition',
37
+ 'Style/UnneededInterpolation' => 'Style/RedundantInterpolation',
38
+ 'Style/UnneededPercentQ' => 'Style/RedundantPercentQ',
39
+ 'Style/UnneededSort' => 'Style/RedundantSort'
14
40
  }.map do |old_name, new_name|
15
41
  [old_name, "The `#{old_name}` cop has been renamed to `#{new_name}`."]
16
42
  end
@@ -22,7 +48,7 @@ module RuboCop
22
48
  Style/VariableName Style/VariableNumber
23
49
  Style/AccessorMethodName Style/AsciiIdentifiers],
24
50
  'Layout' => %w[Lint/BlockAlignment Lint/EndAlignment
25
- Lint/DefEndAlignment],
51
+ Lint/DefEndAlignment Metrics/LineLength],
26
52
  'Lint' => 'Style/FlipFlop'
27
53
  }.map do |new_department, old_names|
28
54
  Array(old_names).map do |old_name|
@@ -32,9 +58,10 @@ module RuboCop
32
58
  end
33
59
 
34
60
  REMOVED_COPS = {
35
- 'Rails/DefaultScope' => nil,
36
61
  'Layout/SpaceAfterControlKeyword' => 'Layout/SpaceAroundKeyword',
37
62
  'Layout/SpaceBeforeModifierKeyword' => 'Layout/SpaceAroundKeyword',
63
+ 'Lint/RescueWithoutErrorClass' => 'Style/RescueStandardError',
64
+ 'Rails/DefaultScope' => nil,
38
65
  'Style/SpaceAfterControlKeyword' => 'Layout/SpaceAroundKeyword',
39
66
  'Style/SpaceBeforeModifierKeyword' => 'Layout/SpaceAroundKeyword',
40
67
  'Style/TrailingComma' => 'Style/TrailingCommaInArguments, ' \
@@ -42,8 +69,7 @@ module RuboCop
42
69
  'Style/TrailingCommaInHashLiteral',
43
70
  'Style/TrailingCommaInLiteral' => 'Style/TrailingCommaInArrayLiteral ' \
44
71
  'and/or ' \
45
- 'Style/TrailingCommaInHashLiteral',
46
- 'Lint/RescueWithoutErrorClass' => 'Style/RescueStandardError'
72
+ 'Style/TrailingCommaInHashLiteral'
47
73
  }.map do |old_name, other_cops|
48
74
  if other_cops
49
75
  more = ". Please use #{other_cops} instead".gsub(%r{[A-Z]\w+/\w+},
@@ -88,13 +114,13 @@ module RuboCop
88
114
  cops: 'Style/IfUnlessModifier',
89
115
  parameters: 'MaxLineLength',
90
116
  alternative: '`Style/IfUnlessModifier: MaxLineLength` has been ' \
91
- 'removed. Use `Metrics/LineLength: Max` instead'
117
+ 'removed. Use `Layout/LineLength: Max` instead'
92
118
  },
93
119
  {
94
120
  cops: 'Style/WhileUntilModifier',
95
121
  parameters: 'MaxLineLength',
96
122
  alternative: '`Style/WhileUntilModifier: MaxLineLength` has been ' \
97
- 'removed. Use `Metrics/LineLength: Max` instead'
123
+ 'removed. Use `Layout/LineLength: Max` instead'
98
124
  },
99
125
  {
100
126
  cops: 'AllCops',
@@ -119,6 +145,54 @@ module RuboCop
119
145
  cops: 'Rails/UniqBeforePluck',
120
146
  parameters: 'EnforcedMode',
121
147
  alternative: '`EnforcedMode` has been renamed to `EnforcedStyle`'
148
+ },
149
+ {
150
+ cops: 'Style/MethodCallWithArgsParentheses',
151
+ parameters: 'IgnoredMethodPatterns',
152
+ alternative: '`IgnoredMethodPatterns` has been renamed to ' \
153
+ '`IgnoredPatterns`'
154
+ },
155
+ {
156
+ cops: %w[Performance/Count Performance/Detect],
157
+ parameters: 'SafeMode',
158
+ alternative: '`SafeMode` has been removed. ' \
159
+ 'Use `SafeAutoCorrect` instead.'
160
+ },
161
+ {
162
+ cops: 'Bundler/GemComment',
163
+ parameters: 'Whitelist',
164
+ alternative: '`Whitelist` has been renamed to `IgnoredGems`.'
165
+ },
166
+ {
167
+ cops: %w[
168
+ Lint/SafeNavigationChain Lint/SafeNavigationConsistency
169
+ Style/NestedParenthesizedCalls Style/SafeNavigation
170
+ Style/TrivialAccessors
171
+ ],
172
+ parameters: 'Whitelist',
173
+ alternative: '`Whitelist` has been renamed to `AllowedMethods`.'
174
+ },
175
+ {
176
+ cops: 'Style/IpAddresses',
177
+ parameters: 'Whitelist',
178
+ alternative: '`Whitelist` has been renamed to `AllowedAddresses`.'
179
+ },
180
+ {
181
+ cops: 'Naming/HeredocDelimiterNaming',
182
+ parameters: 'Blacklist',
183
+ alternative: '`Blacklist` has been renamed to `ForbiddenDelimiters`.'
184
+ },
185
+ {
186
+ cops: 'Naming/PredicateName',
187
+ parameters: 'NamePrefixBlacklist',
188
+ alternative: '`NamePrefixBlacklist` has been renamed to ' \
189
+ '`ForbiddenPrefixes`.'
190
+ },
191
+ {
192
+ cops: 'Naming/PredicateName',
193
+ parameters: 'NameWhitelist',
194
+ alternative: '`NameWhitelist` has been renamed to ' \
195
+ '`AllowedMethods`.'
122
196
  }
123
197
  ].freeze
124
198
 
@@ -10,8 +10,9 @@ module RuboCop
10
10
 
11
11
  COMMON_PARAMS = %w[Exclude Include Severity inherit_mode
12
12
  AutoCorrect StyleGuide Details].freeze
13
- INTERNAL_PARAMS = %w[Description StyleGuide VersionAdded
14
- VersionChanged Reference Safe SafeAutoCorrect].freeze
13
+ INTERNAL_PARAMS = %w[Description StyleGuide
14
+ VersionAdded VersionChanged VersionRemoved
15
+ Reference Safe SafeAutoCorrect].freeze
15
16
 
16
17
  # 2.3 is the oldest officially supported Ruby version.
17
18
  DEFAULT_RUBY_VERSION = 2.3
@@ -32,10 +33,7 @@ module RuboCop
32
33
 
33
34
  def validate
34
35
  # Don't validate RuboCop's own files. Avoids infinite recursion.
35
- base_config_path = File.expand_path(File.join(ConfigLoader::RUBOCOP_HOME,
36
- 'config'))
37
- return if File.expand_path(@config.loaded_path)
38
- .start_with?(base_config_path)
36
+ return if @config.internal?
39
37
 
40
38
  valid_cop_names, invalid_cop_names = @config.keys.partition do |key|
41
39
  ConfigLoader.default_configuration.key?(key)
@@ -43,7 +41,7 @@ module RuboCop
43
41
 
44
42
  @config_obsoletion.reject_obsolete_cops_and_parameters
45
43
 
46
- warn_about_unrecognized_cops(invalid_cop_names)
44
+ alert_about_unrecognized_cops(invalid_cop_names)
47
45
  check_target_ruby
48
46
  validate_parameter_names(valid_cop_names)
49
47
  validate_enforced_styles(valid_cop_names)
@@ -98,7 +96,8 @@ module RuboCop
98
96
  raise ValidationError, msg
99
97
  end
100
98
 
101
- def warn_about_unrecognized_cops(invalid_cop_names)
99
+ def alert_about_unrecognized_cops(invalid_cop_names)
100
+ unknown_cops = []
102
101
  invalid_cop_names.each do |name|
103
102
  # There could be a custom cop with this name. If so, don't warn
104
103
  next if Cop::Cop.registry.contains_cop_matching?([name])
@@ -108,9 +107,10 @@ module RuboCop
108
107
  # to do so than to pass the value around to various methods.
109
108
  next if name == 'inherit_mode'
110
109
 
111
- warn Rainbow("Warning: unrecognized cop #{name} found in " \
112
- "#{smart_loaded_path}").yellow
110
+ unknown_cops << "unrecognized cop #{name} found in " \
111
+ "#{smart_loaded_path}"
113
112
  end
113
+ raise ValidationError, unknown_cops.join(', ') if unknown_cops.any?
114
114
  end
115
115
 
116
116
  def validate_syntax_cop
@@ -128,21 +128,30 @@ module RuboCop
128
128
  def validate_parameter_names(valid_cop_names)
129
129
  valid_cop_names.each do |name|
130
130
  validate_section_presence(name)
131
- default_config = ConfigLoader.default_configuration[name]
131
+ each_invalid_parameter(name) do |param, supported_params|
132
+ warn Rainbow(<<~MESSAGE).yellow
133
+ Warning: #{name} does not support #{param} parameter.
132
134
 
133
- @config[name].each_key do |param|
134
- next if COMMON_PARAMS.include?(param) || default_config.key?(param)
135
+ Supported parameters are:
135
136
 
136
- message =
137
- "Warning: #{name} does not support #{param} parameter.\n\n" \
138
- "Supported parameters are:\n\n" \
139
- " - #{(default_config.keys - INTERNAL_PARAMS).join("\n - ")}\n"
140
-
141
- warn Rainbow(message).yellow.to_s
137
+ - #{supported_params.join("\n - ")}
138
+ MESSAGE
142
139
  end
143
140
  end
144
141
  end
145
142
 
143
+ def each_invalid_parameter(cop_name)
144
+ default_config = ConfigLoader.default_configuration[cop_name]
145
+
146
+ @config[cop_name].each_key do |param|
147
+ next if COMMON_PARAMS.include?(param) || default_config.key?(param)
148
+
149
+ supported_params = default_config.keys - INTERNAL_PARAMS
150
+
151
+ yield param, supported_params
152
+ end
153
+ end
154
+
146
155
  def validate_enforced_styles(valid_cop_names)
147
156
  valid_cop_names.each do |name|
148
157
  styles = @config[name].select { |key, _| key.start_with?('Enforced') }
@@ -39,7 +39,7 @@ module RuboCop
39
39
 
40
40
  def disable_offense(node)
41
41
  range = node.location.expression
42
- eol_comment = " # rubocop:disable #{cop_name}"
42
+ eol_comment = " # rubocop:todo #{cop_name}"
43
43
  needed_line_length = range.column +
44
44
  (range.source_line + eol_comment).length
45
45
  if needed_line_length <= max_line_length
@@ -76,7 +76,7 @@ module RuboCop
76
76
  end
77
77
 
78
78
  def max_line_length
79
- config.for_cop('Metrics/LineLength')['Max'] || 80
79
+ config.for_cop('Layout/LineLength')['Max'] || 80
80
80
  end
81
81
 
82
82
  def disable_offense_at_end_of_line(range, eol_comment)
@@ -90,7 +90,7 @@ module RuboCop
90
90
 
91
91
  corrector.insert_before(
92
92
  range_with_newline,
93
- "#{leading_whitespace}# rubocop:disable #{cop_name}\n"
93
+ "#{leading_whitespace}# rubocop:todo #{cop_name}\n"
94
94
  )
95
95
  corrector.insert_after(
96
96
  range_with_newline,
@@ -24,7 +24,7 @@ module RuboCop
24
24
 
25
25
  def on_send(node)
26
26
  return unless gem_declaration?(node)
27
- return if whitelisted_gem?(node)
27
+ return if ignored_gem?(node)
28
28
  return if commented?(node)
29
29
 
30
30
  add_offense(node)
@@ -54,9 +54,9 @@ module RuboCop
54
54
  comment_line?(node2.loc.expression.source)
55
55
  end
56
56
 
57
- def whitelisted_gem?(node)
58
- whitelist = Array(cop_config['Whitelist'])
59
- whitelist.include?(node.first_argument.value)
57
+ def ignored_gem?(node)
58
+ ignored_gems = Array(cop_config['IgnoredGems'])
59
+ ignored_gems.include?(node.first_argument.value)
60
60
  end
61
61
  end
62
62
  end
@@ -13,8 +13,8 @@ module RuboCop
13
13
  #
14
14
  # However, it don't replace all `sources` of `http://` with `https://`.
15
15
  # For example, when specifying an internal gem server using HTTP on the
16
- # intranet, a use case where HTTPS can not be specified was considered.
17
- # Consider using HTTP only if you can not use HTTPS.
16
+ # intranet, a use case where HTTPS cannot be specified was considered.
17
+ # Consider using HTTP only if you cannot use HTTPS.
18
18
  #
19
19
  # @example
20
20
  # # bad
@@ -64,17 +64,25 @@ module RuboCop
64
64
  end
65
65
 
66
66
  def remove_irrelevant_cops(filename)
67
- @cops.reject! { |cop| cop.excluded_file?(filename) }
68
67
  @cops.reject! do |cop|
69
- cop.class.respond_to?(:support_target_ruby_version?) &&
70
- !cop.class.support_target_ruby_version?(cop.target_ruby_version)
71
- end
72
- @cops.reject! do |cop|
73
- cop.class.respond_to?(:support_target_rails_version?) &&
74
- !cop.class.support_target_rails_version?(cop.target_rails_version)
68
+ cop.excluded_file?(filename) ||
69
+ !support_target_ruby_version?(cop) ||
70
+ !support_target_rails_version?(cop)
75
71
  end
76
72
  end
77
73
 
74
+ def support_target_ruby_version?(cop)
75
+ return true unless cop.class.respond_to?(:support_target_ruby_version?)
76
+
77
+ cop.class.support_target_ruby_version?(cop.target_ruby_version)
78
+ end
79
+
80
+ def support_target_rails_version?(cop)
81
+ return true unless cop.class.respond_to?(:support_target_rails_version?)
82
+
83
+ cop.class.support_target_rails_version?(cop.target_rails_version)
84
+ end
85
+
78
86
  def reset_callbacks
79
87
  @callbacks.clear
80
88
  end
@@ -123,23 +123,19 @@ module RuboCop
123
123
  self.class::MSG
124
124
  end
125
125
 
126
- # rubocop:disable Metrics/CyclomaticComplexity
127
126
  def add_offense(node, location: :expression, message: nil, severity: nil)
128
127
  loc = find_location(node, location)
129
128
 
130
129
  return if duplicate_location?(loc)
131
130
 
132
- severity = custom_severity || severity || default_severity
133
-
134
- message ||= message(node)
135
- message = annotate(message)
131
+ severity = find_severity(node, severity)
132
+ message = find_message(node, message)
136
133
 
137
134
  status = enabled_line?(loc.line) ? correct(node) : :disabled
138
135
 
139
136
  @offenses << Offense.new(severity, loc, message, name, status)
140
137
  yield if block_given? && status != :disabled
141
138
  end
142
- # rubocop:enable Metrics/CyclomaticComplexity
143
139
 
144
140
  def find_location(node, loc)
145
141
  # Location can be provided as a symbol, e.g.: `:keyword`
@@ -160,10 +156,11 @@ module RuboCop
160
156
  return :uncorrected unless correction
161
157
 
162
158
  @corrections << Correction.new(correction, node, self)
159
+ :corrected
163
160
  elsif disable_uncorrectable?
164
161
  disable_uncorrectable(node)
162
+ :corrected_with_todo
165
163
  end
166
- :corrected
167
164
  end
168
165
 
169
166
  def reason_to_not_correct(node)
@@ -175,6 +172,8 @@ module RuboCop
175
172
  end
176
173
 
177
174
  def disable_uncorrectable(node)
175
+ return unless node
176
+
178
177
  @disabled_lines ||= {}
179
178
  line = node.location.line
180
179
  return if @disabled_lines.key?(line)
@@ -220,12 +219,35 @@ module RuboCop
220
219
  !relevant_file?(file)
221
220
  end
222
221
 
222
+ # This method should be overridden when a cop's behavior depends
223
+ # on state that lives outside of these locations:
224
+ #
225
+ # (1) the file under inspection
226
+ # (2) the cop's source code
227
+ # (3) the config (eg a .rubocop.yml file)
228
+ #
229
+ # For example, some cops may want to look at other parts of
230
+ # the codebase being inspected to find violations. A cop may
231
+ # use the presence or absence of file `foo.rb` to determine
232
+ # whether a certain violation exists in `bar.rb`.
233
+ #
234
+ # Overriding this method allows the cop to indicate to RuboCop's
235
+ # ResultCache system when those external dependencies change,
236
+ # ie when the ResultCache should be invalidated.
237
+ def external_dependency_checksum
238
+ nil
239
+ end
240
+
223
241
  private
224
242
 
243
+ def find_message(node, message)
244
+ annotate(message || message(node))
245
+ end
246
+
225
247
  def annotate(message)
226
248
  RuboCop::Cop::MessageAnnotator.new(
227
- config, cop_config, @options
228
- ).annotate(message, name)
249
+ config, cop_name, cop_config, @options
250
+ ).annotate(message)
229
251
  end
230
252
 
231
253
  def file_name_matches_any?(file, parameter, default_result)
@@ -249,6 +271,10 @@ module RuboCop
249
271
  @processed_source.comment_config.cop_enabled_at_line?(self, line_number)
250
272
  end
251
273
 
274
+ def find_severity(_node, severity)
275
+ custom_severity || severity || default_severity
276
+ end
277
+
252
278
  def default_severity
253
279
  self.class.lint? ? :warning : :convention
254
280
  end