rubocop 0.52.1 → 0.53.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 (292) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +118 -46
  5. data/config/disabled.yml +8 -8
  6. data/config/enabled.yml +84 -28
  7. data/lib/rubocop.rb +28 -8
  8. data/lib/rubocop/ast/builder.rb +35 -37
  9. data/lib/rubocop/ast/node.rb +16 -1
  10. data/lib/rubocop/ast/node/and_node.rb +0 -8
  11. data/lib/rubocop/ast/node/block_node.rb +1 -9
  12. data/lib/rubocop/ast/node/case_node.rb +0 -8
  13. data/lib/rubocop/ast/node/ensure_node.rb +0 -8
  14. data/lib/rubocop/ast/node/for_node.rb +0 -8
  15. data/lib/rubocop/ast/node/or_node.rb +0 -8
  16. data/lib/rubocop/ast/node/pair_node.rb +0 -8
  17. data/lib/rubocop/ast/node/resbody_node.rb +0 -8
  18. data/lib/rubocop/ast/node/send_node.rb +0 -8
  19. data/lib/rubocop/ast/node/symbol_node.rb +0 -8
  20. data/lib/rubocop/ast/node/until_node.rb +0 -8
  21. data/lib/rubocop/ast/node/when_node.rb +0 -8
  22. data/lib/rubocop/ast/node/while_node.rb +0 -8
  23. data/lib/rubocop/cli.rb +17 -7
  24. data/lib/rubocop/comment_config.rb +24 -3
  25. data/lib/rubocop/config.rb +75 -6
  26. data/lib/rubocop/config_loader.rb +18 -28
  27. data/lib/rubocop/config_loader_resolver.rb +61 -9
  28. data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -1
  29. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -2
  30. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  31. data/lib/rubocop/cop/commissioner.rb +2 -2
  32. data/lib/rubocop/cop/cop.rb +4 -0
  33. data/lib/rubocop/cop/corrector.rb +11 -1
  34. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
  35. data/lib/rubocop/cop/correctors/line_break_corrector.rb +59 -0
  36. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -1
  37. data/lib/rubocop/cop/correctors/space_corrector.rb +13 -0
  38. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +1 -1
  39. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -1
  40. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  41. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +3 -5
  42. data/lib/rubocop/cop/generator.rb +29 -8
  43. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +2 -0
  44. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -0
  45. data/lib/rubocop/cop/layout/align_hash.rb +106 -37
  46. data/lib/rubocop/cop/{lint → layout}/block_alignment.rb +8 -5
  47. data/lib/rubocop/cop/layout/block_end_newline.rb +7 -17
  48. data/lib/rubocop/cop/layout/case_indentation.rb +1 -0
  49. data/lib/rubocop/cop/layout/class_structure.rb +6 -7
  50. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  51. data/lib/rubocop/cop/{lint → layout}/condition_position.rb +3 -3
  52. data/lib/rubocop/cop/{lint → layout}/def_end_alignment.rb +2 -1
  53. data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
  54. data/lib/rubocop/cop/layout/empty_comment.rb +140 -0
  55. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -0
  56. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -0
  57. data/lib/rubocop/cop/layout/empty_lines.rb +3 -1
  58. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +7 -5
  59. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +20 -10
  60. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +20 -0
  61. data/lib/rubocop/cop/{lint → layout}/end_alignment.rb +37 -6
  62. data/lib/rubocop/cop/layout/end_of_line.rb +1 -0
  63. data/lib/rubocop/cop/layout/extra_spacing.rb +30 -37
  64. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +1 -0
  65. data/lib/rubocop/cop/layout/indent_heredoc.rb +38 -2
  66. data/lib/rubocop/cop/layout/indentation_consistency.rb +105 -1
  67. data/lib/rubocop/cop/layout/indentation_width.rb +4 -3
  68. data/lib/rubocop/cop/layout/initial_indentation.rb +15 -1
  69. data/lib/rubocop/cop/layout/leading_comment_space.rb +4 -2
  70. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -0
  71. data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -0
  72. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +62 -29
  73. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
  74. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +74 -33
  75. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +16 -2
  76. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -1
  77. data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -0
  78. data/lib/rubocop/cop/layout/space_after_not.rb +2 -0
  79. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -0
  80. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +15 -2
  81. data/lib/rubocop/cop/layout/space_around_operators.rb +15 -13
  82. data/lib/rubocop/cop/layout/space_before_block_braces.rb +13 -1
  83. data/lib/rubocop/cop/layout/space_before_comment.rb +6 -4
  84. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -0
  85. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -0
  86. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +30 -45
  87. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +3 -2
  88. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +48 -18
  89. data/lib/rubocop/cop/layout/space_inside_parens.rb +8 -7
  90. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +57 -11
  91. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +1 -0
  92. data/lib/rubocop/cop/layout/tab.rb +42 -16
  93. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +46 -13
  94. data/lib/rubocop/cop/layout/trailing_whitespace.rb +12 -0
  95. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +5 -3
  96. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  97. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
  98. data/lib/rubocop/cop/lint/circular_argument_reference.rb +2 -2
  99. data/lib/rubocop/cop/lint/debugger.rb +2 -2
  100. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +5 -4
  101. data/lib/rubocop/cop/lint/duplicate_methods.rb +20 -9
  102. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
  103. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +16 -10
  104. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +5 -4
  105. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  106. data/lib/rubocop/cop/lint/interpolation_check.rb +4 -3
  107. data/lib/rubocop/cop/lint/literal_as_condition.rb +2 -2
  108. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +2 -0
  109. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +7 -5
  110. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  111. data/lib/rubocop/cop/lint/number_conversion.rb +59 -0
  112. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  113. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +2 -0
  114. data/lib/rubocop/cop/lint/percent_string_array.rb +0 -2
  115. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  116. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -0
  117. data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -0
  118. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -0
  119. data/lib/rubocop/cop/lint/rescue_type.rb +6 -3
  120. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -2
  121. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -21
  122. data/lib/rubocop/cop/lint/script_permission.rb +30 -10
  123. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  124. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -0
  125. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +2 -2
  126. data/lib/rubocop/cop/lint/unified_integer.rb +2 -2
  127. data/lib/rubocop/cop/lint/{unneeded_disable.rb → unneeded_cop_disable_directive.rb} +13 -7
  128. data/lib/rubocop/cop/lint/unneeded_cop_enable_directive.rb +97 -0
  129. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -0
  130. data/lib/rubocop/cop/lint/unreachable_code.rb +3 -3
  131. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +11 -10
  132. data/lib/rubocop/cop/lint/useless_access_modifier.rb +7 -5
  133. data/lib/rubocop/cop/lint/useless_assignment.rb +2 -2
  134. data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -2
  135. data/lib/rubocop/cop/lint/void.rb +49 -10
  136. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  137. data/lib/rubocop/cop/metrics/line_length.rb +5 -2
  138. data/lib/rubocop/cop/mixin/alignment.rb +4 -0
  139. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -1
  140. data/lib/rubocop/cop/mixin/def_node.rb +4 -0
  141. data/lib/rubocop/cop/mixin/documentation_comment.rb +11 -3
  142. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +12 -2
  143. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +20 -1
  144. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -0
  145. data/lib/rubocop/cop/mixin/hash_alignment.rb +2 -2
  146. data/lib/rubocop/cop/mixin/match_range.rb +2 -0
  147. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +6 -0
  148. data/lib/rubocop/cop/mixin/nil_methods.rb +19 -0
  149. data/lib/rubocop/cop/mixin/percent_literal.rb +57 -9
  150. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -5
  151. data/lib/rubocop/cop/mixin/range_help.rb +102 -0
  152. data/lib/rubocop/cop/mixin/rescue_node.rb +1 -1
  153. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -7
  154. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +11 -9
  155. data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -10
  156. data/lib/rubocop/cop/mixin/surrounding_space.rb +38 -8
  157. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  158. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  159. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +104 -0
  160. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -1
  161. data/lib/rubocop/cop/naming/file_name.rb +5 -10
  162. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +76 -0
  163. data/lib/rubocop/cop/naming/uncommunicative_block_param_name.rb +48 -0
  164. data/lib/rubocop/cop/naming/uncommunicative_method_param_name.rb +57 -0
  165. data/lib/rubocop/cop/offense.rb +3 -2
  166. data/lib/rubocop/cop/performance/case_when_splat.rb +1 -0
  167. data/lib/rubocop/cop/performance/casecmp.rb +17 -8
  168. data/lib/rubocop/cop/performance/compare_with_block.rb +2 -0
  169. data/lib/rubocop/cop/performance/count.rb +1 -0
  170. data/lib/rubocop/cop/performance/fixed_size.rb +41 -0
  171. data/lib/rubocop/cop/performance/flat_map.rb +2 -0
  172. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -0
  173. data/lib/rubocop/cop/performance/redundant_merge.rb +1 -1
  174. data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -0
  175. data/lib/rubocop/cop/performance/regexp_match.rb +4 -0
  176. data/lib/rubocop/cop/performance/reverse_each.rb +2 -0
  177. data/lib/rubocop/cop/performance/string_replacement.rb +2 -0
  178. data/lib/rubocop/cop/rails/active_record_aliases.rb +46 -0
  179. data/lib/rubocop/cop/rails/blank.rb +3 -3
  180. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +6 -0
  181. data/lib/rubocop/cop/rails/delegate.rb +6 -6
  182. data/lib/rubocop/cop/rails/file_path.rb +7 -1
  183. data/lib/rubocop/cop/rails/find_by.rb +2 -0
  184. data/lib/rubocop/cop/rails/http_positional_arguments.rb +17 -5
  185. data/lib/rubocop/cop/rails/inverse_of.rb +21 -2
  186. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +45 -9
  187. data/lib/rubocop/cop/rails/presence.rb +8 -2
  188. data/lib/rubocop/cop/rails/present.rb +5 -5
  189. data/lib/rubocop/cop/rails/read_write_attribute.rb +4 -3
  190. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +1 -0
  191. data/lib/rubocop/cop/rails/relative_date_constant.rb +4 -3
  192. data/lib/rubocop/cop/rails/request_referer.rb +3 -2
  193. data/lib/rubocop/cop/rails/reversible_migration.rb +9 -8
  194. data/lib/rubocop/cop/rails/safe_navigation.rb +3 -2
  195. data/lib/rubocop/cop/rails/save_bang.rb +11 -12
  196. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
  197. data/lib/rubocop/cop/rails/time_zone.rb +38 -16
  198. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +26 -16
  199. data/lib/rubocop/cop/rails/validation.rb +30 -2
  200. data/lib/rubocop/cop/security/open.rb +48 -0
  201. data/lib/rubocop/cop/style/and_or.rb +1 -0
  202. data/lib/rubocop/cop/style/ascii_comments.rb +3 -1
  203. data/lib/rubocop/cop/style/attr.rb +2 -0
  204. data/lib/rubocop/cop/style/block_comments.rb +3 -1
  205. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +2 -5
  206. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -0
  207. data/lib/rubocop/cop/style/class_vars.rb +23 -0
  208. data/lib/rubocop/cop/style/colon_method_call.rb +1 -2
  209. data/lib/rubocop/cop/style/comment_annotation.rb +6 -4
  210. data/lib/rubocop/cop/style/commented_keyword.rb +3 -1
  211. data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
  212. data/lib/rubocop/cop/style/copyright.rb +3 -1
  213. data/lib/rubocop/cop/style/each_with_object.rb +15 -1
  214. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -0
  215. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -0
  216. data/lib/rubocop/cop/style/empty_else.rb +9 -5
  217. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -0
  218. data/lib/rubocop/cop/style/empty_line_after_guard_clause.rb +80 -0
  219. data/lib/rubocop/cop/style/empty_literal.rb +1 -0
  220. data/lib/rubocop/cop/style/encoding.rb +2 -0
  221. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  222. data/lib/rubocop/cop/style/for.rb +33 -0
  223. data/lib/rubocop/cop/style/format_string.rb +1 -1
  224. data/lib/rubocop/cop/style/format_string_token.rb +4 -5
  225. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
  226. data/lib/rubocop/cop/style/hash_syntax.rb +1 -0
  227. data/lib/rubocop/cop/style/if_unless_modifier.rb +1 -1
  228. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  229. data/lib/rubocop/cop/style/lambda.rb +1 -1
  230. data/lib/rubocop/cop/style/line_end_concatenation.rb +2 -0
  231. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -0
  232. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -0
  233. data/lib/rubocop/cop/style/missing_else.rb +72 -7
  234. data/lib/rubocop/cop/style/mixin_usage.rb +3 -5
  235. data/lib/rubocop/cop/style/module_function.rb +10 -0
  236. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -0
  237. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -0
  238. data/lib/rubocop/cop/style/nested_modifier.rb +2 -0
  239. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -0
  240. data/lib/rubocop/cop/style/next.rb +1 -0
  241. data/lib/rubocop/cop/style/not.rb +2 -0
  242. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  243. data/lib/rubocop/cop/style/one_line_conditional.rb +2 -2
  244. data/lib/rubocop/cop/style/redundant_exception.rb +8 -3
  245. data/lib/rubocop/cop/style/redundant_return.rb +37 -3
  246. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  247. data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -0
  248. data/lib/rubocop/cop/style/safe_navigation.rb +74 -32
  249. data/lib/rubocop/cop/style/semicolon.rb +3 -1
  250. data/lib/rubocop/cop/style/single_line_methods.rb +14 -23
  251. data/lib/rubocop/cop/style/stderr_puts.rb +2 -0
  252. data/lib/rubocop/cop/style/string_hash_keys.rb +12 -0
  253. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  254. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +1 -1
  255. data/lib/rubocop/cop/style/symbol_array.rb +29 -0
  256. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  257. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  258. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +7 -54
  259. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  260. data/lib/rubocop/cop/style/{trailing_comma_in_literal.rb → trailing_comma_in_array_literal.rb} +2 -20
  261. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +56 -0
  262. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +17 -20
  263. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -0
  264. data/lib/rubocop/cop/style/unless_else.rb +2 -0
  265. data/lib/rubocop/cop/style/word_array.rb +0 -1
  266. data/lib/rubocop/cop/style/yoda_condition.rb +1 -0
  267. data/lib/rubocop/cop/team.rb +5 -5
  268. data/lib/rubocop/cop/util.rb +23 -188
  269. data/lib/rubocop/cop/variable_force.rb +1 -1
  270. data/lib/rubocop/file_finder.rb +45 -0
  271. data/lib/rubocop/formatter/disabled_config_formatter.rb +23 -14
  272. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  273. data/lib/rubocop/formatter/html_formatter.rb +12 -5
  274. data/lib/rubocop/formatter/json_formatter.rb +1 -1
  275. data/lib/rubocop/node_pattern.rb +8 -5
  276. data/lib/rubocop/options.rb +40 -33
  277. data/lib/rubocop/path_util.rb +5 -8
  278. data/lib/rubocop/processed_source.rb +53 -0
  279. data/lib/rubocop/remote_config.rb +1 -1
  280. data/lib/rubocop/result_cache.rb +1 -1
  281. data/lib/rubocop/rspec/cop_helper.rb +0 -4
  282. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -4
  283. data/lib/rubocop/rspec/shared_contexts.rb +3 -1
  284. data/lib/rubocop/rspec/shared_examples.rb +23 -25
  285. data/lib/rubocop/rspec/support.rb +5 -0
  286. data/lib/rubocop/runner.rb +3 -2
  287. data/lib/rubocop/string_util.rb +10 -9
  288. data/lib/rubocop/target_finder.rb +4 -1
  289. data/lib/rubocop/token.rb +26 -16
  290. data/lib/rubocop/version.rb +6 -4
  291. metadata +31 -17
  292. data/lib/rubocop/cop/performance/hash_each_methods.rb +0 -129
