rubocop 0.85.1 → 0.89.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 (357) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -4
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +227 -26
  5. data/lib/rubocop.rb +33 -5
  6. data/lib/rubocop/cli.rb +2 -4
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
  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/init_dotfile.rb +1 -1
  11. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  12. data/lib/rubocop/cli/command/version.rb +2 -2
  13. data/lib/rubocop/comment_config.rb +2 -2
  14. data/lib/rubocop/config.rb +20 -3
  15. data/lib/rubocop/config_loader.rb +40 -68
  16. data/lib/rubocop/config_loader_resolver.rb +4 -4
  17. data/lib/rubocop/config_obsoletion.rb +6 -2
  18. data/lib/rubocop/config_store.rb +4 -0
  19. data/lib/rubocop/config_validator.rb +1 -3
  20. data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
  21. data/lib/rubocop/cop/badge.rb +1 -1
  22. data/lib/rubocop/cop/base.rb +407 -0
  23. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  24. data/lib/rubocop/cop/commissioner.rb +47 -50
  25. data/lib/rubocop/cop/cop.rb +85 -236
  26. data/lib/rubocop/cop/corrector.rb +38 -115
  27. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -3
  28. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  29. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  31. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  32. data/lib/rubocop/cop/force.rb +1 -0
  33. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +39 -13
  34. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  35. data/lib/rubocop/cop/generator.rb +1 -1
  36. data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
  37. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  38. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  39. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  40. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  41. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  42. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  43. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  44. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  45. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  46. data/lib/rubocop/cop/layout/class_structure.rb +2 -37
  47. data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
  48. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  49. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  50. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  51. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
  52. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  53. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  54. data/lib/rubocop/cop/layout/extra_spacing.rb +9 -16
  55. data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
  56. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  57. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  58. data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
  59. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  60. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  61. data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
  62. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  63. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  64. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  65. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  66. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  68. data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
  69. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  70. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
  71. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  73. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  74. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  75. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  76. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  77. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  78. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  79. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  80. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +49 -0
  81. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  82. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  83. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  84. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  85. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  86. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  87. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  88. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  89. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  90. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  91. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  92. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  93. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  94. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  95. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  96. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  97. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  98. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  99. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  100. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  101. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  102. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  103. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  104. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
  105. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
  106. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  107. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  108. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  109. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  110. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  111. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  112. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  113. data/lib/rubocop/cop/lint/loop.rb +23 -2
  114. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  115. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  116. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  117. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  118. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  119. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  120. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  121. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  122. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  123. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  124. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  125. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +61 -0
  126. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  127. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
  128. data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
  129. data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
  130. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  131. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +31 -25
  132. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  133. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  134. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  135. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  136. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  137. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  138. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
  139. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  140. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  141. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  142. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  143. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  144. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  145. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  146. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  147. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  148. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  149. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  150. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  151. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  152. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  153. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  154. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  155. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  156. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  157. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  158. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  159. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  160. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  161. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  162. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  163. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  164. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -31
  165. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  166. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  167. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  168. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  169. data/lib/rubocop/cop/lint/void.rb +3 -7
  170. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  171. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  172. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  173. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  174. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
  175. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  176. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  177. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  178. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  179. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
  180. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  181. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  182. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  183. data/lib/rubocop/cop/migration/department_name.rb +13 -15
  184. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  185. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  186. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  187. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  188. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  189. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  190. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  191. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  192. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  193. data/lib/rubocop/cop/mixin/enforce_superclass.rb +5 -1
  194. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  195. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  196. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  197. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  198. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  199. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  200. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  201. data/lib/rubocop/cop/mixin/range_help.rb +1 -1
  202. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
  203. data/lib/rubocop/cop/mixin/statement_modifier.rb +38 -9
  204. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  205. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
  206. data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
  207. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
  208. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  209. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  210. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  211. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  212. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
  213. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  214. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  215. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  216. data/lib/rubocop/cop/naming/file_name.rb +4 -6
  217. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  218. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
  219. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  220. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  221. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  222. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  223. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  224. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  225. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  226. data/lib/rubocop/cop/offense.rb +16 -2
  227. data/lib/rubocop/cop/registry.rb +3 -3
  228. data/lib/rubocop/cop/security/eval.rb +2 -2
  229. data/lib/rubocop/cop/security/json_load.rb +6 -8
  230. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  231. data/lib/rubocop/cop/security/open.rb +2 -2
  232. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  233. data/lib/rubocop/cop/style/access_modifier_declarations.rb +11 -1
  234. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  235. data/lib/rubocop/cop/style/alias.rb +7 -3
  236. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  237. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +3 -2
  238. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  239. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +144 -0
  240. data/lib/rubocop/cop/style/block_delimiters.rb +2 -4
  241. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  242. data/lib/rubocop/cop/style/case_like_if.rb +217 -0
  243. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  244. data/lib/rubocop/cop/style/class_vars.rb +21 -0
  245. data/lib/rubocop/cop/style/colon_method_call.rb +3 -3
  246. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  247. data/lib/rubocop/cop/style/commented_keyword.rb +5 -2
  248. data/lib/rubocop/cop/style/conditional_assignment.rb +11 -2
  249. data/lib/rubocop/cop/style/copyright.rb +3 -3
  250. data/lib/rubocop/cop/style/date_time.rb +1 -1
  251. data/lib/rubocop/cop/style/dir.rb +2 -2
  252. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
  253. data/lib/rubocop/cop/style/documentation.rb +6 -6
  254. data/lib/rubocop/cop/style/each_with_object.rb +0 -2
  255. data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
  256. data/lib/rubocop/cop/style/empty_literal.rb +5 -5
  257. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  258. data/lib/rubocop/cop/style/encoding.rb +1 -1
  259. data/lib/rubocop/cop/style/eval_with_location.rb +4 -0
  260. data/lib/rubocop/cop/style/expand_path_arguments.rb +6 -2
  261. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  262. data/lib/rubocop/cop/style/exponential_notation.rb +8 -10
  263. data/lib/rubocop/cop/style/float_division.rb +7 -10
  264. data/lib/rubocop/cop/style/format_string.rb +4 -0
  265. data/lib/rubocop/cop/style/format_string_token.rb +6 -5
  266. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  267. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  268. data/lib/rubocop/cop/style/guard_clause.rb +2 -2
  269. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  270. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  271. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  272. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  273. data/lib/rubocop/cop/style/if_unless_modifier.rb +8 -28
  274. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -0
  275. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  276. data/lib/rubocop/cop/style/inverse_methods.rb +3 -4
  277. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  278. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +5 -0
  279. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -1
  280. data/lib/rubocop/cop/style/missing_else.rb +1 -11
  281. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +9 -2
  282. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  283. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  284. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  285. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  286. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  287. data/lib/rubocop/cop/style/mutable_constant.rb +4 -4
  288. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -5
  289. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  290. data/lib/rubocop/cop/style/next.rb +2 -2
  291. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  292. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  293. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  294. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  295. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  296. data/lib/rubocop/cop/style/proc.rb +1 -1
  297. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  298. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  299. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  300. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  301. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  302. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  303. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  304. data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
  305. data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
  306. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
  307. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
  308. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  309. data/lib/rubocop/cop/style/redundant_sort.rb +28 -12
  310. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  311. data/lib/rubocop/cop/style/sample.rb +1 -1
  312. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  313. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  314. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  315. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  316. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  317. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  318. data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
  319. data/lib/rubocop/cop/style/symbol_array.rb +6 -6
  320. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  321. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  322. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  323. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  324. data/lib/rubocop/cop/style/word_array.rb +1 -1
  325. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  326. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  327. data/lib/rubocop/cop/team.rb +98 -82
  328. data/lib/rubocop/cop/tokens_util.rb +84 -0
  329. data/lib/rubocop/cop/util.rb +3 -15
  330. data/lib/rubocop/cop/utils/format_string.rb +2 -3
  331. data/lib/rubocop/cop/variable_force.rb +0 -2
  332. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  333. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  334. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  335. data/lib/rubocop/error.rb +1 -0
  336. data/lib/rubocop/file_finder.rb +12 -12
  337. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  338. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  339. data/lib/rubocop/name_similarity.rb +7 -3
  340. data/lib/rubocop/options.rb +15 -8
  341. data/lib/rubocop/path_util.rb +19 -19
  342. data/lib/rubocop/platform.rb +1 -1
  343. data/lib/rubocop/rake_task.rb +7 -9
  344. data/lib/rubocop/result_cache.rb +12 -8
  345. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  346. data/lib/rubocop/rspec/expect_offense.rb +63 -22
  347. data/lib/rubocop/rspec/shared_contexts.rb +19 -16
  348. data/lib/rubocop/runner.rb +34 -33
  349. data/lib/rubocop/target_finder.rb +14 -11
  350. data/lib/rubocop/target_ruby.rb +2 -2
  351. data/lib/rubocop/version.rb +2 -2
  352. metadata +49 -11
  353. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  354. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  355. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  356. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  357. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -21,14 +21,16 @@ module RuboCop
