rubocop 0.76.0 → 0.83.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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +6 -6
  4. data/config/default.yml +466 -306
  5. data/lib/rubocop/ast/builder.rb +45 -42
  6. data/lib/rubocop/ast/node/array_node.rb +13 -0
  7. data/lib/rubocop/ast/node/block_node.rb +7 -1
  8. data/lib/rubocop/ast/node/case_match_node.rb +56 -0
  9. data/lib/rubocop/ast/node/def_node.rb +11 -0
  10. data/lib/rubocop/ast/node/forward_args_node.rb +18 -0
  11. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +8 -0
  12. data/lib/rubocop/ast/node/regexp_node.rb +2 -4
  13. data/lib/rubocop/ast/node/send_node.rb +4 -0
  14. data/lib/rubocop/ast/node.rb +13 -20
  15. data/lib/rubocop/ast/traversal.rb +29 -10
  16. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  17. data/lib/rubocop/cli/command/base.rb +33 -0
  18. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  19. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  20. data/lib/rubocop/cli/command/show_cops.rb +80 -0
  21. data/lib/rubocop/cli/command/version.rb +17 -0
  22. data/lib/rubocop/cli/command.rb +21 -0
  23. data/lib/rubocop/cli/environment.rb +21 -0
  24. data/lib/rubocop/cli.rb +20 -233
  25. data/lib/rubocop/comment_config.rb +6 -1
  26. data/lib/rubocop/config.rb +41 -11
  27. data/lib/rubocop/config_loader.rb +54 -44
  28. data/lib/rubocop/config_loader_resolver.rb +28 -1
  29. data/lib/rubocop/config_obsoletion.rb +67 -11
  30. data/lib/rubocop/config_validator.rb +74 -99
  31. data/lib/rubocop/cop/autocorrect_logic.rb +7 -4
  32. data/lib/rubocop/cop/badge.rb +5 -5
  33. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  34. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +3 -3
  35. data/lib/rubocop/cop/cop.rb +21 -0
  36. data/lib/rubocop/cop/corrector.rb +48 -24
  37. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
  38. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  39. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  40. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
  41. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  42. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  43. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
  44. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  45. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  46. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  47. data/lib/rubocop/cop/generator.rb +6 -6
  48. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  49. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  50. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  51. data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
  52. data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
  53. data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +1 -1
  54. data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
  55. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  56. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  57. data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
  58. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
  59. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +68 -0
  60. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  61. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  62. data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +5 -5
  63. data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +20 -14
  64. data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
  65. data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
  66. data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +10 -6
  67. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
  68. data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +7 -7
  69. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  70. data/lib/rubocop/cop/layout/leading_comment_space.rb +34 -3
  71. data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
  72. data/lib/rubocop/cop/{metrics → layout}/line_length.rb +72 -110
  73. data/lib/rubocop/cop/layout/multiline_block_layout.rb +15 -6
  74. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +0 -4
  75. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  76. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  77. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  78. data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
  79. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  80. data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
  81. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +133 -0
  82. data/lib/rubocop/cop/layout/space_around_operators.rb +69 -9
  83. data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
  84. data/lib/rubocop/cop/layout/space_before_first_arg.rb +8 -0
  85. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  86. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  87. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -9
  88. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  89. data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
  90. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  91. data/lib/rubocop/cop/lint/ambiguous_operator.rb +38 -0
  92. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  93. data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
  94. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  95. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  96. data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
  97. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  98. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  99. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  100. data/lib/rubocop/cop/lint/ensure_return.rb +18 -1
  101. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
  102. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  103. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  104. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  105. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  106. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  107. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  108. data/lib/rubocop/cop/lint/loop.rb +6 -4
  109. data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +2 -2
  110. data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
  111. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  112. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  113. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +21 -9
  114. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
  115. data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
  116. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +4 -9
  117. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +13 -8
  118. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  119. data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +2 -2
  120. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
  121. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
  122. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  123. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  124. data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +13 -29
  125. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  126. data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
  127. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  128. data/lib/rubocop/cop/lint/useless_access_modifier.rb +69 -23
  129. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  130. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +5 -0
  131. data/lib/rubocop/cop/lint/useless_setter_call.rb +5 -1
  132. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  133. data/lib/rubocop/cop/migration/department_name.rb +47 -6
  134. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  135. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +4 -0
  136. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
  137. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +14 -5
  138. data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
  139. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  140. data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
  141. data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
  142. data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
  143. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  144. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  145. data/lib/rubocop/cop/mixin/statement_modifier.rb +9 -24
  146. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  147. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -13
  148. data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
  149. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  150. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  151. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +6 -6
  152. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  153. data/lib/rubocop/cop/naming/method_name.rb +26 -0
  154. data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +4 -4
  155. data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
  156. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  157. data/lib/rubocop/cop/offense.rb +11 -0
  158. data/lib/rubocop/cop/registry.rb +15 -3
  159. data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
  160. data/lib/rubocop/cop/style/alias.rb +5 -5
  161. data/lib/rubocop/cop/style/and_or.rb +5 -6
  162. data/lib/rubocop/cop/style/array_join.rb +2 -2
  163. data/lib/rubocop/cop/style/attr.rb +8 -0
  164. data/lib/rubocop/cop/style/block_delimiters.rb +60 -1
  165. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  166. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  167. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  168. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -10
  169. data/lib/rubocop/cop/style/copyright.rb +1 -1
  170. data/lib/rubocop/cop/style/dir.rb +1 -1
  171. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  172. data/lib/rubocop/cop/style/documentation.rb +43 -5
  173. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  174. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  175. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  176. data/lib/rubocop/cop/style/empty_method.rb +1 -5
  177. data/lib/rubocop/cop/style/end_block.rb +6 -0
  178. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  179. data/lib/rubocop/cop/style/even_odd.rb +2 -2
  180. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  181. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  182. data/lib/rubocop/cop/style/format_string.rb +2 -2
  183. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -11
  184. data/lib/rubocop/cop/style/guard_clause.rb +28 -4
  185. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  186. data/lib/rubocop/cop/style/hash_syntax.rb +3 -5
  187. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  188. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  189. data/lib/rubocop/cop/style/if_unless_modifier.rb +61 -6
  190. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  191. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  192. data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
  193. data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
  194. data/lib/rubocop/cop/style/lambda.rb +3 -2
  195. data/lib/rubocop/cop/style/lambda_call.rb +1 -21
  196. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  197. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +54 -0
  198. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -205
  199. data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
  200. data/lib/rubocop/cop/style/module_function.rb +58 -12
  201. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  202. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  203. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  204. data/lib/rubocop/cop/style/multiline_when_then.rb +21 -2
  205. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  206. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +9 -9
  207. data/lib/rubocop/cop/style/next.rb +7 -7
  208. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  209. data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
  210. data/lib/rubocop/cop/style/not.rb +1 -1
  211. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  212. data/lib/rubocop/cop/style/numeric_literals.rb +8 -4
  213. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -4
  214. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -3
  215. data/lib/rubocop/cop/style/option_hash.rb +3 -3
  216. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  217. data/lib/rubocop/cop/style/or_assignment.rb +4 -3
  218. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +7 -7
  219. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  220. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  221. data/lib/rubocop/cop/style/proc.rb +1 -1
  222. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  223. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  224. data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
  225. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  226. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  227. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  228. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -3
  229. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  230. data/lib/rubocop/cop/style/redundant_return.rb +7 -15
  231. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  232. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  233. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  234. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  235. data/lib/rubocop/cop/style/safe_navigation.rb +1 -1
  236. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  237. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  238. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  239. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  240. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  241. data/lib/rubocop/cop/style/symbol_array.rb +3 -3
  242. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  243. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
  244. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -22
  245. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
  246. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  247. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
  248. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
  249. data/lib/rubocop/cop/style/trivial_accessors.rb +6 -6
  250. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  251. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  252. data/lib/rubocop/cop/style/while_until_modifier.rb +2 -2
  253. data/lib/rubocop/cop/style/word_array.rb +1 -1
  254. data/lib/rubocop/cop/style/yoda_condition.rb +16 -1
  255. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  256. data/lib/rubocop/cop/team.rb +5 -0
  257. data/lib/rubocop/cop/util.rb +24 -0
  258. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  259. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  260. data/lib/rubocop/cop/variable_force/variable.rb +1 -0
  261. data/lib/rubocop/cop/variable_force.rb +4 -1
  262. data/lib/rubocop/formatter/base_formatter.rb +2 -2
  263. data/lib/rubocop/formatter/clang_style_formatter.rb +0 -2
  264. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  265. data/lib/rubocop/formatter/json_formatter.rb +6 -5
  266. data/lib/rubocop/formatter/junit_formatter.rb +74 -0
  267. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  268. data/lib/rubocop/formatter/tap_formatter.rb +0 -2
  269. data/lib/rubocop/name_similarity.rb +12 -9
  270. data/lib/rubocop/node_pattern.rb +97 -11
  271. data/lib/rubocop/options.rb +26 -13
  272. data/lib/rubocop/processed_source.rb +1 -4
  273. data/lib/rubocop/rake_task.rb +1 -0
  274. data/lib/rubocop/result_cache.rb +23 -7
  275. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  276. data/lib/rubocop/rspec/expect_offense.rb +1 -1
  277. data/lib/rubocop/rspec/shared_contexts.rb +5 -4
  278. data/lib/rubocop/runner.rb +25 -4
  279. data/lib/rubocop/target_finder.rb +6 -4
  280. data/lib/rubocop/target_ruby.rb +151 -0
  281. data/lib/rubocop/version.rb +1 -1
  282. data/lib/rubocop.rb +53 -27
  283. metadata +73 -48
  284. data/lib/rubocop/cop/layout/align_array.rb +0 -39
  285. data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
  286. data/lib/rubocop/cop/mixin/safe_mode.rb +0 -24
  287. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
  288. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  289. data/lib/rubocop/string_util.rb +0 -14