@@ -126,7 +126,7 @@ module RuboCop
126
126
  #
127
127
  # @see http://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html
128
128
  class ReversibleMigration < Cop
129
- MSG = '%s is not reversible.'.freeze
129
+ MSG = '%<action>s is not reversible.'.freeze
130
130
  IRREVERSIBLE_CHANGE_TABLE_CALLS = %i[
131
131
  change change_default remove
132
132
  ].freeze
@@ -177,7 +177,7 @@ module RuboCop
177
177
 
178
178
  def check_irreversible_schema_statement_node(node)
179
179
  irreversible_schema_statement_call(node) do |method_name|
180
- add_offense(node, message: format(MSG, method_name))
180
+ add_offense(node, message: format(MSG, action: method_name))
181
181
  end
182
182
  end
183
183
 
@@ -186,7 +186,7 @@ module RuboCop
186
186
  unless node.parent.block_type?
187
187
  add_offense(
188
188
  node,
189
- message: format(MSG, 'drop_table(without block)')
189
+ message: format(MSG, action: 'drop_table(without block)')
190
190
  )
191
191
  end
192
192
  end
@@ -198,7 +198,7 @@ module RuboCop
198
198
  add_offense(
199
199
  node,
200
200
  message: format(
201
- MSG, 'change_column_default(without :from and :to)'
201
+ MSG, action: 'change_column_default(without :from and :to)'
202
202
  )
203
203
  )
