rubocop 0.81.0 → 0.85.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (306) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -17
  3. data/config/default.yml +141 -35
  4. data/lib/rubocop.rb +17 -61
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli.rb +13 -7
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
  8. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  9. data/lib/rubocop/comment_config.rb +1 -1
  10. data/lib/rubocop/config.rb +14 -2
  11. data/lib/rubocop/config_loader.rb +37 -33
  12. data/lib/rubocop/config_loader_resolver.rb +45 -6
  13. data/lib/rubocop/config_obsoletion.rb +1 -0
  14. data/lib/rubocop/config_store.rb +12 -2
  15. data/lib/rubocop/config_validator.rb +18 -1
  16. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  17. data/lib/rubocop/cop/badge.rb +5 -5
  18. data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
  19. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  20. data/lib/rubocop/cop/commissioner.rb +0 -21
  21. data/lib/rubocop/cop/cop.rb +36 -21
  22. data/lib/rubocop/cop/corrector.rb +48 -24
  23. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -8
  24. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
  25. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  26. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +4 -4
  27. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  29. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  30. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
  31. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  32. data/lib/rubocop/cop/generator.rb +4 -3
  33. data/lib/rubocop/cop/ignored_node.rb +1 -3
  34. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
  35. data/lib/rubocop/cop/layout/case_indentation.rb +3 -3
  36. data/lib/rubocop/cop/layout/class_structure.rb +19 -16
  37. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  38. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  39. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  40. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
  41. data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
  42. data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -3
  43. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +14 -10
  44. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  45. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  47. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  48. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -6
  49. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +5 -9
  50. data/lib/rubocop/cop/layout/heredoc_indentation.rb +21 -104
  51. data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
  52. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  53. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  54. data/lib/rubocop/cop/layout/line_length.rb +23 -20
  55. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  56. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  57. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  58. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
  59. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  60. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  61. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
  62. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  63. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
  64. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -3
  65. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
  66. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
  67. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
  68. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  69. data/lib/rubocop/cop/lint/ambiguous_operator.rb +41 -0
  70. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  71. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
  72. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  73. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  74. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  75. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  76. data/lib/rubocop/cop/lint/ensure_return.rb +19 -2
  77. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -3
  78. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +33 -2
  79. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  80. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  81. data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
  82. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  83. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  84. data/lib/rubocop/cop/lint/loop.rb +1 -1
  85. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  86. data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
  87. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  88. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
  89. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
  90. data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
  91. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +33 -11
  92. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
  93. data/lib/rubocop/cop/lint/raise_exception.rb +42 -6
  94. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
  95. data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
  96. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
  97. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  98. data/lib/rubocop/cop/lint/suppressed_exception.rb +11 -4
  99. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  100. data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
  101. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  102. data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
  103. data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
  104. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  105. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -1
  106. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  107. data/lib/rubocop/cop/migration/department_name.rb +7 -7
  108. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  109. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  110. data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
  111. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  112. data/lib/rubocop/cop/mixin/configurable_formatting.rb +2 -4
  113. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
  114. data/lib/rubocop/cop/mixin/hash_transform_method.rb +9 -2
  115. data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
  116. data/lib/rubocop/cop/mixin/line_length_help.rb +3 -2
  117. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  118. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +16 -0
  119. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
  120. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  121. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  122. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +1 -1
  123. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
  124. data/lib/rubocop/cop/naming/constant_name.rb +2 -1
  125. data/lib/rubocop/cop/naming/file_name.rb +27 -14
  126. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  127. data/lib/rubocop/cop/naming/method_name.rb +1 -5
  128. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  129. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
  130. data/lib/rubocop/cop/registry.rb +74 -14
  131. data/lib/rubocop/cop/severity.rb +1 -3
  132. data/lib/rubocop/cop/style/alias.rb +4 -4
  133. data/lib/rubocop/cop/style/and_or.rb +7 -8
  134. data/lib/rubocop/cop/style/array_join.rb +2 -2
  135. data/lib/rubocop/cop/style/attr.rb +1 -3
  136. data/lib/rubocop/cop/style/bare_percent_literals.rb +1 -1
  137. data/lib/rubocop/cop/style/block_delimiters.rb +2 -8
  138. data/lib/rubocop/cop/style/case_equality.rb +24 -1
  139. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  140. data/lib/rubocop/cop/style/conditional_assignment.rb +9 -11
  141. data/lib/rubocop/cop/style/copyright.rb +3 -3
  142. data/lib/rubocop/cop/style/dir.rb +1 -1
  143. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  144. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
  145. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  146. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  147. data/lib/rubocop/cop/style/each_with_object.rb +3 -3
  148. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  149. data/lib/rubocop/cop/style/empty_method.rb +2 -6
  150. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  151. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  152. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  153. data/lib/rubocop/cop/style/format_string.rb +2 -2
  154. data/lib/rubocop/cop/style/format_string_token.rb +2 -3
  155. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
  156. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  157. data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
  158. data/lib/rubocop/cop/style/hash_syntax.rb +19 -12
  159. data/lib/rubocop/cop/style/hash_transform_values.rb +0 -3
  160. data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
  161. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  162. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  163. data/lib/rubocop/cop/style/lambda.rb +2 -2
  164. data/lib/rubocop/cop/style/lambda_call.rb +1 -21
  165. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  166. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  167. data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
  168. data/lib/rubocop/cop/style/module_function.rb +2 -2
  169. data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
  170. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  171. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  172. data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
  173. data/lib/rubocop/cop/style/negated_if.rb +3 -3
  174. data/lib/rubocop/cop/style/negated_unless.rb +3 -3
  175. data/lib/rubocop/cop/style/next.rb +2 -2
  176. data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
  177. data/lib/rubocop/cop/style/non_nil_check.rb +5 -5
  178. data/lib/rubocop/cop/style/not.rb +1 -1
  179. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  180. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  181. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  182. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -7
  183. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  184. data/lib/rubocop/cop/style/or_assignment.rb +1 -1
  185. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  186. data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
  187. data/lib/rubocop/cop/style/proc.rb +1 -1
  188. data/lib/rubocop/cop/style/raise_args.rb +1 -1
  189. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  190. data/lib/rubocop/cop/style/redundant_condition.rb +3 -4
  191. data/lib/rubocop/cop/style/redundant_conditional.rb +5 -4
  192. data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
  193. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  194. data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -6
  195. data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
  196. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
  197. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +130 -0
  198. data/lib/rubocop/cop/style/redundant_return.rb +5 -7
  199. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  200. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  201. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  202. data/lib/rubocop/cop/style/safe_navigation.rb +3 -7
  203. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  204. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  205. data/lib/rubocop/cop/style/special_global_vars.rb +3 -7
  206. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
  207. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
  208. data/lib/rubocop/cop/style/symbol_array.rb +2 -2
  209. data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
  210. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -5
  211. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -3
  212. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +3 -3
  213. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +16 -13
  214. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +3 -3
  215. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -3
  216. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  217. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  218. data/lib/rubocop/cop/style/unpack_first.rb +0 -4
  219. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
  220. data/lib/rubocop/cop/style/when_then.rb +1 -1
  221. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  222. data/lib/rubocop/cop/style/word_array.rb +1 -1
  223. data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
  224. data/lib/rubocop/cop/team.rb +69 -25
  225. data/lib/rubocop/cop/util.rb +25 -1
  226. data/lib/rubocop/cop/utils/format_string.rb +18 -0
  227. data/lib/rubocop/cop/variable_force.rb +3 -9
  228. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  229. data/lib/rubocop/cop/variable_force/branch.rb +1 -3
  230. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  231. data/lib/rubocop/cop/variable_force/variable.rb +3 -6
  232. data/lib/rubocop/ext/processed_source.rb +18 -0
  233. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  234. data/lib/rubocop/formatter/disabled_config_formatter.rb +4 -12
  235. data/lib/rubocop/formatter/formatter_set.rb +1 -4
  236. data/lib/rubocop/formatter/junit_formatter.rb +14 -4
  237. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  238. data/lib/rubocop/magic_comment.rb +1 -1
  239. data/lib/rubocop/name_similarity.rb +12 -9
  240. data/lib/rubocop/options.rb +33 -12
  241. data/lib/rubocop/remote_config.rb +1 -3
  242. data/lib/rubocop/result_cache.rb +5 -7
  243. data/lib/rubocop/rspec/cop_helper.rb +3 -26
  244. data/lib/rubocop/rspec/expect_offense.rb +49 -16
  245. data/lib/rubocop/rspec/shared_contexts.rb +54 -20
  246. data/lib/rubocop/runner.rb +21 -14
  247. data/lib/rubocop/target_finder.rb +7 -7
  248. data/lib/rubocop/target_ruby.rb +5 -2
  249. data/lib/rubocop/version.rb +5 -3
  250. metadata +47 -77
  251. data/lib/rubocop/ast/builder.rb +0 -85
  252. data/lib/rubocop/ast/node.rb +0 -637
  253. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  254. data/lib/rubocop/ast/node/and_node.rb +0 -29
  255. data/lib/rubocop/ast/node/args_node.rb +0 -29
  256. data/lib/rubocop/ast/node/array_node.rb +0 -57
  257. data/lib/rubocop/ast/node/block_node.rb +0 -121
  258. data/lib/rubocop/ast/node/break_node.rb +0 -17
  259. data/lib/rubocop/ast/node/case_match_node.rb +0 -56
  260. data/lib/rubocop/ast/node/case_node.rb +0 -56
  261. data/lib/rubocop/ast/node/class_node.rb +0 -31
  262. data/lib/rubocop/ast/node/def_node.rb +0 -82
  263. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  264. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  265. data/lib/rubocop/ast/node/float_node.rb +0 -12
  266. data/lib/rubocop/ast/node/for_node.rb +0 -53
  267. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  268. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  269. data/lib/rubocop/ast/node/if_node.rb +0 -175
  270. data/lib/rubocop/ast/node/int_node.rb +0 -12
  271. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  272. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  273. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  274. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  275. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  276. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  277. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -261
  278. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  279. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  280. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  281. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  282. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  283. data/lib/rubocop/ast/node/module_node.rb +0 -24
  284. data/lib/rubocop/ast/node/or_node.rb +0 -29
  285. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  286. data/lib/rubocop/ast/node/range_node.rb +0 -18
  287. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  288. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  289. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  290. data/lib/rubocop/ast/node/return_node.rb +0 -24
  291. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  292. data/lib/rubocop/ast/node/send_node.rb +0 -13
  293. data/lib/rubocop/ast/node/str_node.rb +0 -16
  294. data/lib/rubocop/ast/node/super_node.rb +0 -21
  295. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  296. data/lib/rubocop/ast/node/until_node.rb +0 -35
  297. data/lib/rubocop/ast/node/when_node.rb +0 -53
  298. data/lib/rubocop/ast/node/while_node.rb +0 -35
  299. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  300. data/lib/rubocop/ast/sexp.rb +0 -16
  301. data/lib/rubocop/ast/traversal.rb +0 -202
  302. data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
  303. data/lib/rubocop/node_pattern.rb +0 -887
  304. data/lib/rubocop/processed_source.rb +0 -216
  305. data/lib/rubocop/string_util.rb +0 -14
  306. data/lib/rubocop/token.rb +0 -114
