brew vendor-gems: commit updates.
This commit is contained in:
parent
6f4101cbb4
commit
4d302199a3
@ -14,13 +14,13 @@ $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ast-2.4.1/lib"
|
||||
$:.unshift "#{path}/"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/extensions/universal-darwin-19/2.6.0/byebug-11.1.3"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/byebug-11.1.3/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/colorize-0.8.1/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/extensions/universal-darwin-19/2.6.0/json-2.3.1"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/json-2.3.1/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/docile-1.3.2/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/simplecov-html-0.12.2/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/simplecov-0.18.5/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/url-0.3.2/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/codecov-0.1.17/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/codecov-0.1.19/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/connection_pool-2.2.3/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/diff-lcs-1.4.4/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/extensions/universal-darwin-19/2.6.0/unf_ext-0.0.7.7"
|
||||
@ -62,7 +62,7 @@ $:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rspec-wait-0.0.9/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-ast-0.1.0/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ruby-progressbar-1.10.1/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/unicode-display_width-1.7.0/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-0.87.0/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-0.87.1/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-performance-1.7.0/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-rspec-1.41.0/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/rubocop-rspec-1.42.0/lib"
|
||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ruby-macho-2.2.0/lib"
|
||||
|
||||
@ -18,34 +18,27 @@ module RuboCop
|
||||
# let(:a) { b }
|
||||
#
|
||||
class AlignLeftLetBrace < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Align left let brace'
|
||||
|
||||
def self.autocorrect_incompatible_with
|
||||
[Layout::ExtraSpacing]
|
||||
end
|
||||
|
||||
def investigate(_processed_source)
|
||||
def on_new_investigation
|
||||
return if processed_source.blank?
|
||||
|
||||
token_aligner.offending_tokens.each do |let|
|
||||
add_offense(let, location: :begin)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(let)
|
||||
lambda do |corrector|
|
||||
corrector.insert_before(
|
||||
let.loc.begin,
|
||||
token_aligner.indent_for(let)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def token_aligner
|
||||
@token_aligner ||=
|
||||
token_aligner =
|
||||
RuboCop::RSpec::AlignLetBrace.new(processed_source.ast, :begin)
|
||||
|
||||
token_aligner.offending_tokens.each do |let|
|
||||
add_offense(let.loc.begin) do |corrector|
|
||||
corrector.insert_before(
|
||||
let.loc.begin, token_aligner.indent_for(let)
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -18,34 +18,27 @@ module RuboCop
|
||||
# let(:a) { b }
|
||||
#
|
||||
class AlignRightLetBrace < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Align right let brace'
|
||||
|
||||
def self.autocorrect_incompatible_with
|
||||
[Layout::ExtraSpacing]
|
||||
end
|
||||
|
||||
def investigate(_processed_source)
|
||||
def on_new_investigation
|
||||
return if processed_source.blank?
|
||||
|
||||
token_aligner.offending_tokens.each do |let|
|
||||
add_offense(let, location: :end)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(let)
|
||||
lambda do |corrector|
|
||||
corrector.insert_before(
|
||||
let.loc.end,
|
||||
token_aligner.indent_for(let)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def token_aligner
|
||||
@token_aligner ||=
|
||||
token_aligner =
|
||||
RuboCop::RSpec::AlignLetBrace.new(processed_source.ast, :end)
|
||||
|
||||
token_aligner.offending_tokens.each do |let|
|
||||
add_offense(let.loc.end) do |corrector|
|
||||
corrector.insert_before(
|
||||
let.loc.end, token_aligner.indent_for(let)
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -28,7 +28,7 @@ module RuboCop
|
||||
|
||||
def on_send(node)
|
||||
be_without_args(node) do |matcher|
|
||||
add_offense(matcher, location: :selector)
|
||||
add_offense(matcher.loc.selector)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -36,6 +36,8 @@ module RuboCop
|
||||
# coerce objects for comparison.
|
||||
#
|
||||
class BeEql < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Prefer `be` over `eql`.'
|
||||
|
||||
def_node_matcher :eql_type_with_identity, <<-PATTERN
|
||||
@ -44,13 +46,11 @@ module RuboCop
|
||||
|
||||
def on_send(node)
|
||||
eql_type_with_identity(node) do |eql|
|
||||
add_offense(eql, location: :selector)
|
||||
add_offense(eql.loc.selector) do |corrector|
|
||||
corrector.replace(eql.loc.selector, 'be')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
->(corrector) { corrector.replace(node.loc.selector, 'be') }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -24,6 +24,8 @@ module RuboCop
|
||||
# expect(page).to have_current_path(/widgets/)
|
||||
#
|
||||
class CurrentPathExpectation < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Do not set an RSpec expectation on `current_path` in ' \
|
||||
'Capybara feature specs - instead, use the ' \
|
||||
'`have_current_path` matcher on `page`'
|
||||
@ -47,30 +49,30 @@ module RuboCop
|
||||
|
||||
def on_send(node)
|
||||
expectation_set_on_current_path(node) do
|
||||
add_offense(node, location: :selector)
|
||||
end
|
||||
end
|
||||
add_offense(node.loc.selector) do |corrector|
|
||||
next unless node.chained?
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
return unless node.chained?
|
||||
|
||||
as_is_matcher(node.parent) do |to_sym, matcher_node|
|
||||
rewrite_expectation(corrector, node, to_sym, matcher_node)
|
||||
end
|
||||
|
||||
regexp_str_matcher(node.parent) do |to_sym, matcher_node, regexp|
|
||||
rewrite_expectation(corrector, node, to_sym, matcher_node)
|
||||
convert_regexp_str_to_literal(corrector, matcher_node, regexp)
|
||||
autocorrect(corrector, node)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def autocorrect(corrector, node)
|
||||
as_is_matcher(node.parent) do |to_sym, matcher_node|
|
||||
rewrite_expectation(corrector, node, to_sym, matcher_node)
|
||||
end
|
||||
|
||||
regexp_str_matcher(node.parent) do |to_sym, matcher_node, regexp|
|
||||
rewrite_expectation(corrector, node, to_sym, matcher_node)
|
||||
convert_regexp_str_to_literal(corrector, matcher_node, regexp)
|
||||
end
|
||||
end
|
||||
|
||||
def rewrite_expectation(corrector, node, to_symbol, matcher_node)
|
||||
current_path_node = node.first_argument
|
||||
corrector.replace(current_path_node.loc.expression, 'page')
|
||||
corrector.replace(current_path_node, 'page')
|
||||
corrector.replace(node.parent.loc.selector, 'to')
|
||||
matcher_method = if to_symbol == :to
|
||||
'have_current_path'
|
||||
@ -84,7 +86,7 @@ module RuboCop
|
||||
def convert_regexp_str_to_literal(corrector, matcher_node, regexp_str)
|
||||
str_node = matcher_node.first_argument
|
||||
regexp_expr = Regexp.new(regexp_str).inspect
|
||||
corrector.replace(str_node.loc.expression, regexp_expr)
|
||||
corrector.replace(str_node, regexp_expr)
|
||||
end
|
||||
|
||||
# `have_current_path` with no options will include the querystring
|
||||
@ -97,7 +99,7 @@ module RuboCop
|
||||
return if %i[regexp str].include?(expectation_last_child.type)
|
||||
|
||||
corrector.insert_after(
|
||||
expectation_last_child.loc.expression,
|
||||
expectation_last_child,
|
||||
', ignore_query: true'
|
||||
)
|
||||
end
|
||||
@ -41,6 +41,8 @@ module RuboCop
|
||||
# end
|
||||
# end
|
||||
class FeatureMethods < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Use `%<replacement>s` instead of `%<method>s`.'
|
||||
|
||||
# https://git.io/v7Kwr
|
||||
@ -71,18 +73,15 @@ module RuboCop
|
||||
feature_method(node) do |send_node, match|
|
||||
next if enabled?(match)
|
||||
|
||||
add_offense(
|
||||
send_node,
|
||||
location: :selector,
|
||||
message: format(MSG, method: match, replacement: MAP[match])
|
||||
)
|
||||
add_offense(send_node.loc.selector) do |corrector|
|
||||
corrector.replace(send_node.loc.selector, MAP[match].to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
corrector.replace(node.loc.selector, MAP[node.method_name].to_s)
|
||||
end
|
||||
def message(range)
|
||||
name = range.source.to_sym
|
||||
format(MSG, method: name, replacement: MAP[name])
|
||||
end
|
||||
|
||||
private
|
||||
@ -24,6 +24,8 @@ module RuboCop
|
||||
# # ...
|
||||
# end
|
||||
class ContextMethod < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Use `describe` for testing methods.'
|
||||
|
||||
def_node_matcher :context_method, <<-PATTERN
|
||||
@ -32,13 +34,9 @@ module RuboCop
|
||||
|
||||
def on_block(node)
|
||||
context_method(node) do |context|
|
||||
add_offense(context)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
corrector.replace(node.parent.loc.selector, 'describe')
|
||||
add_offense(context) do |corrector|
|
||||
corrector.replace(node.send_node.loc.selector, 'describe')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -17,7 +17,7 @@ module RuboCop
|
||||
# # Patterns:
|
||||
# # - '_test.rb$'
|
||||
# # - '(?:^|/)test/'
|
||||
class Cop < ::RuboCop::Cop::Cop
|
||||
class Cop < ::RuboCop::Cop::Base
|
||||
include RuboCop::RSpec::Language
|
||||
include RuboCop::RSpec::Language::NodePattern
|
||||
|
||||
@ -55,6 +55,7 @@ module RuboCop
|
||||
# end
|
||||
#
|
||||
class DescribedClass < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
DESCRIBED_CLASS = 'described_class'
|
||||
@ -85,22 +86,24 @@ module RuboCop
|
||||
return unless body
|
||||
|
||||
find_usage(body) do |match|
|
||||
add_offense(match, message: message(match.const_name))
|
||||
msg = message(match.const_name)
|
||||
add_offense(match, message: msg) do |corrector|
|
||||
autocorrect(corrector, match)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
private
|
||||
|
||||
def autocorrect(corrector, match)
|
||||
replacement = if style == :described_class
|
||||
DESCRIBED_CLASS
|
||||
else
|
||||
@described_class.const_name
|
||||
end
|
||||
lambda do |corrector|
|
||||
corrector.replace(node.loc.expression, replacement)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
corrector.replace(match, replacement)
|
||||
end
|
||||
|
||||
def find_usage(node, &block)
|
||||
yield(node) if offensive?(node)
|
||||
@ -42,6 +42,7 @@ module RuboCop
|
||||
# # ...
|
||||
# end
|
||||
class Dialect < Cop
|
||||
extend AutoCorrector
|
||||
include MethodPreference
|
||||
|
||||
MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
|
||||
@ -52,24 +53,16 @@ module RuboCop
|
||||
return unless rspec_method?(node)
|
||||
return unless preferred_methods[node.method_name]
|
||||
|
||||
add_offense(node)
|
||||
end
|
||||
msg = format(MSG, prefer: preferred_method(node.method_name),
|
||||
current: node.method_name)
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
add_offense(node, message: msg) do |corrector|
|
||||
current = node.loc.selector
|
||||
preferred = preferred_method(current.source)
|
||||
|
||||
corrector.replace(current, preferred)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def message(node)
|
||||
format(MSG, prefer: preferred_method(node.method_name),
|
||||
current: node.method_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -23,6 +23,7 @@ module RuboCop
|
||||
# end
|
||||
# after(:all) { cleanup_feed }
|
||||
class EmptyHook < Cop
|
||||
extend AutoCorrector
|
||||
include RuboCop::Cop::RangeHelp
|
||||
|
||||
MSG = 'Empty hook detected.'
|
||||
@ -33,15 +34,10 @@ module RuboCop
|
||||
|
||||
def on_block(node)
|
||||
empty_hook?(node) do |hook|
|
||||
add_offense(hook)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
block = node.parent
|
||||
range = range_with_surrounding_space(range: block.loc.expression)
|
||||
corrector.remove(range)
|
||||
add_offense(hook) do |corrector|
|
||||
range = range_with_surrounding_space(range: node.loc.expression)
|
||||
corrector.remove(range)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -42,6 +42,7 @@ module RuboCop
|
||||
# end
|
||||
#
|
||||
class EmptyLineAfterExample < Cop
|
||||
extend AutoCorrector
|
||||
include RuboCop::RSpec::BlankLineSeparation
|
||||
|
||||
MSG = 'Add an empty line after `%<example>s`.'
|
||||
@ -52,9 +53,10 @@ module RuboCop
|
||||
return if allowed_one_liner?(node)
|
||||
|
||||
missing_separating_line(node) do |location|
|
||||
add_offense(node,
|
||||
location: location,
|
||||
message: format(MSG, example: node.method_name))
|
||||
msg = format(MSG, example: node.method_name)
|
||||
add_offense(location, message: msg) do |corrector|
|
||||
corrector.insert_after(location.end, "\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -24,6 +24,7 @@ module RuboCop
|
||||
# end
|
||||
#
|
||||
class EmptyLineAfterExampleGroup < Cop
|
||||
extend AutoCorrector
|
||||
include RuboCop::RSpec::BlankLineSeparation
|
||||
|
||||
MSG = 'Add an empty line after `%<example_group>s`.'
|
||||
@ -33,11 +34,10 @@ module RuboCop
|
||||
return if last_child?(node)
|
||||
|
||||
missing_separating_line(node) do |location|
|
||||
add_offense(
|
||||
node,
|
||||
location: location,
|
||||
message: format(MSG, example_group: node.method_name)
|
||||
)
|
||||
msg = format(MSG, example_group: node.method_name)
|
||||
add_offense(location, message: msg) do |corrector|
|
||||
corrector.insert_after(location.end, "\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -17,6 +17,7 @@ module RuboCop
|
||||
#
|
||||
# it { does_something }
|
||||
class EmptyLineAfterFinalLet < Cop
|
||||
extend AutoCorrector
|
||||
include RuboCop::RSpec::BlankLineSeparation
|
||||
|
||||
MSG = 'Add an empty line after the last `let` block.'
|
||||
@ -30,7 +31,9 @@ module RuboCop
|
||||
return if last_child?(latest_let)
|
||||
|
||||
missing_separating_line(latest_let) do |location|
|
||||
add_offense(latest_let, location: location)
|
||||
add_offense(location) do |corrector|
|
||||
corrector.insert_after(location.end, "\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -34,6 +34,7 @@ module RuboCop
|
||||
# it { does_something }
|
||||
#
|
||||
class EmptyLineAfterHook < Cop
|
||||
extend AutoCorrector
|
||||
include RuboCop::RSpec::BlankLineSeparation
|
||||
|
||||
MSG = 'Add an empty line after `%<hook>s`.'
|
||||
@ -43,11 +44,10 @@ module RuboCop
|
||||
return if last_child?(node)
|
||||
|
||||
missing_separating_line(node) do |location|
|
||||
add_offense(
|
||||
node,
|
||||
location: location,
|
||||
message: format(MSG, hook: node.method_name)
|
||||
)
|
||||
msg = format(MSG, hook: node.method_name)
|
||||
add_offense(location, message: msg) do |corrector|
|
||||
corrector.insert_after(location.end, "\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -15,6 +15,7 @@ module RuboCop
|
||||
#
|
||||
# let(:foo) { bar }
|
||||
class EmptyLineAfterSubject < Cop
|
||||
extend AutoCorrector
|
||||
include RuboCop::RSpec::BlankLineSeparation
|
||||
|
||||
MSG = 'Add empty line after `subject`.'
|
||||
@ -24,7 +25,9 @@ module RuboCop
|
||||
return if last_child?(node)
|
||||
|
||||
missing_separating_line(node) do |location|
|
||||
add_offense(node, location: location)
|
||||
add_offense(location) do |corrector|
|
||||
corrector.insert_after(location.end, "\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -30,6 +30,8 @@ module RuboCop
|
||||
# it 'does things' do
|
||||
# end
|
||||
class ExampleWording < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG_SHOULD = 'Do not use should when describing your tests.'
|
||||
MSG_IT = "Do not repeat 'it' when describing your tests."
|
||||
|
||||
@ -53,16 +55,13 @@ module RuboCop
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
corrector.replace(docstring(node), replacement_text(node))
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def add_wording_offense(node, message)
|
||||
add_offense(node, location: docstring(node), message: message)
|
||||
docstring = docstring(node)
|
||||
add_offense(docstring, message: message) do |corrector|
|
||||
corrector.replace(docstring, replacement_text(node))
|
||||
end
|
||||
end
|
||||
|
||||
def docstring(node)
|
||||
@ -17,6 +17,8 @@ module RuboCop
|
||||
# expect(name).to eq("John")
|
||||
#
|
||||
class ExpectActual < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Provide the actual you are testing to `expect(...)`.'
|
||||
|
||||
SIMPLE_LITERALS = %i[
|
||||
@ -55,17 +57,12 @@ module RuboCop
|
||||
PATTERN
|
||||
|
||||
def on_send(node)
|
||||
expect_literal(node) do |argument|
|
||||
add_offense(node, location: argument.source_range)
|
||||
end
|
||||
end
|
||||
expect_literal(node) do |actual, matcher, expected|
|
||||
add_offense(actual.source_range) do |corrector|
|
||||
next unless SUPPORTED_MATCHERS.include?(matcher)
|
||||
|
||||
def autocorrect(node)
|
||||
actual, matcher, expected = expect_literal(node)
|
||||
lambda do |corrector|
|
||||
return unless SUPPORTED_MATCHERS.include?(matcher)
|
||||
|
||||
swap(corrector, actual, expected)
|
||||
swap(corrector, actual, expected)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -30,6 +30,7 @@ module RuboCop
|
||||
# expect { run }.to change { user.reload.name }
|
||||
#
|
||||
class ExpectChange < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
MSG_BLOCK = 'Prefer `change(%<obj>s, :%<attr>s)`.'
|
||||
@ -51,10 +52,11 @@ module RuboCop
|
||||
return unless style == :block
|
||||
|
||||
expect_change_with_arguments(node) do |receiver, message|
|
||||
add_offense(
|
||||
node,
|
||||
message: format(MSG_CALL, obj: receiver, attr: message)
|
||||
)
|
||||
msg = format(MSG_CALL, obj: receiver, attr: message)
|
||||
add_offense(node, message: msg) do |corrector|
|
||||
replacement = "change { #{receiver}.#{message} }"
|
||||
corrector.replace(node, replacement)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -62,37 +64,10 @@ module RuboCop
|
||||
return unless style == :method_call
|
||||
|
||||
expect_change_with_block(node) do |receiver, message|
|
||||
add_offense(
|
||||
node,
|
||||
message: format(MSG_BLOCK, obj: receiver, attr: message)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
if style == :block
|
||||
autocorrect_method_call_to_block(node)
|
||||
else
|
||||
autocorrect_block_to_method_call(node)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def autocorrect_method_call_to_block(node)
|
||||
lambda do |corrector|
|
||||
expect_change_with_arguments(node) do |receiver, message|
|
||||
replacement = "change { #{receiver}.#{message} }"
|
||||
corrector.replace(node.loc.expression, replacement)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect_block_to_method_call(node)
|
||||
lambda do |corrector|
|
||||
expect_change_with_block(node) do |receiver, message|
|
||||
msg = format(MSG_BLOCK, obj: receiver, attr: message)
|
||||
add_offense(node, message: msg) do |corrector|
|
||||
replacement = "change(#{receiver}, :#{message})"
|
||||
corrector.replace(node.loc.expression, replacement)
|
||||
corrector.replace(node, replacement)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -30,8 +30,8 @@ module RuboCop
|
||||
return if node.body.nil?
|
||||
|
||||
expectation(node.body) do |expect|
|
||||
add_offense(expect, location: :selector,
|
||||
message: message(expect, node))
|
||||
add_offense(expect.loc.selector,
|
||||
message: message(expect, node))
|
||||
end
|
||||
end
|
||||
|
||||
@ -27,7 +27,7 @@ module RuboCop
|
||||
name = variable_name[1..-1]
|
||||
return unless name.eql?('stdout') || name.eql?('stderr')
|
||||
|
||||
add_offense(node, location: :name, message: format(MSG, name: name))
|
||||
add_offense(node.loc.name, message: format(MSG, name: name))
|
||||
end
|
||||
|
||||
private
|
||||
@ -25,6 +25,8 @@ module RuboCop
|
||||
# # good
|
||||
# count { 1 }
|
||||
class AttributeDefinedStatically < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Use a block to declare attribute values.'
|
||||
|
||||
def_node_matcher :value_matcher, <<-PATTERN
|
||||
@ -43,20 +45,22 @@ module RuboCop
|
||||
next unless offensive_receiver?(attribute.receiver, node)
|
||||
next if proc?(attribute) || association?(attribute.first_argument)
|
||||
|
||||
add_offense(attribute)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
if node.parenthesized?
|
||||
autocorrect_replacing_parens(node)
|
||||
else
|
||||
autocorrect_without_parens(node)
|
||||
add_offense(attribute) do |corrector|
|
||||
autocorrect(corrector, attribute)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def autocorrect(corrector, node)
|
||||
if node.parenthesized?
|
||||
autocorrect_replacing_parens(corrector, node)
|
||||
else
|
||||
autocorrect_without_parens(corrector, node)
|
||||
end
|
||||
end
|
||||
|
||||
def offensive_receiver?(receiver, node)
|
||||
receiver.nil? ||
|
||||
receiver.self_type? ||
|
||||
@ -77,24 +81,20 @@ module RuboCop
|
||||
|
||||
def_node_matcher :association?, '(hash <(pair (sym :factory) _) ...>)'
|
||||
|
||||
def autocorrect_replacing_parens(node)
|
||||
def autocorrect_replacing_parens(corrector, node)
|
||||
left_braces, right_braces = braces(node)
|
||||
|
||||
lambda do |corrector|
|
||||
corrector.replace(node.location.begin, ' ' + left_braces)
|
||||
corrector.replace(node.location.end, right_braces)
|
||||
end
|
||||
corrector.replace(node.location.begin, ' ' + left_braces)
|
||||
corrector.replace(node.location.end, right_braces)
|
||||
end
|
||||
|
||||
def autocorrect_without_parens(node)
|
||||
def autocorrect_without_parens(corrector, node)
|
||||
left_braces, right_braces = braces(node)
|
||||
|
||||
lambda do |corrector|
|
||||
argument = node.first_argument
|
||||
expression = argument.location.expression
|
||||
corrector.insert_before(expression, left_braces)
|
||||
corrector.insert_after(expression, right_braces)
|
||||
end
|
||||
argument = node.first_argument
|
||||
expression = argument.location.expression
|
||||
corrector.insert_before(expression, left_braces)
|
||||
corrector.insert_after(expression, right_braces)
|
||||
end
|
||||
|
||||
def braces(node)
|
||||
@ -25,6 +25,7 @@ module RuboCop
|
||||
# # good
|
||||
# 3.times { create :user }
|
||||
class CreateList < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
MSG_CREATE_LIST = 'Prefer create_list.'
|
||||
@ -51,26 +52,19 @@ module RuboCop
|
||||
return unless n_times_block_without_arg?(node)
|
||||
return unless contains_only_factory?(node.body)
|
||||
|
||||
add_offense(node.send_node, message: MSG_CREATE_LIST)
|
||||
add_offense(node.send_node, message: MSG_CREATE_LIST) do |corrector|
|
||||
CreateListCorrector.new(node.send_node).call(corrector)
|
||||
end
|
||||
end
|
||||
|
||||
def on_send(node)
|
||||
return unless style == :n_times
|
||||
|
||||
factory_list_call(node) do |_receiver, _factory, count, _|
|
||||
add_offense(
|
||||
node,
|
||||
location: :selector,
|
||||
message: format(MSG_N_TIMES, number: count)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
if style == :create_list
|
||||
CreateListCorrector.new(node)
|
||||
else
|
||||
TimesCorrector.new(node)
|
||||
message = format(MSG_N_TIMES, number: count)
|
||||
add_offense(node.loc.selector, message: message) do |corrector|
|
||||
TimesCorrector.new(node).call(corrector)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -115,7 +109,7 @@ module RuboCop
|
||||
|
||||
def call(corrector)
|
||||
replacement = generate_n_times_block(node)
|
||||
corrector.replace(node.loc.expression, replacement)
|
||||
corrector.replace(node, replacement)
|
||||
end
|
||||
|
||||
private
|
||||
@ -148,7 +142,7 @@ module RuboCop
|
||||
call_replacement(node)
|
||||
end
|
||||
|
||||
corrector.replace(node.loc.expression, replacement)
|
||||
corrector.replace(node, replacement)
|
||||
end
|
||||
|
||||
private
|
||||
@ -20,6 +20,8 @@ module RuboCop
|
||||
# factory :foo, class: 'Foo' do
|
||||
# end
|
||||
class FactoryClassName < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = "Pass '%<class_name>s' string instead of `%<class_name>s` " \
|
||||
'constant.'
|
||||
ALLOWED_CONSTANTS = %w[Hash OpenStruct].freeze
|
||||
@ -32,13 +34,10 @@ module RuboCop
|
||||
class_name(node) do |cn|
|
||||
next if allowed?(cn.const_name)
|
||||
|
||||
add_offense(cn, message: format(MSG, class_name: cn.const_name))
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
corrector.replace(node.loc.expression, "'#{node.source}'")
|
||||
msg = format(MSG, class_name: cn.const_name)
|
||||
add_offense(cn, message: msg) do |corrector|
|
||||
corrector.replace(cn, "'#{cn.source}'")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -58,6 +58,7 @@ module RuboCop
|
||||
# # ...
|
||||
# end
|
||||
class HookArgument < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
IMPLICIT_MSG = 'Omit the default `%<scope>p` ' \
|
||||
@ -78,18 +79,11 @@ module RuboCop
|
||||
return check_implicit(method_send) unless scope_name
|
||||
|
||||
style_detected(scope_name)
|
||||
add_offense(
|
||||
method_send,
|
||||
message: explicit_message(scope_name)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
scope = implicit_style? ? '' : "(#{style.inspect})"
|
||||
|
||||
lambda do |corrector|
|
||||
corrector.replace(argument_range(node), scope)
|
||||
msg = explicit_message(scope_name)
|
||||
add_offense(method_send, message: msg) do |corrector|
|
||||
scope = implicit_style? ? '' : "(#{style.inspect})"
|
||||
corrector.replace(argument_range(method_send), scope)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -99,11 +93,11 @@ module RuboCop
|
||||
style_detected(:implicit)
|
||||
return if implicit_style?
|
||||
|
||||
add_offense(
|
||||
method_send,
|
||||
location: :selector,
|
||||
message: format(EXPLICIT_MSG, scope: style)
|
||||
)
|
||||
msg = explicit_message(nil)
|
||||
add_offense(method_send.loc.selector, message: msg) do |corrector|
|
||||
scope = "(#{style.inspect})"
|
||||
corrector.replace(argument_range(method_send), scope)
|
||||
end
|
||||
end
|
||||
|
||||
def explicit_message(scope)
|
||||
@ -24,6 +24,8 @@ module RuboCop
|
||||
# end
|
||||
#
|
||||
class HooksBeforeExamples < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Move `%<hook>s` above the examples in the group.'
|
||||
|
||||
def_node_matcher :example_or_group?, <<-PATTERN
|
||||
@ -39,15 +41,6 @@ module RuboCop
|
||||
check_hooks(node.body) if multiline_block?(node.body)
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
first_example = find_first_example(node.parent)
|
||||
RuboCop::RSpec::Corrector::MoveNode.new(
|
||||
node, corrector, processed_source
|
||||
).move_before(first_example)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def multiline_block?(block)
|
||||
@ -62,16 +55,22 @@ module RuboCop
|
||||
next if child.sibling_index < first_example.sibling_index
|
||||
next unless hook?(child)
|
||||
|
||||
add_offense(
|
||||
child,
|
||||
message: format(MSG, hook: child.method_name)
|
||||
)
|
||||
msg = format(MSG, hook: child.method_name)
|
||||
add_offense(child, message: msg) do |corrector|
|
||||
autocorrect(corrector, child, first_example)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def find_first_example(node)
|
||||
node.children.find { |sibling| example_or_group?(sibling) }
|
||||
end
|
||||
|
||||
def autocorrect(corrector, node, first_example)
|
||||
RuboCop::RSpec::Corrector::MoveNode.new(
|
||||
node, corrector, processed_source
|
||||
).move_before(first_example)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -25,6 +25,7 @@ module RuboCop
|
||||
# it { should be_truthy }
|
||||
#
|
||||
class ImplicitExpect < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
MSG = 'Prefer `%<good>s` over `%<bad>s`.'
|
||||
@ -54,20 +55,11 @@ module RuboCop
|
||||
else
|
||||
opposite_style_detected
|
||||
|
||||
add_offense(
|
||||
node,
|
||||
location: source_range,
|
||||
message: offense_message(expectation_source)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
offense = offending_expect(node)
|
||||
replacement = replacement_source(offense.source)
|
||||
|
||||
corrector.replace(offense, replacement)
|
||||
msg = offense_message(expectation_source)
|
||||
add_offense(source_range, message: msg) do |corrector|
|
||||
replacement = replacement_source(expectation_source)
|
||||
corrector.replace(source_range, replacement)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -27,6 +27,7 @@ module RuboCop
|
||||
# it { expect(subject).to be_truthy }
|
||||
#
|
||||
class ImplicitSubject < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
MSG = "Don't use implicit subject."
|
||||
@ -39,10 +40,14 @@ module RuboCop
|
||||
return unless implicit_subject?(node)
|
||||
return if valid_usage?(node)
|
||||
|
||||
add_offense(node)
|
||||
add_offense(node) do |corrector|
|
||||
autocorrect(corrector, node)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
private
|
||||
|
||||
def autocorrect(corrector, node)
|
||||
replacement = 'expect(subject)'
|
||||
if node.method_name == :should
|
||||
replacement += '.to'
|
||||
@ -50,11 +55,9 @@ module RuboCop
|
||||
replacement += '.not_to'
|
||||
end
|
||||
|
||||
->(corrector) { corrector.replace(node.loc.selector, replacement) }
|
||||
corrector.replace(node.loc.selector, replacement)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def valid_usage?(node)
|
||||
example = node.ancestors.find { |parent| example?(parent) }
|
||||
return false if example.nil?
|
||||
@ -19,6 +19,8 @@ module RuboCop
|
||||
# end
|
||||
#
|
||||
class InstanceSpy < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Use `instance_spy` when you check your double '\
|
||||
'with `have_received`.'
|
||||
|
||||
@ -43,22 +45,26 @@ module RuboCop
|
||||
|
||||
null_double(node) do |var, receiver|
|
||||
have_received_usage(node) do |expected|
|
||||
add_offense(receiver) if expected == var
|
||||
next if expected != var
|
||||
|
||||
add_offense(receiver) do |corrector|
|
||||
autocorrect(corrector, receiver)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
replacement = 'instance_spy'
|
||||
corrector.replace(node.loc.selector, replacement)
|
||||
private
|
||||
|
||||
double_source_map = node.parent.loc
|
||||
as_null_object_range = double_source_map
|
||||
.dot
|
||||
.join(double_source_map.selector)
|
||||
corrector.remove(as_null_object_range)
|
||||
end
|
||||
def autocorrect(corrector, node)
|
||||
replacement = 'instance_spy'
|
||||
corrector.replace(node.loc.selector, replacement)
|
||||
|
||||
double_source_map = node.parent.loc
|
||||
as_null_object_range = double_source_map
|
||||
.dot
|
||||
.join(double_source_map.selector)
|
||||
corrector.remove(as_null_object_range)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -24,7 +24,8 @@ module RuboCop
|
||||
|
||||
def on_send(node)
|
||||
invalid_predicate_matcher?(node) do |predicate|
|
||||
add_offense(predicate)
|
||||
add_offense(predicate,
|
||||
message: format(MSG, matcher: predicate.method_name))
|
||||
end
|
||||
end
|
||||
|
||||
@ -34,10 +35,6 @@ module RuboCop
|
||||
name = name.to_s
|
||||
name.start_with?('be_', 'have_') && name.end_with?('?')
|
||||
end
|
||||
|
||||
def message(predicate)
|
||||
format(MSG, matcher: predicate.method_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -19,6 +19,7 @@ module RuboCop
|
||||
# # good
|
||||
# it_should_behave_like 'a foo'
|
||||
class ItBehavesLike < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
MSG = 'Prefer `%<replacement>s` over `%<original>s` when including '\
|
||||
@ -28,14 +29,12 @@ module RuboCop
|
||||
|
||||
def on_send(node)
|
||||
example_inclusion_offense(node, alternative_style) do
|
||||
add_offense(node)
|
||||
add_offense(node) do |corrector|
|
||||
corrector.replace(node.loc.selector, style.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
->(corrector) { corrector.replace(node.loc.selector, style.to_s) }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def message(_node)
|
||||
@ -32,6 +32,8 @@ module RuboCop
|
||||
# it { expect_something_else }
|
||||
#
|
||||
class LeadingSubject < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Declare `subject` above any other `%<offending>s` declarations.'
|
||||
|
||||
def on_block(node)
|
||||
@ -43,27 +45,25 @@ module RuboCop
|
||||
def check_previous_nodes(node)
|
||||
node.parent.each_child_node do |sibling|
|
||||
if offending?(sibling)
|
||||
add_offense(
|
||||
node,
|
||||
message: format(MSG, offending: sibling.method_name)
|
||||
)
|
||||
msg = format(MSG, offending: sibling.method_name)
|
||||
add_offense(node, message: msg) do |corrector|
|
||||
autocorrect(corrector, node)
|
||||
end
|
||||
end
|
||||
|
||||
break if offending?(sibling) || sibling.equal?(node)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
first_node = find_first_offending_node(node)
|
||||
RuboCop::RSpec::Corrector::MoveNode.new(
|
||||
node, corrector, processed_source
|
||||
).move_before(first_node)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def autocorrect(corrector, node)
|
||||
first_node = find_first_offending_node(node)
|
||||
RuboCop::RSpec::Corrector::MoveNode.new(
|
||||
node, corrector, processed_source
|
||||
).move_before(first_node)
|
||||
end
|
||||
|
||||
def offending?(node)
|
||||
let?(node) || hook?(node) || example?(node)
|
||||
end
|
||||
@ -31,6 +31,8 @@ module RuboCop
|
||||
# expect(some).to be
|
||||
# end
|
||||
class LetBeforeExamples < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Move `let` before the examples in the group.'
|
||||
|
||||
def_node_matcher :example_or_group?, <<-PATTERN
|
||||
@ -46,15 +48,6 @@ module RuboCop
|
||||
check_let_declarations(node.body) if multiline_block?(node.body)
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
first_example = find_first_example(node.parent)
|
||||
RuboCop::RSpec::Corrector::MoveNode.new(
|
||||
node, corrector, processed_source
|
||||
).move_before(first_example)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def multiline_block?(block)
|
||||
@ -67,14 +60,23 @@ module RuboCop
|
||||
|
||||
node.each_child_node do |child|
|
||||
next if child.sibling_index < first_example.sibling_index
|
||||
next unless let?(child)
|
||||
|
||||
add_offense(child) if let?(child)
|
||||
add_offense(child) do |corrector|
|
||||
autocorrect(corrector, child, first_example)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def find_first_example(node)
|
||||
node.children.find { |sibling| example_or_group?(sibling) }
|
||||
end
|
||||
|
||||
def autocorrect(corrector, node, first_example)
|
||||
RuboCop::RSpec::Corrector::MoveNode.new(
|
||||
node, corrector, processed_source
|
||||
).move_before(first_example)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -21,11 +21,12 @@ module RuboCop
|
||||
PATTERN
|
||||
|
||||
def on_send(node)
|
||||
message_chain(node) { add_offense(node, location: :selector) }
|
||||
end
|
||||
|
||||
def message(node)
|
||||
format(MSG, method: node.method_name)
|
||||
message_chain(node) do
|
||||
add_offense(
|
||||
node.loc.selector,
|
||||
message: format(MSG, method: node.method_name)
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -42,7 +42,7 @@ module RuboCop
|
||||
return correct_style_detected if preferred_style?(match)
|
||||
|
||||
message = format(MSG, style: style)
|
||||
add_offense(match, location: :selector, message: message) do
|
||||
add_offense(match.loc.selector, message: message) do
|
||||
opposite_style_detected
|
||||
end
|
||||
end
|
||||
@ -48,8 +48,7 @@ module RuboCop
|
||||
return correct_style_detected if preferred_style?(message_matcher)
|
||||
|
||||
add_offense(
|
||||
message_matcher,
|
||||
location: :selector,
|
||||
message_matcher.loc.selector,
|
||||
message: error_message(receiver)
|
||||
) { opposite_style_detected }
|
||||
end
|
||||
@ -34,6 +34,7 @@ module RuboCop
|
||||
# This is enough of an edge case that people can just move this to
|
||||
# a `before` hook on their own
|
||||
class MultipleSubjects < Cop
|
||||
extend AutoCorrector
|
||||
include RangeHelp
|
||||
|
||||
MSG = 'Do not set more than one subject per example group'
|
||||
@ -44,38 +45,36 @@ module RuboCop
|
||||
subjects = RuboCop::RSpec::ExampleGroup.new(node).subjects
|
||||
|
||||
subjects[0...-1].each do |subject|
|
||||
add_offense(subject)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
return unless node.method_name.equal?(:subject) # Ignore `subject!`
|
||||
|
||||
if named_subject?(node)
|
||||
rename_autocorrect(node)
|
||||
else
|
||||
remove_autocorrect(node)
|
||||
add_offense(subject) do |corrector|
|
||||
autocorrect(corrector, subject)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def autocorrect(corrector, subject)
|
||||
return unless subject.method_name.equal?(:subject) # Ignore `subject!`
|
||||
|
||||
if named_subject?(subject)
|
||||
rename_autocorrect(corrector, subject)
|
||||
else
|
||||
remove_autocorrect(corrector, subject)
|
||||
end
|
||||
end
|
||||
|
||||
def named_subject?(node)
|
||||
node.send_node.arguments?
|
||||
end
|
||||
|
||||
def rename_autocorrect(node)
|
||||
lambda do |corrector|
|
||||
corrector.replace(node.send_node.loc.selector, 'let')
|
||||
end
|
||||
def rename_autocorrect(corrector, node)
|
||||
corrector.replace(node.send_node.loc.selector, 'let')
|
||||
end
|
||||
|
||||
def remove_autocorrect(node)
|
||||
lambda do |corrector|
|
||||
range = range_by_whole_lines(node.source_range,
|
||||
include_final_newline: true)
|
||||
corrector.remove(range)
|
||||
end
|
||||
def remove_autocorrect(corrector, node)
|
||||
range = range_by_whole_lines(node.source_range,
|
||||
include_final_newline: true)
|
||||
corrector.remove(range)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -62,7 +62,7 @@ module RuboCop
|
||||
return if !rspec_block?(node) || ignored_shared_example?(node)
|
||||
|
||||
subject_usage(node) do |subject_node|
|
||||
add_offense(subject_node, location: :selector)
|
||||
add_offense(subject_node.loc.selector)
|
||||
end
|
||||
end
|
||||
|
||||
@ -16,6 +16,7 @@ module RuboCop
|
||||
# expect(false).not_to be_true
|
||||
# end
|
||||
class NotToNot < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
MSG = 'Prefer `%<replacement>s` over `%<original>s`.'
|
||||
@ -24,14 +25,12 @@ module RuboCop
|
||||
|
||||
def on_send(node)
|
||||
not_to_not_offense(node, alternative_style) do
|
||||
add_offense(node, location: :selector)
|
||||
add_offense(node.loc.selector) do |corrector|
|
||||
corrector.replace(node.loc.selector, style.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
->(corrector) { corrector.replace(node.loc.selector, style.to_s) }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def message(_node)
|
||||
@ -14,11 +14,14 @@ module RuboCop
|
||||
private
|
||||
|
||||
def check_inflected(node)
|
||||
predicate_in_actual?(node) do |predicate|
|
||||
add_offense(
|
||||
node,
|
||||
message: message_inflected(predicate)
|
||||
)
|
||||
predicate_in_actual?(node) do |predicate, to, matcher|
|
||||
msg = message_inflected(predicate)
|
||||
add_offense(node, message: msg) do |corrector|
|
||||
remove_predicate(corrector, predicate)
|
||||
corrector.replace(node.loc.selector,
|
||||
true?(to, matcher) ? 'to' : 'not_to')
|
||||
rewrite_matcher(corrector, predicate, matcher)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -76,17 +79,6 @@ module RuboCop
|
||||
end
|
||||
# rubocop:enable Metrics/MethodLength
|
||||
|
||||
def autocorrect_inflected(node)
|
||||
predicate_in_actual?(node) do |predicate, to, matcher|
|
||||
lambda do |corrector|
|
||||
remove_predicate(corrector, predicate)
|
||||
corrector.replace(node.loc.selector,
|
||||
true?(to, matcher) ? 'to' : 'not_to')
|
||||
rewrite_matcher(corrector, predicate, matcher)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def remove_predicate(corrector, predicate)
|
||||
range = predicate.loc.dot.with(
|
||||
end_pos: predicate.loc.expression.end_pos
|
||||
@ -123,7 +115,6 @@ module RuboCop
|
||||
end
|
||||
|
||||
# A helper for `explicit` style
|
||||
# rubocop:disable Metrics/ModuleLength
|
||||
module ExplicitHelper
|
||||
include RuboCop::RSpec::Language
|
||||
extend NodePattern::Macros
|
||||
@ -143,22 +134,21 @@ module RuboCop
|
||||
end
|
||||
|
||||
def check_explicit(node) # rubocop:disable Metrics/MethodLength
|
||||
predicate_matcher_block?(node) do |_actual, matcher|
|
||||
add_offense(
|
||||
node,
|
||||
message: message_explicit(matcher)
|
||||
)
|
||||
predicate_matcher_block?(node) do |actual, matcher|
|
||||
add_offense(node, message: message_explicit(matcher)) do |corrector|
|
||||
to_node = node.send_node
|
||||
corrector_explicit(corrector, to_node, actual, matcher, to_node)
|
||||
end
|
||||
ignore_node(node.children.first)
|
||||
return
|
||||
end
|
||||
|
||||
return if part_of_ignored_node?(node)
|
||||
|
||||
predicate_matcher?(node) do |_actual, matcher|
|
||||
add_offense(
|
||||
node,
|
||||
message: message_explicit(matcher)
|
||||
)
|
||||
predicate_matcher?(node) do |actual, matcher|
|
||||
add_offense(node, message: message_explicit(matcher)) do |corrector|
|
||||
corrector_explicit(corrector, node, actual, matcher, matcher)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -193,31 +183,11 @@ module RuboCop
|
||||
matcher_name: matcher.method_name)
|
||||
end
|
||||
|
||||
def autocorrect_explicit(node)
|
||||
autocorrect_explicit_send(node) ||
|
||||
autocorrect_explicit_block(node)
|
||||
end
|
||||
|
||||
def autocorrect_explicit_send(node)
|
||||
predicate_matcher?(node) do |actual, matcher|
|
||||
corrector_explicit(node, actual, matcher, matcher)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect_explicit_block(node)
|
||||
predicate_matcher_block?(node) do |actual, matcher|
|
||||
to_node = node.send_node
|
||||
corrector_explicit(to_node, actual, matcher, to_node)
|
||||
end
|
||||
end
|
||||
|
||||
def corrector_explicit(to_node, actual, matcher, block_child)
|
||||
lambda do |corrector|
|
||||
replacement_matcher = replacement_matcher(to_node)
|
||||
corrector.replace(matcher.loc.expression, replacement_matcher)
|
||||
move_predicate(corrector, actual, matcher, block_child)
|
||||
corrector.replace(to_node.loc.selector, 'to')
|
||||
end
|
||||
def corrector_explicit(corrector, to_node, actual, matcher, block_child)
|
||||
replacement_matcher = replacement_matcher(to_node)
|
||||
corrector.replace(matcher.loc.expression, replacement_matcher)
|
||||
move_predicate(corrector, actual, matcher, block_child)
|
||||
corrector.replace(to_node.loc.selector, 'to')
|
||||
end
|
||||
|
||||
def move_predicate(corrector, actual, matcher, block_child)
|
||||
@ -261,7 +231,6 @@ module RuboCop
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop:enable Metrics/ModuleLength
|
||||
|
||||
# Prefer using predicate matcher over using predicate method directly.
|
||||
#
|
||||
@ -301,6 +270,7 @@ module RuboCop
|
||||
# # good - the above code is rewritten to it by this cop
|
||||
# expect(foo.something?).to be_truthy
|
||||
class PredicateMatcher < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
include InflectedHelper
|
||||
include ExplicitHelper
|
||||
@ -31,6 +31,7 @@ module RuboCop
|
||||
# it { is_expected.to have_http_status :error }
|
||||
#
|
||||
class HttpStatus < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
def_node_matcher :http_status, <<-PATTERN
|
||||
@ -42,14 +43,9 @@ module RuboCop
|
||||
checker = checker_class.new(ast_node)
|
||||
return unless checker.offensive?
|
||||
|
||||
add_offense(checker.node, message: checker.message)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
checker = checker_class.new(node)
|
||||
corrector.replace(node.loc.expression, checker.preferred_style)
|
||||
add_offense(checker.node, message: checker.message) do |corrector|
|
||||
corrector.replace(checker.node, checker.preferred_style)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -24,6 +24,8 @@ module RuboCop
|
||||
# expect(foo).to receive(:bar).at_most(:twice).times
|
||||
#
|
||||
class ReceiveCounts < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Use `%<alternative>s` instead of `%<original>s`.'
|
||||
|
||||
def_node_matcher :receive_counts, <<-PATTERN
|
||||
@ -38,28 +40,24 @@ module RuboCop
|
||||
|
||||
offending_range = range(node, offending_node)
|
||||
|
||||
add_offense(
|
||||
offending_node,
|
||||
message: message_for(offending_node, offending_range.source),
|
||||
location: offending_range
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
replacement = matcher_for(
|
||||
node.method_name,
|
||||
node.first_argument.source.to_i
|
||||
)
|
||||
|
||||
original = range(node.parent, node)
|
||||
corrector.replace(original, replacement)
|
||||
msg = message_for(offending_node, offending_range.source)
|
||||
add_offense(offending_range, message: msg) do |corrector|
|
||||
autocorrect(corrector, offending_node, offending_range)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def autocorrect(corrector, node, range)
|
||||
replacement = matcher_for(
|
||||
node.method_name,
|
||||
node.first_argument.source.to_i
|
||||
)
|
||||
|
||||
corrector.replace(range, replacement)
|
||||
end
|
||||
|
||||
def message_for(node, source)
|
||||
alternative = matcher_for(
|
||||
node.method_name,
|
||||
@ -14,6 +14,7 @@ module RuboCop
|
||||
# expect(foo).not_to receive(:bar)
|
||||
#
|
||||
class ReceiveNever < Cop
|
||||
extend AutoCorrector
|
||||
MSG = 'Use `not_to receive` instead of `never`.'
|
||||
|
||||
def_node_search :method_on_stub?, '(send nil? :receive ...)'
|
||||
@ -21,18 +22,17 @@ module RuboCop
|
||||
def on_send(node)
|
||||
return unless node.method_name == :never && method_on_stub?(node)
|
||||
|
||||
add_offense(
|
||||
node,
|
||||
location: :selector
|
||||
)
|
||||
add_offense(node.loc.selector) do |corrector|
|
||||
autocorrect(corrector, node)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
corrector.replace(node.parent.loc.selector, 'not_to')
|
||||
range = node.loc.dot.with(end_pos: node.loc.selector.end_pos)
|
||||
corrector.remove(range)
|
||||
end
|
||||
private
|
||||
|
||||
def autocorrect(corrector, node)
|
||||
corrector.replace(node.parent.loc.selector, 'not_to')
|
||||
range = node.loc.dot.with(end_pos: node.loc.selector.end_pos)
|
||||
corrector.remove(range)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -34,6 +34,7 @@ module RuboCop
|
||||
# allow(Foo).to receive(:bar) { bar.baz }
|
||||
#
|
||||
class ReturnFromStub < Cop
|
||||
extend AutoCorrector
|
||||
include ConfigurableEnforcedStyle
|
||||
|
||||
MSG_AND_RETURN = 'Use `and_return` for static values.'
|
||||
@ -59,24 +60,14 @@ module RuboCop
|
||||
check_block_body(node)
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
if style == :block
|
||||
AndReturnCallCorrector.new(node)
|
||||
else
|
||||
BlockBodyCorrector.new(node)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_and_return_call(node)
|
||||
and_return_value(node) do |and_return, args|
|
||||
unless dynamic?(args)
|
||||
add_offense(
|
||||
and_return,
|
||||
location: :selector,
|
||||
message: MSG_BLOCK
|
||||
)
|
||||
add_offense(and_return.loc.selector, message: MSG_BLOCK) do |corr|
|
||||
AndReturnCallCorrector.new(and_return).call(corr)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -84,11 +75,9 @@ module RuboCop
|
||||
def check_block_body(block)
|
||||
body = block.body
|
||||
unless dynamic?(body) # rubocop:disable Style/GuardClause
|
||||
add_offense(
|
||||
block,
|
||||
location: :begin,
|
||||
message: MSG_AND_RETURN
|
||||
)
|
||||
add_offense(block.loc.begin, message: MSG_AND_RETURN) do |corrector|
|
||||
BlockBodyCorrector.new(block).call(corrector)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -153,7 +142,7 @@ module RuboCop
|
||||
return if heredoc?
|
||||
|
||||
corrector.replace(
|
||||
block.loc.expression,
|
||||
block,
|
||||
"#{block.send_node.source}.and_return(#{body.source})"
|
||||
)
|
||||
end
|
||||
@ -27,6 +27,8 @@ module RuboCop
|
||||
# end
|
||||
#
|
||||
class ScatteredLet < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Group all let/let! blocks in the example group together.'
|
||||
|
||||
def on_block(node)
|
||||
@ -35,15 +37,6 @@ module RuboCop
|
||||
check_let_declarations(node.body)
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
first_let = find_first_let(node.parent)
|
||||
RuboCop::RSpec::Corrector::MoveNode.new(
|
||||
node, corrector, processed_source
|
||||
).move_after(first_let)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_let_declarations(body)
|
||||
@ -53,7 +46,11 @@ module RuboCop
|
||||
lets.each_with_index do |node, idx|
|
||||
next if node.sibling_index == first_let.sibling_index + idx
|
||||
|
||||
add_offense(node)
|
||||
add_offense(node) do |corrector|
|
||||
RuboCop::RSpec::Corrector::MoveNode.new(
|
||||
node, corrector, processed_source
|
||||
).move_after(first_let)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -51,6 +51,8 @@ module RuboCop
|
||||
# end
|
||||
#
|
||||
class SharedContext < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG_EXAMPLES = "Use `shared_examples` when you don't "\
|
||||
'define context.'
|
||||
|
||||
@ -68,22 +70,14 @@ module RuboCop
|
||||
|
||||
def on_block(node)
|
||||
context_with_only_examples(node) do
|
||||
add_shared_item_offense(node.send_node, MSG_EXAMPLES)
|
||||
add_offense(node.send_node, message: MSG_EXAMPLES) do |corrector|
|
||||
corrector.replace(node.send_node.loc.selector, 'shared_examples')
|
||||
end
|
||||
end
|
||||
|
||||
examples_with_only_context(node) do
|
||||
add_shared_item_offense(node.send_node, MSG_CONTEXT)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
context_with_only_examples(node.parent) do
|
||||
corrector.replace(node.loc.selector, 'shared_examples')
|
||||
end
|
||||
|
||||
examples_with_only_context(node.parent) do
|
||||
corrector.replace(node.loc.selector, 'shared_context')
|
||||
add_offense(node.send_node, message: MSG_CONTEXT) do |corrector|
|
||||
corrector.replace(node.send_node.loc.selector, 'shared_context')
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -97,13 +91,6 @@ module RuboCop
|
||||
def examples_with_only_context(node)
|
||||
shared_example(node) { yield if context?(node) && !examples?(node) }
|
||||
end
|
||||
|
||||
def add_shared_item_offense(node, message)
|
||||
add_offense(
|
||||
node,
|
||||
message: message
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -21,6 +21,8 @@ module RuboCop
|
||||
# include_examples 'foo bar baz'
|
||||
#
|
||||
class SharedExamples < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
def_node_matcher :shared_examples,
|
||||
(SharedGroups::ALL + Includes::ALL).send_pattern
|
||||
|
||||
@ -30,14 +32,9 @@ module RuboCop
|
||||
next unless ast_node&.sym_type?
|
||||
|
||||
checker = Checker.new(ast_node)
|
||||
add_offense(checker.node, message: checker.message)
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
checker = Checker.new(node)
|
||||
corrector.replace(node.loc.expression, checker.preferred_style)
|
||||
add_offense(checker.node, message: checker.message) do |corrector|
|
||||
corrector.replace(checker.node, checker.preferred_style)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -17,6 +17,8 @@ module RuboCop
|
||||
# allow(foo).to receive("bar.baz")
|
||||
#
|
||||
class SingleArgumentMessageChain < Cop
|
||||
extend AutoCorrector
|
||||
|
||||
MSG = 'Use `%<recommended>s` instead of calling '\
|
||||
'`%<called>s` with a single argument.'
|
||||
|
||||
@ -30,22 +32,23 @@ module RuboCop
|
||||
message_chain(node) do |arg|
|
||||
return if valid_usage?(arg)
|
||||
|
||||
add_offense(node, location: :selector)
|
||||
end
|
||||
end
|
||||
method = node.method_name
|
||||
msg = format(MSG, recommended: replacement(method), called: method)
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
corrector.replace(node.loc.selector, replacement(node.method_name))
|
||||
message_chain(node) do |arg|
|
||||
autocorrect_hash_arg(corrector, arg) if single_key_hash?(arg)
|
||||
autocorrect_array_arg(corrector, arg) if arg.array_type?
|
||||
add_offense(node.loc.selector, message: msg) do |corrector|
|
||||
autocorrect(corrector, node, method, arg)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def autocorrect(corrector, node, method, arg)
|
||||
corrector.replace(node.loc.selector, replacement(method))
|
||||
autocorrect_hash_arg(corrector, arg) if single_key_hash?(arg)
|
||||
autocorrect_array_arg(corrector, arg) if arg.array_type?
|
||||
end
|
||||
|
||||
def valid_usage?(node)
|
||||
return true unless node.literal? || node.array_type?
|
||||
|
||||
@ -63,7 +66,7 @@ module RuboCop
|
||||
def autocorrect_hash_arg(corrector, arg)
|
||||
key, value = *arg.children.first
|
||||
|
||||
corrector.replace(arg.loc.expression, key_to_arg(key))
|
||||
corrector.replace(arg, key_to_arg(key))
|
||||
corrector.insert_after(arg.parent.loc.end,
|
||||
".and_return(#{value.source})")
|
||||
end
|
||||
@ -71,7 +74,7 @@ module RuboCop
|
||||
def autocorrect_array_arg(corrector, arg)
|
||||
value = arg.children.first
|
||||
|
||||
corrector.replace(arg.loc.expression, value.source)
|
||||
corrector.replace(arg, value.source)
|
||||
end
|
||||
|
||||
def key_to_arg(node)
|
||||
@ -82,12 +85,6 @@ module RuboCop
|
||||
def replacement(method)
|
||||
method.equal?(:receive_message_chain) ? 'receive' : 'stub'
|
||||
end
|
||||
|
||||
def message(node)
|
||||
method = node.method_name
|
||||
|
||||
format(MSG, recommended: replacement(method), called: method)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -12,6 +12,7 @@ module RuboCop
|
||||
# # good
|
||||
# expect(foo).to be(:bar).and_yield(1)
|
||||
class Yield < Cop
|
||||
extend AutoCorrector
|
||||
include RangeHelp
|
||||
|
||||
MSG = 'Use `.and_yield`.'
|
||||
@ -27,22 +28,24 @@ module RuboCop
|
||||
|
||||
block_arg(node.arguments) do |block|
|
||||
if calling_block?(node.body, block)
|
||||
add_offense(node, location: block_range(node))
|
||||
range = block_range(node)
|
||||
|
||||
add_offense(range) do |corrector|
|
||||
autocorrect(corrector, node, range)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
node_range = range_with_surrounding_space(
|
||||
range: block_range(node), side: :left
|
||||
)
|
||||
corrector.replace(node_range, generate_replacement(node.body))
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def autocorrect(corrector, node, range)
|
||||
corrector.replace(
|
||||
range_with_surrounding_space(range: range, side: :left),
|
||||
generate_replacement(node.body)
|
||||
)
|
||||
end
|
||||
|
||||
def calling_block?(node, block)
|
||||
if node.begin_type?
|
||||
node.each_child_node.all? { |child| block_call?(child, block) }
|
||||
@ -32,14 +32,6 @@ module RuboCop
|
||||
|
||||
node.equal?(node.parent.children.last)
|
||||
end
|
||||
|
||||
def autocorrect(node)
|
||||
lambda do |corrector|
|
||||
missing_separating_line(node) do |location|
|
||||
corrector.insert_after(location.end, "\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user