rubocop 0.49.1 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -9
  3. data/bin/rubocop +1 -1
  4. data/config/default.yml +264 -118
  5. data/config/disabled.yml +13 -9
  6. data/config/enabled.yml +1156 -918
  7. data/lib/rubocop.rb +555 -489
  8. data/lib/rubocop/ast/builder.rb +6 -1
  9. data/lib/rubocop/ast/node.rb +68 -52
  10. data/lib/rubocop/ast/node/args_node.rb +15 -10
  11. data/lib/rubocop/ast/node/array_node.rb +10 -1
  12. data/lib/rubocop/ast/node/block_node.rb +9 -0
  13. data/lib/rubocop/ast/node/def_node.rb +71 -0
  14. data/lib/rubocop/ast/node/for_node.rb +8 -0
  15. data/lib/rubocop/ast/node/if_node.rb +10 -2
  16. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  17. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  18. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  19. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  20. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
  21. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  22. data/lib/rubocop/ast/node/send_node.rb +21 -150
  23. data/lib/rubocop/ast/node/str_node.rb +14 -0
  24. data/lib/rubocop/ast/node/super_node.rb +3 -24
  25. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  26. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  27. data/lib/rubocop/ast/traversal.rb +7 -7
  28. data/lib/rubocop/cached_data.rb +1 -6
  29. data/lib/rubocop/cli.rb +59 -13
  30. data/lib/rubocop/comment_config.rb +2 -5
  31. data/lib/rubocop/config.rb +136 -29
  32. data/lib/rubocop/config_loader.rb +61 -104
  33. data/lib/rubocop/config_loader_resolver.rb +102 -4
  34. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  35. data/lib/rubocop/cop/bundler/duplicated_gem.rb +13 -11
  36. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
  37. data/lib/rubocop/cop/bundler/ordered_gems.rb +7 -58
  38. data/lib/rubocop/cop/commissioner.rb +6 -3
  39. data/lib/rubocop/cop/cop.rb +11 -6
  40. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  41. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +97 -0
  42. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  43. data/lib/rubocop/cop/generator.rb +122 -25
  44. data/lib/rubocop/cop/internal_affairs.rb +6 -2
  45. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  46. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +16 -5
  47. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  48. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
  49. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
  50. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
  51. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -10
  52. data/lib/rubocop/cop/layout/align_array.rb +2 -2
  53. data/lib/rubocop/cop/layout/align_hash.rb +18 -18
  54. data/lib/rubocop/cop/layout/align_parameters.rb +11 -23
  55. data/lib/rubocop/cop/layout/block_end_newline.rb +20 -6
  56. data/lib/rubocop/cop/layout/case_indentation.rb +15 -18
  57. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  58. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +7 -6
  59. data/lib/rubocop/cop/layout/comment_indentation.rb +42 -3
  60. data/lib/rubocop/cop/layout/dot_position.rb +31 -13
  61. data/lib/rubocop/cop/layout/else_alignment.rb +37 -17
  62. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +1 -1
  63. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +22 -18
  64. data/lib/rubocop/cop/layout/empty_lines.rb +16 -2
  65. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +23 -6
  66. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +89 -0
  67. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -2
  68. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +4 -8
  69. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +30 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +10 -6
  71. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +5 -5
  72. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +22 -7
  73. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  74. data/lib/rubocop/cop/layout/extra_spacing.rb +23 -26
  75. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
  76. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +9 -3
  77. data/lib/rubocop/cop/layout/indent_array.rb +68 -21
  78. data/lib/rubocop/cop/layout/indent_hash.rb +71 -26
  79. data/lib/rubocop/cop/layout/indent_heredoc.rb +70 -35
  80. data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
  81. data/lib/rubocop/cop/layout/indentation_width.rb +40 -27
  82. data/lib/rubocop/cop/layout/initial_indentation.rb +10 -7
  83. data/lib/rubocop/cop/layout/leading_comment_space.rb +32 -17
  84. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +47 -14
  85. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +12 -11
  86. data/lib/rubocop/cop/layout/multiline_block_layout.rb +19 -16
  87. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +46 -13
  88. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +29 -27
  89. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +7 -3
  90. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
  91. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +12 -4
  92. data/lib/rubocop/cop/layout/space_after_colon.rb +13 -6
  93. data/lib/rubocop/cop/layout/space_after_comma.rb +11 -1
  94. data/lib/rubocop/cop/layout/space_after_method_name.rb +8 -6
  95. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  96. data/lib/rubocop/cop/layout/space_after_semicolon.rb +8 -1
  97. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +32 -25
  98. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +28 -17
  99. data/lib/rubocop/cop/layout/space_around_keyword.rb +22 -16
  100. data/lib/rubocop/cop/layout/space_around_operators.rb +27 -14
  101. data/lib/rubocop/cop/layout/space_before_block_braces.rb +61 -12
  102. data/lib/rubocop/cop/layout/space_before_comma.rb +12 -1
  103. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -5
  104. data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -4
  105. data/lib/rubocop/cop/layout/space_before_semicolon.rb +8 -1
  106. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +12 -14
  107. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +235 -0
  108. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +4 -4
  109. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +89 -18
  110. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +62 -36
  111. data/lib/rubocop/cop/layout/space_inside_parens.rb +40 -3
  112. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  113. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +15 -15
  114. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +81 -0
  115. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +32 -17
  116. data/lib/rubocop/cop/layout/tab.rb +7 -4
  117. data/lib/rubocop/cop/layout/trailing_blank_lines.rb +11 -9
  118. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  119. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +12 -19
  120. data/lib/rubocop/cop/lint/assignment_in_condition.rb +16 -2
  121. data/lib/rubocop/cop/lint/block_alignment.rb +42 -30
  122. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  123. data/lib/rubocop/cop/lint/circular_argument_reference.rb +3 -14
  124. data/lib/rubocop/cop/lint/condition_position.rb +5 -1
  125. data/lib/rubocop/cop/lint/debugger.rb +18 -11
  126. data/lib/rubocop/cop/lint/def_end_alignment.rb +9 -14
  127. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
  128. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
  129. data/lib/rubocop/cop/lint/duplicate_methods.rb +75 -5
  130. data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
  131. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  132. data/lib/rubocop/cop/lint/else_layout.rb +3 -3
  133. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  134. data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
  135. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  136. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  137. data/lib/rubocop/cop/lint/end_alignment.rb +13 -14
  138. data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
  139. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  140. data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
  141. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +36 -41
  142. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  143. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  144. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +25 -20
  145. data/lib/rubocop/cop/lint/inherit_exception.rb +16 -19
  146. data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
  147. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +21 -7
  148. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  149. data/lib/rubocop/cop/lint/loop.rb +1 -1
  150. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  151. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  152. data/lib/rubocop/cop/lint/nested_method_definition.rb +6 -8
  153. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  154. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  155. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
  156. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -3
  157. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -22
  158. data/lib/rubocop/cop/lint/percent_symbol_array.rb +12 -12
  159. data/lib/rubocop/cop/lint/rand_one.rb +8 -2
  160. data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
  161. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  162. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  163. data/lib/rubocop/cop/lint/require_parentheses.rb +5 -3
  164. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  165. data/lib/rubocop/cop/lint/rescue_type.rb +18 -9
  166. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  167. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
  168. data/lib/rubocop/cop/lint/script_permission.rb +8 -1
  169. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  170. data/lib/rubocop/cop/lint/shadowed_exception.rb +37 -10
  171. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
  172. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +7 -7
  173. data/lib/rubocop/cop/lint/syntax.rb +23 -20
  174. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -1
  175. data/lib/rubocop/cop/lint/unified_integer.rb +5 -4
  176. data/lib/rubocop/cop/lint/unneeded_disable.rb +41 -16
  177. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
  178. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +45 -19
  179. data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
  180. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  181. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
  182. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  183. data/lib/rubocop/cop/lint/useless_access_modifier.rb +12 -16
  184. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  185. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  186. data/lib/rubocop/cop/lint/useless_setter_call.rb +15 -12
  187. data/lib/rubocop/cop/lint/void.rb +38 -27
  188. data/lib/rubocop/cop/message_annotator.rb +4 -2
  189. data/lib/rubocop/cop/metrics/abc_size.rb +2 -2
  190. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  191. data/lib/rubocop/cop/metrics/class_length.rb +3 -1
  192. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  193. data/lib/rubocop/cop/metrics/line_length.rb +8 -5
  194. data/lib/rubocop/cop/metrics/method_length.rb +8 -3
  195. data/lib/rubocop/cop/metrics/module_length.rb +3 -1
  196. data/lib/rubocop/cop/metrics/parameter_lists.rb +14 -5
  197. data/lib/rubocop/cop/metrics/perceived_complexity.rb +2 -1
  198. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +3 -2
  199. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +2 -2
  200. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  201. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
  202. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  203. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  204. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +14 -7
  205. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  206. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +8 -4
  207. data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -3
  208. data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
  209. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  210. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -7
  211. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +74 -33
  212. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +34 -8
  213. data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -1
  214. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +67 -0
  215. data/lib/rubocop/cop/mixin/parentheses.rb +12 -0
  216. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -1
  217. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  218. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +9 -8
  219. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +11 -10
  220. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -17
  221. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  222. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  223. data/lib/rubocop/cop/mixin/surrounding_space.rb +95 -8
  224. data/lib/rubocop/cop/mixin/too_many_lines.rb +2 -2
  225. data/lib/rubocop/cop/mixin/trailing_comma.rb +25 -17
  226. data/lib/rubocop/cop/mixin/unused_argument.rb +6 -2
  227. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  228. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +35 -2
  229. data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +7 -6
  230. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  231. data/lib/rubocop/cop/naming/constant_name.rb +58 -0
  232. data/lib/rubocop/cop/{style → naming}/file_name.rb +28 -13
  233. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  234. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
  235. data/lib/rubocop/cop/naming/method_name.rb +40 -0
  236. data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
  237. data/lib/rubocop/cop/naming/variable_name.rb +50 -0
  238. data/lib/rubocop/cop/{style → naming}/variable_number.rb +11 -28
  239. data/lib/rubocop/cop/offense.rb +6 -1
  240. data/lib/rubocop/cop/performance/caller.rb +39 -11
  241. data/lib/rubocop/cop/performance/case_when_splat.rb +3 -7
  242. data/lib/rubocop/cop/performance/casecmp.rb +9 -8
  243. data/lib/rubocop/cop/performance/compare_with_block.rb +23 -13
  244. data/lib/rubocop/cop/performance/count.rb +7 -4
  245. data/lib/rubocop/cop/performance/detect.rb +9 -6
  246. data/lib/rubocop/cop/performance/double_start_end_with.rb +12 -20
  247. data/lib/rubocop/cop/performance/end_with.rb +6 -6
  248. data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
  249. data/lib/rubocop/cop/performance/flat_map.rb +5 -2
  250. data/lib/rubocop/cop/performance/hash_each_methods.rb +85 -40
  251. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +9 -6
  252. data/lib/rubocop/cop/performance/range_include.rb +3 -3
  253. data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -28
  254. data/lib/rubocop/cop/performance/redundant_match.rb +13 -12
  255. data/lib/rubocop/cop/performance/redundant_merge.rb +44 -26
  256. data/lib/rubocop/cop/performance/redundant_sort_by.rb +9 -6
  257. data/lib/rubocop/cop/performance/regexp_match.rb +19 -10
  258. data/lib/rubocop/cop/performance/reverse_each.rb +1 -1
  259. data/lib/rubocop/cop/performance/sample.rb +1 -1
  260. data/lib/rubocop/cop/performance/size.rb +3 -3
  261. data/lib/rubocop/cop/performance/start_with.rb +6 -6
  262. data/lib/rubocop/cop/performance/string_replacement.rb +6 -6
  263. data/lib/rubocop/cop/performance/times_map.rb +32 -22
  264. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  265. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  266. data/lib/rubocop/cop/rails/action_filter.rb +23 -1
  267. data/lib/rubocop/cop/rails/active_support_aliases.rb +4 -5
  268. data/lib/rubocop/cop/rails/application_job.rb +5 -3
  269. data/lib/rubocop/cop/rails/application_record.rb +5 -3
  270. data/lib/rubocop/cop/rails/blank.rb +20 -17
  271. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  272. data/lib/rubocop/cop/rails/date.rb +7 -6
  273. data/lib/rubocop/cop/rails/delegate.rb +53 -29
  274. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +4 -4
  275. data/lib/rubocop/cop/rails/dynamic_find_by.rb +2 -2
  276. data/lib/rubocop/cop/rails/enum_uniqueness.rb +4 -4
  277. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  278. data/lib/rubocop/cop/rails/exit.rb +8 -1
  279. data/lib/rubocop/cop/rails/file_path.rb +8 -11
  280. data/lib/rubocop/cop/rails/find_by.rb +2 -1
  281. data/lib/rubocop/cop/rails/find_each.rb +1 -1
  282. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +8 -1
  283. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +76 -0
  284. data/lib/rubocop/cop/rails/http_positional_arguments.rb +40 -44
  285. data/lib/rubocop/cop/rails/inverse_of.rb +96 -0
  286. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  287. data/lib/rubocop/cop/rails/not_null_column.rb +6 -6
  288. data/lib/rubocop/cop/rails/output.rb +11 -2
  289. data/lib/rubocop/cop/rails/output_safety.rb +16 -21
  290. data/lib/rubocop/cop/rails/pluralization_grammar.rb +10 -10
  291. data/lib/rubocop/cop/rails/presence.rb +105 -0
  292. data/lib/rubocop/cop/rails/present.rb +14 -17
  293. data/lib/rubocop/cop/rails/read_write_attribute.rb +13 -13
  294. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +91 -0
  295. data/lib/rubocop/cop/rails/relative_date_constant.rb +11 -11
  296. data/lib/rubocop/cop/rails/request_referer.rb +3 -3
  297. data/lib/rubocop/cop/rails/reversible_migration.rb +36 -35
  298. data/lib/rubocop/cop/rails/safe_navigation.rb +7 -8
  299. data/lib/rubocop/cop/rails/save_bang.rb +19 -17
  300. data/lib/rubocop/cop/rails/scope_args.rb +2 -2
  301. data/lib/rubocop/cop/rails/skips_model_validations.rb +2 -2
  302. data/lib/rubocop/cop/rails/time_zone.rb +3 -2
  303. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +4 -2
  304. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  305. data/lib/rubocop/cop/rails/validation.rb +8 -8
  306. data/lib/rubocop/cop/registry.rb +2 -1
  307. data/lib/rubocop/cop/security/eval.rb +4 -4
  308. data/lib/rubocop/cop/security/json_load.rb +7 -5
  309. data/lib/rubocop/cop/security/marshal_load.rb +8 -6
  310. data/lib/rubocop/cop/security/yaml_load.rb +4 -4
  311. data/lib/rubocop/cop/style/alias.rb +49 -27
  312. data/lib/rubocop/cop/style/and_or.rb +65 -45
  313. data/lib/rubocop/cop/style/array_join.rb +10 -1
  314. data/lib/rubocop/cop/style/ascii_comments.rb +24 -4
  315. data/lib/rubocop/cop/style/attr.rb +15 -5
  316. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +7 -5
  317. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -10
  318. data/lib/rubocop/cop/style/begin_block.rb +1 -1
  319. data/lib/rubocop/cop/style/block_comments.rb +17 -3
  320. data/lib/rubocop/cop/style/block_delimiters.rb +82 -16
  321. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +68 -32
  322. data/lib/rubocop/cop/style/case_equality.rb +13 -1
  323. data/lib/rubocop/cop/style/character_literal.rb +10 -0
  324. data/lib/rubocop/cop/style/class_and_module_children.rb +8 -4
  325. data/lib/rubocop/cop/style/class_check.rb +29 -10
  326. data/lib/rubocop/cop/style/class_methods.rb +10 -9
  327. data/lib/rubocop/cop/style/class_vars.rb +5 -4
  328. data/lib/rubocop/cop/style/collection_methods.rb +5 -3
  329. data/lib/rubocop/cop/style/colon_method_call.rb +18 -2
  330. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  331. data/lib/rubocop/cop/style/command_literal.rb +90 -30
  332. data/lib/rubocop/cop/style/comment_annotation.rb +39 -11
  333. data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
  334. data/lib/rubocop/cop/style/conditional_assignment.rb +41 -41
  335. data/lib/rubocop/cop/style/copyright.rb +27 -28
  336. data/lib/rubocop/cop/style/date_time.rb +44 -0
  337. data/lib/rubocop/cop/style/def_with_parentheses.rb +31 -5
  338. data/lib/rubocop/cop/style/dir.rb +48 -0
  339. data/lib/rubocop/cop/style/documentation.rb +17 -2
  340. data/lib/rubocop/cop/style/documentation_method.rb +2 -6
  341. data/lib/rubocop/cop/style/double_negation.rb +1 -1
  342. data/lib/rubocop/cop/style/each_for_simple_loop.rb +8 -8
  343. data/lib/rubocop/cop/style/each_with_object.rb +6 -5
  344. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  345. data/lib/rubocop/cop/style/empty_case_condition.rb +3 -3
  346. data/lib/rubocop/cop/style/empty_else.rb +55 -24
  347. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  348. data/lib/rubocop/cop/style/empty_literal.rb +25 -14
  349. data/lib/rubocop/cop/style/empty_method.rb +29 -25
  350. data/lib/rubocop/cop/style/encoding.rb +8 -51
  351. data/lib/rubocop/cop/style/end_block.rb +1 -1
  352. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  353. data/lib/rubocop/cop/style/even_odd.rb +4 -2
  354. data/lib/rubocop/cop/style/extend_self.rb +92 -0
  355. data/lib/rubocop/cop/style/flip_flop.rb +13 -2
  356. data/lib/rubocop/cop/style/for.rb +6 -2
  357. data/lib/rubocop/cop/style/format_string.rb +33 -5
  358. data/lib/rubocop/cop/style/format_string_token.rb +17 -15
  359. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +7 -6
  360. data/lib/rubocop/cop/style/global_vars.rb +12 -2
  361. data/lib/rubocop/cop/style/guard_clause.rb +6 -4
  362. data/lib/rubocop/cop/style/hash_syntax.rb +56 -56
  363. data/lib/rubocop/cop/style/identical_conditional_branches.rb +12 -8
  364. data/lib/rubocop/cop/style/if_inside_else.rb +11 -11
  365. data/lib/rubocop/cop/style/if_unless_modifier.rb +8 -7
  366. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -2
  367. data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -1
  368. data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -6
  369. data/lib/rubocop/cop/style/infinite_loop.rb +4 -4
  370. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  371. data/lib/rubocop/cop/style/inverse_methods.rb +24 -14
  372. data/lib/rubocop/cop/style/lambda.rb +45 -43
  373. data/lib/rubocop/cop/style/lambda_call.rb +37 -10
  374. data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -5
  375. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +3 -19
  376. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
  377. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +1 -1
  378. data/lib/rubocop/cop/style/method_def_parentheses.rb +20 -25
  379. data/lib/rubocop/cop/style/method_missing.rb +13 -26
  380. data/lib/rubocop/cop/style/min_max.rb +68 -0
  381. data/lib/rubocop/cop/style/missing_else.rb +20 -6
  382. data/lib/rubocop/cop/style/mixin_grouping.rb +31 -21
  383. data/lib/rubocop/cop/style/mixin_usage.rb +71 -0
  384. data/lib/rubocop/cop/style/module_function.rb +27 -11
  385. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  386. data/lib/rubocop/cop/style/multiline_if_modifier.rb +8 -4
  387. data/lib/rubocop/cop/style/multiline_if_then.rb +15 -13
  388. data/lib/rubocop/cop/style/multiline_memoization.rb +33 -17
  389. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
  390. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  391. data/lib/rubocop/cop/style/mutable_constant.rb +11 -15
  392. data/lib/rubocop/cop/style/negated_if.rb +27 -31
  393. data/lib/rubocop/cop/style/negated_while.rb +1 -5
  394. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  395. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +26 -23
  396. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  397. data/lib/rubocop/cop/style/next.rb +41 -12
  398. data/lib/rubocop/cop/style/nil_comparison.rb +8 -8
  399. data/lib/rubocop/cop/style/non_nil_check.rb +41 -38
  400. data/lib/rubocop/cop/style/not.rb +15 -5
  401. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +8 -4
  402. data/lib/rubocop/cop/style/numeric_literals.rb +9 -9
  403. data/lib/rubocop/cop/style/numeric_predicate.rb +21 -21
  404. data/lib/rubocop/cop/style/one_line_conditional.rb +9 -4
  405. data/lib/rubocop/cop/style/option_hash.rb +11 -25
  406. data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
  407. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  408. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  409. data/lib/rubocop/cop/style/parentheses_around_condition.rb +30 -13
  410. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +25 -4
  411. data/lib/rubocop/cop/style/percent_q_literals.rb +29 -8
  412. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -1
  413. data/lib/rubocop/cop/style/preferred_hash_methods.rb +7 -11
  414. data/lib/rubocop/cop/style/proc.rb +10 -2
  415. data/lib/rubocop/cop/style/raise_args.rb +22 -29
  416. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  417. data/lib/rubocop/cop/style/redundant_begin.rb +16 -5
  418. data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
  419. data/lib/rubocop/cop/style/redundant_exception.rb +4 -4
  420. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  421. data/lib/rubocop/cop/style/redundant_parentheses.rb +14 -12
  422. data/lib/rubocop/cop/style/redundant_return.rb +28 -15
  423. data/lib/rubocop/cop/style/redundant_self.rb +35 -27
  424. data/lib/rubocop/cop/style/regexp_literal.rb +88 -27
  425. data/lib/rubocop/cop/style/rescue_modifier.rb +12 -1
  426. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  427. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  428. data/lib/rubocop/cop/style/safe_navigation.rb +100 -48
  429. data/lib/rubocop/cop/style/self_assignment.rb +13 -13
  430. data/lib/rubocop/cop/style/semicolon.rb +19 -9
  431. data/lib/rubocop/cop/style/send.rb +10 -1
  432. data/lib/rubocop/cop/style/signal_exception.rb +104 -3
  433. data/lib/rubocop/cop/style/single_line_block_params.rb +16 -15
  434. data/lib/rubocop/cop/style/single_line_methods.rb +26 -18
  435. data/lib/rubocop/cop/style/special_global_vars.rb +19 -14
  436. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +23 -50
  437. data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
  438. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  439. data/lib/rubocop/cop/style/string_literals.rb +26 -3
  440. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +16 -1
  441. data/lib/rubocop/cop/style/string_methods.rb +19 -8
  442. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  443. data/lib/rubocop/cop/style/symbol_array.rb +7 -35
  444. data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
  445. data/lib/rubocop/cop/style/symbol_proc.rb +11 -25
  446. data/lib/rubocop/cop/style/ternary_parentheses.rb +46 -51
  447. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  448. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +20 -6
  449. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +22 -7
  450. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  451. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +70 -24
  452. data/lib/rubocop/cop/style/trivial_accessors.rb +72 -65
  453. data/lib/rubocop/cop/style/unless_else.rb +16 -1
  454. data/lib/rubocop/cop/style/unneeded_capital_w.rb +18 -8
  455. data/lib/rubocop/cop/style/unneeded_interpolation.rb +15 -19
  456. data/lib/rubocop/cop/style/unneeded_percent_q.rb +14 -13
  457. data/lib/rubocop/cop/style/variable_interpolation.rb +23 -9
  458. data/lib/rubocop/cop/style/when_then.rb +14 -1
  459. data/lib/rubocop/cop/style/while_until_do.rb +27 -4
  460. data/lib/rubocop/cop/style/while_until_modifier.rb +26 -6
  461. data/lib/rubocop/cop/style/word_array.rb +9 -30
  462. data/lib/rubocop/cop/style/yoda_condition.rb +51 -22
  463. data/lib/rubocop/cop/style/zero_length_predicate.rb +44 -29
  464. data/lib/rubocop/cop/team.rb +16 -8
  465. data/lib/rubocop/cop/util.rb +43 -34
  466. data/lib/rubocop/cop/variable_force.rb +1 -1
  467. data/lib/rubocop/cop/variable_force/assignment.rb +4 -2
  468. data/lib/rubocop/cop/variable_force/scope.rb +1 -5
  469. data/lib/rubocop/cop/variable_force/variable.rb +1 -1
  470. data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -4
  471. data/lib/rubocop/formatter/formatter_set.rb +3 -1
  472. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  473. data/lib/rubocop/formatter/json_formatter.rb +9 -3
  474. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
  475. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  476. data/lib/rubocop/formatter/simple_text_formatter.rb +3 -3
  477. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  478. data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
  479. data/lib/rubocop/node_pattern.rb +46 -29
  480. data/lib/rubocop/options.rb +13 -8
  481. data/lib/rubocop/path_util.rb +15 -3
  482. data/lib/rubocop/processed_source.rb +8 -9
  483. data/lib/rubocop/rake_task.rb +16 -23
  484. data/lib/rubocop/remote_config.rb +13 -1
  485. data/lib/rubocop/result_cache.rb +1 -0
  486. data/lib/rubocop/rspec/cop_helper.rb +10 -10
  487. data/lib/rubocop/rspec/expect_offense.rb +6 -8
  488. data/lib/rubocop/rspec/shared_contexts.rb +4 -8
  489. data/lib/rubocop/rspec/shared_examples.rb +8 -8
  490. data/lib/rubocop/rspec/support.rb +5 -5
  491. data/lib/rubocop/runner.rb +1 -1
  492. data/lib/rubocop/string_util.rb +2 -0
  493. data/lib/rubocop/token.rb +74 -0
  494. data/lib/rubocop/version.rb +1 -1
  495. metadata +118 -48
  496. data/lib/rubocop/cop/layout/space_inside_brackets.rb +0 -20
  497. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -41
  498. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
  499. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
  500. data/lib/rubocop/cop/mixin/space_inside.rb +0 -76
  501. data/lib/rubocop/cop/style/accessor_method_name.rb +0 -45
  502. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -29
  503. data/lib/rubocop/cop/style/constant_name.rb +0 -29
  504. data/lib/rubocop/cop/style/method_name.rb +0 -34
  505. data/lib/rubocop/cop/style/predicate_name.rb +0 -67
  506. data/lib/rubocop/cop/style/variable_name.rb +0 -39
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `str`, `dstr` and `xstr` nodes. This will be used
6
+ # in place of a plain node when the builder constructs the AST, making
7
+ # its methods available to all `str` nodes within RuboCop.
8
+ class StrNode < Node
9
+ def heredoc?
10
+ loc.is_a?(Parser::Source::Map::Heredoc)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -7,35 +7,14 @@ module RuboCop
7
7
  # methods available to all `super`- and `zsuper` nodes within RuboCop.
