rubocop 1.26.1 → 1.32.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 (559) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -4
  3. data/config/default.yml +170 -31
  4. data/config/obsoletion.yml +12 -1
  5. data/exe/rubocop +15 -7
  6. data/lib/rubocop/cli/command/auto_genenerate_config.rb +19 -4
  7. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  8. data/lib/rubocop/cli/command/show_cops.rb +1 -1
  9. data/lib/rubocop/cli/command/suggest_extensions.rb +4 -4
  10. data/lib/rubocop/cli.rb +2 -0
  11. data/lib/rubocop/config.rb +5 -1
  12. data/lib/rubocop/config_loader.rb +3 -1
  13. data/lib/rubocop/config_loader_resolver.rb +1 -1
  14. data/lib/rubocop/config_obsoletion/extracted_cop.rb +3 -1
  15. data/lib/rubocop/config_validator.rb +21 -4
  16. data/lib/rubocop/cop/autocorrect_logic.rb +8 -2
  17. data/lib/rubocop/cop/badge.rb +1 -1
  18. data/lib/rubocop/cop/base.rb +6 -2
  19. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -7
  20. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  21. data/lib/rubocop/cop/bundler/gem_filename.rb +5 -5
  22. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
  23. data/lib/rubocop/cop/corrector.rb +2 -2
  24. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
  25. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  26. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
  27. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  28. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +4 -2
  29. data/lib/rubocop/cop/correctors/if_then_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
  31. data/lib/rubocop/cop/correctors/line_break_corrector.rb +7 -1
  32. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +3 -3
  33. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
  34. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
  35. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  36. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  37. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -1
  38. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +1 -1
  39. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +2 -2
  40. data/lib/rubocop/cop/gemspec/dependency_version.rb +156 -0
  41. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +92 -0
  42. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +5 -12
  43. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  44. data/lib/rubocop/cop/gemspec/require_mfa.rb +20 -20
  45. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  46. data/lib/rubocop/cop/generator.rb +5 -1
  47. data/lib/rubocop/cop/internal_affairs/cop_description.rb +96 -0
  48. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +1 -1
  49. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -1
  50. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +80 -0
  51. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -5
  52. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -1
  53. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -1
  54. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  55. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  56. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
  57. data/lib/rubocop/cop/internal_affairs.rb +3 -0
  58. data/lib/rubocop/cop/layout/argument_alignment.rb +22 -1
  59. data/lib/rubocop/cop/layout/assignment_indentation.rb +1 -1
  60. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
  61. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  62. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -1
  63. data/lib/rubocop/cop/layout/case_indentation.rb +17 -1
  64. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  65. data/lib/rubocop/cop/layout/comment_indentation.rb +2 -2
  66. data/lib/rubocop/cop/layout/condition_position.rb +1 -1
  67. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  68. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  69. data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
  70. data/lib/rubocop/cop/layout/empty_comment.rb +2 -2
  71. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  72. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  73. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
  74. data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
  75. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -1
  76. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +25 -4
  77. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +1 -1
  78. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +5 -5
  79. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +10 -10
  80. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  81. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +1 -1
  82. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +10 -10
  83. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  84. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  85. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  86. data/lib/rubocop/cop/layout/first_argument_indentation.rb +28 -28
  87. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +21 -14
  88. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  89. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +52 -13
  90. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  91. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  92. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -1
  93. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
  94. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -0
  95. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
  96. data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
  97. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -1
  98. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  99. data/lib/rubocop/cop/layout/indentation_width.rb +11 -9
  100. data/lib/rubocop/cop/layout/initial_indentation.rb +2 -2
  101. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  102. data/lib/rubocop/cop/layout/leading_empty_lines.rb +1 -1
  103. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +112 -0
  104. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +130 -0
  105. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  106. data/lib/rubocop/cop/layout/line_length.rb +7 -5
  107. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +1 -1
  108. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -1
  109. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
  110. data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -2
  111. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +1 -1
  112. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  113. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -2
  114. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
  115. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -5
  116. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  117. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +45 -0
  118. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -3
  119. data/lib/rubocop/cop/layout/redundant_line_break.rb +4 -5
  120. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
  121. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  122. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  123. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +2 -2
  124. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  125. data/lib/rubocop/cop/layout/space_before_block_braces.rb +3 -3
  126. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -0
  127. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
  128. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  129. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  130. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +10 -10
  131. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +8 -6
  132. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -1
  133. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -1
  134. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +9 -9
  135. data/lib/rubocop/cop/layout/trailing_whitespace.rb +3 -3
  136. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -1
  137. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +10 -2
  138. data/lib/rubocop/cop/lint/ambiguous_operator.rb +7 -7
  139. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -1
  140. data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -5
  141. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +1 -1
  142. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -1
  143. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  144. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  145. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  146. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +51 -0
  147. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  148. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +11 -5
  149. data/lib/rubocop/cop/lint/deprecated_constants.rb +1 -1
  150. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  151. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -1
  152. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  153. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +1 -1
  154. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  155. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
  156. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  157. data/lib/rubocop/cop/lint/duplicate_require.rb +11 -2
  158. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +1 -1
  159. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  160. data/lib/rubocop/cop/lint/else_layout.rb +3 -3
  161. data/lib/rubocop/cop/lint/empty_block.rb +1 -1
  162. data/lib/rubocop/cop/lint/empty_class.rb +1 -1
  163. data/lib/rubocop/cop/lint/empty_conditional_body.rb +4 -2
  164. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  165. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  166. data/lib/rubocop/cop/lint/empty_file.rb +1 -1
  167. data/lib/rubocop/cop/lint/empty_in_pattern.rb +4 -2
  168. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  169. data/lib/rubocop/cop/lint/empty_when.rb +4 -2
  170. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  171. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
  172. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  173. data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
  174. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  175. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
  176. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  177. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +11 -4
  178. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  179. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  180. data/lib/rubocop/cop/lint/interpolation_check.rb +2 -2
  181. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +10 -3
  182. data/lib/rubocop/cop/lint/literal_as_condition.rb +6 -1
  183. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  184. data/lib/rubocop/cop/lint/loop.rb +2 -2
  185. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  186. data/lib/rubocop/cop/lint/missing_super.rb +1 -1
  187. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  188. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  189. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +157 -0
  190. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +5 -5
  191. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  192. data/lib/rubocop/cop/lint/number_conversion.rb +11 -5
  193. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
  194. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  195. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2 -2
  196. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
  197. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  198. data/lib/rubocop/cop/lint/raise_exception.rb +2 -2
  199. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  200. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +6 -6
  201. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2 -2
  202. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -1
  203. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +10 -3
  204. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  205. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  206. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  207. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  208. data/lib/rubocop/cop/lint/refinement_import_methods.rb +51 -0
  209. data/lib/rubocop/cop/lint/regexp_as_condition.rb +3 -3
  210. data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
  211. data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
  212. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  213. data/lib/rubocop/cop/lint/return_in_void_context.rb +6 -18
  214. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +38 -1
  215. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
  216. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  217. data/lib/rubocop/cop/lint/script_permission.rb +1 -1
  218. data/lib/rubocop/cop/lint/self_assignment.rb +1 -1
  219. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
  220. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  221. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +11 -1
  222. data/lib/rubocop/cop/lint/struct_new_override.rb +3 -3
  223. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  224. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  225. data/lib/rubocop/cop/lint/syntax.rb +2 -3
  226. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  227. data/lib/rubocop/cop/lint/to_json.rb +1 -1
  228. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  229. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +2 -2
  230. data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
  231. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
  232. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  233. data/lib/rubocop/cop/lint/unified_integer.rb +3 -1
  234. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  235. data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
  236. data/lib/rubocop/cop/lint/unused_block_argument.rb +1 -1
  237. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -2
  238. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  239. data/lib/rubocop/cop/lint/uri_regexp.rb +1 -1
  240. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -1
  241. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  242. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +2 -3
  243. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  244. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +1 -1
  245. data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
  246. data/lib/rubocop/cop/lint/useless_times.rb +2 -2
  247. data/lib/rubocop/cop/lint/void.rb +1 -1
  248. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  249. data/lib/rubocop/cop/metrics/block_length.rb +2 -1
  250. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  251. data/lib/rubocop/cop/metrics/class_length.rb +1 -1
  252. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  253. data/lib/rubocop/cop/metrics/method_length.rb +2 -1
  254. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  255. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  256. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  257. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -3
  258. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +22 -3
  259. data/lib/rubocop/cop/mixin/allowed_pattern.rb +40 -0
  260. data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -0
  261. data/lib/rubocop/cop/mixin/comments_help.rb +24 -2
  262. data/lib/rubocop/cop/mixin/def_node.rb +2 -7
  263. data/lib/rubocop/cop/mixin/duplication.rb +1 -1
  264. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +8 -4
  265. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +34 -12
  266. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -2
  267. data/lib/rubocop/cop/mixin/percent_array.rb +60 -1
  268. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +2 -2
  269. data/lib/rubocop/cop/mixin/range_help.rb +7 -3
  270. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -1
  271. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  272. data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -2
  273. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
  274. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  275. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
  276. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  277. data/lib/rubocop/cop/naming/block_forwarding.rb +4 -4
  278. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  279. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  280. data/lib/rubocop/cop/naming/constant_name.rb +1 -1
  281. data/lib/rubocop/cop/naming/file_name.rb +2 -2
  282. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
  283. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  284. data/lib/rubocop/cop/naming/inclusive_language.rb +3 -2
  285. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  286. data/lib/rubocop/cop/naming/method_name.rb +6 -6
  287. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  288. data/lib/rubocop/cop/naming/predicate_name.rb +11 -3
  289. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  290. data/lib/rubocop/cop/naming/variable_name.rb +10 -1
  291. data/lib/rubocop/cop/naming/variable_number.rb +28 -18
  292. data/lib/rubocop/cop/offense.rb +1 -1
  293. data/lib/rubocop/cop/security/compound_hash.rb +105 -0
  294. data/lib/rubocop/cop/security/eval.rb +1 -1
  295. data/lib/rubocop/cop/security/json_load.rb +1 -1
  296. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  297. data/lib/rubocop/cop/security/open.rb +1 -1
  298. data/lib/rubocop/cop/security/yaml_load.rb +2 -2
  299. data/lib/rubocop/cop/style/accessor_grouping.rb +4 -4
  300. data/lib/rubocop/cop/style/alias.rb +4 -4
  301. data/lib/rubocop/cop/style/and_or.rb +12 -12
  302. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -1
  303. data/lib/rubocop/cop/style/array_coercion.rb +1 -1
  304. data/lib/rubocop/cop/style/array_join.rb +1 -1
  305. data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
  306. data/lib/rubocop/cop/style/attr.rb +1 -1
  307. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
  308. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  309. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +1 -1
  310. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
  311. data/lib/rubocop/cop/style/block_comments.rb +1 -1
  312. data/lib/rubocop/cop/style/block_delimiters.rb +9 -2
  313. data/lib/rubocop/cop/style/case_equality.rb +1 -1
  314. data/lib/rubocop/cop/style/case_like_if.rb +2 -2
  315. data/lib/rubocop/cop/style/character_literal.rb +1 -1
  316. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  317. data/lib/rubocop/cop/style/class_check.rb +1 -1
  318. data/lib/rubocop/cop/style/class_equality_comparison.rb +23 -1
  319. data/lib/rubocop/cop/style/class_methods.rb +1 -1
  320. data/lib/rubocop/cop/style/class_methods_definitions.rb +1 -1
  321. data/lib/rubocop/cop/style/class_vars.rb +1 -1
  322. data/lib/rubocop/cop/style/collection_compact.rb +4 -4
  323. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  324. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  325. data/lib/rubocop/cop/style/colon_method_definition.rb +1 -1
  326. data/lib/rubocop/cop/style/combinable_loops.rb +1 -1
  327. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  328. data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
  329. data/lib/rubocop/cop/style/commented_keyword.rb +4 -4
  330. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -1
  331. data/lib/rubocop/cop/style/constant_visibility.rb +1 -1
  332. data/lib/rubocop/cop/style/date_time.rb +2 -2
  333. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -1
  334. data/lib/rubocop/cop/style/dir.rb +4 -1
  335. data/lib/rubocop/cop/style/documentation.rb +1 -1
  336. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  337. data/lib/rubocop/cop/style/double_negation.rb +60 -3
  338. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  339. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  340. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  341. data/lib/rubocop/cop/style/empty_case_condition.rb +3 -4
  342. data/lib/rubocop/cop/style/empty_else.rb +40 -3
  343. data/lib/rubocop/cop/style/empty_heredoc.rb +59 -0
  344. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  345. data/lib/rubocop/cop/style/empty_literal.rb +2 -2
  346. data/lib/rubocop/cop/style/empty_method.rb +17 -2
  347. data/lib/rubocop/cop/style/encoding.rb +2 -2
  348. data/lib/rubocop/cop/style/end_block.rb +1 -1
  349. data/lib/rubocop/cop/style/endless_method.rb +1 -1
  350. data/lib/rubocop/cop/style/env_home.rb +56 -0
  351. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  352. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  353. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  354. data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
  355. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  356. data/lib/rubocop/cop/style/fetch_env_var.rb +132 -0
  357. data/lib/rubocop/cop/style/file_write.rb +12 -0
  358. data/lib/rubocop/cop/style/float_division.rb +1 -1
  359. data/lib/rubocop/cop/style/for.rb +1 -1
  360. data/lib/rubocop/cop/style/format_string.rb +1 -1
  361. data/lib/rubocop/cop/style/format_string_token.rb +54 -17
  362. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
  363. data/lib/rubocop/cop/style/global_std_stream.rb +1 -1
  364. data/lib/rubocop/cop/style/global_vars.rb +1 -1
  365. data/lib/rubocop/cop/style/guard_clause.rb +51 -4
  366. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -1
  367. data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
  368. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -1
  369. data/lib/rubocop/cop/style/hash_except.rb +89 -9
  370. data/lib/rubocop/cop/style/hash_like_case.rb +1 -1
  371. data/lib/rubocop/cop/style/hash_syntax.rb +3 -3
  372. data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -1
  373. data/lib/rubocop/cop/style/hash_transform_values.rb +4 -1
  374. data/lib/rubocop/cop/style/identical_conditional_branches.rb +4 -4
  375. data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -4
  376. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -2
  377. data/lib/rubocop/cop/style/implicit_runtime_error.rb +3 -3
  378. data/lib/rubocop/cop/style/in_pattern_then.rb +1 -1
  379. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  380. data/lib/rubocop/cop/style/inverse_methods.rb +2 -2
  381. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  382. data/lib/rubocop/cop/style/keyword_parameters_order.rb +2 -2
  383. data/lib/rubocop/cop/style/lambda.rb +1 -1
  384. data/lib/rubocop/cop/style/lambda_call.rb +1 -1
  385. data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -2
  386. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +136 -0
  387. data/lib/rubocop/cop/style/map_to_hash.rb +3 -3
  388. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +2 -2
  389. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -1
  390. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +5 -5
  391. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +13 -1
  392. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -1
  393. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  394. data/lib/rubocop/cop/style/min_max.rb +1 -1
  395. data/lib/rubocop/cop/style/missing_else.rb +24 -24
  396. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
  397. data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
  398. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  399. data/lib/rubocop/cop/style/module_function.rb +3 -3
  400. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  401. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -2
  402. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  403. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +2 -4
  404. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  405. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  406. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +37 -11
  407. data/lib/rubocop/cop/style/multiline_when_then.rb +2 -4
  408. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  409. data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
  410. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  411. data/lib/rubocop/cop/style/nested_file_dirname.rb +1 -1
  412. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  413. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -2
  414. data/lib/rubocop/cop/style/nested_ternary_operator.rb +20 -8
  415. data/lib/rubocop/cop/style/next.rb +1 -1
  416. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  417. data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
  418. data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
  419. data/lib/rubocop/cop/style/not.rb +2 -2
  420. data/lib/rubocop/cop/style/numbered_parameters.rb +1 -1
  421. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +1 -1
  422. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  423. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  424. data/lib/rubocop/cop/style/numeric_predicate.rb +30 -8
  425. data/lib/rubocop/cop/style/object_then.rb +69 -0
  426. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
  427. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  428. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  429. data/lib/rubocop/cop/style/optional_arguments.rb +2 -2
  430. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +2 -2
  431. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  432. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
  433. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  434. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  435. data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
  436. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  437. data/lib/rubocop/cop/style/proc.rb +1 -1
  438. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  439. data/lib/rubocop/cop/style/raise_args.rb +10 -4
  440. data/lib/rubocop/cop/style/random_with_offset.rb +1 -1
  441. data/lib/rubocop/cop/style/redundant_argument.rb +2 -2
  442. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  443. data/lib/rubocop/cop/style/redundant_begin.rb +17 -6
  444. data/lib/rubocop/cop/style/redundant_capital_w.rb +2 -3
  445. data/lib/rubocop/cop/style/redundant_condition.rb +113 -12
  446. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  447. data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
  448. data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -1
  449. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  450. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  451. data/lib/rubocop/cop/style/redundant_initialize.rb +154 -0
  452. data/lib/rubocop/cop/style/redundant_interpolation.rb +22 -1
  453. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -2
  454. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  455. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +8 -3
  456. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +2 -2
  457. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  458. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  459. data/lib/rubocop/cop/style/redundant_self_assignment.rb +3 -4
  460. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +1 -1
  461. data/lib/rubocop/cop/style/redundant_sort.rb +1 -1
  462. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
  463. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  464. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  465. data/lib/rubocop/cop/style/rescue_standard_error.rb +13 -13
  466. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  467. data/lib/rubocop/cop/style/safe_navigation.rb +17 -9
  468. data/lib/rubocop/cop/style/sample.rb +1 -1
  469. data/lib/rubocop/cop/style/select_by_regexp.rb +1 -1
  470. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  471. data/lib/rubocop/cop/style/semicolon.rb +28 -4
  472. data/lib/rubocop/cop/style/send.rb +1 -1
  473. data/lib/rubocop/cop/style/signal_exception.rb +1 -1
  474. data/lib/rubocop/cop/style/single_argument_dig.rb +5 -0
  475. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  476. data/lib/rubocop/cop/style/single_line_methods.rb +2 -2
  477. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
  478. data/lib/rubocop/cop/style/sole_nested_conditional.rb +35 -16
  479. data/lib/rubocop/cop/style/special_global_vars.rb +66 -8
  480. data/lib/rubocop/cop/style/static_class.rb +1 -1
  481. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  482. data/lib/rubocop/cop/style/string_chars.rb +1 -1
  483. data/lib/rubocop/cop/style/string_concatenation.rb +6 -7
  484. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  485. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
  486. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  487. data/lib/rubocop/cop/style/strip.rb +1 -1
  488. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -4
  489. data/lib/rubocop/cop/style/swap_values.rb +2 -2
  490. data/lib/rubocop/cop/style/symbol_array.rb +8 -5
  491. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  492. data/lib/rubocop/cop/style/symbol_proc.rb +37 -5
  493. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
  494. data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -1
  495. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -1
  496. data/lib/rubocop/cop/style/trailing_body_on_module.rb +1 -1
  497. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +1 -1
  498. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +1 -1
  499. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  500. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +1 -1
  501. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  502. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
  503. data/lib/rubocop/cop/style/trivial_accessors.rb +11 -9
  504. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  505. data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -1
  506. data/lib/rubocop/cop/style/unpack_first.rb +5 -2
  507. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  508. data/lib/rubocop/cop/style/when_then.rb +1 -1
  509. data/lib/rubocop/cop/style/word_array.rb +3 -4
  510. data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
  511. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  512. data/lib/rubocop/cop/team.rb +2 -2
  513. data/lib/rubocop/cop/util.rb +2 -2
  514. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  515. data/lib/rubocop/cops_documentation_generator.rb +19 -2
  516. data/lib/rubocop/formatter/disabled_config_formatter.rb +10 -7
  517. data/lib/rubocop/formatter/formatter_set.rb +20 -18
  518. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +15 -2
  519. data/lib/rubocop/formatter/html_formatter.rb +2 -10
  520. data/lib/rubocop/formatter/markdown_formatter.rb +78 -0
  521. data/lib/rubocop/formatter/offense_count_formatter.rb +8 -2
  522. data/lib/rubocop/formatter/simple_text_formatter.rb +9 -8
  523. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -2
  524. data/lib/rubocop/formatter.rb +31 -0
  525. data/lib/rubocop/magic_comment.rb +31 -5
  526. data/lib/rubocop/options.rb +103 -34
  527. data/lib/rubocop/rake_task.rb +34 -9
  528. data/lib/rubocop/result_cache.rb +13 -4
  529. data/lib/rubocop/rspec/cop_helper.rb +2 -2
  530. data/lib/rubocop/rspec/expect_offense.rb +3 -3
  531. data/lib/rubocop/rspec/parallel_formatter.rb +1 -1
  532. data/lib/rubocop/rspec/shared_contexts.rb +31 -11
  533. data/lib/rubocop/rspec/support.rb +14 -0
  534. data/lib/rubocop/runner.rb +37 -7
  535. data/lib/rubocop/server/cache.rb +109 -0
  536. data/lib/rubocop/server/cli.rb +104 -0
  537. data/lib/rubocop/server/client_command/base.rb +44 -0
  538. data/lib/rubocop/server/client_command/exec.rb +59 -0
  539. data/lib/rubocop/server/client_command/restart.rb +25 -0
  540. data/lib/rubocop/server/client_command/start.rb +43 -0
  541. data/lib/rubocop/server/client_command/status.rb +28 -0
  542. data/lib/rubocop/server/client_command/stop.rb +31 -0
  543. data/lib/rubocop/server/client_command.rb +26 -0
  544. data/lib/rubocop/server/core.rb +79 -0
  545. data/lib/rubocop/server/errors.rb +23 -0
  546. data/lib/rubocop/server/helper.rb +34 -0
  547. data/lib/rubocop/server/server_command/base.rb +50 -0
  548. data/lib/rubocop/server/server_command/exec.rb +34 -0
  549. data/lib/rubocop/server/server_command/stop.rb +24 -0
  550. data/lib/rubocop/server/server_command.rb +21 -0
  551. data/lib/rubocop/server/socket_reader.rb +65 -0
  552. data/lib/rubocop/server.rb +53 -0
  553. data/lib/rubocop/string_interpreter.rb +4 -4
  554. data/lib/rubocop/target_ruby.rb +14 -6
  555. data/lib/rubocop/version.rb +15 -8
  556. data/lib/rubocop.rb +20 -27
  557. metadata +68 -10
  558. data/lib/rubocop/cop/gemspec/date_assignment.rb +0 -49
  559. data/lib/rubocop/cop/mixin/ignored_pattern.rb +0 -29
