mongoid-undo 0.0.1 → 0.1.0

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/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
- # 0.1.0
1
+ # 0.1.0 (December 22, 2012)
2
+ * Refactored specs.
3
+ * Renamed action field to _action.
2
4
 
5
+ # 0.0.2 (December 22, 2012)
6
+ * Added rake to Gemfile.
7
+
8
+ # 0.0.1 (December 21, 2012)
3
9
  * First public version.
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
1
  source :rubygems
2
2
 
3
3
  gemspec
4
+
5
+ gem 'minitest'
6
+ gem 'rake'
data/README.md CHANGED
@@ -1,8 +1,76 @@
1
1
  # mongoid-undo
2
2
 
3
- Super simple versioning for your Mongoid app.
3
+ Super simple undo for your Mongoid app, based on both great modules
4
+ [Mongoid::Paranoia](http://mongoid.org/en/mongoid/docs/extras.html#paranoia) and
5
+ [Mongoid::Versioning](http://mongoid.org/en/mongoid/docs/extras.html#versioning).
4
6
 
5
- TODO: Add usage and installation instructions.
7
+ ## How does it work?
8
+
9
+ * `Mongoid::Paranoia` is used to mark documents as deleted, instead of deleting them really, otherwise restoring would be impossible ;).
10
+ * `Mongoid::Versioning` is used to keep the older versions of your document, so we can restore them.
11
+ * `Mongoid::Undo` adds an `_action` field to your documents, so we can easily determine whether it was created, updated, or destroyed.
12
+
13
+ But instead of explaining all the details, you should get the idea by looking at the Usage section.
14
+
15
+ ## Usage
16
+
17
+ ```ruby
18
+ class Document
19
+ include Mongoid::Document
20
+ include Mongoid::Undo
21
+ end
22
+ ```
23
+
24
+ ### Creating (and undoing)
25
+
26
+ ```ruby
27
+ document = Document.create
28
+ document.persisted? #=> true
29
+
30
+ document.undo
31
+ document.persisted? #=> false
32
+
33
+ document.redo # A nice alias for undo ;)
34
+ document.persisted? #=> true
35
+ ```
36
+
37
+ ### Updating (and undoing)
38
+
39
+ ```ruby
40
+ document = Document.create(name: 'foo')
41
+
42
+ document.update_attributes(name: 'bar')
43
+ document.name #=> 'bar'
44
+
45
+ document.undo
46
+ document.name #=> 'foo'
47
+
48
+ document.redo
49
+ document.name #=> 'bar'
50
+ ```
51
+
52
+ ### Destroying (and undoing)
53
+
54
+ ```ruby
55
+ document = Document.first
56
+
57
+ document.destroy
58
+ document.persisted? #=> false
59
+
60
+ document.undo
61
+ document.persisted? #=> true
62
+
63
+ document.redo
64
+ document.persisted? #=> false
65
+ ```
66
+
67
+ ## Installation
68
+
69
+ In your Gemfile:
70
+
71
+ ```ruby
72
+ gem 'mongoid-undo'
73
+ ```
6
74
 
7
75
  ## Contributing
8
76
 
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Undo
3
- VERSION = '0.0.1'
3
+ VERSION = '0.1.0'
4
4
  end
5
5
  end
data/lib/mongoid/undo.rb CHANGED
@@ -22,19 +22,19 @@ module Mongoid
22
22
  include Mongoid::Versioning
23
23
 
24
24
  included do
25
- field :action, type: Symbol, versioned: false
25
+ field :_action, type: Symbol, versioned: false
26
26
  index deleted_at: 1
27
27
 
28
28
  [:create, :update, :destroy].each do |action|
29
29
  set_callback action, :after do
30
- collection.find(atomic_selector).update '$set' => { action: action }
30
+ collection.find(atomic_selector).update('$set' => { _action: action })
31
31
  reload
32
32
  end
33
33
  end
34
34
  end
35
35
 
36
36
  def undo
37
- case action
37
+ case _action
38
38
  when :create, :destroy
39
39
  deleted_at.present? ? restore : delete
40
40
  when :update
@@ -45,7 +45,7 @@ module Mongoid
45
45
 
46
46
  private
47
47
  def retrieve
48
- update_attributes versions.last.versioned_attributes.except('version')
48
+ update_attributes(versions.last.versioned_attributes.except('version'))
49
49
  end
50
50
  end
51
51
  end
data/mongoid-undo.gemspec CHANGED
@@ -6,13 +6,11 @@ Gem::Specification.new do |gem|
6
6
  gem.authors = 'Mario Uher'
7
7
  gem.email = 'uher.mario@gmail.com'
8
8
  gem.homepage = 'https://github.com/haihappen/mongoid-undo'
9
- gem.summary = 'Super simple versioning for your Mongoid app.'
10
- gem.description = 'mongoid-undo provides a super simple and easy to use versioning system for Mongo apps.'
9
+ gem.summary = 'Super simple undo for your Mongoid app.'
10
+ gem.description = 'mongoid-undo provides a super simple and easy to use undo system for Mongo apps.'
11
11
 
12
12
  gem.files = `git ls-files`.split("\n")
13
13
  gem.require_path = 'lib'
14
14
 
15
15
  gem.add_dependency 'mongoid'
16
-
17
- gem.add_development_dependency 'minitest'
18
16
  end
data/spec/spec_helper.rb CHANGED
@@ -2,8 +2,6 @@ require 'minitest/autorun'
2
2
  require 'minitest/pride'
3
3
  require 'minitest/spec'
4
4
 
5
- require 'active_support/testing/assertions'
6
-
7
5
  require './lib/mongoid/undo'
8
6
 
9
7
  Mongoid.load!(File.expand_path('../mongoid.yml', __FILE__), 'test')
data/spec/undo_spec.rb CHANGED
@@ -3,8 +3,6 @@ require File.expand_path('../spec_helper', __FILE__)
3
3
  module Mongoid
4
4
  module Undo
5
5
  describe self do
6
- include ActiveSupport::Testing::Assertions
7
-
8
6
  class Document
9
7
  include Mongoid::Document
10
8
  include Mongoid::Undo
@@ -13,105 +11,140 @@ module Mongoid
13
11
  end
14
12
 
15
13
 
16
- subject { Document.create(name: 'Version 1') }
14
+ subject { Document.new(name: 'foo') }
15
+ let(:name) { subject.name }
16
+ let(:action) { subject.send(:_action) }
17
17
 
18
18
 
19
- describe 'undoing create' do
20
- before { subject.undo }
19
+ describe 'creating' do
20
+ before { subject.save }
21
21
 
22
22
 
23
- it 'deletes' do
24
- subject.persisted?.wont_equal true
25
- subject.deleted_at.wont_be_nil
23
+ it 'sets action to :create' do
24
+ action.must_equal :create
26
25
  end
27
26
 
28
27
 
29
- describe 'and then redoing' do
30
- it 'redoes' do
31
- subject.redo
32
-
33
- subject.persisted?.must_equal true
34
- subject.deleted_at.must_be_nil
28
+ describe 'undoing' do
29
+ before { subject.undo }
30
+
31
+
32
+ it 'deletes' do
33
+ subject.persisted?.wont_equal true
35
34
  end
36
- end
37
35
 
38
36
 
39
- it 'returns proper state' do
40
- 3.times do
41
- subject.undo
42
- subject.action.must_equal :create
37
+ it 'keeps :create action' do
38
+ action.must_equal :create
43
39
  end
44
- end
45
- end
46
40
 
47
41
 
48
- describe 'undoing update' do
49
- before { subject.update_attributes(name: subject.name.next) }
42
+ describe 'redoing' do
43
+ before { subject.redo }
50
44
 
51
45
 
52
- it 'creates a new version' do
53
- assert_difference 'subject.version', +1 do
54
- subject.undo
55
- end
56
-
57
- # Ensure the new version is saved to the db
58
- subject.persisted?.must_equal true
59
- subject.name.must_equal 'Version 1'
60
- end
46
+ it 'restores' do
47
+ subject.persisted?.must_equal true
48
+ end
61
49
 
62
50
 
63
- it 'returns proper state' do
64
- 3.times do
65
- subject.undo
66
- subject.action.must_equal :update
51
+ it 'keeps :create action' do
52
+ action.must_equal :create
53
+ end
67
54
  end
68
55
  end
69
- end
70
56
 
71
57
 
72
- describe 'undoing destroy' do
73
- describe 'having one version' do
74
- before { subject.destroy }
58
+ describe 'updating' do
59
+ before { subject.update_attributes(name: 'bar') }
75
60
 
76
61
 
77
- it 'restores' do
78
- subject.undo
79
-
80
- subject.persisted?.must_equal true
81
- subject.deleted_at.must_be_nil
62
+ it 'sets action to :update' do
63
+ action.must_equal :update
82
64
  end
83
65
 
84
66
 
85
- it 'returns proper state' do
86
- 3.times do
87
- subject.undo
88
- subject.action.must_equal :destroy
67
+ describe 'undoing' do
68
+ before { subject.undo }
69
+
70
+
71
+ it 'retrieves' do
72
+ name.must_equal 'foo'
73
+ end
74
+
75
+
76
+ it 'saves a new version' do
77
+ subject.version.must_equal 3
78
+ end
79
+
80
+
81
+ it 'keeps :update action' do
82
+ action.must_equal :update
83
+ end
84
+
85
+
86
+ describe 'redoing' do
87
+ before { subject.redo }
88
+
89
+
90
+ it 'retrieves' do
91
+ name.must_equal 'bar'
92
+ end
93
+
94
+
95
+ it 'saves a new version' do
96
+ subject.version.must_equal 4
97
+ end
98
+
99
+
100
+ it 'keeps :update action' do
101
+ action.must_equal :update
102
+ end
89
103
  end
90
104
  end
91
105
  end
92
106
 
93
107
 
94
- describe 'having multiple versions' do
95
- before do
96
- 3.times { subject.update_attributes(name: subject.name.next) }
97
- subject.destroy
108
+ describe 'destroying' do
109
+ before { subject.destroy }
110
+
111
+
112
+ it 'sets action to :destroy' do
113
+ action.must_equal :destroy
98
114
  end
99
115
 
100
116
 
101
- it 'restores' do
102
- assert_difference 'subject.version', 0 do
103
- subject.undo
104
- end
105
-
106
- subject.persisted?.must_equal true
107
- subject.deleted_at.must_be_nil
117
+ it 'marks as destroyed' do
118
+ subject.persisted?.must_equal false
108
119
  end
109
120
 
110
121
 
111
- it 'returns proper state' do
112
- 3.times do
113
- subject.undo
114
- subject.action.must_equal :destroy
122
+ describe 'undoing' do
123
+ before { subject.undo }
124
+
125
+
126
+ it 'restores' do
127
+ subject.persisted?.wont_equal false
128
+ end
129
+
130
+
131
+ it 'keeps :destroy action' do
132
+ action.must_equal :destroy
133
+ end
134
+
135
+
136
+ describe 'redoing' do
137
+ before { subject.redo }
138
+
139
+
140
+ it 'deletes' do
141
+ subject.persisted?.must_equal false
142
+ end
143
+
144
+
145
+ it 'keeps :destroy action' do
146
+ action.must_equal :destroy
147
+ end
115
148
  end
116
149
  end
117
150
  end
@@ -125,19 +158,19 @@ module Mongoid
125
158
  end
126
159
 
127
160
 
128
- describe :state do
161
+ describe :_action do
129
162
  it 'is a symbol' do
130
- subject.fields['action'].options[:type].must_equal Symbol
163
+ subject.fields['_action'].options[:type].must_equal Symbol
131
164
  end
132
165
 
133
166
 
134
167
  it 'is versionless' do
135
- subject.fields['action'].options[:versioned].must_equal false
168
+ subject.fields['_action'].options[:versioned].must_equal false
136
169
  end
137
170
  end
138
171
 
139
172
 
140
- describe :retrieve do
173
+ describe 'localization' do
141
174
  class Localized
142
175
  include Mongoid::Document
143
176
  include Mongoid::Undo
@@ -146,26 +179,16 @@ module Mongoid
146
179
  end
147
180
 
148
181
 
149
- subject { Localized.new }
150
-
151
-
152
182
  it 'works too with localized fields' do
153
- subject.update_attributes language: 'English'
154
- subject.update_attributes language: 'English Updated'
183
+ subject = Localized.create(language: 'English')
155
184
 
156
- assert_difference 'subject.version', +1 do
157
- subject.send(:retrieve)
158
- end
185
+ subject.update_attributes(language: 'English Updated')
186
+ subject.undo
159
187
  subject.language.must_equal 'English'
160
188
 
161
- assert_difference 'subject.version', +1 do
162
- subject.send(:retrieve)
163
- end
189
+ subject.redo
164
190
  subject.language.must_equal 'English Updated'
165
191
  end
166
-
167
-
168
- after { I18n.locale = I18n.default_locale }
169
192
  end
170
193
  end
171
194
  end
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: mongoid-undo
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Mario Uher
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-21 00:00:00.000000000 Z
12
+ date: 2012-12-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,24 +27,8 @@ dependencies:
27
27
  - !ruby/object:Gem::Version
28
28
  version: '0'
29
29
  none: false
30
- - !ruby/object:Gem::Dependency
31
- version_requirements: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ! '>='
34
- - !ruby/object:Gem::Version
35
- version: '0'
36
- none: false
37
- name: minitest
38
- type: :development
39
- prerelease: false
40
- requirement: !ruby/object:Gem::Requirement
41
- requirements:
42
- - - ! '>='
43
- - !ruby/object:Gem::Version
44
- version: '0'
45
- none: false
46
- description: mongoid-undo provides a super simple and easy to use versioning system
47
- for Mongo apps.
30
+ description: mongoid-undo provides a super simple and easy to use undo system for
31
+ Mongo apps.
48
32
  email: uher.mario@gmail.com
49
33
  executables: []
50
34
  extensions: []
@@ -84,5 +68,5 @@ rubyforge_project:
84
68
  rubygems_version: 1.8.23
85
69
  signing_key:
86
70
  specification_version: 3
87
- summary: Super simple versioning for your Mongoid app.
71
+ summary: Super simple undo for your Mongoid app.
88
72
  test_files: []