21
21
  # # good
22
22
  # def attribute
23
23
  # end
24
- class AccessorMethodName < Cop
24
+ class AccessorMethodName < Base
25
25
  MSG_READER = 'Do not prefix reader method names with `get_`.'
26
26
  MSG_WRITER = 'Do not prefix writer method names with `set_`.'
27
27
 
28
28
  def on_def(node)
29
29
  return unless bad_reader_name?(node) || bad_writer_name?(node)
30
30
 
31
- add_offense(node, location: :name)
31
+ message = message(node)
32
+
33
+ add_offense(node.loc.name, message: message)
32
34
  end
33
35
  alias on_defs on_def
34
36
 
@@ -5,7 +5,9 @@
5
5
  module RuboCop
6
6
  module Cop
7
7
  module Naming
8
- # This cop checks for non-ascii characters in identifier names.
8
+ # This cop checks for non-ascii characters in identifier and constant names.
9
+ # Identifiers are always checked and whether constants are checked
10
+ # can be controlled using AsciiConstants config.
9
11
  #
10
12
  # @example
11
13
  # # bad
@@ -36,21 +38,42 @@ module RuboCop
36
38
  # # good
37
39
  # params[:width_gteq]
38
40
  #
39
- class AsciiIdentifiers < Cop
41
+ # @example AsciiConstants: true (default)
42
+ # # bad
43
+ # class Foö
44
+ # end
45
+ #
46
+ # FOÖ = "foo"
47
+ #
48
+ # @example AsciiConstants: false
49
+ # # good
50
+ # class Foö
51
+ # end
52
+ #
53
+ # FOÖ = "foo"
54
+ #
55
+ class AsciiIdentifiers < Base
40
56
  include RangeHelp
