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,12 +4,23 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop checks for trailing comma in array literals.
7
+ # The configuration options are:
8
+ #
9
+ # - `consistent_comma`: Requires a comma after the
10
+ # last item of all non-empty, multiline array literals.
11
+ # - `comma`: Requires a comma after last item in an array,
12
+ # but only when each item is on its own line.
13
+ # - `no_comma`: Does not requires a comma after the
14
+ # last item in an array
7
15
  #
8
16
  # @example EnforcedStyleForMultiline: consistent_comma
9
17
  # # bad
10
18
  # a = [1, 2,]
11
19
  #
12
20
  # # good
21
+ # a = [1, 2]
22
+ #
23
+ # # good
13
24
  # a = [
14
25
  # 1, 2,
15
26
  # 3,
@@ -17,6 +28,11 @@ module RuboCop
17
28
  #
18
29
  # # good
19
30
  # a = [
31
+ # 1, 2, 3,
32
+ # ]
33
+ #
34
+ # # good
35
+ # a = [
20
36
  # 1,
21
37
  # 2,
22
38
  # ]
@@ -26,6 +42,31 @@ module RuboCop
26
42
  # a = [1, 2,]
27
43
  #
28
44
  # # good
45
+ # a = [1, 2]
46
+ #
47
+ # # bad
48
+ # a = [
49
+ # 1, 2,
50
+ # 3,
51
+ # ]
52
+ #
53
+ # # good
54
+ # a = [
55
+ # 1, 2,
56
+ # 3
57
+ # ]
58
+ #
59
+ # # bad
60
+ # a = [
61
+ # 1, 2, 3,
62
+ # ]
63
+ #
64
+ # # good
65
+ # a = [
66
+ # 1, 2, 3
67
+ # ]
68
+ #
69
+ # # good
29
70
  # a = [
30
71
  # 1,
31
72
  # 2,
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks whether trailing commas in block arguments are
7
+ # required. Blocks with only one argument and a trailing comma require
8
+ # that comma to be present. Blocks with more than one argument never
9
+ # require a trailing comma.
10
+ #
11
+ # @example
12
+ # # bad
13
+ # add { |foo, bar,| foo + bar }
14
+ #
15
+ # # good
16
+ # add { |foo, bar| foo + bar }
17
+ #
18
+ # # good
19
+ # add { |foo,| foo }
20
+ #
21
+ # # good
22
+ # add { foo }
23
+ #
24
+ # # bad
25
+ # add do |foo, bar,|
26
+ # foo + bar
27
+ # end
28
+ #
29
+ # # good
30
+ # add do |foo, bar|
31
+ # foo + bar
32
+ # end
33
+ #
34
+ # # good
35
+ # add do |foo,|
36
+ # foo
37
+ # end
38
+ #
39
+ # # good
40
+ # add do
41
+ # foo + bar
42
+ # end
43
+ class TrailingCommaInBlockArgs < Cop
44
+ MSG = 'Useless trailing comma present in block arguments.'
45
+
46
+ def on_block(node)
47
+ # lambda literal (`->`) never has block arguments.
48
+ return if node.send_node.lambda_literal?
49
+
50
+ return unless useless_trailing_comma?(node)
51
+
52
+ add_offense(node, location: last_comma(node).pos)
53
+ end
54
+
55
+ def autocorrect(node)
56
+ ->(corrector) { corrector.replace(last_comma(node).pos, '') }
57
+ end
58
+
59
+ private
60
+
61
+ def useless_trailing_comma?(node)
62
+ arg_count(node) > 1 && trailing_comma?(node)
63
+ end
64
+
65
+ def arg_count(node)
66
+ node.arguments.each_descendant(:arg, :optarg, :kwoptarg).to_a.size
67
+ end
68
+
69
+ def trailing_comma?(node)
70
+ argument_tokens(node).last.comma?
71
+ end
72
+
73
+ def last_comma(node)
74
+ argument_tokens(node).last
75
+ end
76
+
77
+ def argument_tokens(node)
78
+ pipes = tokens(node).select { |token| token.type == :tPIPE }
79
+ begin_pos, end_pos = pipes.map do |pipe|
80
+ tokens(node).index(pipe)
81
+ end
82
+
83
+ tokens(node)[begin_pos + 1..end_pos - 1]
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -4,12 +4,24 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop checks for trailing comma in hash literals.
7
+ # The configuration options are:
8
+ #
9
+ # - `consistent_comma`: Requires a comma after the
10
+ # last item of all non-empty, multiline hash literals.
11
+ # - `comma`: Requires a comma after the last item in a hash,
12
+ # but only when each item is on its own line.
13
+ # - `no_comma`: Does not requires a comma after the
14
+ # last item in a hash
7
15
  #
