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 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.5
1
+ 0.0.6
@@ -8,5 +8,6 @@ module Mongoid
8
8
  def self.tracker_class
9
9
  @tracker_class ||= tracker_class_name.to_s.classify.constantize
10
10
  end
11
+
11
12
  end
12
13
  end
@@ -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
- trackable.update_attributes!(undo_hash)
36
+ undo_hash
29
37
  end
30
38
 
31
- def redo!(modifier)
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
- trackable.update_attributes!(redo_hash)
44
+ redo_hash
37
45
  end
38
46
 
39
47
  def trackable_root
@@ -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.5"
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-07}
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
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-07 00:00:00 -08:00
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: -4485611789112804696
170
+ hash: 1896069804740488378
171
171
  segments:
172
172
  - 0
173
173
  version: "0"