rubocop 1.26.0 → 1.36.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 (588) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -5
  3. data/config/default.yml +254 -47
  4. data/config/obsoletion.yml +35 -2
  5. data/exe/rubocop +15 -7
  6. data/lib/rubocop/cache_config.rb +29 -0
  7. data/lib/rubocop/cli/command/{auto_genenerate_config.rb → auto_generate_config.rb} +20 -5
  8. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  9. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  10. data/lib/rubocop/cli/command/show_cops.rb +1 -1
  11. data/lib/rubocop/cli/command/suggest_extensions.rb +54 -16
  12. data/lib/rubocop/cli.rb +2 -0
  13. data/lib/rubocop/config.rb +6 -2
  14. data/lib/rubocop/config_finder.rb +68 -0
  15. data/lib/rubocop/config_loader.rb +15 -41
  16. data/lib/rubocop/config_loader_resolver.rb +2 -6
  17. data/lib/rubocop/config_obsoletion/changed_parameter.rb +5 -0
  18. data/lib/rubocop/config_obsoletion/extracted_cop.rb +3 -1
  19. data/lib/rubocop/config_obsoletion/parameter_rule.rb +4 -0
  20. data/lib/rubocop/config_obsoletion.rb +7 -2
  21. data/lib/rubocop/config_validator.rb +21 -4
  22. data/lib/rubocop/cop/autocorrect_logic.rb +8 -2
  23. data/lib/rubocop/cop/badge.rb +1 -1
  24. data/lib/rubocop/cop/base.rb +6 -2
  25. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -7
  26. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  27. data/lib/rubocop/cop/bundler/gem_filename.rb +5 -5
  28. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
  29. data/lib/rubocop/cop/cop.rb +1 -1
  30. data/lib/rubocop/cop/corrector.rb +2 -2
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
  32. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  33. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
  34. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  35. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +4 -2
  36. data/lib/rubocop/cop/correctors/if_then_corrector.rb +1 -1
  37. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
  38. data/lib/rubocop/cop/correctors/line_break_corrector.rb +7 -1
  39. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +3 -3
  40. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
  41. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +59 -1
  42. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  43. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  44. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -1
  45. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +1 -1
  46. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +2 -2
  47. data/lib/rubocop/cop/gemspec/dependency_version.rb +156 -0
  48. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +92 -0
  49. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +5 -12
  50. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  51. data/lib/rubocop/cop/gemspec/require_mfa.rb +21 -21
  52. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  53. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -2
  54. data/lib/rubocop/cop/generator.rb +5 -1
  55. data/lib/rubocop/cop/internal_affairs/cop_description.rb +96 -0
  56. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +1 -1
  57. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -1
  58. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +80 -0
  59. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -5
  60. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +69 -0
  61. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -1
  62. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -1
  63. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  64. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  65. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +62 -0
  66. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
  67. data/lib/rubocop/cop/internal_affairs.rb +5 -0
  68. data/lib/rubocop/cop/layout/argument_alignment.rb +22 -1
  69. data/lib/rubocop/cop/layout/assignment_indentation.rb +1 -1
  70. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
  71. data/lib/rubocop/cop/layout/block_alignment.rb +17 -13
  72. data/lib/rubocop/cop/layout/block_end_newline.rb +36 -6
  73. data/lib/rubocop/cop/layout/case_indentation.rb +17 -1
  74. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  75. data/lib/rubocop/cop/layout/comment_indentation.rb +2 -2
  76. data/lib/rubocop/cop/layout/condition_position.rb +1 -1
  77. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  78. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  79. data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
  80. data/lib/rubocop/cop/layout/empty_comment.rb +2 -2
  81. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  82. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  83. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
  84. data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
  85. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -2
  86. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -1
  87. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +25 -4
  88. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +1 -1
  89. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +7 -5
  90. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +10 -10
  91. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  92. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +1 -1
  93. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +10 -10
  94. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  95. data/lib/rubocop/cop/layout/end_of_line.rb +5 -5
  96. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  97. data/lib/rubocop/cop/layout/first_argument_indentation.rb +34 -29
  98. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +21 -14
  99. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  100. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +52 -13
  101. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  102. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  103. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -1
  104. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
  105. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -0
  106. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
  107. data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
  108. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -1
  109. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  110. data/lib/rubocop/cop/layout/indentation_width.rb +16 -10
  111. data/lib/rubocop/cop/layout/initial_indentation.rb +2 -2
  112. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  113. data/lib/rubocop/cop/layout/leading_empty_lines.rb +1 -1
  114. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +112 -0
  115. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +130 -0
  116. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  117. data/lib/rubocop/cop/layout/line_length.rb +11 -6
  118. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +1 -1
  119. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -1
  120. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +2 -2
  121. data/lib/rubocop/cop/layout/multiline_block_layout.rb +4 -2
  122. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +1 -1
  123. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  124. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -2
  125. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
  126. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -5
  127. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  128. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +45 -0
  129. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -3
  130. data/lib/rubocop/cop/layout/redundant_line_break.rb +5 -6
  131. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
  132. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  133. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  134. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  135. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
  136. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  137. data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -3
  138. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -0
  139. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
  140. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  141. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  142. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +10 -10
  143. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +33 -15
  144. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -1
  145. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -1
  146. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +9 -9
  147. data/lib/rubocop/cop/layout/trailing_whitespace.rb +3 -3
  148. data/lib/rubocop/cop/legacy/corrections_proxy.rb +1 -1
  149. data/lib/rubocop/cop/legacy/corrector.rb +1 -1
  150. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -1
  151. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +28 -7
  152. data/lib/rubocop/cop/lint/ambiguous_operator.rb +7 -7
  153. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -1
  154. data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -5
  155. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +1 -1
  156. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -1
  157. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  158. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  159. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  160. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +51 -0
  161. data/lib/rubocop/cop/lint/debugger.rb +27 -17
  162. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +15 -9
  163. data/lib/rubocop/cop/lint/deprecated_constants.rb +1 -1
  164. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  165. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -1
  166. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  167. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +1 -1
  168. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  169. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
  170. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  171. data/lib/rubocop/cop/lint/duplicate_require.rb +11 -2
  172. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +1 -1
  173. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  174. data/lib/rubocop/cop/lint/else_layout.rb +3 -3
  175. data/lib/rubocop/cop/lint/empty_block.rb +2 -2
  176. data/lib/rubocop/cop/lint/empty_class.rb +1 -1
  177. data/lib/rubocop/cop/lint/empty_conditional_body.rb +99 -3
  178. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  179. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  180. data/lib/rubocop/cop/lint/empty_file.rb +1 -1
  181. data/lib/rubocop/cop/lint/empty_in_pattern.rb +4 -2
  182. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  183. data/lib/rubocop/cop/lint/empty_when.rb +4 -2
  184. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  185. data/lib/rubocop/cop/lint/erb_new_arguments.rb +10 -10
  186. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  187. data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
  188. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  189. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
  190. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  191. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +11 -4
  192. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  193. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  194. data/lib/rubocop/cop/lint/interpolation_check.rb +2 -2
  195. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +10 -3
  196. data/lib/rubocop/cop/lint/literal_as_condition.rb +6 -1
  197. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +5 -1
  198. data/lib/rubocop/cop/lint/loop.rb +2 -2
  199. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  200. data/lib/rubocop/cop/lint/missing_super.rb +1 -1
  201. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  202. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  203. data/lib/rubocop/cop/lint/next_without_accumulator.rb +25 -6
  204. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +157 -0
  205. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +17 -5
  206. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  207. data/lib/rubocop/cop/lint/number_conversion.rb +32 -10
  208. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
  209. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  210. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2 -2
  211. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
  212. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  213. data/lib/rubocop/cop/lint/raise_exception.rb +2 -2
  214. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  215. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +6 -6
  216. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2 -2
  217. data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +3 -3
  218. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -1
  219. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +16 -3
  220. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  221. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  222. data/lib/rubocop/cop/lint/redundant_with_index.rb +14 -11
  223. data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -12
  224. data/lib/rubocop/cop/lint/refinement_import_methods.rb +51 -0
  225. data/lib/rubocop/cop/lint/regexp_as_condition.rb +3 -3
  226. data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
  227. data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
  228. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  229. data/lib/rubocop/cop/lint/return_in_void_context.rb +6 -18
  230. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +38 -1
  231. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
  232. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  233. data/lib/rubocop/cop/lint/script_permission.rb +1 -1
  234. data/lib/rubocop/cop/lint/self_assignment.rb +1 -1
  235. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
  236. data/lib/rubocop/cop/lint/shadowed_exception.rb +16 -1
  237. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +32 -1
  238. data/lib/rubocop/cop/lint/struct_new_override.rb +3 -3
  239. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  240. data/lib/rubocop/cop/lint/symbol_conversion.rb +4 -3
  241. data/lib/rubocop/cop/lint/syntax.rb +2 -3
  242. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  243. data/lib/rubocop/cop/lint/to_json.rb +1 -1
  244. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  245. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +2 -2
  246. data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
  247. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
  248. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  249. data/lib/rubocop/cop/lint/unified_integer.rb +3 -1
  250. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  251. data/lib/rubocop/cop/lint/unreachable_loop.rb +13 -7
  252. data/lib/rubocop/cop/lint/unused_block_argument.rb +1 -1
  253. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -2
  254. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  255. data/lib/rubocop/cop/lint/uri_regexp.rb +1 -1
  256. data/lib/rubocop/cop/lint/useless_access_modifier.rb +9 -7
  257. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  258. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +2 -3
  259. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  260. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  261. data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
  262. data/lib/rubocop/cop/lint/useless_times.rb +2 -2
  263. data/lib/rubocop/cop/lint/void.rb +3 -1
  264. data/lib/rubocop/cop/metrics/abc_size.rb +4 -2
  265. data/lib/rubocop/cop/metrics/block_length.rb +7 -7
  266. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  267. data/lib/rubocop/cop/metrics/class_length.rb +1 -1
  268. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  269. data/lib/rubocop/cop/metrics/method_length.rb +9 -8
  270. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  271. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  272. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  273. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -3
  274. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +22 -3
  275. data/lib/rubocop/cop/mixin/allowed_methods.rb +20 -1
  276. data/lib/rubocop/cop/mixin/allowed_pattern.rb +56 -0
  277. data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -1
  278. data/lib/rubocop/cop/mixin/comments_help.rb +28 -2
  279. data/lib/rubocop/cop/mixin/def_node.rb +2 -7
  280. data/lib/rubocop/cop/mixin/duplication.rb +1 -1
  281. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -1
  282. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +83 -4
  283. data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -6
  284. data/lib/rubocop/cop/mixin/line_length_help.rb +17 -6
  285. data/lib/rubocop/cop/mixin/method_complexity.rb +8 -13
  286. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +34 -12
  287. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -3
  288. data/lib/rubocop/cop/mixin/percent_array.rb +60 -1
  289. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +2 -2
  290. data/lib/rubocop/cop/mixin/range_help.rb +10 -7
  291. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -1
  292. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  293. data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -2
  294. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
  295. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  296. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
  297. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  298. data/lib/rubocop/cop/naming/block_forwarding.rb +4 -4
  299. data/lib/rubocop/cop/naming/block_parameter_name.rb +2 -2
  300. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  301. data/lib/rubocop/cop/naming/constant_name.rb +3 -3
  302. data/lib/rubocop/cop/naming/file_name.rb +2 -2
  303. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
  304. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  305. data/lib/rubocop/cop/naming/inclusive_language.rb +3 -2
  306. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  307. data/lib/rubocop/cop/naming/method_name.rb +6 -6
  308. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  309. data/lib/rubocop/cop/naming/predicate_name.rb +32 -3
  310. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  311. data/lib/rubocop/cop/naming/variable_name.rb +10 -1
  312. data/lib/rubocop/cop/naming/variable_number.rb +28 -18
  313. data/lib/rubocop/cop/offense.rb +1 -1
  314. data/lib/rubocop/cop/security/compound_hash.rb +105 -0
  315. data/lib/rubocop/cop/security/eval.rb +1 -1
  316. data/lib/rubocop/cop/security/json_load.rb +1 -1
  317. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  318. data/lib/rubocop/cop/security/open.rb +1 -1
  319. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  320. data/lib/rubocop/cop/style/access_modifier_declarations.rb +77 -1
  321. data/lib/rubocop/cop/style/accessor_grouping.rb +4 -4
  322. data/lib/rubocop/cop/style/alias.rb +4 -4
  323. data/lib/rubocop/cop/style/and_or.rb +12 -12
  324. data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -3
  325. data/lib/rubocop/cop/style/array_coercion.rb +1 -1
  326. data/lib/rubocop/cop/style/array_join.rb +1 -1
  327. data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
  328. data/lib/rubocop/cop/style/attr.rb +1 -1
  329. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
  330. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  331. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +1 -1
  332. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
  333. data/lib/rubocop/cop/style/block_comments.rb +1 -1
  334. data/lib/rubocop/cop/style/block_delimiters.rb +35 -9
  335. data/lib/rubocop/cop/style/case_equality.rb +41 -11
  336. data/lib/rubocop/cop/style/case_like_if.rb +2 -2
  337. data/lib/rubocop/cop/style/character_literal.rb +1 -1
  338. data/lib/rubocop/cop/style/class_and_module_children.rb +5 -5
  339. data/lib/rubocop/cop/style/class_check.rb +1 -1
  340. data/lib/rubocop/cop/style/class_equality_comparison.rb +51 -4
  341. data/lib/rubocop/cop/style/class_methods.rb +1 -1
  342. data/lib/rubocop/cop/style/class_methods_definitions.rb +3 -2
  343. data/lib/rubocop/cop/style/class_vars.rb +1 -1
  344. data/lib/rubocop/cop/style/collection_compact.rb +4 -4
  345. data/lib/rubocop/cop/style/collection_methods.rb +3 -1
  346. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  347. data/lib/rubocop/cop/style/colon_method_definition.rb +1 -1
  348. data/lib/rubocop/cop/style/combinable_loops.rb +4 -2
  349. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  350. data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
  351. data/lib/rubocop/cop/style/commented_keyword.rb +4 -4
  352. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -1
  353. data/lib/rubocop/cop/style/constant_visibility.rb +1 -1
  354. data/lib/rubocop/cop/style/date_time.rb +2 -2
  355. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -1
  356. data/lib/rubocop/cop/style/dir.rb +4 -1
  357. data/lib/rubocop/cop/style/documentation.rb +1 -1
  358. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  359. data/lib/rubocop/cop/style/double_negation.rb +62 -3
  360. data/lib/rubocop/cop/style/each_for_simple_loop.rb +42 -7
  361. data/lib/rubocop/cop/style/each_with_object.rb +40 -9
  362. data/lib/rubocop/cop/style/empty_block_parameter.rb +2 -2
  363. data/lib/rubocop/cop/style/empty_case_condition.rb +3 -4
  364. data/lib/rubocop/cop/style/empty_else.rb +40 -3
  365. data/lib/rubocop/cop/style/empty_heredoc.rb +73 -0
  366. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +2 -2
  367. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  368. data/lib/rubocop/cop/style/empty_method.rb +17 -2
  369. data/lib/rubocop/cop/style/encoding.rb +2 -2
  370. data/lib/rubocop/cop/style/end_block.rb +1 -1
  371. data/lib/rubocop/cop/style/endless_method.rb +1 -1
  372. data/lib/rubocop/cop/style/env_home.rb +56 -0
  373. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  374. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  375. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  376. data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
  377. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  378. data/lib/rubocop/cop/style/fetch_env_var.rb +132 -0
  379. data/lib/rubocop/cop/style/file_write.rb +12 -0
  380. data/lib/rubocop/cop/style/float_division.rb +1 -1
  381. data/lib/rubocop/cop/style/for.rb +3 -1
  382. data/lib/rubocop/cop/style/format_string.rb +1 -1
  383. data/lib/rubocop/cop/style/format_string_token.rb +73 -23
  384. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
  385. data/lib/rubocop/cop/style/global_std_stream.rb +1 -1
  386. data/lib/rubocop/cop/style/global_vars.rb +1 -1
  387. data/lib/rubocop/cop/style/guard_clause.rb +62 -4
  388. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -1
  389. data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
  390. data/lib/rubocop/cop/style/hash_each_methods.rb +4 -2
  391. data/lib/rubocop/cop/style/hash_except.rb +85 -9
  392. data/lib/rubocop/cop/style/hash_like_case.rb +1 -1
  393. data/lib/rubocop/cop/style/hash_syntax.rb +20 -3
  394. data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -1
  395. data/lib/rubocop/cop/style/hash_transform_values.rb +4 -1
  396. data/lib/rubocop/cop/style/identical_conditional_branches.rb +4 -4
  397. data/lib/rubocop/cop/style/if_unless_modifier.rb +6 -5
  398. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -2
  399. data/lib/rubocop/cop/style/implicit_runtime_error.rb +3 -3
  400. data/lib/rubocop/cop/style/in_pattern_then.rb +1 -1
  401. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  402. data/lib/rubocop/cop/style/inverse_methods.rb +10 -8
  403. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  404. data/lib/rubocop/cop/style/keyword_parameters_order.rb +2 -2
  405. data/lib/rubocop/cop/style/lambda.rb +1 -1
  406. data/lib/rubocop/cop/style/lambda_call.rb +1 -1
  407. data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -2
  408. data/lib/rubocop/cop/style/magic_comment_format.rb +307 -0
  409. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +136 -0
  410. data/lib/rubocop/cop/style/map_to_hash.rb +3 -3
  411. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +4 -4
  412. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +6 -2
  413. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +12 -12
  414. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -3
  415. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +5 -2
  416. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  417. data/lib/rubocop/cop/style/min_max.rb +1 -1
  418. data/lib/rubocop/cop/style/missing_else.rb +24 -24
  419. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
  420. data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
  421. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  422. data/lib/rubocop/cop/style/module_function.rb +3 -3
  423. data/lib/rubocop/cop/style/multiline_block_chain.rb +4 -2
  424. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -2
  425. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  426. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +3 -5
  427. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  428. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  429. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +37 -11
  430. data/lib/rubocop/cop/style/multiline_when_then.rb +2 -4
  431. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  432. data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
  433. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  434. data/lib/rubocop/cop/style/nested_file_dirname.rb +1 -1
  435. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  436. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -2
  437. data/lib/rubocop/cop/style/nested_ternary_operator.rb +20 -8
  438. data/lib/rubocop/cop/style/next.rb +4 -6
  439. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  440. data/lib/rubocop/cop/style/nil_lambda.rb +3 -3
  441. data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
  442. data/lib/rubocop/cop/style/not.rb +2 -2
  443. data/lib/rubocop/cop/style/numbered_parameters.rb +1 -1
  444. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +1 -1
  445. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  446. data/lib/rubocop/cop/style/numeric_literals.rb +16 -1
  447. data/lib/rubocop/cop/style/numeric_predicate.rb +53 -11
  448. data/lib/rubocop/cop/style/object_then.rb +71 -0
  449. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
  450. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  451. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  452. data/lib/rubocop/cop/style/optional_arguments.rb +2 -2
  453. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +2 -2
  454. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  455. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
  456. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  457. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  458. data/lib/rubocop/cop/style/perl_backrefs.rb +23 -2
  459. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  460. data/lib/rubocop/cop/style/proc.rb +5 -2
  461. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  462. data/lib/rubocop/cop/style/raise_args.rb +10 -4
  463. data/lib/rubocop/cop/style/random_with_offset.rb +1 -1
  464. data/lib/rubocop/cop/style/redundant_argument.rb +2 -2
  465. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  466. data/lib/rubocop/cop/style/redundant_begin.rb +19 -6
  467. data/lib/rubocop/cop/style/redundant_capital_w.rb +2 -3
  468. data/lib/rubocop/cop/style/redundant_condition.rb +129 -13
  469. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  470. data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
  471. data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -2
  472. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  473. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  474. data/lib/rubocop/cop/style/redundant_initialize.rb +154 -0
  475. data/lib/rubocop/cop/style/redundant_interpolation.rb +22 -1
  476. data/lib/rubocop/cop/style/redundant_parentheses.rb +22 -24
  477. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  478. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +8 -3
  479. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -2
  480. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  481. data/lib/rubocop/cop/style/redundant_self.rb +3 -1
  482. data/lib/rubocop/cop/style/redundant_self_assignment.rb +3 -4
  483. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +1 -1
  484. data/lib/rubocop/cop/style/redundant_sort.rb +22 -7
  485. data/lib/rubocop/cop/style/redundant_sort_by.rb +25 -9
  486. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  487. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  488. data/lib/rubocop/cop/style/rescue_standard_error.rb +13 -13
  489. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  490. data/lib/rubocop/cop/style/safe_navigation.rb +21 -11
  491. data/lib/rubocop/cop/style/sample.rb +1 -1
  492. data/lib/rubocop/cop/style/select_by_regexp.rb +7 -2
  493. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  494. data/lib/rubocop/cop/style/semicolon.rb +28 -4
  495. data/lib/rubocop/cop/style/send.rb +1 -1
  496. data/lib/rubocop/cop/style/signal_exception.rb +1 -1
  497. data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
  498. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  499. data/lib/rubocop/cop/style/single_line_methods.rb +2 -2
  500. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
  501. data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -30
  502. data/lib/rubocop/cop/style/special_global_vars.rb +66 -8
  503. data/lib/rubocop/cop/style/static_class.rb +1 -1
  504. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  505. data/lib/rubocop/cop/style/string_chars.rb +1 -1
  506. data/lib/rubocop/cop/style/string_concatenation.rb +6 -7
  507. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  508. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
  509. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  510. data/lib/rubocop/cop/style/strip.rb +1 -1
  511. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -4
  512. data/lib/rubocop/cop/style/swap_values.rb +2 -2
  513. data/lib/rubocop/cop/style/symbol_array.rb +9 -6
  514. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  515. data/lib/rubocop/cop/style/symbol_proc.rb +70 -12
  516. data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -16
  517. data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -1
  518. data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -1
  519. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -1
  520. data/lib/rubocop/cop/style/trailing_body_on_module.rb +1 -1
  521. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +1 -1
  522. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +1 -1
  523. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
  524. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +1 -1
  525. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  526. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
  527. data/lib/rubocop/cop/style/trivial_accessors.rb +11 -9
  528. data/lib/rubocop/cop/style/unless_else.rb +5 -1
  529. data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -1
  530. data/lib/rubocop/cop/style/unpack_first.rb +5 -2
  531. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  532. data/lib/rubocop/cop/style/when_then.rb +1 -1
  533. data/lib/rubocop/cop/style/word_array.rb +4 -5
  534. data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
  535. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  536. data/lib/rubocop/cop/team.rb +2 -2
  537. data/lib/rubocop/cop/util.rb +3 -3
  538. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  539. data/lib/rubocop/cops_documentation_generator.rb +19 -2
  540. data/lib/rubocop/ext/range.rb +15 -0
  541. data/lib/rubocop/feature_loader.rb +94 -0
  542. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  543. data/lib/rubocop/formatter/disabled_config_formatter.rb +11 -8
  544. data/lib/rubocop/formatter/formatter_set.rb +20 -18
  545. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +15 -2
  546. data/lib/rubocop/formatter/html_formatter.rb +5 -13
  547. data/lib/rubocop/formatter/markdown_formatter.rb +78 -0
  548. data/lib/rubocop/formatter/offense_count_formatter.rb +8 -2
  549. data/lib/rubocop/formatter/simple_text_formatter.rb +9 -8
  550. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  551. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -2
  552. data/lib/rubocop/formatter.rb +31 -0
  553. data/lib/rubocop/magic_comment.rb +31 -5
  554. data/lib/rubocop/options.rb +103 -34
  555. data/lib/rubocop/rake_task.rb +34 -9
  556. data/lib/rubocop/result_cache.rb +24 -13
  557. data/lib/rubocop/rspec/cop_helper.rb +2 -2
  558. data/lib/rubocop/rspec/expect_offense.rb +3 -3
  559. data/lib/rubocop/rspec/parallel_formatter.rb +1 -1
  560. data/lib/rubocop/rspec/shared_contexts.rb +31 -11
  561. data/lib/rubocop/rspec/support.rb +14 -0
  562. data/lib/rubocop/runner.rb +41 -7
  563. data/lib/rubocop/server/cache.rb +144 -0
  564. data/lib/rubocop/server/cli.rb +121 -0
  565. data/lib/rubocop/server/client_command/base.rb +44 -0
  566. data/lib/rubocop/server/client_command/exec.rb +59 -0
  567. data/lib/rubocop/server/client_command/restart.rb +25 -0
  568. data/lib/rubocop/server/client_command/start.rb +43 -0
  569. data/lib/rubocop/server/client_command/status.rb +28 -0
  570. data/lib/rubocop/server/client_command/stop.rb +31 -0
  571. data/lib/rubocop/server/client_command.rb +26 -0
  572. data/lib/rubocop/server/core.rb +79 -0
  573. data/lib/rubocop/server/errors.rb +23 -0
  574. data/lib/rubocop/server/helper.rb +34 -0
  575. data/lib/rubocop/server/server_command/base.rb +50 -0
  576. data/lib/rubocop/server/server_command/exec.rb +34 -0
  577. data/lib/rubocop/server/server_command/stop.rb +24 -0
  578. data/lib/rubocop/server/server_command.rb +21 -0
  579. data/lib/rubocop/server/socket_reader.rb +65 -0
  580. data/lib/rubocop/server.rb +53 -0
  581. data/lib/rubocop/string_interpreter.rb +4 -4
  582. data/lib/rubocop/target_ruby.rb +14 -6
  583. data/lib/rubocop/version.rb +17 -9
  584. data/lib/rubocop.rb +25 -30
  585. metadata +78 -14
  586. data/lib/rubocop/cop/gemspec/date_assignment.rb +0 -49
  587. data/lib/rubocop/cop/mixin/ignored_methods.rb +0 -52
  588. data/lib/rubocop/cop/mixin/ignored_pattern.rb +0 -29
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Security
6
+ # Checks for implementations of the `hash` method which combine
7
+ # values using custom logic instead of delegating to `Array#hash`.
8
+ #
9
+ # Manually combining hashes is error prone and hard to follow, especially
10
+ # when there are many values. Poor implementations may also introduce
11
+ # performance or security concerns if they are prone to collisions.
12
+ # Delegating to `Array#hash` is clearer, faster, and safer.
13
+ #
14
+ # @safety
15
+ # This cop may be unsafe if the application logic depends on the hash
16
+ # value, however this is inadvisable anyway.
17
+ #
18
+ # @example
19
+ #
20
+ # # bad
21
+ # def hash
22
+ # @foo ^ @bar
23
+ # end
24
+ #
25
+ # # good
26
+ # def hash
27
+ # [@foo, @bar].hash
28
+ # end
29
+ class CompoundHash < Base
30
+ COMBINATOR_IN_HASH_MSG = 'Use `[...].hash` instead of combining hash values manually.'
31
+ MONUPLE_HASH_MSG =
32
+ 'Delegate hash directly without wrapping in an array when only using a single value'
33
+ REDUNDANT_HASH_MSG = 'Calling .hash on elements of a hashed array is redundant'
34
+
35
+ # @!method hash_method_definition?(node)
36
+ def_node_matcher :hash_method_definition?, <<~PATTERN
37
+ {#static_hash_method_definition? | #dynamic_hash_method_definition?}
38
+ PATTERN
39
+
40
+ # @!method dynamic_hash_method_definition?(node)
41
+ def_node_matcher :dynamic_hash_method_definition?, <<~PATTERN
42
+ (block
43
+ (send _ {:define_method | :define_singleton_method}
44
+ (sym :hash))
45
+ (args)
46
+ _)
47
+ PATTERN
48
+
49
+ # @!method static_hash_method_definition?(node)
50
+ def_node_matcher :static_hash_method_definition?, <<~PATTERN
51
+ ({def | defs _} :hash
52
+ (args)
53
+ _)
54
+ PATTERN
55
+
56
+ # @!method bad_hash_combinator?(node)
57
+ def_node_matcher :bad_hash_combinator?, <<~PATTERN
58
+ ({send | op-asgn} _ {:^ | :+ | :* | :|} _)
59
+ PATTERN
60
+
61
+ # @!method monuple_hash?(node)
62
+ def_node_matcher :monuple_hash?, <<~PATTERN
63
+ (send (array _) :hash)
64
+ PATTERN
65
+
66
+ # @!method redundant_hash?(node)
67
+ def_node_matcher :redundant_hash?, <<~PATTERN
68
+ (
69
+ ^^(send array ... :hash)
70
+ _ :hash
71
+ )
72
+ PATTERN
73
+
74
+ def contained_in_hash_method?(node, &block)
75
+ node.each_ancestor.any? do |ancestor|
76
+ hash_method_definition?(ancestor, &block)
77
+ end
78
+ end
79
+
80
+ def outer_bad_hash_combinator?(node)
81
+ bad_hash_combinator?(node) do
82
+ yield true if node.each_ancestor.none? { |ancestor| bad_hash_combinator?(ancestor) }
83
+ end
84
+ end
85
+
86
+ def on_send(node)
87
+ outer_bad_hash_combinator?(node) do
88
+ contained_in_hash_method?(node) do
89
+ add_offense(node, message: COMBINATOR_IN_HASH_MSG)
90
+ end
91
+ end
92
+
93
+ monuple_hash?(node) do
94
+ add_offense(node, message: MONUPLE_HASH_MSG)
95
+ end
96
+
97
+ redundant_hash?(node) do
98
+ add_offense(node, message: REDUNDANT_HASH_MSG)
99
+ end
100
+ end
101
+ alias on_op_asgn on_send
102
+ end
103
+ end
104
+ end
105
+ end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Security
6
- # This cop checks for the use of `Kernel#eval` and `Binding#eval`.
6
+ # Checks for the use of `Kernel#eval` and `Binding#eval`.
7
7
  #
8
8
  # @example
9
9
  #
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Security
6
- # This cop checks for the use of JSON class methods which have potential
6
+ # Checks for the use of JSON class methods which have potential
7
7
  # security issues.
8
8
  #
9
9
  # @safety
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Security
6
- # This cop checks for the use of Marshal class methods which have
6
+ # Checks for the use of Marshal class methods which have
7
7
  # potential security issues leading to remote code execution when
8
8
  # loading from an untrusted source.
9
9
  #
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Security
6
- # This cop checks for the use of `Kernel#open` and `URI.open` with dynamic
6
+ # Checks for the use of `Kernel#open` and `URI.open` with dynamic
7
7
  # data.
8
8
  #
9
9
  # `Kernel#open` and `URI.open` enable not only file access but also process
@@ -3,14 +3,14 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Security
6
- # This cop checks for the use of YAML class methods which have
6
+ # Checks for the use of YAML class methods which have
7
7
  # potential security issues leading to remote code execution when
8
8
  # loading from an untrusted source.
9
9
  #
10
10
  # NOTE: Ruby 3.1+ (Psych 4) uses `Psych.load` as `Psych.safe_load` by default.
11
11
  #
12
12
  # @safety
13
- # The behaviour of the code might change depending on what was
13
+ # The behavior of the code might change depending on what was
14
14
  # in the YAML payload, since `YAML.safe_load` is more restrictive.
15
15
  #
16
16
  # @example
@@ -9,6 +9,11 @@ module RuboCop
9
9
  # Applications of visibility methods to symbols can be controlled
10
10
  # using AllowModifiersOnSymbols config.
11
11
  #
12
+ # @safety
13
+ # Autocorrection is not safe, because the visibility of dynamically
14
+ # defined methods can vary depending on the state determined by
15
+ # the group access modifier.
16
+ #
12
17
  # @example EnforcedStyle: group (default)
13
18
  # # bad
14
19
  # class Foo
@@ -63,7 +68,10 @@ module RuboCop
63
68
  #
64
69
  # end
65
70
  class AccessModifierDeclarations < Base
71
+ extend AutoCorrector
72
+
66
73
  include ConfigurableEnforcedStyle
74
+ include RangeHelp
67
75
 
68
76
  GROUP_STYLE_MESSAGE = [
69
77
  '`%<access_modifier>s` should not be',
@@ -88,7 +96,10 @@ module RuboCop
88
96
  return if allow_modifiers_on_symbols?(node)
89
97
 
90
98
  if offense?(node)
91
- add_offense(node.loc.selector) { opposite_style_detected }
99
+ add_offense(node.loc.selector) do |corrector|
100
+ autocorrect(corrector, node)
101
+ end
102
+ opposite_style_detected
92
103
  else
93
104
  correct_style_detected
94
105
  end
@@ -96,6 +107,23 @@ module RuboCop
96
107
 
97
108
  private
98
109
 
110
+ def autocorrect(corrector, node)
111
+ case style
112
+ when :group
113
+ def_node = find_corresponding_def_node(node)
114
+ return unless def_node
115
+
116
+ remove_node(corrector, def_node)
117
+ remove_node(corrector, node)
118
+ insert_def(corrector, node, def_node.source)
119
+ when :inline
120
+ remove_node(corrector, node)
121
+ select_grouped_def_nodes(node).each do |grouped_def_node|
122
+ insert_inline_modifier(corrector, grouped_def_node, node.method_name)
123
+ end
124
+ end
125
+ end
126
+
99
127
  def allow_modifiers_on_symbols?(node)
100
128
  cop_config['AllowModifiersOnSymbols'] && access_modifier_with_symbol?(node)
101
129
  end
@@ -130,6 +158,54 @@ module RuboCop
130
158
  format(INLINE_STYLE_MESSAGE, access_modifier: access_modifier)
131
159
  end
132
160
  end
161
+
162
+ def find_corresponding_def_node(node)
163
+ if access_modifier_with_symbol?(node)
164
+ method_name = node.arguments.first.value
165
+ node.parent.each_child_node(:def).find do |child|
166
+ child.method?(method_name)
167
+ end
168
+ else
169
+ node.arguments.first
170
+ end
171
+ end
172
+
173
+ def find_argument_less_modifier_node(node)
174
+ node.parent.each_child_node(:send).find do |child|
175
+ child.method?(node.method_name) && child.arguments.empty?
176
+ end
177
+ end
178
+
179
+ def select_grouped_def_nodes(node)
180
+ node.right_siblings.take_while do |sibling|
181
+ !(sibling.send_type? && sibling.bare_access_modifier_declaration?)
182
+ end.select(&:def_type?)
183
+ end
184
+
185
+ def insert_def(corrector, node, source)
186
+ argument_less_modifier_node = find_argument_less_modifier_node(node)
187
+ if argument_less_modifier_node
188
+ corrector.insert_after(argument_less_modifier_node, "\n\n#{source}")
189
+ else
190
+ corrector.insert_before(
191
+ node.each_ancestor(:block, :class, :module).first.location.end,
192
+ "#{node.method_name}\n\n#{source}\n"
193
+ )
194
+ end
195
+ end
196
+
197
+ def insert_inline_modifier(corrector, node, modifier_name)
198
+ corrector.insert_before(node, "#{modifier_name} ")
199
+ end
200
+
201
+ def remove_node(corrector, node)
202
+ corrector.remove(
203
+ range_by_whole_lines(
204
+ node.location.expression,
205
+ include_final_newline: true
206
+ )
207
+ )
208
+ end
133
209
  end
134
210
  end
135
211
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for grouping of accessors in `class` and `module` bodies.
6
+ # Checks for grouping of accessors in `class` and `module` bodies.
7
7
  # By default it enforces accessors to be placed in grouped declarations,
8
8
  # but it can be configured to enforce separating them in multiple declarations.
9
9
  #
@@ -72,7 +72,7 @@ module RuboCop
72
72
  if (preferred_accessors = preferred_accessors(node))
73
73
  corrector.replace(node, preferred_accessors)
74
74
  else
75
- range = range_with_surrounding_space(range: node.loc.expression, side: :left)
75
+ range = range_with_surrounding_space(node.loc.expression, side: :left)
76
76
  corrector.remove(range)
77
77
  end
78
78
  end
@@ -122,14 +122,14 @@ module RuboCop
122
122
  def preferred_accessors(node)
123
123
  if grouped_style?
124
124
  accessors = sibling_accessors(node)
125
- group_accessors(node, accessors) if node == accessors.first
125
+ group_accessors(node, accessors) if node.loc == accessors.first.loc
126
126
  else
127
127
  separate_accessors(node)
128
128
  end
129
129
  end
130
130
 
131
131
  def group_accessors(node, accessors)
132
- accessor_names = accessors.flat_map { |accessor| accessor.arguments.map(&:source) }
132
+ accessor_names = accessors.flat_map { |accessor| accessor.arguments.map(&:source) }.uniq
133
133
 
134
134
  "#{node.method_name} #{accessor_names.join(', ')}"
135
135
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop enforces the use of either `#alias` or `#alias_method`
6
+ # Enforces the use of either `#alias` or `#alias_method`
7
7
  # depending on configuration.
8
8
  # It also flags uses of `alias :symbol` rather than `alias bareword`.
9
9
  #
@@ -76,7 +76,7 @@ module RuboCop
76
76
 
77
77
  def add_offense_for_args(node, &block)
78
78
  existing_args = node.children.map(&:source).join(' ')
79
- preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
79
+ preferred_args = node.children.map { |a| a.source[1..] }.join(' ')
80
80
  arg_ranges = node.children.map(&:source_range)
81
81
  msg = format(MSG_SYMBOL_ARGS, prefer: preferred_args, current: existing_args)
82
82
  add_offense(arg_ranges.reduce(&:join), message: msg, &block)
@@ -134,8 +134,8 @@ module RuboCop
134
134
  end
135
135
 
136
136
  def correct_alias_with_symbol_args(corrector, node)
137
- corrector.replace(node.new_identifier, node.new_identifier.source[1..-1])
138
- corrector.replace(node.old_identifier, node.old_identifier.source[1..-1])
137
+ corrector.replace(node.new_identifier, node.new_identifier.source[1..])
138
+ corrector.replace(node.old_identifier, node.old_identifier.source[1..])
139
139
  end
140
140
 
141
141
  # @!method identifier(node)
@@ -3,19 +3,16 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses of `and` and `or`, and suggests using `&&` and
6
+ # Checks for uses of `and` and `or`, and suggests using `&&` and
7
7
  # `||` instead. It can be configured to check only in conditions or in
8
8
  # all contexts.
9
9
  #
10
10
  # @safety
11
- # Auto-correction is unsafe because there is a different operator precedence
11
+ # Autocorrection is unsafe because there is a different operator precedence
12
12
  # between logical operators (`&&` and `||`) and semantic operators (`and` and `or`),
13
- # and that might change the behaviour.
14
- #
15
- # @example EnforcedStyle: always
16
- # # bad
17
- # foo.save and return
13
+ # and that might change the behavior.
18
14
  #
15
+ # @example EnforcedStyle: conditionals (default)
19
16
  # # bad
20
17
  # if foo and bar
21
18
  # end
@@ -24,10 +21,16 @@ module RuboCop
24
21
  # foo.save && return
25
22
  #
26
23
  # # good
24
+ # foo.save and return
25
+ #
26
+ # # good
27
27
  # if foo && bar
28
28
  # end
29
29
  #
30
- # @example EnforcedStyle: conditionals (default)
30
+ # @example EnforcedStyle: always
31
+ # # bad
32
+ # foo.save and return
33
+ #
31
34
  # # bad
32
35
  # if foo and bar
33
36
  # end
@@ -36,9 +39,6 @@ module RuboCop
36
39
  # foo.save && return
37
40
  #
38
41
  # # good
39
- # foo.save and return
40
- #
41
- # # good
42
42
  # if foo && bar
43
43
  # end
44
44
  class AndOr < Base
@@ -111,7 +111,7 @@ module RuboCop
111
111
  end
112
112
 
113
113
  # ! is a special case:
114
- # 'x and !obj.method arg' can be auto-corrected if we
114
+ # 'x and !obj.method arg' can be autocorrected if we
115
115
  # recurse down a level and add parens to 'obj.method arg'
116
116
  # however, 'not x' also parses as (send x :!)
117
117
  def correct_not(node, receiver, corrector)
@@ -73,11 +73,11 @@ module RuboCop
73
73
  {
74
74
  (send _ _
75
75
  (splat (lvar %1))
76
- (block-pass (lvar %2)))
76
+ (block-pass {(lvar %2) nil?}))
77
77
  (send _ _
78
78
  (splat (lvar %1))
79
79
  (hash (kwsplat (lvar %3)))
80
- (block-pass (lvar %2)))
80
+ (block-pass {(lvar %2) nil?}))
81
81
  }
