rubocop 1.11.0 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (425) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -3
  3. data/config/default.yml +58 -6
  4. data/exe/rubocop +1 -3
  5. data/lib/rubocop.rb +6 -1
  6. data/lib/rubocop/cached_data.rb +1 -3
  7. data/lib/rubocop/cli.rb +4 -6
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
  9. data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
  10. data/lib/rubocop/cli/command/show_cops.rb +1 -4
  11. data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
  12. data/lib/rubocop/comment_config.rb +45 -101
  13. data/lib/rubocop/config.rb +11 -26
  14. data/lib/rubocop/config_loader.rb +5 -11
  15. data/lib/rubocop/config_loader_resolver.rb +22 -14
  16. data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
  17. data/lib/rubocop/config_store.rb +1 -2
  18. data/lib/rubocop/config_validator.rb +5 -10
  19. data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
  20. data/lib/rubocop/cop/badge.rb +1 -2
  21. data/lib/rubocop/cop/base.rb +8 -6
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -2
  23. data/lib/rubocop/cop/bundler/gem_comment.rb +43 -11
  24. data/lib/rubocop/cop/bundler/gem_version.rb +99 -0
  25. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -4
  26. data/lib/rubocop/cop/commissioner.rb +2 -8
  27. data/lib/rubocop/cop/cop.rb +4 -18
  28. data/lib/rubocop/cop/corrector.rb +1 -4
  29. data/lib/rubocop/cop/correctors/alignment_corrector.rb +6 -12
  30. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
  31. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
  32. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
  33. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
  34. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
  35. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
  36. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +1 -2
  37. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -4
  38. data/lib/rubocop/cop/generator.rb +1 -4
  39. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
  40. data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
  41. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -5
  42. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +2 -5
  43. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -3
  44. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -3
  45. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -2
  46. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -2
  47. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -3
  48. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
  49. data/lib/rubocop/cop/layout/argument_alignment.rb +34 -18
  50. data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
  51. data/lib/rubocop/cop/layout/assignment_indentation.rb +8 -7
  52. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
  53. data/lib/rubocop/cop/layout/block_alignment.rb +7 -19
  54. data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
  55. data/lib/rubocop/cop/layout/case_indentation.rb +1 -3
  56. data/lib/rubocop/cop/layout/class_structure.rb +4 -10
  57. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +18 -30
  58. data/lib/rubocop/cop/layout/comment_indentation.rb +17 -21
  59. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
  60. data/lib/rubocop/cop/layout/dot_position.rb +1 -3
  61. data/lib/rubocop/cop/layout/else_alignment.rb +10 -9
  62. data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
  63. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -8
  64. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
  65. data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
  66. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
  67. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
  68. data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
  69. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  70. data/lib/rubocop/cop/layout/extra_spacing.rb +3 -7
  71. data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -5
  72. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +10 -8
  73. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
  74. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -20
  75. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
  76. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
  77. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
  78. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
  79. data/lib/rubocop/cop/layout/hash_alignment.rb +18 -13
  80. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
  81. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
  82. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  83. data/lib/rubocop/cop/layout/indentation_style.rb +25 -30
  84. data/lib/rubocop/cop/layout/indentation_width.rb +24 -12
  85. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
  86. data/lib/rubocop/cop/layout/line_length.rb +4 -15
  87. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
  88. data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
  89. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
  90. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
  91. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -15
  92. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
  93. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  94. data/lib/rubocop/cop/layout/redundant_line_break.rb +137 -0
  95. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
  96. data/lib/rubocop/cop/layout/single_line_block_chain.rb +53 -0
  97. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
  98. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
  99. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -6
  102. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
  103. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -2
  104. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
  105. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  106. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
  107. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
  108. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
  109. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
  110. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -10
  111. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
  112. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
  113. data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
  114. data/lib/rubocop/cop/legacy/corrector.rb +1 -3
  115. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
  116. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
  117. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -2
  118. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -2
  119. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +83 -41
  120. data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
  121. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -5
  122. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -2
  123. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
  124. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -7
  125. data/lib/rubocop/cop/lint/else_layout.rb +1 -3
  126. data/lib/rubocop/cop/lint/empty_block.rb +18 -2
  127. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
  128. data/lib/rubocop/cop/lint/empty_file.rb +1 -3
  129. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
  130. data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
  131. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -7
  132. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
  133. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +3 -6
  134. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
  135. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  136. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -7
  137. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -2
  138. data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
  139. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
  140. data/lib/rubocop/cop/lint/loop.rb +1 -2
  141. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
  142. data/lib/rubocop/cop/lint/missing_super.rb +1 -2
  143. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
  144. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -2
  145. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
  146. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +1 -3
  147. data/lib/rubocop/cop/lint/number_conversion.rb +11 -5
  148. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
  149. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
  150. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
  151. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
  152. data/lib/rubocop/cop/lint/raise_exception.rb +1 -2
  153. data/lib/rubocop/cop/lint/rand_one.rb +1 -2
  154. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +9 -22
  155. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -3
  156. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +3 -7
  157. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -2
  158. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -4
  159. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -4
  160. data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
  161. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
  162. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
  163. data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
  164. data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
  165. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -2
  166. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
  167. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -2
  168. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +2 -7
  169. data/lib/rubocop/cop/lint/shadowed_argument.rb +4 -11
  170. data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
  171. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -2
  172. data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
  173. data/lib/rubocop/cop/lint/symbol_conversion.rb +91 -6
  174. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  175. data/lib/rubocop/cop/lint/to_json.rb +1 -2
  176. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
  177. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
  178. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -5
  179. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -7
  180. data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
  181. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -2
  182. data/lib/rubocop/cop/lint/useless_access_modifier.rb +2 -4
  183. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
  184. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -3
  185. data/lib/rubocop/cop/lint/void.rb +5 -12
  186. data/lib/rubocop/cop/message_annotator.rb +1 -3
  187. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
  188. data/lib/rubocop/cop/metrics/class_length.rb +1 -3
  189. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
  190. data/lib/rubocop/cop/metrics/module_length.rb +2 -6
  191. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -5
  192. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
  193. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
  194. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -7
  195. data/lib/rubocop/cop/migration/department_name.rb +3 -7
  196. data/lib/rubocop/cop/mixin/alignment.rb +12 -7
  197. data/lib/rubocop/cop/mixin/check_line_breakable.rb +20 -4
  198. data/lib/rubocop/cop/mixin/code_length.rb +1 -3
  199. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  200. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
  201. data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
  202. data/lib/rubocop/cop/mixin/def_node.rb +2 -5
  203. data/lib/rubocop/cop/mixin/documentation_comment.rb +3 -6
  204. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -7
  205. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -3
  206. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
  207. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -6
  208. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
  209. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +7 -7
  210. data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
  211. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
  212. data/lib/rubocop/cop/mixin/hash_transform_method.rb +7 -22
  213. data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
  214. data/lib/rubocop/cop/mixin/line_length_help.rb +13 -10
  215. data/lib/rubocop/cop/mixin/match_range.rb +2 -5
  216. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -3
  217. data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
  218. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
  219. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
  220. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -40
  221. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  222. data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -2
  223. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
  224. data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
  225. data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
  226. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
  227. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +4 -7
  228. data/lib/rubocop/cop/mixin/range_help.rb +10 -13
  229. data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
  230. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -2
  231. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
  232. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
  233. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
  234. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  235. data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
  236. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
  237. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -13
  238. data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
  239. data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
  240. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -2
  241. data/lib/rubocop/cop/naming/file_name.rb +7 -16
  242. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +6 -3
  243. data/lib/rubocop/cop/naming/method_name.rb +1 -2
  244. data/lib/rubocop/cop/naming/predicate_name.rb +1 -2
  245. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
  246. data/lib/rubocop/cop/offense.rb +3 -8
  247. data/lib/rubocop/cop/registry.rb +12 -11
  248. data/lib/rubocop/cop/style/access_modifier_declarations.rb +3 -5
  249. data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
  250. data/lib/rubocop/cop/style/alias.rb +5 -12
  251. data/lib/rubocop/cop/style/and_or.rb +3 -1
  252. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -3
  253. data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
  254. data/lib/rubocop/cop/style/attr.rb +1 -3
  255. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  256. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
  257. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
  258. data/lib/rubocop/cop/style/case_like_if.rb +16 -6
  259. data/lib/rubocop/cop/style/character_literal.rb +2 -4
  260. data/lib/rubocop/cop/style/class_and_module_children.rb +19 -10
  261. data/lib/rubocop/cop/style/class_equality_comparison.rb +2 -0
  262. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  263. data/lib/rubocop/cop/style/collection_compact.rb +1 -3
  264. data/lib/rubocop/cop/style/colon_method_call.rb +1 -3
  265. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  266. data/lib/rubocop/cop/style/command_literal.rb +4 -9
  267. data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
  268. data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
  269. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -24
  270. data/lib/rubocop/cop/style/copyright.rb +3 -6
  271. data/lib/rubocop/cop/style/date_time.rb +2 -5
  272. data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
  273. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  274. data/lib/rubocop/cop/style/documentation.rb +25 -3
  275. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -2
  276. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
  277. data/lib/rubocop/cop/style/empty_else.rb +3 -9
  278. data/lib/rubocop/cop/style/empty_literal.rb +12 -9
  279. data/lib/rubocop/cop/style/empty_method.rb +3 -7
  280. data/lib/rubocop/cop/style/end_block.rb +1 -2
  281. data/lib/rubocop/cop/style/endless_method.rb +1 -3
  282. data/lib/rubocop/cop/style/eval_with_location.rb +3 -5
  283. data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -3
  284. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -4
  285. data/lib/rubocop/cop/style/format_string_token.rb +1 -4
  286. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
  287. data/lib/rubocop/cop/style/guard_clause.rb +3 -7
  288. data/lib/rubocop/cop/style/hash_conversion.rb +31 -3
  289. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
  290. data/lib/rubocop/cop/style/hash_like_case.rb +1 -2
  291. data/lib/rubocop/cop/style/hash_syntax.rb +20 -24
  292. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
  293. data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
  294. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  295. data/lib/rubocop/cop/style/inverse_methods.rb +3 -7
  296. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  297. data/lib/rubocop/cop/style/lambda.rb +2 -4
  298. data/lib/rubocop/cop/style/lambda_call.rb +1 -2
  299. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
  300. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +47 -3
  301. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
  302. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
  303. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  304. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
  305. data/lib/rubocop/cop/style/min_max.rb +1 -2
  306. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  307. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
  308. data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
  309. data/lib/rubocop/cop/style/mixin_usage.rb +1 -2
  310. data/lib/rubocop/cop/style/module_function.rb +3 -6
  311. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
  312. data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
  313. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
  314. data/lib/rubocop/cop/style/multiple_comparison.rb +2 -4
  315. data/lib/rubocop/cop/style/mutable_constant.rb +4 -10
  316. data/lib/rubocop/cop/style/negated_if.rb +1 -2
  317. data/lib/rubocop/cop/style/negated_if_else_condition.rb +23 -2
  318. data/lib/rubocop/cop/style/negated_unless.rb +1 -2
  319. data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
  320. data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
  321. data/lib/rubocop/cop/style/next.rb +4 -9
  322. data/lib/rubocop/cop/style/nil_lambda.rb +29 -12
  323. data/lib/rubocop/cop/style/non_nil_check.rb +2 -5
  324. data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
  325. data/lib/rubocop/cop/style/numeric_predicate.rb +2 -7
  326. data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
  327. data/lib/rubocop/cop/style/option_hash.rb +1 -3
  328. data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
  329. data/lib/rubocop/cop/style/or_assignment.rb +2 -6
  330. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -9
  331. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
  332. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
  333. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
  334. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
  335. data/lib/rubocop/cop/style/proc.rb +1 -2
  336. data/lib/rubocop/cop/style/raise_args.rb +4 -8
  337. data/lib/rubocop/cop/style/random_with_offset.rb +3 -8
  338. data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
  339. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -3
  340. data/lib/rubocop/cop/style/redundant_begin.rb +40 -6
  341. data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
  342. data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
  343. data/lib/rubocop/cop/style/redundant_conditional.rb +3 -6
  344. data/lib/rubocop/cop/style/redundant_exception.rb +3 -6
  345. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  346. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -2
  347. data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
  348. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -20
  349. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
  350. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
  351. data/lib/rubocop/cop/style/redundant_return.rb +6 -4
  352. data/lib/rubocop/cop/style/redundant_self.rb +9 -9
  353. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -2
  354. data/lib/rubocop/cop/style/redundant_sort.rb +2 -5
  355. data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
  356. data/lib/rubocop/cop/style/rescue_modifier.rb +21 -14
  357. data/lib/rubocop/cop/style/rescue_standard_error.rb +3 -7
  358. data/lib/rubocop/cop/style/return_nil.rb +1 -2
  359. data/lib/rubocop/cop/style/safe_navigation.rb +10 -21
  360. data/lib/rubocop/cop/style/send.rb +1 -2
  361. data/lib/rubocop/cop/style/signal_exception.rb +3 -7
  362. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -2
  363. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
  364. data/lib/rubocop/cop/style/single_line_methods.rb +21 -4
  365. data/lib/rubocop/cop/style/sole_nested_conditional.rb +31 -7
  366. data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
  367. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
  368. data/lib/rubocop/cop/style/stderr_puts.rb +2 -6
  369. data/lib/rubocop/cop/style/string_chars.rb +39 -0
  370. data/lib/rubocop/cop/style/string_concatenation.rb +8 -10
  371. data/lib/rubocop/cop/style/string_literals.rb +2 -5
  372. data/lib/rubocop/cop/style/struct_inheritance.rb +10 -0
  373. data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
  374. data/lib/rubocop/cop/style/symbol_proc.rb +4 -9
  375. data/lib/rubocop/cop/style/ternary_parentheses.rb +3 -6
  376. data/lib/rubocop/cop/style/top_level_method_definition.rb +75 -0
  377. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +6 -3
  378. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
  379. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +2 -5
  380. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
  381. data/lib/rubocop/cop/style/trivial_accessors.rb +67 -4
  382. data/lib/rubocop/cop/style/unless_else.rb +1 -2
  383. data/lib/rubocop/cop/style/unless_logical_operators.rb +8 -2
  384. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  385. data/lib/rubocop/cop/style/when_then.rb +1 -3
  386. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
  387. data/lib/rubocop/cop/style/word_array.rb +1 -2
  388. data/lib/rubocop/cop/style/yoda_condition.rb +3 -11
  389. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -2
  390. data/lib/rubocop/cop/team.rb +2 -5
  391. data/lib/rubocop/cop/util.rb +8 -11
  392. data/lib/rubocop/cop/utils/format_string.rb +1 -3
  393. data/lib/rubocop/cop/variable_force.rb +6 -15
  394. data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
  395. data/lib/rubocop/cop/variable_force/branch.rb +16 -2
  396. data/lib/rubocop/cop/variable_force/reference.rb +1 -3
  397. data/lib/rubocop/cop/variable_force/scope.rb +4 -8
  398. data/lib/rubocop/cop/variable_force/variable.rb +2 -4
  399. data/lib/rubocop/cops_documentation_generator.rb +7 -21
  400. data/lib/rubocop/directive_comment.rb +69 -9
  401. data/lib/rubocop/ext/regexp_parser.rb +3 -6
  402. data/lib/rubocop/file_finder.rb +1 -3
  403. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  404. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
  405. data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
  406. data/lib/rubocop/formatter/html_formatter.rb +4 -10
  407. data/lib/rubocop/formatter/json_formatter.rb +1 -5
  408. data/lib/rubocop/formatter/junit_formatter.rb +23 -14
  409. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  410. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  411. data/lib/rubocop/magic_comment.rb +1 -1
  412. data/lib/rubocop/options.rb +30 -50
  413. data/lib/rubocop/path_util.rb +1 -3
  414. data/lib/rubocop/rake_task.rb +3 -0
  415. data/lib/rubocop/remote_config.rb +4 -7
  416. data/lib/rubocop/result_cache.rb +5 -12
  417. data/lib/rubocop/rspec/cop_helper.rb +1 -1
  418. data/lib/rubocop/rspec/expect_offense.rb +4 -9
  419. data/lib/rubocop/rspec/shared_contexts.rb +8 -15
  420. data/lib/rubocop/runner.rb +7 -14
  421. data/lib/rubocop/target_finder.rb +19 -16
  422. data/lib/rubocop/target_ruby.rb +4 -8
  423. data/lib/rubocop/version.rb +1 -1
  424. metadata +13 -7
  425. data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -5,28 +5,88 @@ module RuboCop
