rubocop 0.82.0 → 0.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -19
  3. data/config/default.yml +111 -23
  4. data/lib/rubocop.rb +16 -59
  5. data/lib/rubocop/ast_aliases.rb +8 -0
  6. data/lib/rubocop/cli.rb +3 -3
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -2
  8. data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +2 -6
  10. data/lib/rubocop/comment_config.rb +1 -1
  11. data/lib/rubocop/config.rb +6 -2
  12. data/lib/rubocop/config_loader.rb +19 -24
  13. data/lib/rubocop/config_loader_resolver.rb +45 -6
  14. data/lib/rubocop/config_store.rb +12 -2
  15. data/lib/rubocop/config_validator.rb +2 -1
  16. data/lib/rubocop/cop/autocorrect_logic.rb +1 -2
  17. data/lib/rubocop/cop/bundler/gem_comment.rb +70 -1
  18. data/lib/rubocop/cop/commissioner.rb +0 -21
  19. data/lib/rubocop/cop/cop.rb +36 -21
  20. data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -6
  21. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +1 -1
  22. data/lib/rubocop/cop/correctors/space_corrector.rb +1 -3
  23. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -3
  24. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
  25. data/lib/rubocop/cop/generator.rb +4 -3
  26. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  27. data/lib/rubocop/cop/ignored_node.rb +1 -3
  28. data/lib/rubocop/cop/layout/case_indentation.rb +3 -3
  29. data/lib/rubocop/cop/layout/class_structure.rb +19 -16
  30. data/lib/rubocop/cop/layout/comment_indentation.rb +3 -3
  31. data/lib/rubocop/cop/layout/condition_position.rb +12 -2
  32. data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
  33. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -6
  34. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +128 -0
  35. data/lib/rubocop/cop/layout/end_of_line.rb +3 -3
  36. data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -4
  37. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +1 -3
  38. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
  39. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -3
  40. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  41. data/lib/rubocop/cop/layout/hash_alignment.rb +7 -7
  42. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -7
  43. data/lib/rubocop/cop/layout/heredoc_indentation.rb +20 -103
  44. data/lib/rubocop/cop/layout/indentation_width.rb +1 -3
  45. data/lib/rubocop/cop/layout/line_length.rb +21 -18
  46. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  47. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -3
  48. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
  49. data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
  50. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  51. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -3
  52. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -2
  53. data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
  54. data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
  55. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +2 -4
  56. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  57. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
  58. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -3
  59. data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
  60. data/lib/rubocop/cop/lint/ambiguous_operator.rb +41 -0
  61. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
  62. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  63. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  64. data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
  65. data/lib/rubocop/cop/lint/empty_when.rb +29 -6
  66. data/lib/rubocop/cop/lint/ensure_return.rb +19 -2
  67. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -3
  68. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  69. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +38 -2
  70. data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
  71. data/lib/rubocop/cop/lint/loop.rb +1 -1
  72. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  73. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  74. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +7 -7
  75. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +33 -11
  76. data/lib/rubocop/cop/lint/percent_string_array.rb +2 -4
  77. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  78. data/lib/rubocop/cop/lint/raise_exception.rb +12 -4
  79. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +5 -8
  80. data/lib/rubocop/cop/lint/redundant_require_statement.rb +3 -3
  81. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
  82. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  83. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  84. data/lib/rubocop/cop/lint/suppressed_exception.rb +11 -4
  85. data/lib/rubocop/cop/lint/syntax.rb +1 -3
  86. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  87. data/lib/rubocop/cop/lint/useless_access_modifier.rb +13 -3
  88. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
  89. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -1
  90. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  91. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +35 -3
  92. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  93. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  94. data/lib/rubocop/cop/migration/department_name.rb +7 -7
  95. data/lib/rubocop/cop/mixin/alignment.rb +1 -3
  96. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -3
  97. data/lib/rubocop/cop/mixin/check_line_breakable.rb +3 -9
  98. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -3
  99. data/lib/rubocop/cop/mixin/configurable_formatting.rb +2 -4
  100. data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
  101. data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
  102. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  103. data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
  104. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +10 -1
  105. data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -1
  106. data/lib/rubocop/cop/mixin/ignored_pattern.rb +1 -1
  107. data/lib/rubocop/cop/mixin/line_length_help.rb +3 -2
  108. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  109. data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
  110. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
  111. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
  112. data/lib/rubocop/cop/mixin/range_help.rb +1 -1
  113. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
  114. data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -23
  115. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  116. data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
  117. data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
  118. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  119. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +3 -3
  120. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  121. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +11 -1
  122. data/lib/rubocop/cop/naming/file_name.rb +28 -17
  123. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
  124. data/lib/rubocop/cop/naming/method_name.rb +1 -5
  125. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  126. data/lib/rubocop/cop/registry.rb +63 -10
  127. data/lib/rubocop/cop/severity.rb +1 -3
  128. data/lib/rubocop/cop/style/and_or.rb +2 -2
  129. data/lib/rubocop/cop/style/array_join.rb +1 -1
  130. data/lib/rubocop/cop/style/attr.rb +1 -3
  131. data/lib/rubocop/cop/style/bare_percent_literals.rb +2 -2
  132. data/lib/rubocop/cop/style/block_delimiters.rb +4 -12
  133. data/lib/rubocop/cop/style/case_equality.rb +1 -1
  134. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  135. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  136. data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
  137. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -4
  138. data/lib/rubocop/cop/style/copyright.rb +5 -5
  139. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
  140. data/lib/rubocop/cop/style/documentation.rb +2 -2
  141. data/lib/rubocop/cop/style/double_negation.rb +41 -4
  142. data/lib/rubocop/cop/style/empty_case_condition.rb +8 -6
  143. data/lib/rubocop/cop/style/empty_literal.rb +1 -3
  144. data/lib/rubocop/cop/style/empty_method.rb +1 -5
  145. data/lib/rubocop/cop/style/encoding.rb +1 -1
  146. data/lib/rubocop/cop/style/exponential_notation.rb +5 -5
  147. data/lib/rubocop/cop/style/format_string_token.rb +2 -3
  148. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -6
  149. data/lib/rubocop/cop/style/guard_clause.rb +25 -2
  150. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -1
  151. data/lib/rubocop/cop/style/hash_syntax.rb +16 -7
  152. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  153. data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
  154. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
  155. data/lib/rubocop/cop/style/inline_comment.rb +1 -1
  156. data/lib/rubocop/cop/style/inverse_methods.rb +1 -1
  157. data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
  158. data/lib/rubocop/cop/style/lambda_call.rb +0 -20
  159. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +1 -3
  160. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -3
  161. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  162. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  163. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  164. data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
  165. data/lib/rubocop/cop/style/negated_if.rb +3 -3
  166. data/lib/rubocop/cop/style/negated_unless.rb +3 -3
  167. data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
  168. data/lib/rubocop/cop/style/next.rb +2 -2
  169. data/lib/rubocop/cop/style/non_nil_check.rb +1 -1
  170. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
  171. data/lib/rubocop/cop/style/one_line_conditional.rb +2 -6
  172. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  173. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  174. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -3
  175. data/lib/rubocop/cop/style/redundant_fetch_block.rb +103 -0
  176. data/lib/rubocop/cop/style/redundant_parentheses.rb +3 -7
  177. data/lib/rubocop/cop/style/redundant_percent_q.rb +3 -3
  178. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
  179. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
  180. data/lib/rubocop/cop/style/redundant_self.rb +6 -9
  181. data/lib/rubocop/cop/style/safe_navigation.rb +2 -6
  182. data/lib/rubocop/cop/style/sample.rb +1 -1
  183. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  184. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  185. data/lib/rubocop/cop/style/special_global_vars.rb +2 -6
  186. data/lib/rubocop/cop/style/struct_inheritance.rb +21 -0
  187. data/lib/rubocop/cop/style/symbol_array.rb +5 -5
  188. data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -4
  189. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +3 -3
  190. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +3 -3
  191. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +13 -13
  192. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +3 -3
  193. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -3
  194. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  195. data/lib/rubocop/cop/style/when_then.rb +1 -1
  196. data/lib/rubocop/cop/style/word_array.rb +1 -1
  197. data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
  198. data/lib/rubocop/cop/team.rb +69 -25
  199. data/lib/rubocop/cop/util.rb +27 -3
  200. data/lib/rubocop/cop/utils/format_string.rb +18 -0
  201. data/lib/rubocop/cop/variable_force.rb +3 -9
  202. data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
  203. data/lib/rubocop/cop/variable_force/branch.rb +1 -3
  204. data/lib/rubocop/cop/variable_force/scope.rb +1 -0
  205. data/lib/rubocop/cop/variable_force/variable.rb +3 -6
  206. data/lib/rubocop/ext/processed_source.rb +18 -0
  207. data/lib/rubocop/formatter/base_formatter.rb +0 -4
  208. data/lib/rubocop/formatter/disabled_config_formatter.rb +5 -13
  209. data/lib/rubocop/formatter/formatter_set.rb +2 -4
  210. data/lib/rubocop/formatter/junit_formatter.rb +14 -4
  211. data/lib/rubocop/magic_comment.rb +1 -1
  212. data/lib/rubocop/name_similarity.rb +18 -9
  213. data/lib/rubocop/options.rb +26 -11
  214. data/lib/rubocop/path_util.rb +2 -2
  215. data/lib/rubocop/platform.rb +1 -1
  216. data/lib/rubocop/remote_config.rb +1 -3
  217. data/lib/rubocop/result_cache.rb +5 -7
  218. data/lib/rubocop/rspec/cop_helper.rb +2 -25
  219. data/lib/rubocop/rspec/expect_offense.rb +58 -15
  220. data/lib/rubocop/rspec/shared_contexts.rb +54 -16
  221. data/lib/rubocop/runner.rb +20 -13
  222. data/lib/rubocop/target_finder.rb +8 -8
  223. data/lib/rubocop/target_ruby.rb +4 -1
  224. data/lib/rubocop/version.rb +5 -3
  225. metadata +51 -74
  226. data/lib/rubocop/ast/builder.rb +0 -85
  227. data/lib/rubocop/ast/node.rb +0 -637
  228. data/lib/rubocop/ast/node/alias_node.rb +0 -24
  229. data/lib/rubocop/ast/node/and_node.rb +0 -29
  230. data/lib/rubocop/ast/node/args_node.rb +0 -29
  231. data/lib/rubocop/ast/node/array_node.rb +0 -70
  232. data/lib/rubocop/ast/node/block_node.rb +0 -121
  233. data/lib/rubocop/ast/node/break_node.rb +0 -17
  234. data/lib/rubocop/ast/node/case_match_node.rb +0 -56
  235. data/lib/rubocop/ast/node/case_node.rb +0 -56
  236. data/lib/rubocop/ast/node/class_node.rb +0 -31
  237. data/lib/rubocop/ast/node/def_node.rb +0 -82
  238. data/lib/rubocop/ast/node/defined_node.rb +0 -17
  239. data/lib/rubocop/ast/node/ensure_node.rb +0 -17
  240. data/lib/rubocop/ast/node/float_node.rb +0 -12
  241. data/lib/rubocop/ast/node/for_node.rb +0 -53
  242. data/lib/rubocop/ast/node/forward_args_node.rb +0 -18
  243. data/lib/rubocop/ast/node/hash_node.rb +0 -109
  244. data/lib/rubocop/ast/node/if_node.rb +0 -175
  245. data/lib/rubocop/ast/node/int_node.rb +0 -12
  246. data/lib/rubocop/ast/node/keyword_splat_node.rb +0 -45
  247. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +0 -16
  248. data/lib/rubocop/ast/node/mixin/binary_operator_node.rb +0 -43
  249. data/lib/rubocop/ast/node/mixin/collection_node.rb +0 -15
  250. data/lib/rubocop/ast/node/mixin/conditional_node.rb +0 -45
  251. data/lib/rubocop/ast/node/mixin/hash_element_node.rb +0 -125
  252. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +0 -269
  253. data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +0 -114
  254. data/lib/rubocop/ast/node/mixin/modifier_node.rb +0 -17
  255. data/lib/rubocop/ast/node/mixin/numeric_node.rb +0 -21
  256. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +0 -61
  257. data/lib/rubocop/ast/node/mixin/predicate_operator_node.rb +0 -35
  258. data/lib/rubocop/ast/node/module_node.rb +0 -24
  259. data/lib/rubocop/ast/node/or_node.rb +0 -29
  260. data/lib/rubocop/ast/node/pair_node.rb +0 -63
  261. data/lib/rubocop/ast/node/range_node.rb +0 -18
  262. data/lib/rubocop/ast/node/regexp_node.rb +0 -33
  263. data/lib/rubocop/ast/node/resbody_node.rb +0 -24
  264. data/lib/rubocop/ast/node/retry_node.rb +0 -17
  265. data/lib/rubocop/ast/node/return_node.rb +0 -24
  266. data/lib/rubocop/ast/node/self_class_node.rb +0 -24
  267. data/lib/rubocop/ast/node/send_node.rb +0 -13
  268. data/lib/rubocop/ast/node/str_node.rb +0 -16
  269. data/lib/rubocop/ast/node/super_node.rb +0 -21
  270. data/lib/rubocop/ast/node/symbol_node.rb +0 -12
  271. data/lib/rubocop/ast/node/until_node.rb +0 -35
  272. data/lib/rubocop/ast/node/when_node.rb +0 -53
  273. data/lib/rubocop/ast/node/while_node.rb +0 -35
  274. data/lib/rubocop/ast/node/yield_node.rb +0 -21
  275. data/lib/rubocop/ast/sexp.rb +0 -16
  276. data/lib/rubocop/ast/traversal.rb +0 -202
  277. data/lib/rubocop/node_pattern.rb +0 -887
  278. data/lib/rubocop/processed_source.rb +0 -213
  279. data/lib/rubocop/string_util.rb +0 -14
  280. data/lib/rubocop/token.rb +0 -114