@@ -4,11 +4,11 @@ module RuboCop
4
4
  module Cop
5
5
  # Identifier of all cops containing a department and cop name.
6
6
  #
7
- # All cops are identified by their badge. For example, the badge
8
- # for `RuboCop::Cop::Layout::Tab` is `Layout/Tab`. Badges can be
9
- # parsed as either `Department/CopName` or just `CopName` to allow
10
- # for badge references in source files that omit the department
11
- # for RuboCop to infer.
7
+ # All cops are identified by their badge. For example, the badge for
8
+ # `RuboCop::Cop::Layout::IndentationStyle` is `Layout/IndentationStyle`.
9
+ # Badges can be parsed as either `Department/CopName` or just `CopName` to
10
+ # allow for badge references in source files that omit the department for
11
+ # RuboCop to infer.
12
12
  class Badge
13
13
  # Error raised when a badge parse fails.
14
14
  class InvalidBadge < Error
@@ -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
@@ -53,7 +53,7 @@ module RuboCop
53
53
  def autocorrect(node)
54
54
  lambda do |corrector|
55
55
  corrector.replace(
56
- node.first_argument.loc.expression, "'https://rubygems.org'"
56
+ node.first_argument, "'https://rubygems.org'"
57
57
  )
58
58
  end
59
59
  end
