rubocop 0.87.1 → 0.89.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +153 -22
  5. data/lib/rubocop.rb +22 -4
  6. data/lib/rubocop/cli.rb +2 -2
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +3 -3
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  10. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  11. data/lib/rubocop/cli/command/version.rb +2 -2
  12. data/lib/rubocop/comment_config.rb +5 -7
  13. data/lib/rubocop/config.rb +20 -3
  14. data/lib/rubocop/config_loader.rb +22 -9
  15. data/lib/rubocop/config_loader_resolver.rb +3 -3
  16. data/lib/rubocop/config_obsoletion.rb +6 -1
  17. data/lib/rubocop/config_store.rb +4 -0
  18. data/lib/rubocop/config_validator.rb +2 -4
  19. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +14 -6
  22. data/lib/rubocop/cop/commissioner.rb +0 -1
  23. data/lib/rubocop/cop/cop.rb +1 -1
  24. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  25. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  26. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  27. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  28. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  29. data/lib/rubocop/cop/force.rb +1 -0
  30. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  31. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  32. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  33. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  34. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  35. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  36. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  37. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  38. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  39. data/lib/rubocop/cop/layout/class_structure.rb +3 -7
  40. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  41. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  42. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  43. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  44. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  45. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  46. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  47. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  48. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  49. data/lib/rubocop/cop/layout/multiline_block_layout.rb +16 -5
  50. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  51. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  52. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  53. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  54. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  55. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  56. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  57. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  58. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  59. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  60. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  61. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  62. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  63. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  64. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  65. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  66. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  67. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  68. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  69. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  70. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  71. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  72. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  73. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  74. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  75. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  76. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  77. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  78. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  79. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  80. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  81. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  82. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  83. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  84. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  85. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  86. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  87. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  88. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  89. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  90. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  91. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  92. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  93. data/lib/rubocop/cop/lint/loop.rb +23 -2
  94. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  95. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  96. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  97. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  98. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  99. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  100. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  101. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +82 -11
  102. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  103. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  104. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  105. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  106. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  107. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  108. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  109. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  110. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  111. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  112. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  113. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  114. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  115. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  116. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  117. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  118. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  119. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  120. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  121. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  122. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  123. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  124. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  125. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  126. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  127. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  128. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  129. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  130. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  131. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  132. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  133. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  134. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  135. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  136. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  137. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  138. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  139. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  140. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  141. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  142. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  143. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  144. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  145. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  146. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  147. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  148. data/lib/rubocop/cop/lint/void.rb +3 -7
  149. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  150. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  151. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  152. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  153. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  154. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  155. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  156. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  157. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  158. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  159. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
  160. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  161. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  162. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  163. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  164. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  165. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  166. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  167. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  168. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  169. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  170. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  171. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  172. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  173. data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
  174. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  175. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  176. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  177. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  178. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  179. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  180. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  181. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  182. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  183. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  184. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  185. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  186. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  187. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  188. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  189. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  190. data/lib/rubocop/cop/registry.rb +3 -3
  191. data/lib/rubocop/cop/security/eval.rb +2 -2
  192. data/lib/rubocop/cop/security/json_load.rb +6 -8
  193. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  194. data/lib/rubocop/cop/security/open.rb +2 -2
  195. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  196. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  197. data/lib/rubocop/cop/style/accessor_grouping.rb +29 -20
  198. data/lib/rubocop/cop/style/alias.rb +41 -36
  199. data/lib/rubocop/cop/style/and_or.rb +9 -11
  200. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  201. data/lib/rubocop/cop/style/array_join.rb +6 -8
  202. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  203. data/lib/rubocop/cop/style/attr.rb +11 -9
  204. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  205. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  206. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  207. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +14 -18
  208. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  209. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  210. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  211. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  212. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  213. data/lib/rubocop/cop/style/class_check.rb +7 -9
  214. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  215. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  216. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  217. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  218. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  219. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  220. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  221. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  222. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  223. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  224. data/lib/rubocop/cop/style/copyright.rb +12 -12
  225. data/lib/rubocop/cop/style/date_time.rb +1 -1
  226. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  227. data/lib/rubocop/cop/style/dir.rb +7 -10
  228. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  229. data/lib/rubocop/cop/style/documentation.rb +6 -8
  230. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  231. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  232. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  233. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  234. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  235. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  236. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  237. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  238. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  239. data/lib/rubocop/cop/style/encoding.rb +5 -9
  240. data/lib/rubocop/cop/style/end_block.rb +4 -6
  241. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  242. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  243. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  244. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  245. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  246. data/lib/rubocop/cop/style/float_division.rb +8 -11
  247. data/lib/rubocop/cop/style/for.rb +11 -15
  248. data/lib/rubocop/cop/style/format_string.rb +21 -19
  249. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  250. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  251. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  252. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  253. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  254. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  255. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  256. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  257. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  258. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  259. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  260. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  261. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  262. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  263. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  264. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  265. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  266. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  267. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  268. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  269. data/lib/rubocop/cop/style/lambda.rb +7 -12
  270. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  271. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  272. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  273. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  274. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  275. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  276. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  277. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  278. data/lib/rubocop/cop/style/min_max.rb +8 -12
  279. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  280. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  281. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  282. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  283. data/lib/rubocop/cop/style/module_function.rb +10 -13
  284. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  285. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  286. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  287. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  288. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  289. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  290. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  291. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  292. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
  293. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  294. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  295. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  296. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  297. data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
  298. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  299. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  300. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  301. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
  302. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  303. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  304. data/lib/rubocop/cop/style/signal_exception.rb +2 -0
  305. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  306. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  307. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  308. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  309. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  310. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  311. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  312. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  313. data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
  314. data/lib/rubocop/cop/team.rb +1 -1
  315. data/lib/rubocop/cop/tokens_util.rb +84 -0
  316. data/lib/rubocop/cop/util.rb +3 -13
  317. data/lib/rubocop/cop/variable_force.rb +0 -2
  318. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  319. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  320. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  321. data/lib/rubocop/error.rb +1 -0
  322. data/lib/rubocop/file_finder.rb +12 -12
  323. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  324. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  325. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  326. data/lib/rubocop/options.rb +3 -3
  327. data/lib/rubocop/path_util.rb +17 -17
  328. data/lib/rubocop/rake_task.rb +1 -0
  329. data/lib/rubocop/result_cache.rb +12 -8
  330. data/lib/rubocop/rspec/expect_offense.rb +31 -5
  331. data/lib/rubocop/rspec/shared_contexts.rb +13 -14
  332. data/lib/rubocop/runner.rb +6 -7
  333. data/lib/rubocop/target_finder.rb +13 -10
  334. data/lib/rubocop/version.rb +2 -2
  335. metadata +28 -8
  336. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  337. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  338. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  339. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -75,7 +75,7 @@ module RuboCop