8
8
  class SuperNode < Node
9
9
  include ParameterizedNode
10
-
11
- # The method name of this `super` node. Always `:super`.
12
- #
13
- # @return [Symbol] the method name of `super`
14
- def method_name
15
- :super
16
- end
17
-
18
- # An array containing the arguments of the super invocation.
19
- #
20
- # @return [Array<Node>] the arguments of the super invocation
21
- def arguments
22
- node_parts
23
- end
24
-
25
- # Checks whether the method name matches the argument.
26
- #
27
- # @param [Symbol, String] name the method name to check for
28
- # @return [Boolean] whether the method name matches the argument
29
- def method?(name)
30
- method_name == name.to_sym
31
- end
10
+ include MethodDispatchNode
32
11
 
33
12
  # Custom destructuring method. This can be used to normalize
34
13
  # destructuring for different variations of the node.
35
14
  #
36
- # @return [Array] the different parts of the `block` node
15
+ # @return [Array] the different parts of the `super` node
37
16
  def node_parts
38
- to_a
17
+ [nil, :super, *to_a]
39
18
  end
40
19
  end
41
20
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `sym` nodes. This will be used in place of a
6
+ # plain node when the builder constructs the AST, making its methods
7
+ # available to all `sym` nodes within RuboCop.
8
+ class SymbolNode < Node
9
+ include BasicLiteralNode
10
+
11
+ # Custom destructuring method. This can be used to normalize
12
+ # destructuring for different variations of the node.
13
+ #
14
+ # @return [Array] the different parts of the `sym` node
15
+ def node_parts
16
+ to_a
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `yield` nodes. This will be used in place of a plain
6
+ # node when the builder constructs the AST, making its methods available
7
+ # to all `yield` nodes within RuboCop.
8
+ class YieldNode < Node
9
+ include ParameterizedNode
10
+ include MethodDispatchNode
11
+
12
+ # Custom destructuring method. This can be used to normalize
13
+ # destructuring for different variations of the node.
14
+ #
15
+ # @return [Array] the different parts of the `send` node
16
+ def node_parts
17
+ [nil, :yield, *to_a]
18
+ end
19
+ end
20
+ end
21
+ end
@@ -30,37 +30,37 @@ module RuboCop
30
30
  kwoptarg].freeze