@@ -172,6 +172,8 @@ module RuboCop
172
172
  end
173
173
 
174
174
  def disable_uncorrectable(node)
175
+ return unless node
176
+
175
177
  @disabled_lines ||= {}
176
178
  line = node.location.line
177
179
  return if @disabled_lines.key?(line)
@@ -217,6 +219,25 @@ module RuboCop
217
219
  !relevant_file?(file)
218
220
  end
219
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
+
220
241
  private
221
242
 
222
243
  def find_message(node, message)
@@ -72,18 +72,18 @@ module RuboCop
72
72
 
73
73
  # Removes the source range.
74
74
  #
75
- # @param [Parser::Source::Range] range
76
- def remove(range)
77
- validate_range range
75
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
76
+ def remove(node_or_range)
77
+ range = to_range(node_or_range)
78
78
  @source_rewriter.remove(range)
79
79
  end
80
80
 
81
81
  # Inserts new code before the given source range.
82
82
  #
83
- # @param [Parser::Source::Range] range
83
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
84
84
  # @param [String] content
85
- def insert_before(range, content)
86
- validate_range range
85
+ def insert_before(node_or_range, content)
86
+ range = to_range(node_or_range)
87
87
  # TODO: Fix Cops using bad ranges instead
88
88
  if range.end_pos > @source_buffer.source.size