75
75
 
76
76
  def validate_options_vs_config
77
77
  if @options[:parallel] &&
78
- !@config_store.for_dir(Dir.pwd).for_all_cops['UseCache']
78
+ !@config_store.for_pwd.for_all_cops['UseCache']
79
79
  raise OptionArgumentError, '-P/--parallel uses caching to speed up ' \
80
80
  'execution, so combining with AllCops: ' \
81
81
  'UseCache: false is not allowed.'
@@ -121,7 +121,7 @@ module RuboCop
121
121
  if @options[:auto_gen_config]
122
122
  formatter = 'autogenconf'
123
123
  else
124
- cfg = @config_store.for_dir(Dir.pwd).for_all_cops
124
+ cfg = @config_store.for_pwd.for_all_cops
125
125
  formatter = cfg['DefaultFormatter'] || 'progress'
126
126
  end
127
127
  [[formatter, @options[:output_path]]]
@@ -27,10 +27,10 @@ module RuboCop
27
27
  private
28
28
 
29
29
  def maybe_run_line_length_cop
30
- if !line_length_enabled?(@config_store.for_dir(Dir.pwd))
30
+ if !line_length_enabled?(@config_store.for_pwd)
31
31
  skip_line_length_cop(PHASE_1_DISABLED)
32
32
  elsif !same_max_line_length?(
33
- @config_store.for_dir(Dir.pwd), ConfigLoader.default_configuration
33
+ @config_store.for_pwd, ConfigLoader.default_configuration
34
34
  )
35
35
  skip_line_length_cop(PHASE_1_OVERRIDDEN)
36
36
  else
@@ -113,7 +113,7 @@ module RuboCop
113
113
  return if files.include?(AUTO_GENERATED_FILE)
114
114
 
115
115
  files.unshift(AUTO_GENERATED_FILE)
116
- file_string = "\n - " + files.join("\n - ") if files.size > 1
116
+ file_string = "\n - #{files.join("\n - ")}" if files.size > 1
117
117
  rubocop_yml_contents = existing_configuration(config_file)
