perpetuity 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|