@@ -2,11 +2,11 @@
2
2
 
3
3
  require 'tmpdir'
4
4
 
5
- RSpec.shared_context 'isolated environment', :isolated_environment do
5
+ RSpec.shared_context 'isolated environment' do
6
6
  around do |example|
7
7
  Dir.mktmpdir do |tmpdir|
8
- original_home = ENV['HOME']
9
- original_xdg_config_home = ENV['XDG_CONFIG_HOME']
8
+ original_home = Dir.home
9
+ original_xdg_config_home = ENV.fetch('XDG_CONFIG_HOME', nil)
10
10
 
11
11
  # Make sure to expand all symlinks in the path first. Otherwise we may
12
12
  # get mismatched pathnames when loading config files later on.
@@ -38,7 +38,7 @@ RSpec.shared_context 'isolated environment', :isolated_environment do
38
38
  end
39
39
  end
40
40
 
41
- RSpec.shared_context 'maintain registry', :restore_registry do
41
+ RSpec.shared_context 'maintain registry' do
42
42
  around(:each) { |example| RuboCop::Cop::Registry.with_temporary_global { example.run } }
43
43
 
44
44
  def stub_cop_class(name, inherit: RuboCop::Cop::Base, &block)
@@ -49,7 +49,7 @@ RSpec.shared_context 'maintain registry', :restore_registry do
49
49
  end
