rubocop 0.86.0 → 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 (377) 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 +198 -25
  5. data/lib/rubocop.rb +30 -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/show_cops.rb +3 -3
  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 +41 -69
  15. data/lib/rubocop/config_loader_resolver.rb +3 -3
  16. data/lib/rubocop/config_obsoletion.rb +6 -2
  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 +14 -24
  20. data/lib/rubocop/cop/badge.rb +1 -1
  21. data/lib/rubocop/cop/base.rb +407 -0
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
  23. data/lib/rubocop/cop/commissioner.rb +47 -50
  24. data/lib/rubocop/cop/cop.rb +85 -236
  25. data/lib/rubocop/cop/corrector.rb +38 -115
  26. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  30. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  31. data/lib/rubocop/cop/force.rb +1 -0
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
  34. data/lib/rubocop/cop/generator.rb +1 -1
  35. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  36. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  44. data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
  45. data/lib/rubocop/cop/layout/class_structure.rb +5 -44
  46. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  47. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  49. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -8
  50. data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
  51. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  52. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -0
  53. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  54. data/lib/rubocop/cop/layout/hash_alignment.rb +1 -2
  55. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  56. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  58. data/lib/rubocop/cop/layout/multiline_block_layout.rb +16 -6
  59. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  60. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  61. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
  62. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  63. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +3 -2
  64. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  65. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  66. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  67. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  68. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  69. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  70. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  71. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  72. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  73. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  74. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  75. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  76. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  77. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  78. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  79. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  80. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  81. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  82. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  83. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  84. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  85. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  86. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  87. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  88. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  89. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  90. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  91. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  92. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  93. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  94. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  95. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  96. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  97. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  98. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  99. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  100. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  101. data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
  102. data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
  103. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  104. data/lib/rubocop/cop/lint/loop.rb +23 -2
  105. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  106. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  107. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  108. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  109. data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
  110. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  111. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  112. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
  113. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  114. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  115. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  116. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
  117. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
  118. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  119. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  120. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  121. data/lib/rubocop/cop/lint/rand_one.rb +3 -3
  122. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +41 -40
  123. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  124. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  125. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
  126. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  127. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  128. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  129. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  130. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  131. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  132. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  133. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  134. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  135. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  136. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
  137. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  138. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  139. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  140. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  141. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  142. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  143. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  144. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  145. data/lib/rubocop/cop/lint/syntax.rb +11 -26
  146. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  147. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  148. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  149. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  150. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  151. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  152. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  153. data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
  154. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  155. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  156. data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
  157. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  158. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  159. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  160. data/lib/rubocop/cop/lint/void.rb +3 -7
  161. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  162. data/lib/rubocop/cop/metrics/block_length.rb +24 -2
  163. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  164. data/lib/rubocop/cop/metrics/class_length.rb +26 -3
  165. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  166. data/lib/rubocop/cop/metrics/method_length.rb +25 -2
  167. data/lib/rubocop/cop/metrics/module_length.rb +26 -3
  168. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  169. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  170. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  171. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
  172. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  173. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  174. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  175. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  176. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  177. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  178. data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
  179. data/lib/rubocop/cop/mixin/code_length.rb +26 -5
  180. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  181. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
  182. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  183. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  184. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  185. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  186. data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
  187. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
  188. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  189. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  190. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  191. data/lib/rubocop/cop/mixin/surrounding_space.rb +4 -24
  192. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  193. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +10 -15
  194. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  195. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  196. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  197. data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
  198. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +3 -3
  199. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  200. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  201. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  202. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  203. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  204. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  205. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  206. data/lib/rubocop/cop/naming/method_name.rb +1 -1
  207. data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
  208. data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
  209. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  210. data/lib/rubocop/cop/naming/variable_name.rb +1 -1
  211. data/lib/rubocop/cop/naming/variable_number.rb +1 -1
  212. data/lib/rubocop/cop/offense.rb +16 -2
  213. data/lib/rubocop/cop/registry.rb +3 -3
  214. data/lib/rubocop/cop/security/eval.rb +2 -2
  215. data/lib/rubocop/cop/security/json_load.rb +6 -8
  216. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  217. data/lib/rubocop/cop/security/open.rb +2 -2
  218. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  219. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  220. data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
  221. data/lib/rubocop/cop/style/alias.rb +41 -36
  222. data/lib/rubocop/cop/style/and_or.rb +9 -11
  223. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  224. data/lib/rubocop/cop/style/array_join.rb +6 -8
  225. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  226. data/lib/rubocop/cop/style/attr.rb +11 -9
  227. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  228. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  229. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  230. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
  231. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  232. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  233. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  234. data/lib/rubocop/cop/style/case_like_if.rb +220 -0
  235. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  236. data/lib/rubocop/cop/style/class_check.rb +7 -9
  237. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  238. data/lib/rubocop/cop/style/class_vars.rb +24 -7
  239. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  240. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  241. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  242. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  243. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  244. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  245. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  246. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  247. data/lib/rubocop/cop/style/copyright.rb +12 -12
  248. data/lib/rubocop/cop/style/date_time.rb +2 -2
  249. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  250. data/lib/rubocop/cop/style/dir.rb +9 -12
  251. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  252. data/lib/rubocop/cop/style/documentation.rb +6 -8
  253. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  254. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  255. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  256. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  257. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  258. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  259. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  260. data/lib/rubocop/cop/style/empty_literal.rb +20 -21
  261. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  262. data/lib/rubocop/cop/style/encoding.rb +5 -9
  263. data/lib/rubocop/cop/style/end_block.rb +4 -6
  264. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  265. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  266. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
  267. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  268. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  269. data/lib/rubocop/cop/style/float_division.rb +8 -11
  270. data/lib/rubocop/cop/style/for.rb +11 -15
  271. data/lib/rubocop/cop/style/format_string.rb +21 -19
  272. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  273. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  274. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  275. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  276. data/lib/rubocop/cop/style/guard_clause.rb +5 -6
  277. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  278. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  279. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  280. data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
  281. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  282. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  283. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  284. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  285. data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
  286. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
  287. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  288. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  289. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  290. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  291. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  292. data/lib/rubocop/cop/style/lambda.rb +7 -12
  293. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  294. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  295. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  296. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  297. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  298. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  299. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  300. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  301. data/lib/rubocop/cop/style/min_max.rb +8 -12
  302. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  303. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  304. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  305. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  306. data/lib/rubocop/cop/style/module_function.rb +10 -13
  307. data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
  308. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  309. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  310. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  311. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  312. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  313. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  314. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  315. data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
  316. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
  317. data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
  318. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  319. data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
  320. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  321. data/lib/rubocop/cop/style/proc.rb +1 -1
  322. data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
  323. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  324. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  325. data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
  326. data/lib/rubocop/cop/style/redundant_fetch_block.rb +26 -7
  327. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  328. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  329. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -1
  330. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -1
  331. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +11 -11
  332. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  333. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
  334. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  335. data/lib/rubocop/cop/style/signal_exception.rb +3 -1
  336. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  337. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  338. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
  339. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  340. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  341. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  342. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  343. data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
  344. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  345. data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
  346. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
  347. data/lib/rubocop/cop/team.rb +98 -82
  348. data/lib/rubocop/cop/tokens_util.rb +84 -0
  349. data/lib/rubocop/cop/util.rb +3 -13
  350. data/lib/rubocop/cop/utils/format_string.rb +1 -2
  351. data/lib/rubocop/cop/variable_force.rb +0 -2
  352. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  353. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  354. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  355. data/lib/rubocop/error.rb +1 -0
  356. data/lib/rubocop/file_finder.rb +12 -12
  357. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  358. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  359. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  360. data/lib/rubocop/name_similarity.rb +1 -3
  361. data/lib/rubocop/options.rb +18 -11
  362. data/lib/rubocop/path_util.rb +17 -17
  363. data/lib/rubocop/rake_task.rb +7 -9
  364. data/lib/rubocop/result_cache.rb +12 -8
  365. data/lib/rubocop/rspec/cop_helper.rb +4 -4
  366. data/lib/rubocop/rspec/expect_offense.rb +53 -22
  367. data/lib/rubocop/rspec/shared_contexts.rb +16 -17
  368. data/lib/rubocop/runner.rb +35 -34
  369. data/lib/rubocop/target_finder.rb +13 -10
  370. data/lib/rubocop/target_ruby.rb +1 -1
  371. data/lib/rubocop/version.rb +2 -2
  372. metadata +40 -11
  373. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  374. data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
  375. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  376. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
  377. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -52,15 +52,20 @@ module RuboCop