5
5
  # special `rubocop:disable` and `rubocop:enable` comment and exposes what
6
6
  # cops it contains.
7
7
  class DirectiveComment
8
- attr_reader :comment
8
+ # @api private
9
+ REDUNDANT_COP = 'Lint/RedundantCopDisableDirective'
10
+ # @api private
11
+ COP_NAME_PATTERN = '([A-Z]\w+/)*(?:[A-Z]\w+)'
12
+ # @api private
13
+ COP_NAMES_PATTERN = "(?:#{COP_NAME_PATTERN} , )*#{COP_NAME_PATTERN}"
14
+ # @api private
15
+ COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
16
+ # @api private
17
+ DIRECTIVE_COMMENT_REGEXP = Regexp.new(
18
+ "# rubocop : ((?:disable|enable|todo))\\b #{COPS_PATTERN}"
19
+ .gsub(' ', '\s*')
20
+ )
21
+
22
+ def self.before_comment(line)
23
+ line.split(DIRECTIVE_COMMENT_REGEXP).first
24
+ end
25
+
26
+ attr_reader :comment, :mode, :cops
9
27
 
10
28
  def initialize(comment)
11
29
  @comment = comment
30
+ @mode, @cops = match_captures
12
31
  end
13
32
 
14
- # Return all the cops specified in the directive
15
- def cops
16
- match = comment.text.match(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
17
- return unless match
18
-
19
- cops_string = match.captures[1]
20
- cops_string.split(/,\s*/).uniq.sort
33
+ # Checks if this directive relates to single line
34
+ def single_line?
35
+ !self.class.before_comment(comment.text).empty?
21
36
  end
22
37
 
23
38
  # Checks if this directive contains all the given cop names
24
39
  def match?(cop_names)
25
- cops == cop_names.uniq.sort
40
+ parsed_cop_names.uniq.sort == cop_names.uniq.sort
26
41
  end
27
42
 
28
43
  def range
29
44
  comment.location.expression
30
45
  end
46
+
47
+ # Returns match captures to directive comment pattern
48
+ def match_captures
49
+ @match_captures ||= comment.text.match(DIRECTIVE_COMMENT_REGEXP)&.captures
50
+ end
51
+
52
+ # Checks if this directive disables cops
53
+ def disabled?
54
+ %w[disable todo].include?(mode)
55
+ end
56
+
57
+ # Checks if this directive enables cops
58
+ def enabled?
59
+ mode == 'enable'
60
+ end
61
+
62
+ # Checks if this directive enables all cops
63
+ def enabled_all?
64
+ !disabled? && all_cops?
65
+ end
66
+
67
+ # Checks if all cops specified in this directive
68
+ def all_cops?
69
+ cops == 'all'
70
+ end
71
+
72
+ # Returns array of specified in this directive cop names
73
+ def cop_names
74
+ @cop_names ||= all_cops? ? all_cop_names : parsed_cop_names
75
+ end
76
+
77
+ # Returns line number for directive
78
+ def line_number
79
+ comment.loc.expression.line
80
+ end
81
+
82
+ private
83
+
84
+ def parsed_cop_names
85
+ (cops || '').split(/,\s*/)
86
+ end
87
+
88
+ def all_cop_names
89
+ Cop::Registry.global.names - [REDUNDANT_COP]
90
+ end
31
91
  end
32
92
  end
@@ -39,9 +39,8 @@ module RuboCop
39
39
 
40
40
  # Shortcut to `loc.expression`
41
41
  def expression
42
- @expression ||= begin
43
- origin.adjust(begin_pos: start_index, end_pos: start_index + full_length)
44
- end
42
+ end_pos = start_index + full_length
43
+ @expression ||= origin.adjust(begin_pos: start_index, end_pos: end_pos)
45
44
  end
46
45
  end
47
46
 
@@ -60,9 +59,7 @@ module RuboCop
60
59
  #
61
60
  # Please open issue if you need other locations
62
61
  def loc
63
- @loc ||= begin
64
- Map.new(expression, **build_location)
65
- end
62
+ @loc ||= Map.new(expression, **build_location)
66
63
  end
67
64
 
68
65
  private
@@ -23,9 +23,7 @@ module RuboCop
23
23
 
24
24
  def find_last_file_upwards(filename, start_dir, stop_dir = nil)
25
25
  last_file = nil
26
- traverse_files_upwards(filename, start_dir, stop_dir) do |file|
27
- last_file = file
28
- end
26
+ traverse_files_upwards(filename, start_dir, stop_dir) { |file| last_file = file }
29
27
  last_file
30
28
  end
31
29
 
@@ -49,8 +49,10 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def report_highlighted_area(highlighted_area)
52
- output.puts("#{' ' * highlighted_area.begin_pos}" \
53
- "#{'^' * highlighted_area.size}")
52
+ space_area = highlighted_area.source_buffer.slice(0...highlighted_area.begin_pos)
53
+ source_area = highlighted_area.source
54
+ output.puts("#{' ' * Unicode::DisplayWidth.of(space_area)}" \
55
+ "#{'^' * Unicode::DisplayWidth.of(source_area)}")
54
56
  end
55
57
  end
56
58
  end
@@ -71,9 +71,7 @@ module RuboCop
71
71
  command += ' --auto-gen-only-exclude' if @options[:auto_gen_only_exclude]
72
72
 
73
73
  if @exclude_limit_option
74
- command +=
75
- format(' --exclude-limit %<limit>d',
76
- limit: Integer(@exclude_limit_option))
74
+ command += format(' --exclude-limit %<limit>d', limit: Integer(@exclude_limit_option))
77
75
  end
78
76
  command += ' --no-offense-counts' unless show_offense_counts?
79
77
 
@@ -111,8 +109,7 @@ module RuboCop
111
109
 
112
110
  # In case auto_gen_only_exclude is set, only modify the maximum if the
113
111
  # files are not excluded one by one.
114
- if !@options[:auto_gen_only_exclude] ||
115
- @files_with_offenses[cop_name].size > @exclude_limit
112
+ if !@options[:auto_gen_only_exclude] || @files_with_offenses[cop_name].size > @exclude_limit
116
113
  cfg.merge!(cfg[:exclude_limit])
117
114
  end
118
115
 
@@ -144,9 +141,7 @@ module RuboCop
144
141
 
145
142
  def output_cop_param_comments(output_buffer, params, default_cfg)
146
143
  config_params = params.reject { |p| p.start_with?('Supported') }
147
- output_buffer.puts(
148
- "# Configuration parameters: #{config_params.join(', ')}."
149
- )
144
+ output_buffer.puts("# Configuration parameters: #{config_params.join(', ')}.")
150
145
 
151
146
  params.each do |param|
152
147
  value = default_cfg[param]
@@ -5,11 +5,7 @@ module RuboCop
5
5
  # This formatter formats report data as GitHub Workflow commands resulting
6
6
  # in GitHub check annotations when run within GitHub Actions.
7
7
  class GitHubActionsFormatter < BaseFormatter
8
- ESCAPE_MAP = {
9
- '%' => '%25',
10
- "\n" => '%0A',
11
- "\r" => '%0D'
12
- }.freeze
8
+ ESCAPE_MAP = { '%' => '%25', "\n" => '%0A', "\r" => '%0D' }.freeze
13
9
 
14
10
  def file_finished(file, offenses)
15
11
  offenses.each { |offense| report_offense(file, offense) }
@@ -11,8 +11,7 @@ module RuboCop
11
11
  # This formatter saves the output as an html file.
12
12
  class HTMLFormatter < BaseFormatter
13
13
  ELLIPSES = '<span class="extra-code">...</span>'
14
- TEMPLATE_PATH =
15
- File.expand_path('../../../assets/output.html.erb', __dir__)
14
+ TEMPLATE_PATH = File.expand_path('../../../assets/output.html.erb', __dir__)
16
15
 
17
16
  Color = Struct.new(:red, :green, :blue, :alpha) do
18
17
  def to_s
@@ -20,9 +19,7 @@ module RuboCop
20
19
  end
21
20
 
22
21
  def fade_out(amount)
23
- dup.tap do |color|
24
- color.alpha -= amount
25
- end
22
+ dup.tap { |color| color.alpha -= amount }
26
23
  end
27
24
  end
28
25
 
@@ -79,8 +76,7 @@ module RuboCop
79
76
  fatal: Color.new(0xD2, 0x32, 0x2D, 1.0)
80
77
  }.freeze
