rubocop 0.49.1 → 0.52.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 (506) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -9
  3. data/bin/rubocop +1 -1
  4. data/config/default.yml +264 -118
  5. data/config/disabled.yml +13 -9
  6. data/config/enabled.yml +1156 -918
  7. data/lib/rubocop.rb +555 -489
  8. data/lib/rubocop/ast/builder.rb +6 -1
  9. data/lib/rubocop/ast/node.rb +68 -52
  10. data/lib/rubocop/ast/node/args_node.rb +15 -10
  11. data/lib/rubocop/ast/node/array_node.rb +10 -1
  12. data/lib/rubocop/ast/node/block_node.rb +9 -0
  13. data/lib/rubocop/ast/node/def_node.rb +71 -0
  14. data/lib/rubocop/ast/node/for_node.rb +8 -0
  15. data/lib/rubocop/ast/node/if_node.rb +10 -2
  16. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  17. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  18. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  19. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  20. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
  21. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  22. data/lib/rubocop/ast/node/send_node.rb +21 -150
  23. data/lib/rubocop/ast/node/str_node.rb +14 -0
  24. data/lib/rubocop/ast/node/super_node.rb +3 -24
  25. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  26. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  27. data/lib/rubocop/ast/traversal.rb +7 -7
  28. data/lib/rubocop/cached_data.rb +1 -6
  29. data/lib/rubocop/cli.rb +59 -13
  30. data/lib/rubocop/comment_config.rb +2 -5
  31. data/lib/rubocop/config.rb +136 -29
  32. data/lib/rubocop/config_loader.rb +61 -104
  33. data/lib/rubocop/config_loader_resolver.rb +102 -4
  34. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  35. data/lib/rubocop/cop/bundler/duplicated_gem.rb +13 -11
  36. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
  37. data/lib/rubocop/cop/bundler/ordered_gems.rb +7 -58
  38. data/lib/rubocop/cop/commissioner.rb +6 -3
  39. data/lib/rubocop/cop/cop.rb +11 -6
  40. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  41. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +97 -0
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  43. data/lib/rubocop/cop/generator.rb +122 -25
  44. data/lib/rubocop/cop/internal_affairs.rb +6 -2
  45. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  46. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +16 -5
  47. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  48. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
  49. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
  50. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  51. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -10
  52. data/lib/rubocop/cop/layout/align_array.rb +2 -2
  53. data/lib/rubocop/cop/layout/align_hash.rb +18 -18
  54. data/lib/rubocop/cop/layout/align_parameters.rb +11 -23
  55. data/lib/rubocop/cop/layout/block_end_newline.rb +20 -6
  56. data/lib/rubocop/cop/layout/case_indentation.rb +15 -18
  57. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  58. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +7 -6
  59. data/lib/rubocop/cop/layout/comment_indentation.rb +42 -3
  60. data/lib/rubocop/cop/layout/dot_position.rb +31 -13
  61. data/lib/rubocop/cop/layout/else_alignment.rb +37 -17
  62. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +1 -1
  63. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +22 -18
  64. data/lib/rubocop/cop/layout/empty_lines.rb +16 -2
  65. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +23 -6
  66. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  67. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  68. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  69. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +10 -6
  71. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +5 -5
  72. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  73. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  74. data/lib/rubocop/cop/layout/extra_spacing.rb +23 -26
  75. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
  76. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +9 -3
  77. data/lib/rubocop/cop/layout/indent_array.rb +68 -21
  78. data/lib/rubocop/cop/layout/indent_hash.rb +71 -26
  79. data/lib/rubocop/cop/layout/indent_heredoc.rb +70 -35
  80. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
  81. data/lib/rubocop/cop/layout/indentation_width.rb +40 -27
  82. data/lib/rubocop/cop/layout/initial_indentation.rb +10 -7
  83. data/lib/rubocop/cop/layout/leading_comment_space.rb +32 -17
  84. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  85. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +12 -11
  86. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  87. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  88. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +29 -27
  89. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +7 -3
  90. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
  91. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +12 -4
  92. data/lib/rubocop/cop/layout/space_after_colon.rb +13 -6
  93. data/lib/rubocop/cop/layout/space_after_comma.rb +11 -1
  94. data/lib/rubocop/cop/layout/space_after_method_name.rb +8 -6
  95. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  96. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  97. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +32 -25
  98. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +28 -17
  99. data/lib/rubocop/cop/layout/space_around_keyword.rb +22 -16
  100. data/lib/rubocop/cop/layout/space_around_operators.rb +27 -14
  101. data/lib/rubocop/cop/layout/space_before_block_braces.rb +61 -12
  102. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  103. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -5
  104. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -4
  105. data/lib/rubocop/cop/layout/space_before_semicolon.rb +8 -1
  106. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +12 -14
  107. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  108. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +4 -4
  109. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +89 -18
  110. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +62 -36
  111. data/lib/rubocop/cop/layout/space_inside_parens.rb +40 -3
  112. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  113. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  114. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  115. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +32 -17
  116. data/lib/rubocop/cop/layout/tab.rb +7 -4
  117. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +11 -9
  118. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  119. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +12 -19
  120. data/lib/rubocop/cop/lint/assignment_in_condition.rb +16 -2
  121. data/lib/rubocop/cop/lint/block_alignment.rb +42 -30
  122. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  123. data/lib/rubocop/cop/lint/circular_argument_reference.rb +3 -14
  124. data/lib/rubocop/cop/lint/condition_position.rb +5 -1
  125. data/lib/rubocop/cop/lint/debugger.rb +18 -11
  126. data/lib/rubocop/cop/lint/def_end_alignment.rb +9 -14
  127. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
  128. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
  129. data/lib/rubocop/cop/lint/duplicate_methods.rb +75 -5
  130. data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
  131. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  132. data/lib/rubocop/cop/lint/else_layout.rb +3 -3
  133. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  134. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  135. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  136. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  137. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  138. data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
  139. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  140. data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
  141. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +36 -41
  142. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  143. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  144. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +25 -20
  145. data/lib/rubocop/cop/lint/inherit_exception.rb +16 -19
  146. data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
  147. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +21 -7
  148. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  149. data/lib/rubocop/cop/lint/loop.rb +1 -1
  150. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  151. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  152. data/lib/rubocop/cop/lint/nested_method_definition.rb +6 -8
  153. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  154. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  155. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
  156. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -3
  157. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -22
  158. data/lib/rubocop/cop/lint/percent_symbol_array.rb +12 -12
  159. data/lib/rubocop/cop/lint/rand_one.rb +8 -2
  160. data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
  161. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  162. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  163. data/lib/rubocop/cop/lint/require_parentheses.rb +5 -3
  164. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  165. data/lib/rubocop/cop/lint/rescue_type.rb +18 -9
  166. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  167. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  168. data/lib/rubocop/cop/lint/script_permission.rb +8 -1
  169. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  170. data/lib/rubocop/cop/lint/shadowed_exception.rb +37 -10
  171. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
  172. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +7 -7
  173. data/lib/rubocop/cop/lint/syntax.rb +23 -20
  174. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
  175. data/lib/rubocop/cop/lint/unified_integer.rb +5 -4
  176. data/lib/rubocop/cop/lint/unneeded_disable.rb +41 -16
  177. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
  178. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +45 -19
  179. data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
  180. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  181. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
  182. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  183. data/lib/rubocop/cop/lint/useless_access_modifier.rb +12 -16
  184. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  185. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  186. data/lib/rubocop/cop/lint/useless_setter_call.rb +15 -12
  187. data/lib/rubocop/cop/lint/void.rb +38 -27
  188. data/lib/rubocop/cop/message_annotator.rb +4 -2
  189. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  190. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  191. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  192. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  193. data/lib/rubocop/cop/metrics/line_length.rb +8 -5
  194. data/lib/rubocop/cop/metrics/method_length.rb +8 -3
  195. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  196. data/lib/rubocop/cop/metrics/parameter_lists.rb +14 -5
  197. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  198. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +3 -2
  199. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +2 -2
  200. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  201. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  202. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  203. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  204. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +14 -7
  205. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  206. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +8 -4
  207. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -3
  208. data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
  209. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  210. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -7
  211. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +74 -33
  212. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +34 -8
  213. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -1
  214. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +67 -0
  215. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  216. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -1
  217. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  218. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +9 -8
  219. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +11 -10
  220. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  221. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  222. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  223. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  224. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  225. data/lib/rubocop/cop/mixin/trailing_comma.rb +25 -17
  226. data/lib/rubocop/cop/mixin/unused_argument.rb +6 -2
  227. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  228. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +35 -2
  229. data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +7 -6
  230. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  231. data/lib/rubocop/cop/naming/constant_name.rb +58 -0
  232. data/lib/rubocop/cop/{style → naming}/file_name.rb +28 -13
  233. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  234. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
  235. data/lib/rubocop/cop/naming/method_name.rb +40 -0
  236. data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
  237. data/lib/rubocop/cop/naming/variable_name.rb +50 -0
  238. data/lib/rubocop/cop/{style → naming}/variable_number.rb +11 -28
  239. data/lib/rubocop/cop/offense.rb +6 -1
  240. data/lib/rubocop/cop/performance/caller.rb +39 -11
  241. data/lib/rubocop/cop/performance/case_when_splat.rb +3 -7
  242. data/lib/rubocop/cop/performance/casecmp.rb +9 -8
  243. data/lib/rubocop/cop/performance/compare_with_block.rb +23 -13
  244. data/lib/rubocop/cop/performance/count.rb +7 -4
  245. data/lib/rubocop/cop/performance/detect.rb +9 -6
  246. data/lib/rubocop/cop/performance/double_start_end_with.rb +12 -20
  247. data/lib/rubocop/cop/performance/end_with.rb +6 -6
  248. data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
  249. data/lib/rubocop/cop/performance/flat_map.rb +5 -2
  250. data/lib/rubocop/cop/performance/hash_each_methods.rb +85 -40
  251. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +9 -6
  252. data/lib/rubocop/cop/performance/range_include.rb +3 -3
  253. data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -28
  254. data/lib/rubocop/cop/performance/redundant_match.rb +13 -12
  255. data/lib/rubocop/cop/performance/redundant_merge.rb +44 -26
  256. data/lib/rubocop/cop/performance/redundant_sort_by.rb +9 -6
  257. data/lib/rubocop/cop/performance/regexp_match.rb +19 -10
  258. data/lib/rubocop/cop/performance/reverse_each.rb +1 -1
  259. data/lib/rubocop/cop/performance/sample.rb +1 -1
  260. data/lib/rubocop/cop/performance/size.rb +3 -3
  261. data/lib/rubocop/cop/performance/start_with.rb +6 -6
  262. data/lib/rubocop/cop/performance/string_replacement.rb +6 -6
  263. data/lib/rubocop/cop/performance/times_map.rb +32 -22
  264. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  265. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  266. data/lib/rubocop/cop/rails/action_filter.rb +23 -1
  267. data/lib/rubocop/cop/rails/active_support_aliases.rb +4 -5
  268. data/lib/rubocop/cop/rails/application_job.rb +5 -3
  269. data/lib/rubocop/cop/rails/application_record.rb +5 -3
  270. data/lib/rubocop/cop/rails/blank.rb +20 -17
  271. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  272. data/lib/rubocop/cop/rails/date.rb +7 -6
  273. data/lib/rubocop/cop/rails/delegate.rb +53 -29
  274. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +4 -4
  275. data/lib/rubocop/cop/rails/dynamic_find_by.rb +2 -2
  276. data/lib/rubocop/cop/rails/enum_uniqueness.rb +4 -4
  277. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  278. data/lib/rubocop/cop/rails/exit.rb +8 -1
  279. data/lib/rubocop/cop/rails/file_path.rb +8 -11
  280. data/lib/rubocop/cop/rails/find_by.rb +2 -1
  281. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  282. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +8 -1
  283. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +76 -0
  284. data/lib/rubocop/cop/rails/http_positional_arguments.rb +40 -44
  285. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  286. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  287. data/lib/rubocop/cop/rails/not_null_column.rb +6 -6
  288. data/lib/rubocop/cop/rails/output.rb +11 -2
  289. data/lib/rubocop/cop/rails/output_safety.rb +16 -21
  290. data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -10
  291. data/lib/rubocop/cop/rails/presence.rb +105 -0
  292. data/lib/rubocop/cop/rails/present.rb +14 -17
  293. data/lib/rubocop/cop/rails/read_write_attribute.rb +13 -13
  294. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  295. data/lib/rubocop/cop/rails/relative_date_constant.rb +11 -11
  296. data/lib/rubocop/cop/rails/request_referer.rb +3 -3
  297. data/lib/rubocop/cop/rails/reversible_migration.rb +36 -35
  298. data/lib/rubocop/cop/rails/safe_navigation.rb +7 -8
  299. data/lib/rubocop/cop/rails/save_bang.rb +19 -17
  300. data/lib/rubocop/cop/rails/scope_args.rb +2 -2
  301. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
  302. data/lib/rubocop/cop/rails/time_zone.rb +3 -2
  303. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +4 -2
  304. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  305. data/lib/rubocop/cop/rails/validation.rb +8 -8
  306. data/lib/rubocop/cop/registry.rb +2 -1
  307. data/lib/rubocop/cop/security/eval.rb +4 -4
  308. data/lib/rubocop/cop/security/json_load.rb +7 -5
  309. data/lib/rubocop/cop/security/marshal_load.rb +8 -6
  310. data/lib/rubocop/cop/security/yaml_load.rb +4 -4
  311. data/lib/rubocop/cop/style/alias.rb +49 -27
  312. data/lib/rubocop/cop/style/and_or.rb +65 -45
  313. data/lib/rubocop/cop/style/array_join.rb +10 -1
  314. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  315. data/lib/rubocop/cop/style/attr.rb +15 -5
  316. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +7 -5
  317. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  318. data/lib/rubocop/cop/style/begin_block.rb +1 -1
  319. data/lib/rubocop/cop/style/block_comments.rb +17 -3
  320. data/lib/rubocop/cop/style/block_delimiters.rb +82 -16
  321. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +68 -32
  322. data/lib/rubocop/cop/style/case_equality.rb +13 -1
  323. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  324. data/lib/rubocop/cop/style/class_and_module_children.rb +8 -4
  325. data/lib/rubocop/cop/style/class_check.rb +29 -10
  326. data/lib/rubocop/cop/style/class_methods.rb +10 -9
  327. data/lib/rubocop/cop/style/class_vars.rb +5 -4
  328. data/lib/rubocop/cop/style/collection_methods.rb +5 -3
  329. data/lib/rubocop/cop/style/colon_method_call.rb +18 -2
  330. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  331. data/lib/rubocop/cop/style/command_literal.rb +90 -30
  332. data/lib/rubocop/cop/style/comment_annotation.rb +39 -11
  333. data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
  334. data/lib/rubocop/cop/style/conditional_assignment.rb +41 -41
  335. data/lib/rubocop/cop/style/copyright.rb +27 -28
  336. data/lib/rubocop/cop/style/date_time.rb +44 -0
  337. data/lib/rubocop/cop/style/def_with_parentheses.rb +31 -5
  338. data/lib/rubocop/cop/style/dir.rb +48 -0
  339. data/lib/rubocop/cop/style/documentation.rb +17 -2
  340. data/lib/rubocop/cop/style/documentation_method.rb +2 -6
  341. data/lib/rubocop/cop/style/double_negation.rb +1 -1
  342. data/lib/rubocop/cop/style/each_for_simple_loop.rb +8 -8
  343. data/lib/rubocop/cop/style/each_with_object.rb +6 -5
  344. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  345. data/lib/rubocop/cop/style/empty_case_condition.rb +3 -3
  346. data/lib/rubocop/cop/style/empty_else.rb +55 -24
  347. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  348. data/lib/rubocop/cop/style/empty_literal.rb +25 -14
  349. data/lib/rubocop/cop/style/empty_method.rb +29 -25
  350. data/lib/rubocop/cop/style/encoding.rb +8 -51
  351. data/lib/rubocop/cop/style/end_block.rb +1 -1
  352. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  353. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  354. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  355. data/lib/rubocop/cop/style/flip_flop.rb +13 -2
  356. data/lib/rubocop/cop/style/for.rb +6 -2
  357. data/lib/rubocop/cop/style/format_string.rb +33 -5
  358. data/lib/rubocop/cop/style/format_string_token.rb +17 -15
  359. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -6
  360. data/lib/rubocop/cop/style/global_vars.rb +12 -2
  361. data/lib/rubocop/cop/style/guard_clause.rb +6 -4
  362. data/lib/rubocop/cop/style/hash_syntax.rb +56 -56
  363. data/lib/rubocop/cop/style/identical_conditional_branches.rb +12 -8
  364. data/lib/rubocop/cop/style/if_inside_else.rb +11 -11
  365. data/lib/rubocop/cop/style/if_unless_modifier.rb +8 -7
  366. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -2
  367. data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -1
  368. data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -6
  369. data/lib/rubocop/cop/style/infinite_loop.rb +4 -4
  370. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  371. data/lib/rubocop/cop/style/inverse_methods.rb +24 -14
  372. data/lib/rubocop/cop/style/lambda.rb +45 -43
  373. data/lib/rubocop/cop/style/lambda_call.rb +37 -10
  374. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -5
  375. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +3 -19
  376. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
  377. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -1
  378. data/lib/rubocop/cop/style/method_def_parentheses.rb +20 -25
  379. data/lib/rubocop/cop/style/method_missing.rb +13 -26
  380. data/lib/rubocop/cop/style/min_max.rb +68 -0
  381. data/lib/rubocop/cop/style/missing_else.rb +20 -6
  382. data/lib/rubocop/cop/style/mixin_grouping.rb +31 -21
  383. data/lib/rubocop/cop/style/mixin_usage.rb +71 -0
  384. data/lib/rubocop/cop/style/module_function.rb +27 -11
  385. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  386. data/lib/rubocop/cop/style/multiline_if_modifier.rb +8 -4
  387. data/lib/rubocop/cop/style/multiline_if_then.rb +15 -13
  388. data/lib/rubocop/cop/style/multiline_memoization.rb +33 -17
  389. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  390. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  391. data/lib/rubocop/cop/style/mutable_constant.rb +11 -15
  392. data/lib/rubocop/cop/style/negated_if.rb +27 -31
  393. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  394. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  395. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +26 -23
  396. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  397. data/lib/rubocop/cop/style/next.rb +41 -12
  398. data/lib/rubocop/cop/style/nil_comparison.rb +8 -8
  399. data/lib/rubocop/cop/style/non_nil_check.rb +41 -38
  400. data/lib/rubocop/cop/style/not.rb +15 -5
  401. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +8 -4
  402. data/lib/rubocop/cop/style/numeric_literals.rb +9 -9
  403. data/lib/rubocop/cop/style/numeric_predicate.rb +21 -21
  404. data/lib/rubocop/cop/style/one_line_conditional.rb +9 -4
  405. data/lib/rubocop/cop/style/option_hash.rb +11 -25
  406. data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
  407. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  408. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  409. data/lib/rubocop/cop/style/parentheses_around_condition.rb +30 -13
  410. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +25 -4
  411. data/lib/rubocop/cop/style/percent_q_literals.rb +29 -8
  412. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -1
  413. data/lib/rubocop/cop/style/preferred_hash_methods.rb +7 -11
  414. data/lib/rubocop/cop/style/proc.rb +10 -2
  415. data/lib/rubocop/cop/style/raise_args.rb +22 -29
  416. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  417. data/lib/rubocop/cop/style/redundant_begin.rb +16 -5
  418. data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
  419. data/lib/rubocop/cop/style/redundant_exception.rb +4 -4
  420. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  421. data/lib/rubocop/cop/style/redundant_parentheses.rb +14 -12
  422. data/lib/rubocop/cop/style/redundant_return.rb +28 -15
  423. data/lib/rubocop/cop/style/redundant_self.rb +35 -27
  424. data/lib/rubocop/cop/style/regexp_literal.rb +88 -27
  425. data/lib/rubocop/cop/style/rescue_modifier.rb +12 -1
  426. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  427. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  428. data/lib/rubocop/cop/style/safe_navigation.rb +100 -48
  429. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  430. data/lib/rubocop/cop/style/semicolon.rb +19 -9
  431. data/lib/rubocop/cop/style/send.rb +10 -1
  432. data/lib/rubocop/cop/style/signal_exception.rb +104 -3
  433. data/lib/rubocop/cop/style/single_line_block_params.rb +16 -15
  434. data/lib/rubocop/cop/style/single_line_methods.rb +26 -18
  435. data/lib/rubocop/cop/style/special_global_vars.rb +19 -14
  436. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +23 -50
  437. data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
  438. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  439. data/lib/rubocop/cop/style/string_literals.rb +26 -3
  440. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +16 -1
  441. data/lib/rubocop/cop/style/string_methods.rb +19 -8
  442. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  443. data/lib/rubocop/cop/style/symbol_array.rb +7 -35
  444. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  445. data/lib/rubocop/cop/style/symbol_proc.rb +11 -25
  446. data/lib/rubocop/cop/style/ternary_parentheses.rb +46 -51
  447. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  448. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  449. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  450. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  451. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +70 -24
  452. data/lib/rubocop/cop/style/trivial_accessors.rb +72 -65
  453. data/lib/rubocop/cop/style/unless_else.rb +16 -1
  454. data/lib/rubocop/cop/style/unneeded_capital_w.rb +18 -8
  455. data/lib/rubocop/cop/style/unneeded_interpolation.rb +15 -19
  456. data/lib/rubocop/cop/style/unneeded_percent_q.rb +14 -13
  457. data/lib/rubocop/cop/style/variable_interpolation.rb +23 -9
  458. data/lib/rubocop/cop/style/when_then.rb +14 -1
  459. data/lib/rubocop/cop/style/while_until_do.rb +27 -4
  460. data/lib/rubocop/cop/style/while_until_modifier.rb +26 -6
  461. data/lib/rubocop/cop/style/word_array.rb +9 -30
  462. data/lib/rubocop/cop/style/yoda_condition.rb +51 -22
  463. data/lib/rubocop/cop/style/zero_length_predicate.rb +44 -29
  464. data/lib/rubocop/cop/team.rb +16 -8
  465. data/lib/rubocop/cop/util.rb +43 -34
  466. data/lib/rubocop/cop/variable_force.rb +1 -1
  467. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  468. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  469. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  470. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -4
  471. data/lib/rubocop/formatter/formatter_set.rb +3 -1
  472. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  473. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  474. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  475. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  476. data/lib/rubocop/formatter/simple_text_formatter.rb +3 -3
  477. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  478. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
  479. data/lib/rubocop/node_pattern.rb +46 -29
  480. data/lib/rubocop/options.rb +13 -8
  481. data/lib/rubocop/path_util.rb +15 -3
  482. data/lib/rubocop/processed_source.rb +8 -9
  483. data/lib/rubocop/rake_task.rb +16 -23
  484. data/lib/rubocop/remote_config.rb +13 -1
  485. data/lib/rubocop/result_cache.rb +1 -0
  486. data/lib/rubocop/rspec/cop_helper.rb +10 -10
  487. data/lib/rubocop/rspec/expect_offense.rb +6 -8
  488. data/lib/rubocop/rspec/shared_contexts.rb +4 -8
  489. data/lib/rubocop/rspec/shared_examples.rb +8 -8
  490. data/lib/rubocop/rspec/support.rb +5 -5
  491. data/lib/rubocop/runner.rb +1 -1
  492. data/lib/rubocop/string_util.rb +2 -0
  493. data/lib/rubocop/token.rb +74 -0
  494. data/lib/rubocop/version.rb +1 -1
  495. metadata +118 -48
  496. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  497. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -41
  498. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
  499. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
  500. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
  501. data/lib/rubocop/cop/style/accessor_method_name.rb +0 -45
  502. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -29
  503. data/lib/rubocop/cop/style/constant_name.rb +0 -29
  504. data/lib/rubocop/cop/style/method_name.rb +0 -34
  505. data/lib/rubocop/cop/style/predicate_name.rb +0 -67
  506. data/lib/rubocop/cop/style/variable_name.rb +0 -39