8
16
  # @example EnforcedStyleForMultiline: consistent_comma
17
+ #
9
18
  # # bad
10
19
  # a = { foo: 1, bar: 2, }
11
20
  #
12
21
  # # good
22
+ # a = { foo: 1, bar: 2 }
23
+ #
24
+ # # good
13
25
  # a = {
14
26
  # foo: 1, bar: 2,
15
27
  # qux: 3,
@@ -17,21 +29,53 @@ module RuboCop
17
29
  #
18
30
  # # good
19
31
  # a = {
32
+ # foo: 1, bar: 2, qux: 3,
33
+ # }
34
+ #
35
+ # # good
36
+ # a = {
20
37
  # foo: 1,
21
38
  # bar: 2,
22
39
  # }
23
40
  #
24
41
  # @example EnforcedStyleForMultiline: comma
42
+ #
25
43
  # # bad
26
44
  # a = { foo: 1, bar: 2, }
27
45
  #
28
46
  # # good
47
+ # a = { foo: 1, bar: 2 }
48
+ #
49
+ # # bad
50
+ # a = {
51
+ # foo: 1, bar: 2,
52
+ # qux: 3,
53
+ # }
54
+ #
55
+ # # good
56
+ # a = {
57
+ # foo: 1, bar: 2,
58
+ # qux: 3
59
+ # }
60
+ #
61
+ # # bad
62
+ # a = {
63
+ # foo: 1, bar: 2, qux: 3,
64
+ # }
65
+ #
66
+ # # good
67
+ # a = {
68
+ # foo: 1, bar: 2, qux: 3
69
+ # }
70
+ #
71
+ # # good
29
72
  # a = {
30
73
  # foo: 1,
31
74
  # bar: 2,
32
75
  # }
33
76
  #
34
77
  # @example EnforcedStyleForMultiline: no_comma (default)
78
+ #
35
79
  # # bad
36
80
  # a = { foo: 1, bar: 2, }
37
81
  #
@@ -20,8 +20,14 @@ module RuboCop
20
20
  # a, *b, _ = foo()
21
21
  # # => The correction `a, *b, = foo()` is a syntax error
22
22
  #
23
- # # good if AllowNamedUnderscoreVariables is true
23
+ # @example AllowNamedUnderscoreVariables: true (default)
24
+ # # good
24
25
  # a, b, _something = foo()
26
+ #
27
+ # @example AllowNamedUnderscoreVariables: false
28
+ # # bad
29
+ # a, b, _something = foo()
30
+ #
25
31
  class TrailingUnderscoreVariable < Cop
26
32
  include SurroundingSpace
27
33
  include RangeHelp
@@ -60,7 +60,7 @@ module RuboCop
60
60
  when :module
61
61
  return true
62
62
  else
63
- return true if pnode.method_name == :instance_eval
63
+ return true if pnode.method?(:instance_eval)
64
64
  end
65
65
  end
66
66
  false
@@ -95,9 +95,9 @@ module RuboCop
95
95
  cop_config['IgnoreClassMethods']
96
96
  end
97
97
 
98
- def whitelist
99
- whitelist = cop_config['Whitelist']
100
- Array(whitelist).map(&:to_sym) + [:initialize]
98
+ def allowed_methods
99
+ allowed_methods = cop_config['AllowedMethods']
100
+ Array(allowed_methods).map(&:to_sym) + [:initialize]
101
101
  end
102
102
 
103
103
  def dsl_writer?(method_name)
@@ -124,7 +124,7 @@ module RuboCop
124
124
  PATTERN
125
125
 
126
126
  def allowed_method?(node)
127
- whitelist.include?(node.method_name) ||
127
+ allowed_methods.include?(node.method_name) ||
128
128
  exact_name_match? && !names_match?(node)
129
129
  end
130
130
 
@@ -161,7 +161,7 @@ module RuboCop
161
161
  return unless names_match?(node) && !node.predicate_method? && kind
162
162
 
163
163
  lambda do |corrector|
