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,6 +17,10 @@ module RuboCop
17
17
  line_source =~ /^\s*#/
18
18
  end
19
19
 
20
+ def comment_lines?(node)
21
+ processed_source[line_range(node)].any? { |line| comment_line?(line) }
22
+ end
23
+
20
24
  def line_range(node)
21
25
  node.first_line..node.last_line
22
26
  end
@@ -26,6 +30,26 @@ module RuboCop
26
30
  node.loc.end.is?(')')
27
31
  end
28
32
 
33
+ def add_parentheses(node, corrector)
34
+ if node.arguments.empty?
35
+ corrector.insert_after(node, '()')
36
+ else
37
+ corrector.replace(args_begin(node), '(')
38
+ corrector.insert_after(args_end(node), ')')
39
+ end
40
+ end
41
+
42
+ def args_begin(node)
43
+ loc = node.loc
44
+ selector =
45
+ node.super_type? || node.yield_type? ? loc.keyword : loc.selector
46
+ selector.end.resize(1)
47
+ end
48
+
49
+ def args_end(node)
50
+ node.loc.expression.end
51
+ end
52
+
29
53
  def on_node(syms, sexp, excludes = [], &block)
30
54
  return to_enum(:on_node, syms, sexp, excludes) unless block_given?
31
55
 
@@ -84,7 +108,7 @@ module RuboCop
84
108
  end
85
109
 
86
110
  def trim_string_interporation_escape_character(str)
