rubocop 0.51.0 → 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 (360) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/config/default.yml +86 -10
  4. data/config/disabled.yml +9 -4
  5. data/config/enabled.yml +1105 -1006
  6. data/lib/rubocop.rb +30 -3
  7. data/lib/rubocop/ast/builder.rb +2 -0
  8. data/lib/rubocop/ast/node.rb +24 -2
  9. data/lib/rubocop/ast/node/args_node.rb +17 -0
  10. data/lib/rubocop/ast/node/array_node.rb +1 -1
  11. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  12. data/lib/rubocop/ast/node/send_node.rb +20 -0
  13. data/lib/rubocop/ast/node/str_node.rb +14 -0
  14. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  15. data/lib/rubocop/ast/traversal.rb +4 -4
  16. data/lib/rubocop/cli.rb +45 -4
  17. data/lib/rubocop/comment_config.rb +2 -5
  18. data/lib/rubocop/config.rb +42 -8
  19. data/lib/rubocop/config_loader.rb +39 -100
  20. data/lib/rubocop/config_loader_resolver.rb +99 -2
  21. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  22. data/lib/rubocop/cop/bundler/duplicated_gem.rb +7 -7
  23. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +4 -3
  24. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -2
  25. data/lib/rubocop/cop/cop.rb +16 -46
  26. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  27. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +3 -2
  28. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  29. data/lib/rubocop/cop/generator.rb +23 -4
  30. data/lib/rubocop/cop/internal_affairs.rb +1 -1
  31. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  32. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -2
  33. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  34. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  35. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  36. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +4 -7
  37. data/lib/rubocop/cop/layout/align_hash.rb +16 -16
  38. data/lib/rubocop/cop/layout/align_parameters.rb +6 -12
  39. data/lib/rubocop/cop/layout/block_end_newline.rb +19 -5
  40. data/lib/rubocop/cop/layout/case_indentation.rb +14 -17
  41. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  42. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -0
  43. data/lib/rubocop/cop/layout/comment_indentation.rb +39 -2
  44. data/lib/rubocop/cop/layout/dot_position.rb +22 -13
  45. data/lib/rubocop/cop/layout/else_alignment.rb +6 -6
  46. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +17 -17
  47. data/lib/rubocop/cop/layout/empty_lines.rb +15 -1
  48. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  50. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  51. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  52. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  53. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +7 -3
  54. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -2
  55. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  56. data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
  57. data/lib/rubocop/cop/layout/extra_spacing.rb +21 -24
  58. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +4 -1
  59. data/lib/rubocop/cop/layout/indent_array.rb +67 -20
  60. data/lib/rubocop/cop/layout/indent_hash.rb +70 -25
  61. data/lib/rubocop/cop/layout/indent_heredoc.rb +51 -11
  62. data/lib/rubocop/cop/layout/indentation_width.rb +24 -17
  63. data/lib/rubocop/cop/layout/initial_indentation.rb +7 -5
  64. data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
  65. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  66. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -9
  67. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  68. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  69. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +9 -10
  70. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
  71. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +9 -3
  72. data/lib/rubocop/cop/layout/space_after_colon.rb +4 -4
  73. data/lib/rubocop/cop/layout/space_after_comma.rb +3 -3
  74. data/lib/rubocop/cop/layout/space_after_method_name.rb +4 -4
  75. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  76. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +16 -19
  77. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +27 -16
  78. data/lib/rubocop/cop/layout/space_around_keyword.rb +13 -11
  79. data/lib/rubocop/cop/layout/space_around_operators.rb +26 -13
  80. data/lib/rubocop/cop/layout/space_before_block_braces.rb +10 -10
  81. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  82. data/lib/rubocop/cop/layout/space_before_comment.rb +2 -4
  83. data/lib/rubocop/cop/layout/space_before_first_arg.rb +4 -3
  84. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  85. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +6 -12
  86. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  87. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -3
  88. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +87 -16
  89. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +57 -34
  90. data/lib/rubocop/cop/layout/space_inside_parens.rb +31 -3
  91. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  92. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  93. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -13
  94. data/lib/rubocop/cop/layout/tab.rb +2 -2
  95. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +7 -7
  96. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +11 -20
  97. data/lib/rubocop/cop/lint/block_alignment.rb +26 -23
  98. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  99. data/lib/rubocop/cop/lint/def_end_alignment.rb +5 -10
  100. data/lib/rubocop/cop/lint/else_layout.rb +2 -2
  101. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  102. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +3 -4
  103. data/lib/rubocop/cop/lint/inherit_exception.rb +10 -14
  104. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  105. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  106. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  107. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  108. data/lib/rubocop/cop/lint/percent_string_array.rb +14 -14
  109. data/lib/rubocop/cop/lint/percent_symbol_array.rb +11 -11
  110. data/lib/rubocop/cop/lint/redundant_with_index.rb +6 -3
  111. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  112. data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
  113. data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
  114. data/lib/rubocop/cop/lint/script_permission.rb +1 -0
  115. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  116. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  117. data/lib/rubocop/cop/lint/unneeded_disable.rb +29 -11
  118. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +2 -1
  119. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +43 -17
  120. data/lib/rubocop/cop/message_annotator.rb +4 -2
  121. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  122. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  123. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  124. data/lib/rubocop/cop/metrics/line_length.rb +2 -2
  125. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  126. data/lib/rubocop/cop/metrics/parameter_lists.rb +9 -2
  127. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  128. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  129. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +7 -5
  130. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  131. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +7 -3
  132. data/lib/rubocop/cop/mixin/heredoc.rb +19 -19
  133. data/lib/rubocop/cop/mixin/method_complexity.rb +32 -8
  134. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -3
  135. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +6 -4
  136. data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
  137. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +16 -12
  138. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  139. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -8
  140. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -10
  141. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  142. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  143. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  144. data/lib/rubocop/cop/mixin/trailing_comma.rb +22 -14
  145. data/lib/rubocop/cop/mixin/unused_argument.rb +3 -40
  146. data/lib/rubocop/cop/naming/accessor_method_name.rb +20 -10
  147. data/lib/rubocop/cop/naming/ascii_identifiers.rb +33 -0
  148. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +5 -4
  149. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +16 -12
  150. data/lib/rubocop/cop/naming/constant_name.rb +32 -3
  151. data/lib/rubocop/cop/naming/file_name.rb +19 -8
  152. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +10 -16
  153. data/lib/rubocop/cop/naming/method_name.rb +20 -14
  154. data/lib/rubocop/cop/naming/predicate_name.rb +7 -3
  155. data/lib/rubocop/cop/naming/variable_name.rb +17 -2
  156. data/lib/rubocop/cop/naming/variable_number.rb +10 -27
  157. data/lib/rubocop/cop/offense.rb +6 -1
  158. data/lib/rubocop/cop/performance/case_when_splat.rb +2 -6
  159. data/lib/rubocop/cop/performance/casecmp.rb +5 -4
  160. data/lib/rubocop/cop/performance/compare_with_block.rb +13 -7
  161. data/lib/rubocop/cop/performance/count.rb +5 -4
  162. data/lib/rubocop/cop/performance/detect.rb +7 -4
  163. data/lib/rubocop/cop/performance/double_start_end_with.rb +2 -7
  164. data/lib/rubocop/cop/performance/end_with.rb +2 -2
  165. data/lib/rubocop/cop/performance/flat_map.rb +3 -2
  166. data/lib/rubocop/cop/performance/hash_each_methods.rb +41 -40
  167. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +5 -4
  168. data/lib/rubocop/cop/performance/redundant_block_call.rb +22 -22
  169. data/lib/rubocop/cop/performance/redundant_match.rb +2 -2
  170. data/lib/rubocop/cop/performance/redundant_merge.rb +6 -4
  171. data/lib/rubocop/cop/performance/redundant_sort_by.rb +4 -4
  172. data/lib/rubocop/cop/performance/regexp_match.rb +3 -2
  173. data/lib/rubocop/cop/performance/size.rb +2 -2
  174. data/lib/rubocop/cop/performance/start_with.rb +2 -2
  175. data/lib/rubocop/cop/performance/string_replacement.rb +4 -4
  176. data/lib/rubocop/cop/performance/times_map.rb +14 -15
  177. data/lib/rubocop/cop/performance/uri_default_parser.rb +3 -3
  178. data/lib/rubocop/cop/rails/action_filter.rb +22 -0
  179. data/lib/rubocop/cop/rails/active_support_aliases.rb +2 -2
  180. data/lib/rubocop/cop/rails/application_job.rb +4 -2
  181. data/lib/rubocop/cop/rails/application_record.rb +4 -2
  182. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  183. data/lib/rubocop/cop/rails/delegate.rb +20 -25
  184. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +2 -2
  185. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  186. data/lib/rubocop/cop/rails/exit.rb +7 -0
  187. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +7 -0
  188. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +6 -2
  189. data/lib/rubocop/cop/rails/http_positional_arguments.rb +36 -41
  190. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  191. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  192. data/lib/rubocop/cop/rails/output.rb +9 -0
  193. data/lib/rubocop/cop/rails/output_safety.rb +14 -20
  194. data/lib/rubocop/cop/rails/pluralization_grammar.rb +8 -8
  195. data/lib/rubocop/cop/rails/presence.rb +105 -0
  196. data/lib/rubocop/cop/rails/read_write_attribute.rb +10 -10
  197. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  198. data/lib/rubocop/cop/rails/relative_date_constant.rb +9 -9
  199. data/lib/rubocop/cop/rails/reversible_migration.rb +3 -4
  200. data/lib/rubocop/cop/rails/safe_navigation.rb +5 -6
  201. data/lib/rubocop/cop/rails/save_bang.rb +2 -2
  202. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +1 -1
  203. data/lib/rubocop/cop/rails/validation.rb +7 -7
  204. data/lib/rubocop/cop/security/json_load.rb +4 -2
  205. data/lib/rubocop/cop/security/marshal_load.rb +4 -2
  206. data/lib/rubocop/cop/style/alias.rb +24 -26
  207. data/lib/rubocop/cop/style/and_or.rb +34 -28
  208. data/lib/rubocop/cop/style/array_join.rb +9 -0
  209. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  210. data/lib/rubocop/cop/style/attr.rb +14 -4
  211. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -3
  212. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  213. data/lib/rubocop/cop/style/block_comments.rb +14 -2
  214. data/lib/rubocop/cop/style/block_delimiters.rb +80 -15
  215. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +81 -48
  216. data/lib/rubocop/cop/style/case_equality.rb +12 -0
  217. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  218. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -2
  219. data/lib/rubocop/cop/style/class_check.rb +28 -9
  220. data/lib/rubocop/cop/style/class_methods.rb +8 -8
  221. data/lib/rubocop/cop/style/class_vars.rb +4 -3
  222. data/lib/rubocop/cop/style/collection_methods.rb +4 -2
  223. data/lib/rubocop/cop/style/colon_method_call.rb +16 -0
  224. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  225. data/lib/rubocop/cop/style/command_literal.rb +70 -21
  226. data/lib/rubocop/cop/style/comment_annotation.rb +35 -10
  227. data/lib/rubocop/cop/style/commented_keyword.rb +12 -9
  228. data/lib/rubocop/cop/style/conditional_assignment.rb +10 -12
  229. data/lib/rubocop/cop/style/copyright.rb +19 -20
  230. data/lib/rubocop/cop/style/date_time.rb +2 -2
  231. data/lib/rubocop/cop/style/def_with_parentheses.rb +27 -2
  232. data/lib/rubocop/cop/style/dir.rb +2 -2
  233. data/lib/rubocop/cop/style/documentation.rb +17 -2
  234. data/lib/rubocop/cop/style/each_for_simple_loop.rb +7 -7
  235. data/lib/rubocop/cop/style/each_with_object.rb +5 -5
  236. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  237. data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
  238. data/lib/rubocop/cop/style/empty_else.rb +52 -22
  239. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  240. data/lib/rubocop/cop/style/empty_literal.rb +17 -5
  241. data/lib/rubocop/cop/style/empty_method.rb +4 -10
  242. data/lib/rubocop/cop/style/encoding.rb +2 -1
  243. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  244. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  245. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  246. data/lib/rubocop/cop/style/flip_flop.rb +11 -0
  247. data/lib/rubocop/cop/style/format_string.rb +29 -2
  248. data/lib/rubocop/cop/style/format_string_token.rb +15 -14
  249. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -3
  250. data/lib/rubocop/cop/style/global_vars.rb +11 -1
  251. data/lib/rubocop/cop/style/hash_syntax.rb +44 -43
  252. data/lib/rubocop/cop/style/identical_conditional_branches.rb +8 -8
  253. data/lib/rubocop/cop/style/if_inside_else.rb +10 -10
  254. data/lib/rubocop/cop/style/if_unless_modifier.rb +7 -7
  255. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +2 -2
  256. data/lib/rubocop/cop/style/if_with_semicolon.rb +9 -0
  257. data/lib/rubocop/cop/style/implicit_runtime_error.rb +5 -5
  258. data/lib/rubocop/cop/style/infinite_loop.rb +2 -2
  259. data/lib/rubocop/cop/style/lambda.rb +23 -31
  260. data/lib/rubocop/cop/style/lambda_call.rb +15 -9
  261. data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -4
  262. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -2
  263. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -2
  264. data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -3
  265. data/lib/rubocop/cop/style/method_missing.rb +8 -8
  266. data/lib/rubocop/cop/style/min_max.rb +12 -12
  267. data/lib/rubocop/cop/style/missing_else.rb +5 -4
  268. data/lib/rubocop/cop/style/mixin_grouping.rb +29 -19
  269. data/lib/rubocop/cop/style/mixin_usage.rb +8 -10
  270. data/lib/rubocop/cop/style/module_function.rb +17 -5
  271. data/lib/rubocop/cop/style/multiline_if_modifier.rb +4 -4
  272. data/lib/rubocop/cop/style/multiline_if_then.rb +14 -13
  273. data/lib/rubocop/cop/style/multiline_memoization.rb +8 -14
  274. data/lib/rubocop/cop/style/mutable_constant.rb +12 -12
  275. data/lib/rubocop/cop/style/negated_if.rb +22 -30
  276. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  277. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +18 -17
  278. data/lib/rubocop/cop/style/next.rb +39 -11
  279. data/lib/rubocop/cop/style/nil_comparison.rb +6 -6
  280. data/lib/rubocop/cop/style/non_nil_check.rb +25 -22
  281. data/lib/rubocop/cop/style/not.rb +14 -4
  282. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -6
  283. data/lib/rubocop/cop/style/numeric_literals.rb +7 -7
  284. data/lib/rubocop/cop/style/numeric_predicate.rb +14 -18
  285. data/lib/rubocop/cop/style/one_line_conditional.rb +4 -4
  286. data/lib/rubocop/cop/style/option_hash.rb +11 -14
  287. data/lib/rubocop/cop/style/or_assignment.rb +2 -2
  288. data/lib/rubocop/cop/style/parallel_assignment.rb +13 -13
  289. data/lib/rubocop/cop/style/parentheses_around_condition.rb +19 -3
  290. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +24 -3
  291. data/lib/rubocop/cop/style/percent_q_literals.rb +27 -6
  292. data/lib/rubocop/cop/style/perl_backrefs.rb +7 -0
  293. data/lib/rubocop/cop/style/preferred_hash_methods.rb +6 -10
  294. data/lib/rubocop/cop/style/proc.rb +8 -0
  295. data/lib/rubocop/cop/style/raise_args.rb +8 -14
  296. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  297. data/lib/rubocop/cop/style/redundant_begin.rb +14 -4
  298. data/lib/rubocop/cop/style/redundant_conditional.rb +9 -8
  299. data/lib/rubocop/cop/style/redundant_return.rb +5 -4
  300. data/lib/rubocop/cop/style/redundant_self.rb +25 -26
  301. data/lib/rubocop/cop/style/regexp_literal.rb +74 -21
  302. data/lib/rubocop/cop/style/rescue_modifier.rb +11 -0
  303. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  304. data/lib/rubocop/cop/style/return_nil.rb +4 -8
  305. data/lib/rubocop/cop/style/safe_navigation.rb +20 -2
  306. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  307. data/lib/rubocop/cop/style/semicolon.rb +18 -8
  308. data/lib/rubocop/cop/style/send.rb +9 -0
  309. data/lib/rubocop/cop/style/signal_exception.rb +100 -0
  310. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  311. data/lib/rubocop/cop/style/single_line_methods.rb +20 -8
  312. data/lib/rubocop/cop/style/special_global_vars.rb +16 -11
  313. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +7 -12
  314. data/lib/rubocop/cop/style/stderr_puts.rb +5 -3
  315. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  316. data/lib/rubocop/cop/style/string_literals.rb +22 -0
  317. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +2 -8
  318. data/lib/rubocop/cop/style/string_methods.rb +18 -7
  319. data/lib/rubocop/cop/style/symbol_array.rb +5 -9
  320. data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
  321. data/lib/rubocop/cop/style/ternary_parentheses.rb +31 -40
  322. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  323. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  324. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  325. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  326. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -4
  327. data/lib/rubocop/cop/style/trivial_accessors.rb +32 -10
  328. data/lib/rubocop/cop/style/unless_else.rb +15 -0
  329. data/lib/rubocop/cop/style/unneeded_capital_w.rb +17 -7
  330. data/lib/rubocop/cop/style/unneeded_interpolation.rb +14 -18
  331. data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -12
  332. data/lib/rubocop/cop/style/variable_interpolation.rb +20 -9
  333. data/lib/rubocop/cop/style/when_then.rb +13 -0
  334. data/lib/rubocop/cop/style/while_until_do.rb +26 -4
  335. data/lib/rubocop/cop/style/while_until_modifier.rb +25 -6
  336. data/lib/rubocop/cop/style/word_array.rb +4 -8
  337. data/lib/rubocop/cop/style/yoda_condition.rb +10 -16
  338. data/lib/rubocop/cop/style/zero_length_predicate.rb +23 -15
  339. data/lib/rubocop/cop/util.rb +42 -33
  340. data/lib/rubocop/cop/variable_force.rb +1 -1
  341. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  342. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  343. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  344. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -3
  345. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  346. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  347. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  348. data/lib/rubocop/node_pattern.rb +2 -3
  349. data/lib/rubocop/options.rb +8 -8
  350. data/lib/rubocop/path_util.rb +15 -3
  351. data/lib/rubocop/processed_source.rb +5 -2
  352. data/lib/rubocop/rspec/shared_contexts.rb +4 -0
  353. data/lib/rubocop/runner.rb +1 -1
  354. data/lib/rubocop/token.rb +74 -0
  355. data/lib/rubocop/version.rb +1 -1
  356. metadata +37 -10
  357. data/lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb +0 -81
  358. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  359. data/lib/rubocop/cop/lint/rescue_without_error_class.rb +0 -41
  360. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
