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,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Suggests `ENV.fetch` for the replacement of `ENV[]`.
7
+ # `ENV[]` silently fails and returns `nil` when the environment variable is unset,
8
+ # which may cause unexpected behaviors when the developer forgets to set it.
9
+ # On the other hand, `ENV.fetch` raises KeyError or returns the explicitly
10
+ # specified default value.
11
+ #
12
+ # @example
13
+ # # bad
14
+ # ENV['X']
15
+ # x = ENV['X']
16
+ #
17
+ # # good
18
+ # ENV.fetch('X')
19
+ # x = ENV.fetch('X')
20
+ #
21
+ # # also good
22
+ # !ENV['X']
23
+ # ENV['X'].some_method # (e.g. `.nil?`)
24
+ #
25
+ class FetchEnvVar < Base
26
+ extend AutoCorrector
27
+
28
+ MSG = 'Use `ENV.fetch(%<key>s)` or `ENV.fetch(%<key>s, nil)` instead of `ENV[%<key>s]`.'
29
+
30
+ # @!method env_with_bracket?(node)
31
+ def_node_matcher :env_with_bracket?, <<~PATTERN
32
+ (send (const nil? :ENV) :[] $_)
33
+ PATTERN
34
+
35
+ def on_send(node)
36
+ env_with_bracket?(node) do |name_node|
37
+ break unless offensive?(node)
38
+
39
+ message = format(MSG, key: name_node.source)
40
+ add_offense(node, message: message) do |corrector|
41
+ corrector.replace(node, new_code(name_node))
42
+ end
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def allowed_var?(node)
49
+ env_key_node = node.children.last
50
+ env_key_node.str_type? && cop_config['AllowedVars'].include?(env_key_node.value)
51
+ end
52
+
53
+ def used_as_flag?(node)
54
+ return false if node.root?
55
+ return true if used_if_condition_in_body(node)
56
+
57
+ node.parent.send_type? && (node.parent.prefix_bang? || node.parent.comparison_method?)
58
+ end
59
+
60
+ def used_if_condition_in_body(node)
61
+ if_node = node.ancestors.find(&:if_type?)
62
+
63
+ return false unless (condition = if_node&.condition)
64
+ return true if condition.send_type? && (condition.child_nodes == node.child_nodes)
65
+
66
+ used_in_condition?(node, condition)
67
+ end
68
+
69
+ def used_in_condition?(node, condition)
70
+ if condition.send_type?
71
+ return true if condition.assignment_method? && partial_matched?(node, condition)
72
+ return false if !condition.comparison_method? && !condition.predicate_method?
73
+ end
74
+
75
+ condition.child_nodes.any?(node)
76
+ end
77
+
78
+ # Avoid offending in the following cases:
79
+ # `ENV['key'] if ENV['key'] = x`
80
+ def partial_matched?(node, condition)
81
+ node.child_nodes == node.child_nodes & condition.child_nodes
82
+ end
83
+
84
+ def offensive?(node)
85
+ !(allowed_var?(node) || allowable_use?(node))
86
+ end
87
+
88
+ # Check if the node is a receiver and receives a message with dot syntax.
89
+ def message_chained_with_dot?(node)
90
+ return false if node.root?
91
+
92
+ parent = node.parent
93
+ return false if !parent.call_type? || parent.children.first != node
94
+
95
+ parent.dot? || parent.safe_navigation?
96
+ end
97
+
98
+ # The following are allowed cases:
99
+ #
100
+ # - Used as a flag (e.g., `if ENV['X']` or `!ENV['X']`) because
101
+ # it simply checks whether the variable is set.
102
+ # - Receiving a message with dot syntax, e.g. `ENV['X'].nil?`.
103
+ # - `ENV['key']` assigned by logical AND/OR assignment.
104
+ # - `ENV['key']` is the LHS of a `||`.
105
+ def allowable_use?(node)
106
+ used_as_flag?(node) || message_chained_with_dot?(node) || assigned?(node) || or_lhs?(node)
107
+ end
108
+
109
+ # The following are allowed cases:
110
+ #
111
+ # - `ENV['key']` is a receiver of `||=`, e.g. `ENV['X'] ||= y`.
112
+ # - `ENV['key']` is a receiver of `&&=`, e.g. `ENV['X'] &&= y`.
113
+ def assigned?(node)
114
+ return false unless (parent = node.parent)&.assignment?
115
+
116
+ lhs, _method, _rhs = *parent
117
+ node == lhs
118
+ end
119
+
120
+ def or_lhs?(node)
121
+ return false unless (parent = node.parent)&.or_type?
122
+
123
+ parent.lhs == node || parent.parent&.or_type?
124
+ end
125
+
126
+ def new_code(name_node)
127
+ "ENV.fetch(#{name_node.source}, nil)"
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -5,6 +5,17 @@ module RuboCop
5
5
  module Style
