rubocop 0.70.0 → 0.75.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 (274) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -10
  3. data/bin/console +1 -0
  4. data/config/default.yml +91 -494
  5. data/lib/rubocop.rb +16 -54
  6. data/lib/rubocop/ast/builder.rb +2 -0
  7. data/lib/rubocop/ast/node.rb +9 -15
  8. data/lib/rubocop/ast/node/float_node.rb +12 -0
  9. data/lib/rubocop/ast/node/int_node.rb +12 -0
  10. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +4 -4
  11. data/lib/rubocop/ast/node/mixin/numeric_node.rb +21 -0
  12. data/lib/rubocop/ast/node/resbody_node.rb +1 -6
  13. data/lib/rubocop/ast/traversal.rb +3 -3
  14. data/lib/rubocop/cached_data.rb +1 -1
  15. data/lib/rubocop/comment_config.rb +3 -2
  16. data/lib/rubocop/config.rb +21 -508
  17. data/lib/rubocop/config_loader.rb +22 -4
  18. data/lib/rubocop/config_loader_resolver.rb +2 -8
  19. data/lib/rubocop/config_obsoletion.rb +213 -0
  20. data/lib/rubocop/config_validator.rb +239 -0
  21. data/lib/rubocop/cop/autocorrect_logic.rb +71 -1
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  23. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  24. data/lib/rubocop/cop/commissioner.rb +3 -9
  25. data/lib/rubocop/cop/cop.rb +39 -12
  26. data/lib/rubocop/cop/corrector.rb +2 -3
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
  28. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  30. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
  31. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  34. data/lib/rubocop/cop/generator.rb +4 -4
  35. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  36. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -2
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -2
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -2
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
  44. data/lib/rubocop/cop/layout/class_structure.rb +2 -2
  45. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +3 -1
  47. data/lib/rubocop/cop/layout/extra_spacing.rb +14 -59
  48. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -0
  49. data/lib/rubocop/cop/layout/indent_assignment.rb +9 -1
  50. data/lib/rubocop/cop/layout/indent_first_argument.rb +7 -3
  51. data/lib/rubocop/cop/layout/indent_first_parameter.rb +7 -3
  52. data/lib/rubocop/cop/layout/indent_heredoc.rb +4 -4
  53. data/lib/rubocop/cop/layout/indentation_consistency.rb +13 -12
  54. data/lib/rubocop/cop/layout/indentation_width.rb +28 -10
  55. data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -0
  56. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  57. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +2 -0
  58. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -4
  59. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  60. data/lib/rubocop/cop/layout/space_around_operators.rb +42 -23
  61. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -1
  62. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +21 -2
  63. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
  64. data/lib/rubocop/cop/layout/tab.rb +10 -22
  65. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  66. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -1
  67. data/lib/rubocop/cop/lint/debugger.rb +4 -6
  68. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
  69. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  70. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
  71. data/lib/rubocop/cop/lint/erb_new_arguments.rb +57 -1
  72. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -37
  73. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  74. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  75. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
  76. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  77. data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
  78. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  79. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  80. data/lib/rubocop/cop/lint/number_conversion.rb +4 -4
  81. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  82. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  83. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  84. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -5
  85. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  86. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  87. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  88. data/lib/rubocop/cop/lint/unified_integer.rb +1 -1
  89. data/lib/rubocop/cop/lint/unneeded_cop_disable_directive.rb +1 -1
  90. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -1
  91. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +7 -2
  92. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  93. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  94. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -2
  95. data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -6
  96. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  97. data/lib/rubocop/cop/message_annotator.rb +16 -7
  98. data/lib/rubocop/cop/metrics/class_length.rb +1 -1
  99. data/lib/rubocop/cop/metrics/line_length.rb +6 -0
  100. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  101. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  102. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  103. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  104. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  105. data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
  106. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -1
  107. data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -4
  108. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  109. data/lib/rubocop/cop/mixin/hash_alignment.rb +4 -0
  110. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  111. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  112. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -3
  113. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
  114. data/lib/rubocop/cop/mixin/safe_mode.rb +2 -0
  115. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
  116. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  117. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  118. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  119. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  120. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +20 -22
  121. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  122. data/lib/rubocop/cop/offense.rb +18 -7
  123. data/lib/rubocop/cop/registry.rb +22 -1
  124. data/lib/rubocop/cop/security/eval.rb +1 -1
  125. data/lib/rubocop/cop/security/json_load.rb +1 -1
  126. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  127. data/lib/rubocop/cop/security/open.rb +1 -1
  128. data/lib/rubocop/cop/security/yaml_load.rb +1 -1
  129. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  130. data/lib/rubocop/cop/style/alias.rb +1 -1
  131. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  132. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +29 -10
  133. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  134. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  135. data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
  136. data/lib/rubocop/cop/style/conditional_assignment.rb +8 -9
  137. data/lib/rubocop/cop/style/constant_visibility.rb +14 -3
  138. data/lib/rubocop/cop/style/date_time.rb +3 -3
  139. data/lib/rubocop/cop/style/dir.rb +1 -1
  140. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  141. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  142. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  143. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  144. data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
  145. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  146. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  147. data/lib/rubocop/cop/style/float_division.rb +94 -0
  148. data/lib/rubocop/cop/style/format_string.rb +13 -9
  149. data/lib/rubocop/cop/style/format_string_token.rb +10 -40
  150. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +18 -33
  151. data/lib/rubocop/cop/style/guard_clause.rb +39 -10
  152. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  153. data/lib/rubocop/cop/style/if_inside_else.rb +42 -0
  154. data/lib/rubocop/cop/style/if_unless_modifier.rb +51 -15
  155. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  156. data/lib/rubocop/cop/style/inverse_methods.rb +2 -2
  157. data/lib/rubocop/cop/style/lambda.rb +0 -2
  158. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +12 -6
  159. data/lib/rubocop/cop/style/min_max.rb +1 -1
  160. data/lib/rubocop/cop/style/mixin_usage.rb +12 -2
  161. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  162. data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
  163. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  164. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  165. data/lib/rubocop/cop/style/nested_modifier.rb +18 -2
  166. data/lib/rubocop/cop/style/numeric_predicate.rb +3 -3
  167. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  168. data/lib/rubocop/cop/style/or_assignment.rb +8 -3
  169. data/lib/rubocop/cop/style/parentheses_around_condition.rb +15 -1
  170. data/lib/rubocop/cop/style/random_with_offset.rb +6 -6
  171. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -2
  172. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  173. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  174. data/lib/rubocop/cop/style/redundant_parentheses.rb +15 -6
  175. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  176. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
  177. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  178. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  179. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  180. data/lib/rubocop/cop/style/safe_navigation.rb +11 -2
  181. data/lib/rubocop/cop/style/sample.rb +1 -1
  182. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  183. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  184. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -2
  185. data/lib/rubocop/cop/style/strip.rb +1 -1
  186. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  187. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  188. data/lib/rubocop/cop/style/ternary_parentheses.rb +32 -3
  189. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -0
  190. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
  191. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  192. data/lib/rubocop/cop/style/unneeded_sort.rb +1 -1
  193. data/lib/rubocop/cop/style/unpack_first.rb +1 -1
  194. data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
  195. data/lib/rubocop/cop/style/word_array.rb +2 -2
  196. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -6
  197. data/lib/rubocop/cop/team.rb +15 -14
  198. data/lib/rubocop/cop/utils/format_string.rb +128 -0
  199. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  200. data/lib/rubocop/core_ext/string.rb +0 -24
  201. data/lib/rubocop/error.rb +23 -0
  202. data/lib/rubocop/formatter/emacs_style_formatter.rb +8 -5
  203. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  204. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  205. data/lib/rubocop/formatter/simple_text_formatter.rb +9 -1
  206. data/lib/rubocop/formatter/tap_formatter.rb +9 -1
  207. data/lib/rubocop/magic_comment.rb +4 -0
  208. data/lib/rubocop/node_pattern.rb +86 -7
  209. data/lib/rubocop/options.rb +18 -2
  210. data/lib/rubocop/path_util.rb +1 -1
  211. data/lib/rubocop/processed_source.rb +9 -1
  212. data/lib/rubocop/rspec/cop_helper.rb +0 -1
  213. data/lib/rubocop/rspec/expect_offense.rb +4 -1
  214. data/lib/rubocop/rspec/shared_contexts.rb +12 -17
  215. data/lib/rubocop/rspec/support.rb +0 -1
  216. data/lib/rubocop/runner.rb +20 -15
  217. data/lib/rubocop/target_finder.rb +6 -4
  218. data/lib/rubocop/version.rb +1 -1
  219. data/lib/rubocop/yaml_duplication_checker.rb +8 -2
  220. metadata +16 -70
  221. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
  222. data/lib/rubocop/cop/mixin/target_rails_version.rb +0 -16
  223. data/lib/rubocop/cop/rails/action_filter.rb +0 -117
  224. data/lib/rubocop/cop/rails/active_record_aliases.rb +0 -48
  225. data/lib/rubocop/cop/rails/active_record_override.rb +0 -82
  226. data/lib/rubocop/cop/rails/active_support_aliases.rb +0 -69
  227. data/lib/rubocop/cop/rails/application_job.rb +0 -40
  228. data/lib/rubocop/cop/rails/application_record.rb +0 -40
  229. data/lib/rubocop/cop/rails/assert_not.rb +0 -44
  230. data/lib/rubocop/cop/rails/belongs_to.rb +0 -102
  231. data/lib/rubocop/cop/rails/blank.rb +0 -164
  232. data/lib/rubocop/cop/rails/bulk_change_table.rb +0 -289
  233. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +0 -91
  234. data/lib/rubocop/cop/rails/date.rb +0 -161
  235. data/lib/rubocop/cop/rails/delegate.rb +0 -132
  236. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +0 -37
  237. data/lib/rubocop/cop/rails/dynamic_find_by.rb +0 -91
  238. data/lib/rubocop/cop/rails/enum_uniqueness.rb +0 -45
  239. data/lib/rubocop/cop/rails/environment_comparison.rb +0 -68
  240. data/lib/rubocop/cop/rails/exit.rb +0 -67
  241. data/lib/rubocop/cop/rails/file_path.rb +0 -108
  242. data/lib/rubocop/cop/rails/find_by.rb +0 -55
  243. data/lib/rubocop/cop/rails/find_each.rb +0 -51
  244. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +0 -25
  245. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +0 -106
  246. data/lib/rubocop/cop/rails/http_positional_arguments.rb +0 -117
  247. data/lib/rubocop/cop/rails/http_status.rb +0 -179
  248. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +0 -94
  249. data/lib/rubocop/cop/rails/inverse_of.rb +0 -246
  250. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +0 -175
  251. data/lib/rubocop/cop/rails/link_to_blank.rb +0 -98
  252. data/lib/rubocop/cop/rails/not_null_column.rb +0 -67
  253. data/lib/rubocop/cop/rails/output.rb +0 -49
  254. data/lib/rubocop/cop/rails/output_safety.rb +0 -99
  255. data/lib/rubocop/cop/rails/pluralization_grammar.rb +0 -107
  256. data/lib/rubocop/cop/rails/presence.rb +0 -124
  257. data/lib/rubocop/cop/rails/present.rb +0 -153
  258. data/lib/rubocop/cop/rails/read_write_attribute.rb +0 -74
  259. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +0 -111
  260. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +0 -136
  261. data/lib/rubocop/cop/rails/reflection_class_name.rb +0 -37
  262. data/lib/rubocop/cop/rails/refute_methods.rb +0 -76
  263. data/lib/rubocop/cop/rails/relative_date_constant.rb +0 -93
  264. data/lib/rubocop/cop/rails/request_referer.rb +0 -56
  265. data/lib/rubocop/cop/rails/reversible_migration.rb +0 -286
  266. data/lib/rubocop/cop/rails/safe_navigation.rb +0 -87
  267. data/lib/rubocop/cop/rails/save_bang.rb +0 -316
  268. data/lib/rubocop/cop/rails/scope_args.rb +0 -29
  269. data/lib/rubocop/cop/rails/skips_model_validations.rb +0 -87
  270. data/lib/rubocop/cop/rails/time_zone.rb +0 -238
  271. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +0 -105
  272. data/lib/rubocop/cop/rails/unknown_env.rb +0 -63
  273. data/lib/rubocop/cop/rails/validation.rb +0 -109
  274. data/lib/rubocop/rspec/shared_examples.rb +0 -59
