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
@@ -58,8 +58,9 @@ module RuboCop
58
58
  #
59
59
  # do_something2
60
60
  # end
61
- class EmptyLinesAroundExceptionHandlingKeywords < Cop
61
+ class EmptyLinesAroundExceptionHandlingKeywords < Base
62
62
  include EmptyLinesAroundBody
63
+ extend AutoCorrector
63
64
 
64
65
  MSG = 'Extra empty line detected %<location>s the `%<keyword>s`.'
65
66
 
@@ -73,10 +74,6 @@ module RuboCop
73
74
  check_body(body)
74
75
  end
75
76
 
76
- def autocorrect(node)
77
- EmptyLineCorrector.correct(node)
78
- end
79
-
80
77
  private
81
78
 
82
79
  def check_body(node)
@@ -116,10 +113,9 @@ module RuboCop
116
113
  end
117
114
 
118
115
  def keyword_locations_in_rescue(node)
119
- _begin_body, *resbodies, _else_body = *node
120
116
  [
121
117
  node.loc.else,
122
- *resbodies.map { |body| body.loc.keyword }
118
+ *node.resbody_branches.map { |body| body.loc.keyword }
123
119
  ].compact
124
120
  end
125
121
 
@@ -20,8 +20,9 @@ module RuboCop
20
20
  # # ...
21
21
  #
22
22
  # end
23
- class EmptyLinesAroundMethodBody < Cop
23
+ class EmptyLinesAroundMethodBody < Base
24
24
  include EmptyLinesAroundBody
25
+ extend AutoCorrector
25
26
 
26
27
  KIND = 'method'
27
28
 
@@ -30,10 +31,6 @@ module RuboCop
30
31
  end
31
32
  alias on_defs on_def
32
33
 
33
- def autocorrect(node)
34
- EmptyLineCorrector.correct(node)
35
- end
36
-
37
34
  private
38
35
 
39
36
  def style
@@ -44,18 +44,15 @@ module RuboCop
44
44
  # # ...
45
45
  # end
46
46
  # end
47
- class EmptyLinesAroundModuleBody < Cop
47
+ class EmptyLinesAroundModuleBody < Base
48
48
  include EmptyLinesAroundBody
49
+ extend AutoCorrector
49
50
 
50
51
  KIND = 'module'
51
52
 
52
53
  def on_module(node)
53
54
  check(node, node.body)
54
55
  end
55
-
56
- def autocorrect(node)
57
- EmptyLineCorrector.correct(node)
58
- end
59
56
  end
60
57
  end
61
58
  end
@@ -17,6 +17,11 @@ module RuboCop
17
17
  # If it's set to `start_of_line`, the `end` shall be aligned with the
18
18
  # start of the line where the matching keyword appears.
19
19
  #
20
+ # This `Layout/EndAlignment` cop aligns with keywords (e.g. `if`, `while`, `case`)
21
+ # by default. On the other hand, `Layout/BeginEndAlignment` cop aligns with
22
+ # `EnforcedStyleAlignWith: start_of_line` by default due to `||= begin` tends
23
+ # to align with the start of the line. These style can be configured by each cop.
24
+ #
20
25
  # @example EnforcedStyleAlignWith: keyword (default)
21
26
  # # bad
22
27
  #
@@ -67,10 +72,11 @@ module RuboCop
67
72
  # variable =
68
73
  # if true
69
74
  # end
70
- class EndAlignment < Cop
75
+ class EndAlignment < Base
71
76
  include CheckAssignment
72
77
  include EndKeywordAlignment
73
78
  include RangeHelp
79
+ extend AutoCorrector
74
80
 
75
81
  def on_class(node)
76
82
  check_other_alignment(node)
@@ -100,14 +106,12 @@ module RuboCop
100
106
  end
101
107
  end
102
108
 
103
- def autocorrect(node)
104
- AlignmentCorrector.align_end(processed_source,
105
- node,
106
- alignment_node(node))
107
- end
108
-
109
109
  private
110
110
 
111
+ def autocorrect(corrector, node)
112
+ AlignmentCorrector.align_end(corrector, processed_source, node, alignment_node(node))
113
+ end
114
+
111
115
  def check_assignment(node, rhs)
112
116
  # If there are method calls chained to the right hand side of the
113
117
  # assignment, we let rhs be the receiver of those method calls before
@@ -174,16 +178,6 @@ module RuboCop
174
178
  node