6
6
  # Favor `File.(bin)write` convenience methods.
7
7
  #
8
+ # NOTE: There are different method signatures between `File.write` (class method)
9
+ # and `File#write` (instance method). The following case will be allowed because
10
+ # static analysis does not know the contents of the splat argument:
11
+ #
12
+ # [source,ruby]
13
+ # ----
14
+ # File.open(filename, 'w') do |f|
15
+ # f.write(*objects)
16
+ # end
17
+ # ----
18
+ #
8
19
  # @example
9
20
  # ## text mode
10
21
  # # bad
@@ -85,6 +96,7 @@ module RuboCop
85
96
  content = send_write?(node) || block_write?(node) do |block_arg, lvar, write_arg|
86
97
  write_arg if block_arg == lvar
87
98
  end
99
+ return false if content&.splat_type?
88
100
 
89
101
  yield(content) if content
90
102
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for division with integers coerced to floats.
6
+ # Checks for division with integers coerced to floats.
7
7
  # It is recommended to either always use `fdiv` or coerce one side only.
8
8
  # This cop also provides other options for code consistency.
9
9
  #
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop looks for uses of the `for` keyword or `each` method. The
6
+ # Looks for uses of the `for` keyword or `each` method. The
7
7
  # preferred alternative is set in the EnforcedStyle configuration
8
8
  # parameter. An `each` call with a block on a single line is always
9
9
  # allowed.
@@ -75,6 +75,8 @@ module RuboCop
75
75
  end
76
76
  end
77
77
 
78
+ alias on_numblock on_block
79
+
78
80
  private
79
81
 
80
82
  def suspect_enumerable?(node)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop enforces the use of a single string formatting utility.
6
+ # Enforces the use of a single string formatting utility.
7
7
  # Valid options include Kernel#format, Kernel#sprintf and String#%.
8
8
  #
9
9
  # The detection of String#% cannot be implemented in a reliable
@@ -11,7 +11,8 @@ module RuboCop
11
11
  # The reason is that _unannotated_ format is very similar
12
12
  # to encoded URLs or Date/Time formatting strings.
13
13
  #
14
- # This cop can be customized ignored methods with `IgnoredMethods`.
14
+ # This cop can be customized allowed methods with `AllowedMethods`.
15
+ # By default, there are no methods to allowed.
15
16
  #
16
17
  # @example EnforcedStyle: annotated (default)
17
18
  #
@@ -61,29 +62,41 @@ module RuboCop
61
62
  # # good
62
63
  # format('%06d', 10)
63
64
  #
64
- # @example IgnoredMethods: [redirect]
65
+ # @example AllowedMethods: [] (default)
66
+ #
67
+ # # bad
68
+ # redirect('foo/%{bar_id}')
69
+ #
70
+ # @example AllowedMethods: [redirect]
71
+ #
72
+ # # good
73
+ # redirect('foo/%{bar_id}')
74
+ #
75
+ # @example AllowedPatterns: [] (default)
76
+ #
77
+ # # bad
78
+ # redirect('foo/%{bar_id}')
79
+ #
80
+ # @example AllowedPatterns: [/redirect/]
65
81
  #
66
82
  # # good
67
83
  # redirect('foo/%{bar_id}')
68
84
  #
69
85
  class FormatStringToken < Base
70
86
  include ConfigurableEnforcedStyle
