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
@@ -15,7 +15,9 @@ module RuboCop
15
15
  # else
16
16
  # a2
17
17
  # end
18
- class NestedTernaryOperator < Cop
18
+ class NestedTernaryOperator < Base
19
+ extend AutoCorrector
20
+
19
21
  MSG = 'Ternary operators must not be nested. Prefer `if` or `else` ' \
20
22
  'constructs instead.'
21
23
 
@@ -23,21 +25,17 @@ module RuboCop
23
25
  return unless node.ternary?
24
26
 
25
27
  node.each_descendant(:if).select(&:ternary?).each do |nested_ternary|
26
- add_offense(nested_ternary)
27
- end
28
- end
29
-
30
- def autocorrect(node)
31
- if_node = if_node(node)
32
-
33
- lambda do |corrector|
34
- corrector.replace(if_node, <<~RUBY.chop)
35
- if #{if_node.condition.source}
36
- #{remove_parentheses(if_node.if_branch.source)}
37
- else
38
- #{if_node.else_branch.source}
39
- end
40
- RUBY
28
+ add_offense(nested_ternary) do |corrector|
29
+ if_node = if_node(nested_ternary)
30
+
31
+ corrector.replace(if_node, <<~RUBY.chop)
32
+ if #{if_node.condition.source}
33
+ #{remove_parentheses(if_node.if_branch.source)}
34
+ else
35
+ #{if_node.else_branch.source}
36
+ end
37
+ RUBY
38
+ end
41
39
  end
42
40
  end
43
41
 
@@ -51,6 +49,8 @@ module RuboCop
51
49
  end
52
50
 
53
51
  def remove_parentheses(source)
52
+ return source unless source.start_with?('(')
53
+
54
54
  source.gsub(/\A\(/, '').gsub(/\)\z/, '')
55
55
  end
56
56
  end
@@ -46,10 +46,11 @@ module RuboCop
46
46
  # next unless a == 1
47
47
  # puts a
48
48
  # end
49
- class Next < Cop
49
+ class Next < Base
50
50
  include ConfigurableEnforcedStyle
51
51
  include MinBodyLength
52
52
  include RangeHelp
53
+ extend AutoCorrector
53
54
 
54
55
  MSG = 'Use `next` to skip iteration.'
55
56
  EXIT_TYPES = %i[break return].freeze
@@ -58,7 +59,7 @@ module RuboCop
58
59
  [Style::SafeNavigation]
59
60
  end
60
61
 
61
- def investigate(_processed_source)
62
+ def on_new_investigation
62
63
  # When correcting nested offenses, we need to keep track of how much
63
64
  # we have adjusted the indentation of each line
64
65
  @reindented_lines = Hash.new(0)
@@ -77,16 +78,6 @@ module RuboCop
77
78
  alias on_until on_while
78
79
  alias on_for on_while
79
80
 
80
- def autocorrect(node)
81
- lambda do |corrector|
82
- if node.modifier_form?
83
- autocorrect_modifier(corrector, node)
84
- else
85
- autocorrect_block(corrector, node)
86
- end
87
- end
88
- end
89
-
90
81
  private
91
82
 
92
83
  def check(node)
@@ -94,8 +85,13 @@ module RuboCop
94
85
 
95
86
  offending_node = offense_node(node.body)
96
87
 
97
- add_offense(offending_node,
98
- location: offense_location(offending_node))
88
+ add_offense(offense_location(offending_node)) do |corrector|
89
+ if offending_node.modifier_form?
90
+ autocorrect_modifier(corrector, offending_node)
91
+ else
92
+ autocorrect_block(corrector, offending_node)
93
+ end
94
+ end
99
95
  end
100
96
 
101
97
  def ends_with_condition?(body)
@@ -28,28 +28,30 @@ module RuboCop
28
28
  # if x == nil
29
29
  # end
30
30
  #
31
- class NilComparison < Cop
31
+ class NilComparison < Base
32
32
  include ConfigurableEnforcedStyle