@@ -17,10 +17,12 @@ module RuboCop
17
17
  end
18
18
  end
19
19
 
20
+ # rubocop:disable Metrics/MethodLength
20
21
  def resolve_inheritance(path, hash, file, debug)
21
22
  inherited_files = Array(hash['inherit_from'])
22
23
  base_configs(path, inherited_files, file)
23
24
  .reverse.each_with_index do |base_config, index|
25
+ override_department_setting_for_cops(base_config, hash)
24
26
  base_config.each do |k, v|
25
27
  next unless v.is_a?(Hash)
26
28
 
@@ -34,6 +36,7 @@ module RuboCop
34
36
  end
35
37
  end
36
38
  end
39
+ # rubocop:enable Metrics/MethodLength
37
40
 
38
41
  def resolve_inheritance_from_gems(hash)
39
42
  gems = hash.delete('inherit_gem')
@@ -68,9 +71,7 @@ module RuboCop
68
71
  end
69
72
  end
70
73
 
71
- if disabled_by_default
72
- config = handle_disabled_by_default(config, default_configuration)
73
- end
74
+ config = handle_disabled_by_default(config, default_configuration) if disabled_by_default
74
75
 
75
76
  opts = { inherit_mode: config['inherit_mode'] || {},
76
77
  unset_nil: unset_nil }
