rubocop 0.42.0 → 0.52.1

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 (627) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +106 -20
  4. data/assets/output.html.erb +21 -10
  5. data/bin/rubocop +1 -2
  6. data/config/default.yml +914 -483
  7. data/config/disabled.yml +61 -41
  8. data/config/enabled.yml +1396 -878
  9. data/lib/rubocop/ast/builder.rb +72 -0
  10. data/lib/rubocop/ast/node/and_node.rb +37 -0
  11. data/lib/rubocop/ast/node/args_node.rb +29 -0
  12. data/lib/rubocop/ast/node/array_node.rb +57 -0
  13. data/lib/rubocop/ast/node/block_node.rb +116 -0
  14. data/lib/rubocop/ast/node/case_node.rb +64 -0
  15. data/lib/rubocop/ast/node/def_node.rb +71 -0
  16. data/lib/rubocop/ast/node/ensure_node.rb +25 -0
  17. data/lib/rubocop/ast/node/for_node.rb +61 -0
  18. data/lib/rubocop/ast/node/hash_node.rb +109 -0
  19. data/lib/rubocop/ast/node/if_node.rb +146 -0
  20. data/lib/rubocop/ast/node/keyword_splat_node.rb +45 -0
  21. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +16 -0
  22. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +23 -0
  23. data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
  24. data/lib/rubocop/ast/node/mixin/conditional_node.rb +45 -0
  25. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +125 -0
  26. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
  27. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
  28. data/lib/rubocop/ast/node/mixin/modifier_node.rb +17 -0
  29. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +61 -0
  30. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +35 -0
  31. data/lib/rubocop/ast/node/or_node.rb +37 -0
  32. data/lib/rubocop/ast/node/pair_node.rb +64 -0
  33. data/lib/rubocop/ast/node/regexp_node.rb +35 -0
  34. data/lib/rubocop/ast/node/resbody_node.rb +25 -0
  35. data/lib/rubocop/ast/node/send_node.rb +45 -0
  36. data/lib/rubocop/ast/node/str_node.rb +14 -0
  37. data/lib/rubocop/ast/node/super_node.rb +21 -0
  38. data/lib/rubocop/ast/node/symbol_node.rb +20 -0
  39. data/lib/rubocop/ast/node/until_node.rb +43 -0
  40. data/lib/rubocop/ast/node/when_node.rb +61 -0
  41. data/lib/rubocop/ast/node/while_node.rb +43 -0
  42. data/lib/rubocop/ast/node/yield_node.rb +21 -0
  43. data/lib/rubocop/ast/node.rb +634 -0
  44. data/lib/rubocop/ast/sexp.rb +16 -0
  45. data/lib/rubocop/{ast_node → ast}/traversal.rb +23 -24
  46. data/lib/rubocop/cached_data.rb +11 -31
  47. data/lib/rubocop/cli.rb +116 -33
  48. data/lib/rubocop/comment_config.rb +4 -10
  49. data/lib/rubocop/config.rb +355 -102
  50. data/lib/rubocop/config_loader.rb +93 -78
  51. data/lib/rubocop/config_loader_resolver.rb +106 -7
  52. data/lib/rubocop/config_store.rb +4 -1
  53. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  54. data/lib/rubocop/cop/badge.rb +73 -0
  55. data/lib/rubocop/cop/bundler/duplicated_gem.rb +71 -0
  56. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +67 -0
  57. data/lib/rubocop/cop/bundler/ordered_gems.rb +71 -0
  58. data/lib/rubocop/cop/commissioner.rb +27 -10
  59. data/lib/rubocop/cop/cop.rb +62 -107
  60. data/lib/rubocop/cop/corrector.rb +0 -1
  61. data/lib/rubocop/cop/correctors/alignment_corrector.rb +121 -0
  62. data/lib/rubocop/cop/correctors/condition_corrector.rb +28 -0
  63. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  64. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +62 -0
  65. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  66. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  67. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  68. data/lib/rubocop/cop/correctors/space_corrector.rb +34 -0
  69. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  70. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +31 -0
  71. data/lib/rubocop/cop/force.rb +0 -1
  72. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +102 -0
  73. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +106 -0
  74. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +87 -0
  75. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  76. data/lib/rubocop/cop/generator.rb +191 -0
  77. data/lib/rubocop/cop/ignored_node.rb +0 -1
  78. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +46 -0
  79. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +44 -0
  80. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  81. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +59 -0
  82. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +71 -0
  83. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  84. data/lib/rubocop/cop/internal_affairs.rb +8 -0
  85. data/lib/rubocop/cop/{style → layout}/access_modifier_indentation.rb +39 -10
  86. data/lib/rubocop/cop/layout/align_array.rb +39 -0
  87. data/lib/rubocop/cop/layout/align_hash.rb +235 -0
  88. data/lib/rubocop/cop/{style → layout}/align_parameters.rb +38 -19
  89. data/lib/rubocop/cop/{style → layout}/block_end_newline.rb +26 -8
  90. data/lib/rubocop/cop/layout/case_indentation.rb +160 -0
  91. data/lib/rubocop/cop/layout/class_structure.rb +306 -0
  92. data/lib/rubocop/cop/{style → layout}/closing_parenthesis_indentation.rb +18 -13
  93. data/lib/rubocop/cop/{style → layout}/comment_indentation.rb +48 -6
  94. data/lib/rubocop/cop/{style → layout}/dot_position.rb +34 -21
  95. data/lib/rubocop/cop/{style → layout}/else_alignment.rb +55 -37
  96. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -0
  97. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +147 -0
  98. data/lib/rubocop/cop/{style → layout}/empty_lines.rb +17 -4
  99. data/lib/rubocop/cop/{style → layout}/empty_lines_around_access_modifier.rb +40 -24
  100. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +87 -0
  101. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +46 -0
  102. data/lib/rubocop/cop/{style → layout}/empty_lines_around_block_body.rb +9 -12
  103. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +68 -0
  104. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +135 -0
  105. data/lib/rubocop/cop/{style → layout}/empty_lines_around_method_body.rb +10 -7
  106. data/lib/rubocop/cop/{style → layout}/empty_lines_around_module_body.rb +27 -9
  107. data/lib/rubocop/cop/layout/end_of_line.rb +52 -0
  108. data/lib/rubocop/cop/{style → layout}/extra_spacing.rb +63 -53
  109. data/lib/rubocop/cop/{style → layout}/first_array_element_line_break.rb +5 -2
  110. data/lib/rubocop/cop/{style → layout}/first_hash_element_line_break.rb +5 -2
  111. data/lib/rubocop/cop/{style → layout}/first_method_argument_line_break.rb +7 -4
  112. data/lib/rubocop/cop/{style → layout}/first_method_parameter_line_break.rb +8 -5
  113. data/lib/rubocop/cop/{style → layout}/first_parameter_indentation.rb +32 -26
  114. data/lib/rubocop/cop/{style → layout}/indent_array.rb +75 -25
  115. data/lib/rubocop/cop/{style → layout}/indent_assignment.rb +9 -6
  116. data/lib/rubocop/cop/{style → layout}/indent_hash.rb +80 -31
  117. data/lib/rubocop/cop/layout/indent_heredoc.rb +208 -0
  118. data/lib/rubocop/cop/{style → layout}/indentation_consistency.rb +7 -5
  119. data/lib/rubocop/cop/{style → layout}/indentation_width.rb +151 -117
  120. data/lib/rubocop/cop/layout/initial_indentation.rb +45 -0
  121. data/lib/rubocop/cop/layout/leading_comment_space.rb +58 -0
  122. data/lib/rubocop/cop/{style → layout}/multiline_array_brace_layout.rb +52 -16
  123. data/lib/rubocop/cop/{style → layout}/multiline_assignment_layout.rb +18 -21
  124. data/lib/rubocop/cop/{style → layout}/multiline_block_layout.rb +37 -43
  125. data/lib/rubocop/cop/{style → layout}/multiline_hash_brace_layout.rb +55 -15
  126. data/lib/rubocop/cop/{style → layout}/multiline_method_call_brace_layout.rb +15 -4
  127. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +221 -0
  128. data/lib/rubocop/cop/{style → layout}/multiline_method_definition_brace_layout.rb +12 -5
  129. data/lib/rubocop/cop/{style → layout}/multiline_operation_indentation.rb +23 -13
  130. data/lib/rubocop/cop/{style → layout}/rescue_ensure_alignment.rb +24 -13
  131. data/lib/rubocop/cop/{style → layout}/space_after_colon.rb +17 -13
  132. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  133. data/lib/rubocop/cop/{style → layout}/space_after_method_name.rb +11 -11
  134. data/lib/rubocop/cop/layout/space_after_not.rb +38 -0
  135. data/lib/rubocop/cop/{style → layout}/space_after_semicolon.rb +14 -4
  136. data/lib/rubocop/cop/{style → layout}/space_around_block_parameters.rb +52 -28
  137. data/lib/rubocop/cop/{style → layout}/space_around_equals_in_parameter_default.rb +29 -21
  138. data/lib/rubocop/cop/{style → layout}/space_around_keyword.rb +33 -29
  139. data/lib/rubocop/cop/layout/space_around_operators.rb +159 -0
  140. data/lib/rubocop/cop/layout/space_before_block_braces.rb +107 -0
  141. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  142. data/lib/rubocop/cop/{style → layout}/space_before_comment.rb +11 -7
  143. data/lib/rubocop/cop/{style → layout}/space_before_first_arg.rb +23 -20
  144. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  145. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +85 -0
  146. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +236 -0
  147. data/lib/rubocop/cop/{style → layout}/space_inside_array_percent_literal.rb +8 -8
  148. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +228 -0
  149. data/lib/rubocop/cop/{style → layout}/space_inside_hash_literal_braces.rb +91 -51
  150. data/lib/rubocop/cop/layout/space_inside_parens.rb +53 -0
  151. data/lib/rubocop/cop/{style → layout}/space_inside_percent_literal_delimiters.rb +14 -13
  152. data/lib/rubocop/cop/{style → layout}/space_inside_range_literal.rb +16 -17
  153. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +90 -0
  154. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +80 -0
  155. data/lib/rubocop/cop/{style → layout}/tab.rb +8 -6
  156. data/lib/rubocop/cop/{style → layout}/trailing_blank_lines.rb +14 -15
  157. data/lib/rubocop/cop/{style → layout}/trailing_whitespace.rb +3 -4
  158. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +59 -0
  159. data/lib/rubocop/cop/lint/ambiguous_operator.rb +13 -9
  160. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +7 -1
  161. data/lib/rubocop/cop/lint/assignment_in_condition.rb +55 -25
  162. data/lib/rubocop/cop/lint/block_alignment.rb +75 -34
  163. data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
  164. data/lib/rubocop/cop/lint/circular_argument_reference.rb +17 -15
  165. data/lib/rubocop/cop/lint/condition_position.rb +16 -15
  166. data/lib/rubocop/cop/lint/debugger.rb +57 -23
  167. data/lib/rubocop/cop/lint/def_end_alignment.rb +28 -14
  168. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +19 -10
  169. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  170. data/lib/rubocop/cop/lint/duplicate_methods.rb +108 -14
  171. data/lib/rubocop/cop/lint/duplicated_key.rb +16 -9
  172. data/lib/rubocop/cop/lint/each_with_object_argument.rb +15 -6
  173. data/lib/rubocop/cop/lint/else_layout.rb +27 -31
  174. data/lib/rubocop/cop/lint/empty_ensure.rb +44 -3
  175. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  176. data/lib/rubocop/cop/lint/empty_interpolation.rb +16 -3
  177. data/lib/rubocop/cop/lint/empty_when.rb +38 -0
  178. data/lib/rubocop/cop/lint/end_alignment.rb +57 -39
  179. data/lib/rubocop/cop/lint/end_in_method.rb +24 -2
  180. data/lib/rubocop/cop/lint/ensure_return.rb +23 -3
  181. data/lib/rubocop/cop/lint/float_out_of_range.rb +10 -6
  182. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +67 -46
  183. data/lib/rubocop/cop/lint/handle_exceptions.rb +41 -4
  184. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +9 -5
  185. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +42 -29
  186. data/lib/rubocop/cop/lint/inherit_exception.rb +34 -23
  187. data/lib/rubocop/cop/lint/interpolation_check.rb +37 -0
  188. data/lib/rubocop/cop/lint/{literal_in_condition.rb → literal_as_condition.rb} +51 -40
  189. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -8
  190. data/lib/rubocop/cop/lint/loop.rb +37 -2
  191. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +81 -0
  192. data/lib/rubocop/cop/lint/multiple_compare.rb +48 -0
  193. data/lib/rubocop/cop/lint/nested_method_definition.rb +54 -12
  194. data/lib/rubocop/cop/lint/nested_percent_literal.rb +58 -0
  195. data/lib/rubocop/cop/lint/next_without_accumulator.rb +7 -3
  196. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +32 -23
  197. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +22 -14
  198. data/lib/rubocop/cop/lint/percent_string_array.rb +42 -27
  199. data/lib/rubocop/cop/lint/percent_symbol_array.rb +28 -19
  200. data/lib/rubocop/cop/lint/rand_one.rb +17 -8
  201. data/lib/rubocop/cop/lint/redundant_with_index.rb +80 -0
  202. data/lib/rubocop/cop/lint/redundant_with_object.rb +81 -0
  203. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  204. data/lib/rubocop/cop/lint/require_parentheses.rb +24 -30
  205. data/lib/rubocop/cop/lint/rescue_exception.rb +21 -2
  206. data/lib/rubocop/cop/lint/rescue_type.rb +90 -0
  207. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  208. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +70 -0
  209. data/lib/rubocop/cop/lint/script_permission.rb +49 -0
  210. data/lib/rubocop/cop/lint/shadowed_argument.rb +146 -0
  211. data/lib/rubocop/cop/lint/shadowed_exception.rb +78 -57
  212. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +25 -2
  213. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +18 -12
  214. data/lib/rubocop/cop/lint/syntax.rb +23 -21
  215. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +26 -4
  216. data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
  217. data/lib/rubocop/cop/lint/unneeded_disable.rb +117 -56
  218. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +51 -0
  219. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +167 -0
  220. data/lib/rubocop/cop/lint/unreachable_code.rb +72 -8
  221. data/lib/rubocop/cop/lint/unused_block_argument.rb +87 -27
  222. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  223. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +75 -0
  224. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  225. data/lib/rubocop/cop/lint/useless_access_modifier.rb +40 -18
  226. data/lib/rubocop/cop/lint/useless_assignment.rb +45 -14
  227. data/lib/rubocop/cop/lint/useless_comparison.rb +8 -10
  228. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +16 -2
  229. data/lib/rubocop/cop/lint/useless_setter_call.rb +57 -43
  230. data/lib/rubocop/cop/lint/void.rb +83 -23
  231. data/lib/rubocop/cop/message_annotator.rb +118 -0
  232. data/lib/rubocop/cop/metrics/abc_size.rb +3 -4
  233. data/lib/rubocop/cop/metrics/block_length.rb +32 -0
  234. data/lib/rubocop/cop/metrics/block_nesting.rb +21 -10
  235. data/lib/rubocop/cop/metrics/class_length.rb +3 -2
  236. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +4 -4
  237. data/lib/rubocop/cop/metrics/line_length.rb +67 -14
  238. data/lib/rubocop/cop/metrics/method_length.rb +10 -10
  239. data/lib/rubocop/cop/metrics/module_length.rb +3 -2
  240. data/lib/rubocop/cop/metrics/parameter_lists.rb +15 -6
  241. data/lib/rubocop/cop/metrics/perceived_complexity.rb +5 -6
  242. data/lib/rubocop/cop/mixin/alignment.rb +70 -0
  243. data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -1
  244. data/lib/rubocop/cop/mixin/array_hash_indentation.rb +26 -22
  245. data/lib/rubocop/cop/mixin/array_min_size.rb +59 -0
  246. data/lib/rubocop/cop/mixin/array_syntax.rb +4 -12
  247. data/lib/rubocop/cop/mixin/check_assignment.rb +6 -7
  248. data/lib/rubocop/cop/mixin/classish_length.rb +0 -1
  249. data/lib/rubocop/cop/mixin/code_length.rb +4 -3
  250. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +21 -16
  251. data/lib/rubocop/cop/mixin/configurable_formatting.rb +48 -0
  252. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -4
  253. data/lib/rubocop/cop/mixin/configurable_naming.rb +5 -35
  254. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  255. data/lib/rubocop/cop/mixin/def_node.rb +29 -0
  256. data/lib/rubocop/cop/mixin/documentation_comment.rb +46 -0
  257. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  258. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +119 -27
  259. data/lib/rubocop/cop/mixin/empty_parameter.rb +23 -0
  260. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +11 -27
  261. data/lib/rubocop/cop/mixin/enforce_superclass.rb +30 -0
  262. data/lib/rubocop/cop/mixin/first_element_line_break.rb +15 -11
  263. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +15 -13
  264. data/lib/rubocop/cop/mixin/hash_alignment.rb +116 -0
  265. data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
  266. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  267. data/lib/rubocop/cop/mixin/integer_node.rb +2 -1
  268. data/lib/rubocop/cop/mixin/match_range.rb +4 -6
  269. data/lib/rubocop/cop/mixin/method_complexity.rb +33 -8
  270. data/lib/rubocop/cop/mixin/method_preference.rb +2 -1
  271. data/lib/rubocop/cop/mixin/min_body_length.rb +2 -1
  272. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +100 -66
  273. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +49 -51
  274. data/lib/rubocop/cop/mixin/negative_conditional.rb +18 -13
  275. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +1 -25
  276. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +48 -0
  277. data/lib/rubocop/cop/mixin/parentheses.rb +2 -8
  278. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +4 -2
  279. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  280. data/lib/rubocop/cop/mixin/percent_literal.rb +69 -6
  281. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +16 -5
  282. data/lib/rubocop/cop/mixin/rescue_node.rb +23 -0
  283. data/lib/rubocop/cop/mixin/safe_assignment.rb +3 -1
  284. data/lib/rubocop/cop/mixin/safe_mode.rb +22 -0
  285. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +8 -10
  286. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +10 -14
  287. data/lib/rubocop/cop/mixin/statement_modifier.rb +29 -32
  288. data/lib/rubocop/cop/mixin/string_help.rb +3 -2
  289. data/lib/rubocop/cop/mixin/string_literals_help.rb +3 -15
  290. data/lib/rubocop/cop/mixin/surrounding_space.rb +78 -9
  291. data/lib/rubocop/cop/mixin/target_rails_version.rb +16 -0
  292. data/lib/rubocop/cop/mixin/target_ruby_version.rb +16 -0
  293. data/lib/rubocop/cop/mixin/too_many_lines.rb +39 -0
  294. data/lib/rubocop/cop/mixin/trailing_comma.rb +37 -38
  295. data/lib/rubocop/cop/mixin/unused_argument.rb +6 -16
  296. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  297. data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +36 -5
  298. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +42 -0
  299. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +33 -0
  300. data/lib/rubocop/cop/naming/constant_name.rb +58 -0
  301. data/lib/rubocop/cop/{style → naming}/file_name.rb +72 -29
  302. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  303. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +59 -0
  304. data/lib/rubocop/cop/naming/method_name.rb +40 -0
  305. data/lib/rubocop/cop/naming/predicate_name.rb +101 -0
  306. data/lib/rubocop/cop/naming/variable_name.rb +50 -0
  307. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  308. data/lib/rubocop/cop/offense.rb +9 -5
  309. data/lib/rubocop/cop/performance/caller.rb +69 -0
  310. data/lib/rubocop/cop/performance/case_when_splat.rb +65 -89
  311. data/lib/rubocop/cop/performance/casecmp.rb +37 -25
  312. data/lib/rubocop/cop/performance/compare_with_block.rb +117 -0
  313. data/lib/rubocop/cop/performance/count.rb +33 -43
  314. data/lib/rubocop/cop/performance/detect.rb +30 -31
  315. data/lib/rubocop/cop/performance/double_start_end_with.rb +55 -26
  316. data/lib/rubocop/cop/performance/end_with.rb +9 -9
  317. data/lib/rubocop/cop/performance/fixed_size.rb +21 -17
  318. data/lib/rubocop/cop/performance/flat_map.rb +30 -33
  319. data/lib/rubocop/cop/performance/hash_each_methods.rb +129 -0
  320. data/lib/rubocop/cop/performance/lstrip_rstrip.rb +14 -14
  321. data/lib/rubocop/cop/performance/range_include.rb +5 -4
  322. data/lib/rubocop/cop/performance/redundant_block_call.rb +28 -29
  323. data/lib/rubocop/cop/performance/redundant_match.rb +19 -15
  324. data/lib/rubocop/cop/performance/redundant_merge.rb +100 -52
  325. data/lib/rubocop/cop/performance/redundant_sort_by.rb +17 -14
  326. data/lib/rubocop/cop/performance/regexp_match.rb +224 -0
  327. data/lib/rubocop/cop/performance/reverse_each.rb +3 -6
  328. data/lib/rubocop/cop/performance/sample.rb +84 -83
  329. data/lib/rubocop/cop/performance/size.rb +22 -15
  330. data/lib/rubocop/cop/performance/start_with.rb +9 -9
  331. data/lib/rubocop/cop/performance/string_replacement.rb +35 -70
  332. data/lib/rubocop/cop/performance/times_map.rb +33 -24
  333. data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
  334. data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
  335. data/lib/rubocop/cop/rails/action_filter.rb +67 -47
  336. data/lib/rubocop/cop/rails/active_support_aliases.rb +68 -0
  337. data/lib/rubocop/cop/rails/application_job.rb +40 -0
  338. data/lib/rubocop/cop/rails/application_record.rb +40 -0
  339. data/lib/rubocop/cop/rails/blank.rb +142 -0
  340. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +82 -0
  341. data/lib/rubocop/cop/rails/date.rb +47 -42
  342. data/lib/rubocop/cop/rails/delegate.rb +55 -33
  343. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +51 -0
  344. data/lib/rubocop/cop/rails/dynamic_find_by.rb +82 -0
  345. data/lib/rubocop/cop/rails/enum_uniqueness.rb +45 -0
  346. data/lib/rubocop/cop/rails/environment_comparison.rb +66 -0
  347. data/lib/rubocop/cop/rails/exit.rb +17 -11
  348. data/lib/rubocop/cop/rails/file_path.rb +72 -0
  349. data/lib/rubocop/cop/rails/find_by.rb +14 -20
  350. data/lib/rubocop/cop/rails/find_each.rb +8 -21
  351. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +9 -2
  352. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +84 -0
  353. data/lib/rubocop/cop/rails/http_positional_arguments.rb +102 -0
  354. data/lib/rubocop/cop/rails/inverse_of.rb +218 -0
  355. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +112 -0
  356. data/lib/rubocop/cop/rails/not_null_column.rb +67 -0
  357. data/lib/rubocop/cop/rails/output.rb +15 -13
  358. data/lib/rubocop/cop/rails/output_safety.rb +65 -17
  359. data/lib/rubocop/cop/rails/pluralization_grammar.rb +30 -29
  360. data/lib/rubocop/cop/rails/presence.rb +118 -0
  361. data/lib/rubocop/cop/rails/present.rb +143 -0
  362. data/lib/rubocop/cop/rails/read_write_attribute.rb +20 -26
  363. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +133 -0
  364. data/lib/rubocop/cop/rails/relative_date_constant.rb +88 -0
  365. data/lib/rubocop/cop/rails/request_referer.rb +28 -13
  366. data/lib/rubocop/cop/rails/reversible_migration.rb +281 -0
  367. data/lib/rubocop/cop/rails/safe_navigation.rb +90 -0
  368. data/lib/rubocop/cop/rails/save_bang.rb +104 -19
  369. data/lib/rubocop/cop/rails/scope_args.rb +5 -10
  370. data/lib/rubocop/cop/rails/skips_model_validations.rb +70 -0
  371. data/lib/rubocop/cop/rails/time_zone.rb +34 -21
  372. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +17 -14
  373. data/lib/rubocop/cop/rails/unknown_env.rb +63 -0
  374. data/lib/rubocop/cop/rails/validation.rb +16 -20
  375. data/lib/rubocop/cop/registry.rb +172 -0
  376. data/lib/rubocop/cop/security/eval.rb +30 -0
  377. data/lib/rubocop/cop/security/json_load.rb +46 -0
  378. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  379. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  380. data/lib/rubocop/cop/severity.rb +1 -2
  381. data/lib/rubocop/cop/style/alias.rb +54 -33
  382. data/lib/rubocop/cop/style/and_or.rb +77 -63
  383. data/lib/rubocop/cop/style/array_join.rb +13 -9
  384. data/lib/rubocop/cop/style/ascii_comments.rb +25 -7
  385. data/lib/rubocop/cop/style/attr.rb +24 -11
  386. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -16
  387. data/lib/rubocop/cop/style/bare_percent_literals.rb +31 -11
  388. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  389. data/lib/rubocop/cop/style/block_comments.rb +20 -11
  390. data/lib/rubocop/cop/style/block_delimiters.rb +122 -51
  391. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +142 -54
  392. data/lib/rubocop/cop/style/case_equality.rb +15 -4
  393. data/lib/rubocop/cop/style/character_literal.rb +12 -5
  394. data/lib/rubocop/cop/style/class_and_module_children.rb +85 -6
  395. data/lib/rubocop/cop/style/class_check.rb +35 -19
  396. data/lib/rubocop/cop/style/class_methods.rb +13 -14
  397. data/lib/rubocop/cop/style/class_vars.rb +5 -5
  398. data/lib/rubocop/cop/style/collection_methods.rb +12 -13
  399. data/lib/rubocop/cop/style/colon_method_call.rb +24 -16
  400. data/lib/rubocop/cop/style/colon_method_definition.rb +36 -0
  401. data/lib/rubocop/cop/style/command_literal.rb +98 -32
  402. data/lib/rubocop/cop/style/comment_annotation.rb +41 -15
  403. data/lib/rubocop/cop/style/commented_keyword.rb +84 -0
  404. data/lib/rubocop/cop/style/conditional_assignment.rb +161 -112
  405. data/lib/rubocop/cop/style/copyright.rb +32 -34
  406. data/lib/rubocop/cop/style/date_time.rb +44 -0
  407. data/lib/rubocop/cop/style/def_with_parentheses.rb +32 -9
  408. data/lib/rubocop/cop/style/dir.rb +48 -0
  409. data/lib/rubocop/cop/style/documentation.rb +44 -58
  410. data/lib/rubocop/cop/style/documentation_method.rb +76 -0
  411. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  412. data/lib/rubocop/cop/style/each_for_simple_loop.rb +14 -13
  413. data/lib/rubocop/cop/style/each_with_object.rb +28 -25
  414. data/lib/rubocop/cop/style/empty_block_parameter.rb +47 -0
  415. data/lib/rubocop/cop/style/empty_case_condition.rb +18 -30
  416. data/lib/rubocop/cop/style/empty_else.rb +82 -51
  417. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +43 -0
  418. data/lib/rubocop/cop/style/empty_literal.rb +76 -48
  419. data/lib/rubocop/cop/style/empty_method.rb +112 -0
  420. data/lib/rubocop/cop/style/encoding.rb +10 -40
  421. data/lib/rubocop/cop/style/end_block.rb +1 -2
  422. data/lib/rubocop/cop/style/eval_with_location.rb +146 -0
  423. data/lib/rubocop/cop/style/even_odd.rb +25 -44
  424. data/lib/rubocop/cop/style/flip_flop.rb +13 -3
  425. data/lib/rubocop/cop/style/for.rb +19 -15
  426. data/lib/rubocop/cop/style/format_string.rb +88 -42
  427. data/lib/rubocop/cop/style/format_string_token.rb +163 -0
  428. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +90 -15
  429. data/lib/rubocop/cop/style/global_vars.rb +14 -5
  430. data/lib/rubocop/cop/style/guard_clause.rb +22 -62
  431. data/lib/rubocop/cop/style/hash_syntax.rb +109 -59
  432. data/lib/rubocop/cop/style/identical_conditional_branches.rb +73 -32
  433. data/lib/rubocop/cop/style/if_inside_else.rb +16 -20
  434. data/lib/rubocop/cop/style/if_unless_modifier.rb +48 -39
  435. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +6 -12
  436. data/lib/rubocop/cop/style/if_with_semicolon.rb +10 -2
  437. data/lib/rubocop/cop/style/implicit_runtime_error.rb +7 -7
  438. data/lib/rubocop/cop/style/infinite_loop.rb +33 -32
  439. data/lib/rubocop/cop/style/inline_comment.rb +17 -5
  440. data/lib/rubocop/cop/style/inverse_methods.rb +149 -0
  441. data/lib/rubocop/cop/style/lambda.rb +66 -63
  442. data/lib/rubocop/cop/style/lambda_call.rb +50 -20
  443. data/lib/rubocop/cop/style/line_end_concatenation.rb +38 -17
  444. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +90 -0
  445. data/lib/rubocop/cop/style/{method_call_parentheses.rb → method_call_without_args_parentheses.rb} +32 -25
  446. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +9 -9
  447. data/lib/rubocop/cop/style/method_def_parentheses.rb +101 -29
  448. data/lib/rubocop/cop/style/method_missing.rb +14 -20
  449. data/lib/rubocop/cop/style/min_max.rb +68 -0
  450. data/lib/rubocop/cop/style/missing_else.rb +61 -21
  451. data/lib/rubocop/cop/style/mixin_grouping.rb +145 -0
  452. data/lib/rubocop/cop/style/mixin_usage.rb +82 -0
  453. data/lib/rubocop/cop/style/module_function.rb +44 -18
  454. data/lib/rubocop/cop/style/multiline_block_chain.rb +8 -15
  455. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  456. data/lib/rubocop/cop/style/multiline_if_then.rb +21 -14
  457. data/lib/rubocop/cop/style/multiline_memoization.rb +93 -0
  458. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +21 -9
  459. data/lib/rubocop/cop/style/multiple_comparison.rb +77 -0
  460. data/lib/rubocop/cop/style/mutable_constant.rb +17 -9
  461. data/lib/rubocop/cop/style/negated_if.rb +76 -25
  462. data/lib/rubocop/cop/style/negated_while.rb +4 -22
  463. data/lib/rubocop/cop/style/nested_modifier.rb +17 -47
  464. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +32 -28
  465. data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -6
  466. data/lib/rubocop/cop/style/next.rb +72 -53
  467. data/lib/rubocop/cop/style/nil_comparison.rb +10 -14
  468. data/lib/rubocop/cop/style/non_nil_check.rb +69 -62
  469. data/lib/rubocop/cop/style/not.rb +19 -13
  470. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +16 -7
  471. data/lib/rubocop/cop/style/numeric_literals.rb +33 -12
  472. data/lib/rubocop/cop/style/numeric_predicate.rb +30 -32
  473. data/lib/rubocop/cop/style/one_line_conditional.rb +21 -17
  474. data/lib/rubocop/cop/style/option_hash.rb +11 -37
  475. data/lib/rubocop/cop/style/optional_arguments.rb +20 -9
  476. data/lib/rubocop/cop/style/or_assignment.rb +88 -0
  477. data/lib/rubocop/cop/style/parallel_assignment.rb +83 -64
  478. data/lib/rubocop/cop/style/parentheses_around_condition.rb +37 -19
  479. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +50 -15
  480. data/lib/rubocop/cop/style/percent_q_literals.rb +40 -17
  481. data/lib/rubocop/cop/style/perl_backrefs.rb +9 -3
  482. data/lib/rubocop/cop/style/preferred_hash_methods.rb +48 -14
  483. data/lib/rubocop/cop/style/proc.rb +13 -10
  484. data/lib/rubocop/cop/style/raise_args.rb +46 -50
  485. data/lib/rubocop/cop/style/random_with_offset.rb +160 -0
  486. data/lib/rubocop/cop/style/redundant_begin.rb +16 -6
  487. data/lib/rubocop/cop/style/redundant_conditional.rb +96 -0
  488. data/lib/rubocop/cop/style/redundant_exception.rb +4 -5
  489. data/lib/rubocop/cop/style/redundant_freeze.rb +7 -10
  490. data/lib/rubocop/cop/style/redundant_parentheses.rb +70 -31
  491. data/lib/rubocop/cop/style/redundant_return.rb +61 -23
  492. data/lib/rubocop/cop/style/redundant_self.rb +62 -60
  493. data/lib/rubocop/cop/style/regexp_literal.rb +100 -34
  494. data/lib/rubocop/cop/style/rescue_modifier.rb +15 -17
  495. data/lib/rubocop/cop/style/rescue_standard_error.rb +122 -0
  496. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  497. data/lib/rubocop/cop/style/safe_navigation.rb +197 -0
  498. data/lib/rubocop/cop/style/self_assignment.rb +20 -17
  499. data/lib/rubocop/cop/style/semicolon.rb +25 -17
  500. data/lib/rubocop/cop/style/send.rb +14 -4
  501. data/lib/rubocop/cop/style/signal_exception.rb +105 -7
  502. data/lib/rubocop/cop/style/single_line_block_params.rb +27 -21
  503. data/lib/rubocop/cop/style/single_line_methods.rb +45 -31
  504. data/lib/rubocop/cop/style/special_global_vars.rb +32 -28
  505. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +24 -53
  506. data/lib/rubocop/cop/style/stderr_puts.rb +54 -0
  507. data/lib/rubocop/cop/style/string_hash_keys.rb +36 -0
  508. data/lib/rubocop/cop/style/string_literals.rb +31 -5
  509. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +20 -2
  510. data/lib/rubocop/cop/style/string_methods.rb +22 -9
  511. data/lib/rubocop/cop/style/struct_inheritance.rb +5 -17
  512. data/lib/rubocop/cop/style/symbol_array.rb +39 -65
  513. data/lib/rubocop/cop/style/symbol_literal.rb +1 -2
  514. data/lib/rubocop/cop/style/symbol_proc.rb +35 -52
  515. data/lib/rubocop/cop/style/ternary_parentheses.rb +143 -42
  516. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +101 -0
  517. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +31 -20
  518. data/lib/rubocop/cop/style/trailing_comma_in_literal.rb +26 -8
  519. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +95 -0
  520. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +97 -37
  521. data/lib/rubocop/cop/style/trivial_accessors.rb +72 -66
  522. data/lib/rubocop/cop/style/unless_else.rb +19 -13
  523. data/lib/rubocop/cop/style/unneeded_capital_w.rb +24 -10
  524. data/lib/rubocop/cop/style/unneeded_interpolation.rb +22 -24
  525. data/lib/rubocop/cop/style/unneeded_percent_q.rb +28 -22
  526. data/lib/rubocop/cop/style/variable_interpolation.rb +23 -10
  527. data/lib/rubocop/cop/style/when_then.rb +18 -4
  528. data/lib/rubocop/cop/style/while_until_do.rb +34 -16
  529. data/lib/rubocop/cop/style/while_until_modifier.rb +32 -12
  530. data/lib/rubocop/cop/style/word_array.rb +45 -102
  531. data/lib/rubocop/cop/style/yoda_condition.rb +107 -0
  532. data/lib/rubocop/cop/style/zero_length_predicate.rb +55 -32
  533. data/lib/rubocop/cop/team.rb +33 -35
  534. data/lib/rubocop/cop/util.rb +120 -54
  535. data/lib/rubocop/cop/variable_force/assignment.rb +5 -9
  536. data/lib/rubocop/cop/variable_force/branch.rb +318 -0
  537. data/lib/rubocop/cop/variable_force/branchable.rb +21 -0
  538. data/lib/rubocop/cop/variable_force/reference.rb +1 -2
  539. data/lib/rubocop/cop/variable_force/scope.rb +37 -26
  540. data/lib/rubocop/cop/variable_force/variable.rb +12 -12
  541. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -4
  542. data/lib/rubocop/cop/variable_force.rb +72 -39
  543. data/lib/rubocop/error.rb +0 -1
  544. data/lib/rubocop/formatter/base_formatter.rb +4 -9
  545. data/lib/rubocop/formatter/clang_style_formatter.rb +2 -3
  546. data/lib/rubocop/formatter/colorizable.rb +9 -10
  547. data/lib/rubocop/formatter/disabled_config_formatter.rb +48 -35
  548. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -1
  549. data/lib/rubocop/formatter/emacs_style_formatter.rb +0 -1
  550. data/lib/rubocop/formatter/file_list_formatter.rb +0 -1
  551. data/lib/rubocop/formatter/formatter_set.rb +16 -13
  552. data/lib/rubocop/formatter/fuubar_style_formatter.rb +6 -1
  553. data/lib/rubocop/formatter/html_formatter.rb +5 -5
  554. data/lib/rubocop/formatter/json_formatter.rb +9 -4
  555. data/lib/rubocop/formatter/offense_count_formatter.rb +2 -1
  556. data/lib/rubocop/formatter/progress_formatter.rb +0 -1
  557. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  558. data/lib/rubocop/formatter/simple_text_formatter.rb +7 -17
  559. data/lib/rubocop/formatter/tap_formatter.rb +71 -0
  560. data/lib/rubocop/formatter/text_util.rb +0 -1
  561. data/lib/rubocop/formatter/worst_offenders_formatter.rb +6 -5
  562. data/lib/rubocop/magic_comment.rb +210 -0
  563. data/lib/rubocop/name_similarity.rb +0 -1
  564. data/lib/rubocop/node_pattern.rb +181 -118
  565. data/lib/rubocop/options.rb +154 -88
  566. data/lib/rubocop/path_util.rb +38 -4
  567. data/lib/rubocop/platform.rb +11 -0
  568. data/lib/rubocop/processed_source.rb +23 -20
  569. data/lib/rubocop/rake_task.rb +16 -24
  570. data/lib/rubocop/remote_config.rb +40 -13
  571. data/lib/rubocop/result_cache.rb +33 -24
  572. data/lib/rubocop/rspec/cop_helper.rb +21 -7
  573. data/lib/rubocop/rspec/expect_offense.rb +165 -0
  574. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +1 -2
  575. data/lib/rubocop/rspec/shared_contexts.rb +24 -9
  576. data/lib/rubocop/rspec/shared_examples.rb +10 -19
  577. data/lib/rubocop/rspec/support.rb +5 -5
  578. data/lib/rubocop/runner.rb +74 -39
  579. data/lib/rubocop/string_interpreter.rb +0 -1
  580. data/lib/rubocop/string_util.rb +11 -6
  581. data/lib/rubocop/target_finder.rb +70 -8
  582. data/lib/rubocop/token.rb +79 -2
  583. data/lib/rubocop/version.rb +2 -5
  584. data/lib/rubocop/warning.rb +0 -1
  585. data/lib/rubocop.rb +569 -398
  586. metadata +301 -112
  587. data/lib/rubocop/ast_node/builder.rb +0 -31
  588. data/lib/rubocop/ast_node/sexp.rb +0 -14
  589. data/lib/rubocop/ast_node.rb +0 -623
  590. data/lib/rubocop/cop/lint/eval.rb +0 -23
  591. data/lib/rubocop/cop/lint/invalid_character_literal.rb +0 -39
  592. data/lib/rubocop/cop/lint/useless_array_splat.rb +0 -56
  593. data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -42
  594. data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +0 -152
  595. data/lib/rubocop/cop/mixin/hash_node.rb +0 -15
  596. data/lib/rubocop/cop/mixin/if_node.rb +0 -37
  597. data/lib/rubocop/cop/mixin/on_method_def.rb +0 -31
  598. data/lib/rubocop/cop/mixin/space_inside.rb +0 -79
  599. data/lib/rubocop/cop/performance/hash_each.rb +0 -86
  600. data/lib/rubocop/cop/performance/push_splat.rb +0 -47
  601. data/lib/rubocop/cop/style/accessor_method_name.rb +0 -46
  602. data/lib/rubocop/cop/style/align_array.rb +0 -21
  603. data/lib/rubocop/cop/style/align_hash.rb +0 -256
  604. data/lib/rubocop/cop/style/case_indentation.rb +0 -92
  605. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +0 -30
  606. data/lib/rubocop/cop/style/constant_name.rb +0 -30
  607. data/lib/rubocop/cop/style/empty_line_between_defs.rb +0 -76
  608. data/lib/rubocop/cop/style/empty_lines_around_class_body.rb +0 -40
  609. data/lib/rubocop/cop/style/end_of_line.rb +0 -31
  610. data/lib/rubocop/cop/style/initial_indentation.rb +0 -38
  611. data/lib/rubocop/cop/style/leading_comment_space.rb +0 -33
  612. data/lib/rubocop/cop/style/method_name.rb +0 -29
  613. data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +0 -176
  614. data/lib/rubocop/cop/style/op_method.rb +0 -44
  615. data/lib/rubocop/cop/style/predicate_name.rb +0 -68
  616. data/lib/rubocop/cop/style/space_after_comma.rb +0 -22
  617. data/lib/rubocop/cop/style/space_after_not.rb +0 -42
  618. data/lib/rubocop/cop/style/space_around_operators.rb +0 -132
  619. data/lib/rubocop/cop/style/space_before_block_braces.rb +0 -65
  620. data/lib/rubocop/cop/style/space_before_comma.rb +0 -17
  621. data/lib/rubocop/cop/style/space_before_semicolon.rb +0 -17
  622. data/lib/rubocop/cop/style/space_inside_block_braces.rb +0 -166
  623. data/lib/rubocop/cop/style/space_inside_brackets.rb +0 -21
  624. data/lib/rubocop/cop/style/space_inside_parens.rb +0 -17
  625. data/lib/rubocop/cop/style/space_inside_string_interpolation.rb +0 -52
  626. data/lib/rubocop/cop/style/variable_name.rb +0 -40
  627. data/lib/rubocop/cop/variable_force/locatable.rb +0 -197