81
78
 
82
- LOGO_IMAGE_PATH =
83
- File.expand_path('../../../assets/logo.png', __dir__)
79
+ LOGO_IMAGE_PATH = File.expand_path('../../../assets/logo.png', __dir__)
84
80
 
85
81
  attr_reader :files, :summary
86
82
 
@@ -97,9 +93,7 @@ module RuboCop
97
93
  # rubocop:enable Lint/UselessMethodDefinition
98
94
 
99
95
  def decorated_message(offense)
100
- offense.message.gsub(/`(.+?)`/) do
101
- "<code>#{Regexp.last_match(1)}</code>"
102
- end
96
+ offense.message.gsub(/`(.+?)`/) { "<code>#{Regexp.last_match(1)}</code>" }
103
97
  end
104
98
 
105
99
  def highlighted_source_line(offense)
@@ -13,11 +13,7 @@ module RuboCop
13
13
 
14
14
  def initialize(output, options = {})
15
15
  super
16
- @output_hash = {
17
- metadata: metadata_hash,
18
- files: [],
19
- summary: { offense_count: 0 }
20
- }
16
+ @output_hash = { metadata: metadata_hash, files: [], summary: { offense_count: 0 } }
21
17
  end
22
18
 
23
19
  def started(target_files)
@@ -18,17 +18,17 @@ module RuboCop
18
18
  def initialize(output, options = {})