@@ -100,8 +101,30 @@ module RuboCop
100
101
  end
101
102
  # rubocop:enable Metrics/AbcSize
102
103
 
104
+ # An `Enabled: true` setting in user configuration for a cop overrides an
105
+ # `Enabled: false` setting for its department.
106
+ def override_department_setting_for_cops(base_hash, derived_hash)
107
+ derived_hash.each_key do |key|
108
+ next unless key =~ %r{(.*)/.*}
109
+
110
+ department = Regexp.last_match(1)
111
+ next unless disabled?(derived_hash, department) ||
112
+ disabled?(base_hash, department)
113
+
114
+ # The `override_department` setting for the `Enabled` parameter is an
115
+ # internal setting that's not documented in the manual. It will cause a
116
+ # cop to be enabled later, when logic surrounding enabled/disabled it
117
+ # run, even though its department is disabled.
118
+ derived_hash[key]['Enabled'] = 'override_department' if derived_hash[key]['Enabled']
119
+ end
120
+ end
121
+
103
122
  private
104
123
 
124
+ def disabled?(hash, department)
125
+ hash[department] && hash[department]['Enabled'] == false
126
+ end
127
+
105
128
  def duplicate_setting?(base_hash, derived_hash, key, inherited_file)
106
129
  return false if inherited_file.nil? # Not inheritance resolving merge