71
- include IgnoredMethods
87
+ include AllowedMethods
88
+ include AllowedPattern
89
+ extend AutoCorrector
72
90
 
73
91
  def on_str(node)
74
- return if format_string_token?(node) || use_ignored_method?(node)
92
+ return if format_string_token?(node) || use_allowed_method?(node)
75
93
 
76
94
  detections = collect_detections(node)
77
95
  return if detections.empty?
78
96
  return if allowed_unannotated?(detections)
79
97
 
80
- detections.each do |detected_style, token_range|
81
- if detected_style == style
82
- correct_style_detected
83
- else
84
- style_detected(detected_style)
85
- add_offense(token_range, message: message(detected_style))
86
- end
98
+ detections.each do |detected_sequence, token_range|
99
+ check_sequence(detected_sequence, token_range)
87
100
  end
88
101
  end
89
102
 
@@ -101,9 +114,43 @@ module RuboCop
101
114
  !node.value.include?('%') || node.each_ancestor(:xstr, :regexp).any?
102
115
  end
103
116
 
104
- def use_ignored_method?(node)
117
+ def use_allowed_method?(node)
105
118
  send_parent = node.each_ancestor(:send).first
106
- send_parent && ignored_method?(send_parent.method_name)
119
+ send_parent &&
120
+ (allowed_method?(send_parent.method_name) ||
121
+ matches_allowed_pattern?(send_parent.method_name))
122
+ end
123
+
124
+ def check_sequence(detected_sequence, token_range)
125
+ if detected_sequence.style == style
126
+ correct_style_detected
127
+ elsif correctable_sequence?(detected_sequence.type)
128
+ style_detected(detected_sequence.style)
129
+ add_offense(token_range, message: message(detected_sequence.style)) do |corrector|
130
+ autocorrect_sequence(corrector, detected_sequence, token_range)
131
+ end
132
+ end
133
+ end
134
+
135
+ def correctable_sequence?(detected_type)
136
+ detected_type == 's' || style == :annotated || style == :unannotated
137
+ end
138
+
139
+ def autocorrect_sequence(corrector, detected_sequence, token_range)
140
+ return if style == :unannotated
141
+
142
+ name = detected_sequence.name
143
+ return if name.nil?
144
+
145
+ flags = detected_sequence.flags
146
+ width = detected_sequence.width
147
+ precision = detected_sequence.precision
148
+ type = detected_sequence.style == :template ? 's' : detected_sequence.type
149
+ correction = case style
150
+ when :annotated then "%<#{name}>#{flags}#{width}#{precision}#{type}"
151
+ when :template then "%#{flags}#{width}#{precision}{#{name}}"
152
+ end
153
+ corrector.replace(token_range, correction)
107
154
  end
108
155
 
109
156
  def unannotated_format?(node, detected_style)
@@ -143,30 +190,33 @@ module RuboCop
143
190
  def token_ranges(contents)
144
191
  format_string = RuboCop::Cop::Utils::FormatString.new(contents.source)
145
192
 
146
- format_string.format_sequences.each do |seq|
147
- next if seq.percent?
193
+ format_string.format_sequences.each do |detected_sequence|
194
+ next if detected_sequence.percent?
148
195
 
149
- detected_style = seq.style
150
- token = contents.begin.adjust(begin_pos: seq.begin_pos, end_pos: seq.end_pos)
196
+ token = contents.begin.adjust(begin_pos: detected_sequence.begin_pos,
197
+ end_pos: detected_sequence.end_pos)
151
198
 
152
- yield(detected_style, token)
199
+ yield(detected_sequence, token)
153
200
  end
154
201
  end
155
202
 
156
203
  def collect_detections(node)
157
204
  detections = []
158
- tokens(node) do |detected_style, token_range|
159
- unless unannotated_format?(node, detected_style)
160
- detections << [detected_style, token_range]
205
+ tokens(node) do |detected_sequence, token_range|
206
+ unless unannotated_format?(node, detected_sequence.style)
207
+ detections << [detected_sequence, token_range]
161
208
  end
162
209
  end
163
210
  detections
164
211
  end
165
212
 
166
213
  def allowed_unannotated?(detections)