175
179
  end
176
180
  end
177
-
178
- def start_line_range(node)
179
- expr = node.source_range
180
- buffer = expr.source_buffer
181
- source = buffer.source_line(expr.line)
182
- range = buffer.line_range(expr.line)
183
-
184
- range_between(range.begin_pos + (source =~ /\S/),
185
- range.begin_pos + (source =~ /\s*\z/))
186
- end
187
181
  end
188
182
  end
189
183
  end
@@ -17,8 +17,9 @@ module RuboCop
17
17
  # :a,
18
18
  # :b]
19
19
  #
20
- class FirstArrayElementLineBreak < Cop
20
+ class FirstArrayElementLineBreak < Base
21
21
  include FirstElementLineBreak
22
+ extend AutoCorrector
22
23
 
23
24
  MSG = 'Add a line break before the first element of a ' \
24
25
  'multi-line array.'
@@ -29,10 +30,6 @@ module RuboCop
29
30
  check_children_line_break(node, node.children)
30
31
  end
31
32
 
32
- def autocorrect(node)
33
- EmptyLineCorrector.insert_before(node)
34
- end
35
-
36
33
  private
37
34
 
38
35
  def assignment_on_same_line?(node)
@@ -16,8 +16,9 @@ module RuboCop
16
16
  # {
17
17
  # a: 1,
18
18
  # b: 2 }
19
- class FirstHashElementLineBreak < Cop
19
+ class FirstHashElementLineBreak < Base
20
20
  include FirstElementLineBreak
21
+ extend AutoCorrector
21
22
 
22
23
  MSG = 'Add a line break before the first element of a ' \
23
24
  'multi-line hash.'
@@ -27,10 +28,6 @@ module RuboCop
27
28
  # If it doesn't, Style/FirstMethodArgumentLineBreak will handle it
28
29
  check_children_line_break(node, node.children) if node.loc.begin
29
30
  end
30
-
31
- def autocorrect(node)
32
- EmptyLineCorrector.insert_before(node)
33
- end
34
31
  end
35
32
  end
36
33
  end
@@ -20,8 +20,9 @@ module RuboCop
20
20
  # # ignored
21
21
  # method foo, bar,
22
22
  # baz
23
- class FirstMethodArgumentLineBreak < Cop
23
+ class FirstMethodArgumentLineBreak < Base
24
24
  include FirstElementLineBreak
25
+ extend AutoCorrector
25
26
 
26
27
  MSG = 'Add a line break before the first argument of a ' \
27
28
  'multi-line method argument list.'
@@ -35,18 +36,13 @@ module RuboCop
35
36
  #
36
37
  # ...then each key/value pair is treated as a method 'argument'
37
38
  # when determining where line breaks should appear.
38
- if (last_arg = args.last)
39
- args = args.concat(args.pop.children) if last_arg.hash_type? && !last_arg.braces?
40
- end
39
+ last_arg = args.last
40
+ args.concat(args.pop.children) if last_arg&.hash_type? && !last_arg&.braces?
41
41
 
42
42
  check_method_line_break(node, args)
43
43
  end
44
44
  alias on_csend on_send
45
45
  alias on_super on_send
46
-
47
- def autocorrect(node)
48
- EmptyLineCorrector.insert_before(node)
49
- end
50
46
  end
51
47
  end
52
48
  end
@@ -26,8 +26,9 @@ module RuboCop
26
26
  # bar
27
27
  # do_something
28
28
  # end
29
- class FirstMethodParameterLineBreak < Cop
29
+ class FirstMethodParameterLineBreak < Base
30
30
  include FirstElementLineBreak
31
+ extend AutoCorrector
31
32
 
32
33
  MSG = 'Add a line break before the first parameter of a ' \
33
34
  'multi-line method parameter list.'
@@ -36,10 +37,6 @@ module RuboCop
36
37
  check_method_line_break(node, node.arguments)
37
38
  end
38
39
  alias on_defs on_def
39
-
40
- def autocorrect(node)
41
- EmptyLineCorrector.insert_before(node)
42
- end
43
40
  end
44
41
  end
45
42
  end
@@ -175,9 +175,10 @@ module RuboCop
175
175
  # do_something({foo: 1,
176
176
  # bar: 2})
177
177
  #
178
- class HashAlignment < Cop
178
+ class HashAlignment < Base
179
179
  include HashAlignmentStyles