@@ -1,24 +1,26 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'pathname'
5
4
 
6
- # rubocop:disable Metrics/ClassLength
7
-
8
5
  module RuboCop
9
6
  # This class represents the configuration of the RuboCop application
10
7
  # and all its cops. A Config is associated with a YAML configuration
11
8
  # file from which it was read. Several different Configs can be used
12
9
  # during a run of the rubocop program, if files in several
13
10
  # directories are inspected.
14
- class Config < Hash
11
+
12
+ # rubocop:disable Metrics/ClassLength
13
+ class Config
15
14
  include PathUtil
16
15
 
17
- COMMON_PARAMS = %w(Exclude Include Severity
18
- AutoCorrect StyleGuide Details).freeze
19
- # 2.0 is the oldest officially supported Ruby version.
20
- DEFAULT_RUBY_VERSION = 2.0
21
- KNOWN_RUBIES = [1.9, 2.0, 2.1, 2.2, 2.3, 2.4].freeze
16
+ COMMON_PARAMS = %w[Exclude Include Severity
17
+ AutoCorrect StyleGuide Details].freeze
18
+ # 2.1 is the oldest officially supported Ruby version.
19
+ DEFAULT_RUBY_VERSION = 2.1
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
22
+ RUBY_VERSION_FILENAME = '.ruby-version'.freeze
23
+ DEFAULT_RAILS_VERSION = 5.0
22
24
  OBSOLETE_COPS = {
23
25
  'Style/TrailingComma' =>
24
26
  'The `Style/TrailingComma` cop no longer exists. Please use ' \
@@ -26,29 +28,227 @@ module RuboCop
26
28
  '`Style/TrailingCommaInArguments` instead.',
27
29
  'Rails/DefaultScope' =>
28
30
  'The `Rails/DefaultScope` cop no longer exists.',
31
+ 'Lint/InvalidCharacterLiteral' =>
32
+ 'The `Lint/InvalidCharacterLiteral` cop has been removed since it ' \
33
+ 'was never being actually triggered.',
29
34
  'Style/SingleSpaceBeforeFirstArg' =>
30
35
  'The `Style/SingleSpaceBeforeFirstArg` cop has been renamed to ' \
31
- '`Style/SpaceBeforeFirstArg. ',
36
+ '`Layout/SpaceBeforeFirstArg`.',
37
+ 'Lint/RescueWithoutErrorClass' =>
38
+ 'The `Lint/RescueWithoutErrorClass` cop has been replaced by ' \
39
+ '`Style/RescueStandardError`.',
32
40
  'Lint/SpaceBeforeFirstArg' =>
33
41
  'The `Lint/SpaceBeforeFirstArg` cop has been removed, since it was a ' \
34
- 'duplicate of `Style/SpaceBeforeFirstArg`. Please use ' \
35
- '`Style/SpaceBeforeFirstArg` instead.',
42
+ 'duplicate of `Layout/SpaceBeforeFirstArg`. Please use ' \
43
+ '`Layout/SpaceBeforeFirstArg` instead.',
44
+ 'Layout/SpaceAfterControlKeyword' =>
45
+ 'The `Layout/SpaceAfterControlKeyword` cop has been removed. Please ' \
46
+ 'use `Layout/SpaceAroundKeyword` instead.',
47
+ 'Layout/SpaceBeforeModifierKeyword' =>
48
+ 'The `Layout/SpaceBeforeModifierKeyword` cop has been removed. ' \
49
+ 'Please use `Layout/SpaceAroundKeyword` instead.',
36
50
  'Style/SpaceAfterControlKeyword' =>
37
51
  'The `Style/SpaceAfterControlKeyword` cop has been removed. Please ' \
38
- 'use `Style/SpaceAroundKeyword` instead.',
52
+ 'use `Layout/SpaceAroundKeyword` instead.',
39
53
  'Style/SpaceBeforeModifierKeyword' =>
40
54
  'The `Style/SpaceBeforeModifierKeyword` cop has been removed. Please ' \
41
- 'use `Style/SpaceAroundKeyword` instead.'
55
+ 'use `Layout/SpaceAroundKeyword` instead.',
56
+ 'Style/MethodCallParentheses' =>
57
+ 'The `Style/MethodCallParentheses` cop has been renamed to ' \
58
+ '`Style/MethodCallWithoutArgsParentheses`.',
59
+ 'Lint/Eval' =>
60
+ 'The `Lint/Eval` cop has been renamed to `Security/Eval`.',
61
+ 'Style/DeprecatedHashMethods' =>
62
+ 'The `Style/DeprecatedHashMethods` cop has been renamed to ' \
63
+ '`Style/PreferredHashMethods`.',
64
+ 'Style/AccessorMethodName' =>
65
+ 'The `Style/AccessorMethodName` cop has been moved to ' \
66
+ '`Naming/AccessorMethodName`.',
67
+ 'Style/AsciiIdentifiers' =>
68
+ 'The `Style/AsciiIdentifiers` cop has been moved to ' \
69
+ '`Naming/AccessorMethodName`.',
70
+ 'Style/OpMethod' =>
71
+ 'The `Style/OpMethod` cop has been renamed and moved to ' \
72
+ '`Naming/BinaryOperatorParameterName`.',
73
+ 'Style/ClassAndModuleCamelCase' =>
74
+ 'The `Style/ClassAndModuleCamelCase` cop has been renamed to ' \
75
+ '`Naming/ClassAndModuleCamelCase`.',
76
+ 'Style/ConstantName' =>
77
+ 'The `Style/ConstantName` cop has been renamed to ' \
78
+ '`Naming/ConstantName`.',
79
+ 'Style/FileName' =>
80
+ 'The `Style/FileName` cop has been renamed to `Naming/FileName`.',
81
+ 'Style/MethodName' =>
82
+ 'The `Style/MethodName` cop has been renamed to ' \
83
+ '`Naming/MethodName`.',
84
+ 'Style/PredicateName' =>
85
+ 'The `Style/PredicateName` cop has been renamed to ' \
86
+ '`Naming/PredicateName`.',
87
+ 'Style/VariableName' =>
88
+ 'The `Style/VariableName` cop has been renamed to ' \
89
+ '`Naming/VariableName`.',
90
+ 'Style/VariableNumber' =>
91
+ 'The `Style/VariableNumber` cop has been renamed to ' \
92
+ '`Naming/VariableNumber`.'
42
93
  }.freeze
