rubocop 1.42.0 → 1.64.1

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 (498) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +7 -6
  4. data/assets/output.css.erb +159 -0
  5. data/assets/output.html.erb +1 -160
  6. data/config/default.yml +342 -64
  7. data/config/obsoletion.yml +5 -0
  8. data/lib/rubocop/cached_data.rb +11 -3
  9. data/lib/rubocop/cli/command/auto_generate_config.rb +27 -6
  10. data/lib/rubocop/cli/command/execute_runner.rb +7 -2
  11. data/lib/rubocop/cli/command/lsp.rb +19 -0
  12. data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
  13. data/lib/rubocop/cli.rb +68 -10
  14. data/lib/rubocop/comment_config.rb +19 -0
  15. data/lib/rubocop/config.rb +43 -15
  16. data/lib/rubocop/config_finder.rb +14 -4
  17. data/lib/rubocop/config_loader.rb +20 -24
  18. data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
  19. data/lib/rubocop/config_obsoletion.rb +13 -10
  20. data/lib/rubocop/config_validator.rb +14 -7
  21. data/lib/rubocop/cop/autocorrect_logic.rb +37 -14
  22. data/lib/rubocop/cop/base.rb +97 -28
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -0
  24. data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
  25. data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
  26. data/lib/rubocop/cop/bundler/gem_version.rb +5 -7
  27. data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
  28. data/lib/rubocop/cop/commissioner.rb +8 -2
  29. data/lib/rubocop/cop/cop.rb +25 -5
  30. data/lib/rubocop/cop/corrector.rb +11 -3
  31. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -3
  32. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
  33. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +6 -14
  34. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
  35. data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
  36. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  37. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +2 -7
  38. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
  39. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  40. data/lib/rubocop/cop/documentation.rb +16 -6
  41. data/lib/rubocop/cop/exclude_limit.rb +1 -1
  42. data/lib/rubocop/cop/force.rb +12 -0
  43. data/lib/rubocop/cop/gemspec/dependency_version.rb +6 -8
  44. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -3
  45. data/lib/rubocop/cop/gemspec/development_dependencies.rb +107 -0
  46. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -1
  47. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -1
  48. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  49. data/lib/rubocop/cop/internal_affairs/cop_description.rb +37 -13
  50. data/lib/rubocop/cop/internal_affairs/example_description.rb +46 -24
  51. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +3 -3
  52. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
  53. data/lib/rubocop/cop/internal_affairs/location_expression.rb +37 -0
  54. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -1
  55. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
  56. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
  57. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +53 -0
  58. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +128 -34
  59. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  60. data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
  61. data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
  62. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +11 -3
  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/redundant_method_dispatch_node.rb +11 -2
  66. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +66 -0
  67. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
  68. data/lib/rubocop/cop/internal_affairs.rb +5 -0
  69. data/lib/rubocop/cop/layout/argument_alignment.rb +1 -1
  70. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  71. data/lib/rubocop/cop/layout/block_end_newline.rb +7 -15
  72. data/lib/rubocop/cop/layout/class_structure.rb +15 -19
  73. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +2 -3
  74. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +2 -6
  75. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  76. data/lib/rubocop/cop/layout/dot_position.rb +1 -5
  77. data/lib/rubocop/cop/layout/empty_comment.rb +6 -4
  78. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +42 -9
  79. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
  80. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +28 -5
  81. data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
  82. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -0
  83. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -0
  84. data/lib/rubocop/cop/layout/end_alignment.rb +23 -3
  85. data/lib/rubocop/cop/layout/extra_spacing.rb +3 -4
  86. data/lib/rubocop/cop/layout/first_argument_indentation.rb +8 -3
  87. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +24 -7
  88. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +25 -34
  89. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +7 -19
  90. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +42 -52
  91. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +38 -55
  92. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
  93. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +12 -6
  94. data/lib/rubocop/cop/layout/heredoc_indentation.rb +12 -12
  95. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  96. data/lib/rubocop/cop/layout/indentation_width.rb +3 -3
  97. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
  98. data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
  99. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +18 -12
  100. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +12 -8
  101. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
  102. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +8 -27
  103. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +7 -26
  104. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +4 -21
  105. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -3
  106. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +6 -30
  107. data/lib/rubocop/cop/layout/redundant_line_break.rb +33 -11
  108. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +6 -6
  109. data/lib/rubocop/cop/layout/single_line_block_chain.rb +5 -0
  110. data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
  111. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  112. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
  113. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -2
  114. data/lib/rubocop/cop/layout/space_around_operators.rb +53 -21
  115. data/lib/rubocop/cop/layout/space_before_block_braces.rb +19 -10
  116. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  117. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
  118. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +11 -13
  119. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +3 -1
  120. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -1
  121. data/lib/rubocop/cop/layout/space_inside_parens.rb +3 -3
  122. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  123. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  124. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +4 -4
  125. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +6 -6
  126. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
  127. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  128. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
  129. data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -0
  130. data/lib/rubocop/cop/lint/assignment_in_condition.rb +6 -6
  131. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -2
  132. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
  133. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  134. data/lib/rubocop/cop/lint/debugger.rb +49 -26
  135. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +62 -112
  136. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
  137. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -1
  138. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
  139. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
  140. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +47 -22
  141. data/lib/rubocop/cop/lint/else_layout.rb +3 -7
  142. data/lib/rubocop/cop/lint/empty_block.rb +2 -2
  143. data/lib/rubocop/cop/lint/empty_conditional_body.rb +6 -4
  144. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  145. data/lib/rubocop/cop/lint/erb_new_arguments.rb +27 -21
  146. data/lib/rubocop/cop/lint/float_comparison.rb +10 -0
  147. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +14 -7
  148. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
  149. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +16 -18
  150. data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
  151. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  152. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
  153. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  154. data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
  155. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +56 -0
  156. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  157. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
  158. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +47 -5
  159. data/lib/rubocop/cop/lint/missing_super.rb +63 -5
  160. data/lib/rubocop/cop/lint/mixed_case_range.rb +116 -0
  161. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
  162. data/lib/rubocop/cop/lint/nested_method_definition.rb +4 -9
  163. data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -21
  164. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
  165. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -5
  166. data/lib/rubocop/cop/lint/number_conversion.rb +14 -4
  167. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
  168. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -0
  169. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
  170. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +8 -12
  171. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
  172. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  173. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +11 -5
  174. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +5 -5
  175. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
  176. data/lib/rubocop/cop/lint/redundant_require_statement.rb +21 -2
  177. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +72 -8
  178. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  179. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
  180. data/lib/rubocop/cop/lint/redundant_with_index.rb +7 -3
  181. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -3
  182. data/lib/rubocop/cop/lint/refinement_import_methods.rb +2 -1
  183. data/lib/rubocop/cop/lint/rescue_type.rb +2 -4
  184. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +14 -8
  185. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
  186. data/lib/rubocop/cop/lint/script_permission.rb +3 -3
  187. data/lib/rubocop/cop/lint/self_assignment.rb +38 -0
  188. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
  189. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
  190. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -12
  191. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -1
  192. data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
  193. data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
  194. data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
  195. data/lib/rubocop/cop/lint/syntax.rb +10 -3
  196. data/lib/rubocop/cop/lint/to_enum_arguments.rb +23 -6
  197. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
  198. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
  199. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -2
  200. data/lib/rubocop/cop/lint/unreachable_code.rb +4 -2
  201. data/lib/rubocop/cop/lint/unreachable_loop.rb +11 -5
  202. data/lib/rubocop/cop/lint/useless_access_modifier.rb +12 -9
  203. data/lib/rubocop/cop/lint/useless_assignment.rb +94 -10
  204. data/lib/rubocop/cop/lint/useless_method_definition.rb +12 -4
  205. data/lib/rubocop/cop/lint/useless_rescue.rb +89 -0
  206. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +9 -1
  207. data/lib/rubocop/cop/lint/useless_times.rb +3 -3
  208. data/lib/rubocop/cop/lint/void.rb +119 -20
  209. data/lib/rubocop/cop/metrics/abc_size.rb +3 -3
  210. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  211. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  212. data/lib/rubocop/cop/metrics/class_length.rb +8 -2
  213. data/lib/rubocop/cop/metrics/collection_literal_length.rb +76 -0
  214. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  215. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  216. data/lib/rubocop/cop/metrics/parameter_lists.rb +27 -0
  217. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +3 -7
  218. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +38 -10
  219. data/lib/rubocop/cop/migration/department_name.rb +3 -3
  220. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  221. data/lib/rubocop/cop/mixin/allowed_methods.rb +3 -1
  222. data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
  223. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
  224. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  225. data/lib/rubocop/cop/mixin/code_length.rb +12 -1
  226. data/lib/rubocop/cop/mixin/comments_help.rb +21 -11
  227. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
  228. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  229. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  230. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  231. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +1 -1
  232. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +78 -29
  233. data/lib/rubocop/cop/mixin/hash_transform_method.rb +3 -3
  234. data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
  235. data/lib/rubocop/cop/mixin/line_length_help.rb +3 -1
  236. data/lib/rubocop/cop/mixin/method_complexity.rb +15 -6
  237. data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
  238. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +0 -3
  239. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -3
  240. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  241. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  242. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -8
  243. data/lib/rubocop/cop/mixin/range_help.rb +1 -6
  244. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
  245. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
  246. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  247. data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -3
  248. data/lib/rubocop/cop/mixin/string_help.rb +4 -2
  249. data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
  250. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
  251. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
  252. data/lib/rubocop/cop/naming/block_forwarding.rb +38 -7
  253. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  254. data/lib/rubocop/cop/naming/constant_name.rb +2 -3
  255. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  256. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
  257. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
  258. data/lib/rubocop/cop/naming/inclusive_language.rb +24 -6
  259. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +26 -11
  260. data/lib/rubocop/cop/naming/method_name.rb +3 -3
  261. data/lib/rubocop/cop/naming/predicate_name.rb +3 -3
  262. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -4
  263. data/lib/rubocop/cop/naming/variable_name.rb +6 -1
  264. data/lib/rubocop/cop/registry.rb +16 -9
  265. data/lib/rubocop/cop/security/compound_hash.rb +2 -2
  266. data/lib/rubocop/cop/security/open.rb +2 -2
  267. data/lib/rubocop/cop/style/access_modifier_declarations.rb +78 -13
  268. data/lib/rubocop/cop/style/accessor_grouping.rb +44 -18
  269. data/lib/rubocop/cop/style/alias.rb +10 -8
  270. data/lib/rubocop/cop/style/arguments_forwarding.rb +414 -62
  271. data/lib/rubocop/cop/style/array_first_last.rb +64 -0
  272. data/lib/rubocop/cop/style/array_intersect.rb +14 -6
  273. data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
  274. data/lib/rubocop/cop/style/attr.rb +11 -1
  275. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
  276. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  277. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +3 -3
  278. data/lib/rubocop/cop/style/block_comments.rb +2 -2
  279. data/lib/rubocop/cop/style/block_delimiters.rb +22 -6
  280. data/lib/rubocop/cop/style/case_like_if.rb +25 -8
  281. data/lib/rubocop/cop/style/class_and_module_children.rb +5 -12
  282. data/lib/rubocop/cop/style/class_check.rb +1 -0
  283. data/lib/rubocop/cop/style/class_equality_comparison.rb +58 -40
  284. data/lib/rubocop/cop/style/class_vars.rb +3 -3
  285. data/lib/rubocop/cop/style/collection_compact.rb +37 -14
  286. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  287. data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
  288. data/lib/rubocop/cop/style/combinable_loops.rb +36 -8
  289. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  290. data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
  291. data/lib/rubocop/cop/style/commented_keyword.rb +7 -4
  292. data/lib/rubocop/cop/style/comparable_clamp.rb +125 -0
  293. data/lib/rubocop/cop/style/concat_array_literals.rb +12 -3
  294. data/lib/rubocop/cop/style/conditional_assignment.rb +15 -20
  295. data/lib/rubocop/cop/style/copyright.rb +37 -24
  296. data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
  297. data/lib/rubocop/cop/style/date_time.rb +5 -4
  298. data/lib/rubocop/cop/style/dir.rb +1 -1
  299. data/lib/rubocop/cop/style/dir_empty.rb +54 -0
  300. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  301. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +3 -3
  302. data/lib/rubocop/cop/style/documentation.rb +36 -30
  303. data/lib/rubocop/cop/style/documentation_method.rb +30 -4
  304. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  305. data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
  306. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  307. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  308. data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
  309. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  310. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  311. data/lib/rubocop/cop/style/eval_with_location.rb +14 -23
  312. data/lib/rubocop/cop/style/exact_regexp_match.rb +70 -0
  313. data/lib/rubocop/cop/style/explicit_block_argument.rb +3 -3
  314. data/lib/rubocop/cop/style/file_empty.rb +71 -0
  315. data/lib/rubocop/cop/style/file_read.rb +3 -3
  316. data/lib/rubocop/cop/style/file_write.rb +1 -1
  317. data/lib/rubocop/cop/style/for.rb +3 -1
  318. data/lib/rubocop/cop/style/format_string.rb +33 -12
  319. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -2
  320. data/lib/rubocop/cop/style/guard_clause.rb +29 -1
  321. data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
  322. data/lib/rubocop/cop/style/hash_each_methods.rb +106 -21
  323. data/lib/rubocop/cop/style/hash_except.rb +25 -13
  324. data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
  325. data/lib/rubocop/cop/style/hash_syntax.rb +29 -3
  326. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  327. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  328. data/lib/rubocop/cop/style/identical_conditional_branches.rb +34 -5
  329. data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
  330. data/lib/rubocop/cop/style/if_unless_modifier.rb +111 -15
  331. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +7 -3
  332. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  333. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  334. data/lib/rubocop/cop/style/inverse_methods.rb +14 -13
  335. data/lib/rubocop/cop/style/invertible_unless_condition.rb +160 -0
  336. data/lib/rubocop/cop/style/lambda.rb +3 -3
  337. data/lib/rubocop/cop/style/lambda_call.rb +5 -0
  338. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +8 -10
  339. data/lib/rubocop/cop/style/map_into_array.rb +175 -0
  340. data/lib/rubocop/cop/style/map_to_hash.rb +20 -7
  341. data/lib/rubocop/cop/style/map_to_set.rb +5 -2
  342. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +48 -28
  343. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +46 -41
  344. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +22 -0
  345. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  346. data/lib/rubocop/cop/style/min_max.rb +3 -3
  347. data/lib/rubocop/cop/style/min_max_comparison.rb +11 -1
  348. data/lib/rubocop/cop/style/missing_else.rb +13 -1
  349. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +2 -2
  350. data/lib/rubocop/cop/style/mixin_grouping.rb +5 -5
  351. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  352. data/lib/rubocop/cop/style/multiline_if_modifier.rb +0 -4
  353. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  354. data/lib/rubocop/cop/style/multiline_method_signature.rb +17 -5
  355. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -4
  356. data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
  357. data/lib/rubocop/cop/style/negated_if_else_condition.rb +13 -12
  358. data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
  359. data/lib/rubocop/cop/style/next.rb +1 -1
  360. data/lib/rubocop/cop/style/nil_comparison.rb +2 -0
  361. data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
  362. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
  363. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  364. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  365. data/lib/rubocop/cop/style/numeric_predicate.rb +10 -2
  366. data/lib/rubocop/cop/style/object_then.rb +5 -3
  367. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -7
  368. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  369. data/lib/rubocop/cop/style/operator_method_call.rb +24 -4
  370. data/lib/rubocop/cop/style/parallel_assignment.rb +32 -24
  371. data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
  372. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
  373. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  374. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  375. data/lib/rubocop/cop/style/raise_args.rb +4 -1
  376. data/lib/rubocop/cop/style/redundant_argument.rb +33 -4
  377. data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
  378. data/lib/rubocop/cop/style/redundant_assignment.rb +10 -2
  379. data/lib/rubocop/cop/style/redundant_begin.rb +10 -2
  380. data/lib/rubocop/cop/style/redundant_condition.rb +18 -3
  381. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -14
  382. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +39 -0
  383. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +103 -9
  384. data/lib/rubocop/cop/style/redundant_each.rb +7 -4
  385. data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
  386. data/lib/rubocop/cop/style/redundant_fetch_block.rb +9 -7
  387. data/lib/rubocop/cop/style/redundant_filter_chain.rb +118 -0
  388. data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
  389. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  390. data/lib/rubocop/cop/style/redundant_line_continuation.rb +200 -0
  391. data/lib/rubocop/cop/style/redundant_parentheses.rb +73 -24
  392. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  393. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +100 -0
  394. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +7 -8
  395. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
  396. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +13 -4
  397. data/lib/rubocop/cop/style/redundant_return.rb +14 -3
  398. data/lib/rubocop/cop/style/redundant_self.rb +17 -2
  399. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +8 -1
  400. data/lib/rubocop/cop/style/redundant_sort.rb +13 -12
  401. data/lib/rubocop/cop/style/redundant_sort_by.rb +2 -2
  402. data/lib/rubocop/cop/style/redundant_string_escape.rb +6 -5
  403. data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
  404. data/lib/rubocop/cop/style/require_order.rb +12 -15
  405. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
  406. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  407. data/lib/rubocop/cop/style/return_nil.rb +6 -2
  408. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +95 -0
  409. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  410. data/lib/rubocop/cop/style/sample.rb +3 -4
  411. data/lib/rubocop/cop/style/select_by_regexp.rb +22 -11
  412. data/lib/rubocop/cop/style/self_assignment.rb +3 -3
  413. data/lib/rubocop/cop/style/semicolon.rb +43 -5
  414. data/lib/rubocop/cop/style/send.rb +4 -4
  415. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +90 -0
  416. data/lib/rubocop/cop/style/signal_exception.rb +1 -1
  417. data/lib/rubocop/cop/style/single_argument_dig.rb +7 -3
  418. data/lib/rubocop/cop/style/single_line_do_end_block.rb +67 -0
  419. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  420. data/lib/rubocop/cop/style/slicing_with_range.rb +77 -11
  421. data/lib/rubocop/cop/style/sole_nested_conditional.rb +9 -5
  422. data/lib/rubocop/cop/style/special_global_vars.rb +4 -6
  423. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  424. data/lib/rubocop/cop/style/string_chars.rb +1 -0
  425. data/lib/rubocop/cop/style/string_hash_keys.rb +4 -1
  426. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
  427. data/lib/rubocop/cop/style/strip.rb +7 -4
  428. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  429. data/lib/rubocop/cop/style/super_arguments.rb +156 -0
  430. data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
  431. data/lib/rubocop/cop/style/symbol_array.rb +35 -15
  432. data/lib/rubocop/cop/style/symbol_proc.rb +68 -5
  433. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  434. data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
  435. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
  436. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  437. data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
  438. data/lib/rubocop/cop/style/unpack_first.rb +11 -14
  439. data/lib/rubocop/cop/style/word_array.rb +18 -6
  440. data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
  441. data/lib/rubocop/cop/style/yoda_condition.rb +17 -8
  442. data/lib/rubocop/cop/style/yoda_expression.rb +26 -9
  443. data/lib/rubocop/cop/style/zero_length_predicate.rb +9 -5
  444. data/lib/rubocop/cop/team.rb +36 -23
  445. data/lib/rubocop/cop/util.rb +14 -5
  446. data/lib/rubocop/cop/utils/regexp_ranges.rb +113 -0
  447. data/lib/rubocop/cop/variable_force/assignment.rb +45 -4
  448. data/lib/rubocop/cop/variable_force/scope.rb +3 -3
  449. data/lib/rubocop/cop/variable_force/variable.rb +5 -3
  450. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -3
  451. data/lib/rubocop/cop/variable_force.rb +2 -1
  452. data/lib/rubocop/cops_documentation_generator.rb +26 -7
  453. data/lib/rubocop/directive_comment.rb +13 -11
  454. data/lib/rubocop/ext/comment.rb +18 -0
  455. data/lib/rubocop/ext/regexp_node.rb +10 -5
  456. data/lib/rubocop/ext/regexp_parser.rb +5 -2
  457. data/lib/rubocop/file_finder.rb +4 -7
  458. data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
  459. data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -8
  460. data/lib/rubocop/formatter/formatter_set.rb +7 -1
  461. data/lib/rubocop/formatter/html_formatter.rb +35 -14
  462. data/lib/rubocop/formatter/json_formatter.rb +0 -1
  463. data/lib/rubocop/formatter/junit_formatter.rb +4 -1
  464. data/lib/rubocop/formatter/offense_count_formatter.rb +12 -2
  465. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  466. data/lib/rubocop/formatter/tap_formatter.rb +3 -7
  467. data/lib/rubocop/formatter.rb +1 -2
  468. data/lib/rubocop/lockfile.rb +56 -7
  469. data/lib/rubocop/lsp/logger.rb +22 -0
  470. data/lib/rubocop/lsp/routes.rb +243 -0
  471. data/lib/rubocop/lsp/runtime.rb +99 -0
  472. data/lib/rubocop/lsp/server.rb +73 -0
  473. data/lib/rubocop/lsp/severity.rb +27 -0
  474. data/lib/rubocop/lsp.rb +36 -0
  475. data/lib/rubocop/magic_comment.rb +13 -11
  476. data/lib/rubocop/options.rb +49 -12
  477. data/lib/rubocop/path_util.rb +17 -8
  478. data/lib/rubocop/rake_task.rb +1 -1
  479. data/lib/rubocop/result_cache.rb +6 -3
  480. data/lib/rubocop/rspec/cop_helper.rb +9 -3
  481. data/lib/rubocop/rspec/expect_offense.rb +18 -8
  482. data/lib/rubocop/rspec/shared_contexts.rb +59 -19
  483. data/lib/rubocop/rspec/support.rb +3 -0
  484. data/lib/rubocop/runner.rb +59 -10
  485. data/lib/rubocop/server/cache.rb +11 -4
  486. data/lib/rubocop/server/cli.rb +37 -18
  487. data/lib/rubocop/server/client_command/exec.rb +4 -4
  488. data/lib/rubocop/server/client_command/start.rb +6 -1
  489. data/lib/rubocop/server/core.rb +24 -9
  490. data/lib/rubocop/server/helper.rb +1 -1
  491. data/lib/rubocop/server/server_command/exec.rb +1 -2
  492. data/lib/rubocop/string_interpreter.rb +3 -3
  493. data/lib/rubocop/target_finder.rb +91 -81
  494. data/lib/rubocop/target_ruby.rb +85 -78
  495. data/lib/rubocop/version.rb +27 -8
  496. data/lib/rubocop.rb +35 -0
  497. metadata +76 -35
  498. /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -57,18 +57,24 @@ module RuboCop