50
50
 
51
51
  # This context assumes nothing and defines `cop`, among others.
52
- RSpec.shared_context 'config', :config do # rubocop:disable Metrics/BlockLength
52
+ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
53
53
  ### Meant to be overridden at will
54
54
 
55
55
  let(:cop_class) do
@@ -116,26 +116,46 @@ RSpec.shared_context 'mock console output' do
116
116
  end
117
117
  end
118
118
 
119
- RSpec.shared_context 'ruby 2.5', :ruby25 do
119
+ RSpec.shared_context 'ruby 2.0' do
120
+ let(:ruby_version) { 2.0 }
121
+ end
122
+
123
+ RSpec.shared_context 'ruby 2.1' do
124
+ let(:ruby_version) { 2.1 }
125
+ end
126
+
127
+ RSpec.shared_context 'ruby 2.2' do
128
+ let(:ruby_version) { 2.2 }
129
+ end
130
+
131
+ RSpec.shared_context 'ruby 2.3' do
132
+ let(:ruby_version) { 2.3 }
133
+ end
134
+
135
+ RSpec.shared_context 'ruby 2.4' do
136
+ let(:ruby_version) { 2.4 }
137
+ end
138
+
139
+ RSpec.shared_context 'ruby 2.5' do
120
140
  let(:ruby_version) { 2.5 }
