rubocop 0.89.1 → 0.93.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 (365) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +160 -14
  4. data/lib/rubocop.rb +33 -5
  5. data/lib/rubocop/cached_data.rb +3 -1
  6. data/lib/rubocop/cli/command.rb +1 -0
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +9 -0
  10. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  11. data/lib/rubocop/cli/command/show_cops.rb +1 -0
  12. data/lib/rubocop/cli/command/version.rb +1 -0
  13. data/lib/rubocop/cli/environment.rb +1 -0
  14. data/lib/rubocop/comment_config.rb +14 -5
  15. data/lib/rubocop/config_loader.rb +20 -9
  16. data/lib/rubocop/config_loader_resolver.rb +1 -0
  17. data/lib/rubocop/config_obsoletion.rb +1 -0
  18. data/lib/rubocop/config_regeneration.rb +33 -0
  19. data/lib/rubocop/config_store.rb +3 -3
  20. data/lib/rubocop/config_validator.rb +3 -0
  21. data/lib/rubocop/cop/base.rb +23 -0
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  23. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  24. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  25. data/lib/rubocop/cop/commissioner.rb +47 -7
  26. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  28. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  29. data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
  30. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  31. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  32. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +4 -9
  33. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  34. data/lib/rubocop/cop/documentation.rb +22 -0
  35. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +10 -10
  36. data/lib/rubocop/cop/generator.rb +2 -1
  37. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
  42. data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
  43. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  44. data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
  45. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  46. data/lib/rubocop/cop/layout/class_structure.rb +11 -10
  47. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  48. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  49. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  50. data/lib/rubocop/cop/layout/dot_position.rb +21 -20
  51. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  52. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
  53. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  54. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  55. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  56. data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
  57. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +17 -14
  58. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  59. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +5 -8
  60. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  61. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  62. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  63. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
  64. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  65. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
  67. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  68. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  69. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
  70. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  71. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  72. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  73. data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
  74. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  75. data/lib/rubocop/cop/layout/leading_comment_space.rb +11 -9
  76. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  77. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  78. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  79. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  80. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  81. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  82. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  83. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  84. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  86. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -22
  87. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  88. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  89. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  90. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  91. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  92. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +17 -21
  93. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  94. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  95. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  96. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  97. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  98. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  99. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  100. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  101. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
  102. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  103. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +13 -16
  104. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
  105. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  106. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  107. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  108. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
  109. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  110. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  111. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  112. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +2 -0
  113. data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
  114. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +15 -1
  115. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
  116. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  117. data/lib/rubocop/cop/lint/boolean_symbol.rb +3 -0
  118. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  119. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  120. data/lib/rubocop/cop/lint/debugger.rb +2 -3
  121. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
  122. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
  123. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  124. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -15
  125. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  126. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  127. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
  128. data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
  129. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  130. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +37 -0
  131. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  132. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
  133. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  134. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  135. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -35
  136. data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
  137. data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
  138. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -20
  139. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  140. data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
  141. data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
  142. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  143. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +22 -12
  144. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
  145. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  146. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +45 -0
  147. data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
  148. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
  149. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
  150. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
  151. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
  152. data/lib/rubocop/cop/lint/to_json.rb +16 -5
  153. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  154. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  155. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -6
  156. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
  157. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -1
  158. data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
  159. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  160. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  161. data/lib/rubocop/cop/metrics/block_length.rb +3 -1
  162. data/lib/rubocop/cop/metrics/class_length.rb +8 -6
  163. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +27 -16
  164. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
  165. data/lib/rubocop/cop/mixin/alignment.rb +3 -0
  166. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  167. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  168. data/lib/rubocop/cop/mixin/check_line_breakable.rb +16 -7
  169. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  170. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  171. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  172. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  173. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  174. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  175. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  176. data/lib/rubocop/cop/mixin/hash_transform_method.rb +27 -2
  177. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  178. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +12 -10
  179. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  180. data/lib/rubocop/cop/mixin/percent_array.rb +14 -3
  181. data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
  182. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  183. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  184. data/lib/rubocop/cop/mixin/statement_modifier.rb +9 -3
  185. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
  186. data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -7
  187. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  188. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  189. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  190. data/lib/rubocop/cop/offense.rb +16 -2
  191. data/lib/rubocop/cop/security/eval.rb +1 -0
  192. data/lib/rubocop/cop/security/json_load.rb +1 -0
  193. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  194. data/lib/rubocop/cop/security/open.rb +1 -0
  195. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  196. data/lib/rubocop/cop/severity.rb +0 -8
  197. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -11
  198. data/lib/rubocop/cop/style/accessor_grouping.rb +3 -0
  199. data/lib/rubocop/cop/style/alias.rb +2 -0
  200. data/lib/rubocop/cop/style/array_coercion.rb +4 -0
  201. data/lib/rubocop/cop/style/array_join.rb +1 -0
  202. data/lib/rubocop/cop/style/attr.rb +1 -0
  203. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -0
  204. data/lib/rubocop/cop/style/case_equality.rb +11 -3
  205. data/lib/rubocop/cop/style/case_like_if.rb +40 -8
  206. data/lib/rubocop/cop/style/class_and_module_children.rb +2 -0
  207. data/lib/rubocop/cop/style/class_check.rb +6 -9
  208. data/lib/rubocop/cop/style/class_equality_comparison.rb +49 -0
  209. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  210. data/lib/rubocop/cop/style/class_vars.rb +1 -2
  211. data/lib/rubocop/cop/style/combinable_loops.rb +91 -0
  212. data/lib/rubocop/cop/style/comment_annotation.rb +6 -0
  213. data/lib/rubocop/cop/style/commented_keyword.rb +7 -8
  214. data/lib/rubocop/cop/style/conditional_assignment.rb +49 -60
  215. data/lib/rubocop/cop/style/date_time.rb +12 -1
  216. data/lib/rubocop/cop/style/dir.rb +1 -0
  217. data/lib/rubocop/cop/style/double_negation.rb +1 -0
  218. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  219. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  220. data/lib/rubocop/cop/style/empty_literal.rb +3 -1
  221. data/lib/rubocop/cop/style/eval_with_location.rb +1 -3
  222. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  223. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -2
  224. data/lib/rubocop/cop/style/explicit_block_argument.rb +7 -3
  225. data/lib/rubocop/cop/style/float_division.rb +2 -0
  226. data/lib/rubocop/cop/style/for.rb +0 -4
  227. data/lib/rubocop/cop/style/format_string.rb +1 -4
  228. data/lib/rubocop/cop/style/format_string_token.rb +1 -1
  229. data/lib/rubocop/cop/style/guard_clause.rb +1 -0
  230. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +24 -5
  231. data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
  232. data/lib/rubocop/cop/style/hash_transform_keys.rb +16 -9
  233. data/lib/rubocop/cop/style/hash_transform_values.rb +16 -9
  234. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -6
  235. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  236. data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
  237. data/lib/rubocop/cop/style/lambda_call.rb +3 -1
  238. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
  239. data/lib/rubocop/cop/style/method_def_parentheses.rb +0 -4
  240. data/lib/rubocop/cop/style/mixin_usage.rb +8 -27
  241. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  242. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +14 -1
  243. data/lib/rubocop/cop/style/multiline_when_then.rb +3 -2
  244. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  245. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  246. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  247. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  248. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -11
  249. data/lib/rubocop/cop/style/nested_ternary_operator.rb +16 -16
  250. data/lib/rubocop/cop/style/next.rb +10 -14
  251. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  252. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  253. data/lib/rubocop/cop/style/not.rb +20 -26
  254. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  255. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -14
  256. data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
  257. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  258. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  259. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +12 -1
  260. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  261. data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
  262. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  263. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
  264. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  265. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  266. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  267. data/lib/rubocop/cop/style/proc.rb +6 -6
  268. data/lib/rubocop/cop/style/raise_args.rb +12 -24
  269. data/lib/rubocop/cop/style/random_with_offset.rb +19 -19
  270. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
  271. data/lib/rubocop/cop/style/redundant_begin.rb +28 -12
  272. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  273. data/lib/rubocop/cop/style/redundant_condition.rb +10 -7
  274. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  275. data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
  276. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  277. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
  278. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  279. data/lib/rubocop/cop/style/redundant_interpolation.rb +31 -25
  280. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
  281. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  282. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +44 -36
  283. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +13 -29
  284. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  285. data/lib/rubocop/cop/style/redundant_self.rb +9 -11
  286. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  287. data/lib/rubocop/cop/style/redundant_sort.rb +12 -29
  288. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  289. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  290. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  291. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  292. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  293. data/lib/rubocop/cop/style/safe_navigation.rb +18 -12
  294. data/lib/rubocop/cop/style/sample.rb +12 -14
  295. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  296. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  297. data/lib/rubocop/cop/style/send.rb +4 -5
  298. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  299. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
  300. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  301. data/lib/rubocop/cop/style/single_line_methods.rb +17 -16
  302. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  303. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  304. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  305. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  306. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  307. data/lib/rubocop/cop/style/string_concatenation.rb +17 -3
  308. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  309. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  310. data/lib/rubocop/cop/style/strip.rb +9 -14
  311. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
  312. data/lib/rubocop/cop/style/symbol_array.rb +5 -16
  313. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  314. data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
  315. data/lib/rubocop/cop/style/ternary_parentheses.rb +22 -22
  316. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  317. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  318. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  319. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  320. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  321. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +11 -9
  322. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  323. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  324. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  325. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  326. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  327. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  328. data/lib/rubocop/cop/style/when_then.rb +4 -6
  329. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  330. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  331. data/lib/rubocop/cop/style/word_array.rb +5 -23
  332. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  333. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -18
  334. data/lib/rubocop/cop/team.rb +1 -0
  335. data/lib/rubocop/cop/util.rb +1 -2
  336. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  337. data/lib/rubocop/cop/variable_force.rb +2 -0
  338. data/lib/rubocop/cop/variable_force/branch.rb +0 -4
  339. data/lib/rubocop/cops_documentation_generator.rb +4 -2
  340. data/lib/rubocop/core_ext/string.rb +2 -2
  341. data/lib/rubocop/directive_comment.rb +32 -0
  342. data/lib/rubocop/ext/regexp_node.rb +62 -0
  343. data/lib/rubocop/file_finder.rb +1 -0
  344. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  345. data/lib/rubocop/formatter/disabled_config_formatter.rb +12 -5
  346. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  347. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  348. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  349. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  350. data/lib/rubocop/name_similarity.rb +1 -0
  351. data/lib/rubocop/options.rb +40 -17
  352. data/lib/rubocop/remote_config.rb +1 -0
  353. data/lib/rubocop/result_cache.rb +39 -15
  354. data/lib/rubocop/rspec/cop_helper.rb +5 -2
  355. data/lib/rubocop/rspec/expect_offense.rb +14 -9
  356. data/lib/rubocop/rspec/shared_contexts.rb +12 -0
  357. data/lib/rubocop/runner.rb +38 -18
  358. data/lib/rubocop/string_interpreter.rb +3 -0
  359. data/lib/rubocop/target_finder.rb +28 -26
  360. data/lib/rubocop/target_ruby.rb +7 -1
  361. data/lib/rubocop/version.rb +7 -1
  362. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  363. metadata +31 -17
  364. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +0 -43
  365. data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -19,7 +19,7 @@ module RuboCop