@@ -27,6 +27,7 @@ require_relative 'rubocop/ast/node/mixin/conditional_node'
27
27
  require_relative 'rubocop/ast/node/mixin/hash_element_node'
28
28
  require_relative 'rubocop/ast/node/mixin/method_dispatch_node'
29
29
  require_relative 'rubocop/ast/node/mixin/modifier_node'
30
+ require_relative 'rubocop/ast/node/mixin/numeric_node'
30
31
  require_relative 'rubocop/ast/node/mixin/parameterized_node'
31
32
  require_relative 'rubocop/ast/node/mixin/predicate_operator_node'
32
33
  require_relative 'rubocop/ast/node/mixin/basic_literal_node'
@@ -42,8 +43,10 @@ require_relative 'rubocop/ast/node/def_node'
42
43
  require_relative 'rubocop/ast/node/defined_node'
43
44
  require_relative 'rubocop/ast/node/ensure_node'
44
45
  require_relative 'rubocop/ast/node/for_node'
46
+ require_relative 'rubocop/ast/node/float_node'
45
47
  require_relative 'rubocop/ast/node/hash_node'
46
48
  require_relative 'rubocop/ast/node/if_node'
49
+ require_relative 'rubocop/ast/node/int_node'
47
50
  require_relative 'rubocop/ast/node/keyword_splat_node'
48
51
  require_relative 'rubocop/ast/node/module_node'
49
52
  require_relative 'rubocop/ast/node/or_node'
@@ -117,8 +120,8 @@ require_relative 'rubocop/cop/mixin/frozen_string_literal'
117
120
  require_relative 'rubocop/cop/mixin/hash_alignment'
118
121
  require_relative 'rubocop/cop/mixin/ignored_pattern'
119
122
  require_relative 'rubocop/cop/mixin/ignored_methods'
120
- require_relative 'rubocop/cop/mixin/ignored_method_patterns'
121
123
  require_relative 'rubocop/cop/mixin/integer_node'
124
+ require_relative 'rubocop/cop/mixin/interpolation'
122
125
  require_relative 'rubocop/cop/mixin/match_range'
123
126
  require_relative 'rubocop/cop/mixin/method_complexity'