31
31
 
32
32
  NO_CHILD_NODES.each do |type|
33
- module_eval("def on_#{type}(node); end")
33
+ module_eval("def on_#{type}(node); end", __FILE__, __LINE__)
34
34
  end
35
35
 
36
36
  ONE_CHILD_NODE.each do |type|
37
- module_eval(<<-END)
37
+ module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
38
38
  def on_#{type}(node)
39
39
  if (child = node.children[0])
40
40
  send(:"on_\#{child.type}", child)
41
41
  end
42
42
  end
43
- END
43
+ RUBY
44
44
  end
45
45
 
46
46
  MANY_CHILD_NODES.each do |type|
47
- module_eval(<<-END)
47
+ module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
48
48
  def on_#{type}(node)
49
49
  node.children.each { |child| send(:"on_\#{child.type}", child) }
50
50
  nil
51
51
  end
52
- END
52
+ RUBY
53
53
  end
54
54
 
55
55
  SECOND_CHILD_ONLY.each do |type|
56
56
  # Guard clause is for nodes nested within mlhs
57
- module_eval(<<-END)
57
+ module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
58
58
  def on_#{type}(node)
59
59
  if (child = node.children[1])
60
60
  send(:"on_\#{child.type}", child)
61
61
  end
62
62
  end
63
- END
63
+ RUBY
64
64
  end