19
19
  super
20
20
 
21
- @document = REXML::Document.new.tap do |document|
22
- document << REXML::XMLDecl.new
23
- end
21
+ @document = REXML::Document.new.tap { |document| document << REXML::XMLDecl.new }
24
22
  testsuites = REXML::Element.new('testsuites', @document)
25
23
  testsuite = REXML::Element.new('testsuite', testsuites)
26
- @testsuite = testsuite.tap do |element|
27
- element.add_attributes('name' => 'rubocop')
28
- end
24
+ @testsuite = testsuite.tap { |element| element.add_attributes('name' => 'rubocop') }
25
+
26
+ reset_count
29
27
  end
30
28
 
31
29
  def file_finished(file, offenses)
30
+ @inspected_file_count += 1
31
+
32
32
  # TODO: Returns all cops with the same behavior as
33
33
  # the original rubocop-junit-formatter.
34
34
  # https://github.com/mikian/rubocop-junit-formatter/blob/v0.1.4/lib/rubocop/formatter/junit_formatter.rb#L9
@@ -36,15 +36,11 @@ module RuboCop
36
36
  # In the future, it would be preferable to return only enabled cops.
37
37
  Cop::Registry.all.each do |cop|
38
38
  target_offenses = offenses_for_cop(offenses, cop)