57
57
  File.expand_path(File.join(cache_root_dir, 'server'))
58
58
  end
59
59
 
60
+ # rubocop:disable Metrics/MethodLength
60
61
  def cache_root_dir_from_config
61
62
  CacheConfig.root_dir do
62
63
  # `RuboCop::ConfigStore` has heavy dependencies, this is a lightweight implementation
63
64
  # so that only the necessary `CacheRootDirectory` can be obtained.
64
- require 'yaml'
65
65
  config_path = ConfigFinder.find_config_path(Dir.pwd)
66
+ file_contents = File.read(config_path)
67
+
68
+ # Returns early if `CacheRootDirectory` is not used before requiring `erb` or `yaml`.
69
+ next unless file_contents.include?('CacheRootDirectory')
66
70
 
67
71
  require 'erb'
68
- file_contents = File.read(config_path)
69
72
  yaml_code = ERB.new(file_contents).result
70
73
 
71
- config_yaml = YAML.safe_load(yaml_code, permitted_classes: [Regexp, Symbol])
74
+ require 'yaml'
75
+ config_yaml = YAML.safe_load(
76
+ yaml_code, permitted_classes: [Regexp, Symbol], aliases: true
77
+ )
72
78
 
73
79
  # For compatibility with Ruby 3.0 or lower.