65
65
 
66
66
  def on_const(node)
@@ -38,12 +38,7 @@ module RuboCop
38
38
  def message(offense)
39
39
  # JSON.dump will fail if the offense message contains text which is not
40
40
  # valid UTF-8
41
- message = offense.message
42
- if message.respond_to?(:scrub)
43
- message.scrub
44
- else
45
- message.chars.select(&:valid_encoding?).join
46
- end
41
+ offense.message.scrub
47
42
  end
48
43
 
49
44
  # Restore an offense object loaded from a JSON file.
@@ -15,25 +15,28 @@ module RuboCop
15
15
  @config_store = ConfigStore.new
16
16
  end
17
17
 
18
+ # @api public
19
+ #
18
20
  # Entry point for the application logic. Here we
19
21
  # do the command line arguments processing and inspect
20
- # the target files
22
+ # the target files.
23
+ #
24
+ # @param args [Array<String>] command line arguments
21
25
  # @return [Integer] UNIX exit code
22
26
  def run(args = ARGV)
23
27
  @options, paths = Options.new.parse(args)
24
28
  validate_options_vs_config
25
29
  act_on_options
26
30
  apply_default_formatter
27
-
28
- execute_runner(paths)
31
+ execute_runners(paths)
29
32
  rescue RuboCop::Error => e