@@ -16,11 +16,11 @@ module RuboCop
16
16
  class ScopeArgs < Cop
17
17
  MSG = 'Use `lambda`/`proc` instead of a plain method call.'.freeze
18
18
 
19
- def_node_matcher :scope?, '(send nil :scope _ $send)'
19
+ def_node_matcher :scope?, '(send nil? :scope _ $send)'
20
20
 
21
21
  def on_send(node)
22
22
  scope?(node) do |second_arg|
23
- add_offense(second_arg, :expression)
23
+ add_offense(second_arg)
24
24
  end
25
25
  end
26
26
  end
@@ -38,7 +38,7 @@ module RuboCop
38
38
  update_counters].freeze
39
39
 
40
40
  def_node_matcher :good_touch?, <<-PATTERN
41
- (send (const nil :FileUtils) :touch ...)
41
+ (send (const nil? :FileUtils) :touch ...)
42
42
  PATTERN
43
43
 
44
44
  def on_send(node)
@@ -52,7 +52,7 @@ module RuboCop
52
52
 
53
53
  return if good_touch?(node)
54
54
 
55
- add_offense(node, :selector)
55
+ add_offense(node, location: :selector)
56
56
  end
57
57
 
58
58
  private
@@ -74,7 +74,7 @@ module RuboCop
74
74
 