82
82
  PATTERN
83
83
 
@@ -133,7 +133,7 @@ module RuboCop
133
133
  def register_offense_to_method_definition_arguments(method_definition)
134
134
  add_offense(arguments_range(method_definition)) do |corrector|
135
135
  arguments_range = range_with_surrounding_space(
136
- range: method_definition.arguments.source_range, side: :left
136
+ method_definition.arguments.source_range, side: :left
137
137
  )
138
138
  corrector.replace(arguments_range, '(...)')
139
139
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop enforces the use of `Array()` instead of explicit `Array` check or `[*var]`.
6
+ # Enforces the use of `Array()` instead of explicit `Array` check or `[*var]`.
7
7
  #
8
8
  # The cop is disabled by default due to safety concerns.
9
9
  #
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses of "*" as a substitute for _join_.
6
+ # Checks for uses of "*" as a substitute for _join_.
7
7
  #
8
8
  # Not all cases can reliably checked, due to Ruby's dynamic
9
9
  # types, so we consider only cases when the first argument is an
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for non-ascii (non-English) characters
6
+ # Checks for non-ascii (non-English) characters
7
7
  # in comments. You could set an array of allowed non-ascii chars in
8
8
  # `AllowedChars` attribute (copyright notice "©" by default).
9
9
  #
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses of Module#attr.
6
+ # Checks for uses of Module#attr.
7
7
  #
