undo 0.1.0 → 0.1.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/README.md +15 -23
- data/lib/undo.rb +7 -7
- data/lib/undo/config.rb +6 -0
- data/lib/undo/serializer/null.rb +2 -2
- data/lib/undo/version.rb +1 -1
- data/lib/undo/wrapper.rb +10 -5
- data/spec/undo/wrapper_spec.rb +4 -4
- data/spec/undo_spec.rb +31 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4898ed46bb0f2c3a761f82478c73b9d78c6e1a7d
|
4
|
+
data.tar.gz: 6a3b917da4a4ebd61757e227d1e54e090dd23c05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5675e00c800a9e4e6a590e112fe331b211e6f57f97d1b851a335343c721e89c06c4d0325617a8696da4a8fb8e25f1cf7b38bee0c2d3e85d9de42428abfa23e86
|
7
|
+
data.tar.gz: 955338eac937b4825f4604c1601d43b0032d6bdf70b685ea1469d3ed3aef8329be1bf085284c3fd765ba03eb5338d8b967e08c33afa63d5b42755cd87f082095
|
data/README.md
CHANGED
@@ -71,36 +71,21 @@ state on each hit to `mutator methods`. By default mutator_methods are
|
|
71
71
|
place or using global configuration (see below).
|
72
72
|
|
73
73
|
To use something more advanced rather plain memory storage and
|
74
|
-
|
74
|
+
pass through serializer, configure the Undo:
|
75
75
|
|
76
76
|
``` ruby
|
77
77
|
Undo.configure do |config|
|
78
|
-
config.storage = Undo::Storage::RailsCache
|
79
|
-
config.serializer = Undo::Serializer::ActiveModel
|
78
|
+
config.storage = Undo::Storage::RailsCache.new
|
79
|
+
config.serializer = Undo::Serializer::ActiveModel.new
|
80
80
|
end
|
81
81
|
```
|
82
82
|
gem `undo-storage-rails_cache` and gem `undo-serializer-active_model` are required for this.
|
83
83
|
There are a bunch of other Rails free adapters. Read about them in configuration chapter below.
|
84
84
|
|
85
|
-
To append custom mutator_methods use
|
86
|
-
|
87
|
-
``` ruby
|
88
|
-
Undo.configure do |config|
|
89
|
-
config.mutator_methods += [:put, :push, :pop]
|
90
|
-
end
|
91
|
-
```
|
92
|
-
|
93
|
-
To define custom uuid generator use `uuid_generator` option:
|
94
|
-
|
95
|
-
``` ruby
|
96
|
-
Undo.configure do |config|
|
97
|
-
config.uuid_generator = ->(object) { "#{object.class.name}_#{object.id}" }
|
98
|
-
end
|
99
|
-
```
|
100
|
-
|
101
85
|
### UUID
|
102
86
|
|
103
|
-
By default uuids are generated by `SecureRandom.uuid`.
|
87
|
+
By default uuids are generated by `SecureRandom.uuid`. The generator is managed by `uuid_generator`
|
88
|
+
setting (see below in configuration chapter).
|
104
89
|
|
105
90
|
UUID can be provided to both #wrap and #store methods and it will be used instead of generated one:
|
106
91
|
|
@@ -141,7 +126,7 @@ end
|
|
141
126
|
|
142
127
|
Currently available serializers:
|
143
128
|
* `Undo::Serializer::Null` pass though serializer. It do nothing and returns whatever passed to it.
|
144
|
-
* `gem undo-serializer-active_model`
|
129
|
+
* `gem undo-serializer-active_model` depends on #attributes method so can be used with Virtus and PORO objects as well as with ActiveRecord objects.
|
145
130
|
|
146
131
|
Check [documentation](http://github.com/AlexParamonov/undo) on project
|
147
132
|
repository for currently available serializers.
|
@@ -159,11 +144,11 @@ end
|
|
159
144
|
|
160
145
|
`mutator methods` option defines a list of methods that will trigger storage#put
|
161
146
|
By default mutator_methods are `update`, `delete`, `destroy`.
|
162
|
-
To
|
147
|
+
To append custom mutator_methods use
|
163
148
|
|
164
149
|
``` ruby
|
165
150
|
Undo.configure do |config|
|
166
|
-
config.mutator_methods
|
151
|
+
config.mutator_methods += [:put, :push, :pop]
|
167
152
|
end
|
168
153
|
```
|
169
154
|
|
@@ -191,6 +176,13 @@ post.destroy
|
|
191
176
|
Undo.restore uuid, serializer: PostDeserializer.new(options)
|
192
177
|
```
|
193
178
|
|
179
|
+
Additionally when given serializer accepts additional options to
|
180
|
+
`#serialize` or `#deserialize`, those options can be set in place as well:
|
181
|
+
|
182
|
+
``` ruby
|
183
|
+
Undo.store post, include: :comments
|
184
|
+
```
|
185
|
+
|
194
186
|
|
195
187
|
Contacts
|
196
188
|
-------------
|
data/lib/undo.rb
CHANGED
@@ -10,24 +10,24 @@ module Undo
|
|
10
10
|
def self.store(object, options = {})
|
11
11
|
config.with(options) do |config|
|
12
12
|
uuid(object, options).tap do |uuid|
|
13
|
-
config.storage.put uuid,
|
13
|
+
config.storage.put uuid,
|
14
|
+
config.serializer.serialize(object, config.filter(options))
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
18
19
|
def self.restore(uuid, options = {})
|
19
20
|
config.with(options) do |config|
|
20
|
-
config.serializer.deserialize config.storage.fetch(uuid)
|
21
|
+
config.serializer.deserialize config.storage.fetch(uuid),
|
22
|
+
config.filter(options)
|
23
|
+
|
21
24
|
end
|
22
25
|
end
|
23
26
|
|
24
27
|
def self.wrap(object, options = {})
|
28
|
+
options[:uuid] ||= uuid object, options
|
25
29
|
config.with(options) do |config|
|
26
|
-
Wrapper.new(
|
27
|
-
object,
|
28
|
-
uuid(object, options),
|
29
|
-
mutator_methods: config.mutator_methods
|
30
|
-
)
|
30
|
+
Wrapper.new object, options.merge(mutator_methods: config.mutator_methods)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
data/lib/undo/config.rb
CHANGED
data/lib/undo/serializer/null.rb
CHANGED
data/lib/undo/version.rb
CHANGED
data/lib/undo/wrapper.rb
CHANGED
@@ -6,10 +6,11 @@ module Undo
|
|
6
6
|
def_delegators :object, :class, :kind_of?
|
7
7
|
attr_reader :uuid
|
8
8
|
|
9
|
-
def initialize(object,
|
9
|
+
def initialize(object, options = {})
|
10
10
|
@object = object
|
11
|
-
@mutator_methods = options.
|
12
|
-
@uuid = object.respond_to?(:uuid) ? object.uuid : uuid
|
11
|
+
@mutator_methods = options.delete(:mutator_methods) || []
|
12
|
+
@uuid = object.respond_to?(:uuid) ? object.uuid : options.fetch(:uuid)
|
13
|
+
@options = options
|
13
14
|
|
14
15
|
super object
|
15
16
|
end
|
@@ -20,10 +21,14 @@ module Undo
|
|
20
21
|
end
|
21
22
|
|
22
23
|
private
|
23
|
-
attr_reader :object, :
|
24
|
+
attr_reader :object, :options
|
25
|
+
|
26
|
+
def mutator_methods
|
27
|
+
Kernel.Array(@mutator_methods)
|
28
|
+
end
|
24
29
|
|
25
30
|
def store
|
26
|
-
Undo.store object, uuid: uuid
|
31
|
+
Undo.store object, options.merge(uuid: uuid)
|
27
32
|
end
|
28
33
|
end
|
29
34
|
end
|
data/spec/undo/wrapper_spec.rb
CHANGED
@@ -2,14 +2,12 @@ require "spec_helper_lite"
|
|
2
2
|
|
3
3
|
describe Undo::Wrapper do
|
4
4
|
subject { described_class }
|
5
|
-
let(:model) { subject.new object, uuid }
|
5
|
+
let(:model) { subject.new object, uuid: uuid, mutator_methods: mutator_methods }
|
6
|
+
let(:mutator_methods) { [:change] }
|
6
7
|
let(:object) { double :object, change: true }
|
7
8
|
let(:uuid) { double :uuid }
|
8
9
|
|
9
10
|
describe "storage" do
|
10
|
-
let(:model) { subject.new object, uuid, mutator_methods: mutator_methods }
|
11
|
-
let(:mutator_methods) { [:change] }
|
12
|
-
|
13
11
|
it "stores object when mutator method is called" do
|
14
12
|
expect(model).to receive(:store)
|
15
13
|
model.change
|
@@ -25,6 +23,8 @@ describe Undo::Wrapper do
|
|
25
23
|
it "uses object#uuid instead" do
|
26
24
|
expect(object).to receive(:uuid) { "123" }
|
27
25
|
expect(model.uuid).to eq "123"
|
26
|
+
expect(Undo).to receive(:store).with(object, hash_including(uuid: "123"))
|
27
|
+
model.change
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
data/spec/undo_spec.rb
CHANGED
@@ -21,7 +21,7 @@ describe Undo do
|
|
21
21
|
let(:serializer) { double :serializer }
|
22
22
|
|
23
23
|
it "serializes data before storing" do
|
24
|
-
expect(serializer).to receive(:serialize).with(object).ordered
|
24
|
+
expect(serializer).to receive(:serialize).with(object, anything).ordered
|
25
25
|
expect(storage).to receive(:put).ordered
|
26
26
|
|
27
27
|
subject.store object,
|
@@ -33,12 +33,41 @@ describe Undo do
|
|
33
33
|
uuid = subject.store object
|
34
34
|
|
35
35
|
expect(storage).to receive(:fetch).and_return(foo: :bar).ordered
|
36
|
-
expect(serializer).to receive(:deserialize).with(foo: :bar).ordered
|
36
|
+
expect(serializer).to receive(:deserialize).with({ foo: :bar }, anything).ordered
|
37
37
|
|
38
38
|
subject.restore uuid,
|
39
39
|
storage: storage,
|
40
40
|
serializer: serializer
|
41
41
|
end
|
42
|
+
|
43
|
+
it "pass through options from store to serialize" do
|
44
|
+
expect(serializer).to receive(:serialize).with(object, foo: :bar)
|
45
|
+
|
46
|
+
subject.store object,
|
47
|
+
serializer: serializer,
|
48
|
+
foo: :bar
|
49
|
+
end
|
50
|
+
|
51
|
+
it "pass through options from wrap to serialize" do
|
52
|
+
expect(serializer).to receive(:serialize)
|
53
|
+
|
54
|
+
wrapper = subject.wrap object,
|
55
|
+
serializer: serializer,
|
56
|
+
mutator_methods: :change,
|
57
|
+
foo: :bar
|
58
|
+
|
59
|
+
wrapper.change
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
it "pass through options from restore to deserialize" do
|
64
|
+
uuid = subject.store object
|
65
|
+
expect(serializer).to receive(:deserialize).with(object, foo: :bar)
|
66
|
+
|
67
|
+
subject.restore uuid,
|
68
|
+
serializer: serializer,
|
69
|
+
foo: :bar
|
70
|
+
end
|
42
71
|
end
|
43
72
|
|
44
73
|
describe "#wrap" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: undo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Paramonov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|