167
- return false if detections.size > max_unannotated_placeholders_allowed
214
+ return false unless detections.all? do |detected_sequence,|
215
+ detected_sequence.style == :unannotated
216
+ end
217
+ return true if detections.size <= max_unannotated_placeholders_allowed
168
218
 
169
- detections.all? { |detected_style,| detected_style == :unannotated }
219
+ detections.any? { |detected_sequence,| !correctable_sequence?(detected_sequence.type) }
170
220
  end
171
221
 
172
222
  def max_unannotated_placeholders_allowed
@@ -3,12 +3,12 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop is designed to help you transition from mutable string literals
6
+ # Helps you transition from mutable string literals
7
7
  # to frozen string literals.
8
8
  # It will add the `# frozen_string_literal: true` magic comment to the top
9
9
  # of files to enable frozen string literals. Frozen string literals may be
10
10
  # default in future Ruby. The comment will be added below a shebang and
11
- # encoding comment.
11
+ # encoding comment. The frozen string literal comment is only valid in Ruby 2.3+.
12
12
  #
13
13
  # Note that the cop will accept files where the comment exists but is set
14
14
  # to `false` instead of `true`.
@@ -86,6 +86,9 @@ module RuboCop
86
86
  include FrozenStringLiteral
87
87
  include RangeHelp
88
88
  extend AutoCorrector
89
+ extend TargetRubyVersion
90
+
91
+ minimum_target_ruby_version 2.3
89
92
 
90
93
  MSG_MISSING_TRUE = 'Missing magic comment `# frozen_string_literal: true`.'
91
94
  MSG_MISSING = 'Missing frozen string literal comment.'
@@ -179,7 +182,7 @@ module RuboCop
179
182
  end
180
183
 
181
184
  def remove_comment(corrector, node)
182
- corrector.remove(range_with_surrounding_space(range: node.pos, side: :right))
185
+ corrector.remove(range_with_surrounding_space(node.pos, side: :right))
183
186
  end
184
187
 
185
188
  def enable_comment(corrector)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop enforces the use of `$stdout/$stderr/$stdin` instead of `STDOUT/STDERR/STDIN`.
6
+ # Enforces the use of `$stdout/$stderr/$stdin` instead of `STDOUT/STDERR/STDIN`.
7
7
  # `STDOUT/STDERR/STDIN` are constants, and while you can actually
8
8
  # reassign (possibly to redirect some stream) constants in Ruby, you'll get
9
9
  # an interpreter warning if you do so.
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop looks for uses of global variables.
6
+ # Looks for uses of global variables.
7
7
  # It does not report offenses for built-in global variables.
8
8
  # Built-in global variables are allowed by default. Additionally
9
9
  # users can allow additional variables via the AllowedVariables option.
@@ -6,6 +6,10 @@ module RuboCop
6
6
  # Use a guard clause instead of wrapping the code inside a conditional
7
7
  # expression
8
8
  #
9
+ # A condition with an `elsif` or `else` branch is allowed unless
10
+ # one of `return`, `break`, `next`, `raise`, or `fail` is used
11
+ # in the body of the conditional expression.
12
+ #
9
13
  # @example
10
14
  # # bad
11
15
  # def test
@@ -47,6 +51,44 @@ module RuboCop
47
51
  # # good
48
52
  # foo || raise('exception') if something
49
53
  # ok
54
+ #
55
+ # @example AllowConsecutiveConditionals: false (default)
56
+ # # bad
57
+ # def test
58
+ # if foo?
59
+ # work
60
+ # end
61
+ #
62
+ # if bar? # <- reports an offense
63
+ # work
64
+ # end
65
+ # end
66
+ #
67
+ # @example AllowConsecutiveConditionals: true
68
+ # # good
69
+ # def test
70
+ # if foo?
71
+ # work
72
+ # end
73
+ #
74
+ # if bar?
75
+ # work
76
+ # end
77
+ # end
78
+ #
79
+ # # bad
80
+ # def test
81
+ # if foo?
82
+ # work
83
+ # end
84
+ #
85
+ # do_something
86
+ #
87
+ # if bar? # <- reports an offense
88
+ # work
89
+ # end
90
+ # end
91
+ #
50
92
  class GuardClause < Base
