perpetuity 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -3,5 +3,8 @@ rvm:
3
3
  - 1.9.2
4
4
  - 1.9.3
5
5
  - rbx-19mode
6
+ - jruby-19mode
7
+ - ruby-head
8
+ - 2.0.0
6
9
  services:
7
10
  - mongodb
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## Version 0.4.4
2
+
3
+ - Automatically persist all referenced objects if they are not already persisted. Previously, referenced objects were required to be persisted before persisting the referencing object.
4
+
1
5
  ## Version 0.4.3
2
6
 
3
7
  - Made `Mapper#load_association!` more friendly. It now loads the associated objects for all objects passed in and works with arrays of referenced objects.
@@ -69,30 +69,14 @@ module Perpetuity
69
69
  new_id
70
70
  end
71
71
 
72
- def serialize object
73
- Serializer.new(self, mapper_registry).serialize(object)
74
- end
75
-
76
72
  def self.data_source(configuration=Perpetuity.configuration)
77
73
  configuration.data_source
78
74
  end
79
75
 
80
- def data_source
81
- self.class.data_source
82
- end
83
-
84
76
  def count
85
77
  data_source.count mapped_class
86
78
  end
87
79
 
88
- def self.mapped_class
89
- @mapped_class
90
- end
91
-
92
- def mapped_class
93
- self.class.mapped_class
94
- end
95
-
96
80
  def first
97
81
  retrieve.limit(1).first
98
82
  end
@@ -101,10 +85,6 @@ module Perpetuity
101
85
  retrieve
102
86
  end
103
87
 
104
- def retrieve criteria={}
105
- Perpetuity::Retrieval.new mapped_class, criteria, data_source
106
- end
107
-
108
88
  def select &block
109
89
  query = data_source.class::Query.new(&block).to_db
110
90
  retrieve query
@@ -162,6 +142,28 @@ module Perpetuity
162
142
  def self.validations
163
143
  @validations ||= ValidationSet.new
164
144
  end
145
+
146
+ def data_source
147
+ self.class.data_source
148
+ end
149
+
150
+ def serialize object
151
+ Serializer.new(self, mapper_registry).serialize(object)
152
+ end
153
+
154
+ private
155
+
156
+ def retrieve criteria={}
157
+ Perpetuity::Retrieval.new mapped_class, criteria, data_source
158
+ end
159
+
160
+ def self.mapped_class
161
+ @mapped_class
162
+ end
163
+
164
+ def mapped_class
165
+ self.class.mapped_class
166
+ end
165
167
  end
166
168
  end
167
169
 
@@ -40,12 +40,7 @@ module Perpetuity
40
40
  attr = value_serializer.serialize(value)
41
41
  attr.merge '__metadata__' => { 'class' => value.class }
42
42
  else
43
- {
44
- '__metadata__' => {
45
- 'class' => value.class.to_s,
46
- 'id' => value.id
47
- }
48
- }
43
+ serialize_reference(value)
49
44
  end
50
45
  end
51
46
 
@@ -63,17 +58,24 @@ module Perpetuity
63
58
  }
64
59
  }.merge mapper_registry[value.class].serialize(value)
65
60
  else
66
- {
67
- '__metadata__' => {
68
- 'class' => value.class.to_s,
69
- 'id' => value.id
70
- }
71
- }
61
+ serialize_reference value
72
62
  end
73
63
  else
74
64
  Marshal.dump(value)
75
65
  end
76
66
  end
77
67
  end
68
+
69
+ def serialize_reference value
70
+ unless value.respond_to? :id
71
+ mapper_registry[value.class].insert value
72
+ end
73
+ {
74
+ '__metadata__' => {
75
+ 'class' => value.class.to_s,
76
+ 'id' => value.id
77
+ }
78
+ }
79
+ end
78
80
  end
79
81
  end
@@ -1,3 +1,3 @@
1
1
  module Perpetuity
2
- VERSION = "0.4.3"
2
+ VERSION = "0.4.4"
3
3
  end
data/perpetuity.gemspec CHANGED
@@ -20,5 +20,5 @@ Gem::Specification.new do |s|
20
20
  s.add_development_dependency "rake"
21
21
  s.add_development_dependency "rspec", "~> 2.8.0"
22
22
  s.add_runtime_dependency "mongo", ">= 1.8.0"
23
- s.add_runtime_dependency "bson_ext"
23
+ s.add_runtime_dependency "bson_ext" unless RUBY_PLATFORM == 'java'
24
24
  end
@@ -46,6 +46,23 @@ describe Perpetuity do
46
46
  article.id.should eq 1
47
47
  end
48
48
 