121
141
  end
122
142
 
123
- RSpec.shared_context 'ruby 2.6', :ruby26 do
143
+ RSpec.shared_context 'ruby 2.6' do
124
144
  let(:ruby_version) { 2.6 }
125
145
  end
126
146
 
127
- RSpec.shared_context 'ruby 2.7', :ruby27 do
147
+ RSpec.shared_context 'ruby 2.7' do
128
148
  let(:ruby_version) { 2.7 }
129
149
  end
130
150
 
131
- RSpec.shared_context 'ruby 3.0', :ruby30 do
151
+ RSpec.shared_context 'ruby 3.0' do
132
152
  let(:ruby_version) { 3.0 }
133
153
  end
134
154
 
135
- RSpec.shared_context 'ruby 3.1', :ruby31 do
155
+ RSpec.shared_context 'ruby 3.1' do
136
156
  let(:ruby_version) { 3.1 }
137
157
  end
138
158
 
139
- RSpec.shared_context 'ruby 3.2', :ruby32 do
159
+ RSpec.shared_context 'ruby 3.2' do
140
160
  let(:ruby_version) { 3.2 }
141
161
  end
@@ -11,4 +11,18 @@ require_relative 'parallel_formatter'
11
11
  RSpec.configure do |config|
12
12
  config.include CopHelper