75
75
  message = build_message(klass, method_name, node)
76
76
 
77
- add_offense(node, :selector, message)
77
+ add_offense(node, location: :selector, message: message)
78
78
  end
79
79
 
80
80
  def build_message(klass, method_name, node)
@@ -148,7 +148,8 @@ module RuboCop
148
148
 
149
149
  return if node.arguments?
150
150
 
151
- add_offense(selector_node, :selector, MSG_LOCALTIME)
151
+ add_offense(selector_node,
152
+ location: :selector, message: MSG_LOCALTIME)
152
153
  end
153
154
 
154
155
  def danger_chain?(chain)
@@ -26,7 +26,7 @@ module RuboCop
26
26
  #
27
27
  # @example
28
28
  # # this will return a Relation that pluck is called on
29
- # Model.where(...).pluck(:id).uniq
29
+ # Model.where(cond: true).pluck(:id).uniq
30
30
  #
31
31
  # # an association on an instance will return a CollectionProxy
32
32
  # instance.assoc.pluck(:id).uniq
@@ -55,7 +55,9 @@ module RuboCop
55
55
  aggressive_node_match(node)
56
56
  end
57
57
 
58
- add_offense(node, :selector, format(MSG, method)) if method
58
+ return unless method
59
+
60
+ add_offense(node, location: :selector, message: format(MSG, method))
59
61
  end