107
130
  return false if inherited_file.start_with?('..') # Legitimate override
@@ -148,10 +171,20 @@ module RuboCop
148
171
 
149
172
  def inherited_file(path, inherit_from, file)
150
173
  if remote_file?(inherit_from)
174
+ # A remote configuration, e.g. `inherit_from: http://example.com/rubocop.yml`.
151
175
  RemoteConfig.new(inherit_from, File.dirname(path))
176
+ elsif Pathname.new(inherit_from).absolute?
177
+ # An absolute path to a config, e.g. `inherit_from: /Users/me/rubocop.yml`.
178
+ # The path may come from `inherit_gem` option, where a gem name is expanded
179
+ # to an absolute path to that gem.
180
+ print 'Inheriting ' if ConfigLoader.debug?
181
+ inherit_from
152
182
  elsif file.is_a?(RemoteConfig)
183
+ # A path relative to a URL, e.g. `inherit_from: configs/default.yml`
184
+ # in a config included with `inherit_from: http://example.com/rubocop.yml`
153
185
  file.inherit_from_remote(inherit_from, path)
154
186
  else
187
+ # A local relative path, e.g. `inherit_from: default.yml`
155
188
  print 'Inheriting ' if ConfigLoader.debug?
156
189
  File.expand_path(inherit_from, File.dirname(path))
157
190
  end
@@ -181,12 +214,18 @@ module RuboCop
181
214
  end
182
215
 
183
216
  def transform(config)
184
- Hash[config.map { |cop, params| [cop, yield(params)] }]
217
+ config.transform_values { |params| yield(params) }
185
218
  end