30
- $stderr.puts Rainbow("Error: #{e.message}").red
33
+ warn Rainbow("Error: #{e.message}").red
31
34
  return 2
32
35
  rescue Finished
33
36
  return 0
34
- rescue StandardError, SyntaxError => e
35
- $stderr.puts e.message
36
- $stderr.puts e.backtrace
37
+ rescue StandardError, SyntaxError, LoadError => e
38
+ warn e.message
39
+ warn e.backtrace
37
40
  return 2
38
41
  end
39
42
 
@@ -41,13 +44,55 @@ module RuboCop
41
44
  Signal.trap('INT') do
42
45
  exit!(1) if runner.aborting?
43
46
  runner.abort
44
- $stderr.puts
45
- $stderr.puts 'Exiting... Interrupt again to exit immediately.'
47
+ warn
48
+ warn 'Exiting... Interrupt again to exit immediately.'
46
49
  end
47
50
  end
48
51
 
49
52
  private
50
53
 
54
+ def execute_runners(paths)
55
+ if @options[:auto_gen_config]
56
+ reset_config_and_auto_gen_file
57
+ line_length_contents = run_line_length_cop_auto_gen_config(paths)
58
+ run_all_cops_auto_gen_config(line_length_contents, paths)
59
+ else
60
+ execute_runner(paths)
61
+ end
62
+ end
63
+
64
+ # Do an initial run with only Metrics/LineLength so that cops that depend
65
+ # on Metrics/LineLength:Max get the correct value for that parameter.
66
+ def run_line_length_cop_auto_gen_config(paths)
67
+ puts Rainbow('Phase 1 of 2: run Metrics/LineLength cop').yellow
68
+ @options[:only] = ['Metrics/LineLength']
69
+ execute_runner(paths)
70
+ @options.delete(:only)
71
+ @config_store = ConfigStore.new
72
+ # Save the todo configuration of the LineLength cop.
73
+ IO.read(ConfigLoader::AUTO_GENERATED_FILE)
74
+ .lines
75
+ .drop_while { |line| line.start_with?('#') }
76
+ .join
77
+ end
78
+
79
+ def run_all_cops_auto_gen_config(line_length_contents, paths)
80
+ puts Rainbow('Phase 2 of 2: run all cops').yellow
81
+ result = execute_runner(paths)
82
+ # This run was made with the current maximum length allowed, so append
83
+ # the saved setting for LineLength.
84
+ File.open(ConfigLoader::AUTO_GENERATED_FILE, 'a') do |f|
85
+ f.write(line_length_contents)
86
+ end
87
+ result
88
+ end
89
+
90
+ def reset_config_and_auto_gen_file
91
+ @config_store = ConfigStore.new
92
+ File.open(ConfigLoader::AUTO_GENERATED_FILE, 'w'){}
93
+ ConfigLoader.add_inheritance_from_auto_generated_file
94
+ end
95
+
51
96
  def validate_options_vs_config