52
52
  # foo
53
53
  # end
54
54
  #
55
- class UnusedBlockArgument < Cop
55
+ class UnusedBlockArgument < Base
56
56
  include UnusedArgument
57
+ extend AutoCorrector
57
58
 
58
- def autocorrect(node)
59
- UnusedArgCorrector.correct(processed_source, node)
59
+ def self.joining_forces
60
+ VariableForce
60
61
  end
61
62
 
62
63
  private
63
64
 
65
+ def autocorrect(corrector, node)
66
+ UnusedArgCorrector.correct(corrector, processed_source, node)
67
+ end
68
+
64
69
  def check_argument(variable)
65
70
  return if allowed_block?(variable) ||
66
71
  allowed_keyword_argument?(variable)
@@ -58,20 +58,25 @@ module RuboCop
58
58
  # fail "TODO"
59
59
  # end
60
60
  #
61
- class UnusedMethodArgument < Cop
61
+ class UnusedMethodArgument < Base
62
62
  include UnusedArgument
63
+ extend AutoCorrector
63
64
 
64
65
  def_node_matcher :not_implemented?, <<~PATTERN
65
- {(send nil? :raise (const nil? :NotImplementedError))
66
+ {(send nil? :raise (const {nil? cbase} :NotImplementedError))
66
67
  (send nil? :fail ...)}
67
68
  PATTERN
68
69
 
69
- def autocorrect(node)
70
- UnusedArgCorrector.correct(processed_source, node)
70
+ def self.joining_forces
71
+ VariableForce
71
72
  end
72
73
 
73
74
  private
74
75
 
76
+ def autocorrect(corrector, node)
77
+ UnusedArgCorrector.correct(corrector, processed_source, node)
78
+ end
79
+
75
80
  def check_argument(variable)
76
81
  return unless variable.method_argument?
77
82
  return if variable.keyword_argument? &&
@@ -29,7 +29,7 @@ module RuboCop
29
29
  # CGI.unescape(enc_uri)
30
30
  # URI.decode_www_form(enc_uri)
31
31
  # URI.decode_www_form_component(enc_uri)
32
- class UriEscapeUnescape < Cop
32
+ class UriEscapeUnescape < Base
33
33
  ALTERNATE_METHODS_OF_URI_ESCAPE = %w[
34
34
  CGI.escape
35
35
  URI.encode_www_form
@@ -13,60 +13,24 @@ module RuboCop
13
13
  # # good
14
14
  # URI::DEFAULT_PARSER.make_regexp('http://example.com')
15
15
  #
16
- class UriRegexp < Cop
17
- MSG = '`%<top_level>sURI.regexp%<arg>s` is obsolete and should not ' \
18
- 'be used. Instead, use `%<top_level>sURI::DEFAULT_PARSER.' \
19
- 'make_regexp%<arg>s`.'
16
+ class UriRegexp < Base
17
+ extend AutoCorrector
20
18
 
21
- def_node_matcher :uri_regexp_with_argument?, <<~PATTERN
22
- (send
23
- (const ${nil? cbase} :URI) :regexp
24
- ${(str _) (array ...)})
25
- PATTERN
26
-
27
- def_node_matcher :uri_regexp_without_argument?, <<~PATTERN
28
- (send
29
- (const ${nil? cbase} :URI) :regexp)
30
- PATTERN
19
+ MSG = '`%<current>s` is obsolete and should not be used. Instead, use `%<preferred>s`.'
20
+ URI_CONSTANTS = ['URI', '::URI'].freeze
31
21
 
32
22
  def on_send(node)
33
- uri_regexp_with_argument?(node) do |double_colon, arg|
34
- register_offense(
35
- node, top_level: double_colon ? '::' : '', arg: "(#{arg.source})"
36
- )
37
- end
38
-
39
- uri_regexp_without_argument?(node) do |double_colon|
40
- register_offense(node, top_level: double_colon ? '::' : '')
41
- end
42
- end
43
-
44
- def autocorrect(node)
45
- lambda do |corrector|
46
- if (captured_values = uri_regexp_with_argument?(node))
47
- else
48
- captured_values = uri_regexp_without_argument?(node)
49
- end
23
+ return unless node.method?(:regexp) && node.receiver
24
+ return unless URI_CONSTANTS.include?(node.receiver.source)
50
25
 
51
- double_colon, arg = captured_values
26
+ argument = node.first_argument ? "(#{node.first_argument.source})" : ''
27
+ preferred_method = "#{node.receiver.source}::DEFAULT_PARSER.make_regexp#{argument}"
28
+ message = format(MSG, current: node.source, preferred: preferred_method)
52
29
 
53
- top_level = double_colon ? '::' : ''
54
- argument = arg ? "(#{arg.source})" : ''
55
-
56
- corrector.replace(
57
- node,
58
- "#{top_level}URI::DEFAULT_PARSER.make_regexp#{argument}"
59
- )
30
+ add_offense(node.loc.selector, message: message) do |corrector|
31
+ corrector.replace(node, preferred_method)
60
32
  end
61
33
  end
62
-
63
- private
64
-
65
- def register_offense(node, top_level: '', arg: '')
66
- format = format(MSG, top_level: top_level, arg: arg)
67
-
68
- add_offense(node, location: :selector, message: format)
69
- end
70
34
  end
71
35
  end
72
36
  end
@@ -124,8 +124,9 @@ module RuboCop
124
124
  #
125
125
  # delegate :method_a, to: :method_b
126
126
  # end
127
- class UselessAccessModifier < Cop
127
+ class UselessAccessModifier < Base
128
128
  include RangeHelp
129
+ extend AutoCorrector
129
130
 
130
131
  MSG = 'Useless `%<current>s` access modifier.'
131
132
 
@@ -147,17 +148,13 @@ module RuboCop
147
148
  check_node(node.children[1]) # singleton class body
148
149
  end
149
150
 
150
- def autocorrect(node)
151
- lambda do |corrector|
152
- range = range_by_whole_lines(
153
- node.source_range, include_final_newline: true
154
- )
151
+ private
155
152
 
156
- corrector.remove(range)
157
- end
158
- end
153
+ def autocorrect(corrector, node)
154
+ range = range_by_whole_lines(node.source_range, include_final_newline: true)
159
155
 
160
- private
156
+ corrector.remove(range)
157
+ end
161
158
 
162
159
  def_node_matcher :static_method_definition?, <<~PATTERN
163
160
  {def (send nil? {:attr :attr_reader :attr_writer :attr_accessor} ...)}
@@ -172,7 +169,7 @@ module RuboCop
172
169
  PATTERN
173
170
 
174
171
  def_node_matcher :class_or_module_or_struct_new_call?, <<~PATTERN
175
- (block (send (const nil? {:Class :Module :Struct}) :new ...) ...)
172
+ (block (send (const {nil? cbase} {:Class :Module :Struct}) :new ...) ...)
176
173
  PATTERN
177
174
 
178
175
  def check_node(node)
@@ -181,7 +178,9 @@ module RuboCop
181
178
  if node.begin_type?
182
179
  check_scope(node)
183
180
  elsif node.send_type? && node.bare_access_modifier?
184
- add_offense(node, message: format(MSG, current: node.method_name))
181
+ add_offense(node, message: format(MSG, current: node.method_name)) do |corrector|
182
+ autocorrect(corrector, node)
183
+ end
185
184
  end
186
185
  end
187
186
 
@@ -192,8 +191,11 @@ module RuboCop
192
191
 
193
192
  def check_scope(node)
194
193
  cur_vis, unused = check_child_nodes(node, nil, :public)
194
+ return unless unused
195
195
 
196
- add_offense(unused, message: format(MSG, current: cur_vis)) if unused
196
+ add_offense(unused, message: format(MSG, current: cur_vis)) do |corrector|
197
+ autocorrect(corrector, unused)
198
+ end
197
199
  end
198
200
 
199
201
  def check_child_nodes(node, unused, cur_vis)
@@ -216,7 +218,9 @@ module RuboCop
216
218
  if node.bare_access_modifier?
217
219
  check_new_visibility(node, unused, node.method_name, cur_vis)
218
220
  elsif node.method?(:private_class_method) && !node.arguments?
219
- add_offense(node, message: format(MSG, current: node.method_name))
221
+ add_offense(node, message: format(MSG, current: node.method_name)) do |corrector|
222
+ autocorrect(corrector, node)
223
+ end
220
224
  [cur_vis, unused]
221
225
  end
222
226
  end
@@ -224,10 +228,16 @@ module RuboCop
224
228
  def check_new_visibility(node, unused, new_vis, cur_vis)
225
229
  # does this modifier just repeat the existing visibility?
226
230
  if new_vis == cur_vis
227
- add_offense(node, message: format(MSG, current: cur_vis))
231
+ add_offense(node, message: format(MSG, current: cur_vis)) do |corrector|
232
+ autocorrect(corrector, node)
233
+ end
228
234
  else
229
235
  # was the previous modifier never applied to any defs?
230
- add_offense(unused, message: format(MSG, current: cur_vis)) if unused
236
+ if unused
237
+ add_offense(unused, message: format(MSG, current: cur_vis)) do |corrector|
238
+ autocorrect(corrector, unused)
239
+ end
240
+ end
231
241
  # once we have already warned about a certain modifier, don't
232
242
  # warn again even if it is never applied to any method defs
233
243
  unused = node
@@ -30,11 +30,11 @@ module RuboCop
30
30
  # some_var = 1
31
31
  # do_something(some_var)
32
32
  # end
33
- class UselessAssignment < Cop
33
+ class UselessAssignment < Base
34
34
  MSG = 'Useless assignment to variable - `%<variable>s`.'
35
35
 
36
- def join_force?(force_class)
37
- force_class == VariableForce
36
+ def self.joining_forces
37
+ VariableForce
38
38
  end
39
39
 
40
40
  def after_leaving_scope(scope, _variable_table)
@@ -57,7 +57,7 @@ module RuboCop
57
57
  assignment.node.loc.name
58
58
  end
59
59
 
60
- add_offense(nil, location: location, message: message)
60
+ add_offense(location, message: message)
61
61
  end
62
62
  end
63
63
 
@@ -29,24 +29,15 @@ module RuboCop
29
29
  # else
30
30
  # do_something_else
31
31
  # end
32
- class UselessElseWithoutRescue < Cop
33
- include ParserDiagnostic
34
-
32
+ class UselessElseWithoutRescue < Base
35
33
  MSG = '`else` without `rescue` is useless.'
36
34
 
37
- private
38
-
39
- def relevant_diagnostic?(diagnostic)
40
- diagnostic.reason == :useless_else
41
- end
42
-
43
- def find_offense_node_by(diagnostic)
44
- # TODO: When implementing auto-correction, this method should return
45
- # an offense node passed as first argument of `add_offense` method.
46
- end
35
+ def on_new_investigation
36
+ processed_source.diagnostics.each do |diagnostic|
37
+ next unless diagnostic.reason == :useless_else
47
38
 
48
- def alternative_message(_diagnostic)
49
- MSG
39
+ add_offense(diagnostic.location, severity: diagnostic.level)
40
+ end
50
41
  end
51
42
  end
52
43
  end
@@ -28,7 +28,7 @@ module RuboCop
28
28
  # x.attr = 5
29
29
  # x
30
30
  # end
31
- class UselessSetterCall < Cop
31
+ class UselessSetterCall < Base
32
32
  MSG = 'Useless setter call to local variable `%<variable>s`.'
33
33
  ASSIGNMENT_TYPES = %i[lvasgn ivasgn cvasgn gvasgn].freeze
34
34
 
@@ -43,11 +43,9 @@ module RuboCop
43
43
  variable_name, = *receiver
44
44
  return unless tracker.contain_local_object?(variable_name)
45
45
 
46
- add_offense(
47
- receiver,
48
- location: :name,
49
- message: format(MSG, variable: receiver.loc.name.source)
50
- )
46
+ loc_name = receiver.loc.name
47
+
48
+ add_offense(loc_name, message: format(MSG, variable: loc_name.source))
51
49
  end
52
50
  alias on_defs on_def
53
51
 
@@ -40,7 +40,7 @@ module RuboCop
40
40
  # some_array.sort!
41
41
  # do_something(some_array)
42
42
  # end
43
- class Void < Cop
43
+ class Void < Base
44
44
  OP_MSG = 'Operator `%<op>s` used in void context.'
45
45
  VAR_MSG = 'Variable `%<var>s` used in void context.'
46
46
  LIT_MSG = 'Literal `%<lit>s` used in void context.'
@@ -97,17 +97,13 @@ module RuboCop
97
97
  def check_void_op(node)
98
98
  return unless node.send_type? && OPERATORS.include?(node.method_name)
99
99
 
100
- add_offense(node,
101
- location: :selector,
102
- message: format(OP_MSG, op: node.method_name))
100
+ add_offense(node.loc.selector, message: format(OP_MSG, op: node.method_name))
103
101
  end
104
102
 
105
103
  def check_var(node)
106
104
  return unless node.variable? || node.const_type?
107
105
 
108
- add_offense(node,
109
- location: :name,
110
- message: format(VAR_MSG, var: node.loc.name.source))
106
+ add_offense(node.loc.name, message: format(VAR_MSG, var: node.loc.name.source))
111
107
  end
112
108
 
113
109
  def check_literal(node)
@@ -7,7 +7,7 @@ module RuboCop
7
7
  # configured maximum. The ABC size is based on assignments, branches
8
8
  # (method calls), and conditions. See http://c2.com/cgi/wiki?AbcMetric
9
9
  # and https://en.wikipedia.org/wiki/ABC_Software_Metric.
10
- class AbcSize < Cop
10
+ class AbcSize < Base
11
11
  include MethodComplexity
12
12
 
13
13
  MSG = 'Assignment Branch Condition size for %<method>s is too high. ' \
@@ -7,8 +7,30 @@ module RuboCop
7
7
  # Comment lines can optionally be ignored.
8
8
  # The maximum allowed length is configurable.
9
9
  # The cop can be configured to ignore blocks passed to certain methods.
10
- class BlockLength < Cop
11
- include TooManyLines
10
+ #
11
+ # You can set literals you want to fold with `CountAsOne`.
12
+ # Available are: 'array', 'hash', and 'heredoc'. Each literal
13
+ # will be counted as one line regardless of its actual size.
14
+ #
15
+ # @example CountAsOne: ['array', 'heredoc']
16
+ #
17
+ # something do
18
+ # array = [ # +1
19
+ # 1,
20
+ # 2
21
+ # ]
22
+ #
23
+ # hash = { # +3
24
+ # key: 'value'
25
+ # }
26
+ #
27
+ # msg = <<~HEREDOC # +1
28
+ # Heredoc
29
+ # content.
30
+ # HEREDOC
31
+ # end # 5 points
32
+ class BlockLength < Base
33
+ include CodeLength
12
34
 
13
35
  LABEL = 'Block'
14
36
 
@@ -11,7 +11,7 @@ module RuboCop
11
11
  # towards the nesting level. Set to `true` to count blocks as well.
12
12
  #
13
13
  # The maximum level of nesting allowed is configurable.
14
- class BlockNesting < Cop
14
+ class BlockNesting < Base
15
15
  include ConfigurableMax
16
16
 
17
17
  NESTING_BLOCKS = %i[
@@ -19,7 +19,7 @@ module RuboCop
19
19
  until until_post for resbody
20
20
  ].freeze
21
21
 
22
- def investigate(processed_source)
22
+ def on_new_investigation
23
23
  return if processed_source.blank?
24
24
 
25
25
  max = cop_config['Max']
@@ -6,8 +6,31 @@ module RuboCop
6
6
  # This cop checks if the length a class exceeds some maximum value.
7
7
  # Comment lines can optionally be ignored.
8
8
  # The maximum allowed length is configurable.
9
- class ClassLength < Cop
10
- include ClassishLength
9
+ #
10
+ # You can set literals you want to fold with `CountAsOne`.
11
+ # Available are: 'array', 'hash', and 'heredoc'. Each literal
12
+ # will be counted as one line regardless of its actual size.
13
+ #
14
+ # @example CountAsOne: ['array', 'heredoc']
15
+ #
16
+ # class Foo
17
+ # ARRAY = [ # +1
18
+ # 1,
19
+ # 2
20
+ # ]
21
+ #
22
+ # HASH = { # +3
23
+ # key: 'value'
24
+ # }
25
+ #
26
+ # MSG = <<~HEREDOC # +1
27
+ # Heredoc
28
+ # content.
29
+ # HEREDOC
30
+ # end # 5 points
31
+ #
32
+ class ClassLength < Base
33
+ include CodeLength
11
34
 
12
35
  def on_class(node)
13
36
  check_code_length(node)
@@ -22,7 +45,7 @@ module RuboCop
22
45
  private
23
46
 
24
47
  def_node_matcher :class_definition?, <<~PATTERN
25
- (casgn nil? _ (block (send (const nil? :Class) :new) ...))
48
+ (casgn nil? _ (block (send (const {nil? cbase} :Class) :new) ...))
26
49
  PATTERN
27
50
 
28
51
  def message(length, max_length)
@@ -29,7 +29,7 @@ module RuboCop
29
29
  #
30
30
  # self
31
31
  # end # total: 6
32
- class CyclomaticComplexity < Cop
32
+ class CyclomaticComplexity < Base
33
33
  include MethodComplexity
34
34
  include Utils::IteratingBlock
35
35
 
@@ -42,6 +42,7 @@ module RuboCop
42
42
 
43
43
  def complexity_score_for(node)
44
44
  return 0 if iterating_block?(node) == false
45
+ return 0 if node.csend_type? && discount_for_repeated_csend?(node)
45
46
 
46
47
  1
47
48
  end