33
+ extend AutoCorrector
33
34
 
34
35
  PREDICATE_MSG = 'Prefer the use of the `nil?` predicate.'
35
36
  EXPLICIT_MSG = 'Prefer the use of the `==` comparison.'
36
37
 
38
+ RESTRICT_ON_SEND = %i[== === nil?].freeze
39
+
37
40
  def_node_matcher :nil_comparison?, '(send _ {:== :===} nil)'
38
41
  def_node_matcher :nil_check?, '(send _ :nil?)'
39
42
 
40
43
  def on_send(node)
41
44
  style_check?(node) do
42
- add_offense(node, location: :selector)
43
- end
44
- end
45
+ add_offense(node.loc.selector) do |corrector|
46
+ new_code = if prefer_comparison?
47
+ node.source.sub('.nil?', ' == nil')
48
+ else
49
+ node.source.sub(/\s*={2,3}\s*nil/, '.nil?')
50
+ end
45
51
 
46
- def autocorrect(node)
47
- new_code = if prefer_comparison?
48
- node.source.sub('.nil?', ' == nil')
49
- else
50
- node.source.sub(/\s*={2,3}\s*nil/, '.nil?')
51
- end
52
- ->(corrector) { corrector.replace(node, new_code) }
52
+ corrector.replace(node, new_code)
53
+ end
54
+ end
53
55
  end
54
56
 
55
57
  private
@@ -38,7 +38,11 @@ module RuboCop
38
38
  # if !x.nil?
39
39
  # end
40
40
  #
41
- class NonNilCheck < Cop
41
+ class NonNilCheck < Base
42
+ extend AutoCorrector
43
+
44
+ RESTRICT_ON_SEND = %i[!= nil? !].freeze
45
+
42
46
  def_node_matcher :not_equal_to_nil?, '(send _ :!= nil)'
43
47
  def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'
44
48
  def_node_matcher :nil_check?, '(send _ :nil?)'
@@ -46,12 +50,11 @@ module RuboCop
46
50
 
47
51
  def on_send(node)
48
52
  return if ignored_node?(node)
53
+ return unless (offense_node = find_offense_node(node))
49
54
 
50
- if not_equal_to_nil?(node)
51
- add_offense(node, location: :selector)
52
- elsif include_semantic_changes? &&
53
- (not_and_nil_check?(node) || unless_and_nil_check?(node))
54
- add_offense(node)
55
+ message = message(node)
56
+ add_offense(offense_node, message: message) do |corrector|
57
+ autocorrect(corrector, node)
55
58
  end
56
59
  end
57
60
 
@@ -68,19 +71,28 @@ module RuboCop
68
71
  end
69
72
  alias on_defs on_def
70
73
 
71
- def autocorrect(node)
74
+ private
75
+
76
+ def find_offense_node(node)
77
+ if not_equal_to_nil?(node)
78
+ node.loc.selector
79
+ elsif include_semantic_changes? &&
80
+ (not_and_nil_check?(node) || unless_and_nil_check?(node))
81
+ node
82
+ end
83
+ end
84
+
85
+ def autocorrect(corrector, node)
72
86
  case node.method_name
73
87
  when :!=
74
- autocorrect_comparison(node)
88
+ autocorrect_comparison(corrector, node)
75
89
  when :!
76
- autocorrect_non_nil(node, node.receiver)
90
+ autocorrect_non_nil(corrector, node, node.receiver)
77
91
  when :nil?
78
- autocorrect_unless_nil(node, node.receiver)
92
+ autocorrect_unless_nil(corrector, node, node.receiver)
79
93
  end
80
94
  end
81
95
 
82
- private
83
-
84
96
  def unless_and_nil_check?(send_node)
85
97
  parent = send_node.parent
86
98
 
@@ -100,7 +112,7 @@ module RuboCop
100
112
  cop_config['IncludeSemanticChanges']
101
113
  end
