rubocop-rspec 1.18.0 → 1.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +2 -2
- data/lib/rubocop/cop/rspec/align_left_let_brace.rb +1 -1
- data/lib/rubocop/cop/rspec/align_right_let_brace.rb +1 -1
- data/lib/rubocop/cop/rspec/any_instance.rb +5 -1
- data/lib/rubocop/cop/rspec/around_block.rb +7 -3
- data/lib/rubocop/cop/rspec/be_eql.rb +4 -2
- data/lib/rubocop/cop/rspec/before_after_all.rb +5 -1
- data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +2 -2
- data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +6 -2
- data/lib/rubocop/cop/rspec/describe_class.rb +4 -4
- data/lib/rubocop/cop/rspec/describe_method.rb +1 -1
- data/lib/rubocop/cop/rspec/describe_symbol.rb +4 -2
- data/lib/rubocop/cop/rspec/described_class.rb +6 -2
- data/lib/rubocop/cop/rspec/empty_example_group.rb +1 -1
- data/lib/rubocop/cop/rspec/empty_line_after_final_let.rb +6 -14
- data/lib/rubocop/cop/rspec/empty_line_after_subject.rb +2 -2
- data/lib/rubocop/cop/rspec/example_length.rb +1 -1
- data/lib/rubocop/cop/rspec/example_wording.rb +1 -1
- data/lib/rubocop/cop/rspec/expect_actual.rb +1 -1
- data/lib/rubocop/cop/rspec/expect_in_hook.rb +3 -3
- data/lib/rubocop/cop/rspec/expect_output.rb +1 -1
- data/lib/rubocop/cop/rspec/factory_girl/dynamic_attribute_defined_statically.rb +3 -3
- data/lib/rubocop/cop/rspec/file_path.rb +1 -1
- data/lib/rubocop/cop/rspec/focus.rb +3 -3
- data/lib/rubocop/cop/rspec/hook_argument.rb +10 -2
- data/lib/rubocop/cop/rspec/implicit_expect.rb +8 -4
- data/lib/rubocop/cop/rspec/instance_spy.rb +5 -5
- data/lib/rubocop/cop/rspec/instance_variable.rb +1 -1
- data/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb +2 -2
- data/lib/rubocop/cop/rspec/it_behaves_like.rb +1 -1
- data/lib/rubocop/cop/rspec/iterated_expectation.rb +2 -2
- data/lib/rubocop/cop/rspec/leading_subject.rb +2 -2
- data/lib/rubocop/cop/rspec/let_before_examples.rb +2 -2
- data/lib/rubocop/cop/rspec/let_setup.rb +5 -3
- data/lib/rubocop/cop/rspec/message_chain.rb +1 -1
- data/lib/rubocop/cop/rspec/message_expectation.rb +3 -3
- data/lib/rubocop/cop/rspec/message_spies.rb +7 -5
- data/lib/rubocop/cop/rspec/multiple_describes.rb +1 -1
- data/lib/rubocop/cop/rspec/multiple_expectations.rb +6 -2
- data/lib/rubocop/cop/rspec/multiple_subjects.rb +2 -2
- data/lib/rubocop/cop/rspec/named_subject.rb +2 -2
- data/lib/rubocop/cop/rspec/nested_groups.rb +5 -1
- data/lib/rubocop/cop/rspec/not_to_not.rb +1 -1
- data/lib/rubocop/cop/rspec/overwriting_setup.rb +6 -2
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +26 -14
- data/lib/rubocop/cop/rspec/repeated_description.rb +1 -1
- data/lib/rubocop/cop/rspec/repeated_example.rb +1 -1
- data/lib/rubocop/cop/rspec/return_from_stub.rb +17 -5
- data/lib/rubocop/cop/rspec/scattered_let.rb +2 -2
- data/lib/rubocop/cop/rspec/scattered_setup.rb +1 -1
- data/lib/rubocop/cop/rspec/shared_context.rb +5 -1
- data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +1 -1
- data/lib/rubocop/cop/rspec/subject_stub.rb +8 -6
- data/lib/rubocop/cop/rspec/verified_doubles.rb +2 -2
- data/lib/rubocop/cop/rspec/void_expect.rb +2 -2
- data/lib/rubocop/rspec/example_group.rb +1 -1
- data/lib/rubocop/rspec/language/node_pattern.rb +1 -1
- data/lib/rubocop/rspec/version.rb +1 -1
- data/rubocop-rspec.gemspec +1 -1
- data/spec/rubocop/cop/rspec/cop_spec.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98cb4ed6eefcee97bb8b5dea2093bb2cab7abc99
|
4
|
+
data.tar.gz: ce92dd968c520f5dbe633443262235b05f038cf1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c89f710f27e3fe8695428c11866a4f853a1397a5adece3f89963d73521edd8ea102f29e625756390d99d27afe2f33d620b0da3e761e361800eac04bef3f450f2
|
7
|
+
data.tar.gz: 3464b491a898fa51fa8709fa632274b221f44529845bd291d892706bdc5e9fc99e1ea234fa54b331b6af1aa6544e57397c68add5cd4c96e37fd68b0f527d91d7
|
data/Rakefile
CHANGED
@@ -6,8 +6,8 @@ require 'bundler/gem_tasks'
|
|
6
6
|
begin
|
7
7
|
Bundler.setup(:default, :development)
|
8
8
|
rescue Bundler::BundlerError => e
|
9
|
-
|
10
|
-
|
9
|
+
warn e.message
|
10
|
+
warn 'Run `bundle install` to install missing gems'
|
11
11
|
exit e.status_code
|
12
12
|
end
|
13
13
|
|
@@ -29,7 +29,11 @@ module RuboCop
|
|
29
29
|
|
30
30
|
def on_send(node)
|
31
31
|
disallowed_stub(node) do |method|
|
32
|
-
add_offense(
|
32
|
+
add_offense(
|
33
|
+
node,
|
34
|
+
location: :expression,
|
35
|
+
message: format(MSG, method: method)
|
36
|
+
)
|
33
37
|
end
|
34
38
|
end
|
35
39
|
end
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
'or `%<arg>s.run`.'.freeze
|
30
30
|
|
31
31
|
def_node_matcher :hook, <<-PATTERN
|
32
|
-
(block {(send nil :around) (send nil :around sym)} (args $...) ...)
|
32
|
+
(block {(send nil? :around) (send nil? :around sym)} (args $...) ...)
|
33
33
|
PATTERN
|
34
34
|
|
35
35
|
def_node_search :find_arg_usage, <<-PATTERN
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
49
49
|
private
|
50
50
|
|
51
51
|
def add_no_arg_offense(node)
|
52
|
-
add_offense(node, :expression, MSG_NO_ARG)
|
52
|
+
add_offense(node, location: :expression, message: MSG_NO_ARG)
|
53
53
|
end
|
54
54
|
|
55
55
|
def check_for_unused_proxy(block, proxy)
|
@@ -59,7 +59,11 @@ module RuboCop
|
|
59
59
|
return if usage.include?(s(:lvar, name))
|
60
60
|
end
|
61
61
|
|
62
|
-
add_offense(
|
62
|
+
add_offense(
|
63
|
+
proxy,
|
64
|
+
location: :expression,
|
65
|
+
message: format(MSG_UNUSED_ARG, arg: name)
|
66
|
+
)
|
63
67
|
end
|
64
68
|
end
|
65
69
|
end
|
@@ -37,11 +37,13 @@ module RuboCop
|
|
37
37
|
MSG = 'Prefer `be` over `eql`.'.freeze
|
38
38
|
|
39
39
|
def_node_matcher :eql_type_with_identity, <<-PATTERN
|
40
|
-
(send _ :to $(send nil :eql {true false int float sym nil_type?}))
|
40
|
+
(send _ :to $(send nil? :eql {true false int float sym nil_type?}))
|
41
41
|
PATTERN
|
42
42
|
|
43
43
|
def on_send(node)
|
44
|
-
eql_type_with_identity(node)
|
44
|
+
eql_type_with_identity(node) do |eql|
|
45
|
+
add_offense(eql, location: :selector)
|
46
|
+
end
|
45
47
|
end
|
46
48
|
|
47
49
|
def autocorrect(node)
|
@@ -35,7 +35,11 @@ module RuboCop
|
|
35
35
|
|
36
36
|
def on_send(node)
|
37
37
|
before_or_after_all(node) do |hook|
|
38
|
-
add_offense(
|
38
|
+
add_offense(
|
39
|
+
node,
|
40
|
+
location: :expression,
|
41
|
+
message: format(MSG, hook: hook.source)
|
42
|
+
)
|
39
43
|
end
|
40
44
|
end
|
41
45
|
end
|
@@ -27,12 +27,12 @@ module RuboCop
|
|
27
27
|
'`have_current_path` matcher on `page`'.freeze
|
28
28
|
|
29
29
|
def_node_matcher :expectation_set_on_current_path, <<-PATTERN
|
30
|
-
(send nil :expect (send {(send nil :page) nil} :current_path))
|
30
|
+
(send nil? :expect (send {(send nil? :page) nil?} :current_path))
|
31
31
|
PATTERN
|
32
32
|
|
33
33
|
def on_send(node)
|
34
34
|
expectation_set_on_current_path(node) do
|
35
|
-
add_offense(node, :selector)
|
35
|
+
add_offense(node, location: :selector)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -47,13 +47,17 @@ module RuboCop
|
|
47
47
|
|
48
48
|
def_node_matcher :feature_method, <<-PATTERN
|
49
49
|
(block
|
50
|
-
$(send {(const nil :RSpec) nil} ${#{MAP.keys.map(&:inspect).join(' ')}} ...)
|
50
|
+
$(send {(const nil? :RSpec) nil?} ${#{MAP.keys.map(&:inspect).join(' ')}} ...)
|
51
51
|
...)
|
52
52
|
PATTERN
|
53
53
|
|
54
54
|
def on_block(node)
|
55
55
|
feature_method(node) do |send_node, match|
|
56
|
-
add_offense(
|
56
|
+
add_offense(
|
57
|
+
send_node,
|
58
|
+
location: :selector,
|
59
|
+
message: format(MSG, MAP[match], match)
|
60
|
+
)
|
57
61
|
end
|
58
62
|
end
|
59
63
|
|
@@ -23,11 +23,11 @@ module RuboCop
|
|
23
23
|
'the class or module being tested.'.freeze
|
24
24
|
|
25
25
|
def_node_matcher :valid_describe?, <<-PATTERN
|
26
|
-
{(send {(const nil :RSpec) nil} :describe const ...) (send nil :describe)}
|
26
|
+
{(send {(const nil? :RSpec) nil?} :describe const ...) (send nil? :describe)}
|
27
27
|
PATTERN
|
28
28
|
|
29
29
|
def_node_matcher :describe_with_metadata, <<-PATTERN
|
30
|
-
(send {(const nil :RSpec) nil} :describe
|
30
|
+
(send {(const nil? :RSpec) nil?} :describe
|
31
31
|
!const
|
32
32
|
...
|
33
33
|
(hash $...))
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
PATTERN
|
41
41
|
|
42
42
|
def_node_matcher :shared_group?, <<-PATTERN
|
43
|
-
(block (send {(const nil :RSpec) nil} #{SharedGroups::ALL.node_pattern_union} ...) ...)
|
43
|
+
(block (send {(const nil? :RSpec) nil?} #{SharedGroups::ALL.node_pattern_union} ...) ...)
|
44
44
|
PATTERN
|
45
45
|
|
46
46
|
def on_top_level_describe(node, args)
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
51
51
|
return if pairs.any?(&method(:rails_metadata?))
|
52
52
|
end
|
53
53
|
|
54
|
-
add_offense(args.first, :expression)
|
54
|
+
add_offense(args.first, location: :expression)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -21,11 +21,13 @@ module RuboCop
|
|
21
21
|
MSG = 'Avoid describing symbols.'.freeze
|
22
22
|
|
23
23
|
def_node_matcher :describe_symbol?, <<-PATTERN
|
24
|
-
(send {(const nil :RSpec) nil} :describe $sym ...)
|
24
|
+
(send {(const nil? :RSpec) nil?} :describe $sym ...)
|
25
25
|
PATTERN
|
26
26
|
|
27
27
|
def on_send(node)
|
28
|
-
describe_symbol?(node)
|
28
|
+
describe_symbol?(node) do |match|
|
29
|
+
add_offense(match, location: :expression)
|
30
|
+
end
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
MSG = 'Use `%s` instead of `%s`.'.freeze
|
41
41
|
|
42
42
|
def_node_matcher :common_instance_exec_closure?, <<-PATTERN
|
43
|
-
(block (send (const nil {:Class :Module}) :new ...) ...)
|
43
|
+
(block (send (const nil? {:Class :Module}) :new ...) ...)
|
44
44
|
PATTERN
|
45
45
|
|
46
46
|
def_node_matcher :rspec_block?,
|
@@ -57,7 +57,11 @@ module RuboCop
|
|
57
57
|
@described_class = described_class
|
58
58
|
|
59
59
|
find_usage(body) do |match|
|
60
|
-
add_offense(
|
60
|
+
add_offense(
|
61
|
+
match,
|
62
|
+
location: :expression,
|
63
|
+
message: message(match.const_name)
|
64
|
+
)
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
@@ -23,20 +23,18 @@ module RuboCop
|
|
23
23
|
class EmptyLineAfterFinalLet < Cop
|
24
24
|
MSG = 'Add an empty line after the last `let` block.'.freeze
|
25
25
|
|
26
|
-
def_node_matcher :let?, '(block $(send nil {:let :let!} ...) args ...)'
|
26
|
+
def_node_matcher :let?, '(block $(send nil? {:let :let!} ...) args ...)'
|
27
27
|
|
28
28
|
def on_block(node)
|
29
|
-
return unless
|
29
|
+
return unless example_group_with_body?(node)
|
30
30
|
|
31
|
-
latest_let = node
|
32
|
-
node.parent.each_child_node do |sibling|
|
33
|
-
latest_let = sibling if let?(sibling)
|
34
|
-
end
|
31
|
+
latest_let = node.body.child_nodes.select { |child| let?(child) }.last
|
35
32
|
|
36
|
-
return if latest_let.
|
33
|
+
return if latest_let.nil?
|
34
|
+
return if latest_let.equal?(node.body.children.last)
|
37
35
|
|
38
36
|
no_new_line_after(latest_let) do
|
39
|
-
add_offense(latest_let, :expression)
|
37
|
+
add_offense(latest_let, location: :expression)
|
40
38
|
end
|
41
39
|
end
|
42
40
|
|
@@ -68,12 +66,6 @@ module RuboCop
|
|
68
66
|
|
69
67
|
node.each_child_node { |child| heredoc_line(child, &block) }
|
70
68
|
end
|
71
|
-
|
72
|
-
def in_spec_block?(node)
|
73
|
-
node.each_ancestor(:block).any? do |ancestor|
|
74
|
-
Examples::ALL.include?(ancestor.method_name)
|
75
|
-
end
|
76
|
-
end
|
77
69
|
end
|
78
70
|
end
|
79
71
|
end
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
class EmptyLineAfterSubject < Cop
|
18
18
|
MSG = 'Add empty line after `subject`.'.freeze
|
19
19
|
|
20
|
-
def_node_matcher :subject?, '(block $(send nil :subject ...) args ...)'
|
20
|
+
def_node_matcher :subject?, '(block $(send nil? :subject ...) args ...)'
|
21
21
|
|
22
22
|
def on_block(node)
|
23
23
|
return unless subject?(node) && !in_spec_block?(node)
|
@@ -27,7 +27,7 @@ module RuboCop
|
|
27
27
|
next_line = processed_source[send_line]
|
28
28
|
return if next_line.blank?
|
29
29
|
|
30
|
-
add_offense(node, :expression, MSG)
|
30
|
+
add_offense(node, location: :expression, message: MSG)
|
31
31
|
end
|
32
32
|
|
33
33
|
def autocorrect(node)
|
@@ -25,7 +25,7 @@ module RuboCop
|
|
25
25
|
HOOKS = Hooks::ALL.node_pattern_union.freeze
|
26
26
|
|
27
27
|
def_node_matcher :hook, <<-PATTERN
|
28
|
-
(block (send _ $#{HOOKS} ...) _ $!nil)
|
28
|
+
(block (send _ $#{HOOKS} ...) _ $!nil?)
|
29
29
|
PATTERN
|
30
30
|
|
31
31
|
def_node_search :expect, <<-PATTERN
|
@@ -39,8 +39,8 @@ module RuboCop
|
|
39
39
|
hook(node) do |hook_name, body|
|
40
40
|
expect(body) do |expect|
|
41
41
|
method = send_node(expect)
|
42
|
-
add_offense(method, :selector,
|
43
|
-
|
42
|
+
add_offense(method, location: :selector,
|
43
|
+
message: message(method, hook_name))
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -31,18 +31,18 @@ module RuboCop
|
|
31
31
|
MSG = 'Use a block to set a dynamic value to an attribute.'.freeze
|
32
32
|
|
33
33
|
def_node_matcher :dynamic_defined_statically?, <<-PATTERN
|
34
|
-
(send nil _ (send ... ))
|
34
|
+
(send nil? _ (send ... ))
|
35
35
|
PATTERN
|
36
36
|
|
37
37
|
def_node_search :factory_attributes, <<-PATTERN
|
38
|
-
(block (send nil {:factory :trait} ...) _ { (begin $...) $(send ...) } )
|
38
|
+
(block (send nil? {:factory :trait} ...) _ { (begin $...) $(send ...) } )
|
39
39
|
PATTERN
|
40
40
|
|
41
41
|
def on_block(node)
|
42
42
|
return if node.method_name == :trait
|
43
43
|
factory_attributes(node).to_a.flatten.each do |attribute|
|
44
44
|
if dynamic_defined_statically?(attribute)
|
45
|
-
add_offense(attribute, :expression)
|
45
|
+
add_offense(attribute, location: :expression)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
@@ -36,15 +36,15 @@ module RuboCop
|
|
36
36
|
FOCUS_TRUE = s(:pair, FOCUS_SYMBOL, s(:true))
|
37
37
|
|
38
38
|
def_node_matcher :metadata, <<-PATTERN
|
39
|
-
{(send nil #{FOCUSABLE_SELECTORS} ... (hash $...))
|
40
|
-
(send nil #{FOCUSABLE_SELECTORS} $...)}
|
39
|
+
{(send nil? #{FOCUSABLE_SELECTORS} ... (hash $...))
|
40
|
+
(send nil? #{FOCUSABLE_SELECTORS} $...)}
|
41
41
|
PATTERN
|
42
42
|
|
43
43
|
def_node_matcher :focused_block?, focused.send_pattern
|
44
44
|
|
45
45
|
def on_send(node)
|
46
46
|
focus_metadata(node) do |focus|
|
47
|
-
add_offense(focus, :expression)
|
47
|
+
add_offense(focus, location: :expression)
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -77,7 +77,11 @@ module RuboCop
|
|
77
77
|
return check_implicit(method_send) unless scope_name
|
78
78
|
|
79
79
|
style_detected(scope_name)
|
80
|
-
add_offense(
|
80
|
+
add_offense(
|
81
|
+
method_send,
|
82
|
+
location: :expression,
|
83
|
+
message: explicit_message(scope_name)
|
84
|
+
)
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
@@ -95,7 +99,11 @@ module RuboCop
|
|
95
99
|
style_detected(:implicit)
|
96
100
|
return if implicit_style?
|
97
101
|
|
98
|
-
add_offense(
|
102
|
+
add_offense(
|
103
|
+
method_send,
|
104
|
+
location: :selector,
|
105
|
+
message: format(EXPLICIT_MSG, style)
|
106
|
+
)
|
99
107
|
end
|
100
108
|
|
101
109
|
def explicit_message(scope)
|
@@ -31,8 +31,8 @@ module RuboCop
|
|
31
31
|
|
32
32
|
def_node_matcher :implicit_expect, <<-PATTERN
|
33
33
|
{
|
34
|
-
(send nil ${:should :should_not} ...)
|
35
|
-
(send (send nil $:is_expected) {:to :to_not :not_to} ...)
|
34
|
+
(send nil? ${:should :should_not} ...)
|
35
|
+
(send (send nil? $:is_expected) {:to :to_not :not_to} ...)
|
36
36
|
}
|
37
37
|
PATTERN
|
38
38
|
|
@@ -44,7 +44,7 @@ module RuboCop
|
|
44
44
|
|
45
45
|
ENFORCED_REPLACEMENTS = alternatives.merge(alternatives.invert).freeze
|
46
46
|
|
47
|
-
def on_send(node)
|
47
|
+
def on_send(node) # rubocop:disable Metrics/MethodLength
|
48
48
|
return unless (source_range = offending_expect(node))
|
49
49
|
|
50
50
|
expectation_source = source_range.source
|
@@ -54,7 +54,11 @@ module RuboCop
|
|
54
54
|
else
|
55
55
|
opposite_style_detected
|
56
56
|
|
57
|
-
add_offense(
|
57
|
+
add_offense(
|
58
|
+
node,
|
59
|
+
location: source_range,
|
60
|
+
message: offense_message(expectation_source)
|
61
|
+
)
|
58
62
|
end
|
59
63
|
end
|
60
64
|
|
@@ -24,20 +24,20 @@ module RuboCop
|
|
24
24
|
|
25
25
|
EXAMPLES = Examples::ALL.node_pattern_union.freeze
|
26
26
|
|
27
|
-
def_node_matcher :example?, "(block $(send nil #{EXAMPLES}) ...)"
|
27
|
+
def_node_matcher :example?, "(block $(send nil? #{EXAMPLES}) ...)"
|
28
28
|
|
29
29
|
def_node_search :null_double, <<-PATTERN
|
30
30
|
(lvasgn $_
|
31
31
|
(send
|
32
|
-
$(send nil :instance_double
|
32
|
+
$(send nil? :instance_double
|
33
33
|
...) :as_null_object))
|
34
34
|
PATTERN
|
35
35
|
|
36
36
|
def_node_search :have_received_usage, <<-PATTERN
|
37
37
|
(send
|
38
|
-
(send nil :expect
|
38
|
+
(send nil? :expect
|
39
39
|
(lvar $_)) :to
|
40
|
-
(send nil :have_received
|
40
|
+
(send nil? :have_received
|
41
41
|
...)
|
42
42
|
...)
|
43
43
|
PATTERN
|
@@ -47,7 +47,7 @@ module RuboCop
|
|
47
47
|
|
48
48
|
null_double(node) do |var, receiver|
|
49
49
|
have_received_usage(node) do |expected|
|
50
|
-
add_offense(receiver, :expression) if expected == var
|
50
|
+
add_offense(receiver, location: :expression) if expected == var
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -17,12 +17,12 @@ module RuboCop
|
|
17
17
|
MSG = 'Omit `?` from `%<matcher>s`.'.freeze
|
18
18
|
|
19
19
|
def_node_matcher :invalid_predicate_matcher?, <<-PATTERN
|
20
|
-
(send (send nil :expect ...) {:to :not_to :to_not} $(send nil #predicate?))
|
20
|
+
(send (send nil? :expect ...) {:to :not_to :to_not} $(send nil? #predicate?))
|
21
21
|
PATTERN
|
22
22
|
|
23
23
|
def on_send(node)
|
24
24
|
invalid_predicate_matcher?(node) do |predicate|
|
25
|
-
add_offense(predicate, :expression)
|
25
|
+
add_offense(predicate, location: :expression)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -26,13 +26,13 @@ module RuboCop
|
|
26
26
|
PATTERN
|
27
27
|
|
28
28
|
def_node_matcher :expectation?, <<-PATTERN
|
29
|
-
(send (send nil :expect (lvar %)) :to ...)
|
29
|
+
(send (send nil? :expect (lvar %)) :to ...)
|
30
30
|
PATTERN
|
31
31
|
|
32
32
|
def on_block(node)
|
33
33
|
each?(node) do |arg, body|
|
34
34
|
if single_expectation?(body, arg) || only_expectations?(body, arg)
|
35
|
-
add_offense(node.children.first, :expression)
|
35
|
+
add_offense(node.children.first, location: :expression)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
class LeadingSubject < Cop
|
30
30
|
MSG = 'Declare `subject` above any other `let` declarations.'.freeze
|
31
31
|
|
32
|
-
def_node_matcher :subject?, '(block $(send nil :subject ...) args ...)'
|
32
|
+
def_node_matcher :subject?, '(block $(send nil? :subject ...) args ...)'
|
33
33
|
|
34
34
|
def on_block(node)
|
35
35
|
return unless subject?(node) && !in_spec_block?(node)
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
node.parent.each_child_node do |sibling|
|
38
38
|
break if sibling.equal?(node)
|
39
39
|
|
40
|
-
break add_offense(node, :expression) if let?(sibling)
|
40
|
+
break add_offense(node, location: :expression) if let?(sibling)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
class LetBeforeExamples < Cop
|
34
34
|
MSG = 'Move `let` before the examples in the group.'.freeze
|
35
35
|
|
36
|
-
def_node_matcher :let?, '(block (send nil {:let :let!} ...) ...)'
|
36
|
+
def_node_matcher :let?, '(block (send nil? {:let :let!} ...) ...)'
|
37
37
|
def_node_matcher :example_or_group?, <<-PATTERN
|
38
38
|
{
|
39
39
|
#{(Examples::ALL + ExampleGroups::ALL).block_pattern}
|
@@ -58,7 +58,7 @@ module RuboCop
|
|
58
58
|
|
59
59
|
node.each_child_node do |child|
|
60
60
|
if let?(child)
|
61
|
-
add_offense(child, :expression) if example_found
|
61
|
+
add_offense(child, location: :expression) if example_found
|
62
62
|
elsif example_or_group?(child)
|
63
63
|
example_found = true
|
64
64
|
end
|
@@ -30,15 +30,17 @@ module RuboCop
|
|
30
30
|
|
31
31
|
MSG = 'Do not use `let!` for test setup.'.freeze
|
32
32
|
|
33
|
-
def_node_search :let_bang,
|
33
|
+
def_node_search :let_bang, <<-PATTERN
|
34
|
+
(block $(send nil? :let! (sym $_)) args ...)
|
35
|
+
PATTERN
|
34
36
|
|
35
|
-
def_node_search :method_called?, '(send nil %)'
|
37
|
+
def_node_search :method_called?, '(send nil? %)'
|
36
38
|
|
37
39
|
def on_block(node)
|
38
40
|
return unless example_group?(node)
|
39
41
|
|
40
42
|
unused_let_bang(node) do |let|
|
41
|
-
add_offense(let, :expression)
|
43
|
+
add_offense(let, location: :expression)
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
def_node_matcher :message_chain, Matchers::MESSAGE_CHAIN.send_pattern
|
18
18
|
|
19
19
|
def on_send(node)
|
20
|
-
message_chain(node) { add_offense(node, :selector) }
|
20
|
+
message_chain(node) { add_offense(node, location: :selector) }
|
21
21
|
end
|
22
22
|
|
23
23
|
def message(node)
|
@@ -32,16 +32,16 @@ module RuboCop
|
|
32
32
|
SUPPORTED_STYLES = %w[allow expect].freeze
|
33
33
|
|
34
34
|
def_node_matcher :message_expectation, <<-PATTERN
|
35
|
-
(send $(send nil {:expect :allow} ...) :to #receive_message?)
|
35
|
+
(send $(send nil? {:expect :allow} ...) :to #receive_message?)
|
36
36
|
PATTERN
|
37
37
|
|
38
|
-
def_node_search :receive_message?, '(send nil :receive ...)'
|
38
|
+
def_node_search :receive_message?, '(send nil? :receive ...)'
|
39
39
|
|
40
40
|
def on_send(node)
|
41
41
|
message_expectation(node) do |match|
|
42
42
|
return correct_style_detected if preferred_style?(match)
|
43
43
|
|
44
|
-
add_offense(match, :selector, MSG % style) do
|
44
|
+
add_offense(match, location: :selector, message: MSG % style) do
|
45
45
|
opposite_style_detected
|
46
46
|
end
|
47
47
|
end
|
@@ -37,20 +37,22 @@ module RuboCop
|
|
37
37
|
SUPPORTED_STYLES = %w[have_received receive].freeze
|
38
38
|
|
39
39
|
def_node_matcher :message_expectation, %(
|
40
|
-
(send (send nil :expect $_) {:to :to_not :not_to} ...)
|
40
|
+
(send (send nil? :expect $_) {:to :to_not :not_to} ...)
|
41
41
|
)
|
42
42
|
|
43
43
|
def_node_search :receive_message, %(
|
44
|
-
$(send nil {:receive :have_received} ...)
|
44
|
+
$(send nil? {:receive :have_received} ...)
|
45
45
|
)
|
46
46
|
|
47
47
|
def on_send(node)
|
48
48
|
receive_message_matcher(node) do |receiver, message_matcher|
|
49
49
|
return correct_style_detected if preferred_style?(message_matcher)
|
50
50
|
|
51
|
-
add_offense(
|
52
|
-
|
53
|
-
|
51
|
+
add_offense(
|
52
|
+
message_matcher,
|
53
|
+
location: :selector,
|
54
|
+
message: error_message(receiver)
|
55
|
+
) { opposite_style_detected }
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
@@ -99,8 +99,12 @@ module RuboCop
|
|
99
99
|
|
100
100
|
add_offense(
|
101
101
|
method,
|
102
|
-
:expression,
|
103
|
-
format(
|
102
|
+
location: :expression,
|
103
|
+
message: format(
|
104
|
+
MSG,
|
105
|
+
total: expectation_count,
|
106
|
+
max: max_expectations
|
107
|
+
)
|
104
108
|
)
|
105
109
|
end
|
106
110
|
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
MSG = 'Do not set more than one subject per example group'.freeze
|
38
38
|
|
39
39
|
def_node_matcher :named_subject?, <<-PATTERN
|
40
|
-
(block (send nil :subject $sym) args ...)
|
40
|
+
(block (send nil? :subject $sym) args ...)
|
41
41
|
PATTERN
|
42
42
|
|
43
43
|
def on_block(node)
|
@@ -46,7 +46,7 @@ module RuboCop
|
|
46
46
|
subjects = RuboCop::RSpec::ExampleGroup.new(node).subjects
|
47
47
|
|
48
48
|
subjects[0...-1].each do |subject|
|
49
|
-
add_offense(subject, :expression)
|
49
|
+
add_offense(subject, location: :expression)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -48,13 +48,13 @@ module RuboCop
|
|
48
48
|
}
|
49
49
|
PATTERN
|
50
50
|
|
51
|
-
def_node_matcher :unnamed_subject, '$(send nil :subject)'
|
51
|
+
def_node_matcher :unnamed_subject, '$(send nil? :subject)'
|
52
52
|
|
53
53
|
def on_block(node)
|
54
54
|
return unless rspec_block?(node)
|
55
55
|
|
56
56
|
subject_usage(node) do |subject_node|
|
57
|
-
add_offense(subject_node, :selector)
|
57
|
+
add_offense(subject_node, location: :selector)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -99,7 +99,11 @@ module RuboCop
|
|
99
99
|
|
100
100
|
def on_top_level_describe(node, _)
|
101
101
|
find_nested_contexts(node.parent) do |context, nesting|
|
102
|
-
add_offense(
|
102
|
+
add_offense(
|
103
|
+
context.children.first,
|
104
|
+
location: :expression,
|
105
|
+
message: message(nesting)
|
106
|
+
)
|
103
107
|
end
|
104
108
|
end
|
105
109
|
|
@@ -25,7 +25,7 @@ module RuboCop
|
|
25
25
|
MSG = '`%<name>s` is already defined.'.freeze
|
26
26
|
|
27
27
|
def_node_matcher :setup?, <<-PATTERN
|
28
|
-
(block (send nil {:let :let! :subject} (sym $_)) ...)
|
28
|
+
(block (send nil? {:let :let! :subject} (sym $_)) ...)
|
29
29
|
PATTERN
|
30
30
|
|
31
31
|
def on_block(node)
|
@@ -34,7 +34,11 @@ module RuboCop
|
|
34
34
|
_describe, _args, body = *node
|
35
35
|
|
36
36
|
find_duplicates(body) do |duplicate, name|
|
37
|
-
add_offense(
|
37
|
+
add_offense(
|
38
|
+
duplicate,
|
39
|
+
location: :expression,
|
40
|
+
message: format(MSG, name: name)
|
41
|
+
)
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
@@ -12,25 +12,29 @@ module RuboCop
|
|
12
12
|
|
13
13
|
def check_inflected(node)
|
14
14
|
predicate_in_actual?(node) do |predicate|
|
15
|
-
add_offense(
|
15
|
+
add_offense(
|
16
|
+
node,
|
17
|
+
location: :expression,
|
18
|
+
message: message_inflected(predicate)
|
19
|
+
)
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
19
23
|
def_node_matcher :predicate_in_actual?, <<-PATTERN
|
20
24
|
(send
|
21
|
-
(send nil :expect {
|
22
|
-
(block $(send !nil #predicate? ...) ...)
|
23
|
-
$(send !nil #predicate? ...)})
|
25
|
+
(send nil? :expect {
|
26
|
+
(block $(send !nil? #predicate? ...) ...)
|
27
|
+
$(send !nil? #predicate? ...)})
|
24
28
|
${:to :not_to :to_not}
|
25
29
|
$#boolean_matcher?)
|
26
30
|
PATTERN
|
27
31
|
|
28
32
|
def_node_matcher :be_bool?, <<-PATTERN
|
29
|
-
(send nil {:be :eq :eql :equal} {true false})
|
33
|
+
(send nil? {:be :eq :eql :equal} {true false})
|
30
34
|
PATTERN
|
31
35
|
|
32
36
|
def_node_matcher :be_boolthy?, <<-PATTERN
|
33
|
-
(send nil {:be_truthy :be_falsey :be_falsy :a_truthy_value :a_falsey_value :a_falsy_value})
|
37
|
+
(send nil? {:be_truthy :be_falsey :be_falsy :a_truthy_value :a_falsey_value :a_falsy_value})
|
34
38
|
PATTERN
|
35
39
|
|
36
40
|
def boolean_matcher?(node)
|
@@ -130,33 +134,41 @@ module RuboCop
|
|
130
134
|
|
131
135
|
private
|
132
136
|
|
133
|
-
def check_explicit(node)
|
137
|
+
def check_explicit(node) # rubocop:disable Metrics/MethodLength
|
134
138
|
predicate_matcher_block?(node) do |_actual, matcher|
|
135
|
-
add_offense(
|
139
|
+
add_offense(
|
140
|
+
node,
|
141
|
+
location: :expression,
|
142
|
+
message: message_explicit(matcher)
|
143
|
+
)
|
136
144
|
ignore_node(node.children.first)
|
137
145
|
return
|
138
146
|
end
|
139
147
|
|
140
148
|
return if part_of_ignored_node?(node)
|
141
149
|
predicate_matcher?(node) do |_actual, matcher|
|
142
|
-
add_offense(
|
150
|
+
add_offense(
|
151
|
+
node,
|
152
|
+
location: :expression,
|
153
|
+
message: message_explicit(matcher)
|
154
|
+
)
|
143
155
|
end
|
144
156
|
end
|
145
157
|
|
146
158
|
def_node_matcher :predicate_matcher?, <<-PATTERN
|
147
159
|
(send
|
148
|
-
(send nil :expect $!nil)
|
160
|
+
(send nil? :expect $!nil?)
|
149
161
|
{:to :not_to :to_not}
|
150
|
-
{$(send nil #predicate_matcher_name? ...)
|
151
|
-
(block $(send nil #predicate_matcher_name? ...) ...)})
|
162
|
+
{$(send nil? #predicate_matcher_name? ...)
|
163
|
+
(block $(send nil? #predicate_matcher_name? ...) ...)})
|
152
164
|
PATTERN
|
153
165
|
|
154
166
|
def_node_matcher :predicate_matcher_block?, <<-PATTERN
|
155
167
|
(block
|
156
168
|
(send
|
157
|
-
(send nil :expect $!nil)
|
169
|
+
(send nil? :expect $!nil?)
|
158
170
|
{:to :not_to :to_not}
|
159
|
-
$(send nil #predicate_matcher_name?))
|
171
|
+
$(send nil? #predicate_matcher_name?))
|
160
172
|
...)
|
161
173
|
PATTERN
|
162
174
|
|
@@ -11,7 +11,7 @@ module RuboCop
|
|
11
11
|
#
|
12
12
|
# This cop can be configured using the `EnforcedStyle` option
|
13
13
|
#
|
14
|
-
# @example `
|
14
|
+
# @example `EnforcedStyle: block`
|
15
15
|
# # bad
|
16
16
|
# allow(Foo).to receive(:bar).and_return("baz")
|
17
17
|
# expect(Foo).to receive(:bar).and_return("baz")
|
@@ -22,7 +22,7 @@ module RuboCop
|
|
22
22
|
# # also good as the returned value is dynamic
|
23
23
|
# allow(Foo).to receive(:bar).and_return(bar.baz)
|
24
24
|
#
|
25
|
-
# @example `
|
25
|
+
# @example `EnforcedStyle: and_return`
|
26
26
|
# # bad
|
27
27
|
# allow(Foo).to receive(:bar) { "baz" }
|
28
28
|
# expect(Foo).to receive(:bar) { "baz" }
|
@@ -41,7 +41,7 @@ module RuboCop
|
|
41
41
|
|
42
42
|
def_node_matcher :and_return_value, <<-PATTERN
|
43
43
|
(send
|
44
|
-
(send nil :receive (...)) :and_return $(...)
|
44
|
+
(send nil? :receive (...)) :and_return $(...)
|
45
45
|
)
|
46
46
|
PATTERN
|
47
47
|
|
@@ -57,7 +57,13 @@ module RuboCop
|
|
57
57
|
|
58
58
|
def check_and_return_call(node)
|
59
59
|
and_return_value(node) do |args|
|
60
|
-
|
60
|
+
unless dynamic?(args)
|
61
|
+
add_offense(
|
62
|
+
node,
|
63
|
+
location: :expression,
|
64
|
+
message: MSG_BLOCK
|
65
|
+
)
|
66
|
+
end
|
61
67
|
end
|
62
68
|
end
|
63
69
|
|
@@ -66,7 +72,13 @@ module RuboCop
|
|
66
72
|
return unless block
|
67
73
|
|
68
74
|
_receiver, _args, body = *block
|
69
|
-
|
75
|
+
unless dynamic?(body) # rubocop:disable Style/GuardClause
|
76
|
+
add_offense(
|
77
|
+
node,
|
78
|
+
location: :expression,
|
79
|
+
message: MSG_AND_RETURN
|
80
|
+
)
|
81
|
+
end
|
70
82
|
end
|
71
83
|
|
72
84
|
def dynamic?(node)
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
class ScatteredLet < Cop
|
30
30
|
MSG = 'Group all let/let! blocks in the example group together.'.freeze
|
31
31
|
|
32
|
-
def_node_matcher :let?, '(block (send nil {:let :let!} ...) ...)'
|
32
|
+
def_node_matcher :let?, '(block (send nil? {:let :let!} ...) ...)'
|
33
33
|
|
34
34
|
def on_block(node)
|
35
35
|
return unless example_group_with_body?(node)
|
@@ -45,7 +45,7 @@ module RuboCop
|
|
45
45
|
|
46
46
|
node.each_child_node do |child|
|
47
47
|
if let?(child)
|
48
|
-
add_offense(child, :expression) if mix_found
|
48
|
+
add_offense(child, location: :expression) if mix_found
|
49
49
|
let_found = true
|
50
50
|
elsif let_found
|
51
51
|
mix_found = true
|
@@ -99,7 +99,11 @@ module RuboCop
|
|
99
99
|
end
|
100
100
|
|
101
101
|
def add_shared_item_offense(node, message)
|
102
|
-
add_offense(
|
102
|
+
add_offense(
|
103
|
+
node.children.first,
|
104
|
+
location: :expression,
|
105
|
+
message: message
|
106
|
+
)
|
103
107
|
end
|
104
108
|
end
|
105
109
|
end
|
@@ -40,8 +40,8 @@ module RuboCop
|
|
40
40
|
# @yield [Symbol] subject name
|
41
41
|
def_node_matcher :subject, <<-PATTERN
|
42
42
|
{
|
43
|
-
(block (send nil :subject (sym $_)) args ...)
|
44
|
-
(block (send nil $:subject) args ...)
|
43
|
+
(block (send nil? :subject (sym $_)) args ...)
|
44
|
+
(block (send nil? $:subject) args ...)
|
45
45
|
}
|
46
46
|
PATTERN
|
47
47
|
|
@@ -57,17 +57,19 @@ module RuboCop
|
|
57
57
|
# expect(foo).to receive(:bar).with(1).and_return(2)
|
58
58
|
def_node_matcher :message_expectation?, <<-PATTERN
|
59
59
|
{
|
60
|
-
(send nil :allow (send nil %))
|
61
|
-
(send (send nil :expect (send nil %)) :to #receive_message?)
|
60
|
+
(send nil? :allow (send nil? %))
|
61
|
+
(send (send nil? :expect (send nil? %)) :to #receive_message?)
|
62
62
|
}
|
63
63
|
PATTERN
|
64
64
|
|
65
|
-
def_node_search :receive_message?, '(send nil :receive ...)'
|
65
|
+
def_node_search :receive_message?, '(send nil? :receive ...)'
|
66
66
|
|
67
67
|
def on_block(node)
|
68
68
|
return unless example_group?(node)
|
69
69
|
|
70
|
-
find_subject_stub(node)
|
70
|
+
find_subject_stub(node) do |stub|
|
71
|
+
add_offense(stub, location: :expression)
|
72
|
+
end
|
71
73
|
end
|
72
74
|
|
73
75
|
private
|
@@ -21,14 +21,14 @@ module RuboCop
|
|
21
21
|
MSG = 'Prefer using verifying doubles over normal doubles.'.freeze
|
22
22
|
|
23
23
|
def_node_matcher :unverified_double, <<-PATTERN
|
24
|
-
{(send nil {:double :spy} $_ ...) }
|
24
|
+
{(send nil? {:double :spy} $_ ...) }
|
25
25
|
PATTERN
|
26
26
|
|
27
27
|
def on_send(node)
|
28
28
|
unverified_double(node) do |name|
|
29
29
|
return if name.sym_type? && cop_config['IgnoreSymbolicNames']
|
30
30
|
|
31
|
-
add_offense(node, :expression)
|
31
|
+
add_offense(node, location: :expression)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -16,7 +16,7 @@ module RuboCop
|
|
16
16
|
'Chain the methods or remove it.'.freeze
|
17
17
|
|
18
18
|
def_node_matcher :expect?, <<-PATTERN
|
19
|
-
(send nil :expect ...)
|
19
|
+
(send nil? :expect ...)
|
20
20
|
PATTERN
|
21
21
|
|
22
22
|
def_node_matcher :expect_block?, <<-PATTERN
|
@@ -37,7 +37,7 @@ module RuboCop
|
|
37
37
|
|
38
38
|
def check_expect(node)
|
39
39
|
return unless void?(node)
|
40
|
-
add_offense(node, :expression)
|
40
|
+
add_offense(node, location: :expression)
|
41
41
|
end
|
42
42
|
|
43
43
|
def void?(expect)
|
@@ -18,7 +18,7 @@ module RuboCop
|
|
18
18
|
#
|
19
19
|
# Detect if node is `before`, `after`, `around`
|
20
20
|
def_node_matcher :hook, <<-PATTERN
|
21
|
-
(block {$(send nil #{Hooks::ALL.node_pattern_union} ...)} ...)
|
21
|
+
(block {$(send nil? #{Hooks::ALL.node_pattern_union} ...)} ...)
|
22
22
|
PATTERN
|
23
23
|
|
24
24
|
def_node_matcher :subject, Subject::ALL.block_pattern
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
10
10
|
def_node_matcher :example_group?, ExampleGroups::ALL.block_pattern
|
11
11
|
|
12
12
|
def_node_matcher :example_group_with_body?, <<-PATTERN
|
13
|
-
(block #{ExampleGroups::ALL.send_pattern} args [!nil])
|
13
|
+
(block #{ExampleGroups::ALL.send_pattern} args [!nil?])
|
14
14
|
PATTERN
|
15
15
|
|
16
16
|
def_node_matcher :example?, Examples::ALL.block_pattern
|
data/rubocop-rspec.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.test_files = spec.files.grep(%r{^spec/})
|
33
33
|
spec.extra_rdoc_files = ['MIT-LICENSE.md', 'README.md']
|
34
34
|
|
35
|
-
spec.add_runtime_dependency 'rubocop', '>= 0.
|
35
|
+
spec.add_runtime_dependency 'rubocop', '>= 0.51.0'
|
36
36
|
|
37
37
|
spec.add_development_dependency 'rake'
|
38
38
|
spec.add_development_dependency 'rspec', '>= 3.4'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Backus
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-
|
13
|
+
date: 2017-10-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rubocop
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.51.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: 0.
|
28
|
+
version: 0.51.0
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: rake
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|