8
8
  # @example
9
9
  # # bad - creates a single attribute accessor (deprecated in Ruby 1.9)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for cases when you could use a block
6
+ # Checks for cases when you could use a block
7
7
  # accepting version of a method that does automatic
8
8
  # resource cleanup.
9
9
  #
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks if usage of %() or %Q() matches configuration.
6
+ # Checks if usage of %() or %Q() matches configuration.
7
7
  #
8
8
  # @example EnforcedStyle: bare_percent (default)
9
9
  # # bad
@@ -18,7 +18,7 @@ module RuboCop
18
18
 
19
19
  def initialize(node)
20
20
  @node = node
21
- @attrs = node.arguments.map { |attr| [attr.source, attr] }.to_h
21
+ @attrs = node.arguments.to_h { |attr| [attr.source, attr] }
22
22
  @bisection = []
23
23
  end
24
24
 
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for places where `attr_reader` and `attr_writer`
6
+ # Checks for places where `attr_reader` and `attr_writer`
7
7
  # for the same method can be combined into single `attr_accessor`.
8
8
  #
9
9
  # @example
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop looks for uses of block comments (=begin...=end).
6
+ # Looks for uses of block comments (=begin...=end).
7
7
  #
8
8
  # @example
9
9
  # # bad
@@ -10,7 +10,7 @@ module RuboCop
10
10
  # Methods that can be either procedural or functional and cannot be