@@ -10,6 +10,7 @@ module RuboCop
10
10
  MULTIPLE_LEFT_HAND_SIDE_TYPE = :mlhs
11
11
 
12
12
  attr_reader :node, :variable, :referenced, :references
13
+
13
14
  alias referenced? referenced
14
15
 
15
16
  def initialize(node, variable)
@@ -81,9 +81,7 @@ module RuboCop
81
81
  end
82
82
 
83
83
  def each_ancestor(include_self: false, &block)
84
- unless block_given?
85
- return to_enum(__method__, include_self: include_self)
86
- end
84
+ return to_enum(__method__, include_self: include_self) unless block_given?
87
85
 
88
86
  yield self if include_self
89
87
  scan_ancestors(&block)
@@ -16,6 +16,7 @@ module RuboCop
16
16
  }.freeze
17
17
 
18
18
  attr_reader :node, :variables, :naked_top_level
19
+
19
20
  alias naked_top_level? naked_top_level
20
21
 
21
22
  def initialize(node)
@@ -11,6 +11,7 @@ module RuboCop
11
11
 
12
12
  attr_reader :name, :declaration_node, :scope,
13
13
  :assignments, :references, :captured_by_block
14
+
14
15
  alias captured_by_block? captured_by_block
15
16
 
16
17
  def initialize(name, declaration_node, scope)