124
127
  require_relative 'rubocop/cop/mixin/method_preference'
@@ -148,13 +151,16 @@ require_relative 'rubocop/cop/mixin/statement_modifier'
148
151
  require_relative 'rubocop/cop/mixin/string_help'
149
152
  require_relative 'rubocop/cop/mixin/string_literals_help'
150
153
  require_relative 'rubocop/cop/mixin/target_ruby_version'
151
- require_relative 'rubocop/cop/mixin/target_rails_version'
152
154
  require_relative 'rubocop/cop/mixin/too_many_lines'
153
155
  require_relative 'rubocop/cop/mixin/trailing_body'
154
156
  require_relative 'rubocop/cop/mixin/trailing_comma'
155
157
  require_relative 'rubocop/cop/mixin/uncommunicative_name'
156
158
  require_relative 'rubocop/cop/mixin/unused_argument'
157
159
 
160
+ require_relative 'rubocop/cop/utils/format_string'
161
+
162
+ require_relative 'rubocop/cop/migration/department_name'
163
+
158
164
  require_relative 'rubocop/cop/correctors/alignment_corrector'
159
165
  require_relative 'rubocop/cop/correctors/condition_corrector'
160
166
  require_relative 'rubocop/cop/correctors/each_to_for_corrector'
@@ -179,6 +185,7 @@ require_relative 'rubocop/cop/bundler/ordered_gems'
179
185
  require_relative 'rubocop/cop/gemspec/duplicated_assignment'
180
186
  require_relative 'rubocop/cop/gemspec/ordered_dependencies'
181
187
  require_relative 'rubocop/cop/gemspec/required_ruby_version'
188
+ require_relative 'rubocop/cop/gemspec/ruby_version_globals_usage'
182
189
 
183
190
  require_relative 'rubocop/cop/layout/access_modifier_indentation'
184
191
  require_relative 'rubocop/cop/layout/align_arguments'
@@ -325,6 +332,7 @@ require_relative 'rubocop/cop/lint/safe_navigation_consistency'
325
332
  require_relative 'rubocop/cop/lint/safe_navigation_chain'
326
333
  require_relative 'rubocop/cop/lint/safe_navigation_with_empty'
327
334
  require_relative 'rubocop/cop/lint/script_permission'
335
+ require_relative 'rubocop/cop/lint/send_with_mixin_argument'
328
336
  require_relative 'rubocop/cop/lint/shadowed_argument'
329
337
  require_relative 'rubocop/cop/lint/shadowed_exception'
330
338
  require_relative 'rubocop/cop/lint/shadowing_outer_local_variable'
@@ -411,6 +419,7 @@ require_relative 'rubocop/cop/style/def_with_parentheses'
411
419
  require_relative 'rubocop/cop/style/dir'
412
420
  require_relative 'rubocop/cop/style/documentation_method'
413
421
  require_relative 'rubocop/cop/style/documentation'
422
+ require_relative 'rubocop/cop/style/double_cop_disable_directive'
414
423
  require_relative 'rubocop/cop/style/double_negation'
415
424
  require_relative 'rubocop/cop/style/each_for_simple_loop'
416
425
  require_relative 'rubocop/cop/style/each_with_object'
@@ -425,6 +434,7 @@ require_relative 'rubocop/cop/style/end_block'
425
434
  require_relative 'rubocop/cop/style/eval_with_location'
426
435
  require_relative 'rubocop/cop/style/even_odd'
427
436
  require_relative 'rubocop/cop/style/expand_path_arguments'
437
+ require_relative 'rubocop/cop/style/float_division'
428
438
  require_relative 'rubocop/cop/style/for'
429
439
  require_relative 'rubocop/cop/style/format_string'
430
440
  require_relative 'rubocop/cop/style/format_string_token'
@@ -462,6 +472,7 @@ require_relative 'rubocop/cop/style/multiline_if_modifier'
462
472
  require_relative 'rubocop/cop/style/multiline_method_signature'
463
473
  require_relative 'rubocop/cop/style/multiline_memoization'
464
474
  require_relative 'rubocop/cop/style/multiline_ternary_operator'
475
+ require_relative 'rubocop/cop/style/multiline_when_then'
465
476
  require_relative 'rubocop/cop/style/multiple_comparison'
466
477
  require_relative 'rubocop/cop/style/mutable_constant'
467
478
  require_relative 'rubocop/cop/style/negated_if'
@@ -547,58 +558,6 @@ require_relative 'rubocop/cop/style/word_array'
547
558
  require_relative 'rubocop/cop/style/yoda_condition'
548
559
  require_relative 'rubocop/cop/style/zero_length_predicate'
549
560
 
550
- require_relative 'rubocop/cop/rails/action_filter'
551
- require_relative 'rubocop/cop/rails/active_record_aliases'
552
- require_relative 'rubocop/cop/rails/active_record_override'
553
- require_relative 'rubocop/cop/rails/active_support_aliases'
554
- require_relative 'rubocop/cop/rails/application_job'
555
- require_relative 'rubocop/cop/rails/application_record'
556
- require_relative 'rubocop/cop/rails/assert_not'
557
- require_relative 'rubocop/cop/rails/belongs_to'
558
- require_relative 'rubocop/cop/rails/blank'
559
- require_relative 'rubocop/cop/rails/bulk_change_table'
560
- require_relative 'rubocop/cop/rails/create_table_with_timestamps'
561
- require_relative 'rubocop/cop/rails/date'
562
- require_relative 'rubocop/cop/rails/delegate'
563
- require_relative 'rubocop/cop/rails/delegate_allow_blank'
564
- require_relative 'rubocop/cop/rails/dynamic_find_by'
565
- require_relative 'rubocop/cop/rails/enum_uniqueness'
566
- require_relative 'rubocop/cop/rails/environment_comparison'
567
- require_relative 'rubocop/cop/rails/exit'
568
- require_relative 'rubocop/cop/rails/file_path'
569
- require_relative 'rubocop/cop/rails/find_by'
570
- require_relative 'rubocop/cop/rails/find_each'
571
- require_relative 'rubocop/cop/rails/has_and_belongs_to_many'
572
- require_relative 'rubocop/cop/rails/has_many_or_has_one_dependent'
573
- require_relative 'rubocop/cop/rails/http_positional_arguments'
574
- require_relative 'rubocop/cop/rails/http_status'
575
- require_relative 'rubocop/cop/rails/ignored_skip_action_filter_option'
576
- require_relative 'rubocop/cop/rails/inverse_of'
577
- require_relative 'rubocop/cop/rails/lexically_scoped_action_filter'
578
- require_relative 'rubocop/cop/rails/link_to_blank'
579
- require_relative 'rubocop/cop/rails/not_null_column'
580
- require_relative 'rubocop/cop/rails/output'
581
- require_relative 'rubocop/cop/rails/output_safety'
582
- require_relative 'rubocop/cop/rails/pluralization_grammar'
583
- require_relative 'rubocop/cop/rails/presence'
584
- require_relative 'rubocop/cop/rails/present'
585
- require_relative 'rubocop/cop/rails/read_write_attribute'
586
- require_relative 'rubocop/cop/rails/redundant_allow_nil'
587
- require_relative 'rubocop/cop/rails/redundant_receiver_in_with_options'
588
- require_relative 'rubocop/cop/rails/reflection_class_name'
589
- require_relative 'rubocop/cop/rails/refute_methods'
590
- require_relative 'rubocop/cop/rails/relative_date_constant'
591
- require_relative 'rubocop/cop/rails/request_referer'
592
- require_relative 'rubocop/cop/rails/reversible_migration'
593
- require_relative 'rubocop/cop/rails/safe_navigation'
594
- require_relative 'rubocop/cop/rails/save_bang'
595
- require_relative 'rubocop/cop/rails/scope_args'
596
- require_relative 'rubocop/cop/rails/skips_model_validations'
597
- require_relative 'rubocop/cop/rails/time_zone'
598
- require_relative 'rubocop/cop/rails/uniq_before_pluck'
599
- require_relative 'rubocop/cop/rails/unknown_env'
600
- require_relative 'rubocop/cop/rails/validation'
601
-
602
561
  require_relative 'rubocop/cop/security/eval'
