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
@@ -144,11 +144,8 @@ module RuboCop
144
144
 
145
145
  def non_comment_token_line_numbers
146
146
  @non_comment_token_line_numbers ||= begin
147
- non_comment_tokens = processed_source.tokens.reject do |token|
148
- token.type == :tCOMMENT
149
- end
150
-
151
- non_comment_tokens.map { |token| token.pos.line }.uniq
147
+ non_comment_tokens = processed_source.tokens.reject(&:comment?)
148
+ non_comment_tokens.map(&:line).uniq
152
149
  end
153
150
  end
154
151
  end
@@ -2,14 +2,14 @@
2
2
 
3
3
  require 'pathname'
4
4
 
5
- # rubocop:disable Metrics/ClassLength
6
-
7
5
  module RuboCop
8
6
  # This class represents the configuration of the RuboCop application
9
7
  # and all its cops. A Config is associated with a YAML configuration
10
8
  # file from which it was read. Several different Configs can be used
11
9
  # during a run of the rubocop program, if files in several
12
10
  # directories are inspected.
11
+
12
+ # rubocop:disable Metrics/ClassLength
13
13
  class Config
14
14
  include PathUtil
15
15
 
@@ -17,7 +17,7 @@ module RuboCop
17
17
  AutoCorrect StyleGuide Details].freeze
18
18
  # 2.1 is the oldest officially supported Ruby version.
19
19
  DEFAULT_RUBY_VERSION = 2.1
20
- KNOWN_RUBIES = [2.1, 2.2, 2.3, 2.4].freeze
20
+ KNOWN_RUBIES = [2.1, 2.2, 2.3, 2.4, 2.5].freeze
21
21
  OBSOLETE_RUBIES = { 1.9 => '0.50', 2.0 => '0.50' }.freeze
22
22
  DEFAULT_RAILS_VERSION = 5.0
23
23
  OBSOLETE_COPS = {
@@ -33,6 +33,9 @@ module RuboCop
33
33
  'Style/SingleSpaceBeforeFirstArg' =>
34
34
  'The `Style/SingleSpaceBeforeFirstArg` cop has been renamed to ' \
35
35
  '`Layout/SpaceBeforeFirstArg`.',
36
+ 'Lint/RescueWithoutErrorClass' =>
37
+ 'The `Lint/RescueWithoutErrorClass` cop has been replaced by ' \
38
+ '`Style/RescueStandardError`.',
36
39
  'Lint/SpaceBeforeFirstArg' =>
37
40
  'The `Lint/SpaceBeforeFirstArg` cop has been removed, since it was a ' \
38
41
  'duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
@@ -114,6 +117,13 @@ module RuboCop
114
117
  alternative: 'Style/Encoding no longer supports styles. ' \
115
118
  'The "never" behavior is always assumed.'
116
119
  },
120
+ {
121
+ cop: 'Style/IfUnlessModifier',
122
+ parameter: 'MaxLineLength',
123
+ alternative:
124
+ '`Style/IfUnlessModifier: MaxLineLength` has been removed. Use ' \
125
+ '`Metrics/LineLength: Max` instead'
126
+ },
117
127
  {
118
128
  cop: 'Style/SpaceAroundOperators',
119
129
  parameter: 'MultiSpaceAllowedForOperators',
@@ -121,6 +131,13 @@ module RuboCop
121
131
  'for alignment, please use AllowForAlignment: ' \
122
132
  'true instead.'
123
133
  },
