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
@@ -43,8 +43,8 @@ module RuboCop
43
43
  'Modifier form of `%<keyword>s` makes the line too long.'
44
44
 
45
45
  def on_if(node)
46
- msg = if single_line_as_modifier?(node)
47
- MSG_USE_MODIFIER unless named_capture_in_condition?(node)
46
+ msg = if single_line_as_modifier?(node) && !named_capture_in_condition?(node)
47
+ MSG_USE_MODIFIER
48
48
  elsif too_long_due_to_modifier?(node)
49
49
  MSG_USE_NORMAL
50
50
  end
@@ -157,10 +157,6 @@ module RuboCop
157
157
  #{indentation}end
158
158
  RUBY
159
159
  end
160
-
161
- def first_line_comment(node)
162
- processed_source.comment_at_line(node.loc.line)&.text
163
- end
164
160
  end
165
161
  end
166
162
  end
@@ -17,6 +17,7 @@ module RuboCop
17
17
  class ImplicitRuntimeError < Base
18
18
  MSG = 'Use `%<method>s` with an explicit exception class and message,' \
19
19
  ' rather than just a message.'
20
+ RESTRICT_ON_SEND = %i[raise fail].freeze
20
21
 
21
22
  def_node_matcher :implicit_runtime_error_raise_or_fail,
22
23
  '(send nil? ${:raise :fail} {str dstr})'
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop enforces that optional keyword parameters are placed at the
7
+ # end of the parameters list.
8
+ #
9
+ # This improves readability, because when looking through the source,
10
+ # it is expected to find required parameters at the beginning of parameters list
11
+ # and optional parameters at the end.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # def some_method(first: false, second:, third: 10)
16
+ # # body omitted
17
+ # end
18
+ #
19
+ # # good
20
+ # def some_method(second:, first: false, third: 10)
21
+ # # body omitted
22
+ # end
23
+ #
24
+ class KeywordParametersOrder < Base
25
+ include RangeHelp
26
+ extend AutoCorrector
27
+
28
+ MSG = 'Place optional keyword parameters at the end of the parameters list.'
29
+
30
+ def on_kwoptarg(node)
31
+ kwarg_nodes = node.right_siblings.select(&:kwarg_type?)
32
+ return if kwarg_nodes.empty?
33
+
34
+ add_offense(node) do |corrector|
35
+ if node.parent.find(&:kwoptarg_type?) == node
36
+ corrector.insert_before(node, "#{kwarg_nodes.map(&:source).join(', ')}, ")
37
+ remove_kwargs(kwarg_nodes, corrector)
38
+ end
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def remove_kwargs(kwarg_nodes, corrector)
45
+ kwarg_nodes.each do |kwarg|
46
+ with_space = range_with_surrounding_space(range: kwarg.source_range)
47
+ corrector.remove(range_with_surrounding_comma(with_space, :left))
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -22,8 +22,10 @@ module RuboCop
22
22
  include ConfigurableEnforcedStyle
23
23
  extend AutoCorrector
24
24
 
25
+ RESTRICT_ON_SEND = %i[call].freeze
26
+
25
27
  def on_send(node)
26
- return unless node.receiver && node.method?(:call)
28
+ return unless node.receiver
27
29
 
28
30
  if offense?(node) && opposite_style_detected
29
31
  add_offense(node) do |corrector|
@@ -8,10 +8,19 @@ module RuboCop
8
8
  # when reading code.
9
9
  #
10
10
  # @example
11
- #
11
+ # # bad
12
12
  # a do
13
13
  # b
14
14
  # end.c
15
+ #
16
+ # # good
17
+ # a { b }.c
18
+ #
19
+ # # good
20
+ # foo = a do
21
+ # b
22
+ # end
23
+ # foo.c
15
24
  class MethodCalledOnDoEndBlock < Base
16
25
  include RangeHelp
17
26
 
@@ -140,16 +140,12 @@ module RuboCop
140
140
  def missing_parentheses(node)
141
141
  location = node.arguments.source_range
142
142
 