603
562
  require_relative 'rubocop/cop/security/json_load'
604
563
  require_relative 'rubocop/cop/security/marshal_load'
@@ -623,6 +582,7 @@ require_relative 'rubocop/formatter/progress_formatter'
623
582
  require_relative 'rubocop/formatter/quiet_formatter'
624
583
  require_relative 'rubocop/formatter/tap_formatter'
625
584
  require_relative 'rubocop/formatter/worst_offenders_formatter'
585
+ require_relative 'rubocop/formatter/pacman_formatter'
626
586
  # relies on progress formatter
627
587
  require_relative 'rubocop/formatter/auto_gen_config_formatter'
628
588
 
@@ -632,7 +592,9 @@ require_relative 'rubocop/cached_data'
632
592
  require_relative 'rubocop/config'
633
593
  require_relative 'rubocop/config_loader_resolver'
634
594
  require_relative 'rubocop/config_loader'
595
+ require_relative 'rubocop/config_obsoletion'
635
596
  require_relative 'rubocop/config_store'
597
+ require_relative 'rubocop/config_validator'
636
598
  require_relative 'rubocop/target_finder'
637
599
  require_relative 'rubocop/token'
638
600
  require_relative 'rubocop/comment_config'
@@ -28,8 +28,10 @@ module RuboCop
28
28
  defs: DefNode,
29
29
  ensure: EnsureNode,
30
30
  for: ForNode,
31
+ float: FloatNode,
31
32
  hash: HashNode,
32
33
  if: IfNode,
34
+ int: IntNode,
33
35
  irange: RangeNode,
34
36
  erange: RangeNode,
35
37
  kwsplat: KeywordSplatNode,
@@ -302,12 +302,10 @@ module RuboCop
302
302
 
303
303
  ## Destructuring
304
304
 
305
- def_node_matcher :receiver, <<-PATTERN
305
+ def_node_matcher :receiver, <<~PATTERN
306
306
  {(send $_ ...) (block (send $_ ...) ...)}
307
307
  PATTERN
308
308
 
309
- # Note: for masgn, #asgn_rhs will be an array node
310
- def_node_matcher :asgn_rhs, '[assignment? (... $_)]'
311
309
  def_node_matcher :str_content, '(str $_)'
312
310
 
313
311
  def const_name
@@ -321,7 +319,7 @@ module RuboCop
321
319
  end
322
320
  end
323
321
 
