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
@@ -6,6 +6,11 @@ module RuboCop
6
6
  # This cop checks for places where string concatenation
7
7
  # can be replaced with string interpolation.
8
8
  #
9
+ # The cop can autocorrect simple cases but will skip autocorrecting
10
+ # more complex cases where the resulting code would be harder to read.
11
+ # In those cases, it might be useful to extract statements to local
12
+ # variables or methods which you can then interpolate in a string.
13
+ #
9
14
  # @example
10
15
  # # bad
11
16
  # email_with_name = user.name + ' <' + user.email + '>'
@@ -19,6 +24,7 @@ module RuboCop
19
24
  extend AutoCorrector
20
25
 
21
26
  MSG = 'Prefer string interpolation to string concatenation.'
27
+ RESTRICT_ON_SEND = %i[+].freeze
22
28
 
23
29
  def_node_matcher :string_concatenation?, <<~PATTERN
24
30
  {
@@ -28,7 +34,6 @@ module RuboCop
28
34
  PATTERN
29
35
 
30
36
  def on_send(node)
31
- return unless node.method?(:+)
32
37
  return unless string_concatenation?(node)
33
38
 
34
39
  topmost_plus_node = find_topmost_plus_node(node)
@@ -37,7 +42,9 @@ module RuboCop
37
42
  collect_parts(topmost_plus_node, parts)
38
43
 
39
44
  add_offense(topmost_plus_node) do |corrector|
40
- corrector.replace(topmost_plus_node, replacement(parts))
45
+ if parts.none? { |part| uncorrectable?(part) }
46
+ corrector.replace(topmost_plus_node, replacement(parts))
47
+ end
41
48
  end
42
49
  end
43
50
 
@@ -66,6 +73,13 @@ module RuboCop
66
73
  node.send_type? && node.method?(:+)
67
74
  end
68
75
 
76
+ def uncorrectable?(part)
77
+ part.multiline? ||
78
+ part.dstr_type? ||
79
+ (part.str_type? && part.heredoc?) ||
80
+ part.each_descendant(:block).any?
81
+ end
82
+
69
83
  def replacement(parts)
70
84
  interpolated_parts =
71
85
  parts.map do |part|
@@ -73,7 +87,7 @@ module RuboCop
73
87
  if single_quoted?(part)
74
88
  part.value.gsub('\\') { '\\\\' }
75
89
  else
76
- escape_string(part.value)
90
+ part.value.inspect[1..-2]
77
91
  end
78
92
  else
79
93
  "\#{#{part.source}}"
@@ -12,7 +12,9 @@ module RuboCop
12
12
  #
13
13
  # # good
14
14
  # { one: 1, two: 2, three: 3 }
15
- class StringHashKeys < Cop
15
+ class StringHashKeys < Base
16
+ extend AutoCorrector
17
+
16
18
  MSG = 'Prefer symbols instead of strings as hash keys.'
17
19
 
18
20
  def_node_matcher :string_hash_key?, <<~PATTERN
@@ -35,13 +37,10 @@ module RuboCop
35
37
  return unless string_hash_key?(node)
36
38
  return if receive_environments_method?(node)
37
39
 
38
- add_offense(node.key)
39
- end
40
+ add_offense(node.key) do |corrector|
41
+ symbol_content = node.key.str_content.to_sym.inspect
40
42
 
41
- def autocorrect(node)
42
- lambda do |corrector|
43
- symbol_content = node.str_content.to_sym.inspect
44
- corrector.replace(node, symbol_content)
43
+ corrector.replace(node.key, symbol_content)
45
44
  end
46
45
  end
47
46
  end
@@ -14,32 +14,22 @@ module RuboCop
14
14
  # # good
15
15
  # 'name'.to_sym
16
16
  # 'var'.preferred_method
17
- class StringMethods < Cop
17
+ class StringMethods < Base
18
18
  include MethodPreference
19
+ extend AutoCorrector
19
20
 
20
21
  MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
21
22
 
22
23
  def on_send(node)
23
- return unless preferred_method(node.method_name)
24
+ return unless (preferred_method = preferred_method(node.method_name))
24
25
 
25
- add_offense(node, location: :selector)
26
- end
27
- alias on_csend on_send
26
+ message = format(MSG, prefer: preferred_method, current: node.method_name)
28
27
 
29
- def autocorrect(node)
30
- lambda do |corrector|
31
- corrector.replace(node.loc.selector,
32
- preferred_method(node.method_name))
28
+ add_offense(node.loc.selector, message: message) do |corrector|
29
+ corrector.replace(node.loc.selector, preferred_method(node.method_name))
33
30
  end
34
31
  end
35
-
36
- private
37
-
38
- def message(node)
39
- format(MSG,
40
- prefer: preferred_method(node.method_name),
41
- current: node.method_name)
42
- end
32
+ alias on_csend on_send
43
33
  end
44
34
  end
45
35
  end
@@ -13,10 +13,12 @@ module RuboCop
13
13
  #
14
14
  # # good
15
15
  # 'abc'.strip
16
- class Strip < Cop
16
+ class Strip < Base
17
17
  include RangeHelp
18
+ extend AutoCorrector
18
19
 
19
20
  MSG = 'Use `strip` instead of `%<methods>s`.'
21
+ RESTRICT_ON_SEND = %i[lstrip rstrip].freeze
20
22
 
21
23
  def_node_matcher :lstrip_rstrip, <<~PATTERN
22
24
  {(send $(send _ $:rstrip) $:lstrip)
@@ -25,20 +27,13 @@ module RuboCop
25
27
 
26
28
  def on_send(node)
27
29
  lstrip_rstrip(node) do |first_send, method_one, method_two|
28
- range = range_between(first_send.loc.selector.begin_pos,
29
- node.source_range.end_pos)
30
- add_offense(node,
31
- location: range,
32
- message: format(MSG,
33
- methods: "#{method_one}.#{method_two}"))
34
- end
35
- end
30
+ range = range_between(first_send.loc.selector.begin_pos, node.source_range.end_pos)
31
+ message = format(MSG, methods: "#{method_one}.#{method_two}")
36
32
 
37
- def autocorrect(node)
38
- range = range_between(node.receiver.loc.selector.begin_pos,
39
- node.source_range.end_pos)
40
-
41
- ->(corrector) { corrector.replace(range, 'strip') }
33
+ add_offense(range, message: message) do |corrector|
34
+ corrector.replace(range, 'strip')
35
+ end
36
+ end
42
37
  end
43
38
  end
44
39
  end
@@ -19,8 +19,9 @@ module RuboCop
19
19
  # 42
20
20
  # end
21
21
  # end
22
- class StructInheritance < Cop
22
+ class StructInheritance < Base
23
23
  include RangeHelp
24
+ extend AutoCorrector
24
25
 
25
26
  MSG = "Don't extend an instance initialized by `Struct.new`. " \
26
27
  'Use a block to customize the struct.'
@@ -28,11 +29,7 @@ module RuboCop
28
29
  def on_class(node)
29
30
  return unless struct_constructor?(node.parent_class)
30
31
 
31
- add_offense(node, location: node.parent_class.source_range)
32
- end
33
-
34
- def autocorrect(node)
35
- lambda do |corrector|
32
+ add_offense(node.parent_class.source_range) do |corrector|
36
33
  corrector.remove(range_with_surrounding_space(range: node.loc.keyword, newlines: false))
37
34
  corrector.replace(node.loc.operator, '=')
38
35
 
@@ -27,11 +27,12 @@ module RuboCop
27
27
  #
28
28
  # # bad
29
29
  # %i[foo bar baz]
30
- class SymbolArray < Cop
30
+ class SymbolArray < Base
31
31
  include ArrayMinSize
32
32
  include ArraySyntax
33
33
  include ConfigurableEnforcedStyle
34
34
  include PercentArray
35
+ extend AutoCorrector
35
36
 
36
37
  PERCENT_MSG = 'Use `%i` or `%I` for an array of symbols.'
37
38
  ARRAY_MSG = 'Use `[]` for an array of symbols.'
@@ -44,22 +45,12 @@ module RuboCop
44
45
  if bracketed_array_of?(:sym, node)
45
46
  return if symbols_contain_spaces?(node)
46
47
 
47
- check_bracketed_array(node)
48
+ check_bracketed_array(node, 'i')
48
49
  elsif node.percent_literal?(:symbol)
49
50
  check_percent_array(node)
50
51
  end
51
52
  end
52
53
 
53
- def autocorrect(node)
54
- if style == :percent
55
- PercentLiteralCorrector
56
- .new(@config, @preferred_delimiters)
57
- .correct(node, 'i')
58
- else
59
- correct_bracketed(node)
60
- end
61
- end
62
-
63
54
  private
64
55
 
65
56
  def symbols_contain_spaces?(node)
@@ -69,7 +60,7 @@ module RuboCop
69
60
  end
70
61
  end
71
62
 
72
- def correct_bracketed(node)
63
+ def correct_bracketed(corrector, node)
73
64
  syms = node.children.map do |c|
74
65
  if c.dsym_type?
75
66
  string_literal = to_string_literal(c.source)
@@ -80,9 +71,7 @@ module RuboCop
80
71
  end
81
72
  end
82
73
 
83
- lambda do |corrector|
84
- corrector.replace(node, "[#{syms.join(', ')}]")
85
- end
74
+ corrector.replace(node, "[#{syms.join(', ')}]")
86
75
  end
87
76
 
88
77
  def to_symbol_literal(string)
@@ -12,17 +12,15 @@ module RuboCop
12
12
  #
13
13
  # # good
14
14
  # :symbol
15
- class SymbolLiteral < Cop
15
+ class SymbolLiteral < Base
16
+ extend AutoCorrector
17
+
16
18
  MSG = 'Do not use strings for word-like symbol literals.'
17
19
 
18
20
  def on_sym(node)
19
21
  return unless /\A:["'][A-Za-z_]\w*["']\z/.match?(node.source)
20
22
 
21
- add_offense(node)
22
- end
23
-
24
- def autocorrect(node)
25
- lambda do |corrector|
23
+ add_offense(node) do |corrector|
26
24
  corrector.replace(node, node.source.delete(%q('")))
27
25
  end
28
26
  end
@@ -11,9 +11,10 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # something.map(&:upcase)
14
- class SymbolProc < Cop
14
+ class SymbolProc < Base
15
15
  include RangeHelp
16
16
  include IgnoredMethods
17
+ extend AutoCorrector
17
18
 
18
19
  MSG = 'Pass `&:%<method>s` as an argument to `%<block_method>s` ' \
19
20
  'instead of a block.'
@@ -49,30 +50,25 @@ module RuboCop
49
50
  argument_node.one? && argument_node.source.include?(',')
50
51
  end
51
52
 
52
- def autocorrect(node)
53
- lambda do |corrector|
54
- if node.send_node.arguments?
55
- autocorrect_with_args(corrector, node,
56
- node.send_node.arguments,
57
- node.body.method_name)
58
- else
59
- autocorrect_without_args(corrector, node)
60
- end
61
- end
62
- end
63
-
64
53
  private
65
54
 
66
55
  def register_offense(node, method_name, block_method_name)
67
56
  block_start = node.loc.begin.begin_pos
68
57
  block_end = node.loc.end.end_pos
69
58
  range = range_between(block_start, block_end)
59
+ message = format(MSG, method: method_name, block_method: block_method_name)
60
+
61
+ add_offense(range, message: message) do |corrector|
62
+ autocorrect(corrector, node)
63
+ end
64
+ end
70
65
 
71
- add_offense(node,
72
- location: range,
73
- message: format(MSG,
74
- method: method_name,
75
- block_method: block_method_name))
66
+ def autocorrect(corrector, node)
67
+ if node.send_node.arguments?
68
+ autocorrect_with_args(corrector, node, node.send_node.arguments, node.body.method_name)
69
+ else
70
+ autocorrect_without_args(corrector, node)
71
+ end
76
72
  end
77
73
 
78
74
  def autocorrect_without_args(corrector, node)
@@ -54,10 +54,11 @@ module RuboCop
54
54
  # # bad
55
55
  # foo = (bar = baz) ? a : b
56
56
  #
57
- class TernaryParentheses < Cop
57
+ class TernaryParentheses < Base
58
58
  include SafeAssignment
59
59
  include ConfigurableEnforcedStyle
60
60
  include SurroundingSpace
61
+ extend AutoCorrector
61
62
 
62
63
  VARIABLE_TYPES = AST::Node::VARIABLES
63
64
  NON_COMPLEX_TYPES = [*VARIABLE_TYPES, :const, :defined?, :yield].freeze
@@ -70,14 +71,20 @@ module RuboCop
70
71
  return if only_closing_parenthesis_is_last_line?(node.condition)
71
72
  return unless node.ternary? && !infinite_loop? && offense?(node)
72
73
 
73
- add_offense(node, location: node.source_range)
74
+ message = message(node)
75
+
76
+ add_offense(node.source_range, message: message) do |corrector|
77
+ autocorrect(corrector, node)
78
+ end
74
79
  end
75
80
 
76
81
  def only_closing_parenthesis_is_last_line?(condition)
77
82
  condition.source.split("\n").last == ')'
78
83
  end
79
84
 
80
- def autocorrect(node)
85
+ private
86
+
87
+ def autocorrect(corrector, node)
81
88
  condition = node.condition
82
89
 
83
90
  return nil if parenthesized?(condition) &&
@@ -85,14 +92,12 @@ module RuboCop
85
92
  unsafe_autocorrect?(condition))
86
93
 
87
94
  if parenthesized?(condition)
88
- correct_parenthesized(condition)
95
+ correct_parenthesized(corrector, condition)
89
96
  else
90
- correct_unparenthesized(condition)
97
+ correct_unparenthesized(corrector, condition)
91
98
  end
92
99
  end
93
100
 
94
- private
95
-
96
101
  def offense?(node)
97
102
  condition = node.condition
98
103
 
@@ -191,27 +196,22 @@ module RuboCop
191
196
  (send {_ nil?} $_ _ ...)}
192
197
  PATTERN
193
198
 
194
- def correct_parenthesized(condition)
195
- lambda do |corrector|
196
- corrector.remove(condition.loc.begin)
197
- corrector.remove(condition.loc.end)
199
+ def correct_parenthesized(corrector, condition)
200
+ corrector.remove(condition.loc.begin)
201
+ corrector.remove(condition.loc.end)
198
202
 
199
- # Ruby allows no space between the question mark and parentheses.
200
- # If we remove the parentheses, we need to add a space or we'll
201
- # generate invalid code.
202
- corrector.insert_after(condition.loc.end, ' ') unless whitespace_after?(condition)
203
- end
203
+ # Ruby allows no space between the question mark and parentheses.
204
+ # If we remove the parentheses, we need to add a space or we'll
205
+ # generate invalid code.
206
+ corrector.insert_after(condition.loc.end, ' ') unless whitespace_after?(condition)
204
207
  end
205
208
 
206
- def correct_unparenthesized(condition)
207
- lambda do |corrector|
208
- corrector.wrap(condition, '(', ')')
209
- end
209
+ def correct_unparenthesized(corrector, condition)
210
+ corrector.wrap(condition, '(', ')')
210
211
  end
211
212
 
212
213
  def whitespace_after?(node)
213
- index = index_of_last_token(node)
214
- last_token = processed_source.tokens[index]
214
+ last_token = processed_source.last_token_of(node)
215
215
  last_token.space_after?
216
216
  end
217
217
  end
@@ -15,20 +15,17 @@ module RuboCop
15
15
  # def foo; end
16
16
  # end
17
17
  #
18
- class TrailingBodyOnClass < Cop
18
+ class TrailingBodyOnClass < Base
19
19
  include Alignment
20
20
  include TrailingBody
21
+ extend AutoCorrector
21
22
 
22
23
  MSG = 'Place the first line of class body on its own line.'
23
24
 
24
25
  def on_class(node)
25
26
  return unless trailing_body?(node)
26
27
 
27
- add_offense(node, location: first_part_of(node.to_a.last))
28
- end
29
-
30
- def autocorrect(node)
31
- lambda do |corrector|
28
+ add_offense(first_part_of(node.to_a.last)) do |corrector|
32
29
  LineBreakCorrector.correct_trailing_body(
33
30
  configured_width: configured_indentation_width,
34
31
  corrector: corrector,
@@ -24,9 +24,10 @@ module RuboCop
24
24
  # b[c: x]
25
25
  # end
26
26
  #
27
- class TrailingBodyOnMethodDefinition < Cop
27
+ class TrailingBodyOnMethodDefinition < Base
28
28
  include Alignment
29
29
  include TrailingBody
30
+ extend AutoCorrector
30
31
 
31
32
  MSG = "Place the first line of a multi-line method definition's " \
32
33
  'body on its own line.'
@@ -34,12 +35,7 @@ module RuboCop
34
35
  def on_def(node)
35
36
  return unless trailing_body?(node)
36
37
 
37
- add_offense(node, location: first_part_of(node.body))
38
- end
39
- alias on_defs on_def
40
-
41
- def autocorrect(node)
42
- lambda do |corrector|
38
+ add_offense(first_part_of(node.body)) do |corrector|
43
39
  LineBreakCorrector.correct_trailing_body(
44
40
  configured_width: configured_indentation_width,
45
41
  corrector: corrector,
@@ -48,6 +44,7 @@ module RuboCop
48
44
  )
49
45
  end
50
46
  end
47
+ alias on_defs on_def
51
48
  end
52
49
  end
53
50
  end