41
57
 
42
- MSG = 'Use only ascii symbols in identifiers.'
58
+ IDENTIFIER_MSG = 'Use only ascii symbols in identifiers.'
59
+ CONSTANT_MSG = 'Use only ascii symbols in constants.'
43
60
 
44
- def investigate(processed_source)
61
+ def on_new_investigation
45
62
  processed_source.each_token do |token|
46
- next unless token.type == :tIDENTIFIER && !token.text.ascii_only?
63
+ next if !should_check?(token) || token.text.ascii_only?
47
64
 
48
- add_offense(token, location: first_offense_range(token))
65
+ message = token.type == :tIDENTIFIER ? IDENTIFIER_MSG : CONSTANT_MSG
66
+ add_offense(first_offense_range(token), message: message)
49
67
  end
50
68
  end
51
69
 
52
70
  private
53
71
 
72
+ def should_check?(token)
73
+ token.type == :tIDENTIFIER ||
74
+ (token.type == :tCONSTANT && cop_config['AsciiConstants'])
75
+ end
76
+
54
77
  def first_offense_range(identifier)
55
78
  expression = identifier.pos
56
79
  first_offense = first_non_ascii_chars(identifier.text)
@@ -13,12 +13,12 @@ module RuboCop
13
13
  #
14
14
  # # good