118
118
  end
119
119
 
@@ -13,6 +13,7 @@ module RuboCop
13
13
  attr_accessor :command_name
14
14
 
15
15
  def inherited(subclass)
16
+ super
16
17
  @subclasses << subclass
17
18
  end
18
19
 
@@ -55,7 +55,7 @@ module RuboCop
55
55
  #{Gem.loaded_specs['rubocop'].metadata['bug_tracker_uri']}
56
56
 
57
57
  Mention the following information in the issue report:
58
- #{RuboCop::Version.version(true)}
58
+ #{RuboCop::Version.version(debug: true)}
59
59
  WARNING
60
60
  end
61
61
 
@@ -22,7 +22,7 @@ module RuboCop
22
22
  private
23
23
 
24
24
  def print_available_cops
25
- registry = Cop::Cop.registry
25
+ registry = Cop::Registry.global
26
26
  show_all = @options[:show_cops].empty?
27
27
 
28
28
  if show_all
@@ -68,7 +68,7 @@ module RuboCop
68
68
 
69
69
  def config_lines(cop)
70
70
  cnf = @config.for_cop(cop)
71
- cnf.to_yaml.lines.to_a.drop(1).map { |line| ' ' + line }
71
+ cnf.to_yaml.lines.to_a.drop(1).map { |line| " #{line}" }
72
72
  end
73
73
  end
74
74
  end
@@ -8,8 +8,8 @@ module RuboCop
8
8
  self.command_name = :version
9
9
 
10
10
  def run
11
- puts RuboCop::Version.version(false) if @options[:version]
12
- puts RuboCop::Version.version(true) if @options[:verbose_version]
11
+ puts RuboCop::Version.version(debug: false) if @options[:version]
12
+ puts RuboCop::Version.version(debug: true) if @options[:verbose_version]
13
13
  end
14
14
  end
15
15
  end
@@ -11,7 +11,7 @@ module RuboCop
11
11
  COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
12
12
 
13
13
  COMMENT_DIRECTIVE_REGEXP = Regexp.new(
14
- ('# rubocop : ((?:disable|enable|todo))\b ' + COPS_PATTERN)
14
+ "# rubocop : ((?:disable|enable|todo))\\b #{COPS_PATTERN}"
15
15
  .gsub(' ', '\s*')
16
16
  )
17
17
 
@@ -55,7 +55,7 @@ module RuboCop
55
55
  extras
56
56
  end
57
57
 
58
- def analyze
58
+ def analyze # rubocop:todo Metrics/AbcSize
59
59
  analyses = Hash.new { |hash, key| hash[key] = CopAnalysis.new([], nil) }
60
60
 
61
61
  each_mentioned_cop do |cop_name, disabled, line, single_line|
@@ -128,9 +128,7 @@ module RuboCop
128
128
  end
129
129
 
130
130
  def each_directive
131
- return if processed_source.comments.nil?
132
-
133
- processed_source.each_comment do |comment|
131
+ processed_source.comments.each do |comment|
134
132
  directive = directive_parts(comment)
135
133
  next unless directive
136
134
 
@@ -153,11 +151,11 @@ module RuboCop
153
151
  end
154
152
 
155
153
  def qualified_cop_name(cop_name)
156
- Cop::Cop.qualified_cop_name(cop_name.strip, processed_source.file_path)
154
+ Cop::Registry.qualified_cop_name(cop_name.strip, processed_source.file_path)
157
155
  end
158
156
 
159
157
  def all_cop_names
160
- @all_cop_names ||= Cop::Cop.registry.names - [REDUNDANT_DISABLE]
158
+ @all_cop_names ||= Cop::Registry.global.names - [REDUNDANT_DISABLE]
161
159
  end
162
160
 
163
161
  def comment_only_line?(line_number)
@@ -24,7 +24,7 @@ module RuboCop
24
24
  def initialize(hash = {}, loaded_path = nil)
25
25
  @loaded_path = loaded_path
26
26
  @for_cop = Hash.new do |h, cop|
27
- qualified_cop_name = Cop::Cop.qualified_cop_name(cop, loaded_path)
27
+ qualified_cop_name = Cop::Registry.qualified_cop_name(cop, loaded_path)
28
28
  cop_options = self[qualified_cop_name] || {}
29
29
  cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
30
30
  h[cop] = cop_options
@@ -47,7 +47,7 @@ module RuboCop
47
47
  end