43
94
 
95
+ OBSOLETE_PARAMETERS = [
96
+ {
97
+ cop: 'Layout/SpaceAroundOperators',
98
+ parameter: 'MultiSpaceAllowedForOperators',
99
+ alternative: 'If your intention was to allow extra spaces ' \
100
+ 'for alignment, please use AllowForAlignment: ' \
101
+ 'true instead.'
102
+ },
103
+ {
104
+ cop: 'Style/Encoding',
105
+ parameter: 'EnforcedStyle',
106
+ alternative: 'Style/Encoding no longer supports styles. ' \
107
+ 'The "never" behavior is always assumed.'
108
+ },
109
+ {
110
+ cop: 'Style/Encoding',
111
+ parameter: 'SupportedStyles',
112
+ alternative: 'Style/Encoding no longer supports styles. ' \
113
+ 'The "never" behavior is always assumed.'
114
+ },
115
+ {
116
+ cop: 'Style/Encoding',
117
+ parameter: 'AutoCorrectEncodingComment',
118
+ alternative: 'Style/Encoding no longer supports styles. ' \
119
+ 'The "never" behavior is always assumed.'
120
+ },
121
+ {
122
+ cop: 'Style/IfUnlessModifier',
123
+ parameter: 'MaxLineLength',
124
+ alternative:
125
+ '`Style/IfUnlessModifier: MaxLineLength` has been removed. Use ' \
126
+ '`Metrics/LineLength: Max` instead'
127
+ },
128
+ {
129
+ cop: 'Style/SpaceAroundOperators',
130
+ parameter: 'MultiSpaceAllowedForOperators',
131
+ alternative: 'If your intention was to allow extra spaces ' \
132
+ 'for alignment, please use AllowForAlignment: ' \
133
+ 'true instead.'
134
+ },
135
+ {
136
+ cop: 'Style/WhileUntilModifier',
137
+ parameter: 'MaxLineLength',
138
+ alternative:
139
+ '`Style/WhileUntilModifier: MaxLineLength` has been removed. Use ' \
140
+ '`Metrics/LineLength: Max` instead'
141
+ },
142
+ {
143
+ cop: 'AllCops',
144
+ parameter: 'RunRailsCops',
145
+ alternative: "Use the following configuration instead:\n" \
146
+ "Rails:\n Enabled: true"
147
+ },
148
+ {
149
+ cop: 'Layout/CaseIndentation',
150
+ parameter: 'IndentWhenRelativeTo',
151
+ alternative: '`IndentWhenRelativeTo` has been renamed to ' \
152
+ '`EnforcedStyle`'
153
+ },
154
+ {
155
+ cop: 'Lint/BlockAlignment',
156
+ parameter: 'AlignWith',
157
+ alternative: '`AlignWith` has been renamed to ' \
158
+ '`EnforcedStyleAlignWith`'
159
+ },
160
+ {
161
+ cop: 'Lint/EndAlignment',
162
+ parameter: 'AlignWith',
163
+ alternative: '`AlignWith` has been renamed to ' \
164
+ '`EnforcedStyleAlignWith`'
165
+ },
166
+ {
167
+ cop: 'Lint/DefEndAlignment',
168
+ parameter: 'AlignWith',
169
+ alternative: '`AlignWith` has been renamed to ' \
170
+ '`EnforcedStyleAlignWith`'
171
+ },
172
+ {
173
+ cop: 'Rails/UniqBeforePluck',
174
+ parameter: 'EnforcedMode',
175
+ alternative: '`EnforcedMode` has been renamed to ' \
176
+ '`EnforcedStyle`'
177
+ }
178
+ ].freeze
179
+
44
180
  attr_reader :loaded_path