13
13
  config.include HostEnvironmentSimulatorHelper
14
+ config.include_context 'config', :config
15
+ config.include_context 'isolated environment', :isolated_environment
16
+ config.include_context 'maintain registry', :restore_registry
17
+ config.include_context 'ruby 2.0', :ruby20
18
+ config.include_context 'ruby 2.1', :ruby21
19
+ config.include_context 'ruby 2.2', :ruby22
20
+ config.include_context 'ruby 2.3', :ruby23
21
+ config.include_context 'ruby 2.4', :ruby24
22
+ config.include_context 'ruby 2.5', :ruby25
23
+ config.include_context 'ruby 2.6', :ruby26
24
+ config.include_context 'ruby 2.7', :ruby27
25
+ config.include_context 'ruby 3.0', :ruby30
26
+ config.include_context 'ruby 3.1', :ruby31
27
+ config.include_context 'ruby 3.2', :ruby32
14
28
  end
@@ -13,7 +13,7 @@ module RuboCop
13
13
 
14
14
  def initialize(path, offenses_by_iteration, loop_start: -1)
15
15
  @offenses = offenses_by_iteration.flatten.uniq
16
- root_cause = offenses_by_iteration[loop_start..-1]
16
+ root_cause = offenses_by_iteration[loop_start..]
17
17
  .map { |x| x.map(&:cop_name).uniq.join(', ') }