74
80
  if Gem::Version.new(Psych::VERSION) < Gem::Version.new('4.0.0')
@@ -78,6 +84,7 @@ module RuboCop
78
84
  config_yaml&.dig('AllCops', 'CacheRootDirectory')
79
85
  end
80
86
  end
87
+ # rubocop:enable Metrics/MethodLength
81
88
 
82
89
  def port_path
83
90
  dir.join('port')
@@ -109,7 +116,7 @@ module RuboCop
109
116
 
110
117
  def pid_running?
111
118
  Process.kill(0, pid_path.read.to_i) == 1
112
- rescue Errno::ESRCH, Errno::ENOENT
119
+ rescue Errno::ESRCH, Errno::ENOENT, Errno::EACCES, Errno::EROFS
113
120
  false
114
121
  end
115
122
 
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rainbow'
4
3
  require_relative '../arguments_env'
5
4
  require_relative '../arguments_file'
6
5
 
@@ -23,15 +22,21 @@ module RuboCop
23
22
  STATUS_ERROR = 2
24
23
 
25
24
  SERVER_OPTIONS = %w[
26
- --server --no-server --server-status --restart-server --start-server --stop-server
25
+ --server
26
+ --no-server
27
+ --server-status
28
+ --restart-server
29
+ --start-server
30
+ --stop-server
31
+ --no-detach
27
32
  ].freeze