@@ -46,9 +47,7 @@ module RuboCop
46
47
  @assignments.reverse_each do |assignment|
47
48
  next if consumed_branches.include?(assignment.branch)
48
49
 
49
- unless assignment.run_exclusively_with?(reference)
50
- assignment.reference!(node)
51
- end
50
+ assignment.reference!(node) unless assignment.run_exclusively_with?(reference)
52
51
 
53
52
  # Modifier if/unless conditions are special. Assignments made in
54
53
  # them do not put the assigned variable in scope to the left of the
@@ -59,9 +58,7 @@ module RuboCop
59
58
 
60
59
  break if !assignment.branch || assignment.branch == reference.branch
61
60
 
62
- unless assignment.branch.may_run_incompletely?
63
- consumed_branches << assignment.branch
64
- end
61
+ consumed_branches << assignment.branch unless assignment.branch.may_run_incompletely?
65
62
  end
66
63
  end
67
64
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Ext
5
+ # Extensions to AST::ProcessedSource for our cached comment_config
6
+ module ProcessedSource
7
+ def comment_config
8
+ @comment_config ||= CommentConfig.new(self)
9
+ end
10
+
11
+ def disabled_line_ranges
12
+ comment_config.cop_disabled_line_ranges
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ RuboCop::ProcessedSource.include RuboCop::Ext::ProcessedSource
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Layout/LineLength
4
-
5
3
  module RuboCop
