mongoid-audit_log 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 910aee76df538dfa623d329bb7c3434b34db263c
4
- data.tar.gz: 5c8c388d1002e83786d7ba71b7fe2aa0c4ea5a9a
3
+ metadata.gz: 7c64fb48b393df395b00f96fd8f804df26a8c361
4
+ data.tar.gz: 63e4405ba7cd83a09bb306fd569ec1beec6d6e10
5
5
  SHA512:
6
- metadata.gz: 9eafe09cfc8b25a50bb36ab05593dbb34bdf6c52abbe996d885c9d83595c3db61f0a04f4fcc2f6d83f7be2b08712dbd9288d0c19a7704adf82bc83090131c78b
7
- data.tar.gz: 66413e69767f96505f46ce6ec3d9248b3a9b4c75fda2b0e58060c086d79879b9424faec4f6669d791ed60e5b93887e59daf98d1aad89c53473468d55031e3b63
6
+ metadata.gz: 8a3d0d35183456d3d385340d9343be542293dd280f4c7e8e7fea8c3e0b738df4799144a7bb032edc7afd78b01dd1a2528a2df4b2bde6f9594b24d379b1a57f62
7
+ data.tar.gz: ba9e4830088d3e14add3950bd29ea7f4f182136752db49235599aa76862d69ec5b7d075529e63b4e499ccbeebffc5a20b9ea92f642b253d35375bb054649b17a
@@ -61,9 +61,17 @@ module Mongoid
61
61
  :audited_type => self.class,
62
62
  :audited_id => id,
63
63
  :tracked_changes => @_audit_log_changes.all,
64
- :model_attributes => attributes.dup
64
+ :model_attributes => attributes.dup,
65
+ :document_path => traverse_association_chain
65
66
  )
66
67
  end
67
68
  end
69
+
70
+ def traverse_association_chain(node = self, current_relation = nil)
71
+ relation = node.embedded? ? node.metadata_name.to_s : nil
72
+ list = node._parent ? traverse_association_chain(node._parent, relation) : []
73
+ list << { class_name: node.class.name, id: node.id, relation: current_relation }
74
+ list
75
+ end
68
76
  end
69
77
  end
@@ -8,6 +8,7 @@ module Mongoid
8
8
  field :tracked_changes, :type => Hash, :default => {}
9
9
  field :modifier_id, :type => String
10
10
  field :model_attributes, :type => Hash
11
+ field :document_path, :type => Array
11
12
 
12
13
  belongs_to :audited, :polymorphic => true
13
14
 
@@ -50,6 +51,29 @@ module Mongoid
50
51
  @modifier = modifier
51
52
  end
52
53
 
54
+ def for_embedded_doc?
55
+ document_path.try(:length).to_i > 1
56
+ end
57
+
58
+ def audited
59
+ if for_embedded_doc?
60
+ lookup_from_document_path
61
+ else
62
+ audited_type.constantize.where(id: audited_id).first
63
+ end
64
+ end
65
+
66
+ def root
67
+ root = document_path.first
68
+ return audited if root.blank?
69
+
70
+ if for_embedded_doc?
71
+ root['class_name'].constantize.find(root['id'])
72
+ else
73
+ audited
74
+ end
75
+ end
76
+
53
77
  def respond_to?(sym, *args)
54
78
  key = sym.to_s
55
79
  (model_attributes.present? && model_attributes.has_key?(key)) || super
@@ -64,6 +88,32 @@ module Mongoid
64
88
  super
65
89
  end
66
90
  end
91
+
92
+ private
93
+
94
+ def lookup_from_document_path
95
+ return nil if document_path.blank?
96
+
97
+ document_path.reduce(root) do |current, path|
98
+ relation_match = if document_path_matches?(path, current)
99
+ current
100
+ elsif current.respond_to?(:detect)
101
+ current.detect do |model|
102
+ document_path_matches?(path, model)
103
+ end
104
+ end
105
+
106
+ if path['relation'].blank?
107
+ return relation_match
108
+ else
109
+ relation_match.send(path['relation'])
110
+ end
111
+ end
112
+ end
113
+
114
+ def document_path_matches?(path, object)
115
+ object.class.name == path['class_name'] && object.id == path['id']
116
+ end
67
117
  end