45
181
 
46
182
  def initialize(hash = {}, loaded_path = nil)
47
183
  @loaded_path = loaded_path
48
184
  @for_cop = Hash.new do |h, cop|
49
- h[cop] = self[Cop::Cop.qualified_cop_name(cop, loaded_path)] || {}
185
+ qualified_cop_name = Cop::Cop.qualified_cop_name(cop, loaded_path)
186
+ cop_options = self[qualified_cop_name] || {}
187
+ cop_options['Enabled'] = enable_cop?(qualified_cop_name, cop_options)
188
+ h[cop] = cop_options
189
+ end
190
+ @hash = hash
191
+ end
192
+
193
+ def self.create(hash, path)
194
+ new(hash, path).check
195
+ end
196
+
197
+ def check
198
+ deprecation_check do |deprecation_message|
199
+ warn("#{loaded_path} - #{deprecation_message}")
50
200
  end
51
- replace(hash)
201
+ validate
202
+ make_excludes_absolute
203
+ self
204
+ end
205
+
206
+ def [](key)
207
+ @hash[key]
208
+ end
209
+
210
+ def []=(key, value)
211
+ @hash[key] = value
212
+ end
213
+
214
+ def delete(key)
215
+ @hash.delete(key)
216
+ end
217
+
218
+ def each(&block)
219
+ @hash.each(&block)
220
+ end
221
+
222
+ def key?(key)
223
+ @hash.key?(key)
224
+ end
225
+
226
+ def keys
227
+ @hash.keys
228
+ end
229
+
230
+ def each_key(&block)
231
+ @hash.each_key(&block)
232
+ end
233
+
234
+ def map(&block)
235
+ @hash.map(&block)
236
+ end
237
+
238
+ def merge(other_hash)
239
+ @hash.merge(other_hash)
240
+ end
241
+
242
+ def to_h
243
+ @hash
244
+ end
245
+
246
+ def to_hash
247
+ @hash
248
+ end
249
+
250
+ def to_s
251
+ @to_s ||= @hash.to_s
52
252
  end