204
204
  end
@@ -210,7 +210,7 @@ module RuboCop
210
210
  if args.to_a.size < 3
211
211
  add_offense(
212
212
  node,
213
- message: format(MSG, 'remove_column(without type)')
213
+ message: format(MSG, action: 'remove_column(without type)')
214
214
  )
215
215
  end
216
216
  end
@@ -221,7 +221,8 @@ module RuboCop
221
221
  if arg.hash_type?
222
222
  add_offense(
223
223
  node,
224
- message: format(MSG, 'remove_foreign_key(without table)')
224
+ message: format(MSG,
225
+ action: 'remove_foreign_key(without table)')
225
226
  )
226
227
  end
227
228
  end
@@ -232,7 +233,7 @@ module RuboCop
232
233
  if target_rails_version < 4.0
233
234
  add_offense(
234
235
  node,
235
- message: format(MSG, 'change_table')
236
+ message: format(MSG, action: 'change_table')
236
237
  )
237
238
  elsif block.send_type?
238
239
  check_change_table_offense(arg, block)
@@ -250,7 +251,7 @@ module RuboCop
250
251
  !IRREVERSIBLE_CHANGE_TABLE_CALLS.include?(method_name)
251
252
  add_offense(
252
253
  node,
253
- message: format(MSG, "change_table(with #{method_name})")
254
+ message: format(MSG, action: "change_table(with #{method_name})")
254
255
  )
255
256
  end
256
257
 
@@ -41,8 +41,9 @@ module RuboCop
41
41
  # foo&.bar { |e| e.baz }
42
42
  class SafeNavigation < Cop
43
43
  extend TargetRubyVersion
44
+ include RangeHelp
44
45
 
45
- MSG = 'Use safe navigation (`&.`) instead of `%s`.'.freeze
46
+ MSG = 'Use safe navigation (`&.`) instead of `%<try>s`.'.freeze
46
47
 
47
48
  def_node_matcher :try_call, <<-PATTERN
48
49
  (send !nil? ${:try :try!} $_ ...)
@@ -55,7 +56,7 @@ module RuboCop
55
56
  return if try_method == :try && !cop_config['ConvertTry']
56
57
  return unless dispatch.sym_type? && dispatch.value =~ /\w+[=!?]?/
57
58
 
58
- add_offense(node, message: format(MSG, try_method))
59
+ add_offense(node, message: format(MSG, try: try_method))
59
60
  end
60
61
  end
61
62
 
@@ -36,13 +36,13 @@ module RuboCop
36
36
  # # ...
37
37
  # end
38
38
  class SaveBang < Cop
39
- MSG = 'Use `%s` instead of `%s` if the return value is not checked.'
40
- .freeze
39
+ MSG = 'Use `%<prefer>s` instead of `%<current>s` if the return ' \
40
+ 'value is not checked.'.freeze
41
41
  CREATE_MSG = (MSG +
42
- ' Or check `persisted?` on model returned from `%s`.')
43
- .freeze
44
- CREATE_CONDITIONAL_MSG = '`%s` returns a model which is always truthy.'
45
- .freeze
42
+ ' Or check `persisted?` on model returned from ' \
43
+ '`%<current>s`.').freeze
44
+ CREATE_CONDITIONAL_MSG = '`%<method>s` returns a model which is ' \
45
+ 'always truthy.'.freeze
46
46
 