89
89
  range = range.with(end_pos: @source_buffer.source.size)
@@ -94,28 +94,38 @@ module RuboCop
94
94
 
95
95
  # Inserts new code after the given source range.
96
96
  #
97
- # @param [Parser::Source::Range] range
97
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
98
98
  # @param [String] content
99
- def insert_after(range, content)
100
- validate_range range
99
+ def insert_after(node_or_range, content)
100
+ range = to_range(node_or_range)
101
101
  @source_rewriter.insert_after(range, content)
102
102
  end
103
103
 
104
+ # Wraps the given source range with the given before and after texts
105
+ #
106
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
107
+ # @param [String] before
108
+ # @param [String] after
109
+ def wrap(node_or_range, before, after)
110
+ range = to_range(node_or_range)
111
+ @source_rewriter.wrap(range, before, after)
112
+ end
113
+
104
114
  # Replaces the code of the source range `range` with `content`.
105
115
  #
106
- # @param [Parser::Source::Range] range
116
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
107
117
  # @param [String] content
108
- def replace(range, content)
109
- validate_range range
118
+ def replace(node_or_range, content)
119
+ range = to_range(node_or_range)
110
120
  @source_rewriter.replace(range, content)
111
121
  end
112
122
 
113
123
  # Removes `size` characters prior to the source range.
114
124
  #
115
- # @param [Parser::Source::Range] range
125
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
116
126
  # @param [Integer] size
117
- def remove_preceding(range, size)
118
- validate_range range
127
+ def remove_preceding(node_or_range, size)
128
+ range = to_range(node_or_range)
119
129
  to_remove = Parser::Source::Range.new(range.source_buffer,
120
130
  range.begin_pos - size,
121
131
  range.begin_pos)
@@ -126,10 +136,10 @@ module RuboCop
126
136
  # If `size` is greater than the size of `range`, the removed region can
127
137
  # overrun the end of `range`.
128
138
  #
129
- # @param [Parser::Source::Range] range
139
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
130
140
  # @param [Integer] size
131
- def remove_leading(range, size)
132
- validate_range range
141
+ def remove_leading(node_or_range, size)
142
+ range = to_range(node_or_range)
133
143
  to_remove = Parser::Source::Range.new(range.source_buffer,
134
144
  range.begin_pos,
135
145
  range.begin_pos + size)
@@ -140,10 +150,10 @@ module RuboCop
140
150
  # If `size` is greater than the size of `range`, the removed region can
141
151
  # overrun the beginning of `range`.
142
152
  #
143
- # @param [Parser::Source::Range] range
153
+ # @param [Parser::Source::Range, Rubocop::AST::Node] range or node
144
154
  # @param [Integer] size
145
- def remove_trailing(range, size)
146
- validate_range range
155
+ def remove_trailing(node_or_range, size)
156
+ range = to_range(node_or_range)
147
157
  to_remove = Parser::Source::Range.new(range.source_buffer,
148
158
  range.end_pos - size,
149
159
  range.end_pos)