39
+ @offense_count += target_offenses.count
39
40
 
40
41
  next unless relevant_for_output?(options, target_offenses)
41
42
 
42
- REXML::Element.new('testcase', @testsuite).tap do |testcase|
43
- testcase.attributes['classname'] = classname_attribute_value(file)
44
- testcase.attributes['name'] = cop.cop_name
45
-
46
- add_failure_to(testcase, target_offenses, cop.cop_name)
47
- end
43
+ add_testcase_element_to_testsuite_element(file, target_offenses, cop)
48
44
  end
49
45
  end
50
46
 
@@ -53,8 +49,15 @@ module RuboCop
53
49
  end
54
50
 
55
51
  def offenses_for_cop(all_offenses, cop)
56
- all_offenses.select do |offense|
57
- offense.cop_name == cop.cop_name
52
+ all_offenses.select { |offense| offense.cop_name == cop.cop_name }
53
+ end
54
+
55
+ def add_testcase_element_to_testsuite_element(file, target_offenses, cop)
56
+ REXML::Element.new('testcase', @testsuite).tap do |testcase|
57
+ testcase.attributes['classname'] = classname_attribute_value(file)
58
+ testcase.attributes['name'] = cop.cop_name
59
+
60
+ add_failure_to(testcase, target_offenses, cop.cop_name)
58
61
  end