47
47
  CREATE_PERSIST_METHODS = %i[create
48
48
  first_or_create find_or_create_by].freeze
@@ -72,9 +72,8 @@ module RuboCop
72
72
 
73
73
  add_offense(node, location: :selector,
74
74
  message: format(CREATE_MSG,
75
- "#{node.method_name}!",
76
- node.method_name.to_s,
77
- node.method_name.to_s))
75
+ prefer: "#{node.method_name}!",
76
+ current: node.method_name.to_s))
78
77
  end
79
78
 
80
79
  def on_send(node)
@@ -86,8 +85,8 @@ module RuboCop
86
85
 
87
86
  add_offense(node, location: :selector,
88
87
  message: format(MSG,
89
- "#{node.method_name}!",
90
- node.method_name.to_s))
88
+ prefer: "#{node.method_name}!",
89
+ current: node.method_name.to_s))
91
90
  end
92
91
 
93
92
  def autocorrect(node)
@@ -123,7 +122,7 @@ module RuboCop
123
122
  unless MODIFY_PERSIST_METHODS.include?(node.method_name)
124
123
  add_offense(node, location: :selector,
125
124
  message: format(CREATE_CONDITIONAL_MSG,
126
- node.method_name.to_s))
125
+ method: node.method_name.to_s))
127
126
  end