186
219
 
187
220
  def gem_config_path(gem_name, relative_config_path)
188
- spec = Gem::Specification.find_by_name(gem_name)
189
- File.join(spec.gem_dir, relative_config_path)
221
+ if defined?(Bundler)
222
+ gem = Bundler.load.specs[gem_name].first
223
+ gem_path = gem.full_gem_path if gem
224
+ end
225
+
226
+ gem_path ||= Gem::Specification.find_by_name(gem_name).gem_dir
227
+
228
+ File.join(gem_path, relative_config_path)
190
229
  rescue Gem::LoadError => e
191
230
  raise Gem::LoadError,
192
231
  "Unable to find gem #{gem_name}; is the gem installed? #{e}"
@@ -17,6 +17,7 @@ module RuboCop
17
17
  'Layout/IndentHash' => 'Layout/FirstHashElementIndentation',
18
18
  'Layout/IndentHeredoc' => 'Layout/HeredocIndentation',
19
19
  'Layout/LeadingBlankLines' => 'Layout/LeadingEmptyLines',
20
+ 'Layout/Tab' => 'Layout/IndentationStyle',
20
21
  'Layout/TrailingBlankLines' => 'Layout/TrailingEmptyLines',
21
22
  'Lint/DuplicatedKey' => 'Lint/DuplicateHashKey',
22
23
  'Lint/EndInMethod' => 'Style/EndBlock',
@@ -29,14 +29,24 @@ module RuboCop
29
29
  @options_config = ConfigLoader.default_configuration
30
30
  end
31
31
 
32
- def for(file_or_dir)
33
- return @options_config if @options_config
32
+ def for_file(file)
33
+ for_dir(File.dirname(file))
34
+ end
34
35
 
36
+ # If type (file/dir) is known beforehand,
37
+ # prefer using #for_file or #for_dir for improved performance
38
+ def for(file_or_dir)
35
39
  dir = if File.directory?(file_or_dir)
36
40
  file_or_dir
37
41
  else
38
42
  File.dirname(file_or_dir)
39
43
  end
44
+ for_dir(dir)
45
+ end
46
+
47
+ def for_dir(dir)
48
+ return @options_config if @options_config
49
+
40
50
  @path_cache[dir] ||= ConfigLoader.configuration_file_for(dir)
41
51
  path = @path_cache[dir]
42
52
  @object_cache[path] ||= begin
@@ -13,6 +13,7 @@ module RuboCop
13
13
  INTERNAL_PARAMS = %w[Description StyleGuide
14
14
  VersionAdded VersionChanged VersionRemoved
15
15
  Reference Safe SafeAutoCorrect].freeze
16
+ NEW_COPS_VALUES = %w[pending disable enable].freeze
16
17
 
17
18
  def_delegators :@config, :smart_loaded_path, :for_all_cops
18
19
 
@@ -22,6 +23,7 @@ module RuboCop
22
23
  @target_ruby = TargetRuby.new(config)
23
24
  end
24
25
 
26
+ # rubocop:disable Metrics/AbcSize
25
27
  def validate
26
28
  check_cop_config_value(@config)
27
29
  reject_conflicting_safe_settings
@@ -37,11 +39,13 @@ module RuboCop
37
39
 
38
40
  alert_about_unrecognized_cops(invalid_cop_names)
39
41
  check_target_ruby
42
+ validate_new_cops_parameter
40
43
  validate_parameter_names(valid_cop_names)
41
44
  validate_enforced_styles(valid_cop_names)
42
45
  validate_syntax_cop
43
46
  reject_mutually_exclusive_defaults
44
47
  end
48
+ # rubocop:enable Metrics/AbcSize
45
49
 
46
50
  def target_ruby_version
47
51
  target_ruby.version
@@ -107,6 +111,18 @@ module RuboCop
107
111
  'It\'s not possible to disable this cop.'