53
253
 
54
254
  def make_excludes_absolute
@@ -80,7 +280,7 @@ module RuboCop
80
280
  end
81
281
 
82
282
  def deprecation_check
83
- %w(Exclude Include).each do |key|
283
+ %w[Exclude Include].each do |key|
84
284
  plural = "#{key}s"
85
285
  next unless for_all_cops[plural]
86
286
 
@@ -98,26 +298,6 @@ module RuboCop
98
298
  @for_all_cops ||= self['AllCops'] || {}
99
299
  end
100
300
 
101
- def cop_enabled?(cop)
102
- department = cop.cop_type.to_s.capitalize!
103
-
104
- if (dept_config = self[department])
105
- return false if dept_config['Enabled'] == false
106
- end
107
-
108
- for_cop(cop).empty? || for_cop(cop)['Enabled']
109
- end
110
-
111
- def add_missing_namespaces
112
- keys.each do |k|
113
- q = Cop::Cop.qualified_cop_name(k, loaded_path)
114
- next if q == k
115
-
116
- self[q] = self[k]
117
- delete(k)
118
- end
119
- end
120
-
121
301
  def validate
122
302
  # Don't validate RuboCop's own files. Avoids infinite recursion.
123
303
  base_config_path = File.expand_path(File.join(ConfigLoader::RUBOCOP_HOME,
@@ -128,12 +308,13 @@ module RuboCop
128
308
  ConfigLoader.default_configuration.key?(key)
129
309
  end
130
310
 
131
- reject_obsolete_cops
311
+ reject_obsolete_cops_and_parameters
132
312
  warn_about_unrecognized_cops(invalid_cop_names)
133
- reject_obsolete_parameters
134
313
  check_target_ruby
135
314
  validate_parameter_names(valid_cop_names)
136
315
  validate_enforced_styles(valid_cop_names)
316
+ validate_syntax_cop
317
+ reject_mutually_exclusive_defaults
137
318
  end
138
319
 
139
320
  def file_to_include?(file)
@@ -156,7 +337,9 @@ module RuboCop
156
337
  # Returns true if there's a chance that an Include pattern matches hidden
157
338
  # files, false if that's definitely not possible.
158
339
  def possibly_include_hidden?
159
- @possibly_include_hidden ||= patterns_to_include.any? do |s|
340
+ return @possibly_include_hidden if defined?(@possibly_include_hidden)
341
+
342
+ @possibly_include_hidden = patterns_to_include.any? do |s|
160
343
  s.is_a?(Regexp) || s.start_with?('.') || s.include?('/.')
161
344
  end
162
345
  end
@@ -169,26 +352,25 @@ module RuboCop
169
352
  end
170
353
 
171
354
  def patterns_to_include
172
- @patterns_to_include ||= for_all_cops['Include']
355
+ for_all_cops['Include']
173
356
  end
174
357
 
175
358
  def patterns_to_exclude
176
- @patterns_to_exclude ||= for_all_cops['Exclude']
359
+ for_all_cops['Exclude']
177
360
  end
178
361
 
179
362
  def path_relative_to_config(path)
180
363
  relative_path(path, base_dir_for_path_parameters)
181
364
  end
182
365
 
183
- # Paths specified in .rubocop.yml and .rubocop_todo.yml files are relative
184
- # to the directory where that file is. Paths in other config files are
185
- # relative to the current directory. This is so that paths in
366
+ # Paths specified in configuration files starting with .rubocop are
367
+ # relative to the directory where that file is. Paths in other config files
368
+ # are relative to the current directory. This is so that paths in
186
369
  # config/default.yml, for example, are not relative to RuboCop's config
187
370
  # directory since that wouldn't work.
188
371
  def base_dir_for_path_parameters
189
- config_files = [ConfigLoader::DOTFILE, ConfigLoader::AUTO_GENERATED_FILE]
190
372
  @base_dir_for_path_parameters ||=
191
- if config_files.include?(File.basename(loaded_path)) &&
373
+ if File.basename(loaded_path).start_with?('.rubocop') &&
192
374
  loaded_path != File.join(Dir.home, ConfigLoader::DOTFILE)
193
375
  File.expand_path(File.dirname(loaded_path))
194
376
  else
@@ -202,38 +384,48 @@ module RuboCop
202
384
  @target_ruby_version_source = :rubocop_yml
203
385
 
204
386
  for_all_cops['TargetRubyVersion']
205
- elsif File.file?('.ruby-version') &&
206
- /\A(ruby-)?(?<version>\d+\.\d+)/ =~ File.read('.ruby-version')
207
-
208
- @target_ruby_version_source = :dot_ruby_version
387
+ elsif target_ruby_version_from_version_file
388
+ @target_ruby_version_source = :ruby_version_file
209
389
 
210
- version.to_f
390
+ target_ruby_version_from_version_file
211
391
  else
212
392
  DEFAULT_RUBY_VERSION
213
393
  end
214
394
  end
215
395
 
396
+ def target_rails_version
397
+ @target_rails_version ||=
398
+ for_all_cops.fetch('TargetRailsVersion', DEFAULT_RAILS_VERSION)
399
+ end
400
+
216
401
  private
217
402
 
218
403
  def warn_about_unrecognized_cops(invalid_cop_names)
219
404
  invalid_cop_names.each do |name|
220
- if name == 'Syntax'
221
- raise ValidationError,
222
- "configuration for Syntax cop found in #{loaded_path}\n" \
223
- 'This cop cannot be configured.'
224
- end
225
-
226
405
  # There could be a custom cop with this name. If so, don't warn
227
- next if Cop::Cop.all.any? { |c| c.match?([name]) }
406
+ next if Cop::Cop.registry.contains_cop_matching?([name])
228
407
 
229
408
  warn Rainbow("Warning: unrecognized cop #{name} found in " \
230
- "#{loaded_path}").yellow
409
+ "#{smart_loaded_path}").yellow
231
410
  end
232
411
  end
233
412
 
413
+ def validate_syntax_cop
414
+ syntax_config = self['Lint/Syntax']
415
+ default_config = ConfigLoader.default_configuration['Lint/Syntax']
416
+
417
+ return unless syntax_config &&
418
+ default_config.merge(syntax_config) != default_config
419
+
420
+ raise ValidationError,
421
+ "configuration for Syntax cop found in #{smart_loaded_path}\n" \
422
+ 'It\'s not possible to disable this cop.'
423
+ end
424
+
234
425
  def validate_section_presence(name)
235
426
  return unless key?(name) && self[name].nil?
236
- raise ValidationError, "empty section #{name} found in #{loaded_path}"
427
+ raise ValidationError,
428
+ "empty section #{name} found in #{smart_loaded_path}"
237
429
  end
238
430
 
239
431
  def validate_parameter_names(valid_cop_names)
@@ -244,70 +436,131 @@ module RuboCop
244
436
  ConfigLoader.default_configuration[name].key?(param)
245
437
 
246
438
  warn Rainbow("Warning: unrecognized parameter #{name}:#{param} " \
247
- "found in #{loaded_path}").yellow
439
+ "found in #{smart_loaded_path}").yellow
248
440
  end