19
19
  # def fry(temperature: 300)
20
20
  # # ...
21
21
  # end
22
- class OptionHash < Cop
22
+ class OptionHash < Base
23
23
  MSG = 'Prefer keyword arguments to options hashes.'
24
24
 
25
25
  def_node_matcher :option_hash, <<~PATTERN
@@ -17,7 +17,7 @@ module RuboCop
17
17
  #
18
18
  # def foobar(a = 1, b = 2, c = 3)
19
19
  # end
20
- class OptionalArguments < Cop
20
+ class OptionalArguments < Base
21
21
  MSG = 'Optional arguments should appear at the end ' \
22
22
  'of the argument list.'
23
23
 
@@ -4,7 +4,8 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop checks for places where keyword arguments can be used instead of
7
- # boolean arguments when defining methods.
7
+ # boolean arguments when defining methods. `respond_to_missing?` method is allowed by default.
8
+ # These are customizable with `AllowedMethods` option.
8
9
  #
9
10
  # @example
10
11
  # # bad
@@ -23,11 +24,21 @@ module RuboCop
23
24
  # puts bar
24
25
  # end
25
26
  #
27
+ # @example AllowedMethods: ['some_method']
28
+ # # good
29
+ # def some_method(bar = false)
30
+ # puts bar
31
+ # end
32
+ #
26
33
  class OptionalBooleanParameter < Base
