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

Imrpove performance by limitting on_send calls #1117

Merged
merged 1 commit into from Jan 10, 2021
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 @@ -3,6 +3,7 @@
## Master (Unreleased)

* Fix `HooksBeforeExamples`, `LeadingSubject`, `LetBeforeExamples` and `ScatteredLet` autocorrection to take into account inline comments and comments immediately before the moved node. ([@Darhazer][])
* Improve rubocop-rspec performance. ([@Darhazer][])

## 2.1.0 (2020-12-17)

Expand Down
16 changes: 6 additions & 10 deletions lib/rubocop/cop/rspec/any_instance.rb
Expand Up @@ -24,18 +24,14 @@ module RSpec
# end
class AnyInstance < Base
MSG = 'Avoid stubbing using `%<method>s`.'

def_node_matcher :disallowed_stub, <<-PATTERN
(send _ ${:any_instance :allow_any_instance_of :expect_any_instance_of} ...)
PATTERN
RESTRICT_ON_SEND = %i[
any_instance
allow_any_instance_of
expect_any_instance_of
].freeze

def on_send(node)
disallowed_stub(node) do |method|
add_offense(
node,
message: format(MSG, method: method)
)
end
add_offense(node, message: format(MSG, method: node.method_name))
end
end
end
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/be_eql.rb
Expand Up @@ -39,6 +39,7 @@ class BeEql < Base
extend AutoCorrector

MSG = 'Prefer `be` over `eql`.'
RESTRICT_ON_SEND = %i[to].freeze

def_node_matcher :eql_type_with_identity, <<-PATTERN
(send _ :to $(send nil? :eql {true false int float sym nil_type?}))
Expand Down
2 changes: 2 additions & 0 deletions lib/rubocop/cop/rspec/before_after_all.rb
Expand Up @@ -29,6 +29,8 @@ class BeforeAfterAll < Base
'`use_transactional_fixtures` is enabled, then records created ' \
'in `%<hook>s` are not automatically rolled back.'

RESTRICT_ON_SEND = %i[before after].freeze

def_node_matcher :before_or_after_all, <<-PATTERN
$(send _ {:before :after} (sym {:all :context}))
PATTERN
Expand Down
2 changes: 2 additions & 0 deletions lib/rubocop/cop/rspec/capybara/current_path_expectation.rb
Expand Up @@ -30,6 +30,8 @@ class CurrentPathExpectation < Base
'Capybara feature specs - instead, use the ' \
'`have_current_path` matcher on `page`'

RESTRICT_ON_SEND = %i[expect].freeze

def_node_matcher :expectation_set_on_current_path, <<-PATTERN
(send nil? :expect (send {(send nil? :page) nil?} :current_path))
PATTERN
Expand Down
2 changes: 2 additions & 0 deletions lib/rubocop/cop/rspec/capybara/visibility_matcher.rb
Expand Up @@ -44,6 +44,8 @@ class VisibilityMatcher < Base
have_content
].freeze

RESTRICT_ON_SEND = CAPYBARA_MATCHER_METHODS