6
4
  module Formatter
7
5
  # Abstract base class for formatter, implements all public API methods.
@@ -41,8 +39,6 @@ module RuboCop
41
39
  # * `#finished`
42
40
  #
43
41
  class BaseFormatter
44
- # rubocop:enable Layout/LineLength
45
-
46
42
  # @api public
47
43
  #
48
44
  # @!attribute [r] output
@@ -59,9 +59,7 @@ module RuboCop
59
59
  def command
60
60
  command = 'rubocop --auto-gen-config'
61
61
 
62
- if @options[:auto_gen_only_exclude]
63
- command += ' --auto-gen-only-exclude'
64
- end
62
+ command += ' --auto-gen-only-exclude' if @options[:auto_gen_only_exclude]
65
63
 
66
64
  if @exclude_limit_option
67
65
  command +=
@@ -70,15 +68,13 @@ module RuboCop
70
68
  end
71
69
  command += ' --no-offense-counts' if @options[:no_offense_counts]
72
70
 
73
- if @options[:no_auto_gen_timestamp]
74
- command += ' --no-auto-gen-timestamp'
75
- end
71
+ command += ' --no-auto-gen-timestamp' if @options[:no_auto_gen_timestamp]
76
72
 
77
73
  command
78
74
  end
79
75
 