34
+ include AllowedMethods
35
+
27
36
  MSG = 'Use keyword arguments when defining method with boolean argument.'
28
37
  BOOLEAN_TYPES = %i[true false].freeze
29
38
 
30
39
  def on_def(node)
40
+ return if allowed_method?(node.method_name)
41
+
31
42
  node.arguments.each do |arg|
32
43
  next unless arg.optarg_type?
33
44
 
@@ -26,7 +26,9 @@ module RuboCop
26
26
  #
27
27
  # # good - set name to 'Bozhidar', only if it's nil or false
28
28
  # name ||= 'Bozhidar'
29
- class OrAssignment < Cop
29
+ class OrAssignment < Base
30
+ extend AutoCorrector
31
+
30
32
  MSG = 'Use the double pipe equals operator `||=` instead.'
31
33
 
32
34
  def_node_matcher :ternary_assignment?, <<~PATTERN
@@ -47,35 +49,36 @@ module RuboCop
47
49
  def on_if(node)
48
50
  return unless unless_assignment?(node)
49
51
 
50
- add_offense(node)
52
+ add_offense(node) do |corrector|
53
+ autocorrect(corrector, node)
54
+ end
51
55
  end
52
56
 
53
57
  def on_lvasgn(node)
54
58
  return unless (else_branch = ternary_assignment?(node))
