effective_logging 2.0.8 → 2.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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a608aab5a3d18fc5904353993d99f79d5661512
|
4
|
+
data.tar.gz: f92d295365c081c2fc2656644d9826033dc7208d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41199b4ae698d4b6204979a76116bafacf9c9d2b25c741631938c174fc18ab090e22d987417dcfcecb3e27ee21ada1cdf40254aca0ebe3921accda85f79daf8b
|
7
|
+
data.tar.gz: 2eb2d0f92b144e7517bd752d927d4f4513f0becf7fa7ba8b34bf0c583d1945002f24c8cee43c20ecde45c0ae06a18405039a4951d9d15b3ac49e2539671d2a22
|
@@ -9,7 +9,7 @@ module ActsAsLoggable
|
|
9
9
|
raise ArgumentError.new('invalid arguments passed to (effective_logging) log_changes. Example usage: log_changes except: [:created_at]')
|
10
10
|
end
|
11
11
|
|
12
|
-
if (unknown = (@acts_as_loggable_options.keys - [:only, :except, :additionally, :include_associated])).present?
|
12
|
+
if (unknown = (@acts_as_loggable_options.keys - [:only, :except, :additionally, :include_associated, :include_nested])).present?
|
13
13
|
raise ArgumentError.new("unknown keyword: #{unknown.join(', ')}")
|
14
14
|
end
|
15
15
|
|
@@ -20,39 +20,12 @@ module ActsAsLoggable
|
|
20
20
|
included do
|
21
21
|
has_many :logged_changes, -> { order(:id).where(status: EffectiveLogging.log_changes_status) }, as: :associated, class_name: 'Effective::Log'
|
22
22
|
|
23
|
-
around_save(unless: -> { EffectiveLogging.supressed? }) do |_, block|
|
24
|
-
@acts_as_loggable_new_record = new_record?
|
25
|
-
|
26
|
-
unless @acts_as_loggable_new_record
|
27
|
-
@acts_as_loggable_update_record = ::EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).execute!
|
28
|
-
end
|
29
|
-
|
30
|
-
block.call
|
31
|
-
true
|
32
|
-
end
|
33
|
-
|
34
|
-
before_destroy(unless: -> { EffectiveLogging.supressed? }) do
|
35
|
-
@acts_as_loggable_destroy_record = true
|
36
|
-
::EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).destroyed!
|
37
|
-
true
|
38
|
-
end
|
39
|
-
|
40
|
-
after_commit(unless: -> { EffectiveLogging.supressed? }) do
|
41
|
-
if @acts_as_loggable_new_record
|
42
|
-
::EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).created!
|
43
|
-
elsif !@acts_as_loggable_destroy_record && @acts_as_loggable_update_record
|
44
|
-
::EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).updated!
|
45
|
-
end
|
46
|
-
|
47
|
-
true
|
48
|
-
end
|
49
|
-
|
50
|
-
# Parse Options
|
51
23
|
log_changes_options = {
|
52
24
|
only: Array(@acts_as_loggable_options[:only]).map { |attribute| attribute.to_s },
|
53
25
|
except: Array(@acts_as_loggable_options[:except]).map { |attribute| attribute.to_s },
|
54
26
|
additionally: Array(@acts_as_loggable_options[:additionally]).map { |attribute| attribute.to_s },
|
55
|
-
include_associated: @acts_as_loggable_options.fetch(:include_associated, true)
|
27
|
+
include_associated: @acts_as_loggable_options.fetch(:include_associated, true),
|
28
|
+
include_nested: @acts_as_loggable_options.fetch(:include_nested, true)
|
56
29
|
}
|
57
30
|
|
58
31
|
if name == 'User'
|
@@ -60,6 +33,18 @@ module ActsAsLoggable
|
|
60
33
|
end
|
61
34
|
|
62
35
|
self.send(:define_method, :log_changes_options) { log_changes_options }
|
36
|
+
|
37
|
+
after_create(unless: -> { EffectiveLogging.supressed? }) do
|
38
|
+
::EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).execute!
|
39
|
+
end
|
40
|
+
|
41
|
+
after_destroy(unless: -> { EffectiveLogging.supressed? }) do
|
42
|
+
::EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).execute!
|
43
|
+
end
|
44
|
+
|
45
|
+
after_update(unless: -> { EffectiveLogging.supressed? }) do
|
46
|
+
::EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).execute!
|
47
|
+
end
|
63
48
|
end
|
64
49
|
|
65
50
|
module ClassMethods
|
@@ -1,17 +1,18 @@
|
|
1
1
|
.panel.panel-default.card
|
2
2
|
.panel-heading.card-header
|
3
3
|
.row
|
4
|
-
.col-md-
|
4
|
+
.col-md-8
|
5
5
|
- parents_of_log(log).each do |parent|
|
6
6
|
= link_to(log.message, request.fullpath.sub('/' + log.to_param, '/' + parent.to_param))
|
7
7
|
= ' > '
|
8
8
|
%p= log.message.html_safe
|
9
|
-
|
9
|
+
|
10
|
+
.col-md-4.text-right
|
10
11
|
- if log.prev_log
|
11
12
|
= link_to 'Prev', request.fullpath.sub('/' + log.to_param, '/' + log.prev_log.to_param), class: 'btn btn-primary'
|
12
13
|
|
13
14
|
- if log.next_log
|
14
|
-
= link_to 'Next', request.fullpath.sub('/' + log.to_param, '/' + log.
|
15
|
+
= link_to 'Next', request.fullpath.sub('/' + log.to_param, '/' + log.next_log.to_param), class: 'btn btn-primary'
|
15
16
|
|
16
17
|
.panel-body.card-body
|
17
18
|
.row
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module EffectiveLogging
|
2
2
|
class ActiveRecordLogger
|
3
|
-
attr_accessor :object, :resource, :logger, :depth, :include_associated, :options
|
3
|
+
attr_accessor :object, :resource, :logger, :depth, :include_associated, :include_nested, :options
|
4
4
|
|
5
5
|
BLANK = "''"
|
6
6
|
|
@@ -9,49 +9,46 @@ module EffectiveLogging
|
|
9
9
|
|
10
10
|
@object = object
|
11
11
|
@resource = Effective::Resource.new(object)
|
12
|
-
@logged = false # If work was done
|
13
12
|
|
14
13
|
@logger = options.delete(:logger) || object
|
15
14
|
@depth = options.delete(:depth) || 0
|
16
15
|
@include_associated = options.fetch(:include_associated, true)
|
16
|
+
@include_nested = options.fetch(:include_nested, true)
|
17
17
|
@options = options
|
18
18
|
|
19
19
|
raise ArgumentError.new('logger must respond to logged_changes') unless @logger.respond_to?(:logged_changes)
|
20
20
|
end
|
21
21
|
|
22
|
-
# execute! is called when we recurse, otherwise the following methods are best called individually
|
23
22
|
def execute!
|
24
|
-
|
23
|
+
@logged = false
|
24
|
+
|
25
|
+
if new_record?(object)
|
25
26
|
created!
|
26
|
-
elsif object
|
27
|
+
elsif destroyed_record?(object)
|
27
28
|
destroyed!
|
28
29
|
else
|
29
|
-
|
30
|
+
updated!
|
30
31
|
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
@logged
|
33
|
+
logged?
|
35
34
|
end
|
36
35
|
|
37
|
-
# before_destroy
|
38
36
|
def destroyed!
|
39
|
-
log('Deleted')
|
37
|
+
log('Deleted', details: applicable(instance_attributes))
|
40
38
|
end
|
41
39
|
|
42
|
-
# after_commit
|
43
40
|
def created!
|
44
|
-
log('Created', details: applicable(
|
41
|
+
log('Created', details: applicable(instance_attributes))
|
45
42
|
end
|
46
43
|
|
47
|
-
# after_commit
|
48
44
|
def updated!
|
49
|
-
|
50
|
-
|
45
|
+
log_resource_changes!
|
46
|
+
log_nested_resources!
|
51
47
|
|
52
|
-
|
48
|
+
log('Updated', details: applicable(instance_attributes)) if logged? && depth == 0
|
49
|
+
end
|
53
50
|
|
54
|
-
def
|
51
|
+
def log_resource_changes!
|
55
52
|
applicable(resource.instance_changes).each do |attribute, (before, after)|
|
56
53
|
if object.respond_to?(:log_changes_formatted_value)
|
57
54
|
before = object.log_changes_formatted_value(attribute, before) || before
|
@@ -70,17 +67,29 @@ module EffectiveLogging
|
|
70
67
|
end
|
71
68
|
|
72
69
|
def log_nested_resources!
|
70
|
+
return unless include_nested
|
71
|
+
|
73
72
|
# Log changes on all accepts_as_nested_parameters has_many associations
|
74
73
|
resource.nested_resources.each do |association|
|
75
74
|
title = association.name.to_s.singularize.titleize
|
76
75
|
|
77
76
|
Array(object.send(association.name)).each_with_index do |child, index|
|
78
|
-
|
77
|
+
next unless child.present?
|
78
|
+
|
79
|
+
child_options = options.merge(logger: logger, depth: depth+1, prefix: "#{title} #{index} - #{child} - ", include_associated: include_associated, include_nested: include_nested)
|
80
|
+
child_options = child_options.merge(child.log_changes_options) if child.respond_to?(:log_changes_options)
|
81
|
+
|
79
82
|
@logged = true if ::EffectiveLogging::ActiveRecordLogger.new(child, child_options).execute!
|
80
83
|
end
|
81
84
|
end
|
82
85
|
end
|
83
86
|
|
87
|
+
private
|
88
|
+
|
89
|
+
def instance_attributes # effective_resources gem
|
90
|
+
resource.instance_attributes(include_associated: include_associated, include_nested: include_nested)
|
91
|
+
end
|
92
|
+
|
84
93
|
def log(message, details: {})
|
85
94
|
@logged = true
|
86
95
|
|
@@ -96,9 +105,12 @@ module EffectiveLogging
|
|
96
105
|
log
|
97
106
|
end
|
98
107
|
|
108
|
+
def logged?
|
109
|
+
@logged == true
|
110
|
+
end
|
111
|
+
|
99
112
|
# TODO: Make this work better with nested objects
|
100
113
|
def applicable(attributes)
|
101
|
-
|
102
114
|
atts = if options[:only].present?
|
103
115
|
attributes.stringify_keys.slice(*options[:only])
|
104
116
|
elsif options[:except].present?
|
@@ -115,7 +127,22 @@ module EffectiveLogging
|
|
115
127
|
end
|
116
128
|
|
117
129
|
# Blacklist
|
118
|
-
atts.except(:logged_changes, :trash, 'logged_changes', 'trash')
|
130
|
+
atts.except(:logged_changes, :trash, :updated_at, 'logged_changes', 'trash', 'updated_at')
|
131
|
+
end
|
132
|
+
|
133
|
+
def new_record?(object)
|
134
|
+
return true if object.respond_to?(:new_record?) && object.new_record?
|
135
|
+
return true if object.respond_to?(:id_was) && object.id_was.nil?
|
136
|
+
return true if object.respond_to?(:previous_changes) && object.previous_changes.key?('id') && object.previous_changes['id'].first.nil?
|
137
|
+
false
|
138
|
+
end
|
139
|
+
|
140
|
+
def destroyed_record?(object)
|
141
|
+
return true if object.respond_to?(:destroyed?) && object.destroyed?
|
142
|
+
return true if object.respond_to?(:marked_for_destruction?) && object.marked_for_destruction?
|
143
|
+
return true if object.respond_to?(:previous_changes) && object.previous_changes.key?('id') && object.previous_changes['id'].last.nil?
|
144
|
+
false
|
119
145
|
end
|
120
146
|
end
|
147
|
+
|
121
148
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_logging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|