52
97
  if @options[:parallel] &&
53
98
  !@config_store.for(Dir.pwd).for_all_cops['UseCache']
@@ -58,14 +103,15 @@ module RuboCop
58
103
  end
59
104
 
60
105
  def act_on_options
61
- handle_exiting_options
62
-
63
106
  ConfigLoader.debug = @options[:debug]
64
107
  ConfigLoader.auto_gen_config = @options[:auto_gen_config]
108
+ ConfigLoader.ignore_parent_exclusion = @options[:ignore_parent_exclusion]
65
109
 
66
110
  @config_store.options_config = @options[:config] if @options[:config]
67
111
  @config_store.force_default_config! if @options[:force_default_config]
68
112
 
113
+ handle_exiting_options
114
+
69
115
  if @options[:color]
70
116
  # color output explicitly forced on
71
117
  Rainbow.enabled = true
@@ -177,12 +223,12 @@ module RuboCop
177
223
 
178
224
  errors.each { |error| warn error }
179
225
 
180
- warn <<-END.strip_indent
226
+ warn <<-WARNING.strip_indent
181
227
  Errors are usually caused by RuboCop bugs.
182
228
  Please, report your problems to RuboCop's issue tracker.
183
229
  Mention the following information in the issue report:
184
230
  #{RuboCop::Version.version(true)}