@@ -153,11 +163,25 @@ module RuboCop
153
163
  private
154
164
 
155
165
  # :nodoc:
156
- def validate_range(range)
157
- buffer = range.source_buffer
166
+ def to_range(node_or_range)
167
+ range = case node_or_range
168
+ when ::RuboCop::AST::Node, ::Parser::Source::Comment
169
+ node_or_range.loc.expression
170
+ when ::Parser::Source::Range
171
+ node_or_range
172
+ else
173
+ raise TypeError,
174
+ 'Expected a Parser::Source::Range, Comment or ' \
175
+ "Rubocop::AST::Node, got #{node_or_range.class}"
176
+ end
177
+ validate_buffer(range.source_buffer)
178
+ range
179
+ end
180
+
181
+ def validate_buffer(buffer)
158
182
  return if buffer == @source_buffer
159
183
 
160
- unless buffer.is_a?(Parser::Source::Buffer)
184
+ unless buffer.is_a?(::Parser::Source::Buffer)
161
185
  # actually this should be enforced by parser gem
162
186
  raise 'Corrector expected range source buffer to be a ' \
163
187
  "Parser::Source::Buffer, but got #{buffer.class}"
@@ -51,7 +51,7 @@ module RuboCop
51
51
  unless range.resize(1).source == "\n"
52
52
  corrector.insert_before(range, ' ' * column_delta)
53
53
  end
54
- elsif range.source =~ /\A[ \t]+\z/
54
+ elsif /\A[ \t]+\z/.match?(range.source)
55
55
  remove(range, corrector)
56
56
  end
57
57
  end
@@ -112,7 +112,7 @@ module RuboCop
112
112
  corrector.remove(range)
113
113
  rescue RuntimeError
114
114
  range = range_between(range.begin_pos + 1, range.end_pos + 1)
115
- retry if range.source =~ /^ +$/
115
+ retry if /^ +$/.match?(range.source)
116
116
  ensure
117
117
  $stderr = original_stderr
118
118
  end
@@ -10,8 +10,7 @@ module RuboCop
10
10
 
11
11
  lambda do |corrector|
12
12
  corrector.replace(node.loc.keyword, node.inverse_keyword)
13
- corrector.replace(condition.source_range,
14
- condition.children.first.source)
13
+ corrector.replace(condition, condition.children.first.source)
15
14
  end
16
15
  end
17
16
 
@@ -18,7 +18,7 @@ module RuboCop
18
18
  end
19
19
 
20
20
  def insert_before(node)
21
- ->(corrector) { corrector.insert_before(node.source_range, "\n") }
21
+ ->(corrector) { corrector.insert_before(node, "\n") }
22
22
  end
23
23
  end
24
24
  end
@@ -44,13 +44,13 @@ module RuboCop
44
44
  end
45
45
 
46
46
  def replace_selector(corrector)
47
- corrector.replace(method.source_range, 'lambda')
47
+ corrector.replace(method, 'lambda')
48
48
  end
49
49
 
50
50
  def remove_arguments(corrector)
51
51
  return if arguments.empty_and_without_delimiters?
52
52
 
53
- corrector.remove(arguments.source_range)
53
+ corrector.remove(arguments)
54
54
  end
55
55
 
56
56
  def insert_arguments(corrector)
@@ -62,7 +62,7 @@ module RuboCop
62
62
 
63
63
  def remove_leading_whitespace(corrector)
64
64
  corrector.remove_preceding(
65
- arguments.source_range,
65
+ arguments,
66
66
  arguments.source_range.begin_pos -
67
67
  block_node.send_node.source_range.end_pos
68
68
  )
@@ -38,9 +38,9 @@ module RuboCop
38
38
  return unless eol_comment
39
39
 
40
40
  text = eol_comment.loc.expression.source