28
33
  EXCLUSIVE_OPTIONS = (SERVER_OPTIONS - %w[--server --no-server]).freeze
34
+ NO_DETACH_OPTIONS = %w[--server --start-server --restart-server].freeze
29
35
 
30
36
  def initialize
31
37
  @exit = false
32
38
  end
33
39
 
34
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
35
40
  def run(argv = ARGV)
36
41
  unless Server.support_server?
37
42
  return error('RuboCop server is not supported by this Ruby.') if use_server_option?(argv)
@@ -40,16 +45,34 @@ module RuboCop
40
45
  end
41
46
 
42
47
  Cache.cache_root_path = fetch_cache_root_path_from(argv)
43
- deleted_server_arguments = delete_server_argument_from(argv)
44
48
 
45
- if deleted_server_arguments.size >= 2
46
- return error("#{deleted_server_arguments.join(', ')} cannot be specified together.")
49
+ process_arguments(argv)
50
+ end
51
+
52
+ def exit?
53
+ @exit
54
+ end
55
+
56
+ private
57
+
58
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
59
+ def process_arguments(argv)
60
+ server_arguments = delete_server_argument_from(argv)
61
+
62
+ detach = !server_arguments.delete('--no-detach')
63
+
64
+ if server_arguments.size >= 2
65
+ return error("#{server_arguments.join(', ')} cannot be specified together.")
47
66
  end
48
67
 
49
- server_command = deleted_server_arguments.first
68
+ server_command = server_arguments.first
69
+
70
+ unless detach || NO_DETACH_OPTIONS.include?(server_command)
71
+ return error("#{server_command} cannot be combined with --no-detach.")
72
+ end
50
73
 
51
74
  if EXCLUSIVE_OPTIONS.include?(server_command) && argv.count > allowed_option_count
52
- return error("#{server_command} cannot be combined with other options.")
75
+ return error("#{server_command} cannot be combined with #{argv[0]}.")
53
76
  end
54
77
 
55
78
  if server_command.nil?
@@ -57,23 +80,17 @@ module RuboCop
57
80
  ArgumentsFile.read_as_arguments.delete('--server')
58
81
  end
59
82
 
60
- run_command(server_command)
83
+ run_command(server_command, detach: detach)
61
84
 
62
85
  STATUS_SUCCESS
63
86
  end
64
87
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
65
88
 
66
- def exit?
67
- @exit
68
- end
69
-
70
- private
71
-
72
89
  # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength:
73
- def run_command(server_command)
90
+ def run_command(server_command, detach:)
74
91
  case server_command
75
92
  when '--server'
76
- Server::ClientCommand::Start.new.run unless Server.running?
93
+ Server::ClientCommand::Start.new(detach: detach).run unless Server.running?
77
94
  when '--no-server'
78
95
  Server::ClientCommand::Stop.new.run if Server.running?
79
96
  when '--restart-server'
