rubocop-rspec 2.21.0 → 3.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +147 -9
- data/README.md +2 -2
- data/config/default.yml +159 -244
- data/config/obsoletion.yml +24 -0
- data/lib/rubocop/cop/rspec/around_block.rb +3 -3
- data/lib/rubocop/cop/rspec/base.rb +0 -1
- data/lib/rubocop/cop/rspec/be.rb +1 -1
- data/lib/rubocop/cop/rspec/be_empty.rb +1 -0
- data/lib/rubocop/cop/rspec/be_eq.rb +1 -1
- data/lib/rubocop/cop/rspec/be_eql.rb +1 -1
- data/lib/rubocop/cop/rspec/be_nil.rb +2 -2
- data/lib/rubocop/cop/rspec/before_after_all.rb +7 -13
- data/lib/rubocop/cop/rspec/change_by_zero.rb +30 -4
- data/lib/rubocop/cop/rspec/context_method.rb +2 -2
- data/lib/rubocop/cop/rspec/context_wording.rb +1 -1
- data/lib/rubocop/cop/rspec/describe_symbol.rb +1 -1
- data/lib/rubocop/cop/rspec/described_class.rb +33 -11
- data/lib/rubocop/cop/rspec/dialect.rb +13 -0
- data/lib/rubocop/cop/rspec/duplicated_metadata.rb +1 -1
- data/lib/rubocop/cop/rspec/empty_example_group.rb +4 -1
- data/lib/rubocop/cop/rspec/empty_hook.rb +1 -1
- data/lib/rubocop/cop/rspec/empty_line_after_example.rb +2 -2
- data/lib/rubocop/cop/rspec/empty_metadata.rb +46 -0
- data/lib/rubocop/cop/rspec/empty_output.rb +47 -0
- data/lib/rubocop/cop/rspec/eq.rb +47 -0
- data/lib/rubocop/cop/rspec/example_length.rb +11 -5
- data/lib/rubocop/cop/rspec/example_without_description.rb +11 -2
- data/lib/rubocop/cop/rspec/example_wording.rb +11 -2
- data/lib/rubocop/cop/rspec/excessive_docstring_spacing.rb +14 -5
- data/lib/rubocop/cop/rspec/expect_actual.rb +17 -14
- data/lib/rubocop/cop/rspec/expect_change.rb +2 -2
- data/lib/rubocop/cop/rspec/expect_in_hook.rb +1 -1
- data/lib/rubocop/cop/rspec/expect_in_let.rb +42 -0
- data/lib/rubocop/cop/rspec/expect_output.rb +1 -4
- data/lib/rubocop/cop/rspec/focus.rb +17 -2
- data/lib/rubocop/cop/rspec/hook_argument.rb +2 -2
- data/lib/rubocop/cop/rspec/hooks_before_examples.rb +1 -1
- data/lib/rubocop/cop/rspec/implicit_block_expectation.rb +2 -2
- data/lib/rubocop/cop/rspec/implicit_expect.rb +1 -1
- data/lib/rubocop/cop/rspec/implicit_subject.rb +2 -2
- data/lib/rubocop/cop/rspec/indexed_let.rb +32 -1
- data/lib/rubocop/cop/rspec/instance_spy.rb +2 -2
- data/lib/rubocop/cop/rspec/instance_variable.rb +4 -4
- data/lib/rubocop/cop/rspec/is_expected_specify.rb +45 -0
- data/lib/rubocop/cop/rspec/iterated_expectation.rb +3 -3
- data/lib/rubocop/cop/rspec/leaky_constant_declaration.rb +2 -2
- data/lib/rubocop/cop/rspec/let_before_examples.rb +5 -1
- data/lib/rubocop/cop/rspec/let_setup.rb +1 -1
- data/lib/rubocop/cop/rspec/message_expectation.rb +1 -2
- data/lib/rubocop/cop/rspec/message_spies.rb +0 -2
- data/lib/rubocop/cop/rspec/metadata_style.rb +202 -0
- data/lib/rubocop/cop/rspec/missing_expectation_target_method.rb +54 -0
- data/lib/rubocop/cop/rspec/mixin/file_help.rb +14 -0
- data/lib/rubocop/cop/rspec/mixin/metadata.rb +21 -7
- data/lib/rubocop/cop/rspec/mixin/skip_or_pending.rb +2 -2
- data/lib/rubocop/cop/rspec/multiple_describes.rb +1 -1
- data/lib/rubocop/cop/rspec/multiple_expectations.rb +16 -11
- data/lib/rubocop/cop/rspec/multiple_memoized_helpers.rb +2 -4
- data/lib/rubocop/cop/rspec/named_subject.rb +6 -3
- data/lib/rubocop/cop/rspec/pending.rb +12 -2
- data/lib/rubocop/cop/rspec/pending_without_reason.rb +1 -1
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +10 -10
- data/lib/rubocop/cop/rspec/receive_counts.rb +1 -1
- data/lib/rubocop/cop/rspec/receive_messages.rb +161 -0
- data/lib/rubocop/cop/rspec/redundant_predicate_matcher.rb +67 -0
- data/lib/rubocop/cop/rspec/remove_const.rb +39 -0
- data/lib/rubocop/cop/rspec/repeated_example.rb +6 -6
- data/lib/rubocop/cop/rspec/repeated_example_group_body.rb +1 -1
- data/lib/rubocop/cop/rspec/repeated_example_group_description.rb +2 -2
- data/lib/rubocop/cop/rspec/repeated_include_example.rb +1 -1
- data/lib/rubocop/cop/rspec/repeated_subject_call.rb +125 -0
- data/lib/rubocop/cop/rspec/return_from_stub.rb +1 -1
- data/lib/rubocop/cop/rspec/scattered_setup.rb +1 -1
- data/lib/rubocop/cop/rspec/shared_context.rb +1 -1
- data/lib/rubocop/cop/rspec/shared_examples.rb +66 -20
- data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +2 -3
- data/lib/rubocop/cop/rspec/sort_metadata.rb +3 -2
- data/lib/rubocop/cop/rspec/spec_file_path_format.rb +133 -0
- data/lib/rubocop/cop/rspec/spec_file_path_suffix.rb +40 -0
- data/lib/rubocop/cop/rspec/stubbed_mock.rb +4 -2
- data/lib/rubocop/cop/rspec/subject_stub.rb +6 -6
- data/lib/rubocop/cop/rspec/undescriptive_literals_description.rb +69 -0
- data/lib/rubocop/cop/rspec/unspecified_exception.rb +2 -2
- data/lib/rubocop/cop/rspec/variable_definition.rb +4 -4
- data/lib/rubocop/cop/rspec/verified_double_reference.rb +6 -6
- data/lib/rubocop/cop/rspec/verified_doubles.rb +2 -2
- data/lib/rubocop/cop/rspec/void_expect.rb +4 -3
- data/lib/rubocop/cop/rspec_cops.rb +14 -28
- data/lib/rubocop/rspec/concept.rb +0 -1
- data/lib/rubocop/rspec/config_formatter.rb +1 -11
- data/lib/rubocop/rspec/cop/generator.rb +25 -0
- data/lib/rubocop/rspec/language.rb +8 -9
- data/lib/rubocop/rspec/node.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts/default_rspec_language_config_context.rb +1 -1
- data/lib/rubocop/rspec/version.rb +1 -1
- data/lib/rubocop/rspec/wording.rb +8 -0
- data/lib/rubocop-rspec.rb +2 -16
- metadata +27 -49
- data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +0 -39
- data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +0 -104
- data/lib/rubocop/cop/rspec/capybara/match_style.rb +0 -38
- data/lib/rubocop/cop/rspec/capybara/negation_matcher.rb +0 -33
- data/lib/rubocop/cop/rspec/capybara/specific_actions.rb +0 -29
- data/lib/rubocop/cop/rspec/capybara/specific_finders.rb +0 -24
- data/lib/rubocop/cop/rspec/capybara/specific_matcher.rb +0 -35
- data/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb +0 -36
- data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +0 -128
- data/lib/rubocop/cop/rspec/factory_bot/consistent_parentheses_style.rb +0 -117
- data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +0 -260
- data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +0 -56
- data/lib/rubocop/cop/rspec/factory_bot/factory_name_style.rb +0 -74
- data/lib/rubocop/cop/rspec/factory_bot/syntax_methods.rb +0 -89
- data/lib/rubocop/cop/rspec/file_path.rb +0 -173
- data/lib/rubocop/cop/rspec/rails/avoid_setup_hook.rb +0 -43
- data/lib/rubocop/cop/rspec/rails/have_http_status.rb +0 -55
- data/lib/rubocop/cop/rspec/rails/http_status.rb +0 -203
- data/lib/rubocop/cop/rspec/rails/inferred_spec_type.rb +0 -145
- data/lib/rubocop/cop/rspec/rails/minitest_assertions.rb +0 -60
- data/lib/rubocop/cop/rspec/rails/travel_around.rb +0 -92
- data/lib/rubocop/rspec/factory_bot/language.rb +0 -37
- data/lib/rubocop/rspec/factory_bot.rb +0 -64
- data/lib/rubocop/rspec/language/node_pattern.rb +0 -48
@@ -1,60 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Cop
|
5
|
-
module RSpec
|
6
|
-
module Rails
|
7
|
-
# Check if using Minitest matchers.
|
8
|
-
#
|
9
|
-
# @example
|
10
|
-
# # bad
|
11
|
-
# assert_equal(a, b)
|
12
|
-
# assert_equal a, b, "must be equal"
|
13
|
-
# refute_equal(a, b)
|
14
|
-
#
|
15
|
-
# # good
|
16
|
-
# expect(b).to eq(a)
|
17
|
-
# expect(b).to(eq(a), "must be equal")
|
18
|
-
# expect(b).not_to eq(a)
|
19
|
-
#
|
20
|
-
class MinitestAssertions < Base
|
21
|
-
extend AutoCorrector
|
22
|
-
|
23
|
-
MSG = 'Use `%<prefer>s`.'
|
24
|
-
RESTRICT_ON_SEND = %i[assert_equal refute_equal].freeze
|
25
|
-
|
26
|
-
# @!method minitest_assertion(node)
|
27
|
-
def_node_matcher :minitest_assertion, <<-PATTERN
|
28
|
-
(send nil? {:assert_equal :refute_equal} $_ $_ $_?)
|
29
|
-
PATTERN
|
30
|
-
|
31
|
-
def on_send(node)
|
32
|
-
minitest_assertion(node) do |expected, actual, failure_message|
|
33
|
-
prefer = replacement(node, expected, actual,
|
34
|
-
failure_message.first)
|
35
|
-
add_offense(node, message: message(prefer)) do |corrector|
|
36
|
-
corrector.replace(node, prefer)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def replacement(node, expected, actual, failure_message)
|
44
|
-
runner = node.method?(:assert_equal) ? 'to' : 'not_to'
|
45
|
-
if failure_message.nil?
|
46
|
-
"expect(#{actual.source}).#{runner} eq(#{expected.source})"
|
47
|
-
else
|
48
|
-
"expect(#{actual.source}).#{runner}(eq(#{expected.source}), " \
|
49
|
-
"#{failure_message.source})"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def message(prefer)
|
54
|
-
format(MSG, prefer: prefer)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Cop
|
5
|
-
module RSpec
|
6
|
-
module Rails
|
7
|
-
# Prefer to travel in `before` rather than `around`.
|
8
|
-
#
|
9
|
-
# @safety
|
10
|
-
# This cop is unsafe because the automatic `travel_back` is only run
|
11
|
-
# on test cases that are considered as Rails related.
|
12
|
-
#
|
13
|
-
# And also, this cop's autocorrection is unsafe because the order of
|
14
|
-
# execution will change if other steps exist before traveling in
|
15
|
-
# `around`.
|
16
|
-
#
|
17
|
-
# @example
|
18
|
-
# # bad
|
19
|
-
# around do |example|
|
20
|
-
# freeze_time do
|
21
|
-
# example.run
|
22
|
-
# end
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# # good
|
26
|
-
# before { freeze_time }
|
27
|
-
class TravelAround < Base
|
28
|
-
extend AutoCorrector
|
29
|
-
|
30
|
-
MSG = 'Prefer to travel in `before` rather than `around`.'
|
31
|
-
|
32
|
-
TRAVEL_METHOD_NAMES = %i[
|
33
|
-
freeze_time
|
34
|
-
travel
|
35
|
-
travel_to
|
36
|
-
].to_set.freeze
|
37
|
-
|
38
|
-
# @!method extract_run_in_travel(node)
|
39
|
-
def_node_matcher :extract_run_in_travel, <<~PATTERN
|
40
|
-
(block
|
41
|
-
$(send nil? TRAVEL_METHOD_NAMES ...)
|
42
|
-
(args ...)
|
43
|
-
(send _ :run)
|
44
|
-
)
|
45
|
-
PATTERN
|
46
|
-
|
47
|
-
# @!method match_around_each?(node)
|
48
|
-
def_node_matcher :match_around_each?, <<~PATTERN
|
49
|
-
(block
|
50
|
-
(send _ :around (sym :each)?)
|
51
|
-
...
|
52
|
-
)
|
53
|
-
PATTERN
|
54
|
-
|
55
|
-
def on_block(node)
|
56
|
-
run_node = extract_run_in_travel(node)
|
57
|
-
return unless run_node
|
58
|
-
|
59
|
-
around_node = extract_surrounding_around_block(run_node)
|
60
|
-
return unless around_node
|
61
|
-
|
62
|
-
add_offense(node) do |corrector|
|
63
|
-
autocorrect(corrector, node, run_node, around_node)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
alias on_numblock on_block
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
def autocorrect(corrector, node, run_node, around_node)
|
71
|
-
corrector.replace(
|
72
|
-
node,
|
73
|
-
node.body.source
|
74
|
-
)
|
75
|
-
corrector.insert_before(
|
76
|
-
around_node,
|
77
|
-
"before { #{run_node.source} }\n\n"
|
78
|
-
)
|
79
|
-
end
|
80
|
-
|
81
|
-
# @param node [RuboCop::AST::BlockNode]
|
82
|
-
# @return [RuboCop::AST::BlockNode, nil]
|
83
|
-
def extract_surrounding_around_block(node)
|
84
|
-
node.each_ancestor(:block).find do |ancestor|
|
85
|
-
match_around_each?(ancestor)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module RSpec
|
5
|
-
module FactoryBot
|
6
|
-
# Contains node matchers for common FactoryBot DSL.
|
7
|
-
module Language
|
8
|
-
extend RuboCop::NodePattern::Macros
|
9
|
-
|
10
|
-
METHODS = %i[
|
11
|
-
attributes_for
|
12
|
-
attributes_for_list
|
13
|
-
attributes_for_pair
|
14
|
-
build
|
15
|
-
build_list
|
16
|
-
build_pair
|
17
|
-
build_stubbed
|
18
|
-
build_stubbed_list
|
19
|
-
build_stubbed_pair
|
20
|
-
create
|
21
|
-
create_list
|
22
|
-
create_pair
|
23
|
-
generate
|
24
|
-
generate_list
|
25
|
-
null
|
26
|
-
null_list
|
27
|
-
null_pair
|
28
|
-
].to_set.freeze
|
29
|
-
|
30
|
-
# @!method factory_bot?(node)
|
31
|
-
def_node_matcher :factory_bot?, <<~PATTERN
|
32
|
-
(const {nil? cbase} {:FactoryGirl :FactoryBot})
|
33
|
-
PATTERN
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module RSpec
|
5
|
-
# RuboCop FactoryBot project namespace
|
6
|
-
module FactoryBot
|
7
|
-
ATTRIBUTE_DEFINING_METHODS = %i[
|
8
|
-
factory
|
9
|
-
ignore
|
10
|
-
trait
|
11
|
-
traits_for_enum
|
12
|
-
transient
|
13
|
-
].freeze
|
14
|
-
|
15
|
-
UNPROXIED_METHODS = %i[
|
16
|
-
__send__
|
17
|
-
__id__
|
18
|
-
nil?
|
19
|
-
send
|
20
|
-
object_id
|
21
|
-
extend
|
22
|
-
instance_eval
|
23
|
-
initialize
|
24
|
-
block_given?
|
25
|
-
raise
|
26
|
-
caller
|
27
|
-
method
|
28
|
-
].freeze
|
29
|
-
|
30
|
-
DEFINITION_PROXY_METHODS = %i[
|
31
|
-
add_attribute
|
32
|
-
after
|
33
|
-
association
|
34
|
-
before
|
35
|
-
callback
|
36
|
-
ignore
|
37
|
-
initialize_with
|
38
|
-
sequence
|
39
|
-
skip_create
|
40
|
-
to_create
|
41
|
-
].freeze
|
42
|
-
|
43
|
-
RESERVED_METHODS =
|
44
|
-
DEFINITION_PROXY_METHODS +
|
45
|
-
UNPROXIED_METHODS +
|
46
|
-
ATTRIBUTE_DEFINING_METHODS
|
47
|
-
|
48
|
-
private_constant(
|
49
|
-
:ATTRIBUTE_DEFINING_METHODS,
|
50
|
-
:UNPROXIED_METHODS,
|
51
|
-
:DEFINITION_PROXY_METHODS,
|
52
|
-
:RESERVED_METHODS
|
53
|
-
)
|
54
|
-
|
55
|
-
def self.attribute_defining_methods
|
56
|
-
ATTRIBUTE_DEFINING_METHODS
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.reserved_methods
|
60
|
-
RESERVED_METHODS
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module RSpec
|
5
|
-
module Language
|
6
|
-
# Helper methods to detect RSpec DSL used with send and block
|
7
|
-
# @deprecated Prefer using Node Pattern directly
|
8
|
-
# Use `'(block (send nil? #Example.all ...) ...)'` instead of
|
9
|
-
# `block_pattern('#Example.all')`
|
10
|
-
module NodePattern
|
11
|
-
# @deprecated Prefer using Node Pattern directly
|
12
|
-
def send_pattern(string)
|
13
|
-
deprecation_warning __method__
|
14
|
-
"(send #rspec? #{string} ...)"
|
15
|
-
end
|
16
|
-
|
17
|
-
# @deprecated Prefer using Node Pattern directly
|
18
|
-
def block_pattern(string)
|
19
|
-
deprecation_warning __method__
|
20
|
-
"(block #{send_pattern(string)} ...)"
|
21
|
-
end
|
22
|
-
|
23
|
-
# @deprecated Prefer using Node Pattern directly
|
24
|
-
def numblock_pattern(string)
|
25
|
-
deprecation_warning __method__
|
26
|
-
"(numblock #{send_pattern(string)} ...)"
|
27
|
-
end
|
28
|
-
|
29
|
-
# @deprecated Prefer using Node Pattern directly
|
30
|
-
def block_or_numblock_pattern(string)
|
31
|
-
deprecation_warning __method__
|
32
|
-
"{#{block_pattern(string)} #{numblock_pattern(string)}}"
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def deprecation_warning(method)
|
38
|
-
# Only warn in derived extensions' specs
|
39
|
-
return unless defined?(::RSpec)
|
40
|
-
|
41
|
-
Kernel.warn <<~MESSAGE, uplevel: 2
|
42
|
-
Usage of #{method} is deprecated. Use node pattern explicitly.
|
43
|
-
MESSAGE
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|