perpetuity 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +3 -0
- data/Guardfile +24 -0
- data/README.md +142 -0
- data/Rakefile +6 -0
- data/lib/perpetuity/attribute.rb +17 -0
- data/lib/perpetuity/attribute_set.rb +23 -0
- data/lib/perpetuity/config.rb +11 -0
- data/lib/perpetuity/data_injectable.rb +21 -0
- data/lib/perpetuity/mapper.rb +195 -0
- data/lib/perpetuity/mongodb/query.rb +19 -0
- data/lib/perpetuity/mongodb/query_attribute.rb +49 -0
- data/lib/perpetuity/mongodb/query_expression.rb +55 -0
- data/lib/perpetuity/mongodb.rb +102 -0
- data/lib/perpetuity/retrieval.rb +82 -0
- data/lib/perpetuity/validations/length.rb +36 -0
- data/lib/perpetuity/validations/presence.rb +14 -0
- data/lib/perpetuity/validations/validation_set.rb +27 -0
- data/lib/perpetuity/validations.rb +1 -0
- data/lib/perpetuity/version.rb +3 -0
- data/lib/perpetuity.rb +23 -0
- data/perpetuity.gemspec +25 -0
- data/spec/perpetuity/attribute_set_spec.rb +19 -0
- data/spec/perpetuity/attribute_spec.rb +19 -0
- data/spec/perpetuity/config_spec.rb +13 -0
- data/spec/perpetuity/data_injectable_spec.rb +26 -0
- data/spec/perpetuity/mapper_spec.rb +51 -0
- data/spec/perpetuity/mongodb/query_attribute_spec.rb +42 -0
- data/spec/perpetuity/mongodb/query_expression_spec.rb +49 -0
- data/spec/perpetuity/mongodb/query_spec.rb +37 -0
- data/spec/perpetuity/mongodb_spec.rb +91 -0
- data/spec/perpetuity/retrieval_spec.rb +58 -0
- data/spec/perpetuity/validations/length_spec.rb +53 -0
- data/spec/perpetuity/validations/presence_spec.rb +30 -0
- data/spec/perpetuity/validations_spec.rb +87 -0
- data/spec/perpetuity_spec.rb +293 -0
- data/spec/test_classes.rb +93 -0
- metadata +181 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'perpetuity/validations/presence'
|
2
|
+
|
3
|
+
module Perpetuity
|
4
|
+
module Validations
|
5
|
+
describe Presence do
|
6
|
+
let(:presence) { Presence.new :to_s }
|
7
|
+
let(:valid) { double('valid object') }
|
8
|
+
let(:invalid) { double('invalid object') }
|
9
|
+
|
10
|
+
it 'validates values that are present' do
|
11
|
+
presence.pass?(valid).should be_true
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'invalidates nil values' do
|
15
|
+
invalid.stub(to_s: nil)
|
16
|
+
presence.pass?(invalid).should be_false
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'invalidates empty strings' do
|
20
|
+
invalid.stub(to_s: '')
|
21
|
+
presence.pass?(invalid).should be_false
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'invalidates strings with only whitespace' do
|
25
|
+
invalid.stub(to_s: ' ')
|
26
|
+
presence.pass?(invalid).should be_false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'perpetuity/validations'
|
2
|
+
|
3
|
+
module Perpetuity
|
4
|
+
describe ValidationSet do
|
5
|
+
let(:validation_set) { ValidationSet.new }
|
6
|
+
it 'is empty when created' do
|
7
|
+
validation_set.should be_empty
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'can add validations' do
|
11
|
+
v = double('validation')
|
12
|
+
validation_set << v
|
13
|
+
|
14
|
+
validation_set.first.should == v
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'validates an object' do
|
18
|
+
v = double('validation')
|
19
|
+
v.stub(pass?: true)
|
20
|
+
validation_set << v
|
21
|
+
|
22
|
+
validation_set.should be_valid(double('object'))
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'invalidates an object' do
|
26
|
+
v = double('validation')
|
27
|
+
v.stub(pass?: false)
|
28
|
+
validation_set << v
|
29
|
+
|
30
|
+
validation_set.should_not be_valid(double('object'))
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'validation types' do
|
34
|
+
let(:valid_object) { double('valid object') }
|
35
|
+
let(:invalid_object) { double('invalid object') }
|
36
|
+
|
37
|
+
it 'validates presence of an attribute' do
|
38
|
+
valid_object.stub(email: 'me@example.com')
|
39
|
+
validation_set.present :email
|
40
|
+
|
41
|
+
validation_set.count.should eq 1
|
42
|
+
validation_set.should be_valid(valid_object)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'validates length of an attribute' do
|
46
|
+
valid_object.stub(email: 'me@example.com')
|
47
|
+
validation_set.length :email, at_most: 14
|
48
|
+
validation_set.length :email, at_least: 14
|
49
|
+
|
50
|
+
validation_set.count.should eq 2
|
51
|
+
validation_set.should be_valid(valid_object)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'validates length within a range' do
|
55
|
+
valid_object.stub(email: 'me@example.com')
|
56
|
+
validation_set.length :email, between: (14..14)
|
57
|
+
|
58
|
+
validation_set.should have(1).items
|
59
|
+
validation_set.should be_valid(valid_object)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'invalidates length within a range' do
|
63
|
+
invalid_object.stub(email: 'me@example.com')
|
64
|
+
validation_set.length :email, between: (0..13)
|
65
|
+
|
66
|
+
validation_set.should have(1).items
|
67
|
+
validation_set.should be_invalid(invalid_object)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'invalidates when attribute is too short' do
|
71
|
+
invalid_object.stub(email: 'foo')
|
72
|
+
validation_set.length :email, at_least: 4
|
73
|
+
|
74
|
+
validation_set.count.should eq 1
|
75
|
+
validation_set.should be_invalid(invalid_object)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'invalidates when attribute is too long' do
|
79
|
+
invalid_object.stub(email: 'me@example.com')
|
80
|
+
subject.length :email, at_most: 4
|
81
|
+
|
82
|
+
subject.count.should eq 1
|
83
|
+
subject.should be_invalid(invalid_object)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,293 @@
|
|
1
|
+
require 'perpetuity'
|
2
|
+
require 'test_classes'
|
3
|
+
|
4
|
+
describe Perpetuity do
|
5
|
+
before(:all) do
|
6
|
+
# Use MongoDB for now as its the only one supported.
|
7
|
+
mongodb = Perpetuity::MongoDB.new db: 'perpetuity_gem_test'
|
8
|
+
Perpetuity.configure { data_source mongodb }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'mapper generation' do
|
12
|
+
it 'generates mappers' do
|
13
|
+
mapper = Perpetuity.generate_mapper_for Object
|
14
|
+
Perpetuity[Object].should be_a Perpetuity::Mapper
|
15
|
+
Perpetuity[Object].should be == mapper
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'persistence' do
|
20
|
+
it "persists an object" do
|
21
|
+
article = Article.new 'I have a title'
|
22
|
+
expect { Perpetuity::Mapper[Article].insert article }.
|
23
|
+
to change { Perpetuity::Mapper[Article].count }.by 1
|
24
|
+
Perpetuity::Mapper[Article].find(article.id).title.should eq 'I have a title'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'returns the id of the persisted object' do
|
28
|
+
article = Article.new
|
29
|
+
Perpetuity::Mapper[Article].insert(article).should eq article.id
|
30
|
+
end
|
31
|
+
|
32
|
+
it "gives an id to objects" do
|
33
|
+
article = Article.new
|
34
|
+
Perpetuity::Mapper[Article].give_id_to article, 1
|
35
|
+
|
36
|
+
article.id.should eq 1
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'id injection' do
|
40
|
+
let(:article) { Article.new }
|
41
|
+
|
42
|
+
it 'assigns an id to the inserted object' do
|
43
|
+
Perpetuity::Mapper[Article].insert article
|
44
|
+
article.should respond_to :id
|
45
|
+
end
|
46
|
+
|
47
|
+
it "assigns an id using Mapper.first" do
|
48
|
+
Perpetuity::Mapper[Article].first.should respond_to :id
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'assigns an id using Mapper.retrieve.first' do
|
52
|
+
Perpetuity::Mapper[Article].retrieve.first.should respond_to :id
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'assigns an id using Mapper.all.first' do
|
56
|
+
Perpetuity::Mapper[Article].all.first.should respond_to :id
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'persisting arrays' do
|
61
|
+
let(:article) { Article.new }
|
62
|
+
|
63
|
+
it 'persists arrays' do
|
64
|
+
article.comments << 1 << 2 << 3
|
65
|
+
Perpetuity::Mapper[Article].insert article
|
66
|
+
Perpetuity::Mapper[Article].find(article.id).comments.should eq [1, 2, 3]
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'persists arrays with unserializable objects in them' do
|
70
|
+
comment = Comment.new('my comment')
|
71
|
+
article.comments << comment
|
72
|
+
Perpetuity::Mapper[Article].insert article
|
73
|
+
Perpetuity::Mapper[Article].find(article.id).comments.first.tap do |persisted_comment|
|
74
|
+
persisted_comment.should be_a Comment
|
75
|
+
persisted_comment.body.should eq comment.body
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it "allows mappers to set the id field" do
|
81
|
+
book = Book.new('My Title')
|
82
|
+
|
83
|
+
Perpetuity::Mapper[Book].insert book
|
84
|
+
book.id.should eq 'my-title'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "deletion" do
|
89
|
+
it 'deletes an object' do
|
90
|
+
2.times { Perpetuity::Mapper[Article].insert Article.new }
|
91
|
+
expect { Perpetuity::Mapper[Article].delete Perpetuity::Mapper[Article].first }.to change { Perpetuity::Mapper[Article].count }.by(-1)
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'deletes an object with a given id' do
|
95
|
+
article_id = Perpetuity::Mapper[Article].insert Article.new
|
96
|
+
expect {
|
97
|
+
Perpetuity::Mapper[Article].delete article_id
|
98
|
+
}.to change { Perpetuity::Mapper[Article].count }.by(-1)
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "#delete_all" do
|
102
|
+
it "should delete all objects of a certain class" do
|
103
|
+
Perpetuity::Mapper[Article].insert Article.new
|
104
|
+
Perpetuity::Mapper[Article].delete_all
|
105
|
+
Perpetuity::Mapper[Article].count.should eq 0
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "retrieval" do
|
111
|
+
it "gets all the objects of a class" do
|
112
|
+
expect { Perpetuity::Mapper[Article].insert Article.new }.
|
113
|
+
to change { Perpetuity::Mapper[Article].all.count }.by 1
|
114
|
+
end
|
115
|
+
|
116
|
+
it "has an ID when retrieved" do
|
117
|
+
Perpetuity::Mapper[Article].insert Article.new
|
118
|
+
Perpetuity::Mapper[Article].first.should respond_to :id
|
119
|
+
end
|
120
|
+
|
121
|
+
it "returns a Perpetuity::Retrieval object" do
|
122
|
+
Perpetuity::Mapper[Article].retrieve(id: 1).should be_an_instance_of Perpetuity::Retrieval
|
123
|
+
end
|
124
|
+
|
125
|
+
it "gets an item with a specific ID" do
|
126
|
+
article = Article.new
|
127
|
+
Perpetuity::Mapper[Article].insert article
|
128
|
+
retrieved = Perpetuity::Mapper[Article].find(article.id)
|
129
|
+
|
130
|
+
retrieved.id.should eq article.id
|
131
|
+
retrieved.title.should eq article.title
|
132
|
+
retrieved.body.should eq article.body
|
133
|
+
end
|
134
|
+
|
135
|
+
it "gets an item by its attributes" do
|
136
|
+
article = Article.new
|
137
|
+
Perpetuity::Mapper[Article].insert article
|
138
|
+
retrieved = Perpetuity::Mapper[Article].retrieve(title: article.title)
|
139
|
+
|
140
|
+
retrieved.to_a.should_not be_empty
|
141
|
+
retrieved.first.title.should eq article.title
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "Array-like syntax" do
|
145
|
+
let(:draft) { Article.new 'Draft', 'draft content', nil, Time.now + 30 }
|
146
|
+
let(:published) { Article.new 'Published', 'content', nil, Time.now - 30, 3 }
|
147
|
+
before do
|
148
|
+
Perpetuity::Mapper[Article].insert draft
|
149
|
+
Perpetuity::Mapper[Article].insert published
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'selects objects using equality' do
|
153
|
+
selected = Perpetuity::Mapper[Article].select { title == 'Published' }
|
154
|
+
selected.map(&:id).should include published.id
|
155
|
+
selected.map(&:id).should_not include draft.id
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'selects objects using greater-than' do
|
159
|
+
selected = Perpetuity::Mapper[Article].select { published_at < Time.now }
|
160
|
+
ids = selected.map(&:id)
|
161
|
+
ids.should include published.id
|
162
|
+
ids.should_not include draft.id
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'selects objects using greater-than-or-equal' do
|
166
|
+
selected = Perpetuity::Mapper[Article].select { views >= 3 }
|
167
|
+
ids = selected.map(&:id)
|
168
|
+
ids.should include published.id
|
169
|
+
ids.should_not include draft.id
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'selects objects using less-than' do
|
173
|
+
selected = Perpetuity::Mapper[Article].select { views < 3 }
|
174
|
+
ids = selected.map(&:id)
|
175
|
+
ids.should include draft.id
|
176
|
+
ids.should_not include published.id
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'selects objects using less-than-or-equal' do
|
180
|
+
selected = Perpetuity::Mapper[Article].select { views <= 0 }
|
181
|
+
ids = selected.map(&:id)
|
182
|
+
ids.should include draft.id
|
183
|
+
ids.should_not include published.id
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'selects objects using inequality' do
|
187
|
+
selected = Perpetuity::Mapper[Article].select { title.not_equal? 'Draft' }
|
188
|
+
ids = selected.map(&:id)
|
189
|
+
ids.should_not include draft.id
|
190
|
+
ids.should include published.id
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'selects objects using regular expressions' do
|
194
|
+
selected = Perpetuity::Mapper[Article].select { title =~ /Pub/ }
|
195
|
+
ids = selected.map(&:id)
|
196
|
+
ids.should include published.id
|
197
|
+
ids.should_not include draft.id
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'selects objects using inclusion' do
|
201
|
+
selected = Perpetuity::Mapper[Article].select { title.in %w( Published ) }
|
202
|
+
ids = selected.map(&:id)
|
203
|
+
ids.should include published.id
|
204
|
+
ids.should_not include draft.id
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
describe 'pagination' do
|
210
|
+
it 'specifies the page we want' do
|
211
|
+
Perpetuity::Mapper[Article].retrieve.should respond_to :page
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'specify the quantity per page' do
|
215
|
+
Perpetuity::Mapper[Article].retrieve.should respond_to :per_page
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'returns an empty set when there is no data for that page' do
|
219
|
+
data = Perpetuity::Mapper[Article].retrieve.page(2)
|
220
|
+
data.should be_empty
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'specifies per-page quantity' do
|
224
|
+
Perpetuity::Mapper[Article].delete_all
|
225
|
+
5.times { |i| Perpetuity::Mapper[Article].insert Article.new i }
|
226
|
+
data = Perpetuity::Mapper[Article].retrieve.page(3).per_page(2)
|
227
|
+
data.should have(1).item
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
describe 'associations with other objects' do
|
232
|
+
let(:user) { User.new }
|
233
|
+
let(:topic) { Topic.new }
|
234
|
+
let(:user_mapper) { Perpetuity::Mapper[User] }
|
235
|
+
let(:topic_mapper) { Perpetuity::Mapper[Topic] }
|
236
|
+
|
237
|
+
before do
|
238
|
+
user.name = 'Flump'
|
239
|
+
topic.creator = user
|
240
|
+
topic.title = 'Title'
|
241
|
+
|
242
|
+
user_mapper.insert user
|
243
|
+
topic_mapper.insert topic
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'can reference other objects' do
|
247
|
+
topic_mapper.find(topic.id).creator.should eq user.id
|
248
|
+
end
|
249
|
+
|
250
|
+
it 'can retrieve associated objects' do
|
251
|
+
retrieved_topic = topic_mapper.first
|
252
|
+
|
253
|
+
topic_mapper.load_association! retrieved_topic, :creator
|
254
|
+
retrieved_topic.creator.name.should eq 'Flump'
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
describe 'updating' do
|
259
|
+
let(:article) { Article.new }
|
260
|
+
before do
|
261
|
+
Perpetuity::Mapper[Article].insert article
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'updates an object in the database' do
|
265
|
+
Perpetuity::Mapper[Article].update article, title: 'I has a new title!'
|
266
|
+
Perpetuity::Mapper[Article].find(article.id).title.should eq 'I has a new title!'
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
describe 'validations' do
|
271
|
+
let(:car_mapper) { Perpetuity::Mapper[Car] }
|
272
|
+
|
273
|
+
it 'raises an exception when inserting an invalid object' do
|
274
|
+
car = Car.new
|
275
|
+
expect { car_mapper.insert car }.to raise_error
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'does not raise an exception when validations are met' do
|
279
|
+
car = Car.new
|
280
|
+
car.make = "Volkswagen"
|
281
|
+
expect { car_mapper.insert car }.not_to raise_error
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
# The Message class stores its data members differently internally than it receives them
|
286
|
+
it 'uses accessor methods to read/write data' do
|
287
|
+
message = Message.new 'My Message!'
|
288
|
+
Perpetuity::Mapper[Message].insert message
|
289
|
+
saved_message = Perpetuity::Mapper[Message].find(message.id)
|
290
|
+
saved_message.instance_variable_get(:@text).should eq 'My Message!'.reverse
|
291
|
+
saved_message.text.should eq 'My Message!'
|
292
|
+
end
|
293
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
class Article
|
2
|
+
attr_accessor :title, :body, :comments, :published_at, :views
|
3
|
+
def initialize title="Title", body="Body", author=nil, published_at=Time.now, views=0
|
4
|
+
@title = title
|
5
|
+
@body = body
|
6
|
+
@comments = []
|
7
|
+
@published_at = published_at
|
8
|
+
@views = views
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
Perpetuity.generate_mapper_for(Article) do
|
13
|
+
attribute :title, String
|
14
|
+
attribute :body, String
|
15
|
+
attribute :comments, Array, embedded: true
|
16
|
+
attribute :published_at, Time
|
17
|
+
attribute :views, Integer
|
18
|
+
end
|
19
|
+
|
20
|
+
class Comment
|
21
|
+
attr_reader :body
|
22
|
+
def initialize body='Body'
|
23
|
+
@body = body
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Perpetuity.generate_mapper_for(Comment) do
|
28
|
+
attribute :body, String
|
29
|
+
end
|
30
|
+
|
31
|
+
class User
|
32
|
+
attr_accessor :name
|
33
|
+
def initialize name="Foo"
|
34
|
+
@name = name
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
Perpetuity.generate_mapper_for User do
|
39
|
+
attribute :name, String
|
40
|
+
end
|
41
|
+
|
42
|
+
class Book
|
43
|
+
attr_accessor :title
|
44
|
+
def initialize title="Foo Bar"
|
45
|
+
@title = title
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
Perpetuity.generate_mapper_for Book do
|
50
|
+
id { title.gsub(/\W+/, '-').downcase }
|
51
|
+
attribute :title, String
|
52
|
+
end
|
53
|
+
|
54
|
+
class Message
|
55
|
+
def initialize text="My Message!"
|
56
|
+
self.text = text
|
57
|
+
end
|
58
|
+
|
59
|
+
def text
|
60
|
+
@text.reverse
|
61
|
+
end
|
62
|
+
|
63
|
+
def text= new_text
|
64
|
+
@text = new_text.reverse
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
Perpetuity.generate_mapper_for Message do
|
69
|
+
attribute :text, String
|
70
|
+
end
|
71
|
+
|
72
|
+
class Topic
|
73
|
+
attr_accessor :title, :creator
|
74
|
+
end
|
75
|
+
|
76
|
+
Perpetuity.generate_mapper_for(Topic) do
|
77
|
+
attribute :title, String
|
78
|
+
attribute :creator, User
|
79
|
+
end
|
80
|
+
|
81
|
+
class Car
|
82
|
+
attr_accessor :make, :model, :seats
|
83
|
+
end
|
84
|
+
|
85
|
+
Perpetuity.generate_mapper_for(Car) do
|
86
|
+
attribute :make, String
|
87
|
+
attribute :model, String
|
88
|
+
attribute :seats, Integer
|
89
|
+
|
90
|
+
validate do
|
91
|
+
present :make
|
92
|
+
end
|
93
|
+
end
|
metadata
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: perpetuity
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jamie Gaskins
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.8.0
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.8.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: guard-rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: mongo
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: bson_ext
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
description: Persistence library allowing persistence of Ruby objects without adding
|
95
|
+
persistence concerns to domain objects.
|
96
|
+
email:
|
97
|
+
- jgaskins@gmail.com
|
98
|
+
executables: []
|
99
|
+
extensions: []
|
100
|
+
extra_rdoc_files: []
|
101
|
+
files:
|
102
|
+
- .gitignore
|
103
|
+
- .rspec
|
104
|
+
- .rvmrc
|
105
|
+
- .travis.yml
|
106
|
+
- Gemfile
|
107
|
+
- Guardfile
|
108
|
+
- README.md
|
109
|
+
- Rakefile
|
110
|
+
- lib/perpetuity.rb
|
111
|
+
- lib/perpetuity/attribute.rb
|
112
|
+
- lib/perpetuity/attribute_set.rb
|
113
|
+
- lib/perpetuity/config.rb
|
114
|
+
- lib/perpetuity/data_injectable.rb
|
115
|
+
- lib/perpetuity/mapper.rb
|
116
|
+
- lib/perpetuity/mongodb.rb
|
117
|
+
- lib/perpetuity/mongodb/query.rb
|
118
|
+
- lib/perpetuity/mongodb/query_attribute.rb
|
119
|
+
- lib/perpetuity/mongodb/query_expression.rb
|
120
|
+
- lib/perpetuity/retrieval.rb
|
121
|
+
- lib/perpetuity/validations.rb
|
122
|
+
- lib/perpetuity/validations/length.rb
|
123
|
+
- lib/perpetuity/validations/presence.rb
|
124
|
+
- lib/perpetuity/validations/validation_set.rb
|
125
|
+
- lib/perpetuity/version.rb
|
126
|
+
- perpetuity.gemspec
|
127
|
+
- spec/perpetuity/attribute_set_spec.rb
|
128
|
+
- spec/perpetuity/attribute_spec.rb
|
129
|
+
- spec/perpetuity/config_spec.rb
|
130
|
+
- spec/perpetuity/data_injectable_spec.rb
|
131
|
+
- spec/perpetuity/mapper_spec.rb
|
132
|
+
- spec/perpetuity/mongodb/query_attribute_spec.rb
|
133
|
+
- spec/perpetuity/mongodb/query_expression_spec.rb
|
134
|
+
- spec/perpetuity/mongodb/query_spec.rb
|
135
|
+
- spec/perpetuity/mongodb_spec.rb
|
136
|
+
- spec/perpetuity/retrieval_spec.rb
|
137
|
+
- spec/perpetuity/validations/length_spec.rb
|
138
|
+
- spec/perpetuity/validations/presence_spec.rb
|
139
|
+
- spec/perpetuity/validations_spec.rb
|
140
|
+
- spec/perpetuity_spec.rb
|
141
|
+
- spec/test_classes.rb
|
142
|
+
homepage: https://github.com/jgaskins/perpetuity.git
|
143
|
+
licenses: []
|
144
|
+
post_install_message:
|
145
|
+
rdoc_options: []
|
146
|
+
require_paths:
|
147
|
+
- lib
|
148
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
149
|
+
none: false
|
150
|
+
requirements:
|
151
|
+
- - ! '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
none: false
|
156
|
+
requirements:
|
157
|
+
- - ! '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
requirements: []
|
161
|
+
rubyforge_project:
|
162
|
+
rubygems_version: 1.8.24
|
163
|
+
signing_key:
|
164
|
+
specification_version: 3
|
165
|
+
summary: Persistence library allowing persistence of Ruby objects
|
166
|
+
test_files:
|
167
|
+
- spec/perpetuity/attribute_set_spec.rb
|
168
|
+
- spec/perpetuity/attribute_spec.rb
|
169
|
+
- spec/perpetuity/config_spec.rb
|
170
|
+
- spec/perpetuity/data_injectable_spec.rb
|
171
|
+
- spec/perpetuity/mapper_spec.rb
|
172
|
+
- spec/perpetuity/mongodb/query_attribute_spec.rb
|
173
|
+
- spec/perpetuity/mongodb/query_expression_spec.rb
|
174
|
+
- spec/perpetuity/mongodb/query_spec.rb
|
175
|
+
- spec/perpetuity/mongodb_spec.rb
|
176
|
+
- spec/perpetuity/retrieval_spec.rb
|
177
|
+
- spec/perpetuity/validations/length_spec.rb
|
178
|
+
- spec/perpetuity/validations/presence_spec.rb
|
179
|
+
- spec/perpetuity/validations_spec.rb
|
180
|
+
- spec/perpetuity_spec.rb
|
181
|
+
- spec/test_classes.rb
|