51
93
  include MinBodyLength
52
94
  include StatementModifier
@@ -79,7 +121,7 @@ module RuboCop
79
121
  kw = if guard_clause_in_if
80
122
  node.loc.keyword.source
81
123
  else
82
- opposite_keyword(node)
124
+ node.inverse_keyword
83
125
  end
84
126
 
85
127
  register_offense(node, guard_clause_source(guard_clause), kw)
@@ -89,18 +131,26 @@ module RuboCop
89
131
 
90
132
  def check_ending_if(node)
91
133
  return if accepted_form?(node, ending: true) || !min_body_length?(node)
134
+ return if allowed_consecutive_conditionals? &&
135
+ consecutive_conditionals?(node.parent, node)
92
136
 
93
- register_offense(node, 'return', opposite_keyword(node))
137
+ register_offense(node, 'return', node.inverse_keyword)
94
138
  end
95
139
 
96
- def opposite_keyword(node)
97
- node.if? ? 'unless' : 'if'
140
+ def consecutive_conditionals?(parent, node)
141
+ parent.each_child_node.inject(false) do |if_type, child|
142
+ break if_type if node == child
143
+
144
+ child.if_type?
145
+ end
98
146
  end
99
147
 
100
148
  def register_offense(node, scope_exiting_keyword, conditional_keyword)
101
149
  condition, = node.node_parts
102
150
  example = [scope_exiting_keyword, conditional_keyword, condition.source].join(' ')
103
151
  if too_long_for_single_line?(node, example)
152
+ return if trivial?(node)
153
+
104
154
  example = "#{conditional_keyword} #{condition.source}; #{scope_exiting_keyword}; end"
105
155
  end
106
156
 
@@ -126,6 +176,10 @@ module RuboCop
126
176
  accepted_if?(node, ending) || node.condition.multiline? || node.parent&.assignment?
127
177
  end
128
178
 
179
+ def trivial?(node)
180
+ node.branches.one? && !node.if_branch.if_type? && !node.if_branch.begin_type?
181
+ end
182
+
129
183
  def accepted_if?(node, ending)
130
184
  return true if node.modifier_form? || node.ternary?
131
185
 
@@ -135,6 +189,10 @@ module RuboCop
135
189
  !node.else? || node.elsif?
136
190
  end
137
191
  end
192
+
193
+ def allowed_consecutive_conditionals?
194
+ cop_config.fetch('AllowConsecutiveConditionals', false)
195
+ end
138
196
  end
139
197
  end
140
198
  end
@@ -87,7 +87,7 @@ module RuboCop
87
87
 
88
88
  def remove_last_element_trailing_comma(corrector, node)
89
89
  range = range_with_surrounding_space(
90
- range: node.children.last.source_range,
90
+ node.children.last.source_range,
91
91
  side: :right
92
92
  ).end.resize(1)
93
93
 
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks the usage of pre-2.1 `Hash[args]` method of converting enumerables and
6
+ # Checks the usage of pre-2.1 `Hash[args]` method of converting enumerables and
7
7
  # sequences of values to hashes.
8
8
  #
9
9
  # Correction code from splat argument (`Hash[*ary]`) is not simply determined. For example,
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses of `each_key` and `each_value` Hash methods.
6
+ # Checks for uses of `each_key` and `each_value` Hash methods.
7
7
  #
8
8
  # NOTE: If you have an array of two-element arrays, you can put
9
9
  # parentheses around the block arguments to indicate that you're not
@@ -35,13 +35,15 @@ module RuboCop
35
35
 
36
36
  # @!method kv_each(node)
37
37
  def_node_matcher :kv_each, <<~PATTERN
38
- (block $(send (send _ ${:keys :values}) :each) ...)
38
+ ({block numblock} $(send (send _ ${:keys :values}) :each) ...)
39
39
  PATTERN
40
40
 
41
41
  def on_block(node)
42
42
  register_kv_offense(node)
43
43
  end
44
44
 
45
+ alias on_numblock on_block
46
+
45
47
  private
46
48
 
47
49
  def register_kv_offense(node)