18
18
  .join(' -> ')
19
19
 
@@ -63,8 +63,12 @@ module RuboCop
63
63
  # Warms up the RuboCop cache by forking a suitable number of RuboCop
64
64
  # instances that each inspects its allotted group of files.
65
65
  def warm_cache(target_files)
66
+ saved_options = @options.dup
66
67
  puts 'Running parallel inspection' if @options[:debug]
68
+ %i[autocorrect safe_autocorrect].each { |opt| @options[opt] = false }
67
69
  Parallel.each(target_files) { |target_file| file_offenses(target_file) }
70
+ ensure
71
+ @options = saved_options
68
72
  end
69
73
 
70
74
  def find_target_files(paths)
@@ -143,10 +147,10 @@ module RuboCop
143
147
 
144
148
  if cache&.valid?
145
149
  offenses = cache.load
146
- # If we're running --auto-correct and the cache says there are
150
+ # If we're running --autocorrect and the cache says there are
147
151
  # offenses, we need to actually inspect the file. If the cache shows no
148
152
  # offenses, we're good.
149
- real_run_needed = @options[:auto_correct] && offenses.any?
153
+ real_run_needed = @options[:autocorrect] && offenses.any?
150
154
  else
151
155
  real_run_needed = true
152
156
  end
@@ -207,9 +211,7 @@ module RuboCop
207
211
  end
208
212
 
209
213
  def file_finished(file, offenses)
210
- if @options[:display_only_fail_level_offenses]
211
- offenses = offenses.select { |o| considered_failure?(o) }
212
- end
214
+ offenses = offenses_to_report(offenses)
213
215
  formatter_set.file_finished(file, offenses)
214
216
  end
215
217
 
@@ -242,7 +244,7 @@ module RuboCop
242
244
  # error message.
243
245
  offenses_by_iteration = []
244
246
 
245
- # When running with --auto-correct, we need to inspect the file (which
247
+ # When running with --autocorrect, we need to inspect the file (which
246
248
  # includes writing a corrected version of it) until no more corrections
247
249
  # are made. This is because automatic corrections can introduce new
248
250
  # offenses. In the normal case the loop is only executed once.
@@ -380,6 +382,34 @@ module RuboCop
380
382
  !offense.corrected? && offense.severity >= minimum_severity_to_fail
381
383
  end
382
384
 
385
+ def offenses_to_report(offenses)
386
+ if @options[:display_only_fail_level_offenses]
387
+ offenses.select { |o| considered_failure?(o) }
388
+ elsif @options[:display_only_safe_correctable]
389
+ offenses.select { |o| supports_safe_autocorrect?(o) }
390
+ elsif @options[:display_only_correctable]
391
+ offenses.select(&:correctable?)
392
+ else
393
+ offenses
394
+ end
395
+ end
396
+
397
+ def supports_safe_autocorrect?(offense)
398
+ cop_class = Cop::Registry.global.find_by_cop_name(offense.cop_name)
399
+ default_cfg = default_config(offense.cop_name)
400
+
401
+ offense.correctable? &&
402
+ cop_class&.support_autocorrect? && mark_as_safe_by_config?(default_cfg)
403
+ end
404
+
405
+ def mark_as_safe_by_config?(config)
406
+ config.nil? || (config.fetch('Safe', true) && config.fetch('SafeAutoCorrect', true))
407
+ end
408
+
409
+ def default_config(cop_name)
410
+ RuboCop::ConfigLoader.default_configuration[cop_name]
411
+ end
412
+
383
413
  def minimum_severity_to_fail
384
414
  @minimum_severity_to_fail ||= begin