55
59
  return if else_branch.if_type?
56
60
 
57
- add_offense(node)
61
+ add_offense(node) do |corrector|
62
+ autocorrect(corrector, node)
63
+ end
58
64
  end
59
65
 
60
66
  alias on_ivasgn on_lvasgn
61
67
  alias on_cvasgn on_lvasgn
62
68
  alias on_gvasgn on_lvasgn
63
69
 
64
- def autocorrect(node)
70
+ private
71
+
72
+ def autocorrect(corrector, node)
65
73
  if ternary_assignment?(node)
66
74
  variable, default = take_variable_and_default_from_ternary(node)
67
75
  else
68
76
  variable, default = take_variable_and_default_from_unless(node)
69
77
  end
70
78
 
71
- lambda do |corrector|
72
- corrector.replace(node,
73
- "#{variable} ||= #{default.source}")
74
- end
79
+ corrector.replace(node, "#{variable} ||= #{default.source}")
75
80
  end
76
81
 
77
- private
78
-
79
82
  def take_variable_and_default_from_ternary(node)
80
83
  variable, if_statement = *node
81
84
  [variable, if_statement.else_branch]
@@ -22,8 +22,9 @@ module RuboCop
22
22
  # a = 1
23
23
  # b = 2
24
24
  # c = 3
25
- class ParallelAssignment < Cop
25
+ class ParallelAssignment < Base
26
26
  include RescueNode
27
+ extend AutoCorrector
27
28
 
28
29
  MSG = 'Do not use parallel assignment.'
29
30
 
@@ -35,24 +36,23 @@ module RuboCop
35
36
  return if allowed_lhs?(lhs) || allowed_rhs?(rhs) ||
36
37
  allowed_masign?(lhs_elements, rhs_elements)
37
38
 
38
- add_offense(node)
39
- end
40
-
41
- def autocorrect(node)
42
- lambda do |corrector|
43
- left, right = *node
44
- left_elements = *left
45
- right_elements = Array(right).compact
46
- order = find_valid_order(left_elements, right_elements)
47
- correction = assignment_corrector(node, order)
48
-
49
- corrector.replace(correction.correction_range,
50
- correction.correction)
39
+ add_offense(node) do |corrector|
40
+ autocorrect(corrector, node)
51
41
  end
52
42
  end
53
43
 
54
44
  private
55
45
 
