rubocop 1.9.0 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -14
  3. data/assets/output.html.erb +1 -1
  4. data/config/default.yml +70 -17
  5. data/config/obsoletion.yml +4 -0
  6. data/lib/rubocop.rb +5 -0
  7. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  8. data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
  9. data/lib/rubocop/comment_config.rb +43 -94
  10. data/lib/rubocop/config.rb +4 -1
  11. data/lib/rubocop/cop/base.rb +1 -0
  12. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -1
  13. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -0
  14. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -0
  15. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -0
  16. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
  17. data/lib/rubocop/cop/exclude_limit.rb +26 -0
  18. data/lib/rubocop/cop/gemspec/date_assignment.rb +57 -0
  19. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -0
  20. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -0
  21. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +2 -0
  22. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +2 -0
  23. data/lib/rubocop/cop/generator.rb +2 -2
  24. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  25. data/lib/rubocop/cop/internal_affairs/example_description.rb +1 -0
  26. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
  27. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -0
  28. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +151 -0
  29. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  30. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -0
  31. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -0
  32. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -0
  33. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  34. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +3 -0
  35. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +4 -0
  36. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
  37. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +11 -8
  38. data/lib/rubocop/cop/layout/argument_alignment.rb +6 -5
  39. data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
  40. data/lib/rubocop/cop/layout/assignment_indentation.rb +6 -3
  41. data/lib/rubocop/cop/layout/block_alignment.rb +1 -0
  42. data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
  43. data/lib/rubocop/cop/layout/class_structure.rb +1 -0
  44. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +14 -15
  45. data/lib/rubocop/cop/layout/comment_indentation.rb +16 -16
  46. data/lib/rubocop/cop/layout/else_alignment.rb +9 -6
  47. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +20 -3
  48. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +37 -17
  49. data/lib/rubocop/cop/layout/extra_spacing.rb +2 -2
  50. data/lib/rubocop/cop/layout/first_argument_indentation.rb +27 -7
  51. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +9 -6
  52. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +22 -15
  53. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
  54. data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
  55. data/lib/rubocop/cop/layout/indentation_style.rb +27 -30
  56. data/lib/rubocop/cop/layout/indentation_width.rb +20 -9
  57. data/lib/rubocop/cop/layout/line_length.rb +2 -1
  58. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +26 -0
  59. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -5
  60. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
  61. data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
  62. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -1
  63. data/lib/rubocop/cop/layout/space_before_brackets.rb +9 -4
  64. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
  65. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -0
  66. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -0
  67. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +2 -0
  68. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -0
  69. data/lib/rubocop/cop/lint/debugger.rb +60 -14
  70. data/lib/rubocop/cop/lint/deprecated_constants.rb +5 -0
  71. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +14 -4
  72. data/lib/rubocop/cop/lint/duplicate_branch.rb +1 -1
  73. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -0
  74. data/lib/rubocop/cop/lint/duplicate_require.rb +3 -2
  75. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  76. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  77. data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -0
  78. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -0
  79. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +1 -0
  80. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -0
  81. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -0
  82. data/lib/rubocop/cop/lint/multiple_comparison.rb +5 -4
  83. data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -0
  84. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -0
  85. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +7 -0
  86. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -0
  87. data/lib/rubocop/cop/lint/number_conversion.rb +11 -2
  88. data/lib/rubocop/cop/lint/raise_exception.rb +2 -0
  89. data/lib/rubocop/cop/lint/rand_one.rb +1 -0
  90. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -2
  91. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  92. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +1 -0
  93. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +7 -3
  94. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -0
  95. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -0
  96. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -0
  97. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -0
  98. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -0
  99. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -0
  100. data/lib/rubocop/cop/lint/shadowed_argument.rb +1 -0
  101. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -0
  102. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
  103. data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
  104. data/lib/rubocop/cop/lint/symbol_conversion.rb +91 -3
  105. data/lib/rubocop/cop/lint/to_enum_arguments.rb +3 -0
  106. data/lib/rubocop/cop/lint/unified_integer.rb +1 -0
  107. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -0
  108. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -0
  109. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -0
  110. data/lib/rubocop/cop/lint/unused_method_argument.rb +1 -0
  111. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -0
  112. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -0
  113. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -0
  114. data/lib/rubocop/cop/lint/useless_times.rb +3 -0
  115. data/lib/rubocop/cop/message_annotator.rb +4 -1
  116. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  117. data/lib/rubocop/cop/metrics/module_length.rb +1 -0
  118. data/lib/rubocop/cop/metrics/parameter_lists.rb +6 -2
  119. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +6 -4
  120. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +2 -0
  121. data/lib/rubocop/cop/mixin/alignment.rb +10 -3
  122. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  123. data/lib/rubocop/cop/mixin/code_length.rb +3 -1
  124. data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
  125. data/lib/rubocop/cop/mixin/configurable_max.rb +1 -0
  126. data/lib/rubocop/cop/mixin/def_node.rb +1 -0
  127. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  128. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +3 -0
  129. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -0
  130. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -0
  131. data/lib/rubocop/cop/mixin/hash_transform_method.rb +1 -0
  132. data/lib/rubocop/cop/mixin/line_length_help.rb +11 -6
  133. data/lib/rubocop/cop/mixin/method_complexity.rb +4 -1
  134. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +3 -1
  135. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -23
  136. data/lib/rubocop/cop/mixin/negative_conditional.rb +3 -0
  137. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +3 -3
  138. data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
  139. data/lib/rubocop/cop/mixin/safe_assignment.rb +5 -0
  140. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +4 -6
  141. data/lib/rubocop/cop/mixin/visibility_help.rb +1 -0
  142. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -0
  143. data/lib/rubocop/cop/naming/constant_name.rb +2 -0
  144. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +6 -0
  145. data/lib/rubocop/cop/naming/method_name.rb +3 -0
  146. data/lib/rubocop/cop/naming/predicate_name.rb +1 -0
  147. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
  148. data/lib/rubocop/cop/registry.rb +10 -1
  149. data/lib/rubocop/cop/security/eval.rb +1 -0
  150. data/lib/rubocop/cop/security/json_load.rb +1 -0
  151. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  152. data/lib/rubocop/cop/security/open.rb +1 -0
  153. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  154. data/lib/rubocop/cop/style/access_modifier_declarations.rb +3 -2
  155. data/lib/rubocop/cop/style/alias.rb +1 -0
  156. data/lib/rubocop/cop/style/and_or.rb +3 -1
  157. data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -0
  158. data/lib/rubocop/cop/style/array_coercion.rb +2 -0
  159. data/lib/rubocop/cop/style/array_join.rb +1 -0
  160. data/lib/rubocop/cop/style/attr.rb +1 -0
  161. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
  162. data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +62 -0
  163. data/lib/rubocop/cop/style/case_equality.rb +2 -1
  164. data/lib/rubocop/cop/style/case_like_if.rb +15 -4
  165. data/lib/rubocop/cop/style/class_equality_comparison.rb +3 -0
  166. data/lib/rubocop/cop/style/collection_compact.rb +2 -0
  167. data/lib/rubocop/cop/style/colon_method_call.rb +1 -0
  168. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  169. data/lib/rubocop/cop/style/commented_keyword.rb +10 -10
  170. data/lib/rubocop/cop/style/conditional_assignment.rb +2 -0
  171. data/lib/rubocop/cop/style/constant_visibility.rb +28 -0
  172. data/lib/rubocop/cop/style/date_time.rb +3 -0
  173. data/lib/rubocop/cop/style/dir.rb +1 -0
  174. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  175. data/lib/rubocop/cop/style/documentation.rb +30 -3
  176. data/lib/rubocop/cop/style/documentation_method.rb +1 -0
  177. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  178. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -0
  179. data/lib/rubocop/cop/style/each_with_object.rb +1 -0
  180. data/lib/rubocop/cop/style/empty_literal.rb +9 -0
  181. data/lib/rubocop/cop/style/endless_method.rb +1 -0
  182. data/lib/rubocop/cop/style/eval_with_location.rb +90 -28
  183. data/lib/rubocop/cop/style/even_odd.rb +1 -0
  184. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -0
  185. data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -1
  186. data/lib/rubocop/cop/style/exponential_notation.rb +6 -7
  187. data/lib/rubocop/cop/style/float_division.rb +4 -0
  188. data/lib/rubocop/cop/style/format_string.rb +2 -0
  189. data/lib/rubocop/cop/style/format_string_token.rb +1 -0
  190. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +0 -3
  191. data/lib/rubocop/cop/style/global_std_stream.rb +1 -0
  192. data/lib/rubocop/cop/style/hash_conversion.rb +108 -0
  193. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -0
  194. data/lib/rubocop/cop/style/hash_except.rb +1 -0
  195. data/lib/rubocop/cop/style/hash_like_case.rb +1 -0
  196. data/lib/rubocop/cop/style/hash_syntax.rb +16 -15
  197. data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -0
  198. data/lib/rubocop/cop/style/hash_transform_values.rb +4 -0
  199. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +37 -11
  200. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
  201. data/lib/rubocop/cop/style/inverse_methods.rb +2 -0
  202. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +46 -2
  203. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +19 -3
  204. data/lib/rubocop/cop/style/min_max.rb +1 -0
  205. data/lib/rubocop/cop/style/mixin_usage.rb +2 -0
  206. data/lib/rubocop/cop/style/module_function.rb +5 -0
  207. data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -3
  208. data/lib/rubocop/cop/style/multiple_comparison.rb +21 -2
  209. data/lib/rubocop/cop/style/mutable_constant.rb +3 -0
  210. data/lib/rubocop/cop/style/negated_if_else_condition.rb +16 -2
  211. data/lib/rubocop/cop/style/nil_comparison.rb +6 -1
  212. data/lib/rubocop/cop/style/nil_lambda.rb +1 -0
  213. data/lib/rubocop/cop/style/non_nil_check.rb +7 -0
  214. data/lib/rubocop/cop/style/numeric_literals.rb +6 -9
  215. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -1
  216. data/lib/rubocop/cop/style/option_hash.rb +1 -0
  217. data/lib/rubocop/cop/style/or_assignment.rb +2 -0
  218. data/lib/rubocop/cop/style/parallel_assignment.rb +6 -0
  219. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -0
  220. data/lib/rubocop/cop/style/proc.rb +1 -0
  221. data/lib/rubocop/cop/style/random_with_offset.rb +5 -0
  222. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -0
  223. data/lib/rubocop/cop/style/redundant_begin.rb +44 -4
  224. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -0
  225. data/lib/rubocop/cop/style/redundant_exception.rb +2 -0
  226. data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -0
  227. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -0
  228. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -0
  229. data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -0
  230. data/lib/rubocop/cop/style/redundant_return.rb +4 -0
  231. data/lib/rubocop/cop/style/redundant_self.rb +7 -3
  232. data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -0
  233. data/lib/rubocop/cop/style/redundant_sort.rb +1 -0
  234. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -0
  235. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  236. data/lib/rubocop/cop/style/rescue_modifier.rb +17 -14
  237. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -0
  238. data/lib/rubocop/cop/style/return_nil.rb +6 -0
  239. data/lib/rubocop/cop/style/safe_navigation.rb +2 -0
  240. data/lib/rubocop/cop/style/sample.rb +1 -0
  241. data/lib/rubocop/cop/style/signal_exception.rb +3 -0
  242. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
  243. data/lib/rubocop/cop/style/single_line_methods.rb +4 -1
  244. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -0
  245. data/lib/rubocop/cop/style/sole_nested_conditional.rb +20 -4
  246. data/lib/rubocop/cop/style/special_global_vars.rb +3 -3
  247. data/lib/rubocop/cop/style/stderr_puts.rb +1 -0
  248. data/lib/rubocop/cop/style/string_chars.rb +38 -0
  249. data/lib/rubocop/cop/style/string_concatenation.rb +1 -0
  250. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -0
  251. data/lib/rubocop/cop/style/strip.rb +1 -0
  252. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -0
  253. data/lib/rubocop/cop/style/symbol_proc.rb +25 -1
  254. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -0
  255. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +5 -0
  256. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  257. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -0
  258. data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
  259. data/lib/rubocop/cop/style/unpack_first.rb +1 -0
  260. data/lib/rubocop/cop/style/yoda_condition.rb +1 -0
  261. data/lib/rubocop/cop/style/zero_length_predicate.rb +5 -0
  262. data/lib/rubocop/cop/util.rb +4 -1
  263. data/lib/rubocop/directive_comment.rb +69 -9
  264. data/lib/rubocop/ext/regexp_parser.rb +3 -6
  265. data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
  266. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  267. data/lib/rubocop/formatter/simple_text_formatter.rb +2 -1
  268. data/lib/rubocop/formatter/tap_formatter.rb +4 -2
  269. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
  270. data/lib/rubocop/magic_comment.rb +1 -1
  271. data/lib/rubocop/name_similarity.rb +1 -1
  272. data/lib/rubocop/target_finder.rb +1 -0
  273. data/lib/rubocop/target_ruby.rb +21 -13
  274. data/lib/rubocop/version.rb +1 -1
  275. metadata +14 -7
