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.
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