perpetuity 0.4.3 → 0.4.4

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