143
- return unless unexpected_style_detected(:require_no_parentheses)
144
-
145
143
  add_offense(location, message: MSG_MISSING) do |corrector|
146
144
  correct_definition(node, corrector)
147
145
  end
148
146
  end
149
147
 
150
148
  def unwanted_parentheses(args)
151
- return unless unexpected_style_detected(:require_parentheses)
152
-
153
149
  add_offense(args, message: MSG_PRESENT) do |corrector|
154
150
  # offense is registered on args node when parentheses are unwanted
155
151
  correct_arguments(args, corrector)
@@ -43,47 +43,28 @@ module RuboCop
43
43
  class MixinUsage < Base
44
44
  MSG = '`%<statement>s` is used at the top level. Use inside `class` ' \
45
45
  'or `module`.'
46
+ RESTRICT_ON_SEND = %i[include extend prepend].freeze
46
47
 
47
48
  def_node_matcher :include_statement, <<~PATTERN
48
49
  (send nil? ${:include :extend :prepend}
49
50
  const)
50
51
  PATTERN
51
52
 
52
- def_node_matcher :wrapped_macro_scope?, <<~PATTERN
53
- {({sclass class module block} ... ({begin if} ...))}
53
+ def_node_matcher :in_top_level_scope?, <<~PATTERN
54
+ {
55
+ root? # either at the top level
56
+ ^[ {kwbegin begin if def} # or wrapped within one of these
57
+ #in_top_level_scope? ] # that is in top level scope
58
+ }
54
59
  PATTERN
55
60
 
56
61
  def on_send(node)
57
62
  include_statement(node) do |statement|
58
- return if node.argument? ||
59
- accepted_include?(node) ||
60
- belongs_to_class_or_module?(node)
63
+ return unless in_top_level_scope?(node)
61
64
 
62
65
  add_offense(node, message: format(MSG, statement: statement))
63
66
  end
64
67
  end
65
-
66
- private
67
-
68
- def accepted_include?(node)
69
- node.parent && (node.macro? || ascend_macro_scope?(node.parent))
70
- end
71
-
72
- def ascend_macro_scope?(ancestor)
73
- return true if wrapped_macro_scope?(ancestor)
74
-
75
- ancestor.parent && ascend_macro_scope?(ancestor.parent)
76
- end
77
-
78
- def belongs_to_class_or_module?(node)
79
- if !node.parent
80
- false
81
- else
82
- return true if node.parent.class_type? || node.parent.module_type?
83
-
84
- belongs_to_class_or_module?(node.parent)
85
- end
86
- end
87
68
  end
88
69
  end
89
70
  end
@@ -22,7 +22,7 @@ module RuboCop
22
22
  # alive_threads.map do |t|
23
23
  # t.object_id
24
24
  # end
25
- class MultilineBlockChain < Cop
25
+ class MultilineBlockChain < Base
26
26
  include RangeHelp
27
27
 
28
28
  MSG = 'Avoid multi-line chains of blocks.'
@@ -36,7 +36,7 @@ module RuboCop
36
36
  range = range_between(receiver.loc.end.begin_pos,
37
37
  node.send_node.source_range.end_pos)
38
38
 
39
- add_offense(nil, location: range)
39
+ add_offense(range)
40
40
 
41
41
  # Done. If there are more blocks in the chain, they will be
42
42
  # found by subsequent calls to on_block.
@@ -5,6 +5,9 @@ module RuboCop
5
5
  module Style
6
6
  # This cop checks for multi-line ternary op expressions.
7
7
  #
8
+ # NOTE: `return if ... else ... end` is syntax error. If `return` is used before
9
+ # multiline ternary operator expression, it cannot be auto-corrected.
10
+ #
8
11
  # @example
9
12
  # # bad
10
13
  # a = cond ?
@@ -29,9 +32,13 @@ module RuboCop
29
32
  'use `if` or `unless` instead.'
30
33
 
31
34
  def on_if(node)
32
- return unless node.ternary? && node.multiline?
35
+ return unless offense?(node)
33
36
 
34
37
  add_offense(node) do |corrector|
38
+ # `return if ... else ... end` is syntax error. If `return` is used before
39
+ # multiline ternary operator expression, it cannot be auto-corrected.
40
+ next unless offense?(node) && !node.parent.return_type?
41
+
35
42
  corrector.replace(node, <<~RUBY.chop)
36
43
  if #{node.condition.source}
37
44
  #{node.if_branch.source}
@@ -41,6 +48,12 @@ module RuboCop
41
48
  RUBY
42
49
  end
43
50
  end
51
+
52
+ private
53
+
54
+ def offense?(node)
55
+ node.ternary? && node.multiline?
56
+ end
44
57
  end
45
58
  end
46
59
  end
@@ -44,7 +44,7 @@ module RuboCop
44
44
  # Requires `then` for write `when` and its body on the same line.
45
45
  return if require_then?(node)
46
46
 
47
- # With more than one statements after then, there's not offense
47
+ # For arrays and hashes there's no offense
48
48
  return if accept_node_type?(node.body)
49
49
 
50
50
  range = node.loc.begin
@@ -58,13 +58,14 @@ module RuboCop
58
58
  private
59
59
 
60
60
  def require_then?(when_node)
61
+ return true if when_node.conditions.count >= 2
61
62
  return false unless when_node.body
62
63
 
63
64
  when_node.loc.line == when_node.body.loc.line
64
65
  end
65
66
 
66
67
  def accept_node_type?(node)
67
- node&.begin_type? || node&.array_type? || node&.hash_type?
68
+ node&.array_type? || node&.hash_type?
68
69
  end
69
70
  end
70
71
  end
@@ -68,19 +68,19 @@ module RuboCop
68
68
  # if !foo
69
69
  # bar
70
70
  # end
71
- class NegatedIf < Cop
71
+ class NegatedIf < Base
72
72
  include ConfigurableEnforcedStyle
73
73
  include NegativeConditional
74
+ extend AutoCorrector
74
75
 
75
76
  def on_if(node)
76
77
  return if node.unless? || node.elsif? || node.ternary?
77
78
  return if correct_style?(node)
78
79
 
79
- check_negative_conditional(node)
80
- end
81
-
82
- def autocorrect(node)
83
- ConditionCorrector.correct_negative_condition(node)
80
+ message = message(node)
81
+ check_negative_conditional(node, message: message) do |corrector|
82
+ ConditionCorrector.correct_negative_condition(corrector, node)
83
+ end
84
84
  end
85
85
 
86
86
  private
@@ -58,19 +58,19 @@ module RuboCop
58
58
  # unless !foo
59
59
  # bar
60
60
  # end
61
- class NegatedUnless < Cop
61
+ class NegatedUnless < Base
62
62
  include ConfigurableEnforcedStyle
63
63
  include NegativeConditional
64
+ extend AutoCorrector
64
65
 
65
66
  def on_if(node)
66
67
  return if node.if? || node.elsif? || node.ternary?
67
68
  return if correct_style?(node)
68
69
 
69
- check_negative_conditional(node)
70
- end
71
-
72
- def autocorrect(node)
73
- ConditionCorrector.correct_negative_condition(node)
70
+ message = message(node)
71
+ check_negative_conditional(node, message: message) do |corrector|
72
+ ConditionCorrector.correct_negative_condition(corrector, node)
73
+ end
74
74
  end
75
75
 
76
76
  private
@@ -22,26 +22,18 @@ module RuboCop
22
22
  # # good
23
23
  # bar while foo
24
24
  # bar while !foo && baz
25
- class NegatedWhile < Cop
25
+ class NegatedWhile < Base
26
26
  include NegativeConditional
27
+ extend AutoCorrector
27
28
 
28
29
  def on_while(node)
29
- check_negative_conditional(node)
30
- end
31
-
32
- def on_until(node)
33
- check_negative_conditional(node)
34
- end
35
-
36
- def autocorrect(node)
37
- ConditionCorrector.correct_negative_condition(node)
38
- end
39
-
40
- private
30
+ message = format(MSG, inverse: node.inverse_keyword, current: node.keyword)
41
31
 
42
- def message(node)
43
- format(MSG, inverse: node.inverse_keyword, current: node.keyword)
32
+ check_negative_conditional(node, message: message) do |corrector|
33
+ ConditionCorrector.correct_negative_condition(corrector, node)
34
+ end
44
35
  end
36
+ alias on_until on_while
45
37
  end
46
38
  end
47
39
  end
@@ -13,28 +13,27 @@ module RuboCop
13
13
  #
14
14
  # # good
15
15
  # something if b && a
16
- class NestedModifier < Cop
16
+ class NestedModifier < Base
17
17
  include RangeHelp
18
+ extend AutoCorrector
18
19
 
19
20
  MSG = 'Avoid using nested modifiers.'
20
21
 
21
22
  def on_while(node)
22
23
  check(node)
23
24
  end
25
+ alias on_until on_while
26
+ alias on_if on_while
24
27
 
25
- def on_until(node)
26
- check(node)
27
- end
28
-
29
- def on_if(node)
30
- check(node)
31
- end
28
+ private
32
29
 
33
30
  def check(node)
34
31
  return if part_of_ignored_node?(node)
35
32
  return unless modifier?(node) && modifier?(node.parent)
36
33
 
37
- add_offense(node, location: :keyword)
34
+ add_offense(node.loc.keyword) do |corrector|
35
+ autocorrect(corrector, node)
36
+ end
38
37
  ignore_node(node)
39
38
  end
40
39
 
@@ -42,15 +41,13 @@ module RuboCop
42
41
  node&.basic_conditional? && node&.modifier_form?
43
42
  end
44
43
 
45
- def autocorrect(node)
44
+ def autocorrect(corrector, node)
46
45
  return unless node.if_type? && node.parent.if_type?
47
46
 
48
47
  range = range_between(node.loc.keyword.begin_pos,
49
48
  node.parent.condition.source_range.end_pos)
50
49
 
51
- lambda do |corrector|
52
- corrector.replace(range, new_expression(node))
53
- end
50
+ corrector.replace(range, new_expression(node))
54
51
  end
55
52
 
56
53
  def new_expression(inner_node)
@@ -12,9 +12,10 @@ module RuboCop
12
12
  #
13
13
  # # bad
14
14
  # method1(method2 arg)
15
- class NestedParenthesizedCalls < Cop
15
+ class NestedParenthesizedCalls < Base
16
16
  include RangeHelp
17
17
  include AllowedMethods
18
+ extend AutoCorrector
18
19
 
19
20
  MSG = 'Add parentheses to nested method call `%<source>s`.'
20
21
 
@@ -24,14 +25,17 @@ module RuboCop
24
25
  node.each_child_node(:send, :csend) do |nested|
25
26
  next if allowed_omission?(nested)
26
27
 
27
- add_offense(nested,
28
- location: nested.source_range,
29
- message: format(MSG, source: nested.source))
28
+ message = format(MSG, source: nested.source)
29
+ add_offense(nested.source_range, message: message) do |corrector|
30
+ autocorrect(corrector, nested)
31
+ end
30
32
  end
31
33
  end
32
34
  alias on_csend on_send
33
35
 
34
- def autocorrect(nested)
36
+ private
37
+
38
+ def autocorrect(corrector, nested)
35
39
  first_arg = nested.first_argument.source_range
36
40
  last_arg = nested.last_argument.source_range
37
41
 
@@ -41,14 +45,10 @@ module RuboCop
41
45
  whitespace: true,
42
46
  continuations: true)
43
47
 
44
- lambda do |corrector|
45
- corrector.replace(leading_space, '(')
46
- corrector.insert_after(last_arg, ')')
47
- end
48
+ corrector.replace(leading_space, '(')
49
+ corrector.insert_after(last_arg, ')')
48
50
  end
49
51
 
50
- private
51
-
52
52
  def allowed_omission?(send_node)
53
53
  !send_node.arguments? || send_node.parenthesized? ||
54
54
  send_node.setter_method? || send_node.operator_method? ||