185
- END
231
+ WARNING
186
232
  end
187
233
 
188
234
  def maybe_print_corrected_source
@@ -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,8 @@ 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 = [1.9, 2.0, 2.1, 2.2, 2.3, 2.4].freeze
20
+ KNOWN_RUBIES = [2.1, 2.2, 2.3, 2.4, 2.5].freeze
21
+ OBSOLETE_RUBIES = { 1.9 => '0.50', 2.0 => '0.50' }.freeze
21
22
  DEFAULT_RAILS_VERSION = 5.0
22
23
  OBSOLETE_COPS = {
23
24
  'Style/TrailingComma' =>
@@ -26,9 +27,15 @@ module RuboCop
26
27
  '`Style/TrailingCommaInArguments` instead.',
27
28
  'Rails/DefaultScope' =>
28
29
  'The `Rails/DefaultScope` cop no longer exists.',
30
+ 'Lint/InvalidCharacterLiteral' =>
31
+ 'The `Lint/InvalidCharacterLiteral` cop has been removed since it ' \
32
+ 'was never being actually triggered.',
29
33
  'Style/SingleSpaceBeforeFirstArg' =>
30
34
  'The `Style/SingleSpaceBeforeFirstArg` cop has been renamed to ' \
31
35
  '`Layout/SpaceBeforeFirstArg`.',
36
+ 'Lint/RescueWithoutErrorClass' =>
37
+ 'The `Lint/RescueWithoutErrorClass` cop has been replaced by ' \
38
+ '`Style/RescueStandardError`.',
32
39
  'Lint/SpaceBeforeFirstArg' =>
33
40
  'The `Lint/SpaceBeforeFirstArg` cop has been removed, since it was a ' \
34
41
  'duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
@@ -52,7 +59,36 @@ module RuboCop
52
59
  'The `Lint/Eval` cop has been renamed to `Security/Eval`.',
53
60
  'Style/DeprecatedHashMethods' =>
54
61
  'The `Style/DeprecatedHashMethods` cop has been renamed to ' \
55
- '`Style/PreferredHashMethods`.'
62
+ '`Style/PreferredHashMethods`.',
63
+ 'Style/AccessorMethodName' =>
64
+ 'The `Style/AccessorMethodName` cop has been moved to ' \
65
+ '`Naming/AccessorMethodName`.',
66
+ 'Style/AsciiIdentifiers' =>
67
+ 'The `Style/AsciiIdentifiers` cop has been moved to ' \
68
+ '`Naming/AccessorMethodName`.',
69
+ 'Style/OpMethod' =>
70
+ 'The `Style/OpMethod` cop has been renamed and moved to ' \
71
+ '`Naming/BinaryOperatorParameterName`.',
72
+ 'Style/ClassAndModuleCamelCase' =>
73
+ 'The `Style/ClassAndModuleCamelCase` cop has been renamed to ' \
74
+ '`Naming/ClassAndModuleCamelCase`.',
75
+ 'Style/ConstantName' =>
76
+ 'The `Style/ConstantName` cop has been renamed to ' \
77
+ '`Naming/ConstantName`.',
78
+ 'Style/FileName' =>
79
+ 'The `Style/FileName` cop has been renamed to `Naming/FileName`.',
80
+ 'Style/MethodName' =>
81
+ 'The `Style/MethodName` cop has been renamed to ' \
82
+ '`Naming/MethodName`.',
83
+ 'Style/PredicateName' =>
84
+ 'The `Style/PredicateName` cop has been renamed to ' \
85
+ '`Naming/PredicateName`.',
86
+ 'Style/VariableName' =>
87
+ 'The `Style/VariableName` cop has been renamed to ' \
88
+ '`Naming/VariableName`.',
89
+ 'Style/VariableNumber' =>
90
+ 'The `Style/VariableNumber` cop has been renamed to ' \
91
+ '`Naming/VariableNumber`.'
56
92
  }.freeze
57
93
 
58
94
  OBSOLETE_PARAMETERS = [
@@ -63,6 +99,31 @@ module RuboCop
63
99
  'for alignment, please use AllowForAlignment: ' \
64
100
  'true instead.'
65
101
  },
102
+ {
103
+ cop: 'Style/Encoding',
104
+ parameter: 'EnforcedStyle',
105
+ alternative: 'Style/Encoding no longer supports styles. ' \
106
+ 'The "never" behavior is always assumed.'
107
+ },
108
+ {
109
+ cop: 'Style/Encoding',
110
+ parameter: 'SupportedStyles',
111
+ alternative: 'Style/Encoding no longer supports styles. ' \
112
+ 'The "never" behavior is always assumed.'
113
+ },
114
+ {
115
+ cop: 'Style/Encoding',
116
+ parameter: 'AutoCorrectEncodingComment',
117
+ alternative: 'Style/Encoding no longer supports styles. ' \
118
+ 'The "never" behavior is always assumed.'
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
+ },
66
127
  {
67
128
  cop: 'Style/SpaceAroundOperators',
68
129
  parameter: 'MultiSpaceAllowedForOperators',
@@ -70,6 +131,13 @@ module RuboCop
70
131
  'for alignment, please use AllowForAlignment: ' \
71
132
  'true instead.'
72
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
+ },
73
141
  {
74
142
  cop: 'AllCops',
75
143
  parameter: 'RunRailsCops',
@@ -121,6 +189,19 @@ module RuboCop
121
189
  @hash = hash
122
190
  end
123
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
+
124
205
  def [](key)
125
206
  @hash[key]
126
207
  end
@@ -145,6 +226,10 @@ module RuboCop
145
226
  @hash.keys
146
227
  end
147
228
 
229
+ def each_key(&block)
230
+ @hash.each_key(&block)
231
+ end
232
+
148
233
  def map(&block)
149
234
  @hash.map(&block)
150
235
  end
@@ -166,7 +251,7 @@ module RuboCop
166
251
  end
167
252
 
168
253
  def make_excludes_absolute
169
- each do |key, _|
254
+ each_key do |key|
170
255
  validate_section_presence(key)
171
256
  next unless self[key]['Exclude']
172
257
 
@@ -227,6 +312,7 @@ module RuboCop
227
312
  check_target_ruby
228
313
  validate_parameter_names(valid_cop_names)
229
314
  validate_enforced_styles(valid_cop_names)
315
+ validate_syntax_cop
230
316
  reject_mutually_exclusive_defaults
231
317
  end
232
318
 
@@ -317,23 +403,30 @@ module RuboCop
317
403
 
318
404
  def warn_about_unrecognized_cops(invalid_cop_names)
319
405
  invalid_cop_names.each do |name|
320
- if name == 'Syntax'
321
- raise ValidationError,
322
- "configuration for Syntax cop found in #{loaded_path}\n" \
323
- 'This cop cannot be configured.'
324
- end
325
-
326
406
  # There could be a custom cop with this name. If so, don't warn
327
407
  next if Cop::Cop.registry.contains_cop_matching?([name])
328
408
 
329
409
  warn Rainbow("Warning: unrecognized cop #{name} found in " \
330
- "#{loaded_path}").yellow
410
+ "#{smart_loaded_path}").yellow
331
411
  end