48
48
 
49
49
  def_delegators :@hash, :[], :[]=, :delete, :each, :key?, :keys, :each_key,
50
- :map, :merge, :to_h, :to_hash, :transform_values
50
+ :fetch, :map, :merge, :to_h, :to_hash, :transform_values
51
51
  def_delegators :@validator, :validate, :target_ruby_version
52
52
 
53
53
  def to_s
@@ -104,12 +104,29 @@ module RuboCop
104
104
  end
105
105
  end
106
106
 
107
+ # @return [Config] for the given cop / cop name.
108
+ # Note: the 'Enabled' attribute is calculated according to the department's
109
+ # and 'AllCops' configuration; other attributes are not inherited.
107
110
  def for_cop(cop)
108
111
  @for_cop[cop.respond_to?(:cop_name) ? cop.cop_name : cop]
109
112
  end
110
113
 
114
+ # @return [Config] for the given cop merged with that of its department (if any)
115
+ # Note: the 'Enabled' attribute is same as that returned by `for_cop`
116
+ def for_badge(badge)
117
+ cop_config = for_cop(badge.to_s)
118
+ fetch(badge.department.to_s) { return cop_config }
119
+ .merge(cop_config)
120
+ end
121
+
122
+ # @return [Config] for the given department name.
123
+ # Note: the 'Enabled' attribute will be present only if specified
124
+ # at the department's level
111
125
  def for_department(department_name)
112
- @for_cop[department_name]
126
+ @for_department ||= Hash.new do |h, dept|
127
+ h[dept] = self[dept] || {}
128
+ end
129
+ @for_department[department_name.to_s]
113
130
  end
114
131
 
115
132
  def for_all_cops
@@ -24,7 +24,7 @@ module RuboCop
24
24
 
25
25
  attr_accessor :debug, :ignore_parent_exclusion,
26
26
  :disable_pending_cops, :enable_pending_cops
27
- attr_writer :default_configuration
27
+ attr_writer :default_configuration, :project_root
28
28
 
29
29
  alias debug? debug
30
30
  alias ignore_parent_exclusion? ignore_parent_exclusion
@@ -34,7 +34,7 @@ module RuboCop
34
34
  FileFinder.root_level = nil
35
35
  end
36
36
 
37
- def load_file(file) # rubocop:disable Metrics/AbcSize
37
+ def load_file(file)
38
38
  path = File.absolute_path(file.is_a?(RemoteConfig) ? file.file : file)
39
39
 
40
40
  hash = load_yaml_configuration(path)
@@ -73,7 +73,7 @@ module RuboCop
73
73
  # `can't add a new key into hash during iteration` error
74
74
  hash_keys = hash.keys
75
75
  hash_keys.each do |key|
76
- q = Cop::Cop.qualified_cop_name(key, path)
76
+ q = Cop::Registry.qualified_cop_name(key, path)
77
77
  next if q == key
78
78
 
79
79
  hash[q] = hash.delete(key)
@@ -118,14 +118,13 @@ module RuboCop
118
118
  end
119
119
 
120
120
  def add_excludes_from_files(config, config_file)
121
- found_files = find_files_upwards(DOTFILE, config_file)
121
+ exclusion_file = find_last_file_upwards(DOTFILE, config_file, project_root)
122
122
 
123
- return if found_files.empty?
124
- return if PathUtil.relative_path(found_files.last) ==
125
- PathUtil.relative_path(config_file)
123
+ return unless exclusion_file
124
+ return if PathUtil.relative_path(exclusion_file) == PathUtil.relative_path(config_file)
126
125
 
127
126
  print 'AllCops/Exclude ' if debug?
128
- config.add_excludes_from_higher_level(load_file(found_files.last))
127
+ config.add_excludes_from_higher_level(load_file(exclusion_file))
129
128
  end
130
129
 
131
130
  def default_configuration
@@ -135,6 +134,12 @@ module RuboCop
135
134
  end
136
135
  end
137
136
 
137
+ # Returns the path rubocop inferred as the root of the project. No file
138
+ # searches will go past this directory.
139
+ def project_root
140
+ @project_root ||= find_project_root
141
+ end
142
+
138
143
  def warn_on_pending_cops(pending_cops)
139
144
  return if pending_cops.empty?
140
145
 
@@ -159,7 +164,15 @@ module RuboCop
159
164
  private
160
165
 
161
166
  def find_project_dotfile(target_dir)