80
76
  def timestamp
81
- @options[:no_auto_gen_timestamp] ? '' : "on #{Time.now} "
77
+ @options[:no_auto_gen_timestamp] ? '' : "on #{Time.now.utc} "
82
78
  end
83
79
 
84
80
  def output_offenses
@@ -116,14 +112,10 @@ module RuboCop
116
112
  end
117
113
 
118
114
  def output_cop_comments(output_buffer, cfg, cop_name, offense_count)
119
- if @show_offense_counts
120
- output_buffer.puts "# Offense count: #{offense_count}"
121
- end
115
+ output_buffer.puts "# Offense count: #{offense_count}" if @show_offense_counts
122
116
 
123
117
  cop_class = Cop::Cop.registry.find_by_cop_name(cop_name)
124
- if cop_class&.new&.support_autocorrect?
125
- output_buffer.puts '# Cop supports --auto-correct.'
126
- end
118
+ output_buffer.puts '# Cop supports --auto-correct.' if cop_class&.new&.support_autocorrect?
127
119
 
128
120
  default_cfg = default_config(cop_name)
129
121
  return unless default_cfg
@@ -82,14 +82,12 @@ module RuboCop
82
82
 
83
83
  def builtin_formatter_class(specified_key)
84
84
  matching_keys = BUILTIN_FORMATTERS_FOR_KEYS.keys.select do |key|