332
412
  end
333
413
 
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
420
+
421
+ raise ValidationError,
422
+ "configuration for Syntax cop found in #{smart_loaded_path}\n" \
423
+ 'It\'s not possible to disable this cop.'
424
+ end
425
+
334
426
  def validate_section_presence(name)
335
427
  return unless key?(name) && self[name].nil?
336
- raise ValidationError, "empty section #{name} found in #{loaded_path}"
428
+ raise ValidationError,
429
+ "empty section #{name} found in #{smart_loaded_path}"
337
430
  end
338
431
 
339
432
  def validate_parameter_names(valid_cop_names)
@@ -344,7 +437,7 @@ module RuboCop
344
437
  ConfigLoader.default_configuration[name].key?(param)
345
438
 
346
439
  warn Rainbow("Warning: unrecognized parameter #{name}:#{param} " \
347
- "found in #{loaded_path}").yellow
440
+ "found in #{smart_loaded_path}").yellow
348
441
  end
349
442
  end
350
443
  end
@@ -360,7 +453,7 @@ module RuboCop
360
453
  next if valid.include?(style)
361
454
 
362
455
  msg = "invalid #{style_name} '#{style}' for #{name} found in " \
363
- "#{loaded_path}\n" \
456
+ "#{smart_loaded_path}\n" \
364
457
  "Valid choices are: #{valid.join(', ')}"
365
458
  raise ValidationError, msg
366
459
  end
@@ -388,36 +481,45 @@ module RuboCop
388
481
  return unless self[cop] && self[cop].key?(parameter)
389
482
 
390
483
  "obsolete parameter #{parameter} (for #{cop}) " \
391
- "found in #{loaded_path}" \
484
+ "found in #{smart_loaded_path}" \
392
485
  "\n#{alternative}"
393
486
  end
394
487
 
395
488
  def obsolete_cops
396
489
  OBSOLETE_COPS.map do |cop_name, message|
397
490
  next unless key?(cop_name) || key?(Cop::Badge.parse(cop_name).cop_name)
398
- message + "\n(obsolete configuration found in #{loaded_path}, please" \
399
- ' update it)'
491
+ message + "\n(obsolete configuration found in #{smart_loaded_path}," \
492
+ ' please update it)'
400
493
  end
401
494
  end
402
495
 
403
496
  def check_target_ruby
404
497
  return if KNOWN_RUBIES.include?(target_ruby_version)
405
498
 
406
- msg = "Unknown Ruby version #{target_ruby_version.inspect} found "
407
-
408
- msg +=
409
- case @target_ruby_version_source
410
- when :dot_ruby_version
411
- 'in `.ruby-version`.'
412
- when :rubocop_yml
413
- "in `TargetRubyVersion` parameter (in #{loaded_path})." \
414
- end
499
+ msg = if OBSOLETE_RUBIES.include?(target_ruby_version)
500
+ "Unsupported Ruby version #{target_ruby_version} found in " \
501
+ "#{target_ruby_source}. #{target_ruby_version}-compatible " \
502
+ 'analysis was dropped after version ' \
503
+ "#{OBSOLETE_RUBIES[target_ruby_version]}."
504
+ else
505
+ "Unknown Ruby version #{target_ruby_version.inspect} found in " \
506
+ "#{target_ruby_source}."
507
+ end
415
508
 
416
- msg += "\nKnown versions: #{KNOWN_RUBIES.join(', ')}"
509
+ msg += "\nSupported versions: #{KNOWN_RUBIES.join(', ')}"
417
510
 
418
511
  raise ValidationError, msg
419
512
  end
420
513
 
514
+ def target_ruby_source
515
+ case @target_ruby_version_source
516
+ when :dot_ruby_version
517
+ '`.ruby-version`'
518
+ when :rubocop_yml
519
+ "`TargetRubyVersion` parameter (in #{smart_loaded_path})"
520
+ end
521
+ end
522
+
421
523
  def reject_mutually_exclusive_defaults
422
524
  disabled_by_default = for_all_cops['DisabledByDefault']
423
525
  enabled_by_default = for_all_cops['EnabledByDefault']
@@ -433,12 +535,17 @@ module RuboCop
433
535
 
434
536
  unless department
435
537
  department_options = self[cop_department]
436
- if department_options && department_options.fetch('Enabled') == false
538
+ if department_options && department_options['Enabled'] == false
437
539
  return false
438
540
  end
439
541
  end
440
542
 
441
543
  cop_options.fetch('Enabled', true)
442
544
  end
545
+
546
+ def smart_loaded_path
547
+ PathUtil.smart_path(@loaded_path)
548
+ end
443
549
  end
550
+ # rubocop:enable Metrics/ClassLength
444
551
  end