mongoid-history 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +5 -0
- data/CHANGELOG.md +63 -73
- data/Gemfile +3 -3
- data/README.md +66 -2
- data/lib/mongoid/history/attributes/base.rb +41 -0
- data/lib/mongoid/history/attributes/create.rb +3 -5
- data/lib/mongoid/history/attributes/destroy.rb +3 -5
- data/lib/mongoid/history/attributes/update.rb +7 -7
- data/lib/mongoid/history/options.rb +32 -1
- data/lib/mongoid/history/trackable.rb +10 -1
- data/lib/mongoid/history/version.rb +1 -1
- data/mongoid-history.gemspec +1 -1
- data/spec/integration/integration_spec.rb +7 -0
- data/spec/unit/attributes/base_spec.rb +96 -0
- data/spec/unit/options_spec.rb +34 -2
- data/spec/unit/trackable_spec.rb +34 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d92239564a7df075b3a55eb68c9f7f22666e24ef
|
4
|
+
data.tar.gz: 13f5bb15f7102d5b0957b569cb880af4249a0c75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9b09271720419ebbd843f78954d182430e4a3e5f020cc6b835993154c08fa55e6c8627beaef64f8813632ce15118186057d39771ddb863cf40f28a68c6ce7d3
|
7
|
+
data.tar.gz: 8d337e3008f6468a42b01c0babafa649685237f686e255bd620d380bf8d91bf77d56888445ca20b043ee6f2e7398d4821709fb877bafe11765948fc38ee6ddad
|
data/.rubocop_todo.yml
CHANGED
@@ -64,6 +64,7 @@ Style/Documentation:
|
|
64
64
|
- 'spec/unit/singleton_methods_spec.rb'
|
65
65
|
- 'spec/unit/trackable_spec.rb'
|
66
66
|
- 'spec/unit/tracker_spec.rb'
|
67
|
+
- 'spec/unit/attributes/base_spec.rb'
|
67
68
|
- 'spec/unit/attributes/create_spec.rb'
|
68
69
|
- 'spec/unit/attributes/destroy_spec.rb'
|
69
70
|
- 'spec/unit/attributes/update_spec.rb'
|
@@ -85,3 +86,7 @@ Style/MultilineBlockChain:
|
|
85
86
|
Exclude:
|
86
87
|
- 'lib/mongoid/history/trackable.rb'
|
87
88
|
- 'lib/mongoid/history/tracker.rb'
|
89
|
+
|
90
|
+
Style/ClassLength:
|
91
|
+
Exclude:
|
92
|
+
- 'lib/mongoid/history/options.rb'
|
data/CHANGELOG.md
CHANGED
@@ -1,57 +1,57 @@
|
|
1
|
-
0.6.
|
2
|
-
------------------
|
1
|
+
### 0.6.1 (2017/01/04)
|
3
2
|
|
4
|
-
* [#
|
5
|
-
* [#
|
6
|
-
* [#
|
7
|
-
* [#
|
8
|
-
* [#
|
9
|
-
* [#155](https://github.com/aq1018/mongoid-history/pull/155): Add support to whitelist the attributes for tracked embeds_one and embeds_many relations - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
10
|
-
* [#154](https://github.com/aq1018/mongoid-history/pull/154): Prevent soft-deleted embedded documents from tracking - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
11
|
-
* [#151](https://github.com/aq1018/mongoid-history/pull/151): Added ability to customize tracker class for each trackable; multiple trackers across the app are now possible - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
12
|
-
* [#151](https://github.com/aq1018/mongoid-history/pull/151): Added automatic support for `request_store` gem as drop-in replacement for `Thread.current` - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
13
|
-
* [#150](https://github.com/aq1018/mongoid-history/pull/150): Added support for keeping embedded objects audit history in parent itself - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
3
|
+
* [#182](https://github.com/mongoid/mongoid-history/pull/182): No-op on repeated calls to destroy - [@msaffitz](https://github.com/msaffitz).
|
4
|
+
* [#170](https://github.com/mongoid/mongoid-history/pull/170): Parent repo is now [mongoid/mongoid-history](https://github.com/mongoid/mongoid-history) - [@dblock](https://github.com/dblock).
|
5
|
+
* [#171](https://github.com/mongoid/mongoid-history/pull/171): Add field formatting - [@jnfeinstein](https://github.com/jnfeinstein).
|
6
|
+
* [#172](https://github.com/mongoid/mongoid-history/pull/172): Add config helper to track all embedded relations - [@jnfeinstein](https://github.com/jnfeinstein).
|
7
|
+
* [#173](https://github.com/mongoid/mongoid-history/pull/173): Compatible with mongoid 6 - [@sivagollapalli](https://github.com/sivagollapalli).
|
14
8
|
|
15
|
-
0.
|
16
|
-
------------------
|
9
|
+
### 0.6.0 (2016/09/13)
|
17
10
|
|
18
|
-
* [#
|
19
|
-
* [#
|
20
|
-
* [#
|
11
|
+
* [#2](https://github.com/dblock/mongoid-history/pull/2): Forked into the [mongoid](https://github.com/mongoid) organization - [@dblock](https://github.com/dblock).
|
12
|
+
* [#1](https://github.com/dblock/mongoid-history/pull/1): Added Danger, PR linter - [@dblock](https://github.com/dblock).
|
13
|
+
* [#166](https://github.com/mongoid/mongoid-history/pull/166): Hash fields should default to an empty Hash - [@johnnyshields](https://github.com/johnnyshields).
|
14
|
+
* [#162](https://github.com/mongoid/mongoid-history/pull/162): Do not consider embedded relations as dynamic fields - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
15
|
+
* [#144](https://github.com/mongoid/mongoid-history/pull/158): Can modify history tracker insertion on object creation - [@sivagollapalli](https://github.com/sivagollapalli).
|
16
|
+
* [#155](https://github.com/mongoid/mongoid-history/pull/155): Add support to whitelist the attributes for tracked embeds_one and embeds_many relations - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
17
|
+
* [#154](https://github.com/mongoid/mongoid-history/pull/154): Prevent soft-deleted embedded documents from tracking - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
18
|
+
* [#151](https://github.com/mongoid/mongoid-history/pull/151): Added ability to customize tracker class for each trackable; multiple trackers across the app are now possible - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
19
|
+
* [#151](https://github.com/mongoid/mongoid-history/pull/151): Added automatic support for `request_store` gem as drop-in replacement for `Thread.current` - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
20
|
+
* [#150](https://github.com/mongoid/mongoid-history/pull/150): Added support for keeping embedded objects audit history in parent itself - [@JagdeepSingh](https://github.com/JagdeepSingh).
|
21
21
|
|
22
|
-
0.
|
23
|
-
------------------
|
22
|
+
### 0.5.0 (2015/09/18)
|
24
23
|
|
25
|
-
* [#
|
24
|
+
* [#143](https://github.com/mongoid/mongoid-history/pull/143): Added support for Mongoid 5 - [@dblock](https://github.com/dblock).
|
25
|
+
* [#133](https://github.com/mongoid/mongoid-history/pull/133): Added dynamic attributes tracking (Mongoid::Attributes::Dynamic) - [@minisai](https://github.com/minisai).
|
26
|
+
* [#142](https://github.com/mongoid/mongoid-history/pull/142): Allow non-database fields to be specified in conjunction with a custom changes method - [@kayakyakr](https://github.com/kayakyakr).
|
26
27
|
|
27
|
-
0.4.
|
28
|
-
------------------
|
28
|
+
### 0.4.7 (2015/04/06)
|
29
29
|
|
30
|
-
* [#
|
31
|
-
* [#127](https://github.com/aq1018/mongoid-history/pull/127): Fixed gem naming per [rubygems](http://guides.rubygems.org/name-your-gem/) specs, now you can `require 'mongoid/history'` - [@nofxx](https://github.com/nofxx).
|
32
|
-
* [#129](https://github.com/aq1018/mongoid-history/pull/129): Support multiple levels of embedded polimorphic documents - [@BrunoChauvet](https://github.com/BrunoChauvet).
|
33
|
-
* [#123](https://github.com/aq1018/mongoid-history/pull/123): Used a method compatible with mongoid-observers to determinine the version of Mongoid - [@zeitnot](https://github.com/zeitnot).
|
30
|
+
* [#124](https://github.com/mongoid/mongoid-history/pull/124): You can require both `mongoid-history` and `mongoid/history` - [@dblock](https://github.com/dblock).
|
34
31
|
|
35
|
-
0.4.
|
36
|
-
-----------------
|
32
|
+
### 0.4.5 (2015/02/09)
|
37
33
|
|
38
|
-
* [#
|
34
|
+
* [#131](https://github.com/mongoid/mongoid-history/pull/131): Added `undo` method, that helps to get specific version of an object without saving changes - [@alexkravets](https://github.com/alexkravets).
|
35
|
+
* [#127](https://github.com/mongoid/mongoid-history/pull/127): Fixed gem naming per [rubygems](http://guides.rubygems.org/name-your-gem/) specs, now you can `require 'mongoid/history'` - [@nofxx](https://github.com/nofxx).
|
36
|
+
* [#129](https://github.com/mongoid/mongoid-history/pull/129): Support multiple levels of embedded polimorphic documents - [@BrunoChauvet](https://github.com/BrunoChauvet).
|
37
|
+
* [#123](https://github.com/mongoid/mongoid-history/pull/123): Used a method compatible with mongoid-observers to determinine the version of Mongoid - [@zeitnot](https://github.com/zeitnot).
|
39
38
|
|
40
|
-
0.4.
|
41
|
-
------------------
|
39
|
+
### 0.4.4 (2014/7/29)
|
42
40
|
|
43
|
-
* [#
|
41
|
+
* [#111](https://github.com/mongoid/mongoid-history/pull/111): Fixed compatibility of `undo!` and `redo!` methods with Rails 3.x - [@mrjlynch](https://github.com/mrjlynch).
|
44
42
|
|
45
|
-
0.4.
|
46
|
-
------------------
|
43
|
+
### 0.4.3 (2014/07/10)
|
47
44
|
|
48
|
-
* [#
|
49
|
-
* [#106](https://github.com/aq1018/mongoid-history/pull/106): Enabled specifying an array of relationships in `scope` - [@adbeelitamar](https://github.com/adbeelitamar).
|
50
|
-
* [#83](https://github.com/aq1018/mongoid-history/pull/83): Added support for Mongoid 4.x, which removed `attr_accessible` in favor of protected attributes - [@dblock](https://github.com/dblock).
|
51
|
-
* [#103](https://github.com/aq1018/mongoid-history/pull/103): Fixed compatibility with models using `default_scope` - [@mrjlynch](https://github.com/mrjlynch).
|
45
|
+
* [#110](https://github.com/mongoid/mongoid-history/pull/110): Fixed scope reference on history tracks criteria - [@adbeelitamar](https://github.com/adbeelitamar).
|
52
46
|
|
53
|
-
0.4.
|
54
|
-
|
47
|
+
### 0.4.2 (2014/07/01)
|
48
|
+
|
49
|
+
* [#106](https://github.com/mongoid/mongoid-history/pull/106): Added support for polymorphic relationship `scope` - [@adbeelitamar](https://github.com/adbeelitamar).
|
50
|
+
* [#106](https://github.com/mongoid/mongoid-history/pull/106): Enabled specifying an array of relationships in `scope` - [@adbeelitamar](https://github.com/adbeelitamar).
|
51
|
+
* [#83](https://github.com/mongoid/mongoid-history/pull/83): Added support for Mongoid 4.x, which removed `attr_accessible` in favor of protected attributes - [@dblock](https://github.com/dblock).
|
52
|
+
* [#103](https://github.com/mongoid/mongoid-history/pull/103): Fixed compatibility with models using `default_scope` - [@mrjlynch](https://github.com/mrjlynch).
|
53
|
+
|
54
|
+
### 0.4.1 (2014/01/11)
|
55
55
|
|
56
56
|
* Fixed compatibility with Mongoid 4.x - [@dblock](https://github.com/dblock).
|
57
57
|
* `Mongoid::History::Sweeper` has been removed, in accorance with Mongoid 4.x (see [#3108](https://github.com/mongoid/mongoid/issues/3108)) and Rails 4.x observer deprecation - [@dblock](https://github.com/dblock).
|
@@ -62,8 +62,7 @@
|
|
62
62
|
* Replace Jeweler with Gem-Release - [@johnnyshields](https://github.com/johnnyshields).
|
63
63
|
* Track version as a Ruby file - [@johnnyshields](https://github.com/johnnyshields).
|
64
64
|
|
65
|
-
0.4.0 (2013/06/12)
|
66
|
-
------------------
|
65
|
+
### 0.4.0 (2013/06/12)
|
67
66
|
|
68
67
|
* Added `Mongoid::History.disable` and `Mongoid::History.enabled?` methods for global tracking disablement - [@johnnyshields](https://github.com/johnnyshields).
|
69
68
|
* Added `:changes_method` that optionally overrides which method to call to collect changes - [@joelnordel](https://github.com/joelnordell).
|
@@ -74,67 +73,58 @@
|
|
74
73
|
* Added `#tracked_changes` and `#tracked_edits` methods to `Tracker` class for nicer change summaries - [@johnnyshields](https://github.com/johnnyshields) and [@tstepp](https://github.com/tstepp).
|
75
74
|
* Refactored and exposed `#trackable_parent_class` in `Tracker`, which returns the class of the trackable regardless of whether the trackable itself has been destroyed - [@johnnyshields](https://github.com/johnnyshields).
|
76
75
|
* Added class-level `#tracked_field?` and `#tracked_fields` methods; refactor logic to determine whether a field is tracked - [@johnnyshields](https://github.com/johnnyshields).
|
77
|
-
* Fixed bug in Trackable#track_update where `return` condition at beginning of method caused a short-circuit where memoization would not be cleared properly
|
76
|
+
* Fixed bug in Trackable#track_update where `return` condition at beginning of method caused a short-circuit where memoization would not be cleared properly - [@johnnyshields](https://github.com/johnnyshields).
|
78
77
|
* Tests: Added spec for nested embedded documents - [@matekb](https://github.com/matekb).
|
79
78
|
* Tests: Test run time cut in half (~2.5s versus ~5s) by using `#let` helper and removing class initialization before each test - [@johnnyshields](https://github.com/johnnyshields).
|
80
79
|
* Tests: Remove `database_cleaner` gem in favor of `Mongoid.purge!` - [@johnnyshields](https://github.com/johnnyshields).
|
81
80
|
* Tests: Remove dependency on non-committed file `mongoid.yml` and hardcode collection to `mongoid_history_test` - [@johnnyshields](https://github.com/johnnyshields).
|
82
81
|
|
83
|
-
0.3.3 (2013/04/01)
|
84
|
-
------------------
|
82
|
+
### 0.3.3 (2013/04/01)
|
85
83
|
|
86
|
-
* [#42](https://github.com/
|
87
|
-
* [#56](https://github.com/
|
88
|
-
* [#49](https://github.com/
|
84
|
+
* [#42](https://github.com/mongoid/mongoid-history/issues/42): Fix: corrected creation of association chain when using nested embedded documents - [@matekb](https://github.com/matekb).
|
85
|
+
* [#56](https://github.com/mongoid/mongoid-history/issues/56): Fix: now possible to undo setting (creating) attributes that was previously unset - [@matekb](https://github.com/matekb).
|
86
|
+
* [#49](https://github.com/mongoid/mongoid-history/issues/49): Fix: now correctly undo/redo localized fields - [@edejong](https://github.com/edejong).
|
89
87
|
|
90
88
|
|
91
|
-
0.3.2 (2013/01/24)
|
92
|
-
------------------
|
89
|
+
### 0.3.2 (2013/01/24)
|
93
90
|
|
94
|
-
* [#54](https://github.com/
|
95
|
-
* [#11](https://github.com/
|
91
|
+
* [#54](https://github.com/mongoid/mongoid-history/pull/54): Used an index instead of the `$elemMatch` selector in `history_tracks` - [@vecio](https://github.com/vecio).
|
92
|
+
* [#11](https://github.com/mongoid/mongoid-history/issues/11): Added `:modifier_field_inverse_of` on `track_history` that defines the `:inverse_of` relationship of the modifier class - [@matekb](https://github.com/matekb), [@dblock](https://github.com/dblock).
|
96
93
|
|
97
|
-
0.3.1 (2012/11/16)
|
98
|
-
------------------
|
94
|
+
### 0.3.1 (2012/11/16)
|
99
95
|
|
100
|
-
* [#45](https://github.com/
|
101
|
-
* [#50](https://github.com/
|
96
|
+
* [#45](https://github.com/mongoid/mongoid-history/pull/45): Fix: intermittent hash ordering issue with `history_tracks` - [@getaroom](https://github.com/getaroom).
|
97
|
+
* [#50](https://github.com/mongoid/mongoid-history/pull/50): Fix: tracking of array changes, undo and redo of field changes on non-embedded objects - [@dblock](https://github.com/dblock).
|
102
98
|
|
103
|
-
0.3.0 (2012/08/21)
|
104
|
-
------------------
|
99
|
+
### 0.3.0 (2012/08/21)
|
105
100
|
|
106
|
-
* [#41](https://github.com/
|
101
|
+
* [#41](https://github.com/mongoid/mongoid-history/pull/41): Mongoid 3.x support - [@zambot](https://github.com/zambot).
|
107
102
|
|
108
|
-
0.2.4 (2012/08/21)
|
109
|
-
------------------
|
103
|
+
### 0.2.4 (2012/08/21)
|
110
104
|
|
111
|
-
* [#38](https://github.com/
|
112
|
-
* [#35](https://github.com/
|
105
|
+
* [#38](https://github.com/mongoid/mongoid-history/pull/38): Fix: allow sub-models to be tracked by using `collection_name` as the scope - [@acant](https://github.com/acant).
|
106
|
+
* [#35](https://github.com/mongoid/mongoid-history/pull/35): Fix: sweeper references record of change, not the record changed - [@dblock](https://github.com/dblock).
|
113
107
|
|
114
|
-
0.2.3 (2012/04/20)
|
115
|
-
------------------
|
108
|
+
### 0.2.3 (2012/04/20)
|
116
109
|
|
117
|
-
* [#23](https://github.com/
|
110
|
+
* [#23](https://github.com/mongoid/mongoid-history/pull/34): Updated `Trackable::association_hash` to write through parent - [@tcopple](https://github.com/tcopple).
|
118
111
|
* Fix: `Trackable::association_hash` nil meta value call - [@tcopple](https://github.com/tcopple).
|
119
|
-
* [#27](https://github.com/
|
112
|
+
* [#27](https://github.com/mongoid/mongoid-history/pull/27): Added support for re-creation of destroyed embedded documents - [@erlingwl](https://github.com/erlingwl).
|
120
113
|
|
121
|
-
0.1.7 (2011/12/09)
|
122
|
-
------------------
|
114
|
+
### 0.1.7 (2011/12/09)
|
123
115
|
|
124
116
|
* Fix: tracking `false` values - [@gottfrois](https://github.com/gottfrois).
|
125
117
|
* Used a mongoid observer and controller `around_filter` to pick up modifying user from controller - [@bensymonds](https://github.com/bensymonds).
|
126
118
|
* More flexible dependency on mongoid - [@sarcilav](https://github.com/sarcilav).
|
127
119
|
* Fix: tracking broken in a multithreaded environment - [@dblock](https://github.com/dblock).
|
128
120
|
|
129
|
-
0.1.0 (2011/05/13)
|
130
|
-
------------------
|
121
|
+
### 0.1.0 (2011/05/13)
|
131
122
|
|
132
123
|
* Added support for `destroy` - [@dblock](https://github.com/dblock).
|
133
124
|
* Added undo and redo - [@aq1018](https://github.com/aq1018).
|
134
125
|
* Added support for temporarily disabling history tracking - [@aq1018](https://github.com/aq1018).
|
135
126
|
* Record modifier for undo and redo actions - [@aq1018](https://github.com/aq1018).
|
136
127
|
|
137
|
-
0.0.1 (2011/03/04)
|
138
|
-
------------------
|
128
|
+
### 0.0.1 (2011/03/04)
|
139
129
|
|
140
130
|
* Intial public release - [@aq1018](https://github.com/aq1018).
|
data/Gemfile
CHANGED
@@ -2,11 +2,11 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
case version = ENV['MONGOID_VERSION'] || '~> 6.0.0
|
5
|
+
case version = ENV['MONGOID_VERSION'] || '~> 6.0.0'
|
6
6
|
when 'HEAD'
|
7
7
|
gem 'mongoid', github: 'mongodb/mongoid'
|
8
8
|
when /6/
|
9
|
-
gem 'mongoid', '~> 6.0.0
|
9
|
+
gem 'mongoid', '~> 6.0.0'
|
10
10
|
when /5/
|
11
11
|
gem 'mongoid', '~> 5.0'
|
12
12
|
gem 'mongoid-observers', '~> 0.2.0'
|
@@ -20,7 +20,7 @@ else
|
|
20
20
|
end
|
21
21
|
|
22
22
|
group :development, :test do
|
23
|
-
gem 'rake'
|
23
|
+
gem 'rake', '< 11.0'
|
24
24
|
gem 'bundler'
|
25
25
|
end
|
26
26
|
|
data/README.md
CHANGED
@@ -14,7 +14,7 @@ This gem also implements multi-user undo, which allows users to undo any history
|
|
14
14
|
Install
|
15
15
|
-------
|
16
16
|
|
17
|
-
This gem supports Mongoid 3, 4
|
17
|
+
This gem supports Mongoid 3, 4, 5 on Ruby 1.9.3 or newer and Mongoid 6 on Ruby 2.2.2+. Add it to your `Gemfile` or run `gem install mongoid-history`.
|
18
18
|
|
19
19
|
```ruby
|
20
20
|
gem 'mongoid-history'
|
@@ -156,6 +156,35 @@ Mongoid::History.disable do
|
|
156
156
|
end
|
157
157
|
```
|
158
158
|
|
159
|
+
You may want to track changes on all fields.
|
160
|
+
|
161
|
+
```ruby
|
162
|
+
class Post
|
163
|
+
include Mongoid::Document
|
164
|
+
include Mongoid::History::Trackable
|
165
|
+
|
166
|
+
field :title
|
167
|
+
field :body
|
168
|
+
field :rating
|
169
|
+
|
170
|
+
track_history :on => [:fields] # all fields will be tracked
|
171
|
+
end
|
172
|
+
```
|
173
|
+
|
174
|
+
You can also track changes on all embedded relations.
|
175
|
+
|
176
|
+
```ruby
|
177
|
+
class Post
|
178
|
+
include Mongoid::Document
|
179
|
+
include Mongoid::History::Trackable
|
180
|
+
|
181
|
+
embeds_many :comments
|
182
|
+
embeds_one :content
|
183
|
+
|
184
|
+
track_history :on => [:embedded_relations] # all embedded relations will be tracked
|
185
|
+
end
|
186
|
+
```
|
187
|
+
|
159
188
|
**Include embedded objects attributes in parent audit**
|
160
189
|
|
161
190
|
Modify above `Post` and `Comment` classes as below:
|
@@ -279,6 +308,41 @@ end
|
|
279
308
|
|
280
309
|
This will skip the `page` documents with `removed_at` set to a non-blank value from nested tracking
|
281
310
|
|
311
|
+
**Formatting fields**
|
312
|
+
|
313
|
+
You can opt to use a proc or string interpolation to alter attributes being stored on a history record.
|
314
|
+
|
315
|
+
```ruby
|
316
|
+
class Post
|
317
|
+
include Mongoid::Document
|
318
|
+
include Mongoid::History::Trackable
|
319
|
+
|
320
|
+
field :title
|
321
|
+
track_history on: :title,
|
322
|
+
format: { title: ->(t){ t[0..3] } }
|
323
|
+
```
|
324
|
+
|
325
|
+
This also works for fields on an embedded relations.
|
326
|
+
|
327
|
+
```ruby
|
328
|
+
class Book
|
329
|
+
include Mongoid::Document
|
330
|
+
include Mongoid::History::Trackable
|
331
|
+
|
332
|
+
embeds_many :pages
|
333
|
+
track_history on: :pages,
|
334
|
+
format: { pages: { number: 'pg. %d' } }
|
335
|
+
end
|
336
|
+
|
337
|
+
class Page
|
338
|
+
include Mongoid::Document
|
339
|
+
include Mongoid::History::Trackable
|
340
|
+
|
341
|
+
field :number, type: Integer
|
342
|
+
embedded_in :book
|
343
|
+
end
|
344
|
+
```
|
345
|
+
|
282
346
|
**Displaying history trackers as an audit trail**
|
283
347
|
|
284
348
|
In your Controller:
|
@@ -341,7 +405,7 @@ Since October 2013 (mongoid-history version 0.4.1 and onwards), Mongoid::History
|
|
341
405
|
instructions above then run the following command:
|
342
406
|
|
343
407
|
```
|
344
|
-
MyHistoryTracker.all.
|
408
|
+
MyHistoryTracker.all.rename(modifier_id: :created_by)
|
345
409
|
```
|
346
410
|
|
347
411
|
**Setting Modifier Class Name**
|
@@ -25,6 +25,47 @@ module Mongoid
|
|
25
25
|
def changes
|
26
26
|
trackable.send(changes_method)
|
27
27
|
end
|
28
|
+
|
29
|
+
def format_field(field, value)
|
30
|
+
format_value(value, trackable_class.field_format(field))
|
31
|
+
end
|
32
|
+
|
33
|
+
def format_embeds_one_relation(rel, obj)
|
34
|
+
rel = trackable_class.database_field_name(rel)
|
35
|
+
relation_class = trackable_class.embeds_one_class(rel)
|
36
|
+
permitted_attrs = trackable_class.tracked_embeds_one_attributes(rel)
|
37
|
+
formats = trackable_class.field_format(rel)
|
38
|
+
format_relation(relation_class, obj, permitted_attrs, formats)
|
39
|
+
end
|
40
|
+
|
41
|
+
def format_embeds_many_relation(rel, obj)
|
42
|
+
rel = trackable_class.database_field_name(rel)
|
43
|
+
relation_class = trackable_class.embeds_many_class(rel)
|
44
|
+
permitted_attrs = trackable_class.tracked_embeds_many_attributes(rel)
|
45
|
+
formats = trackable_class.field_format(rel)
|
46
|
+
format_relation(relation_class, obj, permitted_attrs, formats)
|
47
|
+
end
|
48
|
+
|
49
|
+
def format_relation(relation_class, obj, permitted_attrs, formats)
|
50
|
+
obj.inject({}) do |m, field_value|
|
51
|
+
field = relation_class.database_field_name(field_value.first)
|
52
|
+
next m unless permitted_attrs.include?(field)
|
53
|
+
|
54
|
+
value = field_value.last
|
55
|
+
value = format_value(field_value.last, formats[field]) if formats.class == Hash
|
56
|
+
m.merge(field => value)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def format_value(value, format)
|
61
|
+
if format.class == String
|
62
|
+
format % value
|
63
|
+
elsif format.respond_to?(:call)
|
64
|
+
format.call(value)
|
65
|
+
else
|
66
|
+
value
|
67
|
+
end
|
68
|
+
end
|
28
69
|
end
|
29
70
|
end
|
30
71
|
end
|
@@ -11,7 +11,7 @@ module Mongoid
|
|
11
11
|
else
|
12
12
|
v
|
13
13
|
end
|
14
|
-
@attributes[k] = [nil, modified]
|
14
|
+
@attributes[k] = [nil, format_field(k, modified)]
|
15
15
|
end
|
16
16
|
insert_embeds_one_changes
|
17
17
|
insert_embeds_many_changes
|
@@ -25,11 +25,10 @@ module Mongoid
|
|
25
25
|
rel_class = trackable_class.embeds_one_class(rel)
|
26
26
|
paranoia_field = Mongoid::History.trackable_class_settings(rel_class)[:paranoia_field]
|
27
27
|
paranoia_field = rel_class.aliased_fields.key(paranoia_field) || paranoia_field
|
28
|
-
permitted_attrs = trackable_class.tracked_embeds_one_attributes(rel)
|
29
28
|
rel = aliased_fields.key(rel) || rel
|
30
29
|
obj = trackable.send(rel)
|
31
30
|
next if !obj || (obj.respond_to?(paranoia_field) && obj.public_send(paranoia_field).present?)
|
32
|
-
@attributes[rel] = [nil, obj.attributes
|
31
|
+
@attributes[rel] = [nil, format_embeds_one_relation(rel, obj.attributes)]
|
33
32
|
end
|
34
33
|
end
|
35
34
|
|
@@ -38,12 +37,11 @@ module Mongoid
|
|
38
37
|
rel_class = trackable_class.embeds_many_class(rel)
|
39
38
|
paranoia_field = Mongoid::History.trackable_class_settings(rel_class)[:paranoia_field]
|
40
39
|
paranoia_field = rel_class.aliased_fields.key(paranoia_field) || paranoia_field
|
41
|
-
permitted_attrs = trackable_class.tracked_embeds_many_attributes(rel)
|
42
40
|
rel = aliased_fields.key(rel) || rel
|
43
41
|
@attributes[rel] = [nil,
|
44
42
|
trackable.send(rel)
|
45
43
|
.reject { |obj| obj.respond_to?(paranoia_field) && obj.public_send(paranoia_field).present? }
|
46
|
-
.map { |obj| obj.attributes
|
44
|
+
.map { |obj| format_embeds_many_relation(rel, obj.attributes) }]
|
47
45
|
end
|
48
46
|
end
|
49
47
|
end
|
@@ -4,7 +4,7 @@ module Mongoid
|
|
4
4
|
class Destroy < ::Mongoid::History::Attributes::Base
|
5
5
|
def attributes
|
6
6
|
@attributes = {}
|
7
|
-
trackable.attributes.each { |k, v| @attributes[k] = [v, nil] if trackable_class.tracked_field?(k, :destroy) }
|
7
|
+
trackable.attributes.each { |k, v| @attributes[k] = [format_field(k, v), nil] if trackable_class.tracked_field?(k, :destroy) }
|
8
8
|
insert_embeds_one_changes
|
9
9
|
insert_embeds_many_changes
|
10
10
|
@attributes
|
@@ -16,9 +16,8 @@ module Mongoid
|
|
16
16
|
trackable_class.tracked_embeds_one
|
17
17
|
.map { |rel| aliased_fields.key(rel) || rel }
|
18
18
|
.each do |rel|
|
19
|
-
permitted_attrs = trackable_class.tracked_embeds_one_attributes(rel)
|
20
19
|
obj = trackable.send(rel)
|
21
|
-
@attributes[rel] = [obj.attributes
|
20
|
+
@attributes[rel] = [format_embeds_one_relation(rel, obj.attributes), nil] if obj
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
@@ -26,8 +25,7 @@ module Mongoid
|
|
26
25
|
trackable_class.tracked_embeds_many
|
27
26
|
.map { |rel| aliased_fields.key(rel) || rel }
|
28
27
|
.each do |rel|
|
29
|
-
|
30
|
-
@attributes[rel] = [trackable.send(rel).map { |obj| obj.attributes.slice(*permitted_attrs) }, nil]
|
28
|
+
@attributes[rel] = [trackable.send(rel).map { |obj| format_embeds_many_relation(rel, obj.attributes) }, nil]
|
31
29
|
end
|
32
30
|
end
|
33
31
|
end
|
@@ -10,7 +10,7 @@ module Mongoid
|
|
10
10
|
elsif trackable_class.tracked_embeds_many?(k)
|
11
11
|
insert_embeds_many_changes(k, v)
|
12
12
|
elsif trackable_class.tracked?(k, :update)
|
13
|
-
@attributes[k] = v
|
13
|
+
@attributes[k] = format_field(k, v)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
@attributes
|
@@ -20,22 +20,22 @@ module Mongoid
|
|
20
20
|
|
21
21
|
def insert_embeds_one_changes(relation, value)
|
22
22
|
relation = trackable_class.database_field_name(relation)
|
23
|
-
permitted_attrs = trackable_class.tracked_embeds_one_attributes(relation)
|
24
23
|
relation_class = trackable_class.embeds_one_class(relation)
|
25
24
|
paranoia_field = Mongoid::History.trackable_class_settings(relation_class)[:paranoia_field]
|
26
25
|
@attributes[relation] = []
|
27
|
-
@attributes[relation][0] = value[0][paranoia_field].present? ? {} : value[0]
|
28
|
-
@attributes[relation][1] = value[1][paranoia_field].present? ? {} : value[1]
|
26
|
+
@attributes[relation][0] = value[0][paranoia_field].present? ? {} : format_embeds_one_relation(relation, value[0])
|
27
|
+
@attributes[relation][1] = value[1][paranoia_field].present? ? {} : format_embeds_one_relation(relation, value[1])
|
29
28
|
end
|
30
29
|
|
31
30
|
def insert_embeds_many_changes(relation, value)
|
32
31
|
relation = trackable_class.database_field_name(relation)
|
33
|
-
permitted_attrs = trackable_class.tracked_embeds_many_attributes(relation)
|
34
32
|
relation_class = trackable_class.embeds_many_class(relation)
|
35
33
|
paranoia_field = Mongoid::History.trackable_class_settings(relation_class)[:paranoia_field]
|
36
34
|
@attributes[relation] = []
|
37
|
-
@attributes[relation][0] = value[0].reject { |rel| rel[paranoia_field].present? }
|
38
|
-
|
35
|
+
@attributes[relation][0] = value[0].reject { |rel| rel[paranoia_field].present? }
|
36
|
+
.map { |v_attrs| format_embeds_many_relation(relation, v_attrs) }
|
37
|
+
@attributes[relation][1] = value[1].reject { |rel| rel[paranoia_field].present? }
|
38
|
+
.map { |v_attrs| format_embeds_many_relation(relation, v_attrs) }
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -14,6 +14,7 @@ module Mongoid
|
|
14
14
|
def parse(options = {})
|
15
15
|
@options = default_options.merge(options)
|
16
16
|
prepare_skipped_fields
|
17
|
+
prepare_formatted_fields
|
17
18
|
parse_tracked_fields_and_relations
|
18
19
|
@options
|
19
20
|
end
|
@@ -31,7 +32,8 @@ module Mongoid
|
|
31
32
|
scope: scope,
|
32
33
|
track_create: false,
|
33
34
|
track_update: true,
|
34
|
-
track_destroy: false
|
35
|
+
track_destroy: false,
|
36
|
+
format: nil }
|
35
37
|
end
|
36
38
|
|
37
39
|
# Sets the :except attributes and relations in `options` to be an [ Array <String> ]
|
@@ -43,6 +45,30 @@ module Mongoid
|
|
43
45
|
@options[:except] = options[:except].map { |field| trackable.database_field_name(field) }.compact.uniq
|
44
46
|
end
|
45
47
|
|
48
|
+
def prepare_formatted_fields
|
49
|
+
formats = {}
|
50
|
+
|
51
|
+
if options[:format].class == Hash
|
52
|
+
options[:format].each do |field, format|
|
53
|
+
next if field.nil?
|
54
|
+
|
55
|
+
field = trackable.database_field_name(field)
|
56
|
+
|
57
|
+
if format.class == Hash && trackable.embeds_many?(field)
|
58
|
+
relation_class = trackable.embeds_many_class(field)
|
59
|
+
formats[field] = format.inject({}) { |a, e| a.merge(relation_class.database_field_name(e.first) => e.last) }
|
60
|
+
elsif format.class == Hash && trackable.embeds_one?(field)
|
61
|
+
relation_class = trackable.embeds_one_class(field)
|
62
|
+
formats[field] = format.inject({}) { |a, e| a.merge(relation_class.database_field_name(e.first) => e.last) }
|
63
|
+
else
|
64
|
+
formats[field] = format
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
options[:format] = formats
|
70
|
+
end
|
71
|
+
|
46
72
|
def parse_tracked_fields_and_relations
|
47
73
|
# case `options[:on]`
|
48
74
|
# when `posts: [:id, :title]`, then it will convert it to `[[:posts, [:id, :title]]]`
|
@@ -64,6 +90,11 @@ module Mongoid
|
|
64
90
|
@options[:on] = options[:on] | trackable.fields.keys.map(&:to_sym) - reserved_fields.map(&:to_sym)
|
65
91
|
end
|
66
92
|
|
93
|
+
if options[:on].include?(:embedded_relations)
|
94
|
+
@options[:on] = options[:on].reject { |opt| opt == :embedded_relations }
|
95
|
+
@options[:on] = options[:on] | trackable.embedded_relations.keys
|
96
|
+
end
|
97
|
+
|
67
98
|
@options[:fields] = []
|
68
99
|
@options[:dynamic] = []
|
69
100
|
@options[:relations] = { embeds_one: {}, embeds_many: {} }
|
@@ -241,7 +241,7 @@ module Mongoid
|
|
241
241
|
end
|
242
242
|
|
243
243
|
def track_destroy
|
244
|
-
track_history_for_action(:destroy)
|
244
|
+
track_history_for_action(:destroy) unless destroyed?
|
245
245
|
end
|
246
246
|
|
247
247
|
def clear_trackable_memoization
|
@@ -387,6 +387,10 @@ module Mongoid
|
|
387
387
|
!embedded_relations.map { |_, v| v.key }.include?(database_field_name(field))
|
388
388
|
end
|
389
389
|
|
390
|
+
def field_format(field)
|
391
|
+
field_formats[database_field_name(field)]
|
392
|
+
end
|
393
|
+
|
390
394
|
# Retrieves the list of tracked fields for a given action.
|
391
395
|
#
|
392
396
|
# @param [ String | Symbol ] action The action name (:create, :update, or :destroy)
|
@@ -413,6 +417,10 @@ module Mongoid
|
|
413
417
|
@reserved_tracked_fields ||= ['_id', history_trackable_options[:version_field].to_s, "#{history_trackable_options[:modifier_field]}_id"]
|
414
418
|
end
|
415
419
|
|
420
|
+
def field_formats
|
421
|
+
@field_formats ||= history_trackable_options[:format]
|
422
|
+
end
|
423
|
+
|
416
424
|
# Whether or not the relation should be tracked.
|
417
425
|
#
|
418
426
|
# @param [ String | Symbol ] relation The name of the relation
|
@@ -485,6 +493,7 @@ module Mongoid
|
|
485
493
|
@tracked_fields = nil
|
486
494
|
@tracked_embeds_one = nil
|
487
495
|
@tracked_embeds_many = nil
|
496
|
+
@obfuscated_fields = nil
|
488
497
|
end
|
489
498
|
end
|
490
499
|
end
|
data/mongoid-history.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.summary = 'Track and audit, undo and redo changes on Mongoid documents.'
|
9
9
|
s.description = 'This library tracks historical changes for any document, including embedded ones. It achieves this by storing all history tracks in a single collection that you define. 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. Mongoid-history 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.'
|
10
10
|
s.email = ['aq1018@gmail.com', 'justin.mgrimes@gmail.com', 'dblock@dblock.org']
|
11
|
-
s.homepage = 'http://github.com/
|
11
|
+
s.homepage = 'http://github.com/mongoid/mongoid-history'
|
12
12
|
s.license = 'MIT'
|
13
13
|
|
14
14
|
s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
@@ -136,6 +136,13 @@ describe Mongoid::History do
|
|
136
136
|
post.destroy
|
137
137
|
expect(post.history_tracks.last.affected['title']).to eq('Test')
|
138
138
|
end
|
139
|
+
|
140
|
+
it 'should no-op on repeated calls to destroy' do
|
141
|
+
post.destroy
|
142
|
+
expect do
|
143
|
+
post.destroy
|
144
|
+
end.not_to change(Tracker, :count)
|
145
|
+
end
|
139
146
|
end
|
140
147
|
|
141
148
|
describe 'on update non-embedded' do
|
@@ -13,6 +13,18 @@ describe Mongoid::History::Attributes::Base do
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
before :all do
|
17
|
+
class ModelTwo
|
18
|
+
include Mongoid::Document
|
19
|
+
field :foo
|
20
|
+
field :goo
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
after :all do
|
25
|
+
Object.send(:remove_const, :ModelTwo)
|
26
|
+
end
|
27
|
+
|
16
28
|
let(:obj_one) { model_one.new }
|
17
29
|
let(:base) { described_class.new(obj_one) }
|
18
30
|
subject { base }
|
@@ -51,4 +63,88 @@ describe Mongoid::History::Attributes::Base do
|
|
51
63
|
subject { base.send(:changes) }
|
52
64
|
it { is_expected.to eq('foo' => ['Foo', 'Foo-new']) }
|
53
65
|
end
|
66
|
+
|
67
|
+
describe '#format_field' do
|
68
|
+
before(:each) do
|
69
|
+
model_one.instance_variable_set(:@history_trackable_options, nil)
|
70
|
+
end
|
71
|
+
|
72
|
+
subject { base.send(:format_field, :bar, 'foo') }
|
73
|
+
|
74
|
+
context 'when formatted via string' do
|
75
|
+
before do
|
76
|
+
model_one.track_history format: { bar: '*%s*' }
|
77
|
+
end
|
78
|
+
|
79
|
+
it { is_expected.to eq '*foo*' }
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when formatted via proc' do
|
83
|
+
before do
|
84
|
+
model_one.track_history format: { bar: ->(v) { v * 2 } }
|
85
|
+
end
|
86
|
+
|
87
|
+
it { is_expected.to eq 'foofoo' }
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'when not formatted' do
|
91
|
+
before do
|
92
|
+
model_one.track_history
|
93
|
+
end
|
94
|
+
|
95
|
+
it { is_expected.to eq 'foo' }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
shared_examples 'formats embedded relation' do |relation_type|
|
100
|
+
let(:model_two) { ModelTwo.new(foo: :bar, goo: :baz) }
|
101
|
+
|
102
|
+
before :each do
|
103
|
+
model_one.instance_variable_set(:@history_trackable_options, nil)
|
104
|
+
model_one.send(relation_type, :model_two)
|
105
|
+
end
|
106
|
+
|
107
|
+
subject { base.send("format_#{relation_type}_relation", :model_two, model_two.attributes) }
|
108
|
+
|
109
|
+
context 'with permitted attributes' do
|
110
|
+
before do
|
111
|
+
model_one.track_history on: { model_two: %i(foo) }
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'should select only permitted attributes' do
|
115
|
+
is_expected.to include('foo' => :bar)
|
116
|
+
is_expected.to_not include('goo')
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'with attributes formatted via string' do
|
121
|
+
before do
|
122
|
+
model_one.track_history on: { model_two: %i(foo) }, format: { model_two: { foo: '&%s&' } }
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should select obfuscate permitted attributes' do
|
126
|
+
is_expected.to include('foo' => '&bar&')
|
127
|
+
is_expected.to_not include('goo')
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'with attributes formatted via proc' do
|
132
|
+
before do
|
133
|
+
model_one.track_history on: { model_two: %i(foo) }, format: { model_two: { foo: ->(v) { v.to_s * 2 } } }
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should select obfuscate permitted attributes' do
|
137
|
+
is_expected.to include('foo' => 'barbar')
|
138
|
+
is_expected.to_not include('goo')
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe '#format_embeds_one_relation' do
|
144
|
+
include_examples 'formats embedded relation', :embeds_one
|
145
|
+
end
|
146
|
+
|
147
|
+
describe '#format_embeds_many_relation' do
|
148
|
+
include_examples 'formats embedded relation', :embeds_many
|
149
|
+
end
|
54
150
|
end
|
data/spec/unit/options_spec.rb
CHANGED
@@ -69,7 +69,8 @@ describe Mongoid::History::Options do
|
|
69
69
|
scope: :model_one,
|
70
70
|
track_create: false,
|
71
71
|
track_update: true,
|
72
|
-
track_destroy: false
|
72
|
+
track_destroy: false,
|
73
|
+
format: nil }
|
73
74
|
end
|
74
75
|
it { expect(service.send(:default_options)).to eq expected_options }
|
75
76
|
end
|
@@ -104,6 +105,26 @@ describe Mongoid::History::Options do
|
|
104
105
|
end
|
105
106
|
end
|
106
107
|
|
108
|
+
describe '#prepare_formatted_fields' do
|
109
|
+
let(:options) { { format: value } }
|
110
|
+
subject { service.parse(options) }
|
111
|
+
|
112
|
+
context 'with non-hash' do
|
113
|
+
let(:value) { :foo }
|
114
|
+
it { expect(subject[:format]).to eq({}) }
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'with a field format' do
|
118
|
+
let(:value) { { foo: '&&&' } }
|
119
|
+
it { expect(subject[:format]).to include 'foo' => '&&&' }
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'with nested format' do
|
123
|
+
let(:value) { { emb_one: { f_em_foo: '***' } } }
|
124
|
+
it { expect(subject[:format]).to include 'emb_one' => { 'f_em_foo' => '***' } }
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
107
128
|
describe '#parse_tracked_fields_and_relations' do
|
108
129
|
context 'when options not passed' do
|
109
130
|
let(:expected_options) do
|
@@ -119,7 +140,8 @@ describe Mongoid::History::Options do
|
|
119
140
|
track_destroy: false,
|
120
141
|
fields: %w(foo b),
|
121
142
|
dynamic: [],
|
122
|
-
relations: { embeds_one: {}, embeds_many: {} }
|
143
|
+
relations: { embeds_one: {}, embeds_many: {} },
|
144
|
+
format: {} }
|
123
145
|
end
|
124
146
|
it { expect(service.parse).to eq expected_options }
|
125
147
|
end
|
@@ -232,6 +254,16 @@ describe Mongoid::History::Options do
|
|
232
254
|
let(:options) { { on: :my_field } }
|
233
255
|
it { expect(subject[:dynamic]).to eq %w(my_field) }
|
234
256
|
end
|
257
|
+
|
258
|
+
context 'with relations' do
|
259
|
+
let(:options) { { on: :embedded_relations } }
|
260
|
+
it do
|
261
|
+
expect(subject[:relations]).to eq(embeds_many: { 'emb_threes' => %w(_id f_em_foo fmb),
|
262
|
+
'emfs' => %w(_id f_em_baz) },
|
263
|
+
embeds_one: { 'emb_one' => %w(_id f_em_foo fmb),
|
264
|
+
'emtw' => %w(_id f_em_baz) })
|
265
|
+
end
|
266
|
+
end
|
235
267
|
end
|
236
268
|
end
|
237
269
|
|
data/spec/unit/trackable_spec.rb
CHANGED
@@ -46,7 +46,8 @@ describe Mongoid::History::Trackable do
|
|
46
46
|
track_destroy: false,
|
47
47
|
fields: %w(foo),
|
48
48
|
relations: { embeds_one: {}, embeds_many: {} },
|
49
|
-
dynamic: []
|
49
|
+
dynamic: [],
|
50
|
+
format: {} }
|
50
51
|
end
|
51
52
|
let(:regular_fields) { ['foo'] }
|
52
53
|
let(:reserved_fields) { %w(_id version modifier_id) }
|
@@ -151,6 +152,38 @@ describe Mongoid::History::Trackable do
|
|
151
152
|
end
|
152
153
|
end
|
153
154
|
|
155
|
+
describe '#field_format' do
|
156
|
+
before :all do
|
157
|
+
ModelOne = Class.new do
|
158
|
+
include Mongoid::Document
|
159
|
+
include Mongoid::History::Trackable
|
160
|
+
field :foo
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
let(:format) { '***' }
|
165
|
+
|
166
|
+
before do
|
167
|
+
ModelOne.track_history format: { foo: format }
|
168
|
+
end
|
169
|
+
|
170
|
+
context 'when field is formatted' do
|
171
|
+
it 'should return the format' do
|
172
|
+
expect(ModelOne.field_format(:foo)).to be format
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
context 'when field is not formatted' do
|
177
|
+
it 'should return nil' do
|
178
|
+
expect(ModelOne.field_format(:bar)).to be_nil
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
after :all do
|
183
|
+
Object.send(:remove_const, :ModelOne)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
154
187
|
context 'sub-model' do
|
155
188
|
before :each do
|
156
189
|
class MySubModel < MyModel
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid-history
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Qian
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-01-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: easy_diff
|
@@ -132,7 +132,7 @@ files:
|
|
132
132
|
- spec/unit/store/request_store_spec.rb
|
133
133
|
- spec/unit/trackable_spec.rb
|
134
134
|
- spec/unit/tracker_spec.rb
|
135
|
-
homepage: http://github.com/
|
135
|
+
homepage: http://github.com/mongoid/mongoid-history
|
136
136
|
licenses:
|
137
137
|
- MIT
|
138
138
|
metadata: {}
|