logga 1.4.0 → 1.6.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 +5 -5
- data/.gitignore +0 -1
- data/.rubocop.yml +3 -0
- data/.ruby-version +1 -0
- data/.travis.yml +2 -2
- data/Gemfile +2 -0
- data/README.md +11 -6
- data/lib/logga.rb +5 -6
- data/lib/logga/active_record.rb +50 -24
- data/lib/logga/version.rb +3 -1
- data/logga.gemspec +17 -13
- metadata +28 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a10fef3d96c1c0ff09efc4f3043bf3751453b05ac86202969707a663494717ec
|
4
|
+
data.tar.gz: 0a08c2788adf74f258cb058902206181e03680caa0f7149b5a7291612173dfba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc8887eb3f511ee2d500e4ee4a7ede79acc3b32d410d67f2e06ac37ebd098399188bc58fd442fa6c5bb59b27b1ac99b7289c3a378e2592732be5772cc396cd1b
|
7
|
+
data.tar.gz: e77078b35294a50d06fb58e8587cd126605029f3a0459f541440835c53984e985c3b83b43ce06056e99d1f730b8e7e2750f6f42af8cd4a1709a82747891488b4
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.5.3
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# Logga
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
Provides attribute logging functionality to ActiveRecord objects.
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -31,19 +29,26 @@ end
|
|
31
29
|
|
32
30
|
```
|
33
31
|
|
34
|
-
|
32
|
+
So that new LogEntry records attached to a given Order instance will be created whenever a new one is created or
|
35
33
|
modified.
|
36
34
|
|
37
35
|
## Development
|
38
36
|
|
39
37
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
40
38
|
|
41
|
-
To install this gem onto your local machine, run `bundle exec rake install`.
|
39
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
40
|
+
|
41
|
+
To release a new version, update the version number in `version.rb`.
|
42
42
|
|
43
43
|
## Contributing
|
44
44
|
|
45
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
45
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/boxt/logga.
|
46
46
|
|
47
47
|
## License
|
48
48
|
|
49
49
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
50
|
+
|
51
|
+
## TODOs
|
52
|
+
|
53
|
+
* Write some tests
|
54
|
+
* Improve the documentation
|
data/lib/logga.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support"
|
4
|
+
require "active_support/core_ext"
|
5
|
+
require "active_support/concern"
|
4
6
|
require_relative "logga/version"
|
5
7
|
require_relative "logga/active_record"
|
6
8
|
|
7
|
-
|
8
9
|
module Logga
|
9
|
-
|
10
10
|
ActiveSupport.on_load(:active_record) do
|
11
11
|
include Logga::ActiveRecord
|
12
12
|
end
|
13
|
-
|
14
13
|
end
|
data/lib/logga/active_record.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Logga
|
2
4
|
module ActiveRecord
|
3
5
|
extend ActiveSupport::Concern
|
4
6
|
|
5
|
-
EXCLUDED_KEYS = [
|
6
|
-
EXCLUDED_KEYS_SUFFIXES = [
|
7
|
+
EXCLUDED_KEYS = %i[id created_at deleted_at initial updated_at log sent_after_sales_emails].freeze
|
8
|
+
EXCLUDED_KEYS_SUFFIXES = %i[_id _filenames].freeze
|
7
9
|
|
8
10
|
included do
|
9
11
|
class_attribute :log_fields, instance_writer: false
|
@@ -18,37 +20,43 @@ module Logga
|
|
18
20
|
after_destroy :log_model_deletion if actions.include?(:delete)
|
19
21
|
after_update :log_model_changes if actions.include?(:update)
|
20
22
|
define_method(:log_receiver) { to == :self ? self : send(to) }
|
23
|
+
|
21
24
|
self.log_fields = fields
|
22
25
|
self.excluded_fields = Array(exclude_fields)
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
29
|
+
def log_field_changes(changes)
|
30
|
+
return if changes.blank?
|
31
|
+
|
32
|
+
body = field_changes_to_message(changes)
|
33
|
+
create_log_entry(author_data.merge(body: body)) if body.present?
|
34
|
+
end
|
35
|
+
|
26
36
|
def log_model_creation
|
37
|
+
return if should_not_log?
|
38
|
+
|
27
39
|
body_generator = ->(record) { default_creation_log_body(record) }
|
28
40
|
body = log_fields.fetch(:created_at, body_generator).call(self)
|
29
|
-
|
41
|
+
create_log_entry(author_data.merge(body: body, created_at: creation_at))
|
30
42
|
end
|
31
43
|
|
32
44
|
def log_model_deletion
|
33
|
-
|
45
|
+
return if should_not_log?
|
46
|
+
|
47
|
+
body_generator = ->(record) { default_deletion_log_body(record) }
|
34
48
|
body = log_fields.fetch(:deleted_at, body_generator).call(self)
|
35
|
-
|
49
|
+
create_log_entry(author_data.merge(body: body))
|
36
50
|
end
|
37
51
|
|
38
52
|
def log_model_changes
|
39
|
-
|
40
|
-
EXCLUDED_KEYS.include?(k.to_sym) ||
|
41
|
-
(!log_fields.include?(k.to_sym) &&
|
42
|
-
(excluded_fields.include?(k.to_sym) ||
|
43
|
-
EXCLUDED_KEYS_SUFFIXES.any? { |suffix| k.to_s.end_with?(suffix.to_s) }))
|
44
|
-
end
|
45
|
-
log_field_changes(field_changes)
|
46
|
-
end
|
53
|
+
return if should_not_log?
|
47
54
|
|
48
|
-
|
49
|
-
return if
|
50
|
-
|
51
|
-
|
55
|
+
field_changes = previous_changes.reject { |k, _| reject_change?(k) }
|
56
|
+
return if field_changes.blank?
|
57
|
+
|
58
|
+
body = field_changes_to_message(field_changes)
|
59
|
+
create_log_entry(author_data.merge(body: body)) if body.present?
|
52
60
|
end
|
53
61
|
|
54
62
|
private
|
@@ -56,14 +64,19 @@ module Logga
|
|
56
64
|
def author_data
|
57
65
|
data = Hash(log_receiver.try(:author) || try(:author)).with_indifferent_access
|
58
66
|
{
|
59
|
-
|
60
|
-
|
61
|
-
|
67
|
+
author_id: data[:id],
|
68
|
+
author_type: data[:type],
|
69
|
+
author_name: data[:name]
|
62
70
|
}
|
63
71
|
end
|
64
72
|
|
73
|
+
def create_log_entry(entry)
|
74
|
+
log_receiver&.log_entries&.create(entry)
|
75
|
+
end
|
76
|
+
|
65
77
|
def creation_at
|
66
78
|
return Time.current unless log_receiver == self
|
79
|
+
|
67
80
|
(log_receiver&.log_entries&.order(:created_at)&.first&.created_at || Time.current) - 0.1.seconds
|
68
81
|
end
|
69
82
|
|
@@ -71,10 +84,10 @@ module Logga
|
|
71
84
|
[
|
72
85
|
"#{titleized_model_class_name(record)} created",
|
73
86
|
("(#{record.state})" if record.try(:state))
|
74
|
-
].compact.join(
|
87
|
+
].compact.join(" ")
|
75
88
|
end
|
76
89
|
|
77
|
-
def default_change_log_body(record, field,
|
90
|
+
def default_change_log_body(record, field, _old_value, new_value)
|
78
91
|
"#{titleized_model_class_name(record)} #{field.humanize(capitalize: false)} set to #{new_value}"
|
79
92
|
end
|
80
93
|
|
@@ -82,16 +95,29 @@ module Logga
|
|
82
95
|
[
|
83
96
|
"#{titleized_model_class_name(record)} removed",
|
84
97
|
("(#{record.name})" if record.try(:name))
|
85
|
-
].compact.join(
|
98
|
+
].compact.join(" ")
|
86
99
|
end
|
87
100
|
|
88
101
|
def field_changes_to_message(changes)
|
89
|
-
body_generator =
|
102
|
+
body_generator = lambda { |record, field, old_value, new_value|
|
103
|
+
default_change_log_body(record, field, old_value, new_value)
|
104
|
+
}
|
90
105
|
changes.inject([]) do |result, (field, (old_value, new_value))|
|
91
106
|
result << log_fields.fetch(field.to_sym, body_generator).call(self, field, old_value, new_value)
|
92
107
|
end.compact.join("\n")
|
93
108
|
end
|
94
109
|
|
110
|
+
def reject_change?(key)
|
111
|
+
EXCLUDED_KEYS.include?(key.to_sym) ||
|
112
|
+
(!log_fields.include?(key.to_sym) &&
|
113
|
+
(excluded_fields.include?(key.to_sym) ||
|
114
|
+
EXCLUDED_KEYS_SUFFIXES.any? { |suffix| key.to_s.end_with?(suffix.to_s) }))
|
115
|
+
end
|
116
|
+
|
117
|
+
def should_not_log?
|
118
|
+
!log_receiver.respond_to?(:log_entries)
|
119
|
+
end
|
120
|
+
|
95
121
|
def titleized_model_class_name(record)
|
96
122
|
record.class.name.demodulize.titleize
|
97
123
|
end
|
data/lib/logga/version.rb
CHANGED
data/logga.gemspec
CHANGED
@@ -1,17 +1,21 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Style/ExpandPathArguments
|
4
|
+
# NOTE: This is because of Gemfury failing with __dir__
|
2
5
|
lib = File.expand_path("../lib", __FILE__)
|
6
|
+
# rubocop:enable Style/ExpandPathArguments
|
3
7
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
8
|
require "logga/version"
|
5
9
|
|
6
10
|
Gem::Specification.new do |spec|
|
7
11
|
spec.name = "logga"
|
8
12
|
spec.version = Logga::VERSION
|
9
|
-
spec.authors = ["
|
10
|
-
spec.email = ["
|
13
|
+
spec.authors = ["Boxt"]
|
14
|
+
spec.email = ["developers@boxt.co.uk"]
|
11
15
|
|
12
|
-
spec.summary = "
|
16
|
+
spec.summary = "ActiveRecord log entries on model changes"
|
13
17
|
spec.description = "Extensions to ActiveRecord to log entries on model changes"
|
14
|
-
spec.homepage = "https://github.com/
|
18
|
+
spec.homepage = "https://github.com/boxt/logga"
|
15
19
|
spec.license = "MIT"
|
16
20
|
|
17
21
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
@@ -21,13 +25,13 @@ Gem::Specification.new do |spec|
|
|
21
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
26
|
spec.require_paths = ["lib"]
|
23
27
|
|
24
|
-
spec.add_development_dependency "
|
25
|
-
spec.add_development_dependency "
|
26
|
-
spec.add_development_dependency "
|
27
|
-
spec.add_development_dependency "
|
28
|
-
spec.add_development_dependency "
|
29
|
-
spec.add_development_dependency "simplecov"
|
28
|
+
spec.add_development_dependency "boxt_ruby_style_guide", "~> 1.1"
|
29
|
+
spec.add_development_dependency "bundler", "~> 1.17"
|
30
|
+
spec.add_development_dependency "byebug", "~> 10.0"
|
31
|
+
spec.add_development_dependency "rake", "~> 12.3"
|
32
|
+
spec.add_development_dependency "rspec", "~> 3.6"
|
33
|
+
spec.add_development_dependency "simplecov", "~> 0.16"
|
30
34
|
|
31
|
-
spec.add_runtime_dependency "activerecord",
|
32
|
-
spec.add_runtime_dependency "activesupport",
|
35
|
+
spec.add_runtime_dependency "activerecord", "~> 5.2"
|
36
|
+
spec.add_runtime_dependency "activesupport", "~> 5.2"
|
33
37
|
end
|
metadata
CHANGED
@@ -1,99 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logga
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Boxt
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: boxt_ruby_style_guide
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.17'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '1.17'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: byebug
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '10.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '10.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '12.3'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '12.3'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '3.6'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '3.6'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
89
|
+
version: '0.16'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
96
|
+
version: '0.16'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: activerecord
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,13 +124,15 @@ dependencies:
|
|
124
124
|
version: '5.2'
|
125
125
|
description: Extensions to ActiveRecord to log entries on model changes
|
126
126
|
email:
|
127
|
-
-
|
127
|
+
- developers@boxt.co.uk
|
128
128
|
executables: []
|
129
129
|
extensions: []
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
132
|
- ".gitignore"
|
133
133
|
- ".rspec"
|
134
|
+
- ".rubocop.yml"
|
135
|
+
- ".ruby-version"
|
134
136
|
- ".travis.yml"
|
135
137
|
- Gemfile
|
136
138
|
- LICENSE.txt
|
@@ -142,7 +144,7 @@ files:
|
|
142
144
|
- lib/logga/active_record.rb
|
143
145
|
- lib/logga/version.rb
|
144
146
|
- logga.gemspec
|
145
|
-
homepage: https://github.com/
|
147
|
+
homepage: https://github.com/boxt/logga
|
146
148
|
licenses:
|
147
149
|
- MIT
|
148
150
|
metadata: {}
|
@@ -162,8 +164,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
164
|
version: '0'
|
163
165
|
requirements: []
|
164
166
|
rubyforge_project:
|
165
|
-
rubygems_version: 2.6
|
167
|
+
rubygems_version: 2.7.6
|
166
168
|
signing_key:
|
167
169
|
specification_version: 4
|
168
|
-
summary:
|
170
|
+
summary: ActiveRecord log entries on model changes
|
169
171
|
test_files: []
|