59
62
  end
60
63
 
@@ -63,11 +66,17 @@ module RuboCop
63
66
  end
64
67
 
65
68
  def finished(_inspected_files)
69
+ @testsuite.add_attributes('tests' => @inspected_file_count, 'failures' => @offense_count)
66
70
  @document.write(output, 2)
67
71
  end
68
72
 
69
73
  private
70
74
 
75
+ def reset_count
76
+ @inspected_file_count = 0
77
+ @offense_count = 0
78
+ end
79
+
71
80
  def add_failure_to(testcase, offenses, cop_name)
72
81
  # One failure per offense. Zero failures is a passing test case,
73
82
  # for most surefire/nUnit parsers.
@@ -38,9 +38,7 @@ module RuboCop
38
38
  output.puts 'Offenses:'
39
39
  output.puts
40
40
 
41
- @offenses_for_files.each do |file, offenses|
42
- report_file(file, offenses)
43
- end
41
+ @offenses_for_files.each { |file, offenses| report_file(file, offenses) }
44
42
  end
45
43
 
46
44
  report_summary(inspected_files.size,
@@ -37,8 +37,10 @@ module RuboCop
37
37
  end
38
38
 
39
39
  def report_highlighted_area(highlighted_area)
40
- output.puts("# #{' ' * highlighted_area.begin_pos}" \
41
- "#{'^' * highlighted_area.size}")
40
+ space_area = highlighted_area.source_buffer.slice(0...highlighted_area.begin_pos)
41
+ source_area = highlighted_area.source
42
+ output.puts("# #{' ' * Unicode::DisplayWidth.of(space_area)}" \
43
+ "#{'^' * Unicode::DisplayWidth.of(source_area)}")
42
44
  end
43
45
 
44
46
  def report_offense(file, offense)
@@ -47,7 +47,7 @@ module RuboCop
47
47
  end
48
48
 
49
49
  def valid_shareable_constant_value?
50
- %w[none literal experimental_everything experimental_copy].include?(shareable_constant_values)
50
+ %w[none literal experimental_everything experimental_copy].include?(shareable_constant_value)
51
51
  end
52
52
 
53
53
  # Was a magic comment for the frozen string literal found?
@@ -112,9 +112,7 @@ module RuboCop
112
112
  @options.replace(ConfigRegeneration.new.options.merge(@options))
113
113
  end
114
114
 
115
- option(opts, '--exclude-limit COUNT') do
116
- @validator.validate_exclude_limit_option
117
- end
115
+ option(opts, '--exclude-limit COUNT') { @validator.validate_exclude_limit_option }
118
116
 
119
117
  option(opts, '--disable-uncorrectable')
120
118
 
@@ -161,9 +159,7 @@ module RuboCop
161
159
 
162
160
  def add_cache_options(opts)
163
161
  option(opts, '-C', '--cache FLAG')
164
- option(opts, '--cache-root DIR') do
165
- @validator.validate_cache_enabled_for_cache_root
166
- end
162
+ option(opts, '--cache-root DIR') { @validator.validate_cache_enabled_for_cache_root }
167
163
  end
168
164
 
169
165
  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
@@ -173,16 +169,12 @@ module RuboCop
173
169
  option(opts, '-D', '--[no-]display-cop-names')
174
170
  option(opts, '-E', '--extra-details')
175
171
  option(opts, '-S', '--display-style-guide')
176
- option(opts, '-a', '--auto-correct') do
177
- @options[:safe_auto_correct] = true
178
- end
172
+ option(opts, '-a', '--auto-correct') { @options[:safe_auto_correct] = true }
179
173
  option(opts, '--safe-auto-correct') do
180
174
  warn '--safe-auto-correct is deprecated; use --auto-correct'
181
175
  @options[:safe_auto_correct] = @options[:auto_correct] = true
182
176
  end
183
- option(opts, '-A', '--auto-correct-all') do
184
- @options[:auto_correct] = true
185
- end
177
+ option(opts, '-A', '--auto-correct-all') { @options[:auto_correct] = true }
186
178
  option(opts, '--disable-pending-cops')
187
179
  option(opts, '--enable-pending-cops')
188
180
  option(opts, '--ignore-disable-comments')
@@ -194,7 +186,7 @@ module RuboCop
194
186
 
195
187
  option(opts, '-v', '--version')
196
188
  option(opts, '-V', '--verbose-version')
197
- option(opts, '-P', '--parallel')
189
+ option(opts, '-P', '--[no-]parallel')
198
190
  end
199
191
  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
200
192
 
@@ -229,8 +221,7 @@ module RuboCop
229
221
  # e.g. [..., '--auto-correct', ...] to :auto_correct.
230
222
  def long_opt_symbol(args)
231
223
  long_opt = args.find { |arg| arg.start_with?('--') }
232
- long_opt[2..-1].sub('[no-]', '').sub(/ .*/, '')
233
- .tr('-', '_').gsub(/[\[\]]/, '').to_sym
224
+ long_opt[2..-1].sub('[no-]', '').sub(/ .*/, '').tr('-', '_').gsub(/[\[\]]/, '').to_sym
234
225
  end
235
226
 
236
227
  def require_feature(file)
@@ -286,16 +277,13 @@ module RuboCop
286
277
  end
287
278
 
288
279
  def validate_cop_options
289
- %i[only except].each do |opt|
290
- OptionsValidator.validate_cop_list(@options[opt])
291
- end
280
+ %i[only except].each { |opt| OptionsValidator.validate_cop_list(@options[opt]) }
292
281
  end
293
282
 
294
283
  # rubocop:disable Metrics/AbcSize
295
284
  def validate_compatibility # rubocop:disable Metrics/MethodLength
296
285
  if only_includes_redundant_disable?
297
- raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot ' \
298
- 'be used with --only.'
286
+ raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot be used with --only.'
299
287
  end
300
288
  raise OptionArgumentError, 'Syntax checking cannot be turned off.' if except_syntax?
301
289
  unless boolean_or_empty_cache?
@@ -309,12 +297,11 @@ module RuboCop
309
297
  validate_auto_gen_config
310
298
  validate_auto_correct
311
299
  validate_display_only_failed
312
- validate_parallel
300
+ disable_parallel_when_invalid_option_combo
313
301
 
314
302
  return if incompatible_options.size <= 1
315
303
 
316
- raise OptionArgumentError, 'Incompatible cli options: ' \
317
- "#{incompatible_options.inspect}"
304
+ raise OptionArgumentError, "Incompatible cli options: #{incompatible_options.inspect}"
318
305
  end
319
306
  # rubocop:enable Metrics/AbcSize
320
307
 
@@ -326,8 +313,7 @@ module RuboCop
326
313
  %i[exclude_limit offense_counts auto_gen_timestamp
327
314
  auto_gen_only_exclude].each do |option|
328
315
  if @options.key?(option)
329
- raise OptionArgumentError,
330
- format(message, flag: option.to_s.tr('_', '-'))
316
+ raise OptionArgumentError, format(message, flag: option.to_s.tr('_', '-'))
331
317
  end
332
318
  end
333
319
  end
@@ -348,36 +334,32 @@ module RuboCop
348
334
  format('--disable-uncorrectable can only be used together with --auto-correct.')
349
335
  end
350
336
 
351
- def validate_parallel
337
+ def disable_parallel_when_invalid_option_combo
352
338
  return unless @options.key?(:parallel)
353
339
 
354
- if @options[:cache] == 'false'
355
- raise OptionArgumentError, '-P/--parallel uses caching to speed up ' \
356
- 'execution, so combining with --cache ' \
357
- 'false is not allowed.'
340
+ invalid_options = [
341
+ { name: :auto_gen_config, value: true, flag: '--auto-gen-config' },
342
+ { name: :fail_fast, value: true, flag: '-F/--fail-fast.' },
343
+ { name: :auto_correct, value: true, flag: '--auto-correct.' },
344
+ { name: :cache, value: 'false', flag: '--cache false' }
345
+ ]
346
+
347
+ invalid_flags = invalid_options.each_with_object([]) do |option, flags|
348
+ # `>` rather than `>=` because `@options` will also contain `parallel: true`
349
+ flags << option[:flag] if @options > { option[:name] => option[:value] }
358
350
  end
359
351
 
360
- validate_parallel_with_combo_option
361
- end
352
+ return if invalid_flags.empty?
362
353
 
363
- def validate_parallel_with_combo_option
364
- combos = {
365
- auto_gen_config: '-P/--parallel uses caching to speed up execution, ' \
366
- 'while --auto-gen-config needs a non-cached run, ' \
367
- 'so they cannot be combined.',
368
- fail_fast: '-P/--parallel cannot be combined with -F/--fail-fast.',
369
- auto_correct: '-P/--parallel cannot be combined with --auto-correct.'
370
- }
354
+ @options.delete(:parallel)
371
355
 
372
- combos.each do |key, msg|
373
- raise OptionArgumentError, msg if @options.key?(key)
374
- end
356
+ puts '-P/--parallel is being ignored because ' \
357
+ "it is not compatible with #{invalid_flags.join(', ')}"
375
358
  end
376
359
 
377
360
  def only_includes_redundant_disable?
378
361
  @options.key?(:only) &&
379
- (@options[:only] & %w[Lint/RedundantCopDisableDirective
380
- RedundantCopDisableDirective]).any?
362
+ (@options[:only] & %w[Lint/RedundantCopDisableDirective RedundantCopDisableDirective]).any?
381
363
  end
382
364
 
383
365
  def display_only_fail_level_offenses_with_autocorrect?
@@ -385,8 +367,7 @@ module RuboCop
385
367
  end
386
368
 
387
369
  def except_syntax?
388
- @options.key?(:except) &&
389
- (@options[:except] & %w[Lint/Syntax Syntax]).any?
370
+ @options.key?(:except) && (@options[:except] & %w[Lint/Syntax Syntax]).any?
390
371
  end
391
372
 
392
373
  def boolean_or_empty_cache?
@@ -408,8 +389,7 @@ module RuboCop
408
389
  def validate_cache_enabled_for_cache_root
409
390
  return unless @options[:cache] == 'false'
410
391
 
411
- raise OptionArgumentError, '--cache-root can not be used with ' \
412
- '--cache false'
392
+ raise OptionArgumentError, '--cache-root can not be used with --cache false'
413
393
  end
414
394
  end
415
395
 
@@ -512,7 +492,7 @@ module RuboCop
512
492
  version: 'Display version.',
513
493
  verbose_version: 'Display verbose version.',
514
494
  parallel: ['Use available CPUs to execute inspection in',
515
- 'parallel.'],
495
+ 'parallel. Default is false.'],
516
496
  stdin: ['Pipe source from STDIN, using FILE in offense',
517
497
  'reports. This is useful for editor integration.'],
518
498
  init: 'Generate a .rubocop.yml file in the current directory.'