11
11
  # categorised from their usage alone is ignored.
12
12
  # `lambda`, `proc`, and `it` are their defaults.
13
- # Additional methods can be added to the `IgnoredMethods`.
13
+ # Additional methods can be added to the `AllowedMethods`.
14
14
  #
15
15
  # @example EnforcedStyle: line_count_based (default)
16
16
  # # bad - single line block
@@ -66,7 +66,7 @@ module RuboCop
66
66
  # x
67
67
  # }.inspect
68
68
  #
69
- # # The AllowBracesOnProceduralOneLiners option is ignored unless the
69
+ # # The AllowBracesOnProceduralOneLiners option is allowed unless the
70
70
  # # EnforcedStyle is set to `semantic`. If so:
71
71
  #
72
72
  # # If the AllowBracesOnProceduralOneLiners option is unspecified, or
@@ -116,7 +116,7 @@ module RuboCop
116
116
  #
117
117
  # # Methods listed in the BracesRequiredMethods list, such as 'sig'
118
118
  # # in this example, will require `{...}` braces. This option takes
119
- # # precedence over all other configurations except IgnoredMethods.
119
+ # # precedence over all other configurations except AllowedMethods.
120
120
  #
121
121
  # # bad
122
122
  # sig do
@@ -138,7 +138,7 @@ module RuboCop
138
138
  # puts foo