249
441
  end
250
442
  end
251
443
 
252
444
  def validate_enforced_styles(valid_cop_names)
253
445
  valid_cop_names.each do |name|
254
- next unless (style = self[name]['EnforcedStyle'])
255
- valid = ConfigLoader.default_configuration[name]['SupportedStyles']
256
- next if valid.include?(style)
257
-
258
- msg = "invalid EnforcedStyle '#{style}' for #{name} found in " \
259
- "#{loaded_path}\n" \
260
- "Valid choices are: #{valid.join(', ')}"
261
- raise ValidationError, msg
446
+ styles = self[name].select { |key, _| key.start_with?('Enforced') }
447
+
448
+ styles.each do |style_name, style|
449
+ supported_key = RuboCop::Cop::Util.to_supported_styles(style_name)
450
+ valid = ConfigLoader.default_configuration[name][supported_key]
451
+ next unless valid
452
+ next if valid.include?(style)
453
+
454
+ msg = "invalid #{style_name} '#{style}' for #{name} found in " \
455
+ "#{smart_loaded_path}\n" \
456
+ "Valid choices are: #{valid.join(', ')}"
457
+ raise ValidationError, msg
458
+ end
262
459
  end
263
460
  end
264
461
 
265
- def reject_obsolete_parameters
266
- check_obsolete_parameter('Style/SpaceAroundOperators',
267
- 'MultiSpaceAllowedForOperators',
268
- 'If your intention was to allow extra spaces ' \
269
- 'for alignment, please use AllowForAlignment: ' \
270
- 'true instead.')
271
- check_obsolete_parameter('AllCops', 'RunRailsCops',
272
- "Use the following configuration instead:\n" \
273
- "Rails:\n Enabled: true")
462
+ def reject_obsolete_cops_and_parameters
463
+ messages = [
464
+ obsolete_cops,
465
+ obsolete_parameters
466
+ ].flatten.compact
467
+ return if messages.empty?
468
+
469
+ raise ValidationError, messages.join("\n")
274
470
  end