41
- corrector.insert_before(node.source_range,
41
+ corrector.insert_before(node,
42
42
  text + "\n" + (' ' * node.loc.keyword.column))
43
- corrector.remove(eol_comment.loc.expression)
43
+ corrector.remove(eol_comment)
44
44
  end
45
45
 
46
46
  private
@@ -26,7 +26,7 @@ module RuboCop
26
26
  def wrap_contents(node, contents, char, delimiters)
27
27
  lambda do |corrector|
28
28
  corrector.replace(
29
- node.source_range,
29
+ node,
30
30
  "%#{char}#{delimiters[0]}#{contents}#{delimiters[1]}"
31
31
  )
32
32
  end
@@ -12,12 +12,11 @@ module RuboCop
12
12
  def empty_corrections(processed_source, corrector, empty_config,
13
13
  left_token, right_token)
14
14
  @processed_source = processed_source
15
+ range = range_between(left_token.end_pos, right_token.begin_pos)
15
16
  if offending_empty_space?(empty_config, left_token, right_token)
16
- range = side_space_range(range: left_token.pos, side: :right)
17
17
  corrector.remove(range)
18
18
  corrector.insert_after(left_token.pos, ' ')
19
19
  elsif offending_empty_no_space?(empty_config, left_token, right_token)
20
- range = side_space_range(range: left_token.pos, side: :right)
21
20
  corrector.remove(range)
22
21
  end
23
22
  end
@@ -13,9 +13,9 @@ module RuboCop
13
13
  lambda do |corrector|
14
14
  str = node.str_content
15
15
  if style == :single_quotes
16
- corrector.replace(node.source_range, to_string_literal(str))
16
+ corrector.replace(node, to_string_literal(str))
17
17
  else
18
- corrector.replace(node.source_range, str.inspect)
18
+ corrector.replace(node, str.inspect)
19
19
  end
20
20
  end
21
21
  end
@@ -98,7 +98,7 @@ module RuboCop
98
98
  end
99
99
 
100
100
  def_node_search :dependency_declarations, <<~PATTERN
101
- (send (lvar _) {:add_dependency :add_runtime_dependency :add_development_dependency} ...)
101
+ (send (lvar _) {:add_dependency :add_runtime_dependency :add_development_dependency} (str _) ...)
102
102
  PATTERN
103
103
  end
104
104
  end
@@ -10,7 +10,7 @@ module RuboCop
10
10
  TEMPLATE = <<~YAML
11
11
  %<badge>s:
12
12
  Description: 'TODO: Write a description of the cop.'
13
- Enabled: true
13
+ Enabled: pending
14
14
  VersionAdded: '%<version_added>s'
15
15
  YAML
16
16
 
@@ -104,10 +104,9 @@ module RuboCop
104
104
  end
105
105
  SPEC
106
106
 
107
- CONFIGURATION_ADDED_MESSAGE = <<~MESSAGE
108
- [modify] A configuration for the cop is added into %<configuration_file_path>s.
109
- If you want to disable the cop by default, set `Enabled` option to false.
110
- MESSAGE
107
+ CONFIGURATION_ADDED_MESSAGE =
108
+ '[modify] A configuration for the cop is added into ' \
109
+ '%<configuration_file_path>s.'
111
110
 
112
111
  def initialize(name, github_user, output: $stdout)
113
112
  @badge = Badge.parse(name)
@@ -133,11 +132,12 @@ module RuboCop
133
132
  ).inject
134
133
  end
135
134
 
136
- def inject_config(config_file_path: 'config/default.yml')
135
+ def inject_config(config_file_path: 'config/default.yml',
136
+ version_added: bump_minor_version)
137
137
  injector =
138
138
  ConfigurationInjector.new(configuration_file_path: config_file_path,
139
139
  badge: badge,
140
- version_added: bump_minor_version)
140
+ version_added: version_added)
141
141
 
142
142
  injector.inject do
