rubocop 0.76.0 → 0.83.0

Sign up to get free protection for your applications and to get access to all the features.
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)