68
118
  end
69
119
  end
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module AuditLog
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["bencrouse@gmail.com"]
11
11
  spec.description = %q{Stupid simple audit logging for Mongoid}
12
12
  spec.summary = %q{No fancy versioning, undo, redo, etc. Just saves changes to Mongoid models in a separate collection.}
13
- spec.homepage = "https://github.com/bencrouse/mongoid-audit-log"
13
+ spec.homepage = "https://github.com/bencrouse/mongoid-audit_log"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -10,12 +10,30 @@ module Mongoid
10
10
  class ::Product
11
11
  include Mongoid::Document
12
12
  include Mongoid::AuditLog
13
+ field :name, :type => String
14
+ embeds_many :variants
15
+ end
16
+
17
+ class ::Variant
18
+ include Mongoid::Document
19
+ include Mongoid::AuditLog
20
+ field :sku, :type => String
21
+ embedded_in :product
22
+ embeds_many :options
23
+ end
24
+
25
+ class ::Option
26
+ include Mongoid::Document
27
+ include Mongoid::AuditLog
28
+ field :name, :type => String
29
+ embedded_in :variant
13
30
  end
14
31
  end
15
32
 
16
33
  after(:all) do
17
34
  AuditLog.modifier_class_name = @remember_modifier_class_name
18
35
  Object.send(:remove_const, :Product)
36
+ Object.send(:remove_const, :Variant)
19
37
  end
20
38
 
21
39
  let(:user) { User.create! }
@@ -57,6 +75,17 @@ module Mongoid
57
75
  end
58
76
  end
59
77
 
78
+ describe '#audited' do
79
+ it 'uses the document path to find embedded documents' do
80
+ product = Product.create!(:name => 'Foo bar')
81
+ variant = product.variants.create!
82
+ option = AuditLog.record { variant.options.create! }
83
+
84
+ entry = Entry.desc(:created_at).first
85
+ entry.audited.should == option
86
+ end
87
+ end
88
+
60
89
  describe '#modifier_id=' do
61
90
  let(:entry) { Entry.new }
62
91
 
@@ -12,6 +12,7 @@ module Mongoid
12
12
 
13
13
  class ::Variant
14
14
  include Mongoid::Document
15
+ include Mongoid::AuditLog
15
16
  field :sku, :type => String
16
17
  embedded_in :product
17
18
  end
@@ -124,6 +125,7 @@ module Mongoid
124
125
  entry = product.audit_log_entries.first
125
126
 
126
127
  entry.create?.should be_true
128
+ entry.root.should == product
127
129
 