324
- def_node_matcher :defined_module0, <<-PATTERN
322
+ def_node_matcher :defined_module0, <<~PATTERN
325
323
  {(class (const $_ $_) ...)
326
324
  (module (const $_ $_) ...)
327
325
  (casgn $_ $_ (send (const nil? {:Class :Module}) :new ...))
@@ -367,7 +365,7 @@ module RuboCop
367
365
  end
368
366
 
369
367
  # Some cops treat the shovel operator as a kind of assignment.
370
- def_node_matcher :assignment_or_similar?, <<-PATTERN
368
+ def_node_matcher :assignment_or_similar?, <<~PATTERN
371
369
  {assignment? (send _recv :<< ...)}
372
370
  PATTERN
373
371
 
@@ -405,7 +403,7 @@ module RuboCop
405
403
  receiver.send(recursive_kind) &&
406
404
  arguments.all?(&recursive_kind)
407
405
  when :begin, :pair, *OPERATOR_KEYWORDS, *COMPOSITE_LITERALS
408
- children.all?(&recursive_kind)
406
+ children.compact.all?(&recursive_kind)
409
407
  else
410
408
  send(kind_filter)
411
409
  end
@@ -479,11 +477,11 @@ module RuboCop
479
477
  irange_type? || erange_type?
480
478
  end
481
479
 
482
- def_node_matcher :guard_clause?, <<-PATTERN
483
- [{(send nil? {:raise :fail} ...) return break next} single_line?]
480
+ def_node_matcher :guard_clause?, <<~PATTERN
481
+ [${(send nil? {:raise :fail} ...) return break next} single_line?]
484
482
  PATTERN
485
483
 
486
- def_node_matcher :proc?, <<-PATTERN
484
+ def_node_matcher :proc?, <<~PATTERN
487
485
  {(block (send nil? :proc) ...)
488
486
  (block (send (const nil? :Proc) :new) ...)
489
487
  (send (const nil? :Proc) :new)}
@@ -492,15 +490,11 @@ module RuboCop
492
490
  def_node_matcher :lambda?, '(block (send nil? :lambda) ...)'
493
491
  def_node_matcher :lambda_or_proc?, '{lambda? proc?}'
494
492
 
495
- def_node_matcher :class_constructor?, <<-PATTERN
493
+ def_node_matcher :class_constructor?, <<~PATTERN
496
494
  { (send (const nil? {:Class :Module}) :new ...)
497
495
  (block (send (const nil? {:Class :Module}) :new ...) ...)}
498
496
  PATTERN
499
497
 
500
- def_node_matcher :module_definition?, <<-PATTERN
501
- {class module (casgn _ _ class_constructor?)}
502
- PATTERN
503
-
504
498
  # Some expressions are evaluated for their value, some for their side
505
499
  # effects, and some for both
506
500
  # If we know that an expression is useful only for its side effects, that
@@ -638,7 +632,7 @@ module RuboCop
638
632
  end
639
633
  end
640
634
 
641
- def_node_matcher :new_class_or_module_block?, <<-PATTERN
635
+ def_node_matcher :new_class_or_module_block?, <<~PATTERN
642
636
  ^(casgn _ _ (block (send (const _ {:Class :Module}) :new) ...))
643
637
  PATTERN
644
638
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `float` nodes. This will be used in place of a plain
6
+ # node when the builder constructs the AST, making its methods available to
7
+ # all `float` nodes within RuboCop.
8
+ class FloatNode < Node
9
+ include NumericNode
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `int` nodes. This will be used in place of a plain
6
+ # node when the builder constructs the AST, making its methods available to
7
+ # all `int` nodes within RuboCop.
8
+ class IntNode < Node
9
+ include NumericNode
10
+ end
11
+ end
12
+ end
@@ -220,7 +220,7 @@ module RuboCop
220
220
 
221
221
  private
222
222
 
223
- def_node_matcher :macro_scope?, <<-PATTERN
223
+ def_node_matcher :macro_scope?, <<~PATTERN
224
224
  {^{({sclass class module block} ...) class_constructor?}
225
225
  ^^{({sclass class module block} ... ({begin if} ...)) class_constructor?}
226
226
  ^#macro_kwbegin_wrapper?
@@ -245,15 +245,15 @@ module RuboCop
245
245
  node.parent.nil?
246
246
  end
247
247
 
248
- def_node_matcher :adjacent_def_modifier?, <<-PATTERN
248
+ def_node_matcher :adjacent_def_modifier?, <<~PATTERN
249
249
  (send nil? _ ({def defs} ...))
250
250
  PATTERN
251
251
 
252
- def_node_matcher :bare_access_modifier_declaration?, <<-PATTERN
252
+ def_node_matcher :bare_access_modifier_declaration?, <<~PATTERN
253
253
  (send nil? {:public :protected :private :module_function})
254
254
  PATTERN
255
255
 
256
- def_node_matcher :non_bare_access_modifier_declaration?, <<-PATTERN
256
+ def_node_matcher :non_bare_access_modifier_declaration?, <<~PATTERN
257
257
  (send nil? {:public :protected :private :module_function} _)
258
258
  PATTERN
259
259
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # Common functionality for primitive numeric nodes: `int`, `float`, ...
6
+ module NumericNode
7
+ SIGN_REGEX = /\A[+-]/.freeze
8
+
9
+ # Checks whether this is literal has a sign.
10
+ #
11
+ # @example
12
+ #
13
+ # +42
14
+ #
15
+ # @return [Boolean] whether this literal has a sign.
16
+ def sign?
17
+ source.match(SIGN_REGEX)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -17,12 +17,7 @@ module RuboCop
17
17
  #
18
18
  # @return [Node, nil] The exception variable of the `resbody`.
19
19
  def exception_variable
20
- variable = node_parts[1]
21
- return variable if variable
22
-
23
- # When resbody is an implicit rescue (i.e. `rescue e` style),
24
- # the exception variable is descendants[1].
25
- descendants[1]
20
+ node_parts[1]
26
21
  end
27
22
  end
28
23
  end
@@ -35,7 +35,7 @@ module RuboCop
35
35
  end
36
36
 
37
37
  ONE_CHILD_NODE.each do |type|
38
- module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
38
+ module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
39
39
  def on_#{type}(node)
40
40
  if (child = node.children[0])
41
41
  send(:"on_\#{child.type}", child)
@@ -45,7 +45,7 @@ module RuboCop
45
45
  end
46
46
 
47
47
  MANY_CHILD_NODES.each do |type|
48
- module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
48
+ module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
49
49
  def on_#{type}(node)
50
50
  node.children.each { |child| send(:"on_\#{child.type}", child) }
51
51
  nil
@@ -55,7 +55,7 @@ module RuboCop
55
55
 
56
56
  SECOND_CHILD_ONLY.each do |type|
57
57
  # Guard clause is for nodes nested within mlhs
58
- module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
58
+ module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
59
59
  def on_#{type}(node)
60
60
  if (child = node.children[1])
61
61
  send(:"on_\#{child.type}", child)
@@ -38,7 +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
- offense.message.scrub
41
+ offense.message.dup.force_encoding(::Encoding::UTF_8).scrub
42
42
  end
43
43
 
44
44
  # Restore an offense object loaded from a JSON file.
@@ -11,7 +11,8 @@ module RuboCop
11
11
  COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
12
12
 
13
13
  COMMENT_DIRECTIVE_REGEXP = Regexp.new(
14
- ('# rubocop : ((?:dis|en)able)\b ' + COPS_PATTERN).gsub(' ', '\s*')
14
+ ('# rubocop : ((?:disable|enable|todo))\b ' + COPS_PATTERN)
15
+ .gsub(' ', '\s*')
15
16
  )
16
17
 
17
18
  CopAnalysis = Struct.new(:line_ranges, :start_line_number)
@@ -141,7 +142,7 @@ module RuboCop
141
142
  cop_names =
142
143
  cops_string == 'all' ? all_cop_names : cops_string.split(/,\s*/)
143
144
 
144
- disabled = (switch == 'disable')
145
+ disabled = %w[disable todo].include?(switch)
145
146
 
146
147
  [cop_names, disabled]
147
148
  end
@@ -8,227 +8,12 @@ module RuboCop
8
8
  # file from which it was read. Several different Configs can be used
9
9
  # during a run of the rubocop program, if files in several
10
10
  # directories are inspected.
11
-
12
- # rubocop:disable Metrics/ClassLength
13
11
  class Config
14
12
  include PathUtil
15
13
  include FileFinder
14
+ extend Forwardable
16
15
 
17
- COMMON_PARAMS = %w[Exclude Include Severity inherit_mode
18
- AutoCorrect StyleGuide Details].freeze
19
- INTERNAL_PARAMS = %w[Description StyleGuide VersionAdded
20
- VersionChanged Reference Safe SafeAutoCorrect].freeze
21
-
22
- # 2.3 is the oldest officially supported Ruby version.
23
- DEFAULT_RUBY_VERSION = 2.3
24
- KNOWN_RUBIES = [2.3, 2.4, 2.5, 2.6].freeze
25
- OBSOLETE_RUBIES = {
26
- 1.9 => '0.50', 2.0 => '0.50', 2.1 => '0.58', 2.2 => '0.69'
27
- }.freeze
28
- RUBY_VERSION_FILENAME = '.ruby-version'
29
16
  DEFAULT_RAILS_VERSION = 5.0
30
- OBSOLETE_COPS = {
31
- 'Style/FlipFlop' =>
32
- 'The `Style/FlipFlop` cop has been moved to `Lint/FlipFlop`.',
33
- 'Style/TrailingComma' =>
34
- 'The `Style/TrailingComma` cop no longer exists. Please use ' \
35
- '`Style/TrailingCommaInArguments`, ' \
36
- '`Style/TrailingCommaInArrayLiteral`, and/or ' \
37
- '`Style/TrailingCommaInHashLiteral` instead.',
38
- 'Style/TrailingCommaInLiteral' =>
39
- 'The `Style/TrailingCommaInLiteral` cop no longer exists. Please use ' \
40
- '`Style/TrailingCommaInArrayLiteral` and/or ' \
41
- '`Style/TrailingCommaInHashLiteral` instead.',
42
- 'Rails/DefaultScope' =>
43
- 'The `Rails/DefaultScope` cop no longer exists.',
44
- 'Lint/InvalidCharacterLiteral' =>
45
- 'The `Lint/InvalidCharacterLiteral` cop has been removed since it ' \
46
- 'was never being actually triggered.',
47
- 'Style/SingleSpaceBeforeFirstArg' =>
48
- 'The `Style/SingleSpaceBeforeFirstArg` cop has been renamed to ' \
49
- '`Layout/SpaceBeforeFirstArg`.',
50
- 'Lint/RescueWithoutErrorClass' =>
51
- 'The `Lint/RescueWithoutErrorClass` cop has been replaced by ' \
52
- '`Style/RescueStandardError`.',
53
- 'Lint/SpaceBeforeFirstArg' =>
54
- 'The `Lint/SpaceBeforeFirstArg` cop has been removed, since it was a ' \
55
- 'duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
56
- '`Layout/SpaceBeforeFirstArg` instead.',
57
- 'Layout/FirstParameterIndentation' =>
58
- 'The `Layout/FirstParameterIndentation` cop has been renamed to ' \
59
- '`Layout/IndentFirstArgument`.',
60
- 'Layout/IndentArray' =>
61
- 'The `Layout/IndentArray` cop has been renamed to ' \
62
- '`Layout/IndentFirstArrayElement`.',
63
- 'Layout/IndentHash' =>
64
- 'The `Layout/IndentHash` cop has been renamed to ' \
65
- '`Layout/IndentFirstHashElement`.',
66
- 'Layout/SpaceAfterControlKeyword' =>
67
- 'The `Layout/SpaceAfterControlKeyword` cop has been removed. Please ' \
68
- 'use `Layout/SpaceAroundKeyword` instead.',
69
- 'Layout/SpaceBeforeModifierKeyword' =>
70
- 'The `Layout/SpaceBeforeModifierKeyword` cop has been removed. ' \
71
- 'Please use `Layout/SpaceAroundKeyword` instead.',
72
- 'Style/SpaceAfterControlKeyword' =>
73
- 'The `Style/SpaceAfterControlKeyword` cop has been removed. Please ' \
74
- 'use `Layout/SpaceAroundKeyword` instead.',
75
- 'Style/SpaceBeforeModifierKeyword' =>
76
- 'The `Style/SpaceBeforeModifierKeyword` cop has been removed. Please ' \
77
- 'use `Layout/SpaceAroundKeyword` instead.',
78
- 'Style/MethodCallParentheses' =>
79
- 'The `Style/MethodCallParentheses` cop has been renamed to ' \
80
- '`Style/MethodCallWithoutArgsParentheses`.',
81
- 'Lint/Eval' =>
82
- 'The `Lint/Eval` cop has been renamed to `Security/Eval`.',
83
- 'Style/DeprecatedHashMethods' =>
84
- 'The `Style/DeprecatedHashMethods` cop has been renamed to ' \
85
- '`Style/PreferredHashMethods`.',
86
- 'Style/AccessorMethodName' =>
87
- 'The `Style/AccessorMethodName` cop has been moved to ' \
88
- '`Naming/AccessorMethodName`.',
89
- 'Style/AsciiIdentifiers' =>
90
- 'The `Style/AsciiIdentifiers` cop has been moved to ' \
91
- '`Naming/AccessorMethodName`.',
92
- 'Style/OpMethod' =>
93
- 'The `Style/OpMethod` cop has been renamed and moved to ' \
94
- '`Naming/BinaryOperatorParameterName`.',
95
- 'Style/ClassAndModuleCamelCase' =>
96
- 'The `Style/ClassAndModuleCamelCase` cop has been renamed to ' \
97
- '`Naming/ClassAndModuleCamelCase`.',
98
- 'Style/ConstantName' =>
99
- 'The `Style/ConstantName` cop has been renamed to ' \
100
- '`Naming/ConstantName`.',
101
- 'Style/FileName' =>
102
- 'The `Style/FileName` cop has been renamed to `Naming/FileName`.',
103
- 'Style/MethodName' =>
104
- 'The `Style/MethodName` cop has been renamed to ' \
105
- '`Naming/MethodName`.',
106
- 'Style/PredicateName' =>
107
- 'The `Style/PredicateName` cop has been renamed to ' \
108
- '`Naming/PredicateName`.',
109
- 'Style/VariableName' =>
110
- 'The `Style/VariableName` cop has been renamed to ' \
111
- '`Naming/VariableName`.',
112
- 'Style/VariableNumber' =>
113
- 'The `Style/VariableNumber` cop has been renamed to ' \
114
- '`Naming/VariableNumber`.',
115
- 'Lint/BlockAlignment' =>
116
- 'The `Lint/BlockAlignment` cop has been renamed to ' \
117
- '`Layout/BlockAlignment`.',
118
- 'Lint/EndAlignment' =>
119
- 'The `Lint/EndAlignment` cop has been renamed to ' \
120
- '`Layout/EndAlignment`.',
121
- 'Lint/DefEndAlignment' =>
122
- 'The `Lint/DefEndAlignment` cop has been renamed to ' \
123
- '`Layout/DefEndAlignment`.',
124
- 'Style/MethodMissing' =>
125
- 'The `Style/MethodMissing` cop has been split into ' \
126
- '`Style/MethodMissingSuper` and `Style/MissingRespondToMissing`.'
127
- }.freeze
128
-
129
- OBSOLETE_PARAMETERS = [
130
- {
131
- cop: 'Layout/SpaceAroundOperators',
132
- parameter: 'MultiSpaceAllowedForOperators',
133
- alternative: 'If your intention was to allow extra spaces ' \
134
- 'for alignment, please use AllowForAlignment: ' \
135
- 'true instead.'
136
- },
137
- {
138
- cop: 'Style/Encoding',
139
- parameter: 'EnforcedStyle',
140
- alternative: 'Style/Encoding no longer supports styles. ' \
141
- 'The "never" behavior is always assumed.'
142
- },
143
- {
144
- cop: 'Style/Encoding',
145
- parameter: 'SupportedStyles',
146
- alternative: 'Style/Encoding no longer supports styles. ' \
147
- 'The "never" behavior is always assumed.'
148
- },
149
- {
150
- cop: 'Style/Encoding',
151
- parameter: 'AutoCorrectEncodingComment',
152
- alternative: 'Style/Encoding no longer supports styles. ' \
153
- 'The "never" behavior is always assumed.'
154
- },
155
- {
156
- cop: 'Style/IfUnlessModifier',
157
- parameter: 'MaxLineLength',
158
- alternative:
159
- '`Style/IfUnlessModifier: MaxLineLength` has been removed. Use ' \
160
- '`Metrics/LineLength: Max` instead'
161
- },
162
- {
163
- cop: 'Style/SpaceAroundOperators',
164
- parameter: 'MultiSpaceAllowedForOperators',
165
- alternative: 'If your intention was to allow extra spaces ' \
166
- 'for alignment, please use AllowForAlignment: ' \
167
- 'true instead.'
168
- },
169
- {
170
- cop: 'Style/WhileUntilModifier',
171
- parameter: 'MaxLineLength',
172
- alternative:
173
- '`Style/WhileUntilModifier: MaxLineLength` has been removed. Use ' \
174
- '`Metrics/LineLength: Max` instead'
175
- },
176
- {
177
- cop: 'AllCops',
178
- parameter: 'RunRailsCops',
179
- alternative: "Use the following configuration instead:\n" \
180
- "Rails:\n Enabled: true"
181
- },
182
- {
183
- cop: 'Layout/CaseIndentation',
184
- parameter: 'IndentWhenRelativeTo',
185
- alternative: '`IndentWhenRelativeTo` has been renamed to ' \
186
- '`EnforcedStyle`'
187
- },
188
- {
189
- cop: 'Lint/BlockAlignment',
190
- parameter: 'AlignWith',
191
- alternative: '`AlignWith` has been renamed to ' \
192
- '`EnforcedStyleAlignWith`'
193
- },
194
- {
195
- cop: 'Layout/BlockAlignment',
196
- parameter: 'AlignWith',
197
- alternative: '`AlignWith` has been renamed to ' \
198
- '`EnforcedStyleAlignWith`'
199
- },
200
- {
201
- cop: 'Lint/EndAlignment',
202
- parameter: 'AlignWith',
203
- alternative: '`AlignWith` has been renamed to ' \
204
- '`EnforcedStyleAlignWith`'
205
- },
206
- {
207
- cop: 'Layout/EndAlignment',
208
- parameter: 'AlignWith',
209
- alternative: '`AlignWith` has been renamed to ' \
210
- '`EnforcedStyleAlignWith`'
211
- },
212
- {
213
- cop: 'Lint/DefEndAlignment',
214
- parameter: 'AlignWith',
215
- alternative: '`AlignWith` has been renamed to ' \
216
- '`EnforcedStyleAlignWith`'
217
- },
218
- {
219
- cop: 'Layout/DefEndAlignment',
220
- parameter: 'AlignWith',
221
- alternative: '`AlignWith` has been renamed to ' \
222
- '`EnforcedStyleAlignWith`'
223
- },
224
- {
225
- cop: 'Rails/UniqBeforePluck',
226
- parameter: 'EnforcedMode',
227
- alternative: '`EnforcedMode` has been renamed to ' \
228
- '`EnforcedStyle`'
229
- }
230
- ].freeze
231
-
232
17
  attr_reader :loaded_path
233
18
 
234
19
  def initialize(hash = {}, loaded_path = nil)
@@ -240,6 +25,7 @@ module RuboCop
240
25
  h[cop] = cop_options
241
26
  end
242
27
  @hash = hash
28
+ @validator = ConfigValidator.new(self)
243
29
  end
244
30
 
245
31
  def self.create(hash, path)
@@ -250,54 +36,14 @@ module RuboCop
250
36
  deprecation_check do |deprecation_message|
251
37
  warn("#{loaded_path} - #{deprecation_message}")
252
38
  end
253
- validate
39
+ @validator.validate
254
40
  make_excludes_absolute
255
41
  self
256
42
  end
257
43
 
258
- def [](key)
259
- @hash[key]
260
- end
261
-
262
- def []=(key, value)
263
- @hash[key] = value
264
- end
265
-
266
- def delete(key)
267
- @hash.delete(key)
268
- end
269
-
270
- def each(&block)
271
- @hash.each(&block)
272
- end
273
-
274
- def key?(key)
275
- @hash.key?(key)
276
- end
277
-
278
- def keys
279
- @hash.keys
280
- end
281
-
282
- def each_key(&block)
283
- @hash.each_key(&block)
284
- end
285
-
286
- def map(&block)
287
- @hash.map(&block)
288
- end
289
-
290
- def merge(other_hash)
291
- @hash.merge(other_hash)
292
- end
293
-
294
- def to_h
295
- @hash
296
- end
297
-
298
- def to_hash
299
- @hash
300
- end
44
+ def_delegators :@hash, :[], :[]=, :delete, :each, :key?, :keys, :each_key,
45
+ :map, :merge, :to_h, :to_hash
46
+ def_delegators :@validator, :validate, :target_ruby_version
301
47
 
302
48
  def to_s
303
49
  @to_s ||= @hash.to_s
@@ -309,7 +55,7 @@ module RuboCop
309
55
 
310
56
  def make_excludes_absolute
311
57
  each_key do |key|
312
- validate_section_presence(key)
58
+ @validator.validate_section_presence(key)
313
59
  next unless self[key]['Exclude']
314
60
 
315
61
  self[key]['Exclude'].map! do |exclude_elem|
@@ -350,27 +96,12 @@ module RuboCop
350
96
  @for_cop[cop.respond_to?(:cop_name) ? cop.cop_name : cop]
351
97
  end
352
98
 
353
- def for_all_cops
354
- @for_all_cops ||= self['AllCops'] || {}
99
+ def for_department(department_name)
100
+ @for_cop[department_name]
355
101
  end
356
102
 
357
- def validate
358
- # Don't validate RuboCop's own files. Avoids infinite recursion.
359
- base_config_path = File.expand_path(File.join(ConfigLoader::RUBOCOP_HOME,
360
- 'config'))
361
- return if File.expand_path(loaded_path).start_with?(base_config_path)
362
-
363
- valid_cop_names, invalid_cop_names = keys.partition do |key|
364
- ConfigLoader.default_configuration.key?(key)
365
- end
366
-
367
- reject_obsolete_cops_and_parameters
368
- warn_about_unrecognized_cops(invalid_cop_names)
369
- check_target_ruby
370
- validate_parameter_names(valid_cop_names)
371
- validate_enforced_styles(valid_cop_names)
372
- validate_syntax_cop
373
- reject_mutually_exclusive_defaults
103
+ def for_all_cops
104
+ @for_all_cops ||= self['AllCops'] || {}
374
105
  end
375
106
 
376
107
  def file_to_include?(file)
@@ -451,26 +182,6 @@ module RuboCop
451
182
  end
452
183
  end
453
184
 
454
- def target_ruby_version
455
- @target_ruby_version ||= begin
456
- if for_all_cops['TargetRubyVersion']
457
- @target_ruby_version_source = :rubocop_yml
458
-
459
- for_all_cops['TargetRubyVersion'].to_f
460
- elsif target_ruby_version_from_version_file
461
- @target_ruby_version_source = :ruby_version_file
462
-
463
- target_ruby_version_from_version_file
464
- elsif target_ruby_version_from_bundler_lock_file
465
- @target_ruby_version_source = :bundler_lock_file
466
-
467
- target_ruby_version_from_bundler_lock_file
468
- else
469
- DEFAULT_RUBY_VERSION
470
- end
471
- end
472
- end
473
-
474
185
  def target_rails_version
475
186
  @target_rails_version ||=
476
187
  if for_all_cops['TargetRailsVersion']
@@ -482,195 +193,22 @@ module RuboCop
482
193
  end
483
194
  end
484
195
 
485
- private
486
-
487
- def warn_about_unrecognized_cops(invalid_cop_names)
488
- invalid_cop_names.each do |name|
489
- # There could be a custom cop with this name. If so, don't warn
490
- next if Cop::Cop.registry.contains_cop_matching?([name])
491
-
492
- # Special case for inherit_mode, which is a directive that we keep in
493
- # the configuration (even though it's not a cop), because it's easier
494
- # to do so than to pass the value around to various methods.
495
- next if name == 'inherit_mode'
496
-
497
- warn Rainbow("Warning: unrecognized cop #{name} found in " \
498
- "#{smart_loaded_path}").yellow
499
- end
500
- end
501
-
502
- def validate_syntax_cop
503
- syntax_config = self['Lint/Syntax']
504
- default_config = ConfigLoader.default_configuration['Lint/Syntax']
505
-
506
- return unless syntax_config &&
507
- default_config.merge(syntax_config) != default_config
508
-
509
- raise ValidationError,
510
- "configuration for Syntax cop found in #{smart_loaded_path}\n" \
511
- 'It\'s not possible to disable this cop.'
512
- end
513
-
514
- def validate_section_presence(name)
515
- return unless key?(name) && self[name].nil?
516
-
517
- raise ValidationError,
518
- "empty section #{name} found in #{smart_loaded_path}"
519
- end
520
-
521
- def validate_parameter_names(valid_cop_names)
522
- valid_cop_names.each do |name|
523
- validate_section_presence(name)
524
- default_config = ConfigLoader.default_configuration[name]
525
-
526
- self[name].each_key do |param|
527
- next if COMMON_PARAMS.include?(param) || default_config.key?(param)
528
-
529
- message =
530
- "Warning: #{name} does not support #{param} parameter.\n\n" \
531
- "Supported parameters are:\n\n" \
532
- " - #{(default_config.keys - INTERNAL_PARAMS).join("\n - ")}\n"
533
-
534
- warn Rainbow(message).yellow.to_s
535
- end
536
- end
537
- end
538
-
539
- def validate_enforced_styles(valid_cop_names)
540
- valid_cop_names.each do |name|
541
- styles = self[name].select { |key, _| key.start_with?('Enforced') }
542
-
543
- styles.each do |style_name, style|
544
- supported_key = RuboCop::Cop::Util.to_supported_styles(style_name)
545
- valid = ConfigLoader.default_configuration[name][supported_key]
546
-
547
- next unless valid
548
- next if valid.include?(style)
549
- next if validate_support_and_has_list(name, style, valid)
550
-
551
- msg = "invalid #{style_name} '#{style}' for #{name} found in " \
552
- "#{smart_loaded_path}\n" \
553
- "Valid choices are: #{valid.join(', ')}"
554
- raise ValidationError, msg
555
- end
556
- end
557
- end
558
-
559
- def validate_support_and_has_list(name, formats, valid)
560
- ConfigLoader.default_configuration[name]['AllowMultipleStyles'] &&
561
- formats.is_a?(Array) &&
562
- formats.all? { |format| valid.include?(format) }
563
- end
564
-
565
- def reject_obsolete_cops_and_parameters
566
- messages = [
567
- obsolete_cops,
568
- obsolete_parameters
569
- ].flatten.compact
570
- return if messages.empty?
571
-
572
- raise ValidationError, messages.join("\n")
573
- end
574
-
575
- def obsolete_parameters
576
- OBSOLETE_PARAMETERS.map do |params|
577
- obsolete_parameter_message(params[:cop], params[:parameter],
578
- params[:alternative])
579
- end
580
- end
581
-
582
- def obsolete_parameter_message(cop, parameter, alternative)
583
- return unless self[cop]&.key?(parameter)
584
-
585
- "obsolete parameter #{parameter} (for #{cop}) " \
586
- "found in #{smart_loaded_path}" \
587
- "\n#{alternative}"
588
- end
589
-
590
- def obsolete_cops
591
- OBSOLETE_COPS.map do |cop_name, message|
592
- next unless key?(cop_name) || key?(Cop::Badge.parse(cop_name).cop_name)
593
-
594
- message + "\n(obsolete configuration found in #{smart_loaded_path}," \
595
- ' please update it)'
596
- end
196
+ def smart_loaded_path
197
+ PathUtil.smart_path(@loaded_path)
597
198
  end
598
199
 
599
- def check_target_ruby
600
- return if KNOWN_RUBIES.include?(target_ruby_version)
601
-
602
- msg = if OBSOLETE_RUBIES.include?(target_ruby_version)
603
- "Unsupported Ruby version #{target_ruby_version} found in " \
604
- "#{target_ruby_source}. #{target_ruby_version}-compatible " \
605
- 'analysis was dropped after version ' \
606
- "#{OBSOLETE_RUBIES[target_ruby_version]}."
607
- else
608
- "Unknown Ruby version #{target_ruby_version.inspect} found in " \
609
- "#{target_ruby_source}."
610
- end
611
-
612
- msg += "\nSupported versions: #{KNOWN_RUBIES.join(', ')}"
613
-
614
- raise ValidationError, msg
615
- end
200
+ def bundler_lock_file_path
201
+ return nil unless loaded_path
616
202
 
617
- def target_ruby_source
618
- case @target_ruby_version_source
619
- when :ruby_version_file
620
- "`#{RUBY_VERSION_FILENAME}`"
621
- when :bundler_lock_file
622
- "`#{bundler_lock_file_path}`"
623
- when :rubocop_yml
624
- "`TargetRubyVersion` parameter (in #{smart_loaded_path})"
203
+ base_path = base_dir_for_path_parameters
204
+ ['gems.locked', 'Gemfile.lock'].each do |file_name|
205
+ path = find_file_upwards(file_name, base_path)
206
+ return path if path
625
207
  end
208
+ nil
626
209
  end
627
210
 
628
- def ruby_version_file
629
- @ruby_version_file ||=
630
- find_file_upwards(RUBY_VERSION_FILENAME, base_dir_for_path_parameters)
631
- end
632
-
633
- def target_ruby_version_from_version_file
634
- file = ruby_version_file
635
- return unless file && File.file?(file)
636
-
637
- @target_ruby_version_from_version_file ||=
638
- File.read(file).match(/\A(ruby-)?(?<version>\d+\.\d+)/) do |md|
639
- md[:version].to_f
640
- end
641
- end
642
-
643
- def target_ruby_version_from_bundler_lock_file
644
- @target_ruby_version_from_bundler_lock_file ||=
645
- read_ruby_version_from_bundler_lock_file
646
- end
647
-
648
- def read_ruby_version_from_bundler_lock_file
649
- lock_file_path = bundler_lock_file_path
650
- return nil unless lock_file_path
651
-
652
- in_ruby_section = false
653
- File.foreach(lock_file_path) do |line|
654
- # If ruby is in Gemfile.lock or gems.lock, there should be two lines
655
- # towards the bottom of the file that look like:
656
- # RUBY VERSION
657
- # ruby W.X.YpZ
658
- # We ultimately want to match the "ruby W.X.Y.pZ" line, but there's
659
- # extra logic to make sure we only start looking once we've seen the
660
- # "RUBY VERSION" line.
661
- in_ruby_section ||= line.match(/^\s*RUBY\s*VERSION\s*$/)
662
- next unless in_ruby_section
663
-
664
- # We currently only allow this feature to work with MRI ruby. If jruby
665
- # (or something else) is used by the project, it's lock file will have a
666
- # line that looks like:
667
- # RUBY VERSION
668
- # ruby W.X.YpZ (jruby x.x.x.x)
669
- # The regex won't match in this situation.
670
- result = line.match(/^\s*ruby\s+(\d+\.\d+)[p.\d]*\s*$/)
671
- return result.captures.first.to_f if result
672
- end
673
- end
211
+ private
674
212
 
675
213
  def target_rails_version_from_bundler_lock_file
676
214
  @target_rails_version_from_bundler_lock_file ||=
@@ -689,26 +227,6 @@ module RuboCop
689
227
  end
690
228
  end
691
229
 
692
- def bundler_lock_file_path
693
- return nil unless loaded_path
694
-
695
- base_path = base_dir_for_path_parameters
696
- ['gems.locked', 'Gemfile.lock'].each do |file_name|
697
- path = find_file_upwards(file_name, base_path)
698
- return path if path
699
- end
700
- nil
701
- end
702
-
703
- def reject_mutually_exclusive_defaults
704
- disabled_by_default = for_all_cops['DisabledByDefault']
705
- enabled_by_default = for_all_cops['EnabledByDefault']
706
- return unless disabled_by_default && enabled_by_default
707
-
708
- msg = 'Cops cannot be both enabled by default and disabled by default'
709
- raise ValidationError, msg
710
- end
711
-
712
230
  def enable_cop?(qualified_cop_name, cop_options)
713
231
  cop_department, cop_name = qualified_cop_name.split('/')
714
232
  department = cop_name.nil?
@@ -722,10 +240,5 @@ module RuboCop
722
240
 
723
241
  cop_options.fetch('Enabled') { !for_all_cops['DisabledByDefault'] }
724
242
  end
725
-
726
- def smart_loaded_path
727
- PathUtil.smart_path(@loaded_path)
728
- end
729
243
  end
730
- # rubocop:enable Metrics/ClassLength
731
244
  end