102
114
 
103
- def autocorrect_comparison(node)
115
+ def autocorrect_comparison(corrector, node)
104
116
  expr = node.source
105
117
 
106
118
  new_code = if include_semantic_changes?
@@ -111,24 +123,20 @@ module RuboCop
111
123
 
112
124
  return if expr == new_code
113
125
 
114
- ->(corrector) { corrector.replace(node, new_code) }
126
+ corrector.replace(node, new_code)
115
127
  end
116
128
 
117
- def autocorrect_non_nil(node, inner_node)
118
- lambda do |corrector|
119
- if inner_node.receiver
120
- corrector.replace(node, inner_node.receiver.source)
121
- else
122
- corrector.replace(node, 'self')
123
- end
129
+ def autocorrect_non_nil(corrector, node, inner_node)
130
+ if inner_node.receiver
131
+ corrector.replace(node, inner_node.receiver.source)
132
+ else
133
+ corrector.replace(node, 'self')
124
134
  end
125
135
  end
126
136
 
127
- def autocorrect_unless_nil(node, receiver)
128
- lambda do |corrector|
129
- corrector.replace(node.parent.loc.keyword, 'if')
130
- corrector.replace(node, receiver.source)
131
- end
137
+ def autocorrect_unless_nil(corrector, node, receiver)
138
+ corrector.replace(node.parent.loc.keyword, 'if')
139
+ corrector.replace(node, receiver.source)
132
140
  end
133
141
  end
134
142
  end
@@ -13,10 +13,12 @@ module RuboCop
13
13
  # # good
14
14
  # x = !something
15
15
  #
16
- class Not < Cop
16
+ class Not < Base
17
17
  include RangeHelp
18
+ extend AutoCorrector
18
19
 
19
20
  MSG = 'Use `!` instead of `not`.'
21
+ RESTRICT_ON_SEND = %i[!].freeze
20
22
 
21
23
  OPPOSITE_METHODS = {
22
24
  :== => :!=,
@@ -30,19 +32,16 @@ module RuboCop
30
32
  def on_send(node)
31
33
  return unless node.prefix_not?
32
34
 
33
- add_offense(node, location: :selector)
34
- end
35
-
36
- def autocorrect(node)
37
- range = range_with_surrounding_space(range: node.loc.selector,
38
- side: :right)
35
+ add_offense(node.loc.selector) do |corrector|
36
+ range = range_with_surrounding_space(range: node.loc.selector, side: :right)
39
37
 
40
- if opposite_method?(node.receiver)
41
- correct_opposite_method(range, node.receiver)
42
- elsif requires_parens?(node.receiver)
43
- correct_with_parens(range, node)
44
- else
45
- correct_without_parens(range)
38
+ if opposite_method?(node.receiver)
39
+ correct_opposite_method(corrector, range, node.receiver)
40
+ elsif requires_parens?(node.receiver)
41
+ correct_with_parens(corrector, range, node)
42
+ else
43
+ correct_without_parens(corrector, range)
44
+ end
46
45
  end
47
46
  end
48
47
 
@@ -58,23 +57,18 @@ module RuboCop
58
57
  child.if_type? && child.ternary?
59
58
  end
60
59
 
61
- def correct_opposite_method(range, child)
62
- lambda do |corrector|
63
- corrector.remove(range)
64
- corrector.replace(child.loc.selector,
65
- OPPOSITE_METHODS[child.method_name].to_s)
66
- end
60
+ def correct_opposite_method(corrector, range, child)
61
+ corrector.remove(range)
62
+ corrector.replace(child.loc.selector, OPPOSITE_METHODS[child.method_name].to_s)
67
63
  end
68
64
 
69
- def correct_with_parens(range, node)
70
- lambda do |corrector|
71
- corrector.replace(range, '!(')
72
- corrector.insert_after(node, ')')
73
- end
65
+ def correct_with_parens(corrector, range, node)
66
+ corrector.replace(range, '!(')
67
+ corrector.insert_after(node, ')')
74
68
  end
75
69
 
76
- def correct_without_parens(range)
77
- ->(corrector) { corrector.replace(range, '!') }
70
+ def correct_without_parens(corrector, range)
71
+ corrector.replace(range, '!')
78
72
  end
79
73
  end
80
74
  end
@@ -33,8 +33,9 @@ module RuboCop
33
33
  #
34
34
  # # good
35
35
  # num = 01234
36
- class NumericLiteralPrefix < Cop
36
+ class NumericLiteralPrefix < Base
37
37
  include IntegerNode
38
+ extend AutoCorrector
38
39
 
39
40
  OCTAL_ZERO_ONLY_REGEX = /^0[Oo][0-7]+$/.freeze
40
41
  OCTAL_REGEX = /^0O?[0-7]+$/.freeze
@@ -53,14 +54,8 @@ module RuboCop
53
54
 
54
55
  return unless type
55
56
 
56
- add_offense(node)
57
- end
58
-
59
- def autocorrect(node)
60
- lambda do |corrector|
61
- type = literal_type(node)
62
- corrector.replace(node,
63
- send(:"format_#{type}", node.source))
57
+ add_offense(node) do |corrector|
58
+ corrector.replace(node, send(:"format_#{type}", node.source))
64
59
  end
65
60
  end
66
61
 
@@ -41,9 +41,10 @@ module RuboCop
41
41
  # foo == 0
42
42
  # 0 > foo
43
43
  # bar.baz > 0
44
- class NumericPredicate < Cop
44
+ class NumericPredicate < Base
45
45
  include ConfigurableEnforcedStyle
46
46
  include IgnoredMethods
47
+ extend AutoCorrector
47
48
 
48
49
  MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
49
50
 
@@ -53,11 +54,9 @@ module RuboCop
53
54
  'negative?' => '<'
54
55
  }.freeze