49
+ it 'persists referenced objects if they are not persisted' do
50
+ article = Article.new
51
+ article.author = User.new
52
+ Perpetuity[Article].insert article
53
+
54
+ Perpetuity[Article].find(article.id).author.id.should be == article.author.id
55
+ end
56
+
57
+ it 'persists arrays of referenced objects if they are not persisted' do
58
+ authors = [User.new('Dave'), User.new('Andy')]
59
+ book = Book.new
60
+ book.authors = authors
61
+ Perpetuity[Book].insert book
62
+
63
+ Perpetuity[Book].find(book.id).authors.first.id.should be == authors.first.id
64
+ end
65
+
49
66
  describe 'id injection' do
50
67
  let(:article) { Article.new }
51
68
 
@@ -58,10 +75,6 @@ describe Perpetuity do
58
75
  Perpetuity[Article].first.should respond_to :id
59
76
  end
60
77
 
61
- it 'assigns an id using Mapper.retrieve.first' do
62
- Perpetuity[Article].retrieve.first.should respond_to :id
63
- end
64
-
65
78
  it 'assigns an id using Mapper.all.first' do
66
79
  Perpetuity[Article].all.first.should respond_to :id
67
80
  end
@@ -128,10 +141,6 @@ describe Perpetuity do
128
141
  Perpetuity[Article].insert Article.new
129
142
  Perpetuity[Article].first.should respond_to :id
130
143
  end
131
-
132
- it "returns a Perpetuity::Retrieval object" do
133
- Perpetuity[Article].retrieve(id: 1).should be_an_instance_of Perpetuity::Retrieval
134
- end
135
144
 
136
145
  it "gets an item with a specific ID" do
137
146
  article = Article.new
@@ -143,15 +152,6 @@ describe Perpetuity do
143
152
  retrieved.body.should eq article.body
144
153
  end
145
154
 
146
- it "gets an item by its attributes" do
147
- article = Article.new
148
- Perpetuity[Article].insert article
149
- retrieved = Perpetuity[Article].retrieve(title: article.title)
150
-
151
- retrieved.to_a.should_not be_empty
152
- retrieved.first.title.should eq article.title
153
- end
154
-
155
155
  describe "Array-like syntax" do
156
156
  let(:draft) { Article.new 'Draft', 'draft content', nil, Time.now + 30 }
157
157
  let(:published) { Article.new 'Published', 'content', nil, Time.now - 30, 3 }
@@ -219,24 +219,24 @@ describe Perpetuity do
219
219
 
220
220
  describe 'pagination' do
221
221
  it 'specifies the page we want' do
222
- Perpetuity[Article].retrieve.should respond_to :page
222
+ Perpetuity[Article].all.should respond_to :page
223
223
  end
224
224
 
225
225
  it 'specify the quantity per page' do
226
- Perpetuity[Article].retrieve.should respond_to :per_page
226
+ Perpetuity[Article].all.should respond_to :per_page
227
227
  end
228
228
 
229
229
  it 'returns an empty set when there is no data for that page' do
230
230
  mapper = Perpetuity[Article]
231
231
  mapper.delete_all
232
- data = mapper.retrieve.page(2)
232
+ data = mapper.all.page(2)
233
233
  data.should be_empty
234
234
  end
235
235
 
236
236
  it 'specifies per-page quantity' do
237
237
  Perpetuity[Article].delete_all
238
238
  5.times { |i| Perpetuity[Article].insert Article.new i }
239
- data = Perpetuity[Article].retrieve.page(3).per_page(2)
239
+ data = Perpetuity[Article].all.page(3).per_page(2)
240
240
  data.should have(1).item
241
241
  end
242
242
  end
@@ -1,6 +1,6 @@
1
1
  class Book
2
2
  attr_accessor :title, :authors
3
- def initialize title="Foo Bar", authors=[]
3
+ def initialize title="Foo Bar #{Time.now.to_f.to_s}", authors=[]
4
4
  @title = title
5
5
  @authors = authors
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perpetuity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-24 00:00:00.000000000 Z
12
+ date: 2013-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -156,7 +156,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
156
156
  version: '0'
157
157
  segments:
158
158
  - 0
159
- hash: -4673501112155482
159
+ hash: -2281292064449361967
160
160
  required_rubygems_version: !ruby/object:Gem::Requirement
161
161
  none: false
162
162
  requirements:
@@ -165,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
165
  version: '0'
166
166
  segments:
167
167
  - 0
168
- hash: -4673501112155482
168
+ hash: -2281292064449361967
169
169
  requirements: []
170
170
  rubyforge_project:
171
171
  rubygems_version: 1.8.24