108
112
  end
109
113
 
114
+ def validate_new_cops_parameter
115
+ new_cop_parameter = @config.for_all_cops['NewCops']
116
+ return if new_cop_parameter.nil? ||
117
+ NEW_COPS_VALUES.include?(new_cop_parameter)
118
+
119
+ message = "invalid #{new_cop_parameter} for `NewCops` found in" \
120
+ "#{smart_loaded_path}\n" \
121
+ "Valid choices are: #{NEW_COPS_VALUES.join(', ')}"
122
+
123
+ raise ValidationError, message
124
+ end
125
+
110
126
  def validate_parameter_names(valid_cop_names)
111
127
  valid_cop_names.each do |name|
112
128
  validate_section_presence(name)
@@ -190,7 +206,8 @@ module RuboCop
190
206
  SafeAutoCorrect
191
207
  AutoCorrect].include?(key) && value.is_a?(String)
192
208
 
193
- next if key == 'Enabled' && value == 'pending'
209
+ next if key == 'Enabled' &&
210
+ %w[pending override_department].include?(value)
194
211
 
195
212
  raise ValidationError, msg_not_boolean(parent, key, value)
196
213
  end
@@ -43,8 +43,7 @@ module RuboCop
43
43
  def disable_offense(node)
44
44
  range = node.location.expression
45
45
  eol_comment = " # rubocop:todo #{cop_name}"
46
- needed_line_length = range.column +
47
- (range.source_line + eol_comment).length
46
+ needed_line_length = (range.source_line + eol_comment).length
48
47
  if needed_line_length <= max_line_length
49
48
  disable_offense_at_end_of_line(range_of_first_line(range),
50
49
  eol_comment)
@@ -4,11 +4,11 @@ module RuboCop
4
4
  module Cop
5
5
  # Identifier of all cops containing a department and cop name.
6
6
  #
7
- # All cops are identified by their badge. For example, the badge
8
- # for `RuboCop::Cop::Layout::Tab` is `Layout/Tab`. Badges can be
9
- # parsed as either `Department/CopName` or just `CopName` to allow
10
- # for badge references in source files that omit the department
11
- # for RuboCop to infer.
7
+ # All cops are identified by their badge. For example, the badge for
8
+ # `RuboCop::Cop::Layout::IndentationStyle` is `Layout/IndentationStyle`.
9
+ # Badges can be parsed as either `Department/CopName` or just `CopName` to
10
+ # allow for badge references in source files that omit the department for
11
+ # RuboCop to infer.
12
12
  class Badge
13
13
  # Error raised when a badge parse fails.
14
14
  class InvalidBadge < Error
@@ -5,7 +5,25 @@ module RuboCop
5
5
  module Bundler
6
6
  # Add a comment describing each gem in your Gemfile.
7
7
  #
8
- # @example
8
+ # Optionally, the "OnlyFor" configuration
9
+ # can be used to only register offenses when the gems
10
+ # use certain options or have version specifiers.
11
+ # Add "version_specifiers" and/or the gem option names
12
+ # you want to check.
13
+ #
14
+ # A useful use-case is to enforce a comment when using
15
+ # options that change the source of a gem:
16
+ #
17
+ # - `bitbucket`
18
+ # - `gist`
19
+ # - `git`
20
+ # - `github`
21
+ # - `source`
22
+ #
23
+ # For a full list of options supported by bundler,
24
+ # you can check the https://bundler.io/man/gemfile.5.html[official documentation].
25
+ #
26
+ # @example OnlyFor: [] (default)
9
27
  # # bad
10
28
  #
11
29
  # gem 'foo'
@@ -15,10 +33,37 @@ module RuboCop
15
33
  # # Helpers for the foo things.
16
34
  # gem 'foo'
17
35
  #