139
139
  # end
140
140
  #
141
- # @example IgnoredMethods: ['lambda', 'proc', 'it' ] (default)
141
+ # @example AllowedMethods: ['lambda', 'proc', 'it' ] (default)
142
142
  #
143
143
  # # good
144
144
  # foo = lambda do |x|
@@ -149,9 +149,26 @@ module RuboCop
149
149
  # x * 100
150
150
  # end
151
151
  #
152
+ # @example AllowedPatterns: [] (default)
153
+ #
154
+ # # bad
155
+ # things.map { |thing|
156
+ # something = thing.some_method
157
+ # process(something)
158
+ # }
159
+ #
160
+ # @example AllowedPatterns: [/map/]
161
+ #
162
+ # # good
163
+ # things.map { |thing|
164
+ # something = thing.some_method
165
+ # process(something)
166
+ # }
167
+ #
152
168
  class BlockDelimiters < Base
153
169
  include ConfigurableEnforcedStyle
154
- include IgnoredMethods
170
+ include AllowedMethods
171
+ include AllowedPattern
155
172
  include RangeHelp
156
173
  extend AutoCorrector
157
174
 
@@ -184,6 +201,8 @@ module RuboCop
184
201
  end
185
202
  end
186
203
 
204
+ alias on_numblock on_block
205
+
187
206
  private