385
415
  # Unless given explicitly as `fail_level`, `:info` severity offenses do not fail
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+
5
+ #
6
+ # This code is based on https://github.com/fohte/rubocop-daemon.
7
+ #
8
+ # Copyright (c) 2018 Hayato Kawai
9
+ #
10
+ # The MIT License (MIT)
11
+ #
12
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
13
+ #
14
+ module RuboCop
15
+ module Server
16
+ # Caches the states of server process.
17
+ # @api private
18
+ class Cache
19
+ GEMFILE_NAMES = %w[Gemfile gems.rb].freeze
20
+
21
+ class << self
22
+ # Searches for Gemfile or gems.rb in the current dir or any parent dirs
23
+ def project_dir
24
+ current_dir = Dir.pwd
25
+ while current_dir != '/'
26
+ return current_dir if GEMFILE_NAMES.any? do |gemfile|
27
+ File.exist?(File.join(current_dir, gemfile))
28
+ end
29
+
30
+ current_dir = File.expand_path('..', current_dir)
31
+ end
32
+ # If we can't find a Gemfile, just use the current directory
33
+ Dir.pwd
34
+ end
35
+
36
+ def project_dir_cache_key
37
+ @project_dir_cache_key ||= project_dir[1..].tr('/', '+')
38
+ end
39
+
40
+ def dir
41
+ cache_path = File.expand_path('~/.cache/rubocop_cache/server')
42
+ Pathname.new(File.join(cache_path, project_dir_cache_key)).tap do |d|
43
+ d.mkpath unless d.exist?
44
+ end
45
+ end
46
+
47
+ def port_path
48
+ dir.join('port')
49
+ end
50
+
51
+ def token_path
52
+ dir.join('token')
53
+ end
54
+
55
+ def pid_path
56
+ dir.join('pid')
57
+ end
58
+
59
+ def lock_path
60
+ dir.join('lock')
61
+ end
62
+
63
+ def status_path
64
+ dir.join('status')
65
+ end
66
+
67
+ def version_path
68
+ dir.join('version')
69
+ end
70
+
71
+ def pid_running?
72
+ Process.kill(0, pid_path.read.to_i) == 1
73
+ rescue Errno::ESRCH
74
+ false
75
+ end
76
+
77
+ def acquire_lock
78
+ lock_file = File.open(lock_path, File::CREAT)
79
+ # flock returns 0 if successful, and false if not.
80
+ flock_result = lock_file.flock(File::LOCK_EX | File::LOCK_NB)
81
+ yield flock_result != false
82
+ ensure
83
+ lock_file.flock(File::LOCK_UN)
84
+ lock_file.close
85
+ end
86
+
87
+ def write_port_and_token_files(port:, token:)
88
+ port_path.write(port)
89
+ token_path.write(token)
90
+ end
91
+
92
+ def write_pid_file
93
+ pid_path.write(Process.pid)
94
+ yield
95
+ ensure
96
+ dir.rmtree
97
+ end
98
+
99
+ def write_status_file(status)
100
+ status_path.write(status)
101
+ end
102
+
103
+ def write_version_file(version)
104
+ version_path.write(version)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'optparse'
4
+ require 'rainbow'
5
+
6
+ #
7
+ # This code is based on https://github.com/fohte/rubocop-daemon.
8
+ #
9
+ # Copyright (c) 2018 Hayato Kawai
10
+ #
11
+ # The MIT License (MIT)
12
+ #
13
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
14
+ #
15
+ module RuboCop
16
+ module Server
17
+ # The CLI is a class responsible of handling server command line interface logic.
18
+ # @api private
19
+ class CLI
20
+ # Same exit status value as `RuboCop::CLI`.
21
+ STATUS_SUCCESS = 0
22
+ STATUS_ERROR = 2
23
+
24
+ SERVER_OPTIONS = %w[
25
+ --server --no-server --server-status --restart-server --start-server --stop-server
26
+ ].freeze
27
+ EXCLUSIVE_OPTIONS = (SERVER_OPTIONS - %w[--server --no-server]).freeze
28
+
29
+ def initialize
30
+ @exit = false
31
+ end
32
+
33
+ def run(argv = ARGV)
34
+ unless Server.support_server?
35
+ return error('RuboCop server is not supported by this Ruby.') if use_server_option?(argv)
36
+
37
+ return STATUS_SUCCESS
38
+ end
39
+
40
+ deleted_server_arguments = delete_server_argument_from(argv)
41
+
42
+ if deleted_server_arguments.size >= 2
43
+ return error("#{deleted_server_arguments.join(', ')} cannot be specified together.")
44
+ end
45
+
46
+ server_command = deleted_server_arguments.first
47
+
48
+ if EXCLUSIVE_OPTIONS.include?(server_command) && argv.count >= 2
49
+ return error("#{server_command} cannot be combined with other options.")
50
+ end
51
+
52
+ run_command(server_command)
53
+
54
+ STATUS_SUCCESS
55
+ end
56
+
57
+ def exit?
58
+ @exit
59
+ end
60
+
61
+ private
62
+
63
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength:
64
+ def run_command(server_command)
65
+ case server_command
66
+ when '--server'
67
+ Server::ClientCommand::Start.new.run unless Server.running?
68
+ when '--no-server'
69
+ Server::ClientCommand::Stop.new.run if Server.running?
70
+ when '--restart-server'
71
+ @exit = true
72
+ Server::ClientCommand::Restart.new.run
73
+ when '--start-server'
74
+ @exit = true
75
+ Server::ClientCommand::Start.new.run
76
+ when '--stop-server'
77
+ @exit = true
78
+ Server::ClientCommand::Stop.new.run
79
+ when '--server-status'
80
+ @exit = true
81
+ Server::ClientCommand::Status.new.run
82
+ end
83
+ end
84
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength:
85
+
86
+ def delete_server_argument_from(all_arguments)
87
+ SERVER_OPTIONS.each_with_object([]) do |server_option, server_arguments|
88
+ server_arguments << all_arguments.delete(server_option)
89
+ end.compact
90
+ end
91
+
92
+ def use_server_option?(argv)
93
+ (argv & SERVER_OPTIONS).any?
94
+ end
95
+
96
+ def error(message)
97
+ @exit = true
98
+ warn Rainbow(message).red
99
+
100
+ STATUS_ERROR
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'shellwords'
4
+ require 'socket'
5
+
6
+ #
7
+ # This code is based on https://github.com/fohte/rubocop-daemon.
8
+ #
9
+ # Copyright (c) 2018 Hayato Kawai
10
+ #
11
+ # The MIT License (MIT)
12
+ #
13
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
14
+ #
15
+ module RuboCop
16
+ module Server
17
+ module ClientCommand
18
+ # Abstract base class for server client command.
19
+ # @api private
20
+ class Base
21
+ def run
22
+ raise NotImplementedError
23
+ end
24
+
25
+ private
26
+
27
+ def send_request(command:, args: [], body: '')
28
+ TCPSocket.open('127.0.0.1', Cache.port_path.read) do |socket|
29
+ socket.puts [Cache.token_path.read, Dir.pwd, command, *args].shelljoin
30
+ socket.write body
31
+ socket.close_write
32
+ $stdout.write socket.readpartial(4096) until socket.eof?
33
+ end
34
+ end
35
+
36
+ def check_running_server
37
+ Server.running?.tap do |running|
38
+ warn 'RuboCop server is not running.' unless running
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This code is based on https://github.com/fohte/rubocop-daemon.
5
+ #
6
+ # Copyright (c) 2018 Hayato Kawai
7
+ #
8
+ # The MIT License (MIT)
9
+ #
10
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
11
+ #
12
+ module RuboCop
13
+ module Server
14
+ module ClientCommand
15
+ # This class is a client command to execute server process.
16
+ # @api private
17
+ class Exec < Base
18
+ def run
19
+ ensure_server!
20
+ Cache.status_path.delete if Cache.status_path.file?
21
+ send_request(
22
+ command: 'exec',
23
+ args: ARGV.dup,
24
+ body: $stdin.tty? ? '' : $stdin.read
25
+ )
26
+ status
27
+ end
28
+
29
+ private
30
+
31
+ def ensure_server!
32
+ if incompatible_version?
33
+ puts 'RuboCop version incompatibility found, RuboCop server restarting...'
34
+ ClientCommand::Stop.new.run
35
+ elsif check_running_server
36
+ return
37
+ end
38
+
39
+ ClientCommand::Start.new.run
40
+ end
41
+
42
+ def incompatible_version?
43
+ RuboCop::Version::STRING != Cache.version_path.read
44
+ end
45
+
46
+ def status
47
+ unless Cache.status_path.file?
48
+ raise "RuboCop server: Could not find status file at: #{Cache.status_path}"
49
+ end
50
+
51
+ status = Cache.status_path.read
52
+ raise "RuboCop server: '#{status}' is not a valid status!" if (status =~ /^\d+$/).nil?
53
+
54
+ status.to_i
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This code is based on https://github.com/fohte/rubocop-daemon.
5
+ #
6
+ # Copyright (c) 2018 Hayato Kawai
7
+ #
8
+ # The MIT License (MIT)
9
+ #
10
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
11
+ #
12
+ module RuboCop
13
+ module Server
14
+ module ClientCommand
15
+ # This class is a client command to restart server process.
16
+ # @api private
17
+ class Restart < Base
18
+ def run
19
+ ClientCommand::Stop.new.run
20
+ ClientCommand::Start.new.run
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This code is based on https://github.com/fohte/rubocop-daemon.
5
+ #
6
+ # Copyright (c) 2018 Hayato Kawai
7
+ #
8
+ # The MIT License (MIT)
9
+ #
10
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
11
+ #
12
+ module RuboCop
13
+ module Server
14
+ module ClientCommand
15
+ # This class is a client command to start server process.
16
+ # @api private
17
+ class Start < Base
18
+ def run
19
+ if Server.running?
20
+ warn "RuboCop server (#{Cache.pid_path.read}) is already running."
21
+ return
22
+ end
23
+
24
+ Cache.acquire_lock do |locked|
25
+ unless locked
26
+ # Another process is already starting server,
27
+ # so wait for it to be ready.
28
+ Server.wait_for_running_status!(true)
29
+ exit 0
30
+ end
31
+
32
+ Cache.write_version_file(RuboCop::Version::STRING)
33
+
34
+ host = ENV.fetch('RUBOCOP_SERVER_HOST', '127.0.0.1')
35
+ port = ENV.fetch('RUBOCOP_SERVER_PORT', 0)
36
+
37
+ Server::Core.new.start(host, port)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This code is based on https://github.com/fohte/rubocop-daemon.
5
+ #
6
+ # Copyright (c) 2018 Hayato Kawai
7
+ #
8
+ # The MIT License (MIT)
9
+ #
10
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
11
+ #
12
+ module RuboCop
13
+ module Server
14
+ module ClientCommand
15
+ # This class is a client command to show server process status.
16
+ # @api private
17
+ class Status < Base
18
+ def run
19
+ if Server.running?
20
+ puts "RuboCop server (#{Cache.pid_path.read}) is running."
21
+ else
22
+ puts 'RuboCop server is not running.'
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This code is based on https://github.com/fohte/rubocop-daemon.
5
+ #
6
+ # Copyright (c) 2018 Hayato Kawai
7
+ #
8
+ # The MIT License (MIT)
9
+ #
10
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
11
+ #
12
+ module RuboCop
13
+ module Server
14
+ module ClientCommand
15
+ # This class is a client command to stop server process.
16
+ # @api private
17
+ class Stop < Base
18
+ def run
19
+ return unless check_running_server
20
+
21
+ pid = fork do
22
+ send_request(command: 'stop')
23
+ Server.wait_for_running_status!(false)
24
+ end
25
+
26
+ Process.waitpid(pid)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This code is based on https://github.com/fohte/rubocop-daemon.
5
+ #
6
+ # Copyright (c) 2018 Hayato Kawai
7
+ #
8
+ # The MIT License (MIT)
9
+ #
10
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
11
+ #
12
+ module RuboCop
13
+ autoload :Version, 'rubocop/version'
14
+
15
+ module Server
16
+ # @api private
17
+ module ClientCommand
18
+ autoload :Base, 'rubocop/server/client_command/base'
19
+ autoload :Exec, 'rubocop/server/client_command/exec'
20
+ autoload :Restart, 'rubocop/server/client_command/restart'
21
+ autoload :Start, 'rubocop/server/client_command/start'
22
+ autoload :Status, 'rubocop/server/client_command/status'
23
+ autoload :Stop, 'rubocop/server/client_command/stop'
24
+ end
25
+ end
26
+ end