55
56
 
56
- COMPARISON_METHODS = %i[== > < positive? negative? zero?].to_set.freeze
57
+ RESTRICT_ON_SEND = %i[== > < positive? negative? zero?].freeze
57
58
 
58
59
  def on_send(node)
59
- return unless COMPARISON_METHODS.include?(node.method_name)
60
-
61
60
  numeric, replacement = check(node)
62
61
  return unless numeric
63
62
 
@@ -66,16 +65,8 @@ module RuboCop
66
65
  ignored_method?(ancestor.method_name)
67
66
  end
68
67
 
69
- add_offense(node,
70
- message: format(MSG,
71
- prefer: replacement,
72
- current: node.source))
73
- end
74
-
75
- def autocorrect(node)
76
- _, replacement = check(node)
77
-
78
- lambda do |corrector|
68
+ message = format(MSG, prefer: replacement, current: node.source)
69
+ add_offense(node, message: message) do |corrector|
79
70
  corrector.replace(node, replacement)
80
71
  end
81
72
  end
@@ -3,39 +3,48 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # TODO: Make configurable.
7
- # Checks for uses of if/then/else/end on a single line.
6
+ # Checks for uses of if/then/else/end constructs on a single line.
7
+ # AlwaysCorrectToMultiline config option can be set to true to auto-convert all offenses to
8
+ # multi-line constructs. When AlwaysCorrectToMultiline is false (default case) the
9
+ # auto-correct will first try converting them to ternary operators.
8
10
  #
9
11
  # @example
10
12
  # # bad
11
- # if foo then boo else doo end
12
- # unless foo then boo else goo end
13
+ # if foo then bar else baz end
14
+ #
15
+ # # bad
16
+ # unless foo then baz else bar end
13
17
  #
14
18
  # # good
15
- # foo ? boo : doo
16
- # boo if foo
17
- # if foo then boo end
19
+ # foo ? bar : baz
20
+ #
21
+ # # good
22
+ # bar if foo
23
+ #
24
+ # # good
25
+ # if foo then bar end
18
26
  #