164
- corrector.replace(node.source_range,
164
+ corrector.replace(node,
165
165
  accessor(kind, node.method_name))
166
166
  end
167
167
  end
@@ -18,10 +18,6 @@ module RuboCop
18
18
  # 'foo'.unpack1('h*')
19
19
  #
20
20
  class UnpackFirst < Cop
21
- extend TargetRubyVersion
22
-
23
- minimum_target_ruby_version 2.4
24
-
25
21
  MSG = 'Use `%<receiver>s.unpack1(%<format>s)` instead of '\
26
22
  '`%<receiver>s.unpack(%<format>s)%<method>s`.'
27
23
 
@@ -29,7 +29,7 @@ module RuboCop
29
29
 
30
30
  def autocorrect(node)
31
31
  lambda do |corrector|
32
- corrector.replace(node.source_range, "{#{node.source}}")
32
+ corrector.replace(node, "{#{node.source}}")
33
33
  end
34
34
  end
35
35
 
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module Style
6
6
  # Checks for while and until statements that would fit on one line
7
7
  # if written as a modifier while/until. The maximum line length is
8
- # configured in the `Metrics/LineLength` cop.
8
+ # configured in the `Layout/LineLength` cop.
9
9
  #
10
10
  # @example
11
11
  # # bad
@@ -43,7 +43,7 @@ module RuboCop
43
43
  "#{node.condition.source}"
44
44
 
45
45
  lambda do |corrector|
46
- corrector.replace(node.source_range, oneline)
46
+ corrector.replace(node, oneline)
47
47
  end
48
48
  end
49
49
 
@@ -93,7 +93,7 @@ module RuboCop
93
93
  end
94
94
 
95
95
  lambda do |corrector|
96
- corrector.replace(node.source_range, "[#{words.join(', ')}]")
96
+ corrector.replace(node, "[#{words.join(', ')}]")
97
97
  end
98
98
  end
99
99
  end
@@ -67,9 +67,16 @@ module RuboCop
67
67
 
68
68
  NONCOMMUTATIVE_OPERATORS = %i[===].freeze
69
69
 
70
+ PROGRAM_NAMES = %i[$0 $PROGRAM_NAME].freeze
71
+
72
+ def_node_matcher :file_constant_equal_program_name?, <<~PATTERN
73
+ (send #source_file_path_constant? {:== :!=} (gvar #program_name?))
74
+ PATTERN
75
+
70
76
  def on_send(node)
71
77
  return unless yoda_compatible_condition?(node)
72
- return if equality_only? && non_equality_operator?(node)
78
+ return if equality_only? && non_equality_operator?(node) ||
79
+ file_constant_equal_program_name?(node)
73
80
 
74
81
  valid_yoda?(node) || add_offense(node)
75
82
  end
@@ -135,6 +142,14 @@ module RuboCop
135
142
  def noncommutative_operator?(node)
136
143
  NONCOMMUTATIVE_OPERATORS.include?(node.method_name)
137
144
  end
145
+
146
+ def source_file_path_constant?(node)
147
+ node.source == '__FILE__'
148
+ end
149
+
150
+ def program_name?(name)
151
+ PROGRAM_NAMES.include?(name)
152
+ end
138
153
  end
139
154
  end
140
155
  end
@@ -37,7 +37,7 @@ module RuboCop
37
37
 
38
38
  def autocorrect(node)
39
39
  lambda do |corrector|
40
- corrector.replace(node.loc.expression, replacement(node))
40
+ corrector.replace(node, replacement(node))
41
41
  end
42
42
  end
43
43
 
@@ -86,6 +86,11 @@ module RuboCop
86
86
  raise e.cause
87
87
  end
88
88
 
89
+ def external_dependency_checksum
90
+ keys = cops.map(&:external_dependency_checksum).compact
91
+ Digest::SHA1.hexdigest(keys.join)
92
+ end
93
+
89
94
  private
90
95
 
91
96
  def offenses(processed_source)
@@ -17,6 +17,10 @@ module RuboCop
17
17
  line_source =~ /^\s*#/
18
18
  end
19
19
 
20
+ def comment_lines?(node)
21
+ processed_source[line_range(node)].any? { |line| comment_line?(line) }
22
+ end
23
+
20
24
  def line_range(node)
21
25
  node.first_line..node.last_line
22
26
  end
@@ -26,6 +30,26 @@ module RuboCop
26
30
  node.loc.end.is?(')')
27
31
  end
28
32
 
33
+ def add_parentheses(node, corrector)
34
+ if node.arguments.empty?
35
+ corrector.insert_after(node, '()')
36
+ else
37
+ corrector.replace(args_begin(node), '(')
38
+ corrector.insert_after(args_end(node), ')')
39
+ end
40
+ end
41
+
42
+ def args_begin(node)
43
+ loc = node.loc
44
+ selector =
45
+ node.super_type? || node.yield_type? ? loc.keyword : loc.selector
46
+ selector.end.resize(1)
47
+ end
48
+
49
+ def args_end(node)
50
+ node.loc.expression.end
51
+ end
52
+
29
53
  def on_node(syms, sexp, excludes = [], &block)
30
54
  return to_enum(:on_node, syms, sexp, excludes) unless block_given?
31
55
 
@@ -10,6 +10,7 @@ module RuboCop
10
10
  MULTIPLE_LEFT_HAND_SIDE_TYPE = :mlhs
11
11
 
12
12
  attr_reader :node, :variable, :referenced, :references
13
+
13
14
  alias referenced? referenced
14
15
 
15
16
  def initialize(node, variable)
@@ -16,6 +16,7 @@ module RuboCop
16
16
  }.freeze
17
17
 
18
18
  attr_reader :node, :variables, :naked_top_level
19
+
19
20
  alias naked_top_level? naked_top_level
20
21
 
21
22
  def initialize(node)
@@ -11,6 +11,7 @@ module RuboCop
11
11
 
12
12
  attr_reader :name, :declaration_node, :scope,
13
13
  :assignments, :references, :captured_by_block
14
+
14
15
  alias captured_by_block? captured_by_block
15
16
 
16
17
  def initialize(name, declaration_node, scope)
@@ -190,7 +190,10 @@ module RuboCop
190
190
  end
191
191
 
192
192
  def regexp_captured_names(node)
193
- regexp_string = node.children[0].children[0] || ''
193
+ regexp_string = node.children.select(&:str_type?).map do |child|
194
+ child.children.first
195
+ end.join || ''
196
+
194
197
  regexp = Regexp.new(regexp_string)
195
198
 
196
199
  regexp.named_captures.keys
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/LineLength
3
+ # rubocop:disable Layout/LineLength
4
4
 
5
5
  module RuboCop
6
6
  module Formatter
@@ -41,7 +41,7 @@ module RuboCop
41
41
  # * `#finished`
42
42
  #
43
43
  class BaseFormatter
44
- # rubocop:enable Metrics/LineLength
44
+ # rubocop:enable Layout/LineLength
45
45
 
46
46
  # @api public
47
47
  #
@@ -24,7 +24,6 @@ module RuboCop
24
24
  message: message(offense)
25
25
  )