180
180
  include RangeHelp
181
+ extend AutoCorrector
181
182
 
182
183
  MESSAGES = { KeyAlignment => 'Align the keys of a hash literal if ' \
183
184
  'they span more than one line.',
@@ -212,13 +213,6 @@ module RuboCop
212
213
  check_pairs(node)
213
214
  end
214
215
 
215
- def autocorrect(node)
216
- delta = column_deltas[alignment_for(node).first.class][node]
217
- return if delta.nil?
218
-
219
- correct_node(node, delta)
220
- end
221
-
222
216
  attr_accessor :offences_by, :column_deltas
223
217
 
224
218
  private
@@ -254,7 +248,11 @@ module RuboCop
254
248
  def add_offences
255
249
  format, offences = offences_by.min_by { |_, v| v.length }
256
250
  (offences || []).each do |offence|
257
- add_offense(offence, message: MESSAGES[format])
251
+ add_offense(offence, message: MESSAGES[format]) do |corrector|
252
+ delta = column_deltas[alignment_for(offence).first.class][offence]
253
+
254
+ correct_node(corrector, offence, delta) unless delta.nil?
255
+ end
258
256
  end
259
257
  end
260
258
 
@@ -293,25 +291,26 @@ module RuboCop
293
291
  new_alignment('EnforcedColonStyle')
294
292
  end
295
293
 
296
- def correct_node(node, delta)
294
+ def correct_node(corrector, node, delta)
297
295
  # We can't use the instance variable inside the lambda. That would
298
296
  # just give each lambda the same reference and they would all get the
299
297
  # last value of each. A local variable fixes the problem.
300
298
 
301
299
  if !node.value
302
- correct_no_value(delta[:key] || 0, node.source_range)
300
+ delta_value = delta[:key] || 0
301
+ correct_no_value(corrector, delta_value, node.source_range)
303
302
  else
304
- correct_key_value(delta, node.key.source_range,
303
+ correct_key_value(corrector, delta, node.key.source_range,
305
304
  node.value.source_range,
306
305
  node.loc.operator)
307
306
  end
308
307
  end
309
308
 
310
- def correct_no_value(key_delta, key)
311
- ->(corrector) { adjust(corrector, key_delta, key) }
309
+ def correct_no_value(corrector, key_delta, key)
310
+ adjust(corrector, key_delta, key)
312
311
  end
313
312
 
314
- def correct_key_value(delta, key, value, separator)
313
+ def correct_key_value(corrector, delta, key, value, separator)
315
314
  # We can't use the instance variable inside the lambda. That would
316
315
  # just give each lambda the same reference and they would all get the
317
316
  # last value of each. Some local variables fix the problem.
@@ -322,11 +321,9 @@ module RuboCop
322
321
  key_column = key.column
323
322
  key_delta = -key_column if key_delta < -key_column
324
323
 
325
- lambda do |corrector|
326
- adjust(corrector, key_delta, key)
327
- adjust(corrector, separator_delta, separator)
328
- adjust(corrector, value_delta, value)
329
- end
324
+ adjust(corrector, key_delta, key)
325
+ adjust(corrector, separator_delta, separator)
326
+ adjust(corrector, value_delta, value)
330
327
  end
331
328
 
332
329
  def new_alignment(key)
@@ -50,12 +50,17 @@ module RuboCop
50
50
  # 123,
51
51
  # )
52
52
  #
53
- class HeredocArgumentClosingParenthesis < Cop
53
+ class HeredocArgumentClosingParenthesis < Base
54
54
  include RangeHelp
55
+ extend AutoCorrector
55
56
 
56
57
  MSG = 'Put the closing parenthesis for a method call with a ' \
57
58
  'HEREDOC parameter on the same line as the HEREDOC opening.'
58
59
 
60
+ def self.autocorrect_incompatible_with
61
+ [Style::TrailingCommaInArguments]
62
+ end
63
+
59
64
  def on_send(node)
60
65
  heredoc_arg = extract_heredoc_argument(node)
61
66
  return unless heredoc_arg
@@ -65,9 +70,13 @@ module RuboCop
65
70
  return unless outermost_send.loc.end
66
71
  return unless heredoc_arg.first_line != outermost_send.loc.end.line
67
72
 
68
- add_offense(outermost_send, location: :end)
73
+ add_offense(outermost_send.loc.end) do |corrector|
74
+ autocorrect(corrector, outermost_send)
75
+ end
69
76
  end
70
77
 
78
+ private
79
+
71
80
  # Autocorrection note:
72
81
  #
73
82
  # Commas are a bit tricky to handle when the method call is
@@ -94,22 +103,14 @@ module RuboCop
94
103
  # SQL
95
104
  # third_array_value,
96
105
  # ]
97
- def autocorrect(node)
98
- lambda do |corrector|
99
- fix_closing_parenthesis(node, corrector)
106
+ def autocorrect(corrector, node)
107
+ fix_closing_parenthesis(node, corrector)
100
108
 
101
- remove_internal_trailing_comma(node, corrector) if internal_trailing_comma?(node)
109
+ remove_internal_trailing_comma(node, corrector) if internal_trailing_comma?(node)
102
110
 
103
- fix_external_trailing_comma(node, corrector) if external_trailing_comma?(node)
104
- end
111
+ fix_external_trailing_comma(node, corrector) if external_trailing_comma?(node)
105
112
  end
106
113
 
107
- def self.autocorrect_incompatible_with
108
- [Style::TrailingCommaInArguments]
109
- end
110
-
111
- private
112
-
113
114
  def outermost_send_on_same_line(heredoc)
114
115
  previous = heredoc
115
116
  current = previous.parent
@@ -21,9 +21,9 @@ module RuboCop
21
21
  # something
22
22
  # RUBY
23
23
  #
24
- #
25
- class HeredocIndentation < Cop
24
+ class HeredocIndentation < Base
26
25
  include Heredoc
26
+ extend AutoCorrector
27
27
 
28
28
  TYPE_MSG = 'Use %<indentation_width>d spaces for indentation in a ' \
29
29
  'heredoc by using `<<~` instead of `%<current_indent_type>s`.'
@@ -34,8 +34,9 @@ module RuboCop
34
34
  return if body.strip.empty?
35
35
 
36
36
  body_indent_level = indent_level(body)
37
+ heredoc_indent_type = heredoc_indent_type(node)
37
38
 
38
- if heredoc_indent_type(node) == '~'
39
+ if heredoc_indent_type == '~'
39
40
  expected_indent_level = base_indent_level(node) + indentation_width
40
41
  return if expected_indent_level == body_indent_level
41
42
  else
@@ -44,12 +45,16 @@ module RuboCop
44
45
 
45
46
  return if line_too_long?(node)
46
47
 
47
- add_offense(node, location: :heredoc_body)
48
+ register_offense(node, heredoc_indent_type)
48
49
  end
49
50
 
50
- def autocorrect(node)
51
- lambda do |corrector|
52
- if heredoc_indent_type(node) == '~'
51
+ private
52
+
53
+ def register_offense(node, heredoc_indent_type)
54
+ message = message(heredoc_indent_type)
55
+
56
+ add_offense(node.loc.heredoc_body, message: message) do |corrector|
57
+ if heredoc_indent_type == '~'
53
58
  adjust_squiggly(corrector, node)
54
59
  else
55
60
  adjust_minus(corrector, node)
@@ -57,10 +62,8 @@ module RuboCop
57
62
  end
58
63
  end
59
64
 
60
- private
61
-
62
- def message(node)
63
- current_indent_type = "<<#{heredoc_indent_type(node)}"
65
+ def message(heredoc_indent_type)
66
+ current_indent_type = "<<#{heredoc_indent_type}"
64
67
 
65
68
  if current_indent_type == '<<~'
66
69
  width_message(indentation_width)
@@ -17,21 +17,20 @@ module RuboCop
17
17
  # def foo; end
18
18
  # end
19
19
  #
20
- class InitialIndentation < Cop
20
+ class InitialIndentation < Base
21
21
  include RangeHelp
22
+ extend AutoCorrector
22
23
 
23
24
  MSG = 'Indentation of first line in file detected.'
24
25
 
25
- def investigate(_processed_source)
26
+ def on_new_investigation
26
27
  space_before(first_token) do |space|
27
- add_offense(space, location: first_token.pos)
28
+ add_offense(first_token.pos) do |corrector|
29
+ corrector.remove(space)
30
+ end
28
31
  end
29
32
  end
30
33
 
31
- def autocorrect(range)
32
- ->(corrector) { corrector.remove(range) }
33
- end
34
-
35
34
  private
36
35
 
37
36
  def first_token