19
27
  # # good
20
28
  # if foo
21
- # boo
29
+ # bar
22
30
  # else
23
- # doo
31
+ # baz
24
32
  # end
25
- class OneLineConditional < Cop
33
+ class OneLineConditional < Base
34
+ include ConfigurableEnforcedStyle
26
35
  include OnNormalIfUnless
36
+ extend AutoCorrector
27
37
 
28
- MSG = 'Favor the ternary operator (`?:`) ' \
29
- 'over `%<keyword>s/then/else/end` constructs.'
38
+ MSG = 'Favor the ternary operator (`?:`) or multi-line constructs ' \
39
+ 'over single-line `%<keyword>s/then/else/end` constructs.'
30
40
 
31
41
  def on_normal_if_unless(node)
32
- return unless node.single_line? && node.else_branch
33
-
34
- add_offense(node)
35
- end
42
+ return unless node.single_line?
43
+ return unless node.else_branch
44
+ return if node.elsif?
36
45
 
37
- def autocorrect(node)
38
- lambda do |corrector|
46
+ message = message(node)
47
+ add_offense(node, message: message) do |corrector|
39
48
  corrector.replace(node, replacement(node))
40
49
  end
41
50
  end
@@ -47,16 +56,57 @@ module RuboCop
47
56
  end
48
57
 
49
58
  def replacement(node)
50
- return to_ternary(node) unless node.parent
59
+ if always_multiline? || cannot_replace_to_ternary?(node)
60
+ multiline_replacement(node)
61
+ else
62
+ replaced_node = ternary_replacement(node)
63
+ return replaced_node unless node.parent
64
+ return "(#{replaced_node})" if %i[and or].include?(node.parent.type)
65
+ return "(#{replaced_node})" if node.parent.send_type? && node.parent.operator_method?
66
+
67
+ replaced_node
68
+ end
69
+ end
70
+
71
+ def always_multiline?
72
+ @config.for_cop('Style/OneLineConditional')['AlwaysCorrectToMultiline']
73
+ end
74
+
75
+ def cannot_replace_to_ternary?(node)
76
+ node.elsif_conditional?
77
+ end
51
78
 
52
- return "(#{to_ternary(node)})" if %i[and or].include?(node.parent.type)
79
+ def multiline_replacement(node, indentation = nil)
80
+ indentation = ' ' * node.source_range.column if indentation.nil?
81
+ if_branch_source = node.if_branch&.source || 'nil'
82
+ elsif_indentation = indentation if node.respond_to?(:elsif?) && node.elsif?
83
+ if_branch = <<~RUBY
84
+ #{elsif_indentation}#{node.keyword} #{node.condition.source}
85
+ #{indentation}#{branch_body_indentation}#{if_branch_source}
86
+ RUBY
87
+ else_branch = else_branch_to_multiline(node.else_branch, indentation)
88
+ if_branch + else_branch
89
+ end
53
90
 
54
- return "(#{to_ternary(node)})" if node.parent.send_type? && node.parent.operator_method?
91
+ def else_branch_to_multiline(else_branch, indentation)
92
+ if else_branch.nil?
93
+ 'end'
94
+ elsif else_branch.if_type? && else_branch.elsif?
95
+ multiline_replacement(else_branch, indentation)
96
+ else
97
+ <<~RUBY.chomp
98
+ #{indentation}else
99
+ #{indentation}#{branch_body_indentation}#{else_branch.source}
100
+ #{indentation}end
101
+ RUBY
102
+ end
103
+ end
55
104
 
56
- to_ternary(node)
105
+ def branch_body_indentation
106
+ ' ' * (@config.for_cop('Layout/IndentationWidth')['Width'] || 2)
57
107
  end
58
108
 
59
- def to_ternary(node)
109
+ def ternary_replacement(node)
60
110
  condition, if_branch, else_branch = *node
61
111
 
62
112
  "#{expr_replacement(condition)} ? " \