188
207
 
189
208
  def autocorrect(corrector, node)
@@ -281,21 +300,26 @@ module RuboCop
281
300
  def move_comment_before_block(corrector, comment, block_node, closing_brace)
282
301
  range = block_node.chained? ? end_of_chain(block_node.parent).source_range : closing_brace
283
302
  comment_range = range_between(range.end_pos, comment.loc.expression.end_pos)
284
- corrector.remove(range_with_surrounding_space(range: comment_range, side: :right))
303
+ corrector.remove(range_with_surrounding_space(comment_range, side: :right))
285
304
  corrector.insert_after(range, "\n")
286
305
 
287
306
  corrector.insert_before(block_node, "#{comment.text}\n")
288
307
  end
289
308
 
290
309
  def end_of_chain(node)
310
+ return end_of_chain(node.block_node) if with_block?(node)
291
311
  return node unless node.chained?
292
312
 
293
313
  end_of_chain(node.parent)
294
314
  end
295
315
 
316
+ def with_block?(node)
317
+ node.respond_to?(:block_node) && node.block_node
318
+ end
319
+
296
320
  def get_blocks(node, &block)
297
321
  case node.type
298
- when :block
322
+ when :block, :numblock
299
323
  yield node
300
324
  when :send
301
325
  get_blocks(node.receiver, &block) if node.receiver
@@ -323,12 +347,14 @@ module RuboCop
323
347
  end
324
348
 
325
349
  def special_method?(method_name)
326
- ignored_method?(method_name) || braces_required_method?(method_name)
350
+ allowed_method?(method_name) ||
351
+ matches_allowed_pattern?(method_name) ||
352
+ braces_required_method?(method_name)
327
353
  end
328
354
 
329
355
  def special_method_proper_block_style?(node)
330
356
  method_name = node.method_name
331
- return true if ignored_method?(method_name)
357
+ return true if allowed_method?(method_name) || matches_allowed_pattern?(method_name)
332
358
  return node.braces? if braces_required_method?(method_name)
333
359
  end
334
360