rubocop 1.29.1 → 1.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -3
  3. data/config/default.yml +164 -26
  4. data/config/obsoletion.yml +25 -1
  5. data/exe/rubocop +15 -7
  6. data/lib/rubocop/cache_config.rb +29 -0
  7. data/lib/rubocop/cli/command/{auto_genenerate_config.rb → auto_generate_config.rb} +20 -5
  8. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  9. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  10. data/lib/rubocop/cli/command/show_cops.rb +1 -1
  11. data/lib/rubocop/cli/command/suggest_extensions.rb +53 -15
  12. data/lib/rubocop/cli.rb +2 -0
  13. data/lib/rubocop/config.rb +6 -2
  14. data/lib/rubocop/config_finder.rb +68 -0
  15. data/lib/rubocop/config_loader.rb +15 -41
  16. data/lib/rubocop/config_loader_resolver.rb +2 -6
  17. data/lib/rubocop/config_obsoletion/changed_parameter.rb +5 -0
  18. data/lib/rubocop/config_obsoletion/parameter_rule.rb +4 -0
  19. data/lib/rubocop/config_obsoletion.rb +7 -2
  20. data/lib/rubocop/config_validator.rb +21 -4
  21. data/lib/rubocop/cop/autocorrect_logic.rb +4 -2
  22. data/lib/rubocop/cop/base.rb +6 -2
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
  24. data/lib/rubocop/cop/bundler/gem_filename.rb +5 -5
  25. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
  26. data/lib/rubocop/cop/cop.rb +1 -1
  27. data/lib/rubocop/cop/corrector.rb +2 -2
  28. data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
  29. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
  31. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  32. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +4 -2
  33. data/lib/rubocop/cop/correctors/if_then_corrector.rb +1 -1
  34. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
  35. data/lib/rubocop/cop/correctors/line_break_corrector.rb +7 -1
  36. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +3 -3
  37. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
  38. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +59 -1
  39. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  40. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  41. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -1
  42. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +1 -1
  43. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +2 -2
  44. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +92 -0
  45. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -1
  46. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  47. data/lib/rubocop/cop/gemspec/require_mfa.rb +21 -21
  48. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -2
  49. data/lib/rubocop/cop/generator.rb +5 -1
  50. data/lib/rubocop/cop/internal_affairs/cop_description.rb +96 -0
  51. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +1 -1
  52. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -1
  53. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +1 -1
  54. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -5
  55. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +69 -0
  56. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -1
  57. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -1
  58. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  59. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  60. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +62 -0
  61. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
  62. data/lib/rubocop/cop/internal_affairs.rb +4 -0
  63. data/lib/rubocop/cop/layout/argument_alignment.rb +22 -1
  64. data/lib/rubocop/cop/layout/assignment_indentation.rb +1 -1
  65. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
  66. data/lib/rubocop/cop/layout/block_alignment.rb +17 -13
  67. data/lib/rubocop/cop/layout/block_end_newline.rb +36 -6
  68. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  69. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  70. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  71. data/lib/rubocop/cop/layout/condition_position.rb +1 -1
  72. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  73. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  74. data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
  75. data/lib/rubocop/cop/layout/empty_comment.rb +2 -2
  76. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  77. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  78. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
  79. data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
  80. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -2
  81. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +1 -1
  82. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +25 -4
  83. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +1 -1
  84. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +7 -5
  85. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +10 -10
  86. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  87. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +1 -1
  88. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +10 -10
  89. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  90. data/lib/rubocop/cop/layout/end_of_line.rb +5 -5
  91. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  92. data/lib/rubocop/cop/layout/first_argument_indentation.rb +34 -29
  93. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +21 -14
  94. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  95. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +52 -13
  96. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  97. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  98. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -1
  99. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -1
  100. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -0
  101. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -1
  102. data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
  103. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -1
  104. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  105. data/lib/rubocop/cop/layout/indentation_width.rb +13 -6
  106. data/lib/rubocop/cop/layout/initial_indentation.rb +2 -2
  107. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  108. data/lib/rubocop/cop/layout/leading_empty_lines.rb +1 -1
  109. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +112 -0
  110. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +130 -0
  111. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +1 -1
  112. data/lib/rubocop/cop/layout/line_length.rb +7 -2
  113. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +1 -1
  114. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -1
  115. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +2 -2
  116. data/lib/rubocop/cop/layout/multiline_block_layout.rb +4 -2
  117. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +1 -1
  118. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  119. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -2
  120. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
  121. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +3 -3
  122. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  123. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +45 -0
  124. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +3 -3
  125. data/lib/rubocop/cop/layout/redundant_line_break.rb +2 -2
  126. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
  127. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  128. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  129. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +2 -2
  130. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -1
  131. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  132. data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -3
  133. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -1
  134. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  135. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  136. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +10 -10
  137. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +33 -15
  138. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -1
  139. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +8 -8
  140. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  141. data/lib/rubocop/cop/legacy/corrections_proxy.rb +1 -1
  142. data/lib/rubocop/cop/legacy/corrector.rb +1 -1
  143. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -1
  144. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +27 -7
  145. data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
  146. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -1
  147. data/lib/rubocop/cop/lint/ambiguous_range.rb +3 -3
  148. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +1 -1
  149. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -1
  150. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  151. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  152. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  153. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +51 -0
  154. data/lib/rubocop/cop/lint/debugger.rb +27 -17
  155. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +15 -9
  156. data/lib/rubocop/cop/lint/deprecated_constants.rb +1 -1
  157. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
  158. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -1
  159. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  160. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +1 -1
  161. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  162. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -1
  163. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  164. data/lib/rubocop/cop/lint/duplicate_require.rb +1 -1
  165. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +1 -1
  166. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  167. data/lib/rubocop/cop/lint/else_layout.rb +3 -3
  168. data/lib/rubocop/cop/lint/empty_block.rb +2 -2
  169. data/lib/rubocop/cop/lint/empty_class.rb +1 -1
  170. data/lib/rubocop/cop/lint/empty_conditional_body.rb +96 -2
  171. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  172. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  173. data/lib/rubocop/cop/lint/empty_file.rb +1 -1
  174. data/lib/rubocop/cop/lint/empty_in_pattern.rb +1 -1
  175. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  176. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  177. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  178. data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -9
  179. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  180. data/lib/rubocop/cop/lint/float_comparison.rb +1 -1
  181. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  182. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -1
  183. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  184. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +1 -1
  185. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  186. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  187. data/lib/rubocop/cop/lint/interpolation_check.rb +2 -2
  188. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +2 -2
  189. data/lib/rubocop/cop/lint/literal_as_condition.rb +6 -1
  190. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +5 -1
  191. data/lib/rubocop/cop/lint/loop.rb +1 -1
  192. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  193. data/lib/rubocop/cop/lint/missing_super.rb +1 -1
  194. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  195. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  196. data/lib/rubocop/cop/lint/next_without_accumulator.rb +25 -6
  197. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +157 -0
  198. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +12 -0
  199. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  200. data/lib/rubocop/cop/lint/number_conversion.rb +32 -10
  201. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
  202. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  203. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  204. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
  205. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  206. data/lib/rubocop/cop/lint/raise_exception.rb +1 -1
  207. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  208. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +6 -6
  209. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +2 -2
  210. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -1
  211. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +16 -3
  212. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  213. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  214. data/lib/rubocop/cop/lint/redundant_with_index.rb +14 -11
  215. data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -12
  216. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  217. data/lib/rubocop/cop/lint/regexp_as_condition.rb +3 -3
  218. data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
  219. data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
  220. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  221. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -1
  222. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +38 -1
  223. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
  224. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  225. data/lib/rubocop/cop/lint/script_permission.rb +1 -1
  226. data/lib/rubocop/cop/lint/self_assignment.rb +1 -1
  227. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -1
  228. data/lib/rubocop/cop/lint/shadowed_exception.rb +16 -1
  229. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +25 -4
  230. data/lib/rubocop/cop/lint/struct_new_override.rb +3 -3
  231. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  232. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  233. data/lib/rubocop/cop/lint/syntax.rb +1 -1
  234. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  235. data/lib/rubocop/cop/lint/to_json.rb +1 -1
  236. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  237. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +2 -2
  238. data/lib/rubocop/cop/lint/triple_quotes.rb +1 -1
  239. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
  240. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  241. data/lib/rubocop/cop/lint/unified_integer.rb +3 -1
  242. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  243. data/lib/rubocop/cop/lint/unreachable_loop.rb +9 -3
  244. data/lib/rubocop/cop/lint/unused_block_argument.rb +1 -1
  245. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -1
  246. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  247. data/lib/rubocop/cop/lint/uri_regexp.rb +1 -1
  248. data/lib/rubocop/cop/lint/useless_access_modifier.rb +9 -7
  249. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  250. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +44 -0
  251. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  252. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  253. data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
  254. data/lib/rubocop/cop/lint/useless_times.rb +1 -1
  255. data/lib/rubocop/cop/lint/void.rb +3 -1
  256. data/lib/rubocop/cop/metrics/abc_size.rb +4 -2
  257. data/lib/rubocop/cop/metrics/block_length.rb +7 -7
  258. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  259. data/lib/rubocop/cop/metrics/class_length.rb +1 -1
  260. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  261. data/lib/rubocop/cop/metrics/method_length.rb +9 -8
  262. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  263. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  264. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  265. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  266. data/lib/rubocop/cop/mixin/allowed_methods.rb +20 -1
  267. data/lib/rubocop/cop/mixin/allowed_pattern.rb +17 -1
  268. data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -1
  269. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  270. data/lib/rubocop/cop/mixin/def_node.rb +2 -7
  271. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -1
  272. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +82 -2
  273. data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -6
  274. data/lib/rubocop/cop/mixin/method_complexity.rb +8 -13
  275. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +34 -12
  276. data/lib/rubocop/cop/mixin/percent_array.rb +60 -1
  277. data/lib/rubocop/cop/mixin/range_help.rb +10 -7
  278. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  279. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  280. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
  281. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  282. data/lib/rubocop/cop/naming/block_forwarding.rb +2 -2
  283. data/lib/rubocop/cop/naming/block_parameter_name.rb +2 -2
  284. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  285. data/lib/rubocop/cop/naming/constant_name.rb +3 -3
  286. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  287. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
  288. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  289. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  290. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  291. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  292. data/lib/rubocop/cop/naming/predicate_name.rb +30 -1
  293. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  294. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  295. data/lib/rubocop/cop/naming/variable_number.rb +18 -18
  296. data/lib/rubocop/cop/security/compound_hash.rb +1 -1
  297. data/lib/rubocop/cop/security/eval.rb +1 -1
  298. data/lib/rubocop/cop/security/json_load.rb +1 -1
  299. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  300. data/lib/rubocop/cop/security/open.rb +1 -1
  301. data/lib/rubocop/cop/security/yaml_load.rb +1 -1
  302. data/lib/rubocop/cop/style/access_modifier_declarations.rb +77 -1
  303. data/lib/rubocop/cop/style/accessor_grouping.rb +4 -4
  304. data/lib/rubocop/cop/style/alias.rb +1 -1
  305. data/lib/rubocop/cop/style/and_or.rb +11 -11
  306. data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -3
  307. data/lib/rubocop/cop/style/array_coercion.rb +1 -1
  308. data/lib/rubocop/cop/style/array_join.rb +1 -1
  309. data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
  310. data/lib/rubocop/cop/style/attr.rb +1 -1
  311. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
  312. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  313. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
  314. data/lib/rubocop/cop/style/block_comments.rb +1 -1
  315. data/lib/rubocop/cop/style/block_delimiters.rb +30 -9
  316. data/lib/rubocop/cop/style/case_equality.rb +41 -11
  317. data/lib/rubocop/cop/style/case_like_if.rb +1 -1
  318. data/lib/rubocop/cop/style/class_and_module_children.rb +5 -5
  319. data/lib/rubocop/cop/style/class_check.rb +1 -1
  320. data/lib/rubocop/cop/style/class_equality_comparison.rb +51 -4
  321. data/lib/rubocop/cop/style/class_methods.rb +1 -1
  322. data/lib/rubocop/cop/style/class_methods_definitions.rb +3 -2
  323. data/lib/rubocop/cop/style/class_vars.rb +1 -1
  324. data/lib/rubocop/cop/style/collection_compact.rb +1 -1
  325. data/lib/rubocop/cop/style/collection_methods.rb +3 -1
  326. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  327. data/lib/rubocop/cop/style/colon_method_definition.rb +1 -1
  328. data/lib/rubocop/cop/style/combinable_loops.rb +4 -2
  329. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  330. data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
  331. data/lib/rubocop/cop/style/commented_keyword.rb +4 -4
  332. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -1
  333. data/lib/rubocop/cop/style/constant_visibility.rb +1 -1
  334. data/lib/rubocop/cop/style/date_time.rb +1 -1
  335. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -1
  336. data/lib/rubocop/cop/style/dir.rb +4 -1
  337. data/lib/rubocop/cop/style/documentation.rb +1 -1
  338. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  339. data/lib/rubocop/cop/style/double_negation.rb +3 -1
  340. data/lib/rubocop/cop/style/each_for_simple_loop.rb +42 -7
  341. data/lib/rubocop/cop/style/each_with_object.rb +40 -9
  342. data/lib/rubocop/cop/style/empty_block_parameter.rb +2 -2
  343. data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
  344. data/lib/rubocop/cop/style/empty_else.rb +40 -3
  345. data/lib/rubocop/cop/style/empty_heredoc.rb +73 -0
  346. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +2 -2
  347. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  348. data/lib/rubocop/cop/style/empty_method.rb +17 -2
  349. data/lib/rubocop/cop/style/encoding.rb +2 -2
  350. data/lib/rubocop/cop/style/end_block.rb +1 -1
  351. data/lib/rubocop/cop/style/endless_method.rb +1 -1
  352. data/lib/rubocop/cop/style/env_home.rb +1 -1
  353. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  354. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  355. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
  356. data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -2
  357. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  358. data/lib/rubocop/cop/style/fetch_env_var.rb +37 -224
  359. data/lib/rubocop/cop/style/float_division.rb +1 -1
  360. data/lib/rubocop/cop/style/for.rb +3 -1
  361. data/lib/rubocop/cop/style/format_string.rb +1 -1
  362. data/lib/rubocop/cop/style/format_string_token.rb +73 -23
  363. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +6 -3
  364. data/lib/rubocop/cop/style/global_std_stream.rb +1 -1
  365. data/lib/rubocop/cop/style/global_vars.rb +1 -1
  366. data/lib/rubocop/cop/style/guard_clause.rb +35 -22
  367. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -1
  368. data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
  369. data/lib/rubocop/cop/style/hash_each_methods.rb +4 -2
  370. data/lib/rubocop/cop/style/hash_except.rb +85 -9
  371. data/lib/rubocop/cop/style/hash_like_case.rb +1 -1
  372. data/lib/rubocop/cop/style/hash_syntax.rb +20 -3
  373. data/lib/rubocop/cop/style/hash_transform_keys.rb +6 -1
  374. data/lib/rubocop/cop/style/hash_transform_values.rb +4 -1
  375. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  376. data/lib/rubocop/cop/style/if_unless_modifier.rb +1 -1
  377. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -2
  378. data/lib/rubocop/cop/style/implicit_runtime_error.rb +3 -3
  379. data/lib/rubocop/cop/style/in_pattern_then.rb +1 -1
  380. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  381. data/lib/rubocop/cop/style/inverse_methods.rb +10 -8
  382. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  383. data/lib/rubocop/cop/style/keyword_parameters_order.rb +2 -2
  384. data/lib/rubocop/cop/style/lambda.rb +1 -1
  385. data/lib/rubocop/cop/style/lambda_call.rb +1 -1
  386. data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -2
  387. data/lib/rubocop/cop/style/magic_comment_format.rb +307 -0
  388. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +136 -0
  389. data/lib/rubocop/cop/style/map_to_hash.rb +3 -3
  390. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +4 -4
  391. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +5 -1
  392. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +8 -8
  393. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +20 -3
  394. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +5 -2
  395. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  396. data/lib/rubocop/cop/style/min_max.rb +1 -1
  397. data/lib/rubocop/cop/style/missing_else.rb +24 -24
  398. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
  399. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  400. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  401. data/lib/rubocop/cop/style/module_function.rb +3 -3
  402. data/lib/rubocop/cop/style/multiline_block_chain.rb +4 -2
  403. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -2
  404. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  405. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +3 -5
  406. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  407. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  408. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +3 -3
  409. data/lib/rubocop/cop/style/multiline_when_then.rb +2 -4
  410. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  411. data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
  412. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  413. data/lib/rubocop/cop/style/nested_file_dirname.rb +1 -1
  414. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  415. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -2
  416. data/lib/rubocop/cop/style/nested_ternary_operator.rb +20 -8
  417. data/lib/rubocop/cop/style/next.rb +3 -5
  418. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  419. data/lib/rubocop/cop/style/nil_lambda.rb +3 -3
  420. data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
  421. data/lib/rubocop/cop/style/not.rb +2 -2
  422. data/lib/rubocop/cop/style/numbered_parameters.rb +1 -1
  423. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +1 -1
  424. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  425. data/lib/rubocop/cop/style/numeric_literals.rb +16 -1
  426. data/lib/rubocop/cop/style/numeric_predicate.rb +53 -11
  427. data/lib/rubocop/cop/style/object_then.rb +3 -1
  428. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -1
  429. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  430. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  431. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  432. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +1 -1
  433. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  434. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
  435. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  436. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  437. data/lib/rubocop/cop/style/perl_backrefs.rb +23 -2
  438. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  439. data/lib/rubocop/cop/style/proc.rb +5 -2
  440. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  441. data/lib/rubocop/cop/style/random_with_offset.rb +1 -1
  442. data/lib/rubocop/cop/style/redundant_argument.rb +2 -2
  443. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  444. data/lib/rubocop/cop/style/redundant_begin.rb +19 -6
  445. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -1
  446. data/lib/rubocop/cop/style/redundant_condition.rb +28 -9
  447. data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
  448. data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
  449. data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -2
  450. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  451. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  452. data/lib/rubocop/cop/style/redundant_interpolation.rb +22 -1
  453. data/lib/rubocop/cop/style/redundant_parentheses.rb +22 -24
  454. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  455. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -2
  456. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  457. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  458. data/lib/rubocop/cop/style/redundant_self.rb +3 -1
  459. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  460. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +1 -1
  461. data/lib/rubocop/cop/style/redundant_sort.rb +22 -7
  462. data/lib/rubocop/cop/style/redundant_sort_by.rb +25 -9
  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 +8 -3
  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_line_block_params.rb +2 -2
  475. data/lib/rubocop/cop/style/single_line_methods.rb +2 -2
  476. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
  477. data/lib/rubocop/cop/style/sole_nested_conditional.rb +42 -14
  478. data/lib/rubocop/cop/style/static_class.rb +1 -1
  479. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  480. data/lib/rubocop/cop/style/string_concatenation.rb +6 -7
  481. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  482. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
  483. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  484. data/lib/rubocop/cop/style/strip.rb +1 -1
  485. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -4
  486. data/lib/rubocop/cop/style/swap_values.rb +2 -2
  487. data/lib/rubocop/cop/style/symbol_array.rb +9 -6
  488. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  489. data/lib/rubocop/cop/style/symbol_proc.rb +48 -14
  490. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -14
  491. data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -1
  492. data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -1
  493. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +1 -1
  494. data/lib/rubocop/cop/style/trailing_body_on_module.rb +1 -1
  495. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +1 -1
  496. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +1 -1
  497. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
  498. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +1 -1
  499. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  500. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
  501. data/lib/rubocop/cop/style/trivial_accessors.rb +4 -1
  502. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  503. data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -1
  504. data/lib/rubocop/cop/style/unpack_first.rb +5 -2
  505. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  506. data/lib/rubocop/cop/style/when_then.rb +1 -1
  507. data/lib/rubocop/cop/style/word_array.rb +4 -5
  508. data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
  509. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  510. data/lib/rubocop/cop/team.rb +2 -2
  511. data/lib/rubocop/cop/util.rb +3 -3
  512. data/lib/rubocop/cops_documentation_generator.rb +18 -1
  513. data/lib/rubocop/ext/range.rb +15 -0
  514. data/lib/rubocop/feature_loader.rb +94 -0
  515. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  516. data/lib/rubocop/formatter/disabled_config_formatter.rb +11 -8
  517. data/lib/rubocop/formatter/formatter_set.rb +20 -19
  518. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +15 -2
  519. data/lib/rubocop/formatter/html_formatter.rb +3 -4
  520. data/lib/rubocop/formatter/markdown_formatter.rb +3 -1
  521. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  522. data/lib/rubocop/formatter/simple_text_formatter.rb +9 -8
  523. data/lib/rubocop/formatter/tap_formatter.rb +1 -1
  524. data/lib/rubocop/formatter.rb +31 -0
  525. data/lib/rubocop/magic_comment.rb +27 -2
  526. data/lib/rubocop/options.rb +81 -39
  527. data/lib/rubocop/rake_task.rb +34 -9
  528. data/lib/rubocop/result_cache.rb +24 -21
  529. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  530. data/lib/rubocop/rspec/expect_offense.rb +3 -3
  531. data/lib/rubocop/rspec/shared_contexts.rb +29 -9
  532. data/lib/rubocop/rspec/support.rb +14 -0
  533. data/lib/rubocop/runner.rb +13 -5
  534. data/lib/rubocop/server/cache.rb +144 -0
  535. data/lib/rubocop/server/cli.rb +121 -0
  536. data/lib/rubocop/server/client_command/base.rb +44 -0
  537. data/lib/rubocop/server/client_command/exec.rb +59 -0
  538. data/lib/rubocop/server/client_command/restart.rb +25 -0
  539. data/lib/rubocop/server/client_command/start.rb +43 -0
  540. data/lib/rubocop/server/client_command/status.rb +28 -0
  541. data/lib/rubocop/server/client_command/stop.rb +31 -0
  542. data/lib/rubocop/server/client_command.rb +26 -0
  543. data/lib/rubocop/server/core.rb +79 -0
  544. data/lib/rubocop/server/errors.rb +23 -0
  545. data/lib/rubocop/server/helper.rb +34 -0
  546. data/lib/rubocop/server/server_command/base.rb +50 -0
  547. data/lib/rubocop/server/server_command/exec.rb +34 -0
  548. data/lib/rubocop/server/server_command/stop.rb +24 -0
  549. data/lib/rubocop/server/server_command.rb +21 -0
  550. data/lib/rubocop/server/socket_reader.rb +65 -0
  551. data/lib/rubocop/server.rb +53 -0
  552. data/lib/rubocop/target_ruby.rb +7 -5
  553. data/lib/rubocop/version.rb +17 -9
  554. data/lib/rubocop.rb +18 -30
  555. metadata +60 -10
  556. data/lib/rubocop/cop/gemspec/date_assignment.rb +0 -49
  557. data/lib/rubocop/cop/mixin/ignored_methods.rb +0 -52
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+ require_relative '../cache_config'
5
+ require_relative '../config_finder'
6
+
7
+ #
8
+ # This code is based on https://github.com/fohte/rubocop-daemon.
9
+ #
10
+ # Copyright (c) 2018 Hayato Kawai
11
+ #
12
+ # The MIT License (MIT)
13
+ #
14
+ # https://github.com/fohte/rubocop-daemon/blob/master/LICENSE.txt
15
+ #
16
+ module RuboCop
17
+ module Server
18
+ # Caches the states of server process.
19
+ # @api private
20
+ class Cache
21
+ GEMFILE_NAMES = %w[Gemfile gems.rb].freeze
22
+
23
+ class << self
24
+ attr_accessor :cache_root_path
25
+
26
+ # Searches for Gemfile or gems.rb in the current dir or any parent dirs
27
+ def project_dir
28
+ current_dir = Dir.pwd
29
+ while current_dir != '/'
30
+ return current_dir if GEMFILE_NAMES.any? do |gemfile|
31
+ File.exist?(File.join(current_dir, gemfile))
32
+ end
33
+
34
+ current_dir = File.expand_path('..', current_dir)
35
+ end
36
+ # If we can't find a Gemfile, just use the current directory
37
+ Dir.pwd
38
+ end
39
+
40
+ def project_dir_cache_key
41
+ @project_dir_cache_key ||= project_dir[1..].tr('/', '+')
42
+ end
43
+
44
+ def dir
45
+ Pathname.new(File.join(cache_path, project_dir_cache_key)).tap do |d|
46
+ d.mkpath unless d.exist?
47
+ end
48
+ end
49
+
50
+ def cache_path
51
+ cache_root_dir = if cache_root_path
52
+ File.join(cache_root_path, 'rubocop_cache')
53
+ else
54
+ cache_root_dir_from_config
55
+ end
56
+
57
+ File.expand_path(File.join(cache_root_dir, 'server'))
58
+ end
59
+
60
+ def cache_root_dir_from_config
61
+ CacheConfig.root_dir do
62
+ # `RuboCop::ConfigStore` has heavy dependencies, this is a lightweight implementation
63
+ # so that only the necessary `CacheRootDirectory` can be obtained.
64
+ require 'yaml'
65
+ config_path = ConfigFinder.find_config_path(Dir.pwd)
66
+
67
+ require 'erb'
68
+ file_contents = File.read(config_path)
69
+ yaml_code = ERB.new(file_contents).result
70
+
71
+ config_yaml = YAML.safe_load(yaml_code, permitted_classes: [Regexp, Symbol])
72
+
73
+ # For compatibility with Ruby 3.0 or lower.
74
+ if Gem::Version.new(Psych::VERSION) < Gem::Version.new('4.0.0')
75
+ config_yaml == false ? nil : config_yaml
76
+ end
77
+
78
+ config_yaml&.dig('AllCops', 'CacheRootDirectory')
79
+ end
80
+ end
81
+
82
+ def port_path
83
+ dir.join('port')
84
+ end
85
+
86
+ def token_path
87
+ dir.join('token')
88
+ end
89
+
90
+ def pid_path
91
+ dir.join('pid')
92
+ end
93
+
94
+ def lock_path
95
+ dir.join('lock')
96
+ end
97
+
98
+ def status_path
99
+ dir.join('status')
100
+ end
101
+
102
+ def version_path
103
+ dir.join('version')
104
+ end
105
+
106
+ def pid_running?
107
+ Process.kill(0, pid_path.read.to_i) == 1
108
+ rescue Errno::ESRCH
109
+ false
110
+ end
111
+
112
+ def acquire_lock
113
+ lock_file = File.open(lock_path, File::CREAT)
114
+ # flock returns 0 if successful, and false if not.
115
+ flock_result = lock_file.flock(File::LOCK_EX | File::LOCK_NB)
116
+ yield flock_result != false
117
+ ensure
118
+ lock_file.flock(File::LOCK_UN)
119
+ lock_file.close
120
+ end
121
+
122
+ def write_port_and_token_files(port:, token:)
123
+ port_path.write(port)
124
+ token_path.write(token)
125
+ end
126
+
127
+ def write_pid_file
128
+ pid_path.write(Process.pid)
129
+ yield
130
+ ensure
131
+ dir.rmtree
132
+ end
133
+
134
+ def write_status_file(status)
135
+ status_path.write(status)
136
+ end
137
+
138
+ def write_version_file(version)
139
+ version_path.write(version)
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rainbow'
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
+ # The CLI is a class responsible of handling server command line interface logic.
17
+ # @api private
18
+ class CLI
19
+ # Same exit status value as `RuboCop::CLI`.
20
+ STATUS_SUCCESS = 0
21
+ STATUS_ERROR = 2
22
+
23
+ SERVER_OPTIONS = %w[
24
+ --server --no-server --server-status --restart-server --start-server --stop-server
25
+ ].freeze
26
+ EXCLUSIVE_OPTIONS = (SERVER_OPTIONS - %w[--server --no-server]).freeze
27
+
28
+ def initialize
29
+ @exit = false
30
+ end
31
+
32
+ # rubocop:disable Metrics/MethodLength
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
+ Cache.cache_root_path = fetch_cache_root_path_from(argv)
41
+ deleted_server_arguments = delete_server_argument_from(argv)
42
+
43
+ if deleted_server_arguments.size >= 2
44
+ return error("#{deleted_server_arguments.join(', ')} cannot be specified together.")
45
+ end
46
+
47
+ server_command = deleted_server_arguments.first
48
+
49
+ if EXCLUSIVE_OPTIONS.include?(server_command) && argv.count > allowed_option_count
50
+ return error("#{server_command} cannot be combined with other options.")
51
+ end
52
+
53
+ run_command(server_command)
54
+
55
+ STATUS_SUCCESS
56
+ end
57
+ # rubocop:enable Metrics/MethodLength
58
+
59
+ def exit?
60
+ @exit
61
+ end
62
+
63
+ private
64
+
65
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength:
66
+ def run_command(server_command)
67
+ case server_command
68
+ when '--server'
69
+ Server::ClientCommand::Start.new.run unless Server.running?
70
+ when '--no-server'
71
+ Server::ClientCommand::Stop.new.run if Server.running?
72
+ when '--restart-server'
73
+ @exit = true
74
+ Server::ClientCommand::Restart.new.run
75
+ when '--start-server'
76
+ @exit = true
77
+ Server::ClientCommand::Start.new.run
78
+ when '--stop-server'
79
+ @exit = true
80
+ Server::ClientCommand::Stop.new.run
81
+ when '--server-status'
82
+ @exit = true
83
+ Server::ClientCommand::Status.new.run
84
+ end
85
+ end
86
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength:
87
+
88
+ def fetch_cache_root_path_from(arguments)
89
+ cache_root = arguments.detect { |argument| argument.start_with?('--cache-root') }
90
+ return unless cache_root
91
+
92
+ if cache_root.start_with?('--cache-root=')
93
+ cache_root.split('=')[1]
94
+ else
95
+ arguments[arguments.index(cache_root) + 1]
96
+ end
97
+ end
98
+
99
+ def delete_server_argument_from(all_arguments)
100
+ SERVER_OPTIONS.each_with_object([]) do |server_option, server_arguments|
101
+ server_arguments << all_arguments.delete(server_option)
102
+ end.compact
103
+ end
104
+
105
+ def use_server_option?(argv)
106
+ (argv & SERVER_OPTIONS).any?
107
+ end
108
+
109
+ def allowed_option_count
110
+ Cache.cache_root_path ? 2 : 1
111
+ end
112
+
113
+ def error(message)
114
+ @exit = true
115
+ warn Rainbow(message).red
116
+
117
+ STATUS_ERROR
118
+ end
119
+ end
120
+ end
121
+ 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
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'socket'
4
+ require 'securerandom'
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 core of server process. It starts TCP server and perform socket communication.
18
+ # @api private
19
+ class Core
20
+ def self.token
21
+ @token ||= SecureRandom.hex(4)
22
+ end
23
+
24
+ def token
25
+ self.class.token
26
+ end
27
+
28
+ def start(host, port)
29
+ $PROGRAM_NAME = "rubocop --server #{Cache.project_dir}"
30
+
31
+ require 'rubocop'
32
+ start_server(host, port)
33
+
34
+ demonize if server_mode?
35
+ end
36
+
37
+ private
38
+
39
+ def demonize
40
+ Cache.write_port_and_token_files(port: @server.addr[1], token: token)
41
+
42
+ pid = fork do
43
+ Process.daemon(true)
44
+ Cache.write_pid_file do
45
+ read_socket(@server.accept) until @server.closed?
46
+ end
47
+ end
48
+
49
+ Process.waitpid(pid)
50
+ end
51
+
52
+ def server_mode?
53
+ true
54
+ end
55
+
56
+ def start_server(host, port)
57
+ @server = TCPServer.open(host, port)
58
+
59
+ puts "RuboCop server starting on #{@server.addr[3]}:#{@server.addr[1]}."
60
+ end
61
+
62
+ def read_socket(socket)
63
+ SocketReader.new(socket).read!
64
+ rescue InvalidTokenError
65
+ socket.puts 'token is not valid.'
66
+ rescue ServerStopRequest
67
+ @server.close
68
+ rescue UnknownServerCommandError => e
69
+ socket.puts e.message
70
+ rescue Errno::EPIPE => e
71
+ warn e.inspect
72
+ rescue StandardError => e
73
+ socket.puts e.full_message
74
+ ensure
75
+ socket.close
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,23 @@
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
+ # @api private
15
+ class InvalidTokenError < StandardError; end
16
+
17
+ # @api private
18
+ class ServerStopRequest < StandardError; end
19
+
20
+ # @api private
21
+ class UnknownServerCommandError < StandardError; end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
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
+ # This module has a helper memthod for `RuboCop::Server::SocketReader`.
15
+ # @api private
16
+ module Helper
17
+ def self.redirect(stdin: $stdin, stdout: $stdout, stderr: $stderr, &_block)
18
+ old_stdin = $stdin.dup
19
+ old_stdout = $stdout.dup
20
+ old_stderr = $stderr.dup
21
+
22
+ $stdin = stdin
23
+ $stdout = stdout
24
+ $stderr = stderr
25
+
26
+ yield
27
+ ensure
28
+ $stdin = old_stdin
29
+ $stdout = old_stdout
30
+ $stderr = old_stderr
31
+ end
32
+ end
33
+ end
34
+ end