26
26
 
27
- # rubocop:disable Lint/HandleExceptions
28
27
  begin
29
28
  return unless valid_line?(offense)
30
29
 
@@ -33,7 +32,6 @@ module RuboCop
33
32
  rescue IndexError
34
33
  # range is not on a valid line; perhaps the source file is empty
35
34
  end
36
- # rubocop:enable Lint/HandleExceptions
37
35
  end
38
36
 
39
37
  def valid_line?(offense)
@@ -11,12 +11,12 @@ module RuboCop
11
11
  BUILTIN_FORMATTERS_FOR_KEYS = {
12
12
  '[a]utogenconf' => AutoGenConfigFormatter,
13
13
  '[c]lang' => ClangStyleFormatter,
14
- '[d]isabled' => DisabledLinesFormatter,
15
14
  '[e]macs' => EmacsStyleFormatter,
16
15
  '[fi]les' => FileListFormatter,
17
16
  '[fu]ubar' => FuubarStyleFormatter,
18
17
  '[h]tml' => HTMLFormatter,
19
18
  '[j]son' => JSONFormatter,
19
+ '[ju]nit' => JUnitFormatter,
20
20
  '[o]ffenses' => OffenseCountFormatter,
21
21
  '[pa]cman' => PacmanFormatter,
22
22
  '[p]rogress' => ProgressFormatter,
@@ -53,11 +53,12 @@ module RuboCop
53
53
 
54
54
  def hash_for_offense(offense)
55
55
  {
56
- severity: offense.severity.name,
57
- message: offense.message,
58
- cop_name: offense.cop_name,
59
- corrected: offense.corrected?,
60
- location: hash_for_location(offense)
56
+ severity: offense.severity.name,
57
+ message: offense.message,
58
+ cop_name: offense.cop_name,
59
+ corrected: offense.corrected?,
60
+ correctable: offense.correctable?,
61
+ location: hash_for_location(offense)
61
62
  }
62
63
  end
63
64
 
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rexml/document'
4
+
5
+ #
6
+ # This code is based on https://github.com/mikian/rubocop-junit-formatter.
7
+ #
8
+ # Copyright (c) 2015 Mikko Kokkonen
9
+ #
10
+ # MIT License
11
+ #
12
+ # https://github.com/mikian/rubocop-junit-formatter/blob/master/LICENSE.txt
13
+ #
14
+ module RuboCop
15
+ module Formatter
16
+ # This formatter formats the report data in JUnit format.
17
+ class JUnitFormatter < BaseFormatter
18
+ def initialize(output, options = {})
19
+ super
20
+
21
+ @document = REXML::Document.new.tap do |document|
22
+ document << REXML::XMLDecl.new
23
+ end
24
+ testsuites = REXML::Element.new('testsuites', @document)
25
+ testsuite = REXML::Element.new('testsuite', testsuites)
26
+ @testsuite = testsuite.tap do |element|
27
+ element.add_attributes('name' => 'rubocop')
28
+ end
29
+ end
30
+
31
+ def file_finished(file, offenses)
32
+ # TODO: Returns all cops with the same behavior as
33
+ # the original rubocop-junit-formatter.
34
+ # https://github.com/mikian/rubocop-junit-formatter/blob/v0.1.4/lib/rubocop/formatter/junit_formatter.rb#L9
35
+ #
36
+ # In the future, it would be preferable to return only enabled cops.
37
+ Cop::Cop.all.each do |cop|
38
+ REXML::Element.new('testcase', @testsuite).tap do |testcase|
39
+ testcase.attributes['classname'] = classname_attribute_value(file)
40
+ testcase.attributes['name'] = cop.cop_name
41
+
42
+ target_offenses = offenses.select do |offense|
43
+ offense.cop_name == cop.cop_name
44
+ end
45
+
46
+ add_failure_to(testcase, target_offenses, cop.cop_name)
47
+ end
48
+ end
49
+ end
50
+
51
+ def classname_attribute_value(file)
52
+ file.gsub(/\.rb\Z/, '').gsub("#{Dir.pwd}/", '').tr('/', '.')
53
+ end
54
+
55
+ def finished(_inspected_files)
56
+ @document.write(output, 2)
57
+ end
58
+
59
+ private
60
+
61
+ def add_failure_to(testcase, offenses, cop_name)
62
+ # One failure per offense. Zero failures is a passing test case,
63
+ # for most surefire/nUnit parsers.
64
+ offenses.each do |offense|
65
+ REXML::Element.new('failure', testcase).tap do |failure|
66
+ failure.attributes['type'] = cop_name
67
+ failure.attributes['message'] = offense.message
68
+ failure.add_text(offense.location.to_s)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -69,7 +69,7 @@ module RuboCop
69
69
  regex = /#{Regexp.quote(PACMAN)}|#{Regexp.quote(PACDOT)}/
70
70
  @progress_line = @progress_line.sub(regex, character)
71
71
  output.printf("%<line>s\r", line: @progress_line)
72
- return unless @progress_line[-1] =~ /ᗣ|\./
72
+ return unless /ᗣ|\./.match?(@progress_line[-1])
73
73
 
74
74
  @repetitions += 1
75
75
  output.puts
@@ -51,7 +51,6 @@ module RuboCop
51
51
  message: message(offense)
52
52
  )