46
+ def autocorrect(corrector, node)
47
+ left, right = *node
48
+ left_elements = *left
49
+ right_elements = Array(right).compact
50
+ order = find_valid_order(left_elements, right_elements)
51
+ correction = assignment_corrector(node, order)
52
+
53
+ corrector.replace(correction.correction_range, correction.correction)
54
+ end
55
+
56
56
  def allowed_masign?(lhs_elements, rhs_elements)
57
57
  lhs_elements.size != rhs_elements.size ||
58
58
  !find_valid_order(lhs_elements,
@@ -53,9 +53,10 @@ module RuboCop
53
53
  # y > 10)
54
54
  # end
55
55
  #
56
- class ParenthesesAroundCondition < Cop
56
+ class ParenthesesAroundCondition < Base
57
57
  include SafeAssignment
58
58
  include Parentheses
59
+ extend AutoCorrector
59
60
 
60
61
  def on_if(node)
61
62
  return if node.ternary?
@@ -68,10 +69,6 @@ module RuboCop
68
69
  end
69
70
  alias on_until on_while
70
71
 
71
- def autocorrect(node)
72
- ParenthesesCorrector.correct(node)
73
- end
74
-
75
72
  private
76
73
 
77
74
  def_node_matcher :control_op_condition, <<~PATTERN
@@ -85,7 +82,10 @@ module RuboCop
85
82
  return if modifier_op?(first_child)
86
83
  return if parens_allowed?(cond)
87
84
 
88
- add_offense(cond)
85
+ message = message(cond)
86
+ add_offense(cond, message: message) do |corrector|
87
+ ParenthesesCorrector.correct(corrector, cond)
88
+ end
89
89
  end
90
90
  end
91
91
 
@@ -23,8 +23,9 @@ module RuboCop
23
23
  #
24
24
  # # bad
25
25
  # %I(alpha beta)
26
- class PercentLiteralDelimiters < Cop
26
+ class PercentLiteralDelimiters < Base
27
27
  include PercentLiteral
28
+ extend AutoCorrector
28
29
 
29
30
  def on_array(node)
30
31
  process(node, '%w', '%W', '%i', '%I')
@@ -47,34 +48,27 @@ module RuboCop
47
48
  process(node, '%x')
48
49
  end
49
50
 
50
- def message(node)
51
- type = type(node)
52
- delimiters = preferred_delimiters_for(type)
53
-
54
- "`#{type}`-literals should be delimited by " \
55
- "`#{delimiters[0]}` and `#{delimiters[1]}`."
56
- end
51
+ private
57
52
 
58
- def autocorrect(node)
53
+ def on_percent_literal(node)
59
54
  type = type(node)
55
+ return if uses_preferred_delimiter?(node, type) ||
56
+ contains_preferred_delimiter?(node, type) ||
57
+ include_same_character_as_used_for_delimiter?(node, type)
60
58
 
61
- opening_delimiter, closing_delimiter = preferred_delimiters_for(type)
59
+ add_offense(node, message: message(type)) do |corrector|
60
+ opening_delimiter, closing_delimiter = preferred_delimiters_for(type)
62
61
 
63
- lambda do |corrector|
64
62
  corrector.replace(node.loc.begin, "#{type}#{opening_delimiter}")
65
63
  corrector.replace(node.loc.end, closing_delimiter)
66
64
  end
67
65
  end
68
66
 
69
- private
70
-
71
- def on_percent_literal(node)
72
- type = type(node)
73
- return if uses_preferred_delimiter?(node, type) ||
74
- contains_preferred_delimiter?(node, type) ||
75
- include_same_character_as_used_for_delimiter?(node, type)
67
+ def message(type)
68
+ delimiters = preferred_delimiters_for(type)
76
69
 
77
- add_offense(node)
70
+ "`#{type}`-literals should be delimited by " \
71
+ "`#{delimiters[0]}` and `#{delimiters[1]}`."
78
72
  end
79
73
 
80
74
  def preferred_delimiters_for(type)
@@ -25,9 +25,10 @@ module RuboCop
25
25
  # # good
26
26
  # %Q/Mix the foo into the baz./
27
27
  # %Q{They all said: 'Hooray!'}
28
- class PercentQLiterals < Cop
28
+ class PercentQLiterals < Base
29
29
  include PercentLiteral
30
30
  include ConfigurableEnforcedStyle
31
+ extend AutoCorrector
31
32
 
32
33
  LOWER_CASE_Q_MSG = 'Do not use `%Q` unless interpolation is ' \
33
34
  'needed. Use `%q`.'
@@ -37,12 +38,6 @@ module RuboCop
37
38
  process(node, '%Q', '%q')
38
39
  end
39
40
 
40
- def autocorrect(node)
41
- lambda do |corrector|
42
- corrector.replace(node, corrected(node.source))
43
- end
44
- end
45
-
46
41
  private
47
42
 
48
43
  def on_percent_literal(node)
@@ -50,9 +45,12 @@ module RuboCop
50
45
 
51
46
  # Report offense only if changing case doesn't change semantics,
52
47
  # i.e., if the string would become dynamic or has special characters.
53
- return if node.children != parse(corrected(node.source)).ast.children
48
+ ast = ProcessedSource.new(corrected(node.source), target_ruby_version).ast
49
+ return if node.children != ast.children
54
50
 
55
- add_offense(node, location: :begin)
51
+ add_offense(node.loc.begin) do |corrector|
52
+ corrector.replace(node, corrected(node.source))
53
+ end
56
54
  end
57
55
 
58
56
  def correct_literal_style?(node)
@@ -60,7 +58,7 @@ module RuboCop
60
58
  style == :upper_case_q && type(node) == '%Q'
61
59
  end
62
60
 
63
- def message(_node)
61
+ def message(_range)
64
62
  style == :lower_case_q ? LOWER_CASE_Q_MSG : UPPER_CASE_Q_MSG
65
63
  end
66
64
 
@@ -12,23 +12,21 @@ module RuboCop
12
12
  #
13
13
  # # good
14
14
  # puts Regexp.last_match(1)
15
- class PerlBackrefs < Cop
15
+ class PerlBackrefs < Base
16
+ extend AutoCorrector
17
+
16
18
  MSG = 'Avoid the use of Perl-style backrefs.'
17
19
 
18
20
  def on_nth_ref(node)
19
- add_offense(node)
20
- end
21
-
22
- def autocorrect(node)
23
- lambda do |corrector|
21
+ add_offense(node) do |corrector|
24
22
  backref, = *node
25
23
  parent_type = node.parent ? node.parent.type : nil
24
+
26
25
  if %i[dstr xstr regexp].include?(parent_type)
27
- corrector.replace(node,
28
- "{Regexp.last_match(#{backref})}")
26
+ corrector.replace(node, "{Regexp.last_match(#{backref})}")
27
+
29
28
  else
30
- corrector.replace(node,
31
- "Regexp.last_match(#{backref})")
29
+ corrector.replace(node, "Regexp.last_match(#{backref})")
32
30
  end
33
31
  end
34
32
  end
@@ -25,8 +25,9 @@ module RuboCop
25
25
  # # good
26
26
  # Hash#has_key?
27
27
  # Hash#has_value?
28
- class PreferredHashMethods < Cop
28
+ class PreferredHashMethods < Base
29
29
  include ConfigurableEnforcedStyle
30
+ extend AutoCorrector
30
31
 
31
32
  MSG = 'Use `Hash#%<prefer>s` instead of `Hash#%<current>s`.'
32
33
 
@@ -35,27 +36,23 @@ module RuboCop
35
36
  verbose: %i[key? value?]
36
37
  }.freeze