@@ -26,8 +26,8 @@ module RuboCop
26
26
  # # good
27
27
  # gem 'rubocop', groups: [:development, :test]
28
28
  class DuplicatedGem < Cop
29
- MSG = 'Gem `%s` requirements already given on line %d ' \
30
- 'of the Gemfile.'.freeze
29
+ MSG = 'Gem `%<gem_name>s` requirements already given on line '\
30
+ '%<line_of_first_occurrence>d of the Gemfile.'.freeze
31
31
 
32
32
  def investigate(processed_source)
33
33
  return unless processed_source.ast
@@ -58,12 +58,12 @@ module RuboCop
58
58
  line_range = node.loc.column...node.loc.last_column
59
59
  offense_location =
60
60
  source_range(processed_source.buffer, node.loc.line, line_range)
61
-
62
- add_offense(
63
- node,
64
- location: offense_location,
65
- message: format(MSG, gem_name, line_of_first_occurrence)
61
+ message = format(
62
+ MSG,
63
+ gem_name: gem_name,
64
+ line_of_first_occurrence: line_of_first_occurrence
66
65
  )
66
+ add_offense(node, location: offense_location, message: message)
67
67
  end
68
68
  end
69
69
  end
@@ -26,8 +26,9 @@ module RuboCop
26
26
  # source 'https://rubygems.org' # strongly recommended
27
27
  # source 'http://rubygems.org'
28
28
  class InsecureProtocolSource < Cop
29
- MSG = 'The source `:%s` is deprecated because HTTP requests are ' \
30
- "insecure. Please change your source to 'https://rubygems.org' " \
29
+ MSG = 'The source `:%<source>s` is deprecated because HTTP requests ' \
30
+ 'are insecure. ' \
31
+ "Please change your source to 'https://rubygems.org' " \
31
32
  "if possible, or 'http://rubygems.org' if not.".freeze
32
33
 
33
34
  def_node_matcher :insecure_protocol_source?, <<-PATTERN
@@ -37,7 +38,7 @@ module RuboCop
37
38
 
38
39
  def on_send(node)
39
40
  insecure_protocol_source?(node) do |source|
40
- message = format(MSG, source)
41
+ message = format(MSG, source: source)
41
42
 
42
43
  add_offense(
43
44
  node,
@@ -30,7 +30,7 @@ module RuboCop
30
30
 
31
31
  MSG = 'Gems should be sorted in an alphabetical order within their '\
32
32
  'section of the Gemfile. '\
33
- 'Gem `%s` should appear before `%s`.'.freeze
33
+ 'Gem `%<previous>s` should appear before `%<current>s`.'.freeze
34
34
 
35
35
  def investigate(processed_source)
36
36
  return if processed_source.ast.nil?
@@ -54,7 +54,7 @@ module RuboCop
54
54
  end
55
55
 
56
56
  def_node_search :gem_declarations, <<-PATTERN
57
- (:send nil? :gem ...)
57
+ (:send nil? :gem str ...)
58
58
  PATTERN
59
59
  end
60
60
  end
@@ -115,13 +115,23 @@ module RuboCop
115
115
  self.class::MSG
116
116
  end
117
117
 
118
- def add_offense(node, *args, **kwargs, &block)
119
- if args.any?
120
- add_offense_deprecated(node, *args, &block)
121
- else
122
- add_offense_common(node, **kwargs, &block)
123
- end
118
+ # rubocop:disable Metrics/CyclomaticComplexity
119
+ def add_offense(node, location: :expression, message: nil, severity: nil)
120
+ loc = find_location(node, location)
121
+
122
+ return if duplicate_location?(loc)
123
+
124
+ severity = custom_severity || severity || default_severity
125
+
126
+ message ||= message(node)
127
+ message = annotate(message)
128
+
129
+ status = enabled_line?(loc.line) ? correct(node) : :disabled
130
+
131
+ @offenses << Offense.new(severity, loc, message, name, status)
132
+ yield if block_given? && status != :disabled
124
133
  end
134
+ # rubocop:enable Metrics/CyclomaticComplexity
125
135
 
126
136
  def find_location(node, loc)
127
137
  # Location can be provided as a symbol, e.g.: `:keyword`
@@ -222,46 +232,6 @@ module RuboCop
222
232
  warn(Rainbow(message).red)
223
233
  end
224
234
  end
225
-
226
- def add_offense_deprecated(node, loc = :expression, message = nil,
227
- severity = nil, &block)
228
-
229
- caller = caller_locations(2..2).first
230
- path = "#{caller.path}:#{caller.lineno}"
231
- warn_message = <<-RUBY.strip_indent
232
- #{path}
233
- Warning: The usage of positional location, message, and severity
234
- parameters to Cop#add_offense is deprecated.
235
- Please use keyword arguments instead.
236
-
237
- The positional arguments version of Cop#add_offense will be removed in
238
- RuboCop 0.52
239
- RUBY
240
-
241
- warn(Rainbow(warn_message).red)
242
-
243
- add_offense_common(node, location: loc, message: message,
244
- severity: severity, &block)
245
- end
246
-
247
- # rubocop:disable Metrics/CyclomaticComplexity
248
- def add_offense_common(node, location: :expression, message: nil,
249
- severity: nil)
250
- loc = find_location(node, location)
251
-
252
- return if duplicate_location?(loc)
253
-
254
- severity = custom_severity || severity || default_severity
255
-
256
- message ||= message(node)
257
- message = annotate(message)
258
-
259
- status = enabled_line?(loc.line) ? correct(node) : :disabled
260
-
261
- @offenses << Offense.new(severity, loc, message, name, status)
262
- yield if block_given? && status != :disabled
263
- end
264
- # rubocop:enable Metrics/CyclomaticComplexity
265
235
  end
266
236
  end
267
237
  end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Gemspec
6
+ # An attribute assignment method calls should be listed only once
7
+ # in a gemspec.
8
+ #
9
+ # Assigning to an attribute with the same name using `spec.foo =` will be
10
+ # an unintended usage. On the other hand, duplication of methods such
11
+ # as `spec.requirements`, `spec.add_runtime_dependency` and others are
12
+ # permitted because it is the intended use of appending values.
13
+ #
14
+ # @example
15
+ # # bad
16
+ # Gem::Specification.new do |spec|
17
+ # spec.name = 'rubocop'
18
+ # spec.name = 'rubocop2'
19
+ # end
20
+ #
21
+ # # good
22
+ # Gem::Specification.new do |spec|
23
+ # spec.name = 'rubocop'
24
+ # end
25
+ #
26
+ # # good
27
+ # Gem::Specification.new do |spec|
28
+ # spec.requirements << 'libmagick, v6.0'
29
+ # spec.requirements << 'A good graphics card'
30
+ # end
31
+ #
32
+ # # good
33
+ # Gem::Specification.new do |spec|
34
+ # spec.add_runtime_dependency('parallel', '~> 1.10')
35
+ # spec.add_runtime_dependency('parser', '>= 2.3.3.1', '< 3.0')
36
+ # end
37
+ class DuplicatedAssignment < Cop
38
+ MSG = '`%<assignment>s` method calls already given on line '\
39
+ '%<line_of_first_occurrence>d of the gemspec.'.freeze
40
+
41
+ def_node_search :gem_specification, <<-PATTERN
42
+ (block
43
+ (send
44
+ (const
45
+ (const {cbase nil?} :Gem) :Specification) :new)
46
+ (args
47
+ (arg $_)) ...)
48
+ PATTERN
49
+
50
+ def_node_search :assignment_method_declarations, <<-PATTERN
51
+ (send
52
+ (lvar #match_block_variable_name?) #assignment_method? ...)
53
+ PATTERN
54
+
55
+ def investigate(processed_source)
56
+ return unless processed_source.ast
57
+
58
+ duplicated_assignment_method_nodes.each do |nodes|
59
+ nodes[1..-1].each do |node|
60
+ register_offense(
61
+ node,
62
+ node.method_name,
63
+ nodes.first.loc.line
64
+ )
65
+ end
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def match_block_variable_name?(receiver_name)
72
+ gem_specification(processed_source.ast) do |block_variable_name|
73
+ return block_variable_name == receiver_name
74
+ end
75
+ end
76
+
77
+ def assignment_method?(method_name)
78
+ method_name.to_s.end_with?('=')
79
+ end
80
+
81
+ def duplicated_assignment_method_nodes
82
+ assignment_method_declarations(processed_source.ast)
83
+ .group_by(&:method_name)
84
+ .values
85
+ .select { |nodes| nodes.size > 1 }
86
+ end
87
+
88
+ def register_offense(node, assignment, line_of_first_occurrence)
89
+ line_range = node.loc.column...node.loc.last_column
90
+ offense_location =
91
+ source_range(processed_source.buffer, node.loc.line, line_range)
92
+ message = format(
93
+ MSG,
94
+ assignment: assignment,
95
+ line_of_first_occurrence: line_of_first_occurrence
96
+ )
97
+ add_offense(node, location: offense_location, message: message)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -54,9 +54,10 @@ module RuboCop
54
54
  include ConfigurableEnforcedStyle
55
55
  include OrderedGemNode
56
56
 
57
- MSG = 'Dependencies should be sorted in an alphabetical order within '\
57
+ MSG = 'Dependencies should be sorted in an alphabetical order within ' \
58
58
  'their section of the gemspec. '\
59
- 'Dependency `%s` should appear before `%s`.'.freeze
59
+ 'Dependency `%<previous>s` should appear before `%<current>s`.'
60
+ .freeze
60
61
 
61
62
  def investigate(processed_source)
62
63
  return if processed_source.ast.nil?
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Gemspec
6
+ # Checks that `required_ruby_version` of gemspec and `TargetRubyVersion`
7
+ # of .rubocop.yml are equal.
8
+ # Thereby, RuboCop to perform static analysis working on the version
9
+ # required by gemspec.
10
+ #
11
+ # @example
12
+ # # When `TargetRubyVersion` of .rubocop.yml is `2.3`.
13
+ #
14
+ # # bad
15
+ # Gem::Specification.new do |spec|
16
+ # spec.required_ruby_version = '>= 2.2.0'
17
+ # end
18
+ #
19
+ # # bad
20
+ # Gem::Specification.new do |spec|
21
+ # spec.required_ruby_version = '>= 2.4.0'
22
+ # end
23
+ #
24
+ # # good
25
+ # Gem::Specification.new do |spec|
26
+ # spec.required_ruby_version = '>= 2.3.0'
27
+ # end
28
+ #
29
+ # # good
30
+ # Gem::Specification.new do |spec|
31
+ # spec.required_ruby_version = '>= 2.3'
32
+ # end
33
+ #
34
+ # # good
35
+ # Gem::Specification.new do |spec|
36
+ # spec.required_ruby_version = ['>= 2.3.0', '< 2.5.0']
37
+ # end
38
+ class RequiredRubyVersion < Cop
39
+ MSG = '`required_ruby_version` (%<required_ruby_version>s, ' \
40
+ 'declared in %<gemspec_filename>s) and `TargetRubyVersion` ' \
41
+ '(%<target_ruby_version>s, declared in .rubocop.yml) ' \
42
+ 'should be equal.'.freeze
43
+
44
+ def_node_search :required_ruby_version, <<-PATTERN
45
+ (send _ :required_ruby_version= ${(str _) (array (str _))})
46
+ PATTERN
47
+
48
+ def investigate(processed_source)
49
+ required_ruby_version(processed_source.ast) do |version|
50
+ ruby_version = extract_ruby_version(version)
51
+
52
+ return if ruby_version == target_ruby_version.to_s
53
+
54
+ add_offense(
55
+ processed_source.ast,
56
+ location: version.loc.expression,
57
+ message: message(ruby_version, target_ruby_version)
58
+ )
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def extract_ruby_version(required_ruby_version)
65
+ if required_ruby_version.array_type?
66
+ required_ruby_version = required_ruby_version.children.detect do |v|
67
+ v.str_content =~ /[>=]/
68
+ end
69
+ end
70
+
71
+ required_ruby_version.str_content.match(/(\d\.\d)/)[1]
72
+ end
73
+
74
+ def message(required_ruby_version, target_ruby_version)
75
+ file_path = processed_source.buffer.name
76
+
77
+ format(
78
+ MSG,
79
+ required_ruby_version: required_ruby_version,
80
+ gemspec_filename: File.basename(file_path),
81
+ target_ruby_version: target_ruby_version
82
+ )
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -35,10 +35,10 @@ module RuboCop
35
35
  # See. https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/node_pattern.rb
36
36
  #
37
37
  # For example
38
- MSG = 'Message of %<cop_name>s'.freeze
38
+ MSG = 'Use `#good_method` instead of `#bad_method`.'.freeze
39
39
 
40
40
  def_node_matcher :bad_method?, <<-PATTERN
41
- (send nil :bad_method ...)
41
+ (send nil? :bad_method ...)
42
42
  PATTERN
43
43
 
44
44
  def on_send(node)
@@ -55,9 +55,10 @@ module RuboCop
55
55
  # frozen_string_literal: true
56
56
 
57
57
  describe RuboCop::Cop::%<department>s::%<cop_name>s do
58
- let(:config) { RuboCop::Config.new }
59
58
  subject(:cop) { described_class.new(config) }
60
59
 
60
+ let(:config) { RuboCop::Config.new }
61
+
61
62
  # TODO: Write test code
62
63
  #
63
64
  # For example
@@ -96,6 +97,22 @@ module RuboCop
96
97
  RequireFileInjector.new(require_path).inject
97
98
  end
98
99
 
100
+ def inject_config(path = 'config/enabled.yml')
101
+ config = File.readlines(path)
102
+ content = <<-YAML.strip_indent
103
+ #{badge}:
104
+ Description: 'TODO: Write a description of the cop.'
105
+ Enabled: true
106
+
107
+ YAML
108
+ target_line = config.find.with_index(1) do |line, index|
109
+ next if line =~ /^[\s#]/
110
+ break index - 1 if badge.to_s < line
111
+ end
112
+ config.insert(target_line, content)
113
+ File.write(path, config.join)
114
+ end
115
+
99
116
  def todo
100
117
  <<-TODO.strip_indent
101
118
  Files created:
@@ -103,11 +120,13 @@ module RuboCop
103
120
  - #{spec_path}
104
121
  File modified:
105
122
  - `require_relative '#{require_path}'` added into lib/rubocop.rb
123
+ - A configuration for the cop is added into config/enabled.yml
124
+ - If you want to disable the cop by default, move the added config to config/disabled.yml
106
125
 
107
126
  Do 3 steps:
108
127
  1. Add an entry to the "New features" section in CHANGELOG.md,
109
128
  e.g. "Add new `#{badge}` cop. ([@your_id][])"
110
- 2. Add an entry into config/enabled.yml or config/disabled.yml
129
+ 2. Modify the description of #{badge} in config/enabled.yml
111
130
  3. Implement your new cop in the generated file!
112
131
  TODO
113
132
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'internal_affairs/node_destructuring'
3
4
  require_relative 'internal_affairs/node_type_predicate'
4
5
  require_relative 'internal_affairs/offense_location_keyword'
5
6
  require_relative 'internal_affairs/redundant_message_argument'
6
7
  require_relative 'internal_affairs/redundant_location_argument'
7
8
  require_relative 'internal_affairs/useless_message_assertion'
8
- require_relative 'internal_affairs/deprecated_positional_arguments'
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module InternalAffairs
6
+ # Checks that node destructuring is done either using the node
7
+ # extensions or using a splat.
8
+ #
9
+ # @example Using splat expansion
10
+ #
11
+ # # bad
12
+ # receiver, method_name, arguments = send_node.children
13
+ #
14
+ # # good
15
+ # receiver, method_name, arguments = *send_node
16
+ #
17
+ # @example Using node extensions
18
+ #
19
+ # # bad
20
+ # _receiver, method_name, _arguments = send_node.children
21
+ #
22
+ # # good
23
+ # method_name = send_node.method_name
24
+ class NodeDestructuring < Cop
25
+ MSG = 'Use the methods provided with the node extensions, or ' \
26
+ 'destructure the node using `*`.'.freeze
27
+
28
+ def_node_matcher :node_children_destructuring?, <<-PATTERN
29
+ (masgn (mlhs ...) (send (send nil? [#node_suffix? _]) :children))
30
+ PATTERN
31
+
32
+ def on_masgn(node)
33
+ node_children_destructuring?(node) do
34
+ add_offense(node)
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def node_suffix?(method_name)
41
+ method_name.to_s.end_with?('node')
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end