36
+ # @example OnlyFor: ['version_specifiers']
37
+ # # bad
38
+ #
39
+ # gem 'foo', '< 2.1'
40
+ #
41
+ # # good
42
+ #
43
+ # # Version 2.1 introduces breaking change baz
44
+ # gem 'foo', '< 2.1'
45
+ #
46
+ # @example OnlyFor: ['version_specifiers', 'github']
47
+ # # bad
48
+ #
49
+ # gem 'foo', github: 'some_account/some_fork_of_foo'
50
+ #
51
+ # gem 'bar', '< 2.1'
52
+ #
53
+ # # good
54
+ #
55
+ # # Using this fork because baz
56
+ # gem 'foo', github: 'some_account/some_fork_of_foo'
57
+ #
58
+ # # Version 2.1 introduces breaking change baz
59
+ # gem 'bar', '< 2.1'
60
+ #
18
61
  class GemComment < Cop
19
62
  include DefNode
20
63
 
21
64
  MSG = 'Missing gem description comment.'
65
+ CHECKED_OPTIONS_CONFIG = 'OnlyFor'
66
+ VERSION_SPECIFIERS_OPTION = 'version_specifiers'
22
67
 
23
68
  def_node_matcher :gem_declaration?, '(send nil? :gem str ...)'
24
69
 
@@ -26,6 +71,7 @@ module RuboCop
26
71
  return unless gem_declaration?(node)
27
72
  return if ignored_gem?(node)
28
73
  return if commented?(node)
74
+ return if cop_config[CHECKED_OPTIONS_CONFIG].any? && !checked_options_present?(node)
29
75
 
30
76
  add_offense(node)
31
77
  end
@@ -58,6 +104,29 @@ module RuboCop
58
104
  ignored_gems = Array(cop_config['IgnoredGems'])
59
105
  ignored_gems.include?(node.first_argument.value)
60
106
  end
107
+
108
+ def checked_options_present?(node)
109
+ (cop_config[CHECKED_OPTIONS_CONFIG].include?(VERSION_SPECIFIERS_OPTION) &&
110
+ version_specified_gem?(node)) ||
111
+ contains_checked_options?(node)
112
+ end
113
+
114
+ # Besides the gem name, all other *positional* arguments to `gem` are version specifiers,
115
+ # as long as it has one we know there's at least one version specifier.
116
+ def version_specified_gem?(node)
117
+ # arguments[0] is the gem name
118
+ node.arguments[1]&.str_type?
119
+ end
120
+
121
+ def contains_checked_options?(node)
122
+ (Array(cop_config[CHECKED_OPTIONS_CONFIG]) & gem_options(node).map(&:to_s)).any?
123
+ end
124
+
125
+ def gem_options(node)
126
+ return [] unless node.arguments.last&.type == :hash
127
+
128
+ node.arguments.last.keys.map(&:value)
129
+ end
61
130
  end
62
131
  end
63
132
  end
@@ -53,7 +53,7 @@ module RuboCop
53
53
  def autocorrect(node)
54
54
  lambda do |corrector|
55
55
  corrector.replace(
56
- node.first_argument.loc.expression, "'https://rubygems.org'"
56
+ node.first_argument, "'https://rubygems.org'"
57
57
  )
58
58
  end
59
59
  end
@@ -36,7 +36,6 @@ module RuboCop
36
36
 
37
37
  def investigate(processed_source)
38
38
  reset_errors
39
- remove_irrelevant_cops(processed_source.file_path)
40
39
  reset_callbacks
41
40
  prepare(processed_source)
42
41
  invoke_custom_processing(@cops, processed_source)
@@ -63,26 +62,6 @@ module RuboCop
63
62
  @errors = []
64
63
  end
65
64
 
66
- def remove_irrelevant_cops(filename)
67
- @cops.reject! do |cop|
68
- cop.excluded_file?(filename) ||
69
- !support_target_ruby_version?(cop) ||
70
- !support_target_rails_version?(cop)
71
- end
72
- end
73
-
74
- def support_target_ruby_version?(cop)
75
- return true unless cop.class.respond_to?(:support_target_ruby_version?)
76
-
77
- cop.class.support_target_ruby_version?(cop.target_ruby_version)
78
- end
79
-
80
- def support_target_rails_version?(cop)
81
- return true unless cop.class.respond_to?(:support_target_rails_version?)
82
-
83
- cop.class.support_target_rails_version?(cop.target_rails_version)
84
- end
85
-
86
65
  def reset_callbacks
87
66
  @callbacks.clear
88
67
  end
@@ -23,7 +23,7 @@ module RuboCop
23
23
  # # Do custom processing
24
24
  # end
25
25
  # end
26
- class Cop
26
+ class Cop # rubocop:disable Metrics/ClassLength
27
27
  extend RuboCop::AST::Sexp
28
28
  extend NodePattern::Macros
29
29
  include RuboCop::AST::Sexp
@@ -44,22 +44,12 @@ module RuboCop
44
44
  attr_reader :config, :offenses, :corrections
45
45
  attr_accessor :processed_source # TODO: Bad design.
46
46
 
47
- @registry = Registry.new
48
-
49
- class << self
50
- attr_reader :registry
51
- end
52
-
53
- def self.all
54
- registry.without_department(:Test).cops
55
- end
56
-
57
- def self.qualified_cop_name(name, origin)
58
- registry.qualified_cop_name(name, origin)
47
+ def self.inherited(subclass)
48
+ Registry.global.enlist(subclass)
59
49
  end
60
50
 
61
- def self.inherited(subclass)
62
- registry.enlist(subclass)
51
+ def self.exclude_from_registry
52
+ Registry.global.dismiss(self)
63
53
  end
64
54
 
65
55
  def self.badge
@@ -146,17 +136,24 @@ module RuboCop
146
136
  @offenses.any? { |o| o.location == location }
147
137
  end
148
138
 
149
- def correct(node)
139
+ def correct(node) # rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength
150
140
  reason = reason_to_not_correct(node)
151
141
  return reason if reason
152
142
 
153
143
  @corrected_nodes[node] = true
144
+
154
145
  if support_autocorrect?
155
146
  correction = autocorrect(node)
156
- return :uncorrected unless correction
157
147
 
158
- @corrections << Correction.new(correction, node, self)
159
- :corrected
148
+ if correction
149
+ @corrections << Correction.new(correction, node, self)
150
+ :corrected
151
+ elsif disable_uncorrectable?
152
+ disable_uncorrectable(node)
153
+ :corrected_with_todo
154
+ else
155
+ :uncorrected
156
+ end
160
157
  elsif disable_uncorrectable?
161
158
  disable_uncorrectable(node)
162
159
  :corrected_with_todo
@@ -211,8 +208,9 @@ module RuboCop
211
208
  alias name cop_name
212
209
 
213
210
  def relevant_file?(file)
214
- file_name_matches_any?(file, 'Include', true) &&
215
- !file_name_matches_any?(file, 'Exclude', false)
211
+ file == RuboCop::AST::ProcessedSource::STRING_SOURCE_NAME ||
212
+ file_name_matches_any?(file, 'Include', true) &&
213
+ !file_name_matches_any?(file, 'Exclude', false)
216
214
  end
217
215
 
218
216
  def excluded_file?(file)
@@ -238,6 +236,23 @@ module RuboCop
238
236
  nil
239
237
  end
240
238
 
239
+ ### Deprecated registry access
240
+
241
+ # @deprecated Use Registry.global
242
+ def self.registry
243
+ Registry.global
244
+ end
245
+
246
+ # @deprecated Use Registry.all
247
+ def self.all
248
+ Registry.all
249
+ end
250
+
251
+ # @deprecated Use Registry.qualified_cop_name
252
+ def self.qualified_cop_name(name, origin)
253
+ Registry.qualified_cop_name(name, origin)
254
+ end
255
+
241
256
  private
242
257
 
243
258
  def find_message(node, message)