15
15
  # def +(other); end
16
- class BinaryOperatorParameterName < Cop
16
+ class BinaryOperatorParameterName < Base
17
17
  MSG = 'When defining the `%<opr>s` operator, ' \
18
18
  'name its argument `other`.'
19
19
 
20
20
  OP_LIKE_METHODS = %i[eql? equal?].freeze
21
- BLACKLISTED = %i[+@ -@ [] []= << === `].freeze
21
+ EXCLUDED = %i[+@ -@ [] []= << === `].freeze
22
22
 
23
23
  def_node_matcher :op_method_candidate?, <<~PATTERN
24
24
  (def [#op_method? $_] (args $(arg [!:other !:_other])) _)
@@ -33,9 +33,9 @@ module RuboCop
33
33
  private
34
34
 
35
35
  def op_method?(name)
36
- return false if BLACKLISTED.include?(name)
36
+ return false if EXCLUDED.include?(name)
37
37
 
38
- name !~ /\A\w/ || OP_LIKE_METHODS.include?(name)
38
+ !/\A\w/.match?(name) || OP_LIKE_METHODS.include?(name)
39
39
  end
40
40
  end
41
41
  end
@@ -35,7 +35,7 @@ module RuboCop
35
35
  # foo { |speed, distance| speed * distance }
36
36
  #
37
37
  # baz { |age, height, gender| do_stuff(age, height, gender) }
38
- class BlockParameterName < Cop
38
+ class BlockParameterName < Base
39
39
  include UncommunicativeName
40
40
 
41
41
  def on_block(node)
@@ -26,7 +26,7 @@ module RuboCop
26
26
  # end
27
27
  # class module_parent::MyModule
28
28
  # end
29
- class ClassAndModuleCamelCase < Cop
29
+ class ClassAndModuleCamelCase < Base
30
30
  MSG = 'Use CamelCase for classes and modules.'
31
31
 
32
32
  def on_class(node)
@@ -34,7 +34,7 @@ module RuboCop
34
34
  name = node.loc.name.source.gsub(allowed, '')
35
35
  return unless /_/.match?(name)
36
36
 
37
- add_offense(node, location: :name)
37
+ add_offense(node.loc.name)
38
38
  end
39
39
  alias on_module on_class
40
40
  end
@@ -17,7 +17,7 @@ module RuboCop
17
17
  #
18
18
  # # good
19
19
  # INCH_IN_CM = 2.54
20
- class ConstantName < Cop
20
+ class ConstantName < Base
21
21
  MSG = 'Use SCREAMING_SNAKE_CASE for constants.'
22
22
  # Use POSIX character classes, so we allow accented characters rather
23
23
  # than just standard ASCII characters
@@ -47,7 +47,7 @@ module RuboCop
47
47
  return if allowed_assignment?(value)
48
48
  return if SNAKE_CASE.match?(const_name)
49
49
 
50
- add_offense(node, location: :name)
50
+ add_offense(node.loc.name)
51
51
  end
52
52
 
53
53
  private
@@ -24,7 +24,7 @@ module RuboCop
24
24
  # lib/layout_manager.rb
25
25
  #
26
26
  # anything/using_snake_case.rake
27
- class FileName < Cop
27
+ class FileName < Base
28
28
  include RangeHelp
29
29
 
30
30
  MSG_SNAKE_CASE = 'The name of this source file (`%<basename>s`) ' \
@@ -35,13 +35,13 @@ module RuboCop
35
35
 
36
36
  SNAKE_CASE = /^[\da-z_.?!]+$/.freeze
37
37
 
38
- def investigate(processed_source)
38
+ def on_new_investigation
39
39
  file_path = processed_source.file_path
40
40
  return if config.file_to_exclude?(file_path) ||
41
41
  config.allowed_camel_case_file?(file_path)
42
42
 
43
43
  for_bad_filename(file_path) do |range, msg|
44
- add_offense(nil, location: range, message: msg)
44
+ add_offense(range, message: msg)
45
45
  end
46
46
  end
47
47
 
@@ -123,10 +123,9 @@ module RuboCop
123
123
  # special handling for Action Pack Variants file names like
124
124
  # some_file.xlsx+mobile.axlsx
125
125
  basename = basename.sub('+', '_')
126
- basename =~ (regex || SNAKE_CASE)
126
+ basename.match?(regex || SNAKE_CASE)
127
127
  end
128
128
 
129
- # rubocop:disable Metrics/CyclomaticComplexity
130
129
  def find_class_or_module(node, namespace)
131
130
  return nil unless node
132
131
 
@@ -145,7 +144,6 @@ module RuboCop
145
144
 
146
145
  nil
147
146
  end
148
- # rubocop:enable Metrics/CyclomaticComplexity
149
147
 
150
148
  def match_namespace(node, namespace, expected)
151
149
  match_partial = partial_matcher!(expected)
@@ -27,7 +27,7 @@ module RuboCop
27
27
  # <<-sql
28
28
  # SELECT * FROM foo
29
29
  # sql
30
- class HeredocDelimiterCase < Cop
30
+ class HeredocDelimiterCase < Base
31
31
  include Heredoc
32
32
  include ConfigurableEnforcedStyle
33
33
 
@@ -36,7 +36,7 @@ module RuboCop
36
36
  def on_heredoc(node)
37
37
  return if correct_case_delimiters?(node)
38
38
 
39
- add_offense(node, location: :heredoc_end)
39
+ add_offense(node.loc.heredoc_end)
40
40
  end
41
41
 
42
42
  private
@@ -23,7 +23,7 @@ module RuboCop
23
23
  # <<-EOS
24
24
  # SELECT * FROM foo
25
25
  # EOS
26
- class HeredocDelimiterNaming < Cop
26
+ class HeredocDelimiterNaming < Base
27
27
  include Heredoc
28
28
 
29
29
  MSG = 'Use meaningful heredoc delimiters.'
@@ -31,7 +31,7 @@ module RuboCop
31
31
  def on_heredoc(node)
32
32
  return if meaningful_delimiters?(node)
33
33
 
34
- add_offense(node, location: :heredoc_end)
34
+ add_offense(node.loc.heredoc_end)
35
35
  end
36
36
 
37
37
  private
@@ -42,7 +42,7 @@ module RuboCop
42
42
  return false unless /\w/.match?(delimiters)
43
43
 
44
44
  forbidden_delimiters.none? do |forbidden_delimiter|
45
- delimiters =~ Regexp.new(forbidden_delimiter)
45
+ Regexp.new(forbidden_delimiter).match?(delimiters)
46
46
  end
47
47
  end
48
48
 
@@ -84,7 +84,7 @@ module RuboCop
84
84
  # def _foo
85
85
  # @_foo ||= calculate_expensive_thing
86
86
  # end
87
- class MemoizedInstanceVariableName < Cop
87
+ class MemoizedInstanceVariableName < Base
88
88
  include ConfigurableEnforcedStyle
89
89
 
90
90
  MSG = 'Memoized variable `%<var>s` does not match ' \
@@ -115,7 +115,7 @@ module RuboCop
115
115
  suggested_var: suggested_var(method_name),
116
116
  method: method_name
117
117
  )
118
- add_offense(node, location: ivar_assign.source_range, message: msg)
118
+ add_offense(ivar_assign.source_range, message: msg)
119
119
  end
120
120
  alias on_defs on_def
121
121
 
@@ -28,7 +28,7 @@ module RuboCop
28
28
  #
29
29
  # # good
30
30
  # def fooBar; end
31
- class MethodName < Cop
31
+ class MethodName < Base
32
32
  include ConfigurableNaming
33
33
  include IgnoredPattern
34
34
  include RangeHelp
@@ -43,13 +43,13 @@ module RuboCop
43
43
  # def baz(age_a, height_b, gender_c)
44
44
  # do_stuff(age_a, height_b, gender_c)
45
45
  # end
46
- class MethodParameterName < Cop
46
+ class MethodParameterName < Base
47
47
  include UncommunicativeName
48
48
 
49
49
  def on_def(node)
50
50
  return unless node.arguments?
51
51
 
52
- check(node, node.arguments.reject(&:forward_args_type?))
52
+ check(node, node.arguments)
53
53
  end
54
54
  alias on_defs on_def
55
55
  end
@@ -27,7 +27,9 @@ module RuboCop
27
27
  # # good
28
28
  # def value?
29
29
  # end
30
- class PredicateName < Cop
30
+ class PredicateName < Base
31
+ include AllowedMethods
32
+
31
33
  def_node_matcher :dynamic_method_define, <<~PATTERN
32
34
  (send nil? #method_definition_macros
33
35
  (sym $_)
@@ -40,8 +42,7 @@ module RuboCop
40
42
  next if allowed_method_name?(method_name.to_s, prefix)
41
43
 
42
44
  add_offense(
43
- node,
44
- location: node.first_argument.loc.expression,
45
+ node.first_argument.loc.expression,
45
46
  message: message(method_name,
46
47
  expected_name(method_name.to_s, prefix))
47
48
  )
@@ -56,8 +57,7 @@ module RuboCop
56
57
  next if allowed_method_name?(method_name, prefix)
57
58
 
58
59
  add_offense(
59
- node,
60
- location: :name,
60
+ node.loc.name,
61
61
  message: message(method_name, expected_name(method_name, prefix))
62
62
  )
63
63
  end
@@ -70,7 +70,7 @@ module RuboCop
70
70
  !method_name.match?(/^#{prefix}[^0-9]/) ||
71
71
  method_name == expected_name(method_name, prefix) ||
72
72
  method_name.end_with?('=') ||
73
- allowed_methods.include?(method_name)
73
+ allowed_method?(method_name)
74
74
  end
75
75
 
76
76
  def expected_name(method_name, prefix)
@@ -95,10 +95,6 @@ module RuboCop
95
95
  cop_config['NamePrefix']
96
96
  end
97
97
 
98
- def allowed_methods
99
- cop_config['AllowedMethods']
100
- end
101
-
102
98
  def method_definition_macros(macro_name)
103
99
  cop_config['MethodDefinitionMacros'].include?(macro_name.to_s)
104
100
  end
@@ -53,22 +53,23 @@ module RuboCop
53
53
  # # do something
54
54
  # end
55
55
  #
56
- class RescuedExceptionsVariableName < Cop
56
+ class RescuedExceptionsVariableName < Base
57
+ extend AutoCorrector
58
+
57
59
  MSG = 'Use `%<preferred>s` instead of `%<bad>s`.'
58
60
 
59
61
  def on_resbody(node)
60
- name = variable_name(node)
61
- return unless name
62
- return if preferred_name(name).to_sym == name
62
+ offending_name = variable_name(node)
63
+ return unless offending_name
63
64
 
64
- add_offense(node, location: offense_range(node))
65
- end
65
+ preferred_name = preferred_name(offending_name)
66
+ return if preferred_name.to_sym == offending_name
67
+
68
+ range = offense_range(node)
69
+ message = message(node)
66
70
 
67
- def autocorrect(node)
68
- lambda do |corrector|
69
- offending_name = variable_name(node)
70
- preferred_name = preferred_name(offending_name)
71
- corrector.replace(offense_range(node), preferred_name)
71
+ add_offense(range, message: message) do |corrector|
72
+ corrector.replace(range, preferred_name)
72
73
 
73
74
  node.body&.each_descendant(:lvar) do |var|
74
75
  next unless var.children.first == offending_name
@@ -19,7 +19,7 @@ module RuboCop
19
19
  #
20
20
  # # good
21
21
  # fooBar = 1
22
- class VariableName < Cop
22
+ class VariableName < Base
23
23
  include ConfigurableNaming
24
24
 
25
25
  MSG = 'Use %<style>s for variable names.'
@@ -37,7 +37,7 @@ module RuboCop
37
37
  # variableone = 1
38
38
  #
39
39
  # variable_one = 1
40
- class VariableNumber < Cop
40
+ class VariableNumber < Base
41
41
  include ConfigurableNumbering
42
42
 
43
43
  MSG = 'Use %<style>s for variable numbers.'
@@ -54,14 +54,28 @@ module RuboCop
54
54
  # @api private
55
55
  attr_reader :status
56
56
 
57
+ # @api public
58
+ #
59
+ # @!attribute [r] corrector
60
+ #
61
+ # @return [Corrector | nil]
62
+ # the autocorrection for this offense, or `nil` when not available
63
+ attr_reader :corrector
64
+
65
+ PseudoSourceRange = Struct.new(:line, :column, :source_line, :begin_pos,
66
+ :end_pos)
67
+
68
+ NO_LOCATION = PseudoSourceRange.new(1, 0, '', 0, 1).freeze
69
+
57
70
  # @api private
58
- def initialize(severity, location, message, cop_name,
59
- status = :uncorrected)
71
+ def initialize(severity, location, message, cop_name, # rubocop:disable Metrics/ParameterLists
72
+ status = :uncorrected, corrector = nil)
60
73
  @severity = RuboCop::Cop::Severity.new(severity)
61
74
  @location = location
62
75
  @message = message.freeze
63
76
  @cop_name = cop_name.freeze
64
77
  @status = status
78
+ @corrector = corrector
65
79
  freeze
66
80
  end
67
81
 
@@ -100,9 +100,9 @@ module RuboCop
100
100
  # @note Emits a warning if the provided name has an incorrect namespace
101
101
  #
102
102
  # @return [String] Qualified cop name
103
- def qualified_cop_name(name, path, shall_warn = true)
103
+ def qualified_cop_name(name, path, warn: true)
104
104
  badge = Badge.parse(name)
105
- print_warning(name, path) if shall_warn && department_missing?(badge, name)
105
+ print_warning(name, path) if warn && department_missing?(badge, name)
106
106
  return name if registered?(badge)
107
107
 
108
108
  potential_badges = qualify_badge(badge)
@@ -149,7 +149,7 @@ module RuboCop
149
149
  @registry.size
150
150
  end
151
151
 
152
- def enabled(config, only = [], only_safe = false)
152
+ def enabled(config, only = [], only_safe: false)
153
153
  select do |cop|
154
154
  only.include?(cop.cop_name) || enabled?(cop, config, only_safe)
155
155
  end
@@ -11,7 +11,7 @@ module RuboCop
11
11
  #
12
12
  # eval(something)
13
13
  # binding.eval(something)
14
- class Eval < Cop
14
+ class Eval < Base
15
15
  MSG = 'The use of `eval` is a serious security risk.'
16
16
 
17
17
  def_node_matcher :eval?, <<~PATTERN
@@ -22,7 +22,7 @@ module RuboCop
22
22
  eval?(node) do |code|
23
23
  return if code.dstr_type? && code.recursive_literal?
24
24
 
25
- add_offense(node, location: :selector)
25
+ add_offense(node.loc.selector)
26
26
  end
27
27
  end
28
28
  end