143
143
  output.puts(format(CONFIGURATION_ADDED_MESSAGE,
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Checks that method names are checked using `method?` method.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # node.method_name == :do_something
11
+ #
12
+ # # good
13
+ # node.method?(:do_something)
14
+ #
15
+ class MethodNameEqual < Cop
16
+ include RangeHelp
17
+
18
+ MSG = 'Use `method?(%<method_name>s)` instead of ' \
19
+ '`method_name == %<method_name>s`.'
20
+
21
+ def_node_matcher :method_name?, <<~PATTERN
22
+ (send
23
+ $(send
24
+ (...) :method_name) :==
25
+ $...)
26
+ PATTERN
27
+
28
+ def on_send(node)
29
+ method_name?(node) do |method_name_node, method_name_arg|
30
+ message = format(MSG, method_name: method_name_arg.first.source)
31
+
32
+ range = range(method_name_node, node)
33
+
34
+ add_offense(node, location: range, message: message)
35
+ end
36
+ end
37
+
38
+ def autocorrect(node)
39
+ lambda do |corrector|
40
+ method_name?(node) do |method_name_node, method_name_arg|
41
+ corrector.replace(
42
+ range(method_name_node, node),
43
+ "method?(#{method_name_arg.first.source})"
44
+ )
45
+ end
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def range(method_name_node, node)
52
+ range_between(
53
+ method_name_node.loc.selector.begin_pos, node.source_range.end_pos
54
+ )
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -28,7 +28,7 @@ module RuboCop
28
28
  def autocorrect(node)
29
29
  (*, keyword) = offending_location_argument(node.parent)
30
30
 
31
- ->(corrector) { corrector.replace(node.source_range, ":#{keyword}") }
31
+ ->(corrector) { corrector.replace(node, ":#{keyword}") }
32
32
  end
33
33
 
34
34
  private
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'internal_affairs/method_name_equal'
3
4
  require_relative 'internal_affairs/node_destructuring'
4
5
  require_relative 'internal_affairs/node_type_predicate'
5
6
  require_relative 'internal_affairs/offense_location_keyword'
@@ -37,7 +37,7 @@ module RuboCop
37
37
  #
38
38
  # foo :bar,
39
39
  # :baz
40
- class AlignArguments < Cop
40
+ class ArgumentAlignment < Cop
41
41
  include Alignment
42
42
 
43
43
  ALIGN_PARAMS_MSG = 'Align the arguments of a method call if ' \
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Layout
6
+ # Here we check if the elements of a multi-line array literal are
7
+ # aligned.
8
+ #
9
+ # @example EnforcedStyle: with_first_element (default)
10
+ # # good
11
+ #
12
+ # array = [1, 2, 3,
13
+ # 4, 5, 6]
14
+ # array = ['run',
15
+ # 'forrest',
16
+ # 'run']
17
+ #
18
+ # # bad
19
+ #
20
+ # array = [1, 2, 3,
21
+ # 4, 5, 6]
22
+ # array = ['run',
23
+ # 'forrest',
24
+ # 'run']
25
+ #
26
+ # @example EnforcedStyle: with_fixed_indentation
27
+ # # good
28
+ #
29
+ # array = [1, 2, 3,
30
+ # 4, 5, 6]
31
+ #
32
+ # # bad
33
+ #
34
+ # array = [1, 2, 3,
35
+ # 4, 5, 6]
36
+ class ArrayAlignment < Cop
37
+ include Alignment
38
+
39
+ ALIGN_ELEMENTS_MSG = 'Align the elements of an array literal ' \
40
+ 'if they span more than one line.'
41
+
42
+ FIXED_INDENT_MSG = 'Use one level of indentation for elements ' \
43
+ 'following the first line of a multi-line array.'
44
+
45
+ def on_array(node)
46
+ return if node.children.size < 2
47
+
48
+ check_alignment(node.children, base_column(node, node.children))
49
+ end
50
+
51
+ def autocorrect(node)
52
+ AlignmentCorrector.correct(processed_source, node, column_delta)
53
+ end
54
+
55
+ private
56
+
57
+ def message(_node)
58
+ fixed_indentation? ? FIXED_INDENT_MSG : ALIGN_ELEMENTS_MSG
59
+ end
60
+
61
+ def fixed_indentation?
62
+ cop_config['EnforcedStyle'] == 'with_fixed_indentation'
63
+ end
64
+
65
+ def base_column(node, args)
66
+ if fixed_indentation?
67
+ lineno = target_method_lineno(node)
68
+ line = node.source_range.source_buffer.source_line(lineno)
69
+ indentation_of_line = /\S.*/.match(line).begin(0)
70
+ indentation_of_line + configured_indentation_width
71
+ else
72
+ display_column(args.first.source_range)
73
+ end
74
+ end
75
+
76
+ def target_method_lineno(node)
77
+ node.loc.line
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -21,7 +21,7 @@ module RuboCop
21
21
  #
22
22
  # The indentation of the remaining lines can be corrected with
23
23
  # other cops such as `IndentationConsistency` and `EndAlignment`.
24
- class IndentAssignment < Cop
24
+ class AssignmentIndentation < Cop
25
25
  include CheckAssignment
26
26
  include Alignment
27
27
 
@@ -52,9 +52,11 @@ module RuboCop
52
52
  end
53
53
 
54
54
  def delimiter_range(node)
55
- Parser::Source::Range.new(node.loc.expression.source_buffer,
56
- node.children.last.loc.expression.end_pos,
57
- node.loc.expression.end_pos)
55
+ Parser::Source::Range.new(
56
+ node.loc.expression.source_buffer,
57
+ node.children.compact.last.loc.expression.end_pos,
58
+ node.loc.expression.end_pos
59
+ )
58
60
  end
59
61
  end
60
62
  end
@@ -23,6 +23,8 @@ module RuboCop
23
23
  # do_something
24
24
  # end
25
25
  class ConditionPosition < Cop
26
+ include RangeHelp
27
+
26
28
  MSG = 'Place the condition on the same line as `%<keyword>s`.'
27
29
 
28
30
  def on_if(node)
@@ -34,9 +36,17 @@ module RuboCop
34
36
  def on_while(node)
35
37
  check(node)
36
38
  end
39
+ alias on_until on_while
37
40
 
38
- def on_until(node)
39
- check(node)
41
+ def autocorrect(node)
42
+ lambda do |corrector|
43
+ range = range_by_whole_lines(
44
+ node.source_range, include_final_newline: true
45
+ )
46
+
47
+ corrector.insert_after(node.parent.loc.keyword, " #{node.source}")
48
+ corrector.remove(range)
49
+ end
40
50
  end
41
51
 
42
52
  private
@@ -44,7 +44,7 @@ module RuboCop
44
44
  when :leading
45
45
  corrector.insert_before(selector_range(node), dot)
46
46
  when :trailing
47
- corrector.insert_after(node.receiver.source_range, dot)
47
+ corrector.insert_after(node.receiver, dot)
48
48
  end
49
49
  end
50
50
  end
@@ -59,6 +59,14 @@ module RuboCop
59
59
  check_alignment(node.when_branches.last.loc.keyword, node.loc.else)
60
60
  end
61
61
 
62
+ def on_case_match(node)
63
+ return unless node.else?
64
+
65
+ check_alignment(
66
+ node.in_pattern_branches.last.loc.keyword, node.loc.else
67
+ )
68
+ end
69
+
62
70
  def autocorrect(node)
63
71
  AlignmentCorrector.correct(processed_source, node, column_delta)
64
72
  end
@@ -56,7 +56,8 @@ module RuboCop
56
56
  return if nodes.all?(&:single_line?) &&
57
57
  cop_config['AllowAdjacentOneLineDefs']
58
58
 
59
- add_offense(nodes.last, location: :keyword)
59
+ location = nodes.last.loc.keyword.join(nodes.last.loc.name)
60
+ add_offense(nodes.last, location: location)
60
61
  end
61
62
 
62
63
  def autocorrect(node)