275
471
 
276
- def check_obsolete_parameter(cop, parameter, alternative = nil)
277
- if self[cop] && self[cop].key?(parameter)
278
- raise ValidationError, "obsolete parameter #{parameter} (for #{cop}) " \
279
- "found in #{loaded_path}" \
280
- "#{"\n" if alternative}#{alternative}"
472
+ def obsolete_parameters
473
+ OBSOLETE_PARAMETERS.map do |params|
474
+ obsolete_parameter_message(params[:cop], params[:parameter],
475
+ params[:alternative])
281
476
  end
282
477
  end
283
478
 
284
- def reject_obsolete_cops
285
- OBSOLETE_COPS.each do |cop_name, message|
286
- next unless key?(cop_name) || key?(cop_name.split('/').last)
287
- message += "\n(obsolete configuration found in #{loaded_path}, please" \
288
- ' update it)'
289
- raise ValidationError, message
479
+ def obsolete_parameter_message(cop, parameter, alternative)
480
+ return unless self[cop] && self[cop].key?(parameter)
481
+
482
+ "obsolete parameter #{parameter} (for #{cop}) " \
483
+ "found in #{smart_loaded_path}" \
484
+ "\n#{alternative}"
485
+ end
486
+
487
+ def obsolete_cops
488
+ OBSOLETE_COPS.map do |cop_name, message|
489
+ next unless key?(cop_name) || key?(Cop::Badge.parse(cop_name).cop_name)
490
+ message + "\n(obsolete configuration found in #{smart_loaded_path}," \
491
+ ' please update it)'
290
492
  end