162
- find_file_upwards(DOTFILE, target_dir)
167
+ find_file_upwards(DOTFILE, target_dir, project_root)
168
+ end
169
+
170
+ def find_project_root
171
+ pwd = Dir.pwd
172
+ gems_file = find_last_file_upwards('Gemfile', pwd) || find_last_file_upwards('gems.rb', pwd)
173
+ return unless gems_file
174
+
175
+ File.dirname(gems_file)
163
176
  end
164
177
 
165
178
  def find_user_dotfile
@@ -201,7 +201,7 @@ module RuboCop
201
201
  next unless dept_params['Enabled']
202
202
 
203
203
  new_default_configuration.each do |cop, params|
204
- next unless cop.start_with?(dept + '/')
204
+ next unless cop.start_with?("#{dept}/")
205
205
 
206
206
  # Retain original default configuration for cops in the department.
207
207
  params['Enabled'] = ConfigLoader.default_configuration[cop]['Enabled']
@@ -213,8 +213,8 @@ module RuboCop
213
213
  end
214
214
  end
215
215
 
216
- def transform(config)
217
- config.transform_values { |params| yield(params) }
216
+ def transform(config, &block)
217
+ config.transform_values(&block)
218
218
  end
219
219
 
220
220
  def gem_config_path(gem_name, relative_config_path)
@@ -84,7 +84,12 @@ module RuboCop
84
84
  'Lint/InvalidCharacterLiteral' => 'it was never being actually triggered',
85
85
  'Lint/SpaceBeforeFirstArg' =>
86
86
  'it was a duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
87
- '`Layout/SpaceBeforeFirstArg` instead'
87
+ '`Layout/SpaceBeforeFirstArg` instead',
88
+ 'Style/MethodMissingSuper' => 'it has been superseded by `Lint/MissingSuper`. Please use ' \
89
+ '`Lint/MissingSuper` instead',
90
+ 'Lint/UselessComparison' => 'it has been superseded by '\
91
+ '`Lint/BinaryOperatorWithIdenticalOperands`. Please use '\
92
+ '`Lint/BinaryOperatorWithIdenticalOperands` instead'
88
93
  }.map do |cop_name, reason|
89
94
  [cop_name, "The `#{cop_name}` cop has been removed since #{reason}."]
90
95
  end
@@ -33,6 +33,10 @@ module RuboCop
33
33
  for_dir(File.dirname(file))
34
34
  end
35
35
 
36
+ def for_pwd
37
+ for_dir(Dir.pwd)
38
+ end
39
+
36
40
  # If type (file/dir) is known beforehand,
37
41
  # prefer using #for_file or #for_dir for improved performance
38
42
  def for(file_or_dir)
@@ -23,7 +23,6 @@ module RuboCop
23
23
  @target_ruby = TargetRuby.new(config)
24
24
  end
25
25
 
26
- # rubocop:disable Metrics/AbcSize
27
26
  def validate
28
27
  check_cop_config_value(@config)
29
28
  reject_conflicting_safe_settings
@@ -45,7 +44,6 @@ module RuboCop
45
44
  validate_syntax_cop
46
45
  reject_mutually_exclusive_defaults
47
46
  end
48
- # rubocop:enable Metrics/AbcSize
49
47
 
50
48
  def target_ruby_version
51
49
  target_ruby.version
@@ -86,7 +84,7 @@ module RuboCop
86
84
  unknown_cops = []
87
85
  invalid_cop_names.each do |name|
88
86
  # There could be a custom cop with this name. If so, don't warn
89
- next if Cop::Cop.registry.contains_cop_matching?([name])
87
+ next if Cop::Registry.global.contains_cop_matching?([name])
90
88
 
91
89
  # Special case for inherit_mode, which is a directive that we keep in
92
90
  # the configuration (even though it's not a cop), because it's easier
@@ -150,7 +148,7 @@ module RuboCop
150
148
  end
151
149
  end
152
150
 
153
- def validate_enforced_styles(valid_cop_names)
151
+ def validate_enforced_styles(valid_cop_names) # rubocop:todo Metrics/AbcSize
154
152
  valid_cop_names.each do |name|
155
153
  styles = @config[name].select { |key, _| key.start_with?('Enforced') }
156
154
 
@@ -73,7 +73,7 @@ module RuboCop
73
73
  end
74
74
 
75
75
  def max_line_length
76
- config.for_cop('Layout/LineLength')['Max'] || 80
76
+ config.for_cop('Layout/LineLength')['Max'] || 120
77
77
  end