def_node_matcher :visible_true?, <<~PATTERN
(send nil? #capybara_matcher? ... (hash <$(pair (sym :visible) true) ...>))
PATTERN
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/describe_symbol.rb
Expand Up @@ -19,6 +19,7 @@ module RSpec
# @see https://github.com/rspec/rspec-core/issues/1610
class DescribeSymbol < Base
MSG = 'Avoid describing symbols.'
RESTRICT_ON_SEND = %i[describe].freeze

def_node_matcher :describe_symbol?, <<-PATTERN
(send #rspec? :describe $sym ...)
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb
Expand Up @@ -25,6 +25,7 @@ class FactoryClassName < Base
MSG = "Pass '%<class_name>s' string instead of `%<class_name>s` " \
'constant.'
ALLOWED_CONSTANTS = %w[Hash OpenStruct].freeze
RESTRICT_ON_SEND = %i[factory].freeze

def_node_matcher :class_name, <<~PATTERN
(send _ :factory _ (hash <(pair (sym :class) $(const ...)) ...>))
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/implicit_block_expectation.rb
Expand Up @@ -18,6 +18,7 @@ module RSpec
# end
class ImplicitBlockExpectation < Base
MSG = 'Avoid implicit block expectations.'
RESTRICT_ON_SEND = %i[is_expected should should_not].freeze

def_node_matcher :lambda?, <<-PATTERN
{
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/implicit_subject.rb
Expand Up @@ -31,6 +31,7 @@ class ImplicitSubject < Base
include ConfigurableEnforcedStyle

MSG = "Don't use implicit subject."
RESTRICT_ON_SEND = %i[is_expected should should_not].freeze

def_node_matcher :implicit_subject?, <<-PATTERN
(send nil? {:should :should_not :is_expected} ...)
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/it_behaves_like.rb
Expand Up @@ -24,6 +24,7 @@ class ItBehavesLike < Base

MSG = 'Prefer `%<replacement>s` over `%<original>s` when including ' \
'examples in a nested context.'
RESTRICT_ON_SEND = %i[it_behaves_like it_should_behave_like].freeze

def_node_matcher :example_inclusion_offense, '(send _ % ...)'

Expand Down
14 changes: 4 additions & 10 deletions lib/rubocop/cop/rspec/message_chain.rb
Expand Up @@ -15,18 +15,12 @@ module RSpec
#
class MessageChain < Base
MSG = 'Avoid stubbing using `%<method>s`.'

def_node_matcher :message_chain, <<-PATTERN
(send _ {:receive_message_chain :stub_chain} ...)
PATTERN
RESTRICT_ON_SEND = %i[receive_message_chain stub_chain].freeze

def on_send(node)
message_chain(node) do
add_offense(
node.loc.selector,
message: format(MSG, method: node.method_name)
)
end
add_offense(
node.loc.selector, message: format(MSG, method: node.method_name)
)
end
end
end
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/not_to_not.rb
Expand Up @@ -20,6 +20,7 @@ class NotToNot < Base
include ConfigurableEnforcedStyle

MSG = 'Prefer `%<replacement>s` over `%<original>s`.'
RESTRICT_ON_SEND = %i[not_to to_not].freeze

def_node_matcher :not_to_not_offense, '(send _ % ...)'

Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/rails/http_status.rb
Expand Up @@ -33,6 +33,7 @@ module Rails
class HttpStatus < Base
extend AutoCorrector
include ConfigurableEnforcedStyle
RESTRICT_ON_SEND = %i[have_http_status].freeze

def_node_matcher :http_status, <<-PATTERN
(send nil? :have_http_status ${int sym})
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/receive_never.rb
Expand Up @@ -16,6 +16,7 @@ module RSpec
class ReceiveNever < Base
extend AutoCorrector
MSG = 'Use `not_to receive` instead of `never`.'
RESTRICT_ON_SEND = %i[never].freeze

def_node_search :method_on_stub?, '(send nil? :receive ...)'

Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/return_from_stub.rb
Expand Up @@ -39,6 +39,7 @@ class ReturnFromStub < Base

MSG_AND_RETURN = 'Use `and_return` for static values.'
MSG_BLOCK = 'Use block for static values.'
RESTRICT_ON_SEND = %i[and_return].freeze

def_node_search :contains_stub?, '(send nil? :receive (...))'
def_node_matcher :stub_with_block?, '(block #contains_stub? ...)'
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/single_argument_message_chain.rb
Expand Up @@ -21,6 +21,7 @@ class SingleArgumentMessageChain < Base

MSG = 'Use `%<recommended>s` instead of calling ' \
'`%<called>s` with a single argument.'
RESTRICT_ON_SEND = %i[receive_message_chain stub_chain].freeze

def_node_matcher :message_chain, <<-PATTERN
(send _ {:receive_message_chain :stub_chain} $_)
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/unspecified_exception.rb
Expand Up @@ -32,6 +32,7 @@ module RSpec
# expect { do_something }.not_to raise_error
class UnspecifiedException < Base
MSG = 'Specify the exception being captured'
RESTRICT_ON_SEND = %i[to].freeze

def_node_matcher :empty_raise_error_or_exception, <<-PATTERN
(send
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/verified_doubles.rb
Expand Up @@ -24,6 +24,7 @@ module RSpec
# end
class VerifiedDoubles < Base
MSG = 'Prefer using verifying doubles over normal doubles.'
RESTRICT_ON_SEND = %i[double spy].freeze

def_node_matcher :unverified_double, <<-PATTERN
{(send nil? {:double :spy} $...)}
Expand Down
1 change: 1 addition & 0 deletions lib/rubocop/cop/rspec/void_expect.rb
Expand Up @@ -14,6 +14,7 @@ module RSpec
class VoidExpect < Base
MSG = 'Do not use `expect()` without `.to` or `.not_to`. ' \
'Chain the methods or remove it.'
RESTRICT_ON_SEND = %i[expect].freeze

def_node_matcher :expect?, <<-PATTERN
(send nil? :expect ...)
Expand Down