85
- key =~ /^\[#{specified_key}\]/ || specified_key == key.delete('[]')
85
+ /^\[#{specified_key}\]/.match?(key) || specified_key == key.delete('[]')
86
86
  end
87
87
 
88
88
  raise %(No formatter for "#{specified_key}") if matching_keys.empty?
89
89
 
90
- if matching_keys.size > 1
91
- raise %(Cannot determine formatter for "#{specified_key}")
92
- end
90
+ raise %(Cannot determine formatter for "#{specified_key}") if matching_keys.size > 1
93
91
 
94
92
  BUILTIN_FORMATTERS_FOR_KEYS[matching_keys.first]
95
93
  end
@@ -35,19 +35,29 @@ module RuboCop
35
35
  #
36
36
  # In the future, it would be preferable to return only enabled cops.
37
37
  Cop::Cop.all.each do |cop|
38
+ target_offenses = offenses_for_cop(offenses, cop)
39
+
40
+ next unless relevant_for_output?(options, target_offenses)
41
+
38
42
  REXML::Element.new('testcase', @testsuite).tap do |testcase|
39
43
  testcase.attributes['classname'] = classname_attribute_value(file)
40
44
  testcase.attributes['name'] = cop.cop_name
41
45
 
42
- target_offenses = offenses.select do |offense|
43
- offense.cop_name == cop.cop_name
44
- end
45
-
46
46
  add_failure_to(testcase, target_offenses, cop.cop_name)
47
47
  end
48
48
  end
49
49
  end
50
50
 
51
+ def relevant_for_output?(options, target_offenses)
52
+ !options[:display_only_failed] || target_offenses.any?
53
+ end
54
+
55
+ def offenses_for_cop(all_offenses, cop)
56
+ all_offenses.select do |offense|
57
+ offense.cop_name == cop.cop_name
58
+ end
59
+ end
60
+
51
61
  def classname_attribute_value(file)
52
62
  file.gsub(/\.rb\Z/, '').gsub("#{Dir.pwd}/", '').tr('/', '.')
53
63
  end
@@ -133,7 +133,7 @@ module RuboCop
133
133
  # @see https://www.gnu.org/software/emacs/manual/html_node/emacs/Specify-Coding.html
134
134
  # @see https://git.io/vMCXh Emacs handling in Ruby's parse.y
135
135
  class EmacsComment < EditorComment
136
- FORMAT = /\-\*\-(.+)\-\*\-/.freeze
136
+ FORMAT = /-\*-(.+)-\*-/.freeze
137
137
  SEPARATOR = ';'
138
138
  OPERATOR = ':'
139
139
 
@@ -3,19 +3,28 @@
3
3
  module RuboCop
4
4
  # Common functionality for finding names that are similar to a given name.
5
5
  module NameSimilarity
6
- MINIMUM_SIMILARITY_TO_SUGGEST = 0.9
6
+ module_function
7
7
 
8
- def find_similar_name(target_name, scope)
9
- names = collect_variable_like_names(scope)
8
+ def find_similar_name(target_name, names)
9
+ similar_names = find_similar_names(target_name, names)
10
+
11
+ similar_names.first
12
+ end
13
+
14
+ def find_similar_names(target_name, names)
15
+ # DidYouMean::SpellChecker is not available in all versions of Ruby, and
16
+ # even on versions where it *is* available (>= 2.3), it is not always
17
+ # required correctly. So we do a feature check first.
18
+ # See: https://github.com/rubocop-hq/rubocop/issues/7979
19
+ return [] unless defined?(DidYouMean::SpellChecker)
20
+
21
+ names = names.dup
10
22
  names.delete(target_name)
11
23
 
12
- scores = names.each_with_object({}) do |name, hash|
13
- score = StringUtil.similarity(target_name, name)
14
- hash[name] = score if score >= MINIMUM_SIMILARITY_TO_SUGGEST
15
- end
24
+ spell_checker = DidYouMean::SpellChecker.new(dictionary: names)
25
+ similar_names = spell_checker.correct(target_name)
16
26
 
17
- most_similar_name, _max_score = scores.max_by { |_, score| score }
18
- most_similar_name
27
+ similar_names
19
28
  end
20
29
  end
21
30
  end
@@ -83,6 +83,12 @@ module RuboCop
83
83
 
84
84
  def add_cop_selection_csv_option(option, opts)
85
85
  option(opts, "--#{option} [COP1,COP2,...]") do |list|
86
+ unless list
87
+ message = "--#{option} argument should be [COP1,COP2,...]."
88
+
89
+ raise OptionArgumentError, message
90
+ end
91
+
86
92
  @options[:"#{option}"] =
87
93
  if list.empty?
88
94
  ['']
@@ -97,6 +103,7 @@ module RuboCop
97
103
  def add_configuration_options(opts)
98
104
  option(opts, '-c', '--config FILE')
99
105
  option(opts, '--force-exclusion')
106
+ option(opts, '--only-recognized-file-types')
100
107
  option(opts, '--ignore-parent-exclusion')
101
108
  option(opts, '--force-default-config')
102
109
  add_auto_gen_options(opts)
@@ -136,6 +143,8 @@ module RuboCop
136
143
  @options[:output_path] = path
137
144
  end
138
145
  end
146
+
147
+ option(opts, '--display-only-failed')
139
148
  end
140
149
 
141
150
  def add_severity_option(opts)
@@ -241,10 +250,7 @@ module RuboCop
241
250
  def format_message_from(name, cop_names)
242
251
  message = 'Unrecognized cop or department: %<name>s.'
243
252
  message_with_candidate = "%<message>s\nDid you mean? %<candidate>s"
244
- corrections = cop_names.select do |cn|
245
- score = StringUtil.similarity(cn, name)
246
- score >= NameSimilarity::MINIMUM_SIMILARITY_TO_SUGGEST
247
- end.sort
253
+ corrections = NameSimilarity.find_similar_names(name, cop_names)
248
254
 
249
255
  if corrections.empty?
250
256
  format(message, name: name)
@@ -271,9 +277,7 @@ module RuboCop
271
277
  raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot ' \
272
278
  'be used with --only.'
273
279
  end
274
- if except_syntax?
275
- raise OptionArgumentError, 'Syntax checking cannot be turned off.'
276
- end
280
+ raise OptionArgumentError, 'Syntax checking cannot be turned off.' if except_syntax?
277
281
  unless boolean_or_empty_cache?
278
282
  raise OptionArgumentError, '-C/--cache argument must be true or false'
279
283
  end
@@ -284,6 +288,7 @@ module RuboCop
284
288
  end
285
289
  validate_auto_gen_config
286
290
  validate_auto_correct
291
+ validate_display_only_failed
287
292
  validate_parallel
288
293
 
289
294
  return if incompatible_options.size <= 1
@@ -307,13 +312,20 @@ module RuboCop
307
312
  end
308
313
  end
309
314
 
315
+ def validate_display_only_failed
316
+ return unless @options.key?(:display_only_failed)
317
+ return if @options[:format] == 'junit'
318
+
319
+ raise OptionArgumentError,
320
+ format('--display-only-failed can only be used together with --format junit.')
321
+ end
322
+
310
323
  def validate_auto_correct
311
324
  return if @options.key?(:auto_correct)
312
325
  return unless @options.key?(:disable_uncorrectable)
313
326
 
314
327
  raise OptionArgumentError,
315
- format('--%<flag>s can only be used together with --auto-correct.',
316
- flag: '--disable-uncorrectable')
328
+ format('--disable-uncorrectable can only be used together with --auto-correct.')
317
329
  end
318
330
 
319
331
  def validate_parallel
@@ -377,7 +389,6 @@ module RuboCop
377
389
  # This module contains help texts for command line options.
378
390
  module OptionsHelp
379
391
  MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
380
- # rubocop:disable Layout/LineLength
381
392
  FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
382
393
 
383
394
  TEXT = {
@@ -409,6 +420,9 @@ module RuboCop
409
420
  force_exclusion: ['Force excluding files specified in the',
410
421
  'configuration `Exclude` even if they are',
411
422
  'explicitly passed as arguments.'],
423
+ only_recognized_file_types: ['Inspect files given on the command line only if',
424
+ 'they are listed in AllCops/Include parameters',
425
+ 'of user configuration or default configuration.'],
412
426
  ignore_disable_comments: ['Run cops even when they are disabled locally',
413
427
  'with a comment.'],
414
428
  ignore_parent_exclusion: ['Prevent from inheriting AllCops/Exclude from',
@@ -427,6 +441,8 @@ module RuboCop
427
441
  'if no format is specified.'],
428
442
  fail_level: ['Minimum severity (A/R/C/W/E/F) for exit',
429
443
  'with error code.'],
444
+ display_only_failed: ['Only output offense messages. Omit passing',
445
+ 'cops. Only valid for --format junit.'],
430
446
  display_only_fail_level_offenses:
431
447
  ['Only output offense messages at',
432
448
  'the specified --fail-level or above'],
@@ -461,6 +477,5 @@ module RuboCop
461
477
  'reports. This is useful for editor integration.'],
462
478
  init: 'Generate a .rubocop.yml file in the current directory.'
463
479
  }.freeze
464
- # rubocop:enable Layout/LineLength
465
480
  end
466
481
  end
@@ -40,7 +40,7 @@ module RuboCop
40
40
  hidden_file_in_not_hidden_dir?(pattern, path)
41
41
  when Regexp
42
42
  begin
43
- path =~ pattern
43
+ pattern.match?(path)
44
44
  rescue ArgumentError => e
45
45
  return false if e.message.start_with?('invalid byte sequence')
46
46
 
@@ -51,7 +51,7 @@ module RuboCop
51
51
 
52
52
  # Returns true for an absolute Unix or Windows path.
53
53
  def absolute?(path)
54
- path =~ %r{\A([A-Z]:)?/}i
54
+ %r{\A([A-Z]:)?/}i.match?(path)
55
55
  end
56
56
 
57
57
  def self.pwd
@@ -5,7 +5,7 @@ module RuboCop
5
5
  # on.
6
6
  module Platform
7
7
  def self.windows?
8
- RbConfig::CONFIG['host_os'] =~ /cygwin|mswin|mingw|bccwin|wince|emx/
8
+ /cygwin|mswin|mingw|bccwin|wince|emx/.match?(RbConfig::CONFIG['host_os'])
9
9
  end
10
10
  end
11
11
  end
@@ -56,9 +56,7 @@ module RuboCop
56
56
  def generate_request(uri)
57
57
  request = Net::HTTP::Get.new(uri.request_uri)
58
58
 
59
- if cache_path_exists?
60
- request['If-Modified-Since'] = File.stat(cache_path).mtime.rfc2822
61
- end
59
+ request['If-Modified-Since'] = File.stat(cache_path).mtime.rfc2822 if cache_path_exists?
62
60
 
63
61
  yield request
64
62
  end
@@ -33,16 +33,14 @@ module RuboCop
33
33
 
34
34
  def requires_file_removal?(file_count, config_store)
35
35
  file_count > 1 &&
36
- file_count > config_store.for('.').for_all_cops['MaxFilesInCache']
36
+ file_count > config_store.for_dir('.').for_all_cops['MaxFilesInCache']
37
37
  end
38
38
 
39
39
  def remove_oldest_files(files, dirs, cache_root, verbose)
40
40
  # Add 1 to half the number of files, so that we remove the file if
41
41
  # there's only 1 left.
42
42
  remove_count = 1 + files.length / 2
43
- if verbose
44
- puts "Removing the #{remove_count} oldest files from #{cache_root}"
45
- end
43
+ puts "Removing the #{remove_count} oldest files from #{cache_root}" if verbose
46
44
  sorted = files.sort_by { |path| File.mtime(path) }
47
45
  remove_files(sorted, dirs, remove_count)
48
46
  rescue Errno::ENOENT
@@ -62,7 +60,7 @@ module RuboCop
62
60
  end
63
61
 
64
62
  def self.cache_root(config_store)
65
- root = config_store.for('.').for_all_cops['CacheRootDirectory']
63
+ root = config_store.for_dir('.').for_all_cops['CacheRootDirectory']
66
64
  root ||= if ENV.key?('XDG_CACHE_HOME')
67
65
  # Include user ID in the path to make sure the user has write
68
66
  # access.
@@ -74,7 +72,7 @@ module RuboCop
74
72
  end
75
73
 
76
74
  def self.allow_symlinks_in_cache_location?(config_store)
77
- config_store.for('.').for_all_cops['AllowSymlinksInCacheRootDirectory']
75
+ config_store.for_dir('.').for_all_cops['AllowSymlinksInCacheRootDirectory']
78
76
  end
79
77
 
80
78
  def initialize(file, team, options, config_store, cache_root = nil)
@@ -145,7 +143,7 @@ module RuboCop
145
143
  digester = Digest::SHA1.new
146
144
  mode = File.stat(file).mode
147
145
  digester.update(
148
- "#{file}#{mode}#{config_store.for(file).signature}"
146
+ "#{file}#{mode}#{config_store.for_file(file).signature}"
149
147
  )
150
148
  digester.file(file)
151
149
  digester.hexdigest
@@ -48,32 +48,9 @@ module CopHelper
48
48
  corrector.rewrite
49
49
  end
50
50
 
51
- def autocorrect_source_with_loop(source, file = nil)
52
- cnt = 0
53
- loop do
54
- cop.instance_variable_set(:@corrections, [])
55
- new_source = autocorrect_source(source, file)
56
- return new_source if new_source == source
57
-
58
- source = new_source
59
- cnt += 1
60
- if cnt > RuboCop::Runner::MAX_ITERATIONS
61
- raise RuboCop::Runner::InfiniteCorrectionLoop.new(file, [])
62
- end
63
- end
64
- end
65
-
66
51
  def _investigate(cop, processed_source)
67
- forces = RuboCop::Cop::Force.all.each_with_object([]) do |klass, instances|
68
- next unless cop.join_force?(klass)
69
-
70
- instances << klass.new([cop])
71
- end
72
-
73
- commissioner =
74
- RuboCop::Cop::Commissioner.new([cop], forces, raise_error: true)
75
- commissioner.investigate(processed_source)
76
- commissioner
52
+ team = RuboCop::Cop::Team.new([cop], nil, raise_error: true)
53
+ team.inspect_file(processed_source)
77
54
  end
78
55
  end
79
56