rubocop-rspec 1.18.0 → 1.19.0
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/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
|