perpetuity 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +1 -0
  3. data/.rvmrc +1 -0
  4. data/.travis.yml +7 -0
  5. data/Gemfile +3 -0
  6. data/Guardfile +24 -0
  7. data/README.md +142 -0
  8. data/Rakefile +6 -0
  9. data/lib/perpetuity/attribute.rb +17 -0
  10. data/lib/perpetuity/attribute_set.rb +23 -0
  11. data/lib/perpetuity/config.rb +11 -0
  12. data/lib/perpetuity/data_injectable.rb +21 -0
  13. data/lib/perpetuity/mapper.rb +195 -0
  14. data/lib/perpetuity/mongodb/query.rb +19 -0
  15. data/lib/perpetuity/mongodb/query_attribute.rb +49 -0
  16. data/lib/perpetuity/mongodb/query_expression.rb +55 -0
  17. data/lib/perpetuity/mongodb.rb +102 -0
  18. data/lib/perpetuity/retrieval.rb +82 -0
  19. data/lib/perpetuity/validations/length.rb +36 -0
  20. data/lib/perpetuity/validations/presence.rb +14 -0
  21. data/lib/perpetuity/validations/validation_set.rb +27 -0
  22. data/lib/perpetuity/validations.rb +1 -0
  23. data/lib/perpetuity/version.rb +3 -0
  24. data/lib/perpetuity.rb +23 -0
  25. data/perpetuity.gemspec +25 -0
  26. data/spec/perpetuity/attribute_set_spec.rb +19 -0
  27. data/spec/perpetuity/attribute_spec.rb +19 -0
  28. data/spec/perpetuity/config_spec.rb +13 -0
  29. data/spec/perpetuity/data_injectable_spec.rb +26 -0
  30. data/spec/perpetuity/mapper_spec.rb +51 -0
  31. data/spec/perpetuity/mongodb/query_attribute_spec.rb +42 -0
  32. data/spec/perpetuity/mongodb/query_expression_spec.rb +49 -0
  33. data/spec/perpetuity/mongodb/query_spec.rb +37 -0
  34. data/spec/perpetuity/mongodb_spec.rb +91 -0
  35. data/spec/perpetuity/retrieval_spec.rb +58 -0
  36. data/spec/perpetuity/validations/length_spec.rb +53 -0
  37. data/spec/perpetuity/validations/presence_spec.rb +30 -0
  38. data/spec/perpetuity/validations_spec.rb +87 -0
  39. data/spec/perpetuity_spec.rb +293 -0
  40. data/spec/test_classes.rb +93 -0
  41. 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