mongoid_delorean 1.2.0 → 1.2.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.
- checksums.yaml +4 -4
- data/lib/mongoid/delorean/trackable.rb +26 -4
- data/lib/mongoid/delorean/version.rb +1 -1
- data/spec/config.yml +6 -1
- data/spec/mongoid/delorean/trackable_spec.rb +76 -4
- data/spec/support/models.rb +30 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7df0efa1af0ba01ca6bbb2b5625d0d03e3637d5
|
4
|
+
data.tar.gz: d781202b5b614f3e911921a5cee6355f3be06c54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f58c034a757c4f02f6ada2e5a6cf56b516352dbfb544c92eae6a7f31b7d4f93c21dcb853b94e56c54f3718992d71654bc5c976b17b264ab41520248447dd5ba
|
7
|
+
data.tar.gz: 96ac147ef9a1261f5aeacbbff1cc856f6fde19d28e0a2594a4aa23dc70ded5b72dc80bcfc3688b1b6bf44f3a9f2161a62bc3a8e3a6c1d292b67e9d80edaead9c
|
@@ -6,6 +6,7 @@ module Mongoid
|
|
6
6
|
super
|
7
7
|
klass.field :version, type: Integer, default: 0
|
8
8
|
klass.before_save :save_version
|
9
|
+
klass.after_save :after_save_version
|
9
10
|
klass.send(:include, Mongoid::Delorean::Trackable::CommonInstanceMethods)
|
10
11
|
end
|
11
12
|
|
@@ -23,12 +24,22 @@ module Mongoid
|
|
23
24
|
_changes = self.changes_with_relations.dup
|
24
25
|
_changes.merge!("version" => [self.version_was, _version])
|
25
26
|
|
26
|
-
Mongoid::Delorean::History.create(original_class: self.class.name, original_class_id: self.id, version: _version, altered_attributes: _changes, full_attributes: _attributes)
|
27
|
+
Mongoid::Delorean::History.create(original_class: self.class.name, original_class_id: self.id, version: _version, altered_attributes: _changes, full_attributes: _attributes)
|
27
28
|
self.without_history_tracking do
|
28
29
|
self.version = _version
|
29
|
-
self.
|
30
|
+
unless(self.new_record?)
|
31
|
+
self.set(:version, _version)
|
32
|
+
end
|
30
33
|
end
|
34
|
+
|
35
|
+
@__track_changes = false
|
31
36
|
end
|
37
|
+
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
def after_save_version
|
42
|
+
@__track_changes = Mongoid::Delorean.config.track_history
|
32
43
|
end
|
33
44
|
|
34
45
|
def track_history?
|
@@ -36,9 +47,10 @@ module Mongoid
|
|
36
47
|
end
|
37
48
|
|
38
49
|
def without_history_tracking
|
50
|
+
previous_track_change = @__track_changes
|
39
51
|
@__track_changes = false
|
40
52
|
yield
|
41
|
-
@__track_changes =
|
53
|
+
@__track_changes = previous_track_change
|
42
54
|
end
|
43
55
|
|
44
56
|
def revert!(version = (self.version - 1))
|
@@ -54,7 +66,17 @@ module Mongoid
|
|
54
66
|
module CommonEmbeddedMethods
|
55
67
|
|
56
68
|
def save_version
|
57
|
-
|
69
|
+
if self._parent.respond_to?(:save_version)
|
70
|
+
if self._parent.respond_to?(:track_history?)
|
71
|
+
if self._parent.track_history?
|
72
|
+
self._parent.save_version
|
73
|
+
end
|
74
|
+
else
|
75
|
+
self._parent.save_version
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
true
|
58
80
|
end
|
59
81
|
|
60
82
|
end
|
data/spec/config.yml
CHANGED
@@ -64,6 +64,14 @@ describe Mongoid::Delorean::Trackable do
|
|
64
64
|
version.full_attributes.except("created_at", "updated_at").should eql({"_id"=>u.id, "version"=>2, "name"=>"Mark", "age"=>36})
|
65
65
|
end
|
66
66
|
|
67
|
+
it "passes validate options to save" do
|
68
|
+
u = User.create!(email: "test@example.com")
|
69
|
+
|
70
|
+
u.email = "invalid"
|
71
|
+
expect { u.save! }.to raise_error
|
72
|
+
expect { u.save!(validate: false) }.to_not raise_error
|
73
|
+
end
|
74
|
+
|
67
75
|
describe "#without_history_tracking" do
|
68
76
|
|
69
77
|
it "it doesn't track the history of the save" do
|
@@ -163,12 +171,12 @@ describe Mongoid::Delorean::Trackable do
|
|
163
171
|
a = Article.create!(name: "My Article")
|
164
172
|
|
165
173
|
version = a.versions.first
|
166
|
-
version.full_attributes.should eql({"_id"=>a.id, "version"=>1, "name"=>"My Article", "pages"=>[]})
|
174
|
+
version.full_attributes.should eql({"_id"=>a.id, "version"=>1, "name"=>"My Article", "pages"=>[], "authors" => []})
|
167
175
|
|
168
176
|
a.update_attributes(summary: "Summary about the article")
|
169
177
|
|
170
178
|
version = a.versions.last
|
171
|
-
version.full_attributes.except("created_at", "updated_at").should eql({"_id"=>a.id, "version"=>2, "name"=>"My Article", "summary"=>"Summary about the article", "pages"=>[]})
|
179
|
+
version.full_attributes.except("created_at", "updated_at").should eql({"_id"=>a.id, "version"=>2, "name"=>"My Article", "summary"=>"Summary about the article", "pages"=>[], "authors" => []})
|
172
180
|
end
|
173
181
|
|
174
182
|
it "tracks the full set of attributes including embeds at the time of saving" do
|
@@ -177,12 +185,12 @@ describe Mongoid::Delorean::Trackable do
|
|
177
185
|
a.save!
|
178
186
|
|
179
187
|
version = a.versions.first
|
180
|
-
version.full_attributes.should eql({"_id"=>a.id, "version"=>1, "name"=>"My Article", "pages"=>[{"_id"=>page.id, "name"=>"Page 1", "sections"=>[]}]})
|
188
|
+
version.full_attributes.should eql({"_id"=>a.id, "version"=>1, "name"=>"My Article", "pages"=>[{"_id"=>page.id, "name"=>"Page 1", "sections"=>[]}], "authors" => []})
|
181
189
|
|
182
190
|
a.update_attributes(summary: "Summary about the article")
|
183
191
|
|
184
192
|
version = a.versions.last
|
185
|
-
version.full_attributes.except("created_at", "updated_at").should eql({"_id"=>a.id, "version"=>2, "name"=>"My Article", "pages"=>[{"_id"=>page.id, "name"=>"Page 1", "sections"=>[]}], "summary"=>"Summary about the article"})
|
193
|
+
version.full_attributes.except("created_at", "updated_at").should eql({"_id"=>a.id, "version"=>2, "name"=>"My Article", "pages"=>[{"_id"=>page.id, "name"=>"Page 1", "sections"=>[]}], "summary"=>"Summary about the article", "authors" => []})
|
186
194
|
end
|
187
195
|
|
188
196
|
it "tracks changes when an embedded document is saved" do
|
@@ -198,6 +206,70 @@ describe Mongoid::Delorean::Trackable do
|
|
198
206
|
page.name.should eql("The 1st Page")
|
199
207
|
end
|
200
208
|
|
209
|
+
it "handles embeds with cascade callbacks" do
|
210
|
+
a = Article.new(name: "Article 1")
|
211
|
+
a.authors.build(name: "John Doe")
|
212
|
+
a.authors.build(name: "Jane Doe")
|
213
|
+
a.authors.last.influences.build(name: "Poe")
|
214
|
+
a.authors.last.influences.build(name: "Twain")
|
215
|
+
|
216
|
+
a.save!
|
217
|
+
a.version.should eql(1)
|
218
|
+
|
219
|
+
a.authors.first.name = "Joe Blow"
|
220
|
+
a.save!
|
221
|
+
a.reload
|
222
|
+
a.version.should eql(2)
|
223
|
+
end
|
224
|
+
|
225
|
+
it "saves parent versions when saving embedded documents multiple levels deep" do
|
226
|
+
a = Article.new(name: "Article 1")
|
227
|
+
page = a.pages.build(name: "Page 1")
|
228
|
+
section = page.sections.build(body: "some body text")
|
229
|
+
|
230
|
+
a.save!
|
231
|
+
a.version.should eql(1)
|
232
|
+
|
233
|
+
a.reload
|
234
|
+
section = a.pages.first.sections.first
|
235
|
+
section.body = "updated body text"
|
236
|
+
section.save!
|
237
|
+
|
238
|
+
a.reload
|
239
|
+
a.version.should eql(2)
|
240
|
+
end
|
241
|
+
|
242
|
+
it "doesn't force validations on the parent document when an embedded document is saved" do
|
243
|
+
a = Article.new(name: "Article 1", publish_year: -20)
|
244
|
+
page = a.pages.build(name: "Page 1")
|
245
|
+
|
246
|
+
expect { a.save! }.to raise_error
|
247
|
+
a.save!(validate: false)
|
248
|
+
|
249
|
+
a.version.should eql(1)
|
250
|
+
page.name = "Number One Page"
|
251
|
+
page.save!
|
252
|
+
|
253
|
+
a.reload
|
254
|
+
a.version.should eql(2)
|
255
|
+
page = a.pages.first
|
256
|
+
page.name.should eql("Number One Page")
|
257
|
+
end
|
258
|
+
|
259
|
+
it "doesn't save the parent document when the embedded document fails validation" do
|
260
|
+
a = Article.new(name: "Article 1")
|
261
|
+
page = a.pages.build(name: "Page 1", number: 1)
|
262
|
+
a.save!
|
263
|
+
|
264
|
+
page.number = -10
|
265
|
+
expect { page.save! }.to raise_error
|
266
|
+
|
267
|
+
a.reload
|
268
|
+
a.version.should eql(1)
|
269
|
+
page = a.pages.first
|
270
|
+
page.number.should eql(1)
|
271
|
+
end
|
272
|
+
|
201
273
|
describe '#revert!' do
|
202
274
|
|
203
275
|
it "reverts to the last version" do
|
data/spec/support/models.rb
CHANGED
@@ -15,8 +15,12 @@ class Article
|
|
15
15
|
|
16
16
|
field :name, type: String
|
17
17
|
field :summary, type: String
|
18
|
+
field :publish_year, type: String
|
18
19
|
|
19
20
|
embeds_many :pages
|
21
|
+
embeds_many :authors, cascade_callbacks: true
|
22
|
+
|
23
|
+
validates :publish_year, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
|
20
24
|
end
|
21
25
|
|
22
26
|
class Page
|
@@ -24,6 +28,9 @@ class Page
|
|
24
28
|
include Mongoid::Timestamps
|
25
29
|
|
26
30
|
field :name, type: String
|
31
|
+
field :number, type: Integer
|
32
|
+
|
33
|
+
validates :number, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
|
27
34
|
|
28
35
|
embedded_in :article, inverse_of: :pages
|
29
36
|
embeds_many :sections
|
@@ -37,6 +44,26 @@ class Footer
|
|
37
44
|
field :content, type: String
|
38
45
|
|
39
46
|
embedded_in :page
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
class Author
|
51
|
+
include Mongoid::Document
|
52
|
+
include Mongoid::Timestamps
|
53
|
+
|
54
|
+
field :name, type: String
|
55
|
+
|
56
|
+
embeds_many :influences, cascade_callbacks: true
|
57
|
+
embedded_in :article, inverse_of: :authors
|
58
|
+
end
|
59
|
+
|
60
|
+
class Influence
|
61
|
+
include Mongoid::Document
|
62
|
+
include Mongoid::Timestamps
|
63
|
+
|
64
|
+
field :name, type: String
|
65
|
+
|
66
|
+
embedded_in :author
|
40
67
|
end
|
41
68
|
|
42
69
|
class User
|
@@ -46,4 +73,7 @@ class User
|
|
46
73
|
|
47
74
|
field :name, type: String
|
48
75
|
field :age, type: Integer
|
76
|
+
field :email, type: String
|
77
|
+
|
78
|
+
validates :email, format: { with: /.+@.+\..+/, allow_nil: true }
|
49
79
|
end
|