128
127
 
129
128
  true
@@ -24,7 +24,7 @@ module RuboCop
24
24
  # user.update_attributes(website: 'example.com')
25
25
  # FileUtils.touch('file')
26
26
  class SkipsModelValidations < Cop
27
- MSG = 'Avoid using `%s` because it skips validations.'.freeze
27
+ MSG = 'Avoid using `%<method>s` because it skips validations.'.freeze
28
28
 
29
29
  METHODS_WITH_ARGUMENTS = %w[decrement!
30
30
  decrement_counter
@@ -58,7 +58,7 @@ module RuboCop
58
58
  private
59
59
 
60
60
  def message(node)
61
- format(MSG, node.method_name)
61
+ format(MSG, method: node.method_name)
62
62
  end
63
63
 
64
64
  def blacklist
@@ -14,37 +14,55 @@ module RuboCop
14
14
  # When EnforcedStyle is 'flexible' then it's also allowed
15
15
  # to use Time.in_time_zone.
16
16
  #
17
- # @example
18
- # # always offense
17
+ # @example EnforcedStyle: strict
18
+ # # `strict` means that `Time` should be used with `zone`.
19
+ #
20
+ # # bad
21
+ # Time.now
22
+ # Time.parse('2015-03-02 19:05:37')
23
+ #
24
+ # # bad
25
+ # Time.current
26
+ # Time.at(timestamp).in_time_zone
27
+ #
28
+ # # good
29
+ # Time.zone.now
30
+ # Time.zone.parse('2015-03-02 19:05:37')
31
+ #
32
+ # @example EnforcedStyle: flexible (default)
33
+ # # `flexible` allows usage of `in_time_zone` instead of `zone`.
34
+ #
35
+ # # bad
19
36
  # Time.now
20
37
  # Time.parse('2015-03-02 19:05:37')
21
38
  #
22
- # # no offense
39
+ # # good
23
40
  # Time.zone.now
24
41
  # Time.zone.parse('2015-03-02 19:05:37')
25
42
  #
26
- # # no offense only if style is 'flexible'
43
+ # # good
27
44
  # Time.current
28
- # DateTime.strptime(str, "%Y-%m-%d %H:%M %Z").in_time_zone
29
45
  # Time.at(timestamp).in_time_zone
30
46
  class TimeZone < Cop
31
47
  include ConfigurableEnforcedStyle
32
48
 
33
- MSG = 'Do not use `%s` without zone. Use `%s` instead.'.freeze
49
+ MSG = 'Do not use `%<current>s` without zone. Use `%<prefer>s` ' \
50
+ 'instead.'.freeze
34
51
 
35
- MSG_ACCEPTABLE = 'Do not use `%s` without zone. ' \
36
- 'Use one of %s instead.'.freeze
52
+ MSG_ACCEPTABLE = 'Do not use `%<current>s` without zone. ' \
53
+ 'Use one of %<prefer>s instead.'.freeze
37
54
 
38
55
  MSG_LOCALTIME = 'Do not use `Time.localtime` without ' \
39
56
  'offset or zone.'.freeze
40
57
 
41
- MSG_CURRENT = 'Do not use `%s`. Use `Time.zone.now` instead.'.freeze
58
+ MSG_CURRENT = 'Do not use `%<current>s`. Use `Time.zone.now` ' \
59
+ 'instead.'.freeze
42
60
 
43
61
  TIMECLASS = %i[Time DateTime].freeze
44
62
 
45
63
  GOOD_METHODS = %i[zone zone_default find_zone find_zone!].freeze
46
64
 
47
- DANGEROUS_METHODS = %i[now local new strftime
65
+ DANGEROUS_METHODS = %i[now local new
48
66
  parse at current].freeze
49
67
 
50
68
  ACCEPTED_METHODS = %i[in_time_zone utc getlocal
@@ -77,21 +95,25 @@ module RuboCop
77
95
  add_offense(node, location: :selector, message: message)
78
96
  end
79
97
 
98
+ # rubocop:disable Metrics/MethodLength
80
99
  def build_message(klass, method_name, node)
81
100
  if acceptable?
82
- format(MSG_ACCEPTABLE,
83
- "#{klass}.#{method_name}",
84
- acceptable_methods(klass, method_name, node).join(', '))
101
+ format(
102
+ MSG_ACCEPTABLE,
103
+ current: "#{klass}.#{method_name}",
104
+ prefer: acceptable_methods(klass, method_name, node).join(', ')
105
+ )
85
106
  elsif method_name == 'current'
86
107
  format(MSG_CURRENT,
87
- "#{klass}.#{method_name}")
108
+ current: "#{klass}.#{method_name}")
88
109
  else
89
110
  safe_method_name = safe_method(method_name, node)
90
111
  format(MSG,
91
- "#{klass}.#{method_name}",
92
- "Time.zone.#{safe_method_name}")
112
+ current: "#{klass}.#{method_name}",
113
+ prefer: "Time.zone.#{safe_method_name}")
93
114
  end
94
115
  end
116
+ # rubocop:enable Metrics/MethodLength
95
117
 
96
118
  def extract_method_chain(node)
97
119
  chain = []
@@ -8,13 +8,6 @@ module RuboCop
8
8
  # The use of uniq before pluck is preferred because it executes within
9
9
  # the database.
10
10
  #
11
- # @example
12
- # # bad
13
- # Model.pluck(:id).uniq
14
- #
15
- # # good
16
- # Model.uniq.pluck(:id)
17
- #
18
11
  # This cop has two different enforcement modes. When the EnforcedStyle
19
12
  # is conservative (the default) then only calls to pluck on a constant
20
13
  # (i.e. a model class) before uniq are added as offenses.
@@ -24,29 +17,45 @@ module RuboCop
24
17
  # cannot distinguish between calls to pluck on an ActiveRecord::Relation
25
18
  # vs a call to pluck on an ActiveRecord::Associations::CollectionProxy.
26
19
  #
27
- # @example
20
+ # Autocorrect is disabled by default for this cop since it may generate
21
+ # false positives.
22
+ #
23
+ # @example EnforcedStyle: conservative (default)
24
+ # # bad
25
+ # Model.pluck(:id).uniq
26
+ #
27
+ # # good
28
+ # Model.uniq.pluck(:id)
29
+ #
30
+ # @example EnforcedStyle: aggressive
31
+ # # bad
28
32
  # # this will return a Relation that pluck is called on
29
33
  # Model.where(cond: true).pluck(:id).uniq
30
34
  #
35
+ # # bad
31
36
  # # an association on an instance will return a CollectionProxy
32
37
  # instance.assoc.pluck(:id).uniq
33
38
  #
34
- # Autocorrect is disabled by default for this cop since it may generate
35
- # false positives.
39
+ # # bad
40
+ # Model.pluck(:id).uniq
41
+ #
42
+ # # good
43
+ # Model.uniq.pluck(:id)
36
44
  #
37
45
  class UniqBeforePluck < RuboCop::Cop::Cop
38
46
  include ConfigurableEnforcedStyle
47
+ include RangeHelp
39
48
 
40
- MSG = 'Use `%s` before `pluck`.'.freeze
49
+ MSG = 'Use `%<method>s` before `pluck`.'.freeze
41
50
  NEWLINE = "\n".freeze
42
- PATTERN = '[!^block (send (send %s :pluck ...) ${:uniq :distinct} ...)]'
43
- .freeze
51
+ PATTERN = '[!^block (send (send %<type>s :pluck ...) ' \
52
+ '${:uniq :distinct} ...)]'.freeze
44
53
 
45
54
  def_node_matcher :conservative_node_match,
46
- format(PATTERN, 'const')
55
+ format(PATTERN, type: 'const')
47
56
 
48
57
  def_node_matcher :aggressive_node_match,
49
- format(PATTERN, '_')
58
+ format(PATTERN, type: '_')
50
59
 
51
60
  def on_send(node)
52
61
  method = if style == :conservative
@@ -57,7 +66,8 @@ module RuboCop
57
66
 
58
67
  return unless method
59
68
 
60
- add_offense(node, location: :selector, message: format(MSG, method))
69
+ add_offense(node, location: :selector,
70
+ message: format(MSG, method: method))
61
71
  end
62
72
 
63
73
  def autocorrect(node)
@@ -4,8 +4,35 @@ module RuboCop
4
4
  module Cop
5
5
  module Rails
6
6
  # This cop checks for the use of old-style attribute validation macros.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # validates_acceptance_of :foo
11
+ # validates_confirmation_of :foo
12
+ # validates_exclusion_of :foo
13
+ # validates_format_of :foo
14
+ # validates_inclusion_of :foo
15
+ # validates_length_of :foo
16
+ # validates_numericality_of :foo
17
+ # validates_presence_of :foo
18
+ # validates_size_of :foo
19
+ # validates_uniqueness_of :foo
20
+ #
21
+ # # good
22
+ # validates :foo, acceptance: true
23
+ # validates :foo, confirmation: true
24
+ # validates :foo, exclusion: true
25
+ # validates :foo, format: true
26
+ # validates :foo, inclusion: true
27
+ # validates :foo, length: true
28
+ # validates :foo, numericality: true
29
+ # validates :foo, presence: true
30
+ # validates :foo, size: true
31
+ # validates :foo, uniqueness: true
32
+ #
7
33
  class Validation < Cop
8
- MSG = 'Prefer the new style validations `%s` over `%s`.'.freeze
34
+ MSG = 'Prefer the new style validations `%<prefer>s` over ' \
35
+ '`%<current>s`.'.freeze
9
36
 
10
37
  TYPES = %w[
11
38
  acceptance
@@ -39,7 +66,8 @@ module RuboCop
39
66
  private
40
67
 
41
68
  def message(node)
42
- format(MSG, preferred_method(node.method_name), node.method_name)
69
+ format(MSG, prefer: preferred_method(node.method_name),
70
+ current: node.method_name)
43
71
  end
44
72
 
45
73
  def preferred_method(method)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Security
6
+ # This cop checks for the use of `Kernel#open`.
7
+ # `Kernel#open` enables not only file access but also process invocation
8
+ # by prefixing a pipe symbol (e.g., `open("| ls")`). So, it may lead to
9
+ # a serious security risk by using variable input to the argument of
10
+ # `Kernel#open`. It would be better to use `File.open` or `IO.popen`
11
+ # explicitly.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # open(something)
16
+ #
17
+ # # good
18
+ # File.open(something)
19
+ # IO.popen(something)
20
+ class Open < Cop
21
+ MSG = 'The use of `Kernel#open` is a serious security risk.'.freeze
22
+
23
+ def_node_matcher :open?, <<-PATTERN
24
+ (send nil? :open $!str ...)
25
+ PATTERN
26
+
27
+ def safe?(node)
28
+ if node.str_type?
29
+ !node.str_content.empty? && !node.str_content.start_with?('|')
30
+ elsif node.dstr_type?
31
+ safe?(node.child_nodes.first)
32
+ elsif node.send_type? && node.method_name == :+
33
+ safe?(node.child_nodes.first)
34
+ else
35
+ false
36
+ end
37
+ end
38
+
39
+ def on_send(node)
40
+ open?(node) do |code|
41
+ return if safe?(code)
42
+ add_offense(node, location: :selector)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -38,6 +38,7 @@ module RuboCop
38
38
  # end
39
39
  class AndOr < Cop
40
40
  include ConfigurableEnforcedStyle
41
+ include RangeHelp
41
42
 
42
43
  MSG = 'Use `%<prefer>s` instead of `%<current>s`.'.freeze
43
44
 
@@ -16,10 +16,12 @@ module RuboCop
16
16
  # # good
17
17
  # # Translates from English to Japanese
18
18
  class AsciiComments < Cop
19
+ include RangeHelp
20
+
19
21
  MSG = 'Use only ascii symbols in comments.'.freeze
20
22
 
21
23
  def investigate(processed_source)
22
- processed_source.comments.each do |comment|
24
+ processed_source.each_comment do |comment|
23
25
  next if comment.text.ascii_only?
24
26
  next if only_allowed_non_ascii_chars?(comment.text)
25
27
  add_offense(comment, location: first_offense_range(comment))