mongoid_delorean 1.2.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|