Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Require RuboCop 0.90 or higher due to use RESTRICT_ON_SEND #180

Merged
merged 1 commit into from Oct 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -6,6 +6,7 @@

* [#170](https://github.com/rubocop-hq/rubocop-performance/pull/170): Extend `Performance/Sum` to register an offense for `map { ... }.sum`. ([@eugeneius][])
* [#179](https://github.com/rubocop-hq/rubocop-performance/pull/179): Change `Performance/Sum` to warn about empty arrays, and not register an offense on empty array literals. ([@ghiculescu][])
* [#180](https://github.com/rubocop-hq/rubocop-performance/pull/180): Require RuboCop 0.90 or higher. ([@koic][])

## 1.8.1 (2020-09-19)

Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/ancestors_include.rb
Expand Up @@ -18,6 +18,7 @@ class AncestorsInclude < Base
extend AutoCorrector

MSG = 'Use `<=` instead of `ancestors.include?`.'
RESTRICT_ON_SEND = %i[include?].freeze

def_node_matcher :ancestors_include_candidate?, <<~PATTERN
(send (send $_subclass :ancestors) :include? $_superclass)
Expand Down
Expand Up @@ -20,6 +20,7 @@ class BigDecimalWithNumericArgument < Base
extend AutoCorrector

MSG = 'Convert numeric argument to string before passing to `BigDecimal`.'
RESTRICT_ON_SEND = %i[BigDecimal].freeze

def_node_matcher :big_decimal_with_numeric_argument?, <<~PATTERN
(send nil? :BigDecimal $numeric_type? ...)
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/bind_call.rb
Expand Up @@ -28,6 +28,7 @@ class BindCall < Base

MSG = 'Use `bind_call(%<bind_arg>s%<comma>s%<call_args>s)` ' \
'instead of `bind(%<bind_arg>s).call(%<call_args>s)`.'
RESTRICT_ON_SEND = %i[call].freeze

def_node_matcher :bind_with_call_method?, <<~PATTERN
(send
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/caller.rb
Expand Up @@ -23,6 +23,7 @@ class Caller < Base
' instead of `%<method>s[%<m>d]`.'
MSG_FIRST = 'Use `%<method>s(%<n>d..%<n>d).first`' \
' instead of `%<method>s.first`.'
RESTRICT_ON_SEND = %i[first []].freeze

def_node_matcher :slow_caller?, <<~PATTERN
{
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/casecmp.rb
Expand Up @@ -23,6 +23,7 @@ class Casecmp < Base
extend AutoCorrector

MSG = 'Use `%<good>s` instead of `%<bad>s`.'
RESTRICT_ON_SEND = %i[== eql? !=].freeze
CASE_METHODS = %i[downcase upcase].freeze

def_node_matcher :downcase_eq, <<~PATTERN
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/count.rb
Expand Up @@ -42,6 +42,7 @@ class Count < Base
extend AutoCorrector

MSG = 'Use `count` instead of `%<selector>s...%<counter>s`.'
RESTRICT_ON_SEND = %i[count length size].freeze

def_node_matcher :count_candidate?, <<~PATTERN
{
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/delete_prefix.rb
Expand Up @@ -51,6 +51,7 @@ class DeletePrefix < Base
minimum_target_ruby_version 2.5

MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
RESTRICT_ON_SEND = %i[gsub gsub! sub sub!].freeze

PREFERRED_METHODS = {
gsub: :delete_prefix,
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/delete_suffix.rb
Expand Up @@ -51,6 +51,7 @@ class DeleteSuffix < Base
minimum_target_ruby_version 2.5

MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
RESTRICT_ON_SEND = %i[gsub gsub! sub sub!].freeze

PREFERRED_METHODS = {
gsub: :delete_suffix,
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/detect.rb
Expand Up @@ -39,6 +39,7 @@ class Detect < Base
'`%<first_method>s[%<index>i]`.'
INDEX_REVERSE_MSG = 'Use `reverse.%<prefer>s` instead of ' \
'`%<first_method>s[%<index>i]`.'
RESTRICT_ON_SEND = %i[first last []].freeze

def_node_matcher :detect_candidate?, <<~PATTERN
{
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/end_with.rb
Expand Up @@ -47,6 +47,7 @@ class EndWith < Base

MSG = 'Use `String#end_with?` instead of a regex match anchored to ' \
'the end of the string.'
RESTRICT_ON_SEND = %i[match =~ match?].freeze

def_node_matcher :redundant_regex?, <<~PATTERN
{(send $!nil? {:match :=~ :match?} (regexp (str $#literal_at_end?) (regopt)))
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/fixed_size.rb
Expand Up @@ -47,6 +47,7 @@ module Performance
#
class FixedSize < Base
MSG = 'Do not compute the size of statically sized objects.'
RESTRICT_ON_SEND = %i[count length size].freeze

def_node_matcher :counter, <<~MATCHER
(send ${array hash str sym} {:count :length :size} $...)
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/flat_map.rb
Expand Up @@ -19,6 +19,7 @@ class FlatMap < Base
extend AutoCorrector

MSG = 'Use `flat_map` instead of `%<method>s...%<flatten>s`.'
RESTRICT_ON_SEND = %i[flatten flatten!].freeze
FLATTEN_MULTIPLE_LEVELS = ' Beware, `flat_map` only flattens 1 level ' \
'and `flatten` can be used to flatten ' \
'multiple levels.'
Expand Down
2 changes: 2 additions & 0 deletions lib/rubocop/cop/performance/inefficient_hash_search.rb
Expand Up @@ -39,6 +39,8 @@ module Performance
class InefficientHashSearch < Base
extend AutoCorrector

RESTRICT_ON_SEND = %i[include?].freeze

def_node_matcher :inefficient_include?, <<~PATTERN
(send (send $_ {:keys :values}) :include? _)
PATTERN
Expand Down
10 changes: 3 additions & 7 deletions lib/rubocop/cop/performance/io_readlines.rb
Expand Up @@ -29,14 +29,14 @@ class IoReadlines < Base
extend AutoCorrector

MSG = 'Use `%<good>s` instead of `%<bad>s`.'
ENUMERABLE_METHODS = (Enumerable.instance_methods + [:each]).freeze
RESTRICT_ON_SEND = (Enumerable.instance_methods + [:each]).freeze

def_node_matcher :readlines_on_class?, <<~PATTERN
$(send $(send (const nil? {:IO :File}) :readlines ...) #enumerable_method?)
$(send $(send (const nil? {:IO :File}) :readlines ...) _)
PATTERN

def_node_matcher :readlines_on_instance?, <<~PATTERN
$(send $(send ${nil? !const_type?} :readlines ...) #enumerable_method? ...)
$(send $(send ${nil? !const_type?} :readlines ...) _ ...)
PATTERN

def on_send(node)
Expand All @@ -55,10 +55,6 @@ def on_send(node)

private

def enumerable_method?(node)
ENUMERABLE_METHODS.include?(node.to_sym)
end

def autocorrect(corrector, enumerable_call, readlines_call, receiver)
# We cannot safely correct `.readlines` method called on IO/File classes
# due to its signature and we are not sure with implicit receiver
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/open_struct.rb
Expand Up @@ -30,6 +30,7 @@ module Performance
class OpenStruct < Base
MSG = 'Consider using `Struct` over `OpenStruct` ' \
'to optimize the performance.'
RESTRICT_ON_SEND = %i[new].freeze

def_node_matcher :open_struct, <<~PATTERN
(send (const {nil? cbase} :OpenStruct) :new ...)
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/range_include.rb
Expand Up @@ -28,6 +28,7 @@ class RangeInclude < Base
extend AutoCorrector

MSG = 'Use `Range#cover?` instead of `Range#%<bad_method>s`.'
RESTRICT_ON_SEND = %i[include? member?].freeze

# TODO: If we traced out assignments of variables to their uses, we
# might pick up on a few more instances of this issue
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/redundant_match.rb
Expand Up @@ -22,6 +22,7 @@ class RedundantMatch < Base

MSG = 'Use `=~` in places where the `MatchData` returned by ' \
'`#match` will not be used.'
RESTRICT_ON_SEND = %i[match].freeze

# 'match' is a fairly generic name, so we don't flag it unless we see
# a string or regexp literal on one side or the other
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/redundant_merge.rb
Expand Up @@ -29,6 +29,7 @@ class RedundantMerge < Base

AREF_ASGN = '%<receiver>s[%<key>s] = %<value>s'
MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
RESTRICT_ON_SEND = %i[merge!].freeze

WITH_MODIFIER_CORRECTION = <<~RUBY
%<keyword>s %<condition>s
Expand Down
8 changes: 2 additions & 6 deletions lib/rubocop/cop/performance/redundant_string_chars.rb
Expand Up @@ -44,10 +44,10 @@ class RedundantStringChars < Base
extend AutoCorrector

MSG = 'Use `%<good_method>s` instead of `%<bad_method>s`.'
REPLACEABLE_METHODS = %i[[] slice first last take drop length size empty?].freeze
RESTRICT_ON_SEND = %i[[] slice first last take drop length size empty?].freeze

def_node_matcher :redundant_chars_call?, <<~PATTERN
(send $(send _ :chars) $#replaceable_method? $...)
(send $(send _ :chars) $_ $...)
PATTERN

def on_send(node)
Expand All @@ -66,10 +66,6 @@ def on_send(node)

private

def replaceable_method?(method_name)
REPLACEABLE_METHODS.include?(method_name)
end

def offense_range(receiver, node)
range_between(receiver.loc.selector.begin_pos, node.loc.expression.end_pos)
end
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/reverse_each.rb
Expand Up @@ -17,6 +17,7 @@ class ReverseEach < Base
extend AutoCorrector

MSG = 'Use `reverse_each` instead of `reverse.each`.'
RESTRICT_ON_SEND = %i[each].freeze
UNDERSCORE = '_'

def_node_matcher :reverse_each?, <<~MATCHER
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/reverse_first.rb
Expand Up @@ -21,6 +21,7 @@ class ReverseFirst < Base
extend AutoCorrector

MSG = 'Use `%<good_method>s` instead of `%<bad_method>s`.'
RESTRICT_ON_SEND = %i[first].freeze

def_node_matcher :reverse_first_candidate?, <<~PATTERN
(send $(send _ :reverse) :first (int _)?)
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/size.rb
Expand Up @@ -39,6 +39,7 @@ class Size < Base
extend AutoCorrector

MSG = 'Use `size` instead of `count`.'
RESTRICT_ON_SEND = %i[count].freeze

def_node_matcher :array?, <<~PATTERN
{
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/squeeze.rb
Expand Up @@ -22,6 +22,7 @@ class Squeeze < Base
extend AutoCorrector

MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
RESTRICT_ON_SEND = %i[gsub gsub!].freeze

PREFERRED_METHODS = {
gsub: :squeeze,
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/start_with.rb
Expand Up @@ -47,6 +47,7 @@ class StartWith < Base

MSG = 'Use `String#start_with?` instead of a regex match anchored to ' \
'the beginning of the string.'
RESTRICT_ON_SEND = %i[match =~ match?].freeze

def_node_matcher :redundant_regex?, <<~PATTERN
{(send $!nil? {:match :=~ :match?} (regexp (str $#literal_at_start?) (regopt)))
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/string_include.rb
Expand Up @@ -23,6 +23,7 @@ class StringInclude < Base
extend AutoCorrector

MSG = 'Use `String#include?` instead of a regex match with literal-only pattern.'
RESTRICT_ON_SEND = %i[match =~ match?].freeze

def_node_matcher :redundant_regex?, <<~PATTERN
{(send $!nil? {:match :=~ :match?} (regexp (str $#literal?) (regopt)))
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/string_replacement.rb
Expand Up @@ -23,6 +23,7 @@ class StringReplacement < Base
extend AutoCorrector

MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
RESTRICT_ON_SEND = %i[gsub gsub!].freeze
DETERMINISTIC_REGEX = /\A(?:#{LITERAL_REGEX})+\Z/.freeze
DELETE = 'delete'
TR = 'tr'
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/sum.rb
Expand Up @@ -28,6 +28,7 @@ class Sum < Base
MSG = 'Use `%<good_method>s` instead of `%<bad_method>s`.'
MSG_IF_NO_INIT_VALUE =
'Use `%<good_method>s` instead of `%<bad_method>s`, unless calling `%<bad_method>s` on an empty array.'
RESTRICT_ON_SEND = %i[inject reduce sum].freeze

def_node_matcher :sum_candidate?, <<~PATTERN
(send _ ${:inject :reduce} $_init ? ${(sym :+) (block_pass (sym :+))})
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/times_map.rb
Expand Up @@ -23,6 +23,7 @@ class TimesMap < Base
MESSAGE = 'Use `Array.new(%<count>s)` with a block ' \
'instead of `.times.%<map_or_collect>s`'
MESSAGE_ONLY_IF = 'only if `%<count>s` is always 0 or more'
RESTRICT_ON_SEND = %i[map collect].freeze

def on_send(node)
check(node)
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/unfreeze_string.rb
Expand Up @@ -25,6 +25,7 @@ module Performance
# +''
class UnfreezeString < Base
MSG = 'Use unary plus to get an unfrozen string literal.'
RESTRICT_ON_SEND = %i[dup new].freeze

def_node_matcher :dup_string?, <<~PATTERN
(send {str dstr} :dup)
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/performance/uri_default_parser.rb
Expand Up @@ -18,6 +18,7 @@ class UriDefaultParser < Base

MSG = 'Use `%<double_colon>sURI::DEFAULT_PARSER` instead of ' \
'`%<double_colon>sURI::Parser.new`.'
RESTRICT_ON_SEND = %i[new].freeze

def_node_matcher :uri_parser_new?, <<~PATTERN
(send
Expand Down
2 changes: 1 addition & 1 deletion rubocop-performance.gemspec
Expand Up @@ -31,7 +31,7 @@ Gem::Specification.new do |s|
'bug_tracker_uri' => 'https://github.com/rubocop-hq/rubocop-performance/issues'
}

s.add_runtime_dependency('rubocop', '>= 0.87.0')
s.add_runtime_dependency('rubocop', '>= 0.90.0')
s.add_runtime_dependency('rubocop-ast', '>= 0.4.0')
s.add_development_dependency('simplecov')
end