@@ -81,7 +98,7 @@ module RuboCop
81
98
  Server::ClientCommand::Restart.new.run
82
99
  when '--start-server'
83
100
  @exit = true
84
- Server::ClientCommand::Start.new.run
101
+ Server::ClientCommand::Start.new(detach: detach).run
85
102
  when '--stop-server'
86
103
  @exit = true
87
104
  Server::ClientCommand::Stop.new.run
@@ -118,6 +135,8 @@ module RuboCop
118
135
  end
119
136
 
120
137
  def error(message)
138
+ require 'rainbow'
139
+
121
140
  @exit = true
122
141
  warn Rainbow(message).red
123
142
 
@@ -17,11 +17,11 @@ module RuboCop
17
17
  class Exec < Base
18
18
  def run
19
19
  ensure_server!
20
- Cache.status_path.delete if Cache.status_path.file?
20
+ read_stdin = ARGV.include?('-s') || ARGV.include?('--stdin')
21
21
  send_request(
22
22
  command: 'exec',
23
23
  args: ARGV.dup,
24
- body: $stdin.tty? ? '' : $stdin.read
24
+ body: read_stdin ? $stdin.read : ''
25
25
  )
26
26
  warn stderr unless stderr.empty?
27
27
  status
@@ -31,7 +31,7 @@ module RuboCop
31
31
 
32
32
  def ensure_server!
33
33
  if incompatible_version?
34
- puts 'RuboCop version incompatibility found, RuboCop server restarting...'
34
+ warn 'RuboCop version incompatibility found, RuboCop server restarting...'
35
35
  ClientCommand::Stop.new.run
36
36
  elsif check_running_server
37
37
  return
@@ -41,7 +41,7 @@ module RuboCop
41
41
  end
42
42
 
43
43
  def incompatible_version?
44
- RuboCop::Version::STRING != Cache.version_path.read
44
+ Cache.version_path.read != RuboCop::Version::STRING
45
45
  end
46
46
 
47
47
  def stderr
@@ -15,6 +15,11 @@ module RuboCop
15
15
  # This class is a client command to start server process.
16
16
  # @api private
17
17
  class Start < Base
18
+ def initialize(detach: true)
19
+ @detach = detach
20
+ super()
21
+ end
22
+
18
23
  def run
19
24
  if Server.running?
20
25
  warn "RuboCop server (#{Cache.pid_path.read}) is already running."
@@ -34,7 +39,7 @@ module RuboCop
34
39
  host = ENV.fetch('RUBOCOP_SERVER_HOST', '127.0.0.1')
35
40
  port = ENV.fetch('RUBOCOP_SERVER_PORT', 0)
36
41
 
37
- Server::Core.new.start(host, port)
42
+ Server::Core.new.start(host, port, detach: @detach)
38
43
  end
39
44
  end
40
45
  end
@@ -27,31 +27,46 @@ module RuboCop
27
27
  self.class.token
28
28
  end
29
29
 
30
- def start(host, port)
30
+ def start(host, port, detach: true)
31
31
  $PROGRAM_NAME = "rubocop --server #{Cache.project_dir}"
32
32
 
33
- require 'rubocop'
33
+ require_relative '../../rubocop'
34
34
  start_server(host, port)
35
35
 
36
- demonize if server_mode?
36
+ return unless server_mode?
37
+
38
+ detach ? detach_server : run_server
37
39
  end
38
40
 
39
41
  private
40
42
 
41
- def demonize
42
- Cache.write_port_and_token_files(port: @server.addr[1], token: token)
43
+ def detach_server
44
+ write_port_and_token_files
43
45
 
44
46
  pid = fork do
45
47
  Process.daemon(true)
46
48
  $stderr.reopen(Cache.stderr_path, 'w')
47
- Cache.write_pid_file do
48
- read_socket(@server.accept) until @server.closed?
49
- end
49
+ process_input
50
50
  end
51
51
 
52
52
  Process.waitpid(pid)
53
53
  end
54
54
 
55
+ def write_port_and_token_files
56
+ Cache.write_port_and_token_files(port: @server.addr[1], token: token)
57
+ end
58
+
59
+ def process_input
60
+ Cache.write_pid_file do
61
+ read_socket(@server.accept) until @server.closed?
62
+ end
63
+ end
64
+
65
+ def run_server
66
+ write_port_and_token_files
67
+ process_input
68
+ end
69
+
55
70
  def server_mode?
56
71
  true
57
72
  end
@@ -85,7 +100,7 @@ module RuboCop
85
100
 
86
101
  def use_json_format?
87
102
  return true if ARGV.include?('--format=json') || ARGV.include?('--format=j')
88
- return false unless (index = ARGV.index('--format'))
103
+ return false unless (index = ARGV.index('--format') || ARGV.index('-f'))
89
104
 
90
105
  format = ARGV[index + 1]
91
106
 
@@ -11,7 +11,7 @@
11
11
  #
12
12
  module RuboCop
13
13
  module Server
14
- # This module has a helper memthod for `RuboCop::Server::SocketReader`.
14
+ # This module has a helper method for `RuboCop::Server::SocketReader`.
15
15
  # @api private
16
16
  module Helper
17
17
  def self.redirect(stdin: $stdin, stdout: $stdout, stderr: $stderr, &_block)
@@ -16,12 +16,11 @@ module RuboCop
16
16
  # @api private
17
17
  class Exec < Base
18
18
  def run
19
- Cache.status_path.delete if Cache.status_path.file?
20
19
  # RuboCop output is colorized by default where there is a TTY.
21
20
  # We must pass the --color option to preserve this behavior.
22
21
  @args.unshift('--color') unless %w[--color --no-color].any? { |f| @args.include?(f) }
23
22
  status = RuboCop::CLI.new.run(@args)
24
- # This status file is read by `rubocop --server` (`RuboCop::Server::Clientcommand::Exec`).
23
+ # This status file is read by `rubocop --server` (`RuboCop::Server::ClientCommand::Exec`).
25
24
  # so that they use the correct exit code.
26
25
  # Status is 1 when there are any issues, and 0 otherwise.
27
26
  Cache.write_status_file(status)
@@ -32,9 +32,9 @@ module RuboCop
32
32
 
33
33
  def interpret_string_escape(escape)
34
34
  case escape[1]
35
- when 'u' then interpret_unicode(escape)
36
- when 'x' then interpret_hex(escape)
37
- when /\d/ then interpret_octal(escape)
35
+ when 'u' then interpret_unicode(escape)
36
+ when 'x' then interpret_hex(escape)
37
+ when /\d/ then interpret_octal(escape)
38
38
  else
39
39
  escape[1] # literal escaped char, like \\
40
40
  end
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RuboCop
4
- # This class finds target files to inspect by scanning the directory tree
5
- # and picking ruby files.
4
+ # This class finds target files to inspect by scanning the directory tree and picking ruby files.
6
5
  # @api private
7
6
  class TargetFinder
8
7
  HIDDEN_PATH_SUBSTRING = "#{File::SEPARATOR}."
@@ -12,21 +11,8 @@ module RuboCop
12
11
  @options = options
13
12
  end
14
13
 
15
- def force_exclusion?
16
- @options[:force_exclusion]
17
- end
18
-
19
- def debug?
20
- @options[:debug]
21
- end
22
-
23
- def fail_fast?
24
- @options[:fail_fast]
25
- end
26
-
27
- # Generate a list of target files by expanding globbing patterns
28
- # (if any). If args is empty, recursively find all Ruby source
29
- # files under the current directory
14
+ # Generate a list of target files by expanding globbing patterns (if any). If args is empty,
15
+ # recursively find all Ruby source files under the current directory
30
16
  # @return [Array] array of file paths
31
17
  def find(args, mode)
32
18
  return target_files_in_dir if args.empty?
@@ -44,12 +30,11 @@ module RuboCop
44
30
  files.map { |f| File.expand_path(f) }.uniq
45
31
  end
46
32
 
47
- # Finds all Ruby source files under the current or other supplied
48
- # directory. A Ruby source file is defined as a file with the `.rb`
49
- # extension or a file with no extension that has a ruby shebang line
50
- # as its first line.
51
- # It is possible to specify includes and excludes using the config file,
52
- # so you can include other Ruby files like Rakefiles and gemspecs.
33
+ # Finds all Ruby source files under the current or other supplied directory. A Ruby source file
34
+ # is defined as a file with the `.rb` extension or a file with no extension that has a ruby
35
+ # shebang line as its first line.
36
+ # It is possible to specify includes and excludes using the config file, so you can include
37
+ # other Ruby files like Rakefiles and gemspecs.
53
38
  # @param base_dir Root directory under which to search for
54
39
  # ruby source files
55
40
  # @return [Array] Array of filenames
@@ -66,20 +51,10 @@ module RuboCop
66
51
  target_files.sort_by!(&order)
67
52
  end
68
53
 
69
- def to_inspect?(file, hidden_files, base_dir_config)
70
- return false if base_dir_config.file_to_exclude?(file)
71
- return true if !hidden_files.bsearch do |hidden_file|
72
- file <=> hidden_file
73
- end && ruby_file?(file)
74
-
75
- base_dir_config.file_to_include?(file)
76
- end
77
-
78
- # Search for files recursively starting at the given base directory using
79
- # the given flags that determine how the match is made. Excluded files will
80
- # be removed later by the caller, but as an optimization find_files removes
81
- # the top level directories that are excluded in configuration in the
82
- # normal way (dir/**/*).
54
+ # Search for files recursively starting at the given base directory using the given flags that
55
+ # determine how the match is made. Excluded files will be removed later by the caller, but as an
56
+ # optimization find_files removes the top level directories that are excluded in configuration
57
+ # in the normal way (dir/**/*).
83
58
  def find_files(base_dir, flags)
84
59
  # get all wanted directories first to improve speed of finding all files
85
60
  exclude_pattern = combined_exclude_glob_patterns(base_dir)
@@ -93,9 +68,24 @@ module RuboCop
93
68
  Dir.glob(patterns, flags).select { |path| FileTest.file?(path) }
94
69
  end
95
70
 
71
+ private
72
+
73
+ def to_inspect?(file, hidden_files, base_dir_config)
74
+ return false if base_dir_config.file_to_exclude?(file)
75
+ return true if !hidden_files.bsearch do |hidden_file|
76
+ file <=> hidden_file
77
+ end && ruby_file?(file)
78
+
79
+ base_dir_config.file_to_include?(file)
80
+ end
81
+
96
82
  def wanted_dir_patterns(base_dir, exclude_pattern, flags)
97
- base_dir = base_dir.gsub('/{}/', '/\{}/')
98
- dirs = Dir.glob(File.join(base_dir.gsub('/*/', '/\*/').gsub('/**/', '/\**/'), '*/'), flags)
83
+ # Escape glob characters in base_dir to avoid unwanted behavior.
84
+ base_dir = base_dir.gsub(/[\\\{\}\[\]\*\?]/) do |reserved_glob_character|
85
+ "\\#{reserved_glob_character}"
86
+ end
87
+
88
+ dirs = Dir.glob(File.join(base_dir, '*/'), flags)
99
89
  .reject do |dir|
100
90
  next true if dir.end_with?('/./', '/../')
101
91
  next true if File.fnmatch?(exclude_pattern, dir, flags)
@@ -114,27 +104,12 @@ module RuboCop
114
104
  end
115
105
 
116
106
  def combined_exclude_glob_patterns(base_dir)
117
- exclude = @config_store.for(base_dir).for_all_cops['Exclude']
107
+ exclude = @config_store.for(base_dir).for_all_cops['Exclude'] || []
118
108
  patterns = exclude.select { |pattern| pattern.is_a?(String) && pattern.end_with?('/**/*') }
119
109
  .map { |pattern| pattern.sub("#{base_dir}/", '') }
120
110
  "#{base_dir}/{#{patterns.join(',')}}"
121
111
  end
122
112
 
123
- def ruby_extension?(file)
124
- ruby_extensions.include?(File.extname(file))
125
- end
126
-
127
- def ruby_extensions
128
- @ruby_extensions ||= begin
129
- ext_patterns = all_cops_include.select { |pattern| pattern.start_with?('**/*.') }
130
- ext_patterns.map { |pattern| pattern.sub('**/*', '') }
131
- end
132
- end
133
-
134
- def ruby_filename?(file)
135
- ruby_filenames.include?(File.basename(file))
136
- end
137
-
138
113
  def ruby_filenames
139
114
  @ruby_filenames ||= begin
140
115
  file_patterns = all_cops_include.reject { |pattern| pattern.start_with?('**/*.') }
@@ -146,53 +121,72 @@ module RuboCop
146
121
  @all_cops_include ||= @config_store.for_pwd.for_all_cops['Include'].map(&:to_s)
147
122
  end
148
123
 
149
- def ruby_executable?(file)
150
- return false unless File.extname(file).empty? && File.exist?(file)
124
+ def process_explicit_path(path, mode)
125
+ files = path.include?('*') ? Dir[path] : [path]
151
126
 
152
- first_line = File.open(file, &:readline)
153
- /#!.*(#{ruby_interpreters(file).join('|')})/.match?(first_line)
154
- rescue EOFError, ArgumentError => e
155
- warn("Unprocessable file #{file}: #{e.class}, #{e.message}") if debug?
127
+ if mode == :only_recognized_file_types || force_exclusion?
128
+ files.select! { |file| included_file?(file) }
129
+ end
156
130
 
157
- false
131
+ force_exclusion? ? without_excluded(files) : files
158
132
  end
159
133
 
160
- def ruby_interpreters(file)
161
- @config_store.for(file).for_all_cops['RubyInterpreters']
134
+ def without_excluded(files)
135
+ files.reject do |file|
136
+ # When --ignore-parent-exclusion is given, we must look at the configuration associated with
137
+ # the file, but in the default case when --ignore-parent-exclusion is not given, can safely
138
+ # look only at the configuration for the current directory, since it's only the Exclude
139
+ # parameters we're going to check.
140
+ config = @config_store.for(ignore_parent_exclusion? ? file : '.')
141
+ config.file_to_exclude?(file)
142
+ end
162
143
  end
163
144
 
164
- def stdin?
165
- @options.key?(:stdin)
145
+ def included_file?(file)
146
+ ruby_file?(file) || configured_include?(file)
166
147
  end
167
148
 
168
149
  def ruby_file?(file)
169
150
  stdin? || ruby_extension?(file) || ruby_filename?(file) || ruby_executable?(file)
170
151
  end
171
152
 
172
- def configured_include?(file)
173
- @config_store.for_pwd.file_to_include?(file)
153
+ def stdin?
154
+ @options.key?(:stdin)
174
155
  end
175
156
 
176
- def included_file?(file)
177
- ruby_file?(file) || configured_include?(file)
157
+ def ruby_extension?(file)
158
+ ruby_extensions.include?(File.extname(file))
178
159
  end
179
160
 
180
- def process_explicit_path(path, mode)
181
- files = path.include?('*') ? Dir[path] : [path]
182
-
183
- if mode == :only_recognized_file_types || force_exclusion?
184
- files.select! { |file| included_file?(file) }
161
+ def ruby_extensions
162
+ @ruby_extensions ||= begin
163
+ ext_patterns = all_cops_include.select { |pattern| pattern.start_with?('**/*.') }
164
+ ext_patterns.map { |pattern| pattern.sub('**/*', '') }
185
165
  end
166
+ end
186
167
 
187
- return files unless force_exclusion?
168
+ def ruby_filename?(file)
169
+ ruby_filenames.include?(File.basename(file))
170
+ end
188
171
 
189
- files.reject do |file|
190
- config = @config_store.for(file)
191
- config.file_to_exclude?(file)
192
- end
172
+ def configured_include?(file)
173
+ @config_store.for_pwd.file_to_include?(file)
193
174
  end
194
175
 
195
- private
176
+ def ruby_executable?(file)
177
+ return false unless File.extname(file).empty? && File.exist?(file)
178
+
179
+ first_line = File.open(file, &:readline)
180
+ /#!.*(#{ruby_interpreters(file).join('|')})/.match?(first_line)
181
+ rescue EOFError, ArgumentError => e
182
+ warn("Unprocessable file #{file}: #{e.class}, #{e.message}") if debug?
183
+
184
+ false
185
+ end
186
+
187
+ def ruby_interpreters(file)
188
+ @config_store.for(file).for_all_cops['RubyInterpreters']
189
+ end
196
190
 
197
191
  def order
198
192
  if fail_fast?
@@ -202,5 +196,21 @@ module RuboCop
202
196
  :itself
203
197
  end
204
198
  end
199
+
200
+ def force_exclusion?
201
+ @options[:force_exclusion]
202
+ end
203
+
204
+ def ignore_parent_exclusion?
205
+ @options[:ignore_parent_exclusion]
206
+ end
207
+
208
+ def debug?
209
+ @options[:debug]
210
+ end
211
+
212
+ def fail_fast?
213
+ @options[:fail_fast]
214
+ end
205
215
  end
206
216
  end