53
53
 
54
- # rubocop:disable Lint/HandleExceptions
55
54
  begin
56
55
  return unless valid_line?(offense)
57
56
 
@@ -60,7 +59,6 @@ module RuboCop
60
59
  rescue IndexError
61
60
  # range is not on a valid line; perhaps the source file is empty
62
61
  end
63
- # rubocop:enable Lint/HandleExceptions
64
62
  end
65
63
 
66
64
  def annotate_message(msg)
@@ -3,19 +3,22 @@
3
3
  module RuboCop
4
4
  # Common functionality for finding names that are similar to a given name.
5
5
  module NameSimilarity
6
- MINIMUM_SIMILARITY_TO_SUGGEST = 0.9
6
+ module_function
7
7
 
8
- def find_similar_name(target_name, scope)
9
- names = collect_variable_like_names(scope)
8
+ def find_similar_name(target_name, names)
9
+ similar_names = find_similar_names(target_name, names)
10
+
11
+ similar_names.first
12
+ end
13
+
14
+ def find_similar_names(target_name, names)
15
+ names = names.dup
10
16
  names.delete(target_name)
11
17
 
12
- scores = names.each_with_object({}) do |name, hash|
13
- score = StringUtil.similarity(target_name, name)
14
- hash[name] = score if score >= MINIMUM_SIMILARITY_TO_SUGGEST
15
- end
18
+ spell_checker = DidYouMean::SpellChecker.new(dictionary: names)
19
+ similar_names = spell_checker.correct(target_name)
16
20
 
17
- most_similar_name, _max_score = scores.max_by { |_, score| score }
18
- most_similar_name
21
+ similar_names
19
22
  end
20
23
  end
21
24
  end