saturnflyer-rspec-rails-matchers 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +10 -0
- data/MIT-LICENSE +20 -0
- data/README +187 -0
- data/TODO +4 -0
- data/lib/spec/rails/matchers/associations.rb +33 -0
- data/lib/spec/rails/matchers/observers.rb +34 -0
- data/lib/spec/rails/matchers/validations.rb +56 -0
- data/lib/spec/rails/matchers/views.rb +102 -0
- data/rspec-rails-matchers.gemspec +24 -0
- metadata +76 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
Change Log
|
2
|
+
==========
|
3
|
+
|
4
|
+
Trunk
|
5
|
+
-----
|
6
|
+
|
7
|
+
* 2008/03/02 - Added have_form_putting_to(url_or_path) - Patch by unknown google code submitter
|
8
|
+
* 2008/03/02 - Added should observe (Luke Melia)
|
9
|
+
* 2008/03/02 - Patched validates_length_of to use within to be consistent with Rails (Matt Pelletier)
|
10
|
+
* 2007/01/03 - Initial Public Release
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 The Plugin Development Team
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
rspec-on-rails-matchers
|
2
|
+
=======================
|
3
|
+
|
4
|
+
Setup
|
5
|
+
------
|
6
|
+
|
7
|
+
Dependencies:
|
8
|
+
-------------
|
9
|
+
|
10
|
+
* rspec
|
11
|
+
* rspec_on_rails
|
12
|
+
|
13
|
+
Overview
|
14
|
+
--------
|
15
|
+
|
16
|
+
Adds the following RSpec matchers:
|
17
|
+
|
18
|
+
* Associations:
|
19
|
+
Verify that the association has been defined. (doesn't verify that the association works!)
|
20
|
+
|
21
|
+
object.should have_many(:association)
|
22
|
+
example: @post.should have_many(:comments)
|
23
|
+
TM snippet: [mshm + tab] (Model Should Have Many)
|
24
|
+
|
25
|
+
object.should belong_to(:association)
|
26
|
+
example: @comment.should belong_to(:post)
|
27
|
+
TM snippet: [msbt + tab]
|
28
|
+
|
29
|
+
object.should have_one(:association)
|
30
|
+
user.should have_one(:social_security_number)
|
31
|
+
TM snippet: [msho + tab]
|
32
|
+
|
33
|
+
object.should have_and_belong_to_many(:association)
|
34
|
+
project.should have_and_belong_to_many(:categories)
|
35
|
+
TM snippet: [mshabtm + tab]
|
36
|
+
|
37
|
+
|
38
|
+
* Validations:
|
39
|
+
Verify that a validation has been defined. (doesn't test the validation itself)
|
40
|
+
|
41
|
+
object.should validate_presence_of(:attribute)
|
42
|
+
TM snippet: [msvp + tab]
|
43
|
+
|
44
|
+
object.should validate_confirmation_of(:attribute)
|
45
|
+
TM snippet: [msvc + tab]
|
46
|
+
|
47
|
+
object.should validate_uniqueness_of(:attribute)
|
48
|
+
TM snippet: [msvu + tab]
|
49
|
+
|
50
|
+
object.should validate_length_of(:attribute, :within => 5..10)
|
51
|
+
object.should validate_length_of(:attribute, :is => 5)
|
52
|
+
TM snippet: [msvl + tab]
|
53
|
+
|
54
|
+
* Observers:
|
55
|
+
Verify that the observer is observing a class. (doesn't verify that the observation works)
|
56
|
+
|
57
|
+
object.should observe(:model)
|
58
|
+
example: GroupObserver.should observe(Group)
|
59
|
+
|
60
|
+
* Views:
|
61
|
+
Verifies that the views contains some tags.
|
62
|
+
|
63
|
+
response.should have_form_posting_to(url_or_path)
|
64
|
+
TM snippet: [hfpt + tab]
|
65
|
+
|
66
|
+
response.should have_form_putting_to(url_or_path)
|
67
|
+
|
68
|
+
response.should have_text_field_for(:attribute)
|
69
|
+
TM snippet: [htff + tab]
|
70
|
+
|
71
|
+
response.should have_label_for(:attribute)
|
72
|
+
TM snippet: [hlf + tab]
|
73
|
+
|
74
|
+
response.should have_password_field_for(:attribute)
|
75
|
+
TM snippet: [hpff + tab]
|
76
|
+
|
77
|
+
response.should have_checkbox_for(:attribute)
|
78
|
+
TM snippet: [hcf + tab]
|
79
|
+
|
80
|
+
response.should have_submit_button
|
81
|
+
TM snippet: [hsb + tab]
|
82
|
+
|
83
|
+
response.should have_link_to(url_or_path, "optional_text")
|
84
|
+
TM snippet: [hlt + tab]
|
85
|
+
|
86
|
+
* nested view tests:
|
87
|
+
for instance:
|
88
|
+
|
89
|
+
response.should have_form_posting_to(url_or_path) do
|
90
|
+
with_text_field_for(:attribute)
|
91
|
+
end
|
92
|
+
|
93
|
+
with_text_field_for(:attribute)
|
94
|
+
TM snippet: [wtff + tab]
|
95
|
+
|
96
|
+
with_label_for(:attribute)
|
97
|
+
TM snippet: [wlf + tab]
|
98
|
+
|
99
|
+
with_password_field_for(:attribute)
|
100
|
+
TM snippet: [wpff + tab]
|
101
|
+
|
102
|
+
with_checkbox_for(:attribute)
|
103
|
+
TM snippet: [wcf + tab]
|
104
|
+
|
105
|
+
with_submit_button
|
106
|
+
TM snippet: [wsb + tab]
|
107
|
+
|
108
|
+
with_link_to(url_or_path, "optional_text")
|
109
|
+
TM snippet: [wlt + tab]
|
110
|
+
|
111
|
+
Usage:
|
112
|
+
------
|
113
|
+
|
114
|
+
In your view spec:
|
115
|
+
|
116
|
+
it "should render new form" do
|
117
|
+
render "/users/new.html.erb"
|
118
|
+
|
119
|
+
response.should have_form_posting_to(users_path) do
|
120
|
+
with_text_field_for(:user_name)
|
121
|
+
with_text_area_for(:user_address)
|
122
|
+
with_text_field_for(:user_login)
|
123
|
+
with_text_field_for(:user_email)
|
124
|
+
with_submit_button
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
In your model spec:
|
129
|
+
|
130
|
+
describe User do
|
131
|
+
before(:each) do
|
132
|
+
@user = User.new
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should have many posts" do
|
136
|
+
@user.should have_many(:posts)
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should belong to a group" do
|
140
|
+
@user.should belong_to(:group)
|
141
|
+
end
|
142
|
+
|
143
|
+
it do
|
144
|
+
@user.should validate_presence_of(:email)
|
145
|
+
end
|
146
|
+
|
147
|
+
it do
|
148
|
+
@user.should validate_uniqueness_of(:email)
|
149
|
+
end
|
150
|
+
|
151
|
+
it do
|
152
|
+
@user.should validate_uniqueness_of(:login)
|
153
|
+
end
|
154
|
+
|
155
|
+
it do
|
156
|
+
@user.should validate_presence_of(:login)
|
157
|
+
end
|
158
|
+
|
159
|
+
it do
|
160
|
+
@user.should validate_presence_of(:name)
|
161
|
+
end
|
162
|
+
|
163
|
+
it do
|
164
|
+
@user.should validate_length_of(:password, :between => 4..40)
|
165
|
+
end
|
166
|
+
|
167
|
+
it do
|
168
|
+
@user.should validate_confirmation_of(:password)
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
Core Contributors
|
174
|
+
-----------------
|
175
|
+
|
176
|
+
* Josh Knowles <joshknowles@gmail.com>
|
177
|
+
* Bryan Helmkamp <bryan@brynary.com>
|
178
|
+
* Matt Aimonetti <mattaimonetti@gmail.com>
|
179
|
+
|
180
|
+
Contributors
|
181
|
+
-------------
|
182
|
+
|
183
|
+
* ckknight
|
184
|
+
* Matt Pelletier
|
185
|
+
* Luke Melia
|
186
|
+
|
187
|
+
Copyright (c) 2008 The Plugin Development Team, released under the MIT license
|
data/TODO
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Spec
|
2
|
+
module Rails
|
3
|
+
module Matchers
|
4
|
+
def belong_to(association)
|
5
|
+
return simple_matcher("model to belong to #{association}") do |model|
|
6
|
+
model = model.class if model.is_a? ActiveRecord::Base
|
7
|
+
model.reflect_on_all_associations(:belongs_to).find { |a| a.name == association }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def have_many(association)
|
12
|
+
return simple_matcher("model to have many #{association}") do |model|
|
13
|
+
model = model.class if model.is_a? ActiveRecord::Base
|
14
|
+
model.reflect_on_all_associations(:has_many).find { |a| a.name == association }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def have_one(association)
|
19
|
+
return simple_matcher("model to have one #{association}") do |model|
|
20
|
+
model = model.class if model.is_a? ActiveRecord::Base
|
21
|
+
model.reflect_on_all_associations(:has_one).find { |a| a.name == association }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def have_and_belong_to_many(association)
|
26
|
+
return simple_matcher("model to have and belong to many #{association}") do |model|
|
27
|
+
model = model.class if model.is_a? ActiveRecord::Base
|
28
|
+
model.reflect_on_all_associations(:has_and_belongs_to_many).find { |a| a.name == association }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Spec
|
2
|
+
module Rails
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
class Observe
|
6
|
+
def initialize(expected_model_class)
|
7
|
+
@expected_model_class = expected_model_class
|
8
|
+
end
|
9
|
+
|
10
|
+
def matches?(observer)
|
11
|
+
@observer = observer
|
12
|
+
if @observer.is_a?(ActiveRecord::Observer)
|
13
|
+
@observer = @observer.class
|
14
|
+
end
|
15
|
+
@observed_classes = observer.observed_classes.flatten
|
16
|
+
@observed_classes.include?(@expected_model_class)
|
17
|
+
end
|
18
|
+
|
19
|
+
def failure_message
|
20
|
+
return "expected #{@observer.name} to observe #{@expected_model_class.name}, but it was not included in [#{@observed_classes.map(&:name).join(', ')}]"
|
21
|
+
end
|
22
|
+
|
23
|
+
def description
|
24
|
+
"observer to be observing #{@expected_model_class.name}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def observe(expected_model_class)
|
29
|
+
Observe.new(expected_model_class)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Spec
|
2
|
+
module Rails
|
3
|
+
module Matchers
|
4
|
+
def validate_presence_of(attribute)
|
5
|
+
return simple_matcher("model to validate the presence of #{attribute}") do |model|
|
6
|
+
model.send("#{attribute}=", nil)
|
7
|
+
!model.valid? && model.errors.invalid?(attribute)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def validate_length_of(attribute, options)
|
12
|
+
if options.has_key? :within
|
13
|
+
min = options[:within].first
|
14
|
+
max = options[:within].last
|
15
|
+
elsif options.has_key? :is
|
16
|
+
min = options[:is]
|
17
|
+
max = min
|
18
|
+
elsif options.has_key? :minimum
|
19
|
+
min = options[:minimum]
|
20
|
+
elsif options.has_key? :maximum
|
21
|
+
max = options[:maximum]
|
22
|
+
end
|
23
|
+
|
24
|
+
return simple_matcher("model to validate the length of #{attribute} within #{min || 0} and #{max || 'Infinity'}") do |model|
|
25
|
+
invalid = false
|
26
|
+
if !min.nil? && min >= 1
|
27
|
+
model.send("#{attribute}=", 'a' * (min - 1))
|
28
|
+
|
29
|
+
invalid = !model.valid? && model.errors.invalid?(attribute)
|
30
|
+
end
|
31
|
+
|
32
|
+
if !max.nil?
|
33
|
+
model.send("#{attribute}=", 'a' * (max + 1))
|
34
|
+
|
35
|
+
invalid ||= !model.valid? && model.errors.invalid?(attribute)
|
36
|
+
end
|
37
|
+
invalid
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def validate_uniqueness_of(attribute)
|
42
|
+
return simple_matcher("model to validate the uniqueness of #{attribute}") do |model|
|
43
|
+
model.class.stub!(:find).and_return(true)
|
44
|
+
!model.valid? && model.errors.invalid?(attribute)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def validate_confirmation_of(attribute)
|
49
|
+
return simple_matcher("model to validate the confirmation of #{attribute}") do |model|
|
50
|
+
model.send("#{attribute}_confirmation=", 'asdf')
|
51
|
+
!model.valid? && model.errors.invalid?(attribute)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Spec
|
2
|
+
module Rails
|
3
|
+
module Matchers
|
4
|
+
def have_form_posting_to(url_or_path)
|
5
|
+
return simple_matcher("have a form submitting via POST to '#{url_or_path}'") do |response|
|
6
|
+
have_tag("form[method=post][action=#{url_or_path}]").matches?(response)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def have_form_puting_to(url_or_path, id)
|
11
|
+
return simple_matcher("have a form submitting via PUT to '#{url_or_path}/#{id}'") do |response|
|
12
|
+
have_tag("form[method=post][action=#{url_or_path}/#{id}]").matches?(response)
|
13
|
+
have_tag("input[name=_method][type=hidden][value=put]").matches?(response)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def have_label_for(attribute, text)
|
18
|
+
return simple_matcher("have a label for '#{attribute}' with value of '#{text}'") do |response|
|
19
|
+
have_tag("label[for=#{attribute}]").matches?(response)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def with_label_for(attribute, text)
|
24
|
+
return simple_matcher("have a label for '#{attribute}' with value of '#{text}'") do |response|
|
25
|
+
with_tag("label[for=#{attribute}]").matches?(response)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def have_text_field_for(attribute)
|
30
|
+
return simple_matcher("have a text field for '#{attribute}'") do |response|
|
31
|
+
have_tag("input##{attribute}[type=text]").matches?(response)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def with_text_field_for(attribute)
|
36
|
+
return simple_matcher("with a text field for '#{attribute}'") do |response|
|
37
|
+
with_tag("input##{attribute}[type=text]").matches?(response)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def have_text_area_for(attribute)
|
42
|
+
return simple_matcher("have a text field for '#{attribute}'") do |response|
|
43
|
+
have_tag("textarea##{attribute}[type=text]").matches?(response)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def with_text_area_for(attribute)
|
48
|
+
return simple_matcher("have a text field for '#{attribute}'") do |response|
|
49
|
+
with_tag("textarea##{attribute}[type=text]").matches?(response)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def have_password_field_for(attribute)
|
54
|
+
return simple_matcher("have a password field for '#{attribute}'") do |response|
|
55
|
+
have_tag("input##{attribute}[type=password]").matches?(response)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def with_password_field_for(attribute)
|
60
|
+
return simple_matcher("have a password field for '#{attribute}'") do |response|
|
61
|
+
with_tag("input##{attribute}[type=password]").matches?(response)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def have_checkbox_for(attribute)
|
66
|
+
return simple_matcher("have a checkbox for '#{attribute}'") do |response|
|
67
|
+
have_tag("input##{attribute}[type=checkbox]").matches?(response)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def with_checkbox_for(attribute)
|
72
|
+
return simple_matcher("have a checkbox for '#{attribute}'") do |response|
|
73
|
+
with_tag("input##{attribute}[type=checkbox]").matches?(response)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def have_submit_button
|
78
|
+
return simple_matcher("have a submit button") do |response|
|
79
|
+
have_tag("input[type=submit]").matches?(response)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def with_submit_button
|
84
|
+
return simple_matcher("have a submit button") do |response|
|
85
|
+
with_tag("input[type=submit]").matches?(response)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def have_link_to(url_or_path, text = nil)
|
90
|
+
return simple_matcher("have a link to '#{url_or_path}'") do |response|
|
91
|
+
have_tag("a[href=#{url_or_path}]", text).matches?(response)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def with_link_to(url_or_path, text = nil)
|
96
|
+
return simple_matcher("have a link to '#{url_or_path}'") do |response|
|
97
|
+
with_tag("a[href=#{url_or_path}]", text).matches?(response)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "rspec-rails-matchers"
|
3
|
+
s.version = "1.0.0"
|
4
|
+
s.date = "2009-01-14"
|
5
|
+
s.summary = "Rails-specific matchers for RSpec"
|
6
|
+
s.email = "jim@saturnflyer.com"
|
7
|
+
s.homepage = "http://github.com/saturnflyer/rspec-rails-matchers"
|
8
|
+
s.description = "Rspec-Rails-Matchers is a library of matchers for RSpec to make writing specs short and sweet."
|
9
|
+
s.has_rdoc = true
|
10
|
+
s.authors = ["Josh Knowles", "Bryan Helmkamp", "Matt Aimonetti"]
|
11
|
+
s.files = ["CHANGELOG",
|
12
|
+
"README",
|
13
|
+
"TODO",
|
14
|
+
"MIT-LICENSE",
|
15
|
+
"rspec-rails-matchers.gemspec",
|
16
|
+
"lib/spec/rails/matchers/associations.rb",
|
17
|
+
"lib/spec/rails/matchers/observers.rb",
|
18
|
+
"lib/spec/rails/matchers/validations.rb",
|
19
|
+
"lib/spec/rails/matchers/views.rb" ]
|
20
|
+
s.test_files = []
|
21
|
+
s.rdoc_options = []
|
22
|
+
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
|
23
|
+
s.add_dependency("rspec-rails", ["> 1.1.12"])
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: saturnflyer-rspec-rails-matchers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Josh Knowles
|
8
|
+
- Bryan Helmkamp
|
9
|
+
- Matt Aimonetti
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
|
14
|
+
date: 2009-01-14 00:00:00 -08:00
|
15
|
+
default_executable:
|
16
|
+
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
18
|
+
name: rspec-rails
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">"
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 1.1.12
|
25
|
+
version:
|
26
|
+
description: Rspec-Rails-Matchers is a library of matchers for RSpec to make writing specs short and sweet.
|
27
|
+
email: jim@saturnflyer.com
|
28
|
+
executables: []
|
29
|
+
|
30
|
+
extensions: []
|
31
|
+
|
32
|
+
extra_rdoc_files:
|
33
|
+
- History.txt
|
34
|
+
- Manifest.txt
|
35
|
+
- README.txt
|
36
|
+
files:
|
37
|
+
- CHANGELOG
|
38
|
+
- README
|
39
|
+
- TODO
|
40
|
+
- MIT-LICENSE
|
41
|
+
- rspec-rails-matchers.gemspec
|
42
|
+
- lib/spec/rails/matchers/associations.rb
|
43
|
+
- lib/spec/rails/matchers/observers.rb
|
44
|
+
- lib/spec/rails/matchers/validations.rb
|
45
|
+
- lib/spec/rails/matchers/views.rb
|
46
|
+
- History.txt
|
47
|
+
- Manifest.txt
|
48
|
+
- README.txt
|
49
|
+
has_rdoc: true
|
50
|
+
homepage: http://github.com/saturnflyer/rspec-rails-matchers
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: "0"
|
61
|
+
version:
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "0"
|
67
|
+
version:
|
68
|
+
requirements: []
|
69
|
+
|
70
|
+
rubyforge_project:
|
71
|
+
rubygems_version: 1.2.0
|
72
|
+
signing_key:
|
73
|
+
specification_version: 2
|
74
|
+
summary: Rails-specific matchers for RSpec
|
75
|
+
test_files: []
|
76
|
+
|