87
- str.gsub(/\\\#{(.*?)\}/) { "\#{#{Regexp.last_match(1)}}" }
111
+ str.gsub(/\\\#\{(.*?)\}/) { "\#{#{Regexp.last_match(1)}}" }
88
112
  end
89
113
 
90
114
  def interpret_string_escapes(string)
@@ -97,6 +97,10 @@ module RuboCop
97
97
  @format_sequences ||= parse
98
98
  end
99
99
 
100
+ def valid?
101
+ !mixed_formats?
102
+ end
103
+
100
104
  def named_interpolation?
101
105
  format_sequences.any?(&:name)
102
106
  end
@@ -114,6 +118,20 @@ module RuboCop
114
118
  )
115
119
  end
116
120
  end
121
+
122
+ def mixed_formats?
123
+ formats = format_sequences.map do |seq|
124
+ if seq.name
125
+ :named
126
+ elsif seq.max_digit_dollar_num
127
+ :numbered
128
+ else
129
+ :unnumbered
130
+ end
131
+ end
132
+
133
+ formats.uniq.size > 1
134
+ end
117
135
  end
118
136
  end
119
137
  end
@@ -152,9 +152,7 @@ module RuboCop
152
152
  def process_variable_assignment(node)
153
153
  name = node.children.first
154
154
 
155
- unless variable_table.variable_exist?(name)
156
- variable_table.declare_variable(name, node)
157
- end
155
+ variable_table.declare_variable(name, node) unless variable_table.variable_exist?(name)
158
156
 
159
157
  # Need to scan rhs before assignment so that we can mark previous
160
158
  # assignments as referenced if rhs has referencing to the variable
@@ -211,9 +209,7 @@ module RuboCop
211
209
 
212
210
  name = asgn_node.children.first
213
211
 
214
- unless variable_table.variable_exist?(name)
215
- variable_table.declare_variable(name, asgn_node)
216
- end
212
+ variable_table.declare_variable(name, asgn_node) unless variable_table.variable_exist?(name)
217
213
 
218
214
  # The following statements:
219
215
  #
@@ -369,9 +365,7 @@ module RuboCop
369
365
  AssignmentReference.new(node)
370
366
  when *OPERATOR_ASSIGNMENT_TYPES
371
367
  asgn_node = node.children.first
372
- if asgn_node.lvasgn_type?
373
- VariableReference.new(asgn_node.children.first)
374
- end
368
+ VariableReference.new(asgn_node.children.first) if asgn_node.lvasgn_type?
375
369
  end
376
370
  end
377
371
 
@@ -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,9 +68,7 @@ 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
@@ -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
@@ -11,7 +11,6 @@ module RuboCop
11
11
  BUILTIN_FORMATTERS_FOR_KEYS = {
12
12
  '[a]utogenconf' => AutoGenConfigFormatter,
13
13
  '[c]lang' => ClangStyleFormatter,
14
- '[d]isabled' => DisabledLinesFormatter,
15
14
  '[e]macs' => EmacsStyleFormatter,
16
15
  '[fi]les' => FileListFormatter,
17
16
  '[fu]ubar' => FuubarStyleFormatter,
@@ -88,9 +87,7 @@ module RuboCop
88
87
 
89
88
  raise %(No formatter for "#{specified_key}") if matching_keys.empty?
90
89
 
91
- if matching_keys.size > 1
92
- raise %(Cannot determine formatter for "#{specified_key}")
93
- end
90
+ raise %(Cannot determine formatter for "#{specified_key}") if matching_keys.size > 1
94
91
 
95
92
  BUILTIN_FORMATTERS_FOR_KEYS[matching_keys.first]
96
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
@@ -69,7 +69,7 @@ module RuboCop
69
69
  regex = /#{Regexp.quote(PACMAN)}|#{Regexp.quote(PACDOT)}/
70
70
  @progress_line = @progress_line.sub(regex, character)
71
71
  output.printf("%<line>s\r", line: @progress_line)
72
- return unless @progress_line[-1] =~ /ᗣ|\./
72
+ return unless /ᗣ|\./.match?(@progress_line[-1])
73
73
 
74
74
  @repetitions += 1
75
75
  output.puts
@@ -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,22 @@
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
+ names = names.dup
10
16
  names.delete(target_name)
11
17
 
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
18
+ spell_checker = DidYouMean::SpellChecker.new(dictionary: names)
19
+ similar_names = spell_checker.correct(target_name)
16
20
 
17
- most_similar_name, _max_score = scores.max_by { |_, score| score }
18
- most_similar_name
21
+ similar_names
19
22
  end
20
23
  end
21
24
  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)
@@ -154,6 +163,7 @@ module RuboCop
154
163
  end
155
164
  end
156
165
 
166
+ # rubocop:disable Metrics/MethodLength
157
167
  def add_boolean_flags(opts)
158
168
  option(opts, '-F', '--fail-fast')
159
169
  option(opts, '-C', '--cache FLAG')
@@ -162,6 +172,8 @@ module RuboCop
162
172
  option(opts, '-E', '--extra-details')
163
173
  option(opts, '-S', '--display-style-guide')
164
174
  option(opts, '-a', '--auto-correct')
175
+ option(opts, '--disable-pending-cops')
176
+ option(opts, '--enable-pending-cops')
165
177
  option(opts, '--ignore-disable-comments')
166
178
 
167
179
  option(opts, '--safe')
@@ -172,6 +184,7 @@ module RuboCop
172
184
  option(opts, '-V', '--verbose-version')
173
185
  option(opts, '-P', '--parallel')
174
186
  end
187
+ # rubocop:enable Metrics/MethodLength
175
188
 
176
189
  def add_aliases(opts)
177
190
  option(opts, '-l', '--lint') do
@@ -237,10 +250,7 @@ module RuboCop
237
250
  def format_message_from(name, cop_names)
238
251
  message = 'Unrecognized cop or department: %<name>s.'
239
252
  message_with_candidate = "%<message>s\nDid you mean? %<candidate>s"
240
- corrections = cop_names.select do |cn|
241
- score = StringUtil.similarity(cn, name)
242
- score >= NameSimilarity::MINIMUM_SIMILARITY_TO_SUGGEST
243
- end.sort
253
+ corrections = NameSimilarity.find_similar_names(name, cop_names)
244
254
 
245
255
  if corrections.empty?
246
256
  format(message, name: name)
@@ -267,9 +277,7 @@ module RuboCop
267
277
  raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot ' \
268
278
  'be used with --only.'
269
279
  end
270
- if except_syntax?
271
- raise OptionArgumentError, 'Syntax checking cannot be turned off.'
272
- end
280
+ raise OptionArgumentError, 'Syntax checking cannot be turned off.' if except_syntax?
273
281
  unless boolean_or_empty_cache?
274
282
  raise OptionArgumentError, '-C/--cache argument must be true or false'
275
283
  end
@@ -280,6 +288,7 @@ module RuboCop
280
288
  end
281
289
  validate_auto_gen_config
282
290
  validate_auto_correct
291
+ validate_display_only_failed
283
292
  validate_parallel
284
293
 
285
294
  return if incompatible_options.size <= 1
@@ -303,13 +312,20 @@ module RuboCop
303
312
  end
304
313
  end
305
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
+
306
323
  def validate_auto_correct
307
324
  return if @options.key?(:auto_correct)
308
325
  return unless @options.key?(:disable_uncorrectable)
309
326
 
310
327
  raise OptionArgumentError,
311
- format('--%<flag>s can only be used together with --auto-correct.',
312
- flag: '--disable-uncorrectable')
328
+ format('--disable-uncorrectable can only be used together with --auto-correct.')
313
329
  end
314
330
 
315
331
  def validate_parallel
@@ -362,7 +378,7 @@ module RuboCop
362
378
  end
363
379
 
364
380
  def validate_exclude_limit_option
365
- return if @options[:exclude_limit] =~ /^\d+$/
381
+ return if /^\d+$/.match?(@options[:exclude_limit])
366
382
 
367
383
  # Emulate OptionParser's behavior to make failures consistent regardless
368
384
  # of option order.
@@ -373,7 +389,6 @@ module RuboCop
373
389
  # This module contains help texts for command line options.
374
390
  module OptionsHelp
375
391
  MAX_EXCL = RuboCop::Options::DEFAULT_MAXIMUM_EXCLUSION_ITEMS.to_s
376
- # rubocop:disable Layout/LineLength
377
392
  FORMATTER_OPTION_LIST = RuboCop::Formatter::FormatterSet::BUILTIN_FORMATTERS_FOR_KEYS.keys
378
393
 
379
394
  TEXT = {
@@ -405,6 +420,9 @@ module RuboCop
405
420
  force_exclusion: ['Force excluding files specified in the',
406
421
  'configuration `Exclude` even if they are',
407
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.'],
408
426
  ignore_disable_comments: ['Run cops even when they are disabled locally',
409
427
  'with a comment.'],
410
428
  ignore_parent_exclusion: ['Prevent from inheriting AllCops/Exclude from',
@@ -423,6 +441,8 @@ module RuboCop
423
441
  'if no format is specified.'],
424
442
  fail_level: ['Minimum severity (A/R/C/W/E/F) for exit',
425
443
  'with error code.'],
444
+ display_only_failed: ['Only output offense messages. Omit passing',
445
+ 'cops. Only valid for --format junit.'],
426
446
  display_only_fail_level_offenses:
427
447
  ['Only output offense messages at',
428
448
  'the specified --fail-level or above'],
@@ -438,7 +458,9 @@ module RuboCop
438
458
  debug: 'Display debug info.',
439
459
  display_cop_names: ['Display cop names in offense messages.',
440
460
  'Default is true.'],
461
+ disable_pending_cops: 'Run without pending cops.',
441
462
  display_style_guide: 'Display style guide URLs in offense messages.',
463
+ enable_pending_cops: 'Run with pending cops.',
442
464
  extra_details: 'Display extra details in offense messages.',
443
465
  lint: 'Run only lint cops.',
444
466
  safe: 'Run only safe cops.',
@@ -455,6 +477,5 @@ module RuboCop
455
477
  'reports. This is useful for editor integration.'],
456
478
  init: 'Generate a .rubocop.yml file in the current directory.'
457
479
  }.freeze
458
- # rubocop:enable Layout/LineLength
459
480
  end
460
481
  end