291
493
  end
292
494
 
293
495
  def check_target_ruby
294
- return unless target_ruby_version
496
+ return if KNOWN_RUBIES.include?(target_ruby_version)
295
497
 
296
- unless KNOWN_RUBIES.include?(target_ruby_version)
297
- msg = "Unknown Ruby version #{target_ruby_version.inspect} found "
498
+ msg = if OBSOLETE_RUBIES.include?(target_ruby_version)
499
+ "Unsupported Ruby version #{target_ruby_version} found in " \
500
+ "#{target_ruby_source}. #{target_ruby_version}-compatible " \
501
+ 'analysis was dropped after version ' \
502
+ "#{OBSOLETE_RUBIES[target_ruby_version]}."
503
+ else
504
+ "Unknown Ruby version #{target_ruby_version.inspect} found in " \
505
+ "#{target_ruby_source}."
506
+ end
298
507
 
299
- msg +=
300
- case @target_ruby_version_source
301
- when :dot_ruby_version
302
- 'in `.ruby-version`.'
303
- when :rubocop_yml
304
- "in `TargetRubyVersion` parameter (in #{loaded_path})." \
305
- end
508
+ msg += "\nSupported versions: #{KNOWN_RUBIES.join(', ')}"
306
509
 
307
- msg += "\nKnown versions: #{KNOWN_RUBIES.join(', ')}"
510
+ raise ValidationError, msg
511
+ end
512
+
513
+ def target_ruby_source
514
+ case @target_ruby_version_source
515
+ when :ruby_version_file
516
+ "`#{RUBY_VERSION_FILENAME}`"
517
+ when :rubocop_yml
518
+ "`TargetRubyVersion` parameter (in #{smart_loaded_path})"
519
+ end
520
+ end
521
+
522
+ def ruby_version_file
523
+ @ruby_version_file ||=
524
+ PathUtil.find_file_upwards(RUBY_VERSION_FILENAME,
525
+ base_dir_for_path_parameters)
526
+ end
527
+
528
+ def target_ruby_version_from_version_file
529
+ file = ruby_version_file
530
+ return unless file && File.file?(file)
531
+
532
+ @target_ruby_version_from_version_file ||=
533
+ File.read(file).match(/\A(ruby-)?(?<version>\d+\.\d+)/) do |md|
534
+ md[:version].to_f
535
+ end
536
+ end
537
+
538
+ def reject_mutually_exclusive_defaults
539
+ disabled_by_default = for_all_cops['DisabledByDefault']
540
+ enabled_by_default = for_all_cops['EnabledByDefault']
541
+ return unless disabled_by_default && enabled_by_default
542
+
543
+ msg = 'Cops cannot be both enabled by default and disabled by default'
544
+ raise ValidationError, msg
545
+ end
546
+
547
+ def enable_cop?(qualified_cop_name, cop_options)
548
+ cop_department, cop_name = qualified_cop_name.split('/')
549
+ department = cop_name.nil?
308
550
 
309
- raise ValidationError, msg
551
+ unless department
552
+ department_options = self[cop_department]
553
+ if department_options && department_options['Enabled'] == false
554
+ return false
555
+ end
310
556
  end
557
+
558
+ cop_options.fetch('Enabled', true)
559
+ end
560
+
561
+ def smart_loaded_path
562
+ PathUtil.smart_path(@loaded_path)
311
563
  end
312
564
  end
565
+ # rubocop:enable Metrics/ClassLength
313
566
  end