37
38
 
39
+ RESTRICT_ON_SEND = OFFENDING_SELECTORS.values.flatten.freeze
40
+
38
41
  def on_send(node)
39
- return unless node.arguments.one? &&
40
- offending_selector?(node.method_name)
42
+ return unless node.arguments.one? && offending_selector?(node.method_name)
41
43
 
42
- add_offense(node, location: :selector)
43
- end
44
- alias on_csend on_send
44
+ message = message(node.method_name)
45
45
 
46
- def autocorrect(node)
47
- lambda do |corrector|
48
- corrector.replace(node.loc.selector,
49
- proper_method_name(node.loc.selector.source))
46
+ add_offense(node.loc.selector, message: message) do |corrector|
47
+ corrector.replace(node.loc.selector, proper_method_name(node.loc.selector.source))
50
48
  end
51
49
  end
50
+ alias on_csend on_send
52
51
 
53
52
  private
54
53
 
55
- def message(node)
56
- format(MSG,
57
- prefer: proper_method_name(node.method_name),
58
- current: node.method_name)
54
+ def message(method_name)
55
+ format(MSG, prefer: proper_method_name(method_name), current: method_name)
59
56
  end
60
57
 
61
58
  def proper_method_name(method_name)
@@ -13,7 +13,9 @@ module RuboCop
13
13
  # # good