@@ -24,6 +24,7 @@ module RuboCop
24
24
  '`%<receiver>s.unpack(%<format>s)%<method>s`.'
25
25
  RESTRICT_ON_SEND = %i[first [] slice at].freeze
26
26
 
27
+ # @!method unpack_and_first_element?(node)
27
28
  def_node_matcher :unpack_and_first_element?, <<~PATTERN
28
29
  {
29
30
  (send $(send (...) :unpack $(...)) :first)
@@ -72,6 +72,7 @@ module RuboCop
72
72
 
73
73
  PROGRAM_NAMES = %i[$0 $PROGRAM_NAME].freeze
74
74
 
75
+ # @!method file_constant_equal_program_name?(node)
75
76
  def_node_matcher :file_constant_equal_program_name?, <<~PATTERN
76
77
  (send #source_file_path_constant? {:== :!=} (gvar #program_name?))
77
78
  PATTERN
@@ -71,6 +71,7 @@ module RuboCop
71
71
  end
72
72
  end
73
73
 
74
+ # @!method zero_length_predicate(node)
74
75
  def_node_matcher :zero_length_predicate, <<~PATTERN
75
76
  {(send (send (...) ${:length :size}) $:== (int $0))
76
77
  (send (int $0) $:== (send (...) ${:length :size}))
@@ -78,6 +79,7 @@ module RuboCop
78
79
  (send (int $1) $:> (send (...) ${:length :size}))}
79
80
  PATTERN
80
81
 
82
+ # @!method nonzero_length_predicate(node)
81
83
  def_node_matcher :nonzero_length_predicate, <<~PATTERN
82
84
  {(send (send (...) ${:length :size}) ${:> :!=} (int $0))
83
85
  (send (int $0) ${:< :!=} (send (...) ${:length :size}))}
@@ -90,6 +92,7 @@ module RuboCop
90
92
  "!#{other_receiver(node).source}.empty?"
91
93
  end
92
94
 
95
+ # @!method zero_length_receiver(node)
93
96
  def_node_matcher :zero_length_receiver, <<~PATTERN
94
97
  {(send (send $_ _) :== (int 0))
95
98
  (send (int 0) :== (send $_ _))
@@ -97,6 +100,7 @@ module RuboCop
97
100
  (send (int 1) :> (send $_ _))}
98
101
  PATTERN
99
102
 
103
+ # @!method other_receiver(node)
100
104
  def_node_matcher :other_receiver, <<~PATTERN
101
105
  {(send (send $_ _) _ _)
102
106
  (send _ _ (send $_ _))}
@@ -105,6 +109,7 @@ module RuboCop
105
109
  # Some collection like objects in the Ruby standard library
106
110
  # implement `#size`, but not `#empty`. We ignore those to
107
111
  # reduce false positives.
112
+ # @!method non_polymorphic_collection?(node)
108
113
  def_node_matcher :non_polymorphic_collection?, <<~PATTERN
109
114
  {(send (send (send (const {nil? cbase} :File) :stat _) ...) ...)
110
115
  (send (send (send (const {nil? cbase} {:Tempfile :StringIO}) {:new :open} ...) ...) ...)}
@@ -38,7 +38,10 @@ module RuboCop
38
38
  elsif node.arguments.empty?
39
39
  corrector.insert_after(node, '()')
40
40
  else
41
- corrector.replace(args_begin(node), '(')
41
+ args_begin = args_begin(node)
42
+
43
+ corrector.remove(args_begin)
44
+ corrector.insert_before(args_begin, '(')
42
45
  corrector.insert_after(args_end(node), ')')
43
46
  end
44
47
  end
@@ -5,28 +5,88 @@ module RuboCop
5
5
  # special `rubocop:disable` and `rubocop:enable` comment and exposes what
6
6
  # cops it contains.
7
7
  class DirectiveComment
8
- attr_reader :comment
8
+ # @api private
9
+ REDUNDANT_COP = 'Lint/RedundantCopDisableDirective'
10
+ # @api private
11
+ COP_NAME_PATTERN = '([A-Z]\w+/)*(?:[A-Z]\w+)'
12
+ # @api private
13
+ COP_NAMES_PATTERN = "(?:#{COP_NAME_PATTERN} , )*#{COP_NAME_PATTERN}"
14
+ # @api private
15
+ COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
16
+ # @api private
17
+ DIRECTIVE_COMMENT_REGEXP = Regexp.new(
18
+ "# rubocop : ((?:disable|enable|todo))\\b #{COPS_PATTERN}"
19
+ .gsub(' ', '\s*')
20
+ )
21
+
22
+ def self.before_comment(line)
23
+ line.split(DIRECTIVE_COMMENT_REGEXP).first
24
+ end
25
+
26
+ attr_reader :comment, :mode, :cops
9
27
 
10
28
  def initialize(comment)
11
29
  @comment = comment
30
+ @mode, @cops = match_captures
12
31
  end
13
32
 
14
- # Return all the cops specified in the directive
15
- def cops
16
- match = comment.text.match(CommentConfig::COMMENT_DIRECTIVE_REGEXP)
17
- return unless match
18
-
19
- cops_string = match.captures[1]
20
- cops_string.split(/,\s*/).uniq.sort
33
+ # Checks if this directive relates to single line
34
+ def single_line?
35
+ !self.class.before_comment(comment.text).empty?
21
36
  end
22
37
 
23
38
  # Checks if this directive contains all the given cop names
24
39
  def match?(cop_names)
25
- cops == cop_names.uniq.sort
40
+ parsed_cop_names.uniq.sort == cop_names.uniq.sort
26
41
  end
27
42
 
28
43
  def range
29
44
  comment.location.expression
30
45
  end
46
+
47
+ # Returns match captures to directive comment pattern
48
+ def match_captures
49
+ @match_captures ||= comment.text.match(DIRECTIVE_COMMENT_REGEXP)&.captures
50
+ end
51
+
52
+ # Checks if this directive disables cops
53
+ def disabled?
54
+ %w[disable todo].include?(mode)
55
+ end
56
+
57
+ # Checks if this directive enables cops
58
+ def enabled?
59
+ mode == 'enable'
60
+ end
61
+
62
+ # Checks if this directive enables all cops
63
+ def enabled_all?
64
+ !disabled? && all_cops?
65
+ end
66
+
67
+ # Checks if all cops specified in this directive
68
+ def all_cops?
69
+ cops == 'all'
70
+ end
71
+
72
+ # Returns array of specified in this directive cop names
73
+ def cop_names
74
+ @cop_names ||= all_cops? ? all_cop_names : parsed_cop_names
75
+ end
76
+
77
+ # Returns line number for directive
78
+ def line_number
79
+ comment.loc.expression.line
80
+ end
81
+
82
+ private
83
+
84
+ def parsed_cop_names
85
+ (cops || '').split(/,\s*/)
86
+ end
87
+
88
+ def all_cop_names
89
+ Cop::Registry.global.names - [REDUNDANT_COP]
90
+ end
31
91
  end
32
92
  end
@@ -39,9 +39,8 @@ module RuboCop
39
39
 
40
40
  # Shortcut to `loc.expression`
41
41
  def expression
42
- @expression ||= begin
43
- origin.adjust(begin_pos: start_index, end_pos: start_index + full_length)
44
- end
42
+ end_pos = start_index + full_length
43
+ @expression ||= origin.adjust(begin_pos: start_index, end_pos: end_pos)
45
44
  end
46
45
  end
47
46
 
@@ -60,9 +59,7 @@ module RuboCop
60
59
  #
61
60
  # Please open issue if you need other locations
62
61
  def loc
63
- @loc ||= begin
64
- Map.new(expression, **build_location)
65
- end
62
+ @loc ||= Map.new(expression, **build_location)
66
63
  end
67
64
 
68
65
  private
@@ -49,8 +49,10 @@ module RuboCop
49
49
  end
50
50
 
51
51
  def report_highlighted_area(highlighted_area)
52
- output.puts("#{' ' * highlighted_area.begin_pos}" \
53
- "#{'^' * highlighted_area.size}")
52
+ space_area = highlighted_area.source_buffer.slice(0...highlighted_area.begin_pos)
53
+ source_area = highlighted_area.source
54
+ output.puts("#{' ' * Unicode::DisplayWidth.of(space_area)}" \
55
+ "#{'^' * Unicode::DisplayWidth.of(source_area)}")
54
56
  end
55
57
  end
56
58
  end
@@ -63,7 +63,7 @@ module RuboCop
63
63
  # rubocop:enable Metrics/AbcSize
64
64
 
65
65
  def ordered_offense_counts(offense_counts)
66
- Hash[offense_counts.sort_by { |k, v| [-v, k] }]
66
+ offense_counts.sort_by { |k, v| [-v, k] }.to_h
67
67
  end
68
68
 
69
69
  def total_offense_count(offense_counts)
@@ -13,6 +13,7 @@ module RuboCop
13
13
  include PathUtil
14
14
 
15
15
  COLOR_FOR_SEVERITY = {
16
+ info: :gray,
16
17
  refactor: :yellow,
17
18
  convention: :yellow,
18
19
  warning: :magenta,
@@ -76,7 +77,7 @@ module RuboCop
76
77
  end
77
78
 
78
79
  def colored_severity_code(offense)
79
- color = COLOR_FOR_SEVERITY[offense.severity.name]
80
+ color = COLOR_FOR_SEVERITY.fetch(offense.severity.name)
80
81
  colorize(offense.severity.code, color)
81
82
  end
82
83
 
@@ -37,8 +37,10 @@ module RuboCop
37
37
  end
38
38
 
39
39
  def report_highlighted_area(highlighted_area)
40
- output.puts("# #{' ' * highlighted_area.begin_pos}" \
41
- "#{'^' * highlighted_area.size}")
40
+ space_area = highlighted_area.source_buffer.slice(0...highlighted_area.begin_pos)
41
+ source_area = highlighted_area.source
42
+ output.puts("# #{' ' * Unicode::DisplayWidth.of(space_area)}" \
43
+ "#{'^' * Unicode::DisplayWidth.of(source_area)}")
42
44
  end
43
45
 
44
46
  def report_offense(file, offense)
@@ -51,7 +51,7 @@ module RuboCop
51
51
  # rubocop:enable Metrics/AbcSize
52
52
 
53
53
  def ordered_offense_counts(offense_counts)
54
- Hash[offense_counts.sort_by { |k, v| [-v, k] }]
54
+ offense_counts.sort_by { |k, v| [-v, k] }.to_h
55
55
  end
56
56
 
57
57
  def total_offense_count(offense_counts)
@@ -47,7 +47,7 @@ module RuboCop
47
47
  end
48
48
 
49
49
  def valid_shareable_constant_value?
50
- %w[none literal experimental_everything experimental_copy].include?(shareable_constant_values)
50
+ %w[none literal experimental_everything experimental_copy].include?(shareable_constant_value)
51
51
  end
52
52
 
53
53
  # Was a magic comment for the frozen string literal found?
@@ -16,7 +16,7 @@ module RuboCop
16
16
  # DidYouMean::SpellChecker is not available in all versions of Ruby, and
17
17
  # even on versions where it *is* available (>= 2.3), it is not always
18
18
  # required correctly. So we do a feature check first.
19
- # See: https://github.com/rubocop-hq/rubocop/issues/7979
19
+ # See: https://github.com/rubocop/rubocop/issues/7979
20
20
  return [] unless defined?(DidYouMean::SpellChecker)
21
21
 
22
22
  names = names.dup
@@ -96,6 +96,7 @@ module RuboCop
96
96
  end
97
97
 
98
98
  def wanted_dir_patterns(base_dir, exclude_pattern, flags)
99
+ base_dir = base_dir.gsub('/{}/', '/\{}/')
99
100
  dirs = Dir.glob(File.join(base_dir.gsub('/**/', '/\**/'), '*/'), flags)
100
101
  .reject do |dir|
101
102
  dir.end_with?('/./', '/../') || File.fnmatch?(exclude_pattern, dir, flags)
@@ -147,10 +147,12 @@ module RuboCop
147
147
 
148
148
  GEMSPEC_EXTENSION = '.gemspec'
149
149
 
150
+ # @!method required_ruby_version(node)
150
151
  def_node_search :required_ruby_version, <<~PATTERN
151
152
  (send _ :required_ruby_version= $_)
152
153
  PATTERN
153
154
 
155
+ # @!method gem_requirement?(node)
154
156
  def_node_matcher :gem_requirement?, <<~PATTERN
155
157
  (send (const(const _ :Gem):Requirement) :new $str)
156
158
  PATTERN
@@ -165,14 +167,10 @@ module RuboCop
165
167
  file = gemspec_filepath
166
168
  return unless file && File.file?(file)
167
169
 
168
- version = version_from_gemspec_file(file)
169
- return if version.nil?
170
+ right_hand_side = version_from_gemspec_file(file)
171
+ return if right_hand_side.nil?
170
172
 
171
- requirement = version.children.last
172
- return version_from_array(version) if version.array_type?
173
- return version_from_array(requirement) if gem_requirement? version
174
-
175
- version_from_str(version.str_content)
173
+ find_minimal_known_ruby(right_hand_side)
176
174
  end
177
175
 
178
176
  def gemspec_filename
@@ -192,15 +190,25 @@ module RuboCop
192
190
  required_ruby_version(processed_source.ast).first
193
191
  end
194
192
 
193
+ def version_from_right_hand_side(right_hand_side)
194
+ if right_hand_side.array_type?
195
+ version_from_array(right_hand_side)
196
+ elsif gem_requirement?(right_hand_side)
197
+ right_hand_side.children.last.value
198
+ else
199
+ right_hand_side.value
200
+ end
201
+ end
202
+
195
203
  def version_from_array(array)
196
- versions = array.children.map { |v| version_from_str(v.is_a?(String) ? v : v.str_content) }
197
- versions.compact.min
204
+ array.children.map(&:value)
198
205
  end
199
206
 
200
- def version_from_str(str)
201
- str.match(/^(?:>=|<=)?\s*(?<version>\d+(?:\.\d+)*)/) do |md|
202
- md[:version].to_f
203
- end
207
+ def find_minimal_known_ruby(right_hand_side)
208
+ version = version_from_right_hand_side(right_hand_side)
209
+ requirement = Gem::Requirement.new(version)
210
+
211
+ KNOWN_RUBIES.detect { |v| requirement.satisfied_by?(Gem::Version.new("#{v}.99")) }
204
212
  end
205
213
  end
206
214
 
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
- STRING = '1.9.0'
6
+ STRING = '1.12.1'
7
7
 
8
8
  MSG = '%<version>s (using Parser %<parser_version>s, '\
9
9
  'rubocop-ast %<rubocop_ast_version>s, ' \
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2021-01-28 00:00:00.000000000 Z
13
+ date: 2021-04-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parallel
@@ -242,7 +242,9 @@ files:
242
242
  - lib/rubocop/cop/correctors/string_literal_corrector.rb
243
243
  - lib/rubocop/cop/correctors/unused_arg_corrector.rb
244
244
  - lib/rubocop/cop/documentation.rb
245
+ - lib/rubocop/cop/exclude_limit.rb
245
246
  - lib/rubocop/cop/force.rb
247
+ - lib/rubocop/cop/gemspec/date_assignment.rb
246
248
  - lib/rubocop/cop/gemspec/duplicated_assignment.rb
247
249
  - lib/rubocop/cop/gemspec/ordered_dependencies.rb
248
250
  - lib/rubocop/cop/gemspec/required_ruby_version.rb
@@ -256,6 +258,7 @@ files:
256
258
  - lib/rubocop/cop/internal_affairs/example_description.rb
257
259
  - lib/rubocop/cop/internal_affairs/method_name_equal.rb
258
260
  - lib/rubocop/cop/internal_affairs/node_destructuring.rb
261
+ - lib/rubocop/cop/internal_affairs/node_matcher_directive.rb
259
262
  - lib/rubocop/cop/internal_affairs/node_type_predicate.rb
260
263
  - lib/rubocop/cop/internal_affairs/offense_location_keyword.rb
261
264
  - lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb
@@ -598,6 +601,7 @@ files:
598
601
  - lib/rubocop/cop/style/bare_percent_literals.rb
599
602
  - lib/rubocop/cop/style/begin_block.rb
600
603
  - lib/rubocop/cop/style/bisected_attr_accessor.rb
604
+ - lib/rubocop/cop/style/bisected_attr_accessor/macro.rb
601
605
  - lib/rubocop/cop/style/block_comments.rb
602
606
  - lib/rubocop/cop/style/block_delimiters.rb
603
607
  - lib/rubocop/cop/style/case_equality.rb
@@ -654,6 +658,7 @@ files:
654
658
  - lib/rubocop/cop/style/global_vars.rb
655
659
  - lib/rubocop/cop/style/guard_clause.rb
656
660
  - lib/rubocop/cop/style/hash_as_last_array_item.rb
661
+ - lib/rubocop/cop/style/hash_conversion.rb
657
662
  - lib/rubocop/cop/style/hash_each_methods.rb
658
663
  - lib/rubocop/cop/style/hash_except.rb
659
664
  - lib/rubocop/cop/style/hash_like_case.rb
@@ -764,6 +769,7 @@ files:
764
769
  - lib/rubocop/cop/style/stabby_lambda_parentheses.rb
765
770
  - lib/rubocop/cop/style/static_class.rb
766
771
  - lib/rubocop/cop/style/stderr_puts.rb
772
+ - lib/rubocop/cop/style/string_chars.rb
767
773
  - lib/rubocop/cop/style/string_concatenation.rb
768
774
  - lib/rubocop/cop/style/string_hash_keys.rb
769
775
  - lib/rubocop/cop/style/string_literals.rb
@@ -787,6 +793,7 @@ files:
787
793
  - lib/rubocop/cop/style/trailing_underscore_variable.rb
788
794
  - lib/rubocop/cop/style/trivial_accessors.rb
789
795
  - lib/rubocop/cop/style/unless_else.rb
796
+ - lib/rubocop/cop/style/unless_logical_operators.rb
790
797
  - lib/rubocop/cop/style/unpack_first.rb
791
798
  - lib/rubocop/cop/style/variable_interpolation.rb
792
799
  - lib/rubocop/cop/style/when_then.rb
@@ -858,15 +865,15 @@ files:
858
865
  - lib/rubocop/version.rb
859
866
  - lib/rubocop/warning.rb
860
867
  - lib/rubocop/yaml_duplication_checker.rb
861
- homepage: https://github.com/rubocop-hq/rubocop
868
+ homepage: https://github.com/rubocop/rubocop
862
869
  licenses:
863
870
  - MIT
864
871
  metadata:
865
872
  homepage_uri: https://rubocop.org/
866
- changelog_uri: https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md
867
- source_code_uri: https://github.com/rubocop-hq/rubocop/
868
- documentation_uri: https://docs.rubocop.org/rubocop/1.9/
869
- bug_tracker_uri: https://github.com/rubocop-hq/rubocop/issues
873
+ changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
874
+ source_code_uri: https://github.com/rubocop/rubocop/
875
+ documentation_uri: https://docs.rubocop.org/rubocop/1.12/
876
+ bug_tracker_uri: https://github.com/rubocop/rubocop/issues
870
877
  post_install_message:
871
878
  rdoc_options: []
872
879
  require_paths: