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
@@ -10,11 +10,13 @@ module RuboCop
10
10
  #
11
11
  # # bad
12
12
  # if x % 2 == 0
13
+ # end
13
14
  #
14
15
  # # good
15
16
  # if x.even?
17
+ # end
16
18
  class EvenOdd < Cop
17
- MSG = 'Replace with `Integer#%s?`.'.freeze
19
+ MSG = 'Replace with `Integer#%<method>s?`.'.freeze
18
20
 
19
21
  def_node_matcher :even_odd_candidate?, <<-PATTERN
20
22
  (send
@@ -27,7 +29,7 @@ module RuboCop
27
29
  def on_send(node)
28
30
  even_odd_candidate?(node) do |_base_number, method, arg|
29
31
  replacement_method = replacement_method(arg, method)
30
- add_offense(node, :expression, format(MSG, replacement_method))
32
+ add_offense(node, message: format(MSG, method: replacement_method))
31
33
  end
32
34
  end
33
35
 
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks that `#module_function` is used over `extend self`.
7
+ #
8
+ # @example EnforcedStyle: module_function (default)
9
+ #
10
+ # # bad
11
+ # module Foo
12
+ # extend self
13
+ # end
14
+ #
15
+ # # good
16
+ # module Foo
17
+ # module_function
18
+ # end
19
+ #
20
+ # @example EnforcedStyle: extend_self
21
+ #
22
+ # # bad
23
+ # module Foo
24
+ # module_function
25
+ # end
26
+ #
27
+ # # good
28
+ # module Foo
29
+ # extend self
30
+ # end
31
+ class ExtendSelf < Cop
32
+ include ConfigurableEnforcedStyle
33
+
34
+ MSG = 'Use `%<enforced>s` instead of `%<alternate>s`.'.freeze
35
+
36
+ def_node_matcher :extend_self?, <<-PATTERN
37
+ (send nil? :extend (self))
38
+ PATTERN
39
+
40
+ def_node_matcher :module_function?, <<-PATTERN
41
+ (send nil? :module_function)
42
+ PATTERN
43
+
44
+ def_node_matcher :module_scope?, <<-PATTERN
45
+ {^(module ...) ^^(module _ ({begin kwbegin} ...))}
46
+ PATTERN
47
+
48
+ def on_send(node)
49
+ return unless module_scope?(node)
50
+ return unless module_function_enforced? && extend_self?(node) ||
51
+ extend_self_enforced? && module_function?(node)
52
+
53
+ add_offense(node)
54
+ end
55
+
56
+ def autocorrect(node)
57
+ lambda do |corrector|
58
+ corrector.replace(node.loc.expression, enforced_source)
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def message(_node)
65
+ format(MSG, enforced: enforced_source, alternate: alternate_source)
66
+ end
67
+
68
+ def enforced_source
69
+ case style
70
+ when :module_function then 'module_function'
71
+ when :extend_self then 'extend self'
72
+ end
73
+ end
74
+
75
+ def alternate_source
76
+ case style
77
+ when :module_function then 'extend self'
78
+ when :extend_self then 'module_function'
79
+ end
80
+ end
81
+
82
+ def module_function_enforced?
83
+ style == :module_function
84
+ end
85
+
86
+ def extend_self_enforced?
87
+ style == :extend_self
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -4,15 +4,26 @@ module RuboCop
4
4
  module Cop
5
5
  module Style
6
6
  # This cop looks for uses of flip flop operator
7
+ #
8
+ # @example
9
+ # # bad
10
+ # (1..20).each do |x|
11
+ # puts x if (x == 5) .. (x == 10)
12
+ # end
13
+ #
14
+ # # good
15
+ # (1..20).each do |x|
16
+ # puts x if (x >= 5) && (x <= 10)
17
+ # end
7
18
  class FlipFlop < Cop
8
19
  MSG = 'Avoid the use of flip flop operators.'.freeze
9
20
 
10
21
  def on_iflipflop(node)
11
- add_offense(node, :expression)
22
+ add_offense(node)
12
23
  end
13
24
 
14
25
  def on_eflipflop(node)
15
- add_offense(node, :expression)
26
+ add_offense(node)
16
27
  end
17
28
  end
18
29
  end
@@ -13,7 +13,9 @@ module RuboCop
13
13
 
14
14
  def on_for(node)
15
15
  if style == :each
16
- add_offense(node, :keyword, 'Prefer `each` over `for`.') do
16
+ msg = 'Prefer `each` over `for`.'
17
+
18
+ add_offense(node, location: :keyword, message: msg) do
17
19
  opposite_style_detected
18
20
  end
19
21
  else
@@ -39,7 +41,9 @@ module RuboCop
39
41
  def incorrect_style_detected(method)
40
42
  end_pos = method.source_range.end_pos
41
43
  range = range_between(end_pos - EACH_LENGTH, end_pos)
42
- add_offense(range, range, 'Prefer `for` over `each`.') do
44
+ msg = 'Prefer `for` over `each`.'
45
+
46
+ add_offense(range, location: range, message: msg) do
43
47
  opposite_style_detected
44
48
  end
45
49
  end
@@ -10,16 +10,41 @@ module RuboCop
10
10
  # manner for all cases, so only two scenarios are considered -
11
11
  # if the first argument is a string literal and if the second
12
12
  # argument is an array literal.
13
+ #
14
+ # @example EnforcedStyle: format(default)
15
+ # # bad
16
+ # puts sprintf('%10s', 'hoge')
17
+ # puts '%10s' % 'hoge'
18
+ #
19
+ # # good
20
+ # puts format('%10s', 'hoge')
21
+ #
22
+ # @example EnforcedStyle: sprintf
23
+ # # bad
24
+ # puts format('%10s', 'hoge')
25
+ # puts '%10s' % 'hoge'
26
+ #
27
+ # # good
28
+ # puts sprintf('%10s', 'hoge')
29
+ #
30
+ # @example EnforcedStyle: percent
31
+ # # bad
32
+ # puts format('%10s', 'hoge')
33
+ # puts sprintf('%10s', 'hoge')
34
+ #
35
+ # # good
36
+ # puts '%10s' % 'hoge'
37
+ #
13
38
  class FormatString < Cop
14
39
  include ConfigurableEnforcedStyle
15
40
 
16
- MSG = 'Favor `%s` over `%s`.'.freeze
41
+ MSG = 'Favor `%<prefer>s` over `%<current>s`.'.freeze
17
42
 
18
43
  def_node_matcher :formatter, <<-PATTERN
19
44
  {
20
- (send nil ${:sprintf :format} _ _ ...)
45
+ (send nil? ${:sprintf :format} _ _ ...)
21
46
  (send {str dstr} $:% ... )
22
- (send !nil $:% {array hash})
47
+ (send !nil? $:% {array hash})
23
48
  }
24
49
  PATTERN
25
50
 
@@ -29,12 +54,15 @@ module RuboCop
29
54
 
30
55
  return if detected_style == style
31
56
 
32
- add_offense(node, :selector, message(detected_style))
57
+ add_offense(node, location: :selector,
58
+ message: message(detected_style))
33
59
  end
34
60
  end
35
61
 
36
62
  def message(detected_style)
37
- format(MSG, method_name(style), method_name(detected_style))
63
+ format(MSG,
64
+ prefer: method_name(style),
65
+ current: method_name(detected_style))
38
66
  end
39
67
 
40
68
  def method_name(style_name)
@@ -5,31 +5,32 @@ module RuboCop
5
5
  module Style
6
6
  # Use a consistent style for named format string tokens.
7
7
  #
8
- # @example
9
- #
10
- # EnforcedStyle: annotated
8
+ # @example EnforcedStyle: annotated (default)
11
9
  #
12
10
  # # bad
13
- #
14
11
  # format('%{greeting}', greeting: 'Hello')
15
12
  # format('%s', 'Hello')
16
13
  #
17
14
  # # good
18
- #
19
15
  # format('%<greeting>s', greeting: 'Hello')
20
16
  #
21
- # @example
22
- #
23
- # EnforcedStyle: template
17
+ # @example EnforcedStyle: template
24
18
  #
25
19
  # # bad
26
- #
27
20
  # format('%<greeting>s', greeting: 'Hello')
28
21
  # format('%s', 'Hello')
29
22
  #
30
23
  # # good
31
- #
32
24
  # format('%{greeting}', greeting: 'Hello')
25
+ #
26
+ # @example EnforcedStyle: unannotated
27
+ #
28
+ # # bad
29
+ # format('%<greeting>s', greeting: 'Hello')
30
+ # format('%{greeting}', 'Hello')
31
+ #
32
+ # # good
33
+ # format('%s', 'Hello')
33
34
  class FormatStringToken < Cop
34
35
  include ConfigurableEnforcedStyle
35
36
 
@@ -37,7 +38,8 @@ module RuboCop
37
38
 
38
39
  STYLE_PATTERNS = {
39
40
  annotated: /(?<token>%<[^>]+>#{FIELD_CHARACTERS})/,
40
- template: /(?<token>%\{[^\}]+\})/
41
+ template: /(?<token>%\{[^\}]+\})/,
42
+ unannotated: /(?<token>%#{FIELD_CHARACTERS})/
41
43
  }.freeze
42
44
 
43
45
  TOKEN_PATTERN = Regexp.union(STYLE_PATTERNS.values)
@@ -50,7 +52,8 @@ module RuboCop
50
52
  correct_style_detected
51
53
  else
52
54
  style_detected(detected_style)
53
- add_offense(node, token_range, message(detected_style))
55
+ add_offense(node, location: token_range,
56
+ message: message(detected_style))
54
57
  end
55
58
  end
56
59
  end
@@ -61,14 +64,13 @@ module RuboCop
61
64
  "Prefer #{message_text(style)} over #{message_text(detected_style)}."
62
65
  end
63
66
 
64
- # rubocop:disable FormatStringToken
65
67
  def message_text(style)
66
68
  case style
67
69
  when :annotated then 'annotated tokens (like `%<foo>s`)'
68
- when :template then 'template tokens (like `%{foo}`)'
70
+ when :template then 'template tokens (like `%{foo}`)'
71
+ when :unannotated then 'unannotated tokens (like `%s`)'
69
72
  end
70
73
  end
71
- # rubocop:enable FormatStringToken
72
74
 
73
75
  def tokens(str_node, &block)
74
76
  return if str_node.source == '__FILE__'
@@ -5,7 +5,7 @@ module RuboCop
5
5
  module Style
6
6
  # This cop is designed to help upgrade to Ruby 3.0. It will add the
7
7
  # comment `# frozen_string_literal: true` to the top of files to
8
- # enable frozen string literals. Frozen string literals will be default
8
+ # enable frozen string literals. Frozen string literals may be default
9
9
  # in Ruby 3.0. The comment will be added below a shebang and encoding
10
10
  # comment. The frozen string literal comment is only valid in Ruby 2.3+.
11
11
  class FrozenStringLiteralComment < Cop
@@ -27,10 +27,11 @@ module RuboCop
27
27
  end
28
28
  end
29
29
 
30
- def autocorrect(node)
30
+ def autocorrect(node) # rubocop:disable Metrics/MethodLength
31
31
  lambda do |corrector|
32
32
  if style == :never
33
- corrector.remove(range_with_surrounding_space(node.pos, :right))
33
+ corrector.remove(range_with_surrounding_space(range: node.pos,
34
+ side: :right))
34
35
  else
35
36
  last_special_comment = last_special_comment(processed_source)
36
37
  if last_special_comment.nil?
@@ -79,7 +80,7 @@ module RuboCop
79
80
  last_special_comment = last_special_comment(processed_source)
80
81
  range = source_range(processed_source.buffer, 0, 0)
81
82
 
82
- add_offense(last_special_comment, range, MSG)
83
+ add_offense(last_special_comment, location: range)
83
84
  end
84
85
 
85
86
  def unnecessary_comment_offense(processed_source)
@@ -87,8 +88,8 @@ module RuboCop
87
88
  frozen_string_literal_comment(processed_source)
88
89
 
89
90
  add_offense(frozen_string_literal_comment,
90
- frozen_string_literal_comment.pos,
91
- MSG_UNNECESSARY)
91
+ location: frozen_string_literal_comment.pos,
92
+ message: MSG_UNNECESSARY)
92
93
  end
93
94
  end
94
95
  end
@@ -9,10 +9,20 @@ module RuboCop
9
9
  # users can allow additional variables via the AllowedVariables option.
10
10
  #
11
11
  # Note that backreferences like $1, $2, etc are not global variables.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # $foo = 2
16
+ # bar = $foo + 5
17
+ #
18
+ # # good
19
+ # FOO = 2
20
+ # foo = 2
21
+ # $stdin.read
12
22
  class GlobalVars < Cop
13
23
  MSG = 'Do not introduce global variables.'.freeze
14
24
 
15
- # predefined global variables their English aliases
25
+ # built-in global variables and their English aliases
16
26
  # http://www.zenspider.com/Languages/Ruby/QuickRef.html
17
27
  BUILT_IN_VARS = %w[
18
28
  $: $LOAD_PATH
@@ -62,7 +72,7 @@ module RuboCop
62
72
  def check(node)
63
73
  global_var, = *node
64
74
 
65
- add_offense(node, :name) unless allowed_var?(global_var)
75
+ add_offense(node, location: :name) unless allowed_var?(global_var)
66
76
  end
67
77
  end
68
78
  end
@@ -37,12 +37,13 @@ module RuboCop
37
37
  # ok
38
38
  class GuardClause < Cop
39
39
  include MinBodyLength
40
- include OnMethodDef
41
40
 
42
41
  MSG = 'Use a guard clause instead of wrapping the code inside a ' \
43
42
  'conditional expression.'.freeze
44
43
 
45
- def on_method_def(_node, _method_name, _args, body)
44
+ def on_def(node)
45
+ body = node.body
46
+
46
47
  return unless body
47
48
 
48
49
  if body.if_type?
@@ -51,11 +52,12 @@ module RuboCop
51
52
  check_ending_if(body.children.last)
52
53
  end
53
54
  end
55
+ alias on_defs on_def
54
56
 
55
57
  def on_if(node)
56
58
  return if accepted_form?(node) || !contains_guard_clause?(node)
57
59
 
58
- add_offense(node, :keyword)
60
+ add_offense(node, location: :keyword)
59
61
  end
60
62
 
61
63
  private
@@ -63,7 +65,7 @@ module RuboCop
63
65
  def check_ending_if(node)
64
66
  return if accepted_form?(node, true) || !min_body_length?(node)
65
67
 
66
- add_offense(node, :keyword)
68
+ add_offense(node, location: :keyword)
67
69
  end
68
70
 
69
71
  def accepted_form?(node, ending = false)
@@ -19,49 +19,41 @@ module RuboCop
19
19
  # * ruby19_no_mixed_keys - forces use of ruby 1.9 syntax and forbids mixed
20
20
  # syntax hashes
21
21
  #
22
- # @example
23
- # "EnforcedStyle => 'ruby19'"
22
+ # @example EnforcedStyle: ruby19 (default)
23
+ # # bad
24
+ # {:a => 2}
25
+ # {b: 1, :c => 2}
24
26
  #
25
- # @good
27
+ # # good
26
28
  # {a: 2, b: 1}
27
29
  # {:c => 2, 'd' => 2} # acceptable since 'd' isn't a symbol
28
30
  # {d: 1, 'e' => 2} # technically not forbidden
29
31
  #
30
- # @bad
31
- # {:a => 2}
32
- # {b: 1, :c => 2}
33
- #
34
- # @example
35
- # "EnforcedStyle => 'hash_rockets'"
36
- #
37
- # @good
38
- # {:a => 1, :b => 2}
39
- #
40
- # @bad
32
+ # @example EnforcedStyle: hash_rockets
33
+ # # bad
41
34
  # {a: 1, b: 2}
42
35
  # {c: 1, 'd' => 5}
43
36
  #
44
- # @example
45
- # "EnforcedStyle => 'no_mixed_keys'"
46
- #
47
- # @good
37
+ # # good
48
38
  # {:a => 1, :b => 2}
49
- # {c: 1, d: 2}
50
39
  #
51
- # @bad
40
+ # @example EnforcedStyle: no_mixed_keys
41
+ # # bad
52
42
  # {:a => 1, b: 2}
53
43
  # {c: 1, 'd' => 2}
54
44
  #
55
- # @example
56
- # "EnforcedStyle => 'ruby19_no_mixed_keys'"
57
- #
58
- # @good
59
- # {a: 1, b: 2}
60
- # {:c => 3, 'd' => 4}
45
+ # # good
46
+ # {:a => 1, :b => 2}
47
+ # {c: 1, d: 2}
61
48
  #
62
- # @bad
49
+ # @example EnforcedStyle: ruby19_no_mixed_keys
50
+ # # bad
63
51
  # {:a => 1, :b => 2}
64
52
  # {c: 2, 'd' => 3} # should just use hash rockets
53
+ #
54
+ # # good
55
+ # {a: 1, b: 2}
56
+ # {:c => 3, 'd' => 4}
65
57
  class HashSyntax < Cop
66
58
  include ConfigurableEnforcedStyle
67
59
 
@@ -70,18 +62,18 @@ module RuboCop
70
62
  MSG_HASH_ROCKETS = 'Use hash rockets syntax.'.freeze
71
63
 
72
64
  def on_hash(node)
73
- return if node.pairs.empty?
65
+ pairs = node.pairs
74
66
 
75
- @force_hash_rockets = force_hash_rockets?(node.pairs)
67
+ return if pairs.empty?
76
68
 
77
- if style == :hash_rockets || @force_hash_rockets
78
- hash_rockets_check(node.pairs)
69
+ if style == :hash_rockets || force_hash_rockets?(pairs)
70
+ hash_rockets_check(pairs)
79
71
  elsif style == :ruby19_no_mixed_keys
80
- ruby19_no_mixed_keys_check(node.pairs)
72
+ ruby19_no_mixed_keys_check(pairs)
81
73
  elsif style == :no_mixed_keys
82
- no_mixed_keys_check(node.pairs)
74
+ no_mixed_keys_check(pairs)
83
75
  else
84
- ruby19_check(node.pairs)
76
+ ruby19_check(pairs)
85
77
  end
86
78
  end
87
79
 
@@ -94,7 +86,7 @@ module RuboCop
94
86
  end
95
87
 
96
88
  def ruby19_no_mixed_keys_check(pairs)
97
- if @force_hash_rockets
89
+ if force_hash_rockets?
98
90
  check(pairs, ':', MSG_HASH_ROCKETS)
99
91
  elsif sym_indices?(pairs)
100
92
  check(pairs, '=>', MSG_19)
@@ -113,7 +105,7 @@ module RuboCop
113
105
 
114
106
  def autocorrect(node)
115
107
  lambda do |corrector|
116
- if style == :hash_rockets || @force_hash_rockets
108
+ if style == :hash_rockets || force_hash_rockets?
117
109
  autocorrect_hash_rockets(corrector, node)
118
110
  elsif style == :ruby19_no_mixed_keys || style == :no_mixed_keys
119
111
  autocorrect_no_mixed_keys(corrector, node)
@@ -164,9 +156,8 @@ module RuboCop
164
156
  def check(pairs, delim, msg)
165
157
  pairs.each do |pair|
166
158
  if pair.delimiter == delim
167
- add_offense(pair,
168
- pair.source_range.begin.join(pair.loc.operator),
169
- msg) do
159
+ location = pair.source_range.begin.join(pair.loc.operator)
160
+ add_offense(pair, location: location, message: msg) do
170
161
  opposite_style_detected
171
162
  end
172
163
  else
@@ -175,34 +166,43 @@ module RuboCop
175
166
  end
176
167
  end
177
168
 
178
- def autocorrect_ruby19(corrector, node)
179
- key = node.children.first.source_range
180
- op = node.loc.operator
169
+ def autocorrect_ruby19(corrector, pair_node)
170
+ key = pair_node.key
171
+ op = pair_node.loc.operator
172
+
173
+ range = range_between(key.source_range.begin_pos, op.end_pos)
174
+ range = range_with_surrounding_space(range: range, side: :right)
175
+
176
+ new_key = key.sym_type? ? key.value : key.source
177
+
178
+ space = argument_without_space?(pair_node.parent) ? ' ' : ''
179
+
180
+ corrector.replace(range, "#{space}#{new_key}: ")
181
+ end
181
182
 
182
- range = range_between(key.begin_pos, op.end_pos)
183
- range = range_with_surrounding_space(range, :right)
184
- corrector.replace(range,
185
- range.source.sub(/^:(.*\S)\s*=>\s*$/, '\1: '))
183
+ def argument_without_space?(node)
184
+ node.argument? &&
185
+ node.loc.expression.begin_pos == node.parent.loc.selector.end_pos
186
186
  end
187
187
 
188
- def autocorrect_hash_rockets(corrector, node)
189
- key = node.children.first.source_range
190
- op = node.loc.operator
188
+ def autocorrect_hash_rockets(corrector, pair_node)
189
+ key = pair_node.key.source_range
190
+ op = pair_node.loc.operator
191
191
 
192
- corrector.insert_after(key, node.inverse_delimiter(true))
192
+ corrector.insert_after(key, pair_node.inverse_delimiter(true))
193
193
  corrector.insert_before(key, ':')
194
- corrector.remove(range_with_surrounding_space(op))
194
+ corrector.remove(range_with_surrounding_space(range: op))
195
195
  end
196
196
 
197
- def autocorrect_no_mixed_keys(corrector, node)
198
- if node.colon?
199
- autocorrect_hash_rockets(corrector, node)
197
+ def autocorrect_no_mixed_keys(corrector, pair_node)
198
+ if pair_node.colon?
199
+ autocorrect_hash_rockets(corrector, pair_node)
200
200
  else
201
- autocorrect_ruby19(corrector, node)
201
+ autocorrect_ruby19(corrector, pair_node)
202
202
  end
203
203
  end
204
204
 
205
- def force_hash_rockets?(pairs)
205
+ def force_hash_rockets?(pairs = [])
206
206
  @force_hash_rockets ||= begin
207
207
  cop_config['UseHashRocketsWithSymbolValues'] &&
208
208
  pairs.map(&:value).any?(&:sym_type?)