mongoid-history 0.4.4 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -71
- data/.rubocop_todo.yml +61 -0
- data/.travis.yml +3 -1
- data/CHANGELOG.md +8 -0
- data/README.md +24 -0
- data/Rakefile +3 -3
- data/lib/mongoid/history.rb +12 -1
- data/lib/mongoid/history/mongoid.rb +1 -1
- data/lib/mongoid/history/trackable.rb +24 -10
- data/lib/mongoid/history/tracker.rb +8 -8
- data/lib/mongoid/history/version.rb +1 -1
- data/mongoid-history.gemspec +2 -2
- data/spec/integration/embedded_in_polymorphic_spec.rb +4 -4
- data/spec/integration/integration_spec.rb +391 -389
- data/spec/integration/multi_relation_spec.rb +11 -11
- data/spec/integration/nested_embedded_documents_spec.rb +7 -7
- data/spec/integration/nested_embedded_polymorphic_documents_spec.rb +127 -0
- data/spec/integration/subclasses_spec.rb +4 -4
- data/spec/spec_helper.rb +2 -1
- data/spec/support/mongoid_history.rb +2 -2
- data/spec/unit/trackable_spec.rb +84 -84
- data/spec/unit/tracker_spec.rb +2 -2
- metadata +36 -34
- data/lib/mongoid-history.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fa9bab26aeaf58f5e6f047b910f5d7e09c68e6d
|
4
|
+
data.tar.gz: 9da6ba97971fe87d296fd995ec73cf6562e3d49e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56c010855bf25272c2cc7af7589077a2903afb2d3f3e899e3d6a3dfd7c795cce513e79e9aae0ebc857d09a42c2f13261aa55b250b88f5331f7ad593ffa1765ed
|
7
|
+
data.tar.gz: 6b8eedd5c6138854a8b8e0c9de1c0fc8a846efc90e03cd6ea3a934ed91c8437cb9a4fbf029a4e60acf9ddd2b2bf9ae4866748e0c7dc3149a24ba569a79b71a81
|
data/.rubocop.yml
CHANGED
@@ -3,74 +3,4 @@ AllCops:
|
|
3
3
|
- vendor/**/*
|
4
4
|
- bin/**/*
|
5
5
|
|
6
|
-
|
7
|
-
Enabled: false
|
8
|
-
|
9
|
-
MethodLength:
|
10
|
-
Enabled: false
|
11
|
-
|
12
|
-
ClassLength:
|
13
|
-
Enabled: false
|
14
|
-
|
15
|
-
Documentation:
|
16
|
-
# don't require classes to be documented
|
17
|
-
Enabled: false
|
18
|
-
|
19
|
-
CollectionMethods:
|
20
|
-
# don't prefer map to collect, recuce to inject
|
21
|
-
Enabled: false
|
22
|
-
|
23
|
-
Encoding:
|
24
|
-
# no need to always specify encoding
|
25
|
-
Enabled: false
|
26
|
-
|
27
|
-
StringLiterals:
|
28
|
-
# use single or double-quoted strings, as you please
|
29
|
-
Enabled: false
|
30
|
-
|
31
|
-
Void:
|
32
|
-
# == operator used in void context in specs
|
33
|
-
Enabled: false
|
34
|
-
|
35
|
-
SignalException:
|
36
|
-
# prefer raise to fail
|
37
|
-
EnforcedStyle: only_raise
|
38
|
-
|
39
|
-
RaiseArgs:
|
40
|
-
# don't care for what kind of raise
|
41
|
-
Enabled: false
|
42
|
-
|
43
|
-
PerlBackrefs:
|
44
|
-
# TODO: regular expression matching with $1, $2, etc.
|
45
|
-
Enabled: false
|
46
|
-
|
47
|
-
BlockNesting:
|
48
|
-
# TODO: fix too much nesting
|
49
|
-
Max: 4
|
50
|
-
|
51
|
-
Lambda:
|
52
|
-
# TODO: replace all lambda with -> or Proc
|
53
|
-
Enabled: false
|
54
|
-
|
55
|
-
Blocks:
|
56
|
-
# allow multi-line blocks like expect { }
|
57
|
-
Enabled: false
|
58
|
-
|
59
|
-
WordArray:
|
60
|
-
# %w vs. [ '', ... ]
|
61
|
-
Enabled: false
|
62
|
-
|
63
|
-
CyclomaticComplexity:
|
64
|
-
Enabled: false
|
65
|
-
|
66
|
-
HandleExceptions:
|
67
|
-
Enabled: false
|
68
|
-
|
69
|
-
MultilineBlockChain:
|
70
|
-
Enabled: false
|
71
|
-
|
72
|
-
FileName:
|
73
|
-
Enabled: false
|
74
|
-
|
75
|
-
RegexpLiteral:
|
76
|
-
Enabled: false
|
6
|
+
inherit_from: .rubocop_todo.yml
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2014-12-09 07:20:55 -0500 using RuboCop version 0.27.1.
|
3
|
+
# The point is for the user to remove these configuration records
|
4
|
+
# one by one as the offenses are removed from the code base.
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
7
|
+
|
8
|
+
# Offense count: 3
|
9
|
+
Lint/HandleExceptions:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
# Offense count: 27
|
13
|
+
Lint/Void:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
# Offense count: 12
|
17
|
+
Metrics/AbcSize:
|
18
|
+
Max: 51
|
19
|
+
|
20
|
+
# Offense count: 4
|
21
|
+
Metrics/CyclomaticComplexity:
|
22
|
+
Max: 10
|
23
|
+
|
24
|
+
# Offense count: 181
|
25
|
+
# Configuration parameters: AllowURI, URISchemes.
|
26
|
+
Metrics/LineLength:
|
27
|
+
Max: 688
|
28
|
+
|
29
|
+
# Offense count: 7
|
30
|
+
# Configuration parameters: CountComments.
|
31
|
+
Metrics/MethodLength:
|
32
|
+
Max: 32
|
33
|
+
|
34
|
+
# Offense count: 4
|
35
|
+
Metrics/PerceivedComplexity:
|
36
|
+
Max: 12
|
37
|
+
|
38
|
+
# Offense count: 37
|
39
|
+
Style/Documentation:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
# Offense count: 6
|
43
|
+
Style/EachWithObject:
|
44
|
+
Enabled: false
|
45
|
+
|
46
|
+
# Offense count: 1
|
47
|
+
# Configuration parameters: Exclude.
|
48
|
+
Style/FileName:
|
49
|
+
Enabled: false
|
50
|
+
|
51
|
+
# Offense count: 1
|
52
|
+
Style/Lambda:
|
53
|
+
Enabled: false
|
54
|
+
|
55
|
+
# Offense count: 3
|
56
|
+
Style/MultilineBlockChain:
|
57
|
+
Enabled: false
|
58
|
+
|
59
|
+
# Offense count: 2
|
60
|
+
Style/RegexpLiteral:
|
61
|
+
MaxSlashes: 0
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
0.4.5 (2/9/2015)
|
2
|
+
----------------
|
3
|
+
|
4
|
+
* [#131](https://github.com/aq1018/mongoid-history/pull/131) - Add `undo` method, that helps to get specific version of an object without saving changes - [@alexkravets](https://github.com/alexkravets).
|
5
|
+
* [#127](https://github.com/aq1018/mongoid-history/pull/127) - Fix gem naming per [rubygems](http://guides.rubygems.org/name-your-gem/) specs, now you can `require 'mongoid/history'` - [@nofxx](https://github.com/nofxx).
|
6
|
+
* [#129](https://github.com/aq1018/mongoid-history/pull/129) - Support multiple levels of embedded polimorphic documents - [@BrunoChauvet](https://github.com/BrunoChauvet).
|
7
|
+
* [#123](https://github.com/aq1018/mongoid-history/pull/123): Use a method compatible with mongoid-observers to determinine the version of Mongoid - [@zeitnot](https://github.com/zeitnot).
|
8
|
+
|
1
9
|
0.4.4 (7/29/2014)
|
2
10
|
-----------------
|
3
11
|
|
data/README.md
CHANGED
@@ -121,6 +121,9 @@ track.undo! user # comment title should be "Test"
|
|
121
121
|
|
122
122
|
track.redo! user # comment title should be "Test 2"
|
123
123
|
|
124
|
+
# undo comment to version 1 without save
|
125
|
+
comment.undo nil, from: 1, to: comment.version
|
126
|
+
|
124
127
|
# undo last change
|
125
128
|
comment.undo! user
|
126
129
|
|
@@ -238,6 +241,27 @@ instructions above then run the following command:
|
|
238
241
|
MyHistoryTracker.all.each{|ht| ht.rename(:modifier_id, :created_by)
|
239
242
|
```
|
240
243
|
|
244
|
+
**Setting Modifier Class Name**
|
245
|
+
|
246
|
+
If your app will track history changes to a user, Mongoid History looks for these modifiers in the ``User`` class by default. If you have named your 'user' accounts differently, you will need to add that to your Mongoid History config:
|
247
|
+
|
248
|
+
The following examples set the modifier class name using a Rails initializer:
|
249
|
+
|
250
|
+
If your app uses a class ``Author``:
|
251
|
+
|
252
|
+
```ruby
|
253
|
+
# config/initializers/mongoid-history.rb
|
254
|
+
# initializer for mongoid-history
|
255
|
+
|
256
|
+
Mongoid::History.modifier_class_name = 'Author'
|
257
|
+
```
|
258
|
+
|
259
|
+
Or perhaps you are namespacing to a module:
|
260
|
+
|
261
|
+
```ruby
|
262
|
+
Mongoid::History.modifier_class_name = 'CMS::Author'
|
263
|
+
```
|
264
|
+
|
241
265
|
**Using an alternate changes method**
|
242
266
|
|
243
267
|
Sometimes you may wish to provide an alternate method for determining which changes should be tracked. For example, if you are using embedded documents
|
data/Rakefile
CHANGED
@@ -3,7 +3,7 @@ begin
|
|
3
3
|
Bundler.setup(:default, :development)
|
4
4
|
rescue Bundler::BundlerError => e
|
5
5
|
$stderr.puts e.message
|
6
|
-
$stderr.puts
|
6
|
+
$stderr.puts 'Run `bundle install` to install missing gems'
|
7
7
|
exit e.status_code
|
8
8
|
end
|
9
9
|
|
@@ -13,11 +13,11 @@ require 'rspec/core'
|
|
13
13
|
require 'rspec/core/rake_task'
|
14
14
|
RSpec::Core::RakeTask.new(:spec) do |spec|
|
15
15
|
spec.pattern = FileList['spec/**/*_spec.rb']
|
16
|
-
spec.rspec_opts =
|
16
|
+
spec.rspec_opts = '--color --format progress'
|
17
17
|
end
|
18
18
|
|
19
19
|
require 'rubocop/rake_task'
|
20
|
-
|
20
|
+
RuboCop::RakeTask.new(:rubocop)
|
21
21
|
|
22
22
|
task default: [:rubocop, :spec]
|
23
23
|
|
data/lib/mongoid/history.rb
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
require 'easy_diff'
|
2
|
+
|
3
|
+
require 'mongoid/history/version'
|
4
|
+
require 'mongoid/history/mongoid'
|
5
|
+
require 'mongoid/history/tracker'
|
6
|
+
require 'mongoid/history/trackable'
|
7
|
+
|
1
8
|
module Mongoid
|
2
9
|
module History
|
3
|
-
GLOBAL_TRACK_HISTORY_FLAG =
|
10
|
+
GLOBAL_TRACK_HISTORY_FLAG = 'mongoid_history_trackable_enabled'
|
4
11
|
|
5
12
|
mattr_accessor :tracker_class_name
|
6
13
|
mattr_accessor :trackable_class_options
|
@@ -23,3 +30,7 @@ module Mongoid
|
|
23
30
|
end
|
24
31
|
end
|
25
32
|
end
|
33
|
+
|
34
|
+
Mongoid::History.modifier_class_name = 'User'
|
35
|
+
Mongoid::History.trackable_class_options = {}
|
36
|
+
Mongoid::History.current_user_method ||= :current_user
|
@@ -74,7 +74,7 @@ module Mongoid
|
|
74
74
|
# undo :from => 1, :to => 5
|
75
75
|
# undo 4
|
76
76
|
# undo :last => 10
|
77
|
-
def undo
|
77
|
+
def undo(modifier = nil, options_or_version = nil)
|
78
78
|
versions = get_versions_criteria(options_or_version).to_a
|
79
79
|
versions.sort! { |v1, v2| v2.version <=> v1.version }
|
80
80
|
|
@@ -82,13 +82,20 @@ module Mongoid
|
|
82
82
|
undo_attr = v.undo_attr(modifier)
|
83
83
|
if Mongoid::History.mongoid3? # update_attributes! not bypassing rails 3 protected attributes
|
84
84
|
assign_attributes(undo_attr, without_protection: true)
|
85
|
-
save!
|
86
85
|
else # assign_attributes with 'without_protection' option does not work with rails 4/mongoid 4
|
87
|
-
|
86
|
+
self.attributes = undo_attr
|
88
87
|
end
|
89
88
|
end
|
90
89
|
end
|
91
90
|
|
91
|
+
# undo! :from => 1, :to => 5
|
92
|
+
# undo! 4
|
93
|
+
# undo! :last => 10
|
94
|
+
def undo!(modifier = nil, options_or_version = nil)
|
95
|
+
undo(modifier, options_or_version)
|
96
|
+
save!
|
97
|
+
end
|
98
|
+
|
92
99
|
def redo!(modifier = nil, options_or_version = nil)
|
93
100
|
versions = get_versions_criteria(options_or_version).to_a
|
94
101
|
versions.sort! { |v1, v2| v1.version <=> v2.version }
|
@@ -120,11 +127,11 @@ module Mongoid
|
|
120
127
|
if options[:from] && options[:to]
|
121
128
|
lower = options[:from] >= options[:to] ? options[:to] : options[:from]
|
122
129
|
upper = options[:from] < options[:to] ? options[:to] : options[:from]
|
123
|
-
versions = history_tracks.where(:version.in => (lower
|
130
|
+
versions = history_tracks.where(:version.in => (lower..upper).to_a)
|
124
131
|
elsif options[:last]
|
125
132
|
versions = history_tracks.limit(options[:last])
|
126
133
|
else
|
127
|
-
|
134
|
+
fail 'Invalid options, please specify (:from / :to) keys or :last key.'
|
128
135
|
end
|
129
136
|
else
|
130
137
|
options_or_version = options_or_version.to_a if options_or_version.is_a?(Range)
|
@@ -138,13 +145,20 @@ module Mongoid
|
|
138
145
|
|
139
146
|
def related_scope
|
140
147
|
scope = history_trackable_options[:scope]
|
141
|
-
scope = _parent.collection_name.to_s.singularize.to_sym if scope.is_a?(Array)
|
142
148
|
|
143
|
-
if
|
144
|
-
|
149
|
+
# Use top level document if its name is specified in the scope
|
150
|
+
root_document_name = traverse_association_chain.first['name'].singularize.underscore.gsub('/', '_').to_sym
|
151
|
+
if scope.is_a?(Array) && scope.include?(root_document_name)
|
152
|
+
scope = root_document_name
|
145
153
|
else
|
146
|
-
scope =
|
154
|
+
scope = _parent.collection_name.to_s.singularize.to_sym if scope.is_a?(Array)
|
155
|
+
if Mongoid::History.mongoid3?
|
156
|
+
scope = metadata.inverse_class_name.tableize.singularize.to_sym if metadata.present? && scope == metadata.as
|
157
|
+
else
|
158
|
+
scope = relation_metadata.inverse_class_name.tableize.singularize.to_sym if relation_metadata.present? && scope == relation_metadata.as
|
159
|
+
end
|
147
160
|
end
|
161
|
+
|
148
162
|
scope
|
149
163
|
end
|
150
164
|
|
@@ -308,7 +322,7 @@ module Mongoid
|
|
308
322
|
#
|
309
323
|
# @return [ Array < String > ] the list of reserved database field names
|
310
324
|
def reserved_tracked_fields
|
311
|
-
@reserved_tracked_fields ||= [
|
325
|
+
@reserved_tracked_fields ||= ['_id', history_trackable_options[:version_field].to_s, "#{history_trackable_options[:modifier_field]}_id"]
|
312
326
|
end
|
313
327
|
|
314
328
|
def history_trackable_options
|
@@ -140,10 +140,10 @@ module Mongoid
|
|
140
140
|
# { field_1: value, field_2: value }
|
141
141
|
def affected
|
142
142
|
target = action.to_sym == :destroy ? :from : :to
|
143
|
-
@affected ||= tracked_changes.inject(HashWithIndifferentAccess.new)
|
143
|
+
@affected ||= tracked_changes.inject(HashWithIndifferentAccess.new) do |h, (k, v)|
|
144
144
|
h[k] = v[target]
|
145
145
|
h
|
146
|
-
|
146
|
+
end
|
147
147
|
end
|
148
148
|
|
149
149
|
# Returns the class of the trackable, irrespective of whether the trackable object
|
@@ -151,7 +151,7 @@ module Mongoid
|
|
151
151
|
#
|
152
152
|
# @return [ Class ] the class of the trackable
|
153
153
|
def trackable_parent_class
|
154
|
-
association_chain.first[
|
154
|
+
association_chain.first['name'].constantize
|
155
155
|
end
|
156
156
|
|
157
157
|
private
|
@@ -166,18 +166,18 @@ module Mongoid
|
|
166
166
|
|
167
167
|
def create_standalone
|
168
168
|
restored = trackable_parent_class.new(localize_keys(original))
|
169
|
-
restored.id = original[
|
169
|
+
restored.id = original['_id']
|
170
170
|
restored.save!
|
171
171
|
end
|
172
172
|
|
173
173
|
def create_on_parent
|
174
|
-
name = association_chain.last[
|
174
|
+
name = association_chain.last['name']
|
175
175
|
if trackable_parent.class.embeds_one?(name)
|
176
176
|
trackable_parent.create_embedded(name, localize_keys(original))
|
177
177
|
elsif trackable_parent.class.embeds_many?(name)
|
178
178
|
trackable_parent.get_embedded(name).create!(localize_keys(original))
|
179
179
|
else
|
180
|
-
|
180
|
+
fail 'This should never happen. Please report bug!'
|
181
181
|
end
|
182
182
|
end
|
183
183
|
|
@@ -202,7 +202,7 @@ module Mongoid
|
|
202
202
|
elsif doc.class.embeds_many?(name)
|
203
203
|
doc.get_embedded(name).unscoped.where(_id: node['id']).first
|
204
204
|
else
|
205
|
-
|
205
|
+
fail 'This should never happen. Please report bug.'
|
206
206
|
end
|
207
207
|
documents << doc
|
208
208
|
break if chain.empty?
|
@@ -211,7 +211,7 @@ module Mongoid
|
|
211
211
|
end
|
212
212
|
|
213
213
|
def localize_keys(hash)
|
214
|
-
klass = association_chain.first[
|
214
|
+
klass = association_chain.first['name'].constantize
|
215
215
|
klass.localized_fields.keys.each do |name|
|
216
216
|
hash["#{name}_translations"] = hash.delete(name) if hash[name].present?
|
217
217
|
end if klass.respond_to?(:localized_fields)
|
data/mongoid-history.gemspec
CHANGED
@@ -23,9 +23,9 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_runtime_dependency 'activesupport'
|
24
24
|
|
25
25
|
s.add_development_dependency 'rake'
|
26
|
-
s.add_development_dependency 'rspec', '
|
26
|
+
s.add_development_dependency 'rspec', '~> 3.1'
|
27
27
|
s.add_development_dependency 'bundler'
|
28
|
-
s.add_development_dependency 'rubocop', '0.
|
28
|
+
s.add_development_dependency 'rubocop', '0.27.1'
|
29
29
|
s.add_development_dependency 'yard'
|
30
30
|
s.add_development_dependency 'gem-release'
|
31
31
|
s.add_development_dependency 'coveralls'
|
@@ -78,13 +78,13 @@ describe Mongoid::History::Tracker do
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
it
|
81
|
+
it 'tracks history for nested embedded documents with polymorphic relations' do
|
82
82
|
user = User.new
|
83
83
|
user.save!
|
84
84
|
|
85
85
|
real_state = user.real_states.build(name: 'rs_name')
|
86
86
|
real_state.save!
|
87
|
-
real_state.build_address(address:
|
87
|
+
real_state.build_address(address: 'Main Street #123', city: 'Highland Park', state: 'IL').save!
|
88
88
|
expect(real_state.history_tracks.count).to eq(2)
|
89
89
|
expect(real_state.address.history_tracks.count).to eq(1)
|
90
90
|
|
@@ -102,7 +102,7 @@ describe Mongoid::History::Tracker do
|
|
102
102
|
|
103
103
|
company = user.companies.build(name: 'co_name')
|
104
104
|
company.save!
|
105
|
-
company.build_address(address:
|
105
|
+
company.build_address(address: 'Main Street #456', city: 'Evanston', state: 'IL').save!
|
106
106
|
expect(company.history_tracks.count).to eq(2)
|
107
107
|
expect(company.address.history_tracks.count).to eq(1)
|
108
108
|
|
@@ -112,7 +112,7 @@ describe Mongoid::History::Tracker do
|
|
112
112
|
expect(company.address.history_tracks.count).to eq(2)
|
113
113
|
expect(company.history_tracks.last.action).to eq('update')
|
114
114
|
|
115
|
-
company.build_second_address(address:
|
115
|
+
company.build_second_address(address: 'Main Street #789', city: 'Highland Park', state: 'IL').save!
|
116
116
|
expect(company.history_tracks.count).to eq(4)
|
117
117
|
expect(company.second_address.history_tracks.count).to eq(1)
|
118
118
|
expect(company.history_tracks.last.action).to eq('create')
|