60
62
 
61
63
  def autocorrect(node)
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop checks that environments called with `Rails.env` predicates
7
+ # exist.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # Rails.env.proudction?
12
+ #
13
+ # # good
14
+ # Rails.env.production?
15
+ class UnknownEnv < Cop
16
+ include NameSimilarity
17
+
18
+ MSG = 'Unknown environment `%<name>s`.'.freeze
19
+ MSG_SIMILAR = 'Unknown environment `%<name>s`. ' \
20
+ 'Did you mean `%<similar>s`?'.freeze
21
+
22
+ def_node_matcher :unknown_environment?, <<-PATTERN
23
+ (send
24
+ (send
25
+ {(const nil? :Rails) (const (cbase) :Rails)}
26
+ :env)
27
+ $#unknown_env_name?)
28
+ PATTERN
29
+
30
+ def on_send(node)
31
+ unknown_environment?(node) do |name|
32
+ add_offense(node, location: :selector, message: message(name))
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def collect_variable_like_names(_scope)
39
+ environments.map { |env| env + '?' }
40
+ end
41
+
42
+ def message(name)
43
+ similar = find_similar_name(name.to_s, [])
44
+ if similar
45
+ format(MSG_SIMILAR, name: name, similar: similar)
46
+ else
47
+ format(MSG, name: name)
48
+ end
49
+ end
50
+
51
+ def unknown_env_name?(name)
52
+ name = name.to_s
53
+ name.end_with?('?') &&
54
+ !environments.include?(name[0..-2])
55
+ end
56
+
57
+ def environments
58
+ cop_config['Environments']
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -26,7 +26,14 @@ module RuboCop
26
26
  def on_send(node)
27
27
  return unless !node.receiver && BLACKLIST.include?(node.method_name)
28
28
 
29
- add_offense(node, :selector)
29
+ add_offense(node, location: :selector)
30
+ end
31
+
32
+ def autocorrect(node)
33
+ lambda do |corrector|
34
+ corrector.replace(node.loc.selector, 'validates')
35
+ correct_validate_type(corrector, node)
36
+ end
30
37
  end
31
38
 
32
39
  private
@@ -39,13 +46,6 @@ module RuboCop
39
46
  WHITELIST[BLACKLIST.index(method.to_sym)]
40
47
  end
41
48
 
42
- def autocorrect(node)
43
- lambda do |corrector|
44
- corrector.replace(node.loc.selector, 'validates')
45
- correct_validate_type(corrector, node)
46
- end
47
- end
48
-
49
49
  def correct_validate_type(corrector, node)
50
50
  options = node.arguments.find { |arg| !arg.sym_type? }
51
51
  validate_type = node.method_name.to_s.split('_')[1]
@@ -156,7 +156,8 @@ module RuboCop
156
156
 
157
157
  def resolve_badge(given_badge, real_badge, source_path)
158
158
  unless given_badge.match?(real_badge)
159
- warn "#{source_path}: #{given_badge} has the wrong namespace - " \
159
+ path = PathUtil.smart_path(source_path)
160
+ warn "#{path}: #{given_badge} has the wrong namespace - " \
160
161
  "should be #{real_badge.department}"
161
162
  end
162
163
 
@@ -14,14 +14,14 @@ module RuboCop
14
14
  class Eval < Cop
15
15
  MSG = 'The use of `eval` is a serious security risk.'.freeze
16
16
 
17
- def_node_matcher :eval?, <<-END
18
- (send {nil (send nil :binding)} :eval $!str ...)
19
- END
17
+ def_node_matcher :eval?, <<-PATTERN
18
+ (send {nil? (send nil? :binding)} :eval $!str ...)
19
+ PATTERN
20
20
 
21
21
  def on_send(node)
22
22
  eval?(node) do |code|
23
23
  return if code.dstr_type? && code.recursive_literal?
24
- add_offense(node, :selector)
24
+ add_offense(node, location: :selector)
25
25
  end
26
26
  end
27
27
  end
@@ -23,15 +23,17 @@ module RuboCop
23
23
  # JSON.parse("{}")
24
24
  #
25
25
  class JSONLoad < Cop
26
- MSG = 'Prefer `JSON.parse` over `JSON.%s`.'.freeze
26
+ MSG = 'Prefer `JSON.parse` over `JSON.%<method>s`.'.freeze
27
27
 
28
- def_node_matcher :json_load, <<-END
29
- (send (const {nil cbase} :JSON) ${:load :restore} ...)
30
- END
28
+ def_node_matcher :json_load, <<-PATTERN
29
+ (send (const {nil? cbase} :JSON) ${:load :restore} ...)
30
+ PATTERN
31
31
 
32
32
  def on_send(node)
33
33
  json_load(node) do |method|
34
- add_offense(node, :selector, format(MSG, method))
34
+ add_offense(node,
35
+ location: :selector,
36
+ message: format(MSG, method: method))
35
37
  end
36
38
  end
37
39
 
@@ -19,16 +19,18 @@ module RuboCop
19
19
  # Marshal.load(Marshal.dump({}))
20
20
  #
21
21
  class MarshalLoad < Cop
22
- MSG = 'Avoid using `Marshal.%s`.'.freeze
22
+ MSG = 'Avoid using `Marshal.%<method>s`.'.freeze
23
23
 
24
- def_node_matcher :marshal_load, <<-END
25
- (send (const {nil cbase} :Marshal) ${:load :restore}
26
- !(send (const {nil cbase} :Marshal) :dump ...))
27
- END
24
+ def_node_matcher :marshal_load, <<-PATTERN
25
+ (send (const {nil? cbase} :Marshal) ${:load :restore}
26
+ !(send (const {nil? cbase} :Marshal) :dump ...))
27
+ PATTERN
28
28
 
29
29
  def on_send(node)
30
30
  marshal_load(node) do |method|
31
- add_offense(node, :selector, format(MSG, method))
31
+ add_offense(node,
32
+ location: :selector,
33
+ message: format(MSG, method: method))
32
34
  end
33
35
  end
34
36
  end
@@ -18,13 +18,13 @@ module RuboCop
18
18
  class YAMLLoad < Cop
19
19
  MSG = 'Prefer using `YAML.safe_load` over `YAML.load`.'.freeze
20
20
 
21
- def_node_matcher :yaml_load, <<-END
22
- (send (const {nil cbase} :YAML) :load ...)
23
- END
21
+ def_node_matcher :yaml_load, <<-PATTERN
22
+ (send (const {nil? cbase} :YAML) :load ...)
23
+ PATTERN
24
24
 
25
25
  def on_send(node)
26
26
  yaml_load(node) do
27
- add_offense(node, :selector)
27
+ add_offense(node, location: :selector)
28
28
  end
29
29
  end
30
30
 
@@ -3,49 +3,52 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop finds uses of `alias` where `alias_method` would be more
7
- # appropriate (or is simply preferred due to configuration), and vice
8
- # versa.
9
- # It also finds uses of `alias :symbol` rather than `alias bareword`.
6
+ # This cop enforces the use of either `#alias` or `#alias_method`
7
+ # depending on configuration.
8
+ # It also flags uses of `alias :symbol` rather than `alias bareword`.
9
+ #
10
+ # @example EnforcedStyle: prefer_alias (default)
11
+ # # bad
12
+ # alias_method :bar, :foo
13
+ # alias :bar :foo
14
+ #
15
+ # # good
16
+ # alias bar foo
17
+ #
18
+ # @example EnforcedStyle: prefer_alias_method
19
+ # # bad
20
+ # alias :bar :foo
21
+ # alias bar foo
22
+ #
23
+ # # good
24
+ # alias_method :bar, :foo
10
25
  class Alias < Cop
11
26
  include ConfigurableEnforcedStyle
12
27
 
13
28
  MSG_ALIAS = 'Use `alias_method` instead of `alias`.'.freeze
14
- MSG_ALIAS_METHOD = 'Use `alias` instead of `alias_method` %s.'.freeze
15
- MSG_SYMBOL_ARGS = 'Use `alias %s` instead of `alias %s`.'.freeze
29
+ MSG_ALIAS_METHOD = 'Use `alias` instead of `alias_method` ' \
30
+ '%<current>s.'.freeze
31
+ MSG_SYMBOL_ARGS = 'Use `alias %<prefer>s` instead of ' \
32
+ '`alias %<current>s`.'.freeze
16
33
 
17
34
  def on_send(node)
18
35
  return unless node.command?(:alias_method)
19
- return if style == :prefer_alias_method
20
- return if scope_type(node) == :dynamic
36
+ return unless style == :prefer_alias && alias_keyword_possible?(node)
21
37
 
22
- msg = format(MSG_ALIAS_METHOD, lexical_scope_type(node))
23
- add_offense(node, :selector, msg)
38
+ msg = format(MSG_ALIAS_METHOD, current: lexical_scope_type(node))
39
+ add_offense(node, location: :selector, message: msg)
24
40
  end
25
41
 
26
42
  def on_alias(node)
27
- # alias_method can't be used with global variables
28
- return if node.each_child_node(:gvar).any?
29
- # alias_method can't be used in instance_eval blocks
30
- scope_type = scope_type(node)
31
- return if scope_type == :instance_eval
32
-
33
- if scope_type == :dynamic || style == :prefer_alias_method
34
- add_offense(node, :keyword, MSG_ALIAS)
43
+ return unless alias_method_possible?(node)
44
+
45
+ if scope_type(node) == :dynamic || style == :prefer_alias_method
46
+ add_offense(node, location: :keyword, message: MSG_ALIAS)
35
47
  elsif node.children.none? { |arg| bareword?(arg) }
36
48
  add_offense_for_args(node)
37
49
  end
38
50
  end
39
51
 
40
- def add_offense_for_args(node)
41
- existing_args = node.children.map(&:source).join(' ')
42
- preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
43
- arg_ranges = node.children.map(&:source_range)
44
- msg = format(MSG_SYMBOL_ARGS, preferred_args,
45
- existing_args)
46
- add_offense(node, arg_ranges.reduce(&:join), msg)
47
- end
48
-
49
52
  def autocorrect(node)
50
53
  if node.send_type?
51
54
  correct_alias_method_to_alias(node)
@@ -58,6 +61,25 @@ module RuboCop
58
61
 
59
62
  private
60
63
 
64
+ def alias_keyword_possible?(node)
65
+ scope_type(node) != :dynamic && node.arguments.all?(&:sym_type?)
66
+ end
67
+
68
+ def alias_method_possible?(node)
69
+ scope_type(node) != :instance_eval &&
70
+ node.children.none?(&:gvar_type?)
71
+ end
72
+
73
+ def add_offense_for_args(node)
74
+ existing_args = node.children.map(&:source).join(' ')
75
+ preferred_args = node.children.map { |a| a.source[1..-1] }.join(' ')
76
+ arg_ranges = node.children.map(&:source_range)
77
+ msg = format(MSG_SYMBOL_ARGS,
78
+ prefer: preferred_args,
79
+ current: existing_args)
80
+ add_offense(node, location: arg_ranges.reduce(&:join), message: msg)
81
+ end
82
+
61
83
  # In this expression, will `self` be the same as the innermost enclosing
62
84
  # class or module block (:lexical)? Or will it be something else
63
85
  # (:dynamic)? If we're in an instance_eval block, return that.
@@ -3,85 +3,105 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # This cop checks for uses of *and* and *or*.
6
+ # This cop checks for uses of `and` and `or`, and suggests using `&&` and
7
+ # `|| instead`. It can be configured to check only in conditions, or in
8
+ # all contexts.
9
+ #
10
+ # @example EnforcedStyle: always (default)
11
+ # # bad
12
+ # foo.save and return
13
+ #
14
+ # # bad
15
+ # if foo and bar
16
+ # end
17
+ #
18
+ # # good
19
+ # foo.save && return
20
+ #
21
+ # # good
22
+ # if foo && bar
23
+ # end
24
+ #
25
+ # @example EnforcedStyle: conditionals
26
+ # # bad
27
+ # if foo and bar
28
+ # end
29
+ #
30
+ # # good
31
+ # foo.save && return
32
+ #
33
+ # # good
34
+ # foo.save and return
35
+ #
36
+ # # good
37
+ # if foo && bar
38
+ # end
7
39
  class AndOr < Cop
8
40
  include ConfigurableEnforcedStyle
9
41
 
10
- MSG = 'Use `%s` instead of `%s`.'.freeze
11
-
12
- OPS = { 'and' => '&&', 'or' => '||' }.freeze
42
+ MSG = 'Use `%<prefer>s` instead of `%<current>s`.'.freeze
13
43
 
14
44
  def on_and(node)
15
- process_logical_op(node) if style == :always
16
- end
17
-
18
- def on_or(node)
19
- process_logical_op(node) if style == :always
45
+ process_logical_operator(node) if style == :always
20
46
  end
47
+ alias on_or on_and
21
48
 
22
49
  def on_if(node)
23
50
  on_conditionals(node) if style == :conditionals
24
51
  end
52
+ alias on_while on_if
53
+ alias on_while_post on_if
54
+ alias on_until on_if
55
+ alias on_until_post on_if
25
56
 
26
- def on_while(node)
27
- on_conditionals(node) if style == :conditionals
28
- end
29
-
30
- def on_while_post(node)
31
- on_conditionals(node) if style == :conditionals
32
- end
33
-
34
- def on_until(node)
35
- on_conditionals(node) if style == :conditionals
36
- end
57
+ def autocorrect(node)
58
+ lambda do |corrector|
59
+ node.each_child_node do |expr|
60
+ if expr.send_type?
61
+ correct_send(expr, corrector)
62
+ elsif expr.return_type?
63
+ correct_other(expr, corrector)
64
+ elsif expr.assignment?
65
+ correct_other(expr, corrector)
66
+ end
67
+ end
37
68
 
38
- def on_until_post(node)
39
- on_conditionals(node) if style == :conditionals
69
+ corrector.replace(node.loc.operator, node.alternate_operator)
70
+ end
40
71
  end
41
72
 
42
73
  private
43
74
 
44
75
  def on_conditionals(node)
45
76
  node.condition.each_node(*LOGICAL_OPERATOR_NODES) do |logical_node|
46
- process_logical_op(logical_node)
77
+ process_logical_operator(logical_node)
47
78
  end
48
79
  end
49
80
 
50
- def process_logical_op(node)
81
+ def process_logical_operator(node)
51
82
  return if node.logical_operator?
52
83
 
53
- add_offense(node, :operator,
54
- format(MSG, node.alternate_operator, node.operator))
84
+ add_offense(node, location: :operator)
55
85
  end
56
86
 
57
- def autocorrect(node)
58
- lambda do |corrector|
59
- [*node].each do |expr|
60
- if expr.send_type?
61
- correct_send(expr, corrector)
62
- elsif expr.return_type?
63
- correct_other(expr, corrector)
64
- elsif expr.assignment?
65
- correct_other(expr, corrector)
66
- end
67
- end
68
-
69
- corrector.replace(node.loc.operator, node.alternate_operator)
70
- end
87
+ def message(node)
88
+ format(MSG, prefer: node.alternate_operator, current: node.operator)
71
89
  end
72
90
 
73
91
  def correct_send(node, corrector)
74
92
  return correct_not(node, node.receiver, corrector) if node.method?(:!)
75
93
  return correct_setter(node, corrector) if node.setter_method?
94
+ return correct_other(node, corrector) if node.comparison_method?
95
+
76
96
  return unless correctable_send?(node)
77
97
 
78
- corrector.replace(whitespace_before_arg(node), '('.freeze)
79
- corrector.insert_after(node.last_argument.source_range, ')'.freeze)
98
+ corrector.replace(whitespace_before_arg(node), '(')
99
+ corrector.insert_after(node.last_argument.source_range, ')')
80
100
  end
81
101
 
82
102
  def correct_setter(node, corrector)
83
- corrector.insert_before(node.receiver.source_range, '('.freeze)
84
- corrector.insert_after(node.last_argument.source_range, ')'.freeze)
103
+ corrector.insert_before(node.receiver.source_range, '(')
104
+ corrector.insert_after(node.last_argument.source_range, ')')
85
105
  end
86
106
 
87
107
  # ! is a special case:
@@ -108,7 +128,7 @@ module RuboCop
108
128
  end
109
129
 
110
130
  def correctable_send?(node)
111
- !node.parenthesized? && !node.method?(:[]) && node.arguments?
131
+ !node.parenthesized? && node.arguments? && !node.method?(:[])
112
132
  end
113
133
 
114
134
  def whitespace_before_arg(node)