78
78
 
79
79
  def disable_offense_at_end_of_line(range, eol_comment)
@@ -58,7 +58,7 @@ module RuboCop
58
58
  end
59
59
 
60
60
  def to_s
61
- qualified? ? "#{department}/#{cop_name}" : cop_name
61
+ @to_s ||= qualified? ? "#{department}/#{cop_name}" : cop_name
62
62
  end
63
63
 
64
64
  def qualified?
@@ -105,7 +105,7 @@ module RuboCop
105
105
  # If message is not specified, the method `message` will be called.
106
106
  def add_offense(node_or_range, message: nil, severity: nil, &block)
107
107
  range = range_from_node_or_range(node_or_range)
108
- return unless @current_offense_locations.add?(range)
108
+ return unless current_offense_locations.add?(range)
109
109
 
110
110
  range_to_pass = callback_argument(range)
111
111
 
@@ -137,6 +137,7 @@ module RuboCop
137
137
  end
138
138
 
139
139
  def self.inherited(subclass)
140
+ super
140
141
  Registry.global.enlist(subclass)
141
142
  end
142
143
 
@@ -189,8 +190,7 @@ module RuboCop
189
190
  def cop_config
190
191
  # Use department configuration as basis, but let individual cop
191
192
  # configuration override.
192
- @cop_config ||= @config.for_cop(self.class.department.to_s)
193
- .merge(@config.for_cop(self))
193
+ @cop_config ||= @config.for_badge(self.class.badge)
194
194
  end
195
195
 
196
196
  def config_to_allow_offenses
@@ -271,11 +271,19 @@ module RuboCop
271
271
 
272
272
  ### Reserved for Commissioner:
273
273
 
274
+ def current_offense_locations
275
+ @current_offense_locations ||= Set.new
276
+ end
277
+
278
+ def currently_disabled_lines
279
+ @currently_disabled_lines ||= Set.new
280
+ end
281
+
274
282
  # Called before any investigation
275
283
  def begin_investigation(processed_source)
276
284
  @current_offenses = []
277
- @current_offense_locations = Set[]
278
- @currently_disabled_lines = Set[]
285
+ @current_offense_locations = nil
286
+ @currently_disabled_lines = nil
279
287
  @processed_source = processed_source
280
288
  @current_corrector = Corrector.new(@processed_source) if @processed_source.valid_syntax?
281
289
  end
@@ -327,7 +335,7 @@ module RuboCop
327
335
 
328
336
  def disable_uncorrectable(range)
329
337
  line = range.line
330
- return unless @currently_disabled_lines.add?(line)
338
+ return unless currently_disabled_lines.add?(line)
331
339
 
332
340
  disable_offense(range)
333
341
  end
@@ -95,7 +95,6 @@ module RuboCop
95
95
 
96
96
  def reset
97
97
  @errors = []
98
- @callbacks = {}
99
98
  end
100
99
 
101
100
  def invoke(callback, cops, *args)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'uri'
4
- require_relative 'legacy/corrections_proxy.rb'
4
+ require_relative 'legacy/corrections_proxy'
5
5
 
6
6
  module RuboCop
7
7
  module Cop
@@ -16,7 +16,7 @@ module RuboCop
16
16
  processed_source:)
17
17
  @processed_source = processed_source
18
18
  range = first_part_of(node.to_a.last)
19
- eol_comment = end_of_line_comment(node.source_range.line)
19
+ eol_comment = processed_source.comment_at_line(node.source_range.line)
20
20
 
21
21
  break_line_before(range: range, node: node, corrector: corrector,
22
22
  configured_width: configured_width)
@@ -29,8 +29,8 @@ module RuboCop
29
29
  configured_width:)
30
30
  corrector.insert_before(
31
31
  range,
32
- "\n" + ' ' * (node.loc.keyword.column +
33
- indent_steps * configured_width)
32
+ "\n#{' ' * (node.loc.keyword.column +
33
+ indent_steps * configured_width)}"
34
34
  )
35
35
  end
36
36
 
@@ -39,7 +39,7 @@ module RuboCop
39
39
 
40
40
  text = eol_comment.loc.expression.source
41
41
  corrector.insert_before(node,
42
- text + "\n" + (' ' * node.loc.keyword.column))
42
+ "#{text}\n#{' ' * node.loc.keyword.column}")
43
43
  corrector.remove(eol_comment)
44
44
  end
45
45