134
+ {
135
+ cop: 'Style/WhileUntilModifier',
136
+ parameter: 'MaxLineLength',
137
+ alternative:
138
+ '`Style/WhileUntilModifier: MaxLineLength` has been removed. Use ' \
139
+ '`Metrics/LineLength: Max` instead'
140
+ },
124
141
  {
125
142
  cop: 'AllCops',
126
143
  parameter: 'RunRailsCops',
@@ -172,6 +189,19 @@ module RuboCop
172
189
  @hash = hash
173
190
  end
174
191
 
192
+ def self.create(hash, path)
193
+ new(hash, path).check
194
+ end
195
+
196
+ def check
197
+ deprecation_check do |deprecation_message|
198
+ warn("#{path} - #{deprecation_message}")
199
+ end
200
+ validate
201
+ make_excludes_absolute
202
+ self
203
+ end
204
+
175
205
  def [](key)
176
206
  @hash[key]
177
207
  end
@@ -282,7 +312,7 @@ module RuboCop
282
312
  check_target_ruby
283
313
  validate_parameter_names(valid_cop_names)
284
314
  validate_enforced_styles(valid_cop_names)
285
- validate_syntax_cop(valid_cop_names)
315
+ validate_syntax_cop
286
316
  reject_mutually_exclusive_defaults
287
317
  end
288
318
 
@@ -381,13 +411,16 @@ module RuboCop
381
411
  end
382
412
  end
383
413
 
384
- def validate_syntax_cop(valid_cop_names)
385
- return unless valid_cop_names.include?('Lint/Syntax') ||
386
- valid_cop_names.include?('Syntax')
414
+ def validate_syntax_cop
415
+ syntax_config = self['Lint/Syntax']
416
+ default_config = ConfigLoader.default_configuration['Lint/Syntax']
417
+
418
+ return unless syntax_config &&
419
+ default_config.merge(syntax_config) != default_config
387
420
 
388
421
  raise ValidationError,
389
422
  "configuration for Syntax cop found in #{smart_loaded_path}\n" \
390
- 'This cop cannot be configured.'
423
+ 'It\'s not possible to disable this cop.'
391
424
  end
392
425
 
393
426
  def validate_section_presence(name)
@@ -514,4 +547,5 @@ module RuboCop
514
547
  PathUtil.smart_path(@loaded_path)
515
548
  end
516
549
  end
550
+ # rubocop:enable Metrics/ClassLength
517
551
  end
@@ -16,8 +16,6 @@ module RuboCop
16
16
  AUTO_GENERATED_FILE = '.rubocop_todo.yml'.freeze
17
17
 
18
18
  class << self
19
- include ConfigLoaderResolver
20
-
21
19
  attr_accessor :debug, :auto_gen_config, :ignore_parent_exclusion
22
20
  attr_writer :root_level # The upwards search is stopped at this level.
23
21
  attr_writer :default_configuration
@@ -32,36 +30,22 @@ module RuboCop
32
30
 
33
31
  def load_file(file)
34
32
  return if file.nil?
35
- path = File.absolute_path(
36
- file.is_a?(RemoteConfig) ? file.file : file
37
- )
33
+ path = File.absolute_path(file.is_a?(RemoteConfig) ? file.file : file)
38
34
 
39
35
  hash = load_yaml_configuration(path)
40
36
 
41
37
  # Resolve requires first in case they define additional cops
42
- resolve_requires(path, hash)
38
+ resolver.resolve_requires(path, hash)
43
39
 
44
40
  add_missing_namespaces(path, hash)
45
41
  target_ruby_version_to_f!(hash)
46
42
 
47
- resolve_inheritance_from_gems(hash, hash.delete('inherit_gem'))
48
- resolve_inheritance(path, hash, file)
43
+ resolver.resolve_inheritance_from_gems(hash, hash.delete('inherit_gem'))
44
+ resolver.resolve_inheritance(path, hash, file)
49
45
 
50
46
  hash.delete('inherit_from')
51
47
 
52
- create_config(hash, path)
53
- end
54
-
55
- def create_config(hash, path)
56
- config = Config.new(hash, path)
57
-
58
- config.deprecation_check do |deprecation_message|
59
- warn("#{path} - #{deprecation_message}")
60
- end
61
-
62
- config.validate
63
- config.make_excludes_absolute
64
- config
48
+ Config.create(hash, path)
65
49
  end
66
50
 
67
51
  # rubocop:disable Performance/HashEachMethods
@@ -79,36 +63,7 @@ module RuboCop
79
63
  # with the addition that any value that is a hash, and occurs in both
80
64
  # arguments, will also be merged. And so on.
81
65
  def merge(base_hash, derived_hash)
82
- result = base_hash.merge(derived_hash)
83
- keys_appearing_in_both = base_hash.keys & derived_hash.keys
84
- keys_appearing_in_both.each do |key|
85
- next unless base_hash[key].is_a?(Hash)
86
- result[key] = merge(base_hash[key], derived_hash[key])
87
- end
88
- result
89
- end
90
-
91
- def base_configs(path, inherit_from, file)
92
- configs = Array(inherit_from).compact.map do |f|
93
- load_file(inherited_file(path, f, file))
94
- end
95
-
96
- configs.compact
97
- end
98
-
99
- def inherited_file(path, inherit_from, file)
100
- regex = URI::DEFAULT_PARSER.make_regexp(%w[http https])
101
- if inherit_from =~ /\A#{regex}\z/
102
- f = RemoteConfig.new(inherit_from, File.dirname(path))
103
- elsif file.is_a?(RemoteConfig)
104
- f = file.inherit_from_remote(inherit_from, path)
105
- else
106
- f = File.expand_path(inherit_from, File.dirname(path))
107
-
108
- return if auto_gen_config? && f.include?(AUTO_GENERATED_FILE)
109
- print 'Inheriting ' if debug?
110
- end
111
- f
66
+ resolver.merge(base_hash, derived_hash)
112
67
  end
113
68
 
114
69
  # Returns the path of .rubocop.yml searching upwards in the
@@ -153,22 +108,7 @@ module RuboCop
153
108
  # so that only cops explicitly disabled in user configuration are
154
109
  # disabled.
155
110
  def merge_with_default(config, config_file)
156
- default_configuration = self.default_configuration
157
-
158
- disabled_by_default = config.for_all_cops['DisabledByDefault']
159
- enabled_by_default = config.for_all_cops['EnabledByDefault']
160
-
161
- if disabled_by_default || enabled_by_default
162
- default_configuration = transform(default_configuration) do |params|
163
- params.merge('Enabled' => !disabled_by_default)
164
- end
165
- end
166
-
167
- if disabled_by_default
168
- config = handle_disabled_by_default(config, default_configuration)
169
- end
170
-
171
- Config.new(merge(default_configuration, config), config_file)
111
+ resolver.merge_with_default(config, config_file)
172
112
  end
173
113
 
174
114
  def target_ruby_version_to_f!(hash)
@@ -178,40 +118,37 @@ module RuboCop
178
118
  hash['AllCops'][version] = hash['AllCops'][version].to_f
179
119
  end
180
120
 
181
- private
182
-
183
- def handle_disabled_by_default(config, new_default_configuration)
184
- department_config = config.to_hash.reject { |cop| cop.include?('/') }
185
- department_config.each do |dept, dept_params|
186
- # Rails is always disabled by default and the department's Enabled
187
- # flag works like the --rails command line option, which is that when
188
- # AllCops:DisabledByDefault is true, each Rails cop must still be
189
- # explicitly mentioned in user configuration in order to be enabled.
190
- next if dept == 'Rails'
191
-
192
- next unless dept_params['Enabled']
193
-
194
- new_default_configuration.each do |cop, params|
195
- next unless cop.start_with?(dept + '/')
121
+ def add_inheritance_from_auto_generated_file
122
+ file_string = " #{AUTO_GENERATED_FILE}"
196
123
 
197
- # Retain original default configuration for cops in the department.
198
- params['Enabled'] = default_configuration[cop]['Enabled']
199
- end
124
+ if File.exist?(DOTFILE)
125
+ files = Array(load_yaml_configuration(DOTFILE)['inherit_from'])
126
+ return if files.include?(AUTO_GENERATED_FILE)
127
+ files.unshift(AUTO_GENERATED_FILE)
128
+ file_string = "\n - " + files.join("\n - ") if files.size > 1
129
+ rubocop_yml_contents = IO.read(DOTFILE, encoding: Encoding::UTF_8)
130
+ .sub(/^inherit_from: *[.\w]+/, '')
131
+ .sub(/^inherit_from: *(\n *- *[.\w]+)+/, '')
200
132
  end
133
+ write_dotfile(file_string, rubocop_yml_contents)
134
+ puts "Added inheritance from `#{AUTO_GENERATED_FILE}` in `#{DOTFILE}`."
135
+ end
136
+
137
+ private
201
138
 
202
- transform(config) do |params|
203
- { 'Enabled' => true }.merge(params) # Set true if not set.
139
+ def write_dotfile(file_string, rubocop_yml_contents)
140
+ File.open(DOTFILE, 'w') do |f|
141
+ f.write "inherit_from:#{file_string}\n\n"
142
+ f.write rubocop_yml_contents if rubocop_yml_contents
204
143
  end
205
144
  end
206
145
 
207
- # Returns a new hash where the parameters of the given config hash have
208
- # been replaced by parameters returned by the given block.
209
- def transform(config)
210
- Hash[config.map { |cop, params| [cop, yield(params)] }]
146
+ def resolver
147
+ @resolver ||= ConfigLoaderResolver.new
211
148
  end
212
149
 
213
150
  def load_yaml_configuration(absolute_path)
214
- yaml_code = IO.read(absolute_path, encoding: Encoding::UTF_8)
151
+ yaml_code = read_file(absolute_path)
215
152
  hash = yaml_safe_load(yaml_code, absolute_path) || {}
216
153
 
217
154
  puts "configuration from #{absolute_path}" if debug?
@@ -223,6 +160,16 @@ module RuboCop
223
160
  hash
224
161
  end
225
162
 
163
+ # Read the specified file, or exit with a friendly, concise message on
164
+ # stderr. Care is taken to use the standard OS exit code for a "file not
165
+ # found" error.
166
+ def read_file(absolute_path)
167
+ IO.read(absolute_path, encoding: Encoding::UTF_8)
168
+ rescue Errno::ENOENT
169
+ warn(format('Configuration file not found: %s', absolute_path))
170
+ exit(Errno::ENOENT::Errno)
171
+ end
172
+
226
173
  def yaml_safe_load(yaml_code, filename)
227
174
  if YAML.respond_to?(:safe_load) # Ruby 2.1+
228
175
  if defined?(SafeYAML) && SafeYAML.respond_to?(:load)
@@ -236,14 +183,6 @@ module RuboCop
236
183
  end
237
184
  end
238
185
 
239
- def gem_config_path(gem_name, relative_config_path)
240
- spec = Gem::Specification.find_by_name(gem_name)
241
- return File.join(spec.gem_dir, relative_config_path)
242
- rescue Gem::LoadError => e
243
- raise Gem::LoadError,
244
- "Unable to find gem #{gem_name}; is the gem installed? #{e}"
245
- end
246
-
247
186
  def config_files_in_path(target)
248
187
  possible_config_files = dirs_to_search(target).map do |dir|
249
188
  File.join(dir, DOTFILE)
@@ -4,8 +4,8 @@ require 'yaml'
4
4
  require 'pathname'
5
5
 
6
6
  module RuboCop
7
- # A mixin to break up ConfigLoader
8
- module ConfigLoaderResolver
7
+ # A help class for ConfigLoader that handles configuration resolution.
8
+ class ConfigLoaderResolver
9
9
  def resolve_requires(path, hash)
10
10
  config_dir = File.dirname(path)
11
11
  Array(hash.delete('require')).each do |r|
@@ -40,5 +40,102 @@ module RuboCop
40
40
  end
41
41
  end
42
42
  end
43
+
44
+ # Merges the given configuration with the default one. If
45
+ # AllCops:DisabledByDefault is true, it changes the Enabled params so that
46
+ # only cops from user configuration are enabled. If
47
+ # AllCops::EnabledByDefault is true, it changes the Enabled params so that
48
+ # only cops explicitly disabled in user configuration are disabled.
49
+ def merge_with_default(config, config_file)
50
+ default_configuration = ConfigLoader.default_configuration
51
+
52
+ disabled_by_default = config.for_all_cops['DisabledByDefault']
53
+ enabled_by_default = config.for_all_cops['EnabledByDefault']
54
+
55
+ if disabled_by_default || enabled_by_default
56
+ default_configuration = transform(default_configuration) do |params|
57
+ params.merge('Enabled' => !disabled_by_default)
58
+ end
59
+ end
60
+
61
+ if disabled_by_default
62
+ config = handle_disabled_by_default(config, default_configuration)
63
+ end
64
+
65
+ Config.new(merge(default_configuration, config), config_file)
66
+ end
67
+
68
+ # Returns a new hash where the parameters of the given config hash have
69
+ # been replaced by parameters returned by the given block.
70
+ # Return a recursive merge of two hashes. That is, a normal hash merge,
71
+ # with the addition that any value that is a hash, and occurs in both
72
+ # arguments, will also be merged. And so on.
73
+ def merge(base_hash, derived_hash)
74
+ result = base_hash.merge(derived_hash)
75
+ keys_appearing_in_both = base_hash.keys & derived_hash.keys
76
+ keys_appearing_in_both.each do |key|
77
+ next unless base_hash[key].is_a?(Hash)
78
+ result[key] = merge(base_hash[key], derived_hash[key])
79
+ end
80
+ result
81
+ end
82
+
83
+ private
84
+
85
+ def base_configs(path, inherit_from, file)
86
+ configs = Array(inherit_from).compact.map do |f|
87
+ ConfigLoader.load_file(inherited_file(path, f, file))
88
+ end
89
+
90
+ configs.compact
91
+ end
92
+
93
+ def inherited_file(path, inherit_from, file)
94
+ regex = URI::DEFAULT_PARSER.make_regexp(%w[http https])
95
+ if inherit_from =~ /\A#{regex}\z/
96
+ RemoteConfig.new(inherit_from, File.dirname(path))
97
+ elsif file.is_a?(RemoteConfig)
98
+ file.inherit_from_remote(inherit_from, path)
99
+ else
100
+ print 'Inheriting ' if ConfigLoader.debug?
101
+ File.expand_path(inherit_from, File.dirname(path))
102
+ end
103
+ end
104
+
105
+ def handle_disabled_by_default(config, new_default_configuration)
106
+ department_config = config.to_hash.reject { |cop| cop.include?('/') }
107
+ department_config.each do |dept, dept_params|
108
+ # Rails is always disabled by default and the department's Enabled flag
109
+ # works like the --rails command line option, which is that when
110
+ # AllCops:DisabledByDefault is true, each Rails cop must still be
111
+ # explicitly mentioned in user configuration in order to be enabled.
112
+ next if dept == 'Rails'
113
+
114
+ next unless dept_params['Enabled']
115
+
116
+ new_default_configuration.each do |cop, params|
117
+ next unless cop.start_with?(dept + '/')
118
+
119
+ # Retain original default configuration for cops in the department.
120
+ params['Enabled'] = ConfigLoader.default_configuration[cop]['Enabled']
121
+ end
122
+ end
123
+
124
+ transform(config) do |params|
125
+ { 'Enabled' => true }.merge(params) # Set true if not set.
126
+ end
127
+ end
128
+
129
+ def transform(config)
130
+ Hash[config.map { |cop, params| [cop, yield(params)] }]
131
+ end
132
+
133
+ def gem_config_path(gem_name, relative_config_path)
134
+ spec = Gem::Specification.find_by_name(gem_name)
135
+ return File.join(spec.gem_dir, relative_config_path)
136
+ rescue Gem::LoadError => e
137
+ raise Gem::LoadError,
138
+ "Unable to find gem #{gem_name}; is the gem installed? #{e}"
139
+ end
43
140
  end
44
141
  end
@@ -13,7 +13,7 @@ module RuboCop
13
13
  end
14
14
 
15
15
  def support_autocorrect?
16
- respond_to?(:autocorrect, true)
16
+ respond_to?(:autocorrect)
17
17
  end
18
18
 
19
19
  def autocorrect_enabled?