mongoid-history 0.0.5 → 0.0.6
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/README.rdoc +13 -0
- data/VERSION +1 -1
- data/lib/mongoid/history.rb +1 -0
- data/lib/mongoid/history/trackable.rb +43 -1
- data/lib/mongoid/history/tracker.rb +11 -3
- data/mongoid-history.gemspec +2 -2
- data/spec/integration/integration_spec.rb +57 -0
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -82,7 +82,20 @@ Here is a quick example on how to use this plugin. For more details, please look
|
|
82
82
|
|
83
83
|
track.redo! # comment title should be "Test 2"
|
84
84
|
|
85
|
+
# undo last change
|
86
|
+
comment.undo! @user
|
85
87
|
|
88
|
+
# undo versions 1 - 4
|
89
|
+
comment.undo! @user, :from => 1, :to => 4
|
90
|
+
|
91
|
+
# undo last 3 versions
|
92
|
+
comment.undo! @user, :last => 3
|
93
|
+
|
94
|
+
# redo versions 1 - 4
|
95
|
+
comment.redo! @user, :from => 1, :to => 4
|
96
|
+
|
97
|
+
# redo last 3 versions
|
98
|
+
comment.redo! @user, :last => 3
|
86
99
|
|
87
100
|
== Contributing to mongoid-history
|
88
101
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
data/lib/mongoid/history.rb
CHANGED
@@ -42,7 +42,6 @@ module Mongoid::History
|
|
42
42
|
|
43
43
|
before_update :track_update
|
44
44
|
before_create :track_create if options[:track_create]
|
45
|
-
|
46
45
|
|
47
46
|
Mongoid::History.trackable_classes ||= []
|
48
47
|
Mongoid::History.trackable_classes << self
|
@@ -67,7 +66,50 @@ module Mongoid::History
|
|
67
66
|
@history_tracks ||= Mongoid::History.tracker_class.where(:scope => history_trackable_options[:scope], :association_chain => triverse_association_chain)
|
68
67
|
end
|
69
68
|
|
69
|
+
# undo :from => 1, :to => 5
|
70
|
+
# undo 4
|
71
|
+
# undo :last => 10
|
72
|
+
def undo!(modifier, options_or_version=nil)
|
73
|
+
versions = get_versions_criteria(options_or_version).to_a
|
74
|
+
versions.sort!{|v1, v2| v2.version <=> v1.version}
|
75
|
+
|
76
|
+
versions.each do |v|
|
77
|
+
undo_attr = v.undo_attr(modifier)
|
78
|
+
self.attributes = v.undo_attr(modifier)
|
79
|
+
end
|
80
|
+
save!
|
81
|
+
end
|
82
|
+
|
83
|
+
def redo!(modifier, options_or_version=nil)
|
84
|
+
versions = get_versions_criteria(options_or_version).to_a
|
85
|
+
versions.sort!{|v1, v2| v1.version <=> v2.version}
|
86
|
+
|
87
|
+
versions.each do |v|
|
88
|
+
redo_attr = v.redo_attr(modifier)
|
89
|
+
self.attributes = redo_attr
|
90
|
+
end
|
91
|
+
save!
|
92
|
+
end
|
93
|
+
|
70
94
|
private
|
95
|
+
def get_versions_criteria(options_or_version)
|
96
|
+
if options_or_version.is_a? Hash
|
97
|
+
options = options_or_version
|
98
|
+
if options[:from] && options[:to]
|
99
|
+
versions = history_tracks.where(:version.in => (options[:from] .. options[:to]).to_a)
|
100
|
+
elsif options[:last]
|
101
|
+
versions = history_tracks.limit(options[:last])
|
102
|
+
else
|
103
|
+
raise "Invalid options, please specify (:from / :to) keys or :last key."
|
104
|
+
end
|
105
|
+
else
|
106
|
+
version = options_or_version || self.attributes[history_trackable_options[:version_field]]
|
107
|
+
version = [ version ].flatten
|
108
|
+
versions = history_tracks.where(:version.in => version)
|
109
|
+
end
|
110
|
+
versions.desc(:version)
|
111
|
+
end
|
112
|
+
|
71
113
|
def should_track_update?
|
72
114
|
track_history? && !modified_attributes_for_update.blank?
|
73
115
|
end
|
@@ -21,19 +21,27 @@ module Mongoid::History
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def undo!(modifier)
|
24
|
+
trackable.update_attributes!(undo_attr(modifier))
|
25
|
+
end
|
26
|
+
|
27
|
+
def redo!(modifier)
|
28
|
+
trackable.update_attributes!(redo_attr(modifier))
|
29
|
+
end
|
30
|
+
|
31
|
+
def undo_attr(modifier)
|
24
32
|
undo_hash = affected.easy_unmerge(modified)
|
25
33
|
undo_hash.easy_merge!(original)
|
26
34
|
modifier_field = trackable.history_trackable_options[:modifier_field]
|
27
35
|
undo_hash[modifier_field] = modifier
|
28
|
-
|
36
|
+
undo_hash
|
29
37
|
end
|
30
38
|
|
31
|
-
def
|
39
|
+
def redo_attr(modifier)
|
32
40
|
redo_hash = affected.easy_unmerge(original)
|
33
41
|
redo_hash.easy_merge!(modified)
|
34
42
|
modifier_field = trackable.history_trackable_options[:modifier_field]
|
35
43
|
redo_hash[modifier_field] = modifier
|
36
|
-
|
44
|
+
redo_hash
|
37
45
|
end
|
38
46
|
|
39
47
|
def trackable_root
|
data/mongoid-history.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongoid-history}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Aaron Qian"]
|
12
|
-
s.date = %q{2011-03-
|
12
|
+
s.date = %q{2011-03-16}
|
13
13
|
s.description = %q{In frustration of Mongoid::Versioning, I created this plugin for tracking historical changes for any document, including embedded ones. It achieves this by storing all history tracks in a single collection that you define. (See Usage for more details) Embedded documents are referenced by storing an association path, which is an array of document_name and document_id fields starting from the top most parent document and down to the embedded document that should track history.
|
14
14
|
|
15
15
|
This plugin implements multi-user undo, which allows users to undo any history change in any order. Undoing a document also creates a new history track. This is great for auditing and preventing vandalism, but it is probably not suitable for use cases such as a wiki.}
|
@@ -274,6 +274,63 @@ describe Mongoid::History do
|
|
274
274
|
@comment.title.should == @comment2.title
|
275
275
|
end
|
276
276
|
end
|
277
|
+
|
278
|
+
describe "trackables" do
|
279
|
+
before :each do
|
280
|
+
@comment.update_attributes(:title => "Test2") # version == 2
|
281
|
+
@comment.update_attributes(:title => "Test3") # version == 3
|
282
|
+
@comment.update_attributes(:title => "Test4") # version == 4
|
283
|
+
end
|
284
|
+
|
285
|
+
describe "undo" do
|
286
|
+
it "should recognize :from, :to options" do
|
287
|
+
@comment.undo! @user, :from => 2, :to => 4
|
288
|
+
@comment.title.should == "test"
|
289
|
+
end
|
290
|
+
|
291
|
+
it "should recognize parameter as version number" do
|
292
|
+
@comment.undo! @user, 3
|
293
|
+
|
294
|
+
@comment.title.should == "Test2"
|
295
|
+
end
|
296
|
+
|
297
|
+
it "should undo last version when no parameter is specified" do
|
298
|
+
@comment.undo! @user
|
299
|
+
@comment.title.should == "Test3"
|
300
|
+
end
|
301
|
+
|
302
|
+
it "should recognize :last options" do
|
303
|
+
@comment.undo! @user, :last => 2
|
304
|
+
@comment.title.should == "Test2"
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
describe "redo" do
|
309
|
+
before :each do
|
310
|
+
@comment.update_attributes(:title => "Test5")
|
311
|
+
end
|
312
|
+
|
313
|
+
it "should recognize :from, :to options" do
|
314
|
+
@comment.redo! @user, :from => 2, :to => 4
|
315
|
+
@comment.title.should == "Test4"
|
316
|
+
end
|
317
|
+
|
318
|
+
it "should recognize parameter as version number" do
|
319
|
+
@comment.redo! @user, 2
|
320
|
+
@comment.title.should == "Test2"
|
321
|
+
end
|
322
|
+
|
323
|
+
it "should redo last version when no parameter is specified" do
|
324
|
+
@comment.redo! @user
|
325
|
+
@comment.title.should == "Test5"
|
326
|
+
end
|
327
|
+
|
328
|
+
it "should recognize :last options" do
|
329
|
+
@comment.redo! @user, :last => 1
|
330
|
+
@comment.title.should == "Test5"
|
331
|
+
end
|
277
332
|
|
333
|
+
end
|
334
|
+
end
|
278
335
|
end
|
279
336
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: mongoid-history
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Aaron Qian
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-03-
|
13
|
+
date: 2011-03-16 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -167,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
167
|
requirements:
|
168
168
|
- - ">="
|
169
169
|
- !ruby/object:Gem::Version
|
170
|
-
hash:
|
170
|
+
hash: 1896069804740488378
|
171
171
|
segments:
|
172
172
|
- 0
|
173
173
|
version: "0"
|