14
14
  # p = proc { |n| puts n }
15
15
  #
16
- class Proc < Cop
16
+ class Proc < Base
17
+ extend AutoCorrector
18
+
17
19
  MSG = 'Use `proc` instead of `Proc.new`.'
18
20
 
19
21
  def_node_matcher :proc_new?,
@@ -21,13 +23,11 @@ module RuboCop
21
23
 
22
24
  def on_block(node)
23
25
  proc_new?(node) do |block_method|
24
- add_offense(block_method)
26
+ add_offense(block_method) do |corrector|
27
+ corrector.replace(block_method, 'proc')
28
+ end
25
29
  end
26
30
  end
27
-
28
- def autocorrect(node)
29
- ->(corrector) { corrector.replace(node, 'proc') }
30
- end
31
31
  end
32
32
  end
33
33
  end
@@ -32,14 +32,17 @@ module RuboCop
32
32
  # raise StandardError.new("message")
33
33
  # raise MyCustomError.new(arg1, arg2, arg3)
34
34
  # fail "message"
35
- class RaiseArgs < Cop
35
+ class RaiseArgs < Base
36
36
  include ConfigurableEnforcedStyle
37
+ extend AutoCorrector
37
38
 
38
39
  EXPLODED_MSG = 'Provide an exception class and message ' \
39
40
  'as arguments to `%<method>s`.'
40
41
  COMPACT_MSG = 'Provide an exception object ' \
41
42
  'as an argument to `%<method>s`.'
42
43
 
44
+ RESTRICT_ON_SEND = %i[raise fail].freeze
45
+
43
46
  def on_send(node)
44
47
  return unless node.command?(:raise) || node.command?(:fail)
45
48
 
@@ -51,16 +54,6 @@ module RuboCop
51
54
  end
52
55
  end
53
56
 
54
- def autocorrect(node)
55
- replacement = if style == :compact
56
- correction_exploded_to_compact(node)
57
- else
58
- correction_compact_to_exploded(node)
59
- end
60
-
61
- ->(corrector) { corrector.replace(node, replacement) }
62
- end
63
-
64
57
  private
65
58
 
66
59
  def correction_compact_to_exploded(node)
@@ -91,8 +84,10 @@ module RuboCop
91
84
 
92
85
  def check_compact(node)
93
86
  if node.arguments.size > 1
94
- add_offense(node) do
95
- opposite_style_detected
87
+ add_offense(node, message: format(COMPACT_MSG, method: node.method_name)) do |corrector|
88
+ replacement = correction_exploded_to_compact(node)
89
+
90
+ corrector.replace(node, replacement)
96
91
  end
97
92
  else
98
93
  correct_style_detected
@@ -105,11 +100,12 @@ module RuboCop
105
100
  first_arg = node.first_argument
106
101
 
107
102
  return unless first_arg.send_type? && first_arg.method?(:new)
108
-
109
103
  return if acceptable_exploded_args?(first_arg.arguments)
110
104
 
111
- add_offense(node) do
112
- opposite_style_detected
105
+ add_offense(node, message: format(EXPLODED_MSG, method: node.method_name)) do |corrector|
106
+ replacement = correction_compact_to_exploded(node)
107
+
108
+ corrector.replace(node, replacement)
113
109
  end
114
110
  end
115
111
 
@@ -131,14 +127,6 @@ module RuboCop
131
127
  parent.and_type? || parent.or_type? ||
132
128
  parent.if_type? && parent.ternary?
133
129
  end
134
-
135
- def message(node)
136
- if style == :compact
137
- format(COMPACT_MSG, method: node.method_name)
138
- else
139
- format(EXPLODED_MSG, method: node.method_name)
140
- end
141
- end
142
130
  end
143
131
  end
144
132
  end