128
130
  entry.tracked_changes.should == {
129
131
  'name' => [nil, 'Foo bar']
@@ -141,13 +143,14 @@ module Mongoid
141
143
  product.save!
142
144
 
143
145
  entry = product.audit_log_entries.first
146
+ entry.root.should == product
144
147
 
145
148
  entry.create?.should be_true
146
149
 
147
150
  entry.model_attributes.should == {
148
151
  '_id' => product.id,
149
152
  'name' => 'Foo bar',
150
- 'variants' => [{ '_id' => product.variants.first.id, 'sku'=>'sku' }]
153
+ 'variants' => [{ '_id' => product.variants.first.id, 'sku' => 'sku' }]
151
154
  }
152
155
 
153
156
  entry.tracked_changes.should == {
@@ -155,6 +158,21 @@ module Mongoid
155
158
  'variants' => [{ 'sku' => [nil, 'sku'] }]
156
159
  }
157
160
  end
161
+
162
+ it 'tracks parents on embedded creations' do
163
+ product = Product.create!(:name => 'Foo bar')
164
+ variant = product.variants.create!(sku: 'sku')
165
+
166
+ entry = Mongoid::AuditLog::Entry.desc(:created_at).first
167
+ entry.root.should == product
168
+ entry.document_path.length.should == 2
169
+ entry.document_path.first['class_name'].should == product.class.name
170
+ entry.document_path.first['id'].should == product.id
171
+ entry.document_path.first['relation'].should == 'variants'
172
+ entry.document_path.second['class_name'].should == variant.class.name
173
+ entry.document_path.second['id'].should == variant.id
174
+ entry.document_path.second['relation'].should == nil
175
+ end
158
176
  end
159
177
 
160
178
  context 'update' do
@@ -164,6 +182,7 @@ module Mongoid
164
182
  entry = product.audit_log_entries.desc(:created_at).first
165
183
 
166
184
  entry.update?.should be_true
185
+ entry.root.should == product
167
186
  entry.tracked_changes.should == { 'name' => ['Foo bar', 'Bar baz'] }
168
187
  end
169
188
 
@@ -179,6 +198,7 @@ module Mongoid
179
198
  entry = product.audit_log_entries.desc(:created_at).first
180
199
 
181
200
  entry.update?.should be_true
201
+ entry.root.should == product
182
202
  entry.tracked_changes.should == {
183
203
  'name' => ['Foo bar', 'Bar baz'],
184
204
  'variants' => [{ 'sku' => ['sku', 'newsku'] }]
@@ -190,6 +210,23 @@ module Mongoid
190
210
  product.update_attributes(:name => 'Foo bar')
191
211
  product.audit_log_entries.length.should == 1
192
212
  end
213
+
214
+ it 'tracks parents on embedded updates' do
215
+ product = Product.create!(:name => 'Foo bar')
216
+ variant = product.variants.create!(sku: 'sku')
217
+ variant.sku = 'newsku'
218
+ variant.save!
219
+
220
+ entry = Mongoid::AuditLog::Entry.desc(:created_at).first
221
+ entry.root.should == product
222
+ entry.document_path.length.should == 2
223
+ entry.document_path.first['class_name'].should == product.class.name
224
+ entry.document_path.first['id'].should == product.id
225
+ entry.document_path.first['relation'].should == 'variants'
226
+ entry.document_path.second['class_name'].should == variant.class.name
227
+ entry.document_path.second['id'].should == variant.id
228
+ entry.document_path.second['relation'].should == nil
229
+ end
193
230
  end
194
231
 
195
232
  context 'destroy' do
@@ -199,6 +236,23 @@ module Mongoid
199
236
  entry = product.audit_log_entries.desc(:created_at).first
200
237
 
201
238
  entry.destroy?.should be_true
239
+ entry.root.should == nil
240
+ end
241
+
242
+ it 'tracks parents on embedded destroys' do
243
+ product = Product.create!(:name => 'Foo bar')
244
+ variant = product.variants.create!(sku: 'sku')
245
+ variant.destroy!
246
+
247
+ entry = Mongoid::AuditLog::Entry.desc(:created_at).first
248
+ entry.root.should == product
249
+ entry.document_path.length.should == 2
250
+ entry.document_path.first['class_name'].should == product.class.name
251
+ entry.document_path.first['id'].should == product.id
252
+ entry.document_path.first['relation'].should == 'variants'
253
+ entry.document_path.second['class_name'].should == variant.class.name
254
+ entry.document_path.second['id'].should == variant.id
255
+ entry.document_path.second['relation'].should == nil
202
256
  end
203
257
  end
204
258
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-audit_log
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Crouse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-08 00:00:00.000000000 Z
11
+ date: 2016-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -77,7 +77,7 @@ files:
77
77
  - spec/mongoid/audit_log_spec.rb
78
78
  - spec/spec_helper.rb
79
79
  - spec/support/models.rb
80
- homepage: https://github.com/bencrouse/mongoid-audit-log
80
+ homepage: https://github.com/bencrouse/mongoid-audit_log
81
81
  licenses:
82
82
  - MIT
83
83
  metadata: {}
@@ -97,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
97
  version: 1.3.6
98
98
  requirements: []
99
99
  rubyforge_project:
100
- rubygems_version: 2.4.5
100
+ rubygems_version: 2.5.1
101
101
  signing_key:
102
102
  specification_version: 4
103
103
  summary: No fancy versioning, undo, redo, etc. Just saves changes to Mongoid models
@@ -108,3 +108,4 @@ test_files:
108
108
  - spec/mongoid/audit_log_spec.rb
109
109
  - spec/spec_helper.rb
110
110
  - spec/support/models.rb
111
+ has_rdoc: