logga 3.0.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +77 -11
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/logga/active_record.rb +30 -25
- data/lib/logga/config.rb +13 -0
- data/lib/logga.rb +27 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d75ebd3e7aaf71d362a3434cfdf18c443f9a9e2211f493f9263f1297c73f1bca
|
4
|
+
data.tar.gz: 59c3bcfba124a2cff37290d364527bcedd26c9c2ddc9fcd290bdd7b3323f4181
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 638afbac5bd2330208069a0f4c725090fb88cb7e3785f64e1cf6a1d6c4255c5e7f39a7b92fc7481061e135a0e8765129ec4b12e06a48148e421b5f3cf62e6bc3
|
7
|
+
data.tar.gz: 6d07832218be126bb2328b72d0d2aba1b2640b46d830cf6a087e3b45fd1221d5947869ad892b2db33aff4f024304f94fe79811e4288aaa9a1449ca6084d1470e
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ Provides attribute logging functionality to ActiveRecord objects.
|
|
7
7
|
|
8
8
|
## Requirements
|
9
9
|
|
10
|
-
|
10
|
+
- Ruby >= 3.0
|
11
11
|
|
12
12
|
## Installation
|
13
13
|
|
@@ -31,27 +31,94 @@ gem install logga
|
|
31
31
|
|
32
32
|
## Usage
|
33
33
|
|
34
|
-
Add
|
34
|
+
Add the following to your model:
|
35
35
|
|
36
36
|
```ruby
|
37
|
-
class
|
38
|
-
|
37
|
+
class Thing < ApplicationRecord
|
38
|
+
# Optional author accessor. See #author
|
39
|
+
attr_accessor :author
|
40
|
+
|
41
|
+
# Association to :log_entries, which the loggable object must response to for logging.
|
42
|
+
has_many :log_entries, as: :loggable, dependent: :destroy
|
43
|
+
|
44
|
+
add_log_entries_for(
|
45
|
+
:create, # Log on object create
|
46
|
+
:delete, # Log on object delete
|
47
|
+
:update, # Log on object update
|
48
|
+
allowed_fields: [], # set an array of fields allowed to be logged
|
49
|
+
exclude_fields: [], # set an array of fields excluded from logging. Ignored if allowed_fields is set
|
50
|
+
fields: {}, # Custom messages for fields. See #fields
|
51
|
+
to: nil
|
52
|
+
)
|
39
53
|
end
|
40
54
|
```
|
41
55
|
|
42
|
-
So that new LogEntry records attached to a given
|
56
|
+
So that new `LogEntry` records attached to a given `Thing` instance will be created whenever a new one is created or
|
43
57
|
modified.
|
44
58
|
|
59
|
+
## Author
|
60
|
+
|
61
|
+
If you want to log the author of the changes you can do so by setting:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
thing.author = { id: "1", name: "Barry", type: "User" }
|
65
|
+
```
|
66
|
+
|
67
|
+
## Fields
|
68
|
+
|
69
|
+
You can override the default messages per field by using:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
add_log_entries_for(
|
73
|
+
:update,
|
74
|
+
fields: {
|
75
|
+
name: lambda { |record, field, old_value, new_value|
|
76
|
+
"Name changed from #{old_value} to #{new_value}"
|
77
|
+
}
|
78
|
+
}
|
79
|
+
)
|
80
|
+
```
|
81
|
+
|
82
|
+
This is with the exeception on `:created_at` which only takes the created record.
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
add_log_entries_for(
|
86
|
+
:create,
|
87
|
+
fields: {
|
88
|
+
created_at: lambda { |record|
|
89
|
+
"Created object with id: #{record.id}"
|
90
|
+
}
|
91
|
+
}
|
92
|
+
)
|
93
|
+
```
|
94
|
+
|
95
|
+
## Configuration
|
96
|
+
|
97
|
+
Add an initializer to your project:
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
Logga.configure do |config|
|
101
|
+
config.enabled = true
|
102
|
+
config.excluded_fields = [] # Default array of excluded fields i.e. [:id] to ignore all :id fields for every object
|
103
|
+
config.excluded_suffixes = [] # Array of excluded suffixes i.e. [:_id] to ignore all fields that end in :_id for every object
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
For example:
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
Logga.configure do |config|
|
111
|
+
config.excluded_fields = [:id] # Don't log any id changes
|
112
|
+
config.excluded_suffixes = [_id] # Don't log any column that ends in _id
|
113
|
+
end
|
114
|
+
```
|
115
|
+
|
45
116
|
## Development
|
46
117
|
|
47
118
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
48
119
|
|
49
120
|
To install this gem onto your local machine, run `bundle exec rake install`.
|
50
121
|
|
51
|
-
## Versioning
|
52
|
-
|
53
|
-
The version of the gem should be set in the `VERSION` file found in the root of the project. This is then read by the `lib/boxt_aasm_ext/version.rb` file to set in the gem.
|
54
|
-
|
55
122
|
## Contributing
|
56
123
|
|
57
124
|
Bug reports and pull requests are welcome on GitHub at https://github.com/boxt/logga.
|
@@ -62,6 +129,5 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
62
129
|
|
63
130
|
## TODOs
|
64
131
|
|
65
|
-
- Write some tests
|
66
132
|
- Improve the documentation
|
67
|
-
-
|
133
|
+
- Add migration generator for `:log_entries`
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
5.0.0
|
data/lib/logga/active_record.rb
CHANGED
@@ -4,21 +4,18 @@ module Logga
|
|
4
4
|
module ActiveRecord
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
-
EXCLUDED_KEYS = %i[id created_at deleted_at initial updated_at log sent_after_sales_emails].freeze
|
8
|
-
EXCLUDED_SUFFIXES = %i[_id _filenames].freeze
|
9
|
-
|
10
7
|
included do
|
11
8
|
class_attribute :allowed_fields, instance_writer: false
|
12
9
|
class_attribute :excluded_fields, instance_writer: false
|
13
|
-
class_attribute :
|
10
|
+
class_attribute :fields, instance_writer: false
|
14
11
|
|
15
12
|
self.allowed_fields = []
|
16
13
|
self.excluded_fields = []
|
17
|
-
self.
|
14
|
+
self.fields = {}
|
18
15
|
end
|
19
16
|
|
20
17
|
class_methods do
|
21
|
-
def add_log_entries_for(*actions,
|
18
|
+
def add_log_entries_for(*actions, allowed_fields: [], exclude_fields: [], fields: {}, to: :self)
|
22
19
|
after_create :log_model_creation if actions.include?(:create)
|
23
20
|
after_destroy :log_model_deletion if actions.include?(:delete)
|
24
21
|
after_update :log_model_changes if actions.include?(:update)
|
@@ -26,7 +23,7 @@ module Logga
|
|
26
23
|
|
27
24
|
self.allowed_fields = Array(allowed_fields)
|
28
25
|
self.excluded_fields = allowed_fields.blank? ? Array(exclude_fields) : []
|
29
|
-
self.
|
26
|
+
self.fields = fields
|
30
27
|
end
|
31
28
|
end
|
32
29
|
|
@@ -34,27 +31,29 @@ module Logga
|
|
34
31
|
return if changes.blank?
|
35
32
|
|
36
33
|
body = field_changes_to_message(changes)
|
37
|
-
|
34
|
+
return if body.blank?
|
35
|
+
|
36
|
+
create_log_entry(author_data.merge(body: body))
|
38
37
|
end
|
39
38
|
|
40
39
|
def log_model_creation
|
41
|
-
return
|
40
|
+
return unless should_log?
|
42
41
|
|
43
42
|
body_generator = ->(record) { default_creation_log_body(record) }
|
44
|
-
body =
|
43
|
+
body = fields.fetch(:created_at, body_generator).call(self)
|
45
44
|
create_log_entry(author_data.merge(body: body, created_at: creation_at))
|
46
45
|
end
|
47
46
|
|
48
47
|
def log_model_deletion
|
49
|
-
return
|
48
|
+
return unless should_log?
|
50
49
|
|
51
50
|
body_generator = ->(record) { default_deletion_log_body(record) }
|
52
|
-
body =
|
51
|
+
body = fields.fetch(:deleted_at, body_generator).call(self)
|
53
52
|
create_log_entry(author_data.merge(body: body))
|
54
53
|
end
|
55
54
|
|
56
55
|
def log_model_changes
|
57
|
-
return
|
56
|
+
return unless should_log?
|
58
57
|
|
59
58
|
field_changes = previous_changes.reject { |k, _| reject_change?(k) }
|
60
59
|
log_field_changes(field_changes)
|
@@ -64,13 +63,22 @@ module Logga
|
|
64
63
|
|
65
64
|
def author_data
|
66
65
|
data = Hash(log_receiver.try(:author) || try(:author)).with_indifferent_access
|
66
|
+
|
67
67
|
{
|
68
68
|
author_id: data[:id],
|
69
|
-
|
70
|
-
|
69
|
+
author_name: data[:name],
|
70
|
+
author_type: data[:type]
|
71
71
|
}
|
72
72
|
end
|
73
73
|
|
74
|
+
def config_excluded_fields
|
75
|
+
Logga.configuration.excluded_fields
|
76
|
+
end
|
77
|
+
|
78
|
+
def config_excluded_suffixes
|
79
|
+
Logga.configuration.excluded_suffixes
|
80
|
+
end
|
81
|
+
|
74
82
|
def create_log_entry(entry)
|
75
83
|
log_receiver&.log_entries&.create(entry)
|
76
84
|
end
|
@@ -82,10 +90,7 @@ module Logga
|
|
82
90
|
end
|
83
91
|
|
84
92
|
def default_creation_log_body(record)
|
85
|
-
|
86
|
-
"#{titleized_model_class_name(record)} created",
|
87
|
-
("(#{record.state})" if record.try(:state))
|
88
|
-
].compact.join(" ")
|
93
|
+
"#{titleized_model_class_name(record)} created"
|
89
94
|
end
|
90
95
|
|
91
96
|
def default_change_log_body(record, field, _old_value, new_value)
|
@@ -104,7 +109,7 @@ module Logga
|
|
104
109
|
default_change_log_body(record, field, old_value, new_value)
|
105
110
|
}
|
106
111
|
changes.inject([]) do |result, (field, (old_value, new_value))|
|
107
|
-
result <<
|
112
|
+
result << fields.fetch(field.to_sym, body_generator).call(self, field, old_value, new_value)
|
108
113
|
end.compact.join("\n")
|
109
114
|
end
|
110
115
|
|
@@ -112,14 +117,14 @@ module Logga
|
|
112
117
|
sym_key = key.to_sym
|
113
118
|
return allowed_fields.exclude?(sym_key) if allowed_fields.present?
|
114
119
|
|
115
|
-
|
116
|
-
(
|
120
|
+
config_excluded_fields.include?(sym_key) ||
|
121
|
+
(fields.exclude?(sym_key) &&
|
117
122
|
(excluded_fields.include?(sym_key) ||
|
118
|
-
|
123
|
+
config_excluded_suffixes.any? { |suffix| key.to_s.end_with?(suffix.to_s) }))
|
119
124
|
end
|
120
125
|
|
121
|
-
def
|
122
|
-
|
126
|
+
def should_log?
|
127
|
+
Logga.enabled? && log_receiver.respond_to?(:log_entries)
|
123
128
|
end
|
124
129
|
|
125
130
|
def titleized_model_class_name(record)
|
data/lib/logga/config.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Logga
|
4
|
+
class Config
|
5
|
+
attr_accessor :enabled, :excluded_fields, :excluded_suffixes
|
6
|
+
|
7
|
+
def initialize(enabled: true, excluded_fields: [], excluded_suffixes: [])
|
8
|
+
@enabled = enabled
|
9
|
+
@excluded_fields = excluded_fields
|
10
|
+
@excluded_suffixes = excluded_suffixes
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/logga.rb
CHANGED
@@ -3,11 +3,37 @@
|
|
3
3
|
require "active_support"
|
4
4
|
require "active_support/core_ext"
|
5
5
|
require "active_support/concern"
|
6
|
-
|
6
|
+
|
7
7
|
require_relative "logga/active_record"
|
8
|
+
require_relative "logga/config"
|
9
|
+
require_relative "logga/version"
|
8
10
|
|
9
11
|
module Logga
|
10
12
|
ActiveSupport.on_load(:active_record) do
|
11
13
|
include Logga::ActiveRecord
|
12
14
|
end
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def configuration
|
18
|
+
@configuration ||= Config.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def configure
|
22
|
+
yield(configuration)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Switches Logga on or off
|
26
|
+
def enabled=(value)
|
27
|
+
configuration.enabled = value
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns `true` if Logga is on, `false` otherwise
|
31
|
+
def enabled?
|
32
|
+
!!configuration.enabled
|
33
|
+
end
|
34
|
+
|
35
|
+
def version
|
36
|
+
Logga::VERSION
|
37
|
+
end
|
38
|
+
end
|
13
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logga
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boxt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -63,6 +63,7 @@ files:
|
|
63
63
|
- VERSION
|
64
64
|
- lib/logga.rb
|
65
65
|
- lib/logga/active_record.rb
|
66
|
+
- lib/logga/config.rb
|
66
67
|
- lib/logga/version.rb
|
67
68
|
homepage: https://github.com/boxt/logga
|
68
69
|
licenses:
|
@@ -77,14 +78,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
77
78
|
requirements:
|
78
79
|
- - ">="
|
79
80
|
- !ruby/object:Gem::Version
|
80
|
-
version: '
|
81
|
+
version: '3.0'
|
81
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
83
|
requirements:
|
83
84
|
- - ">="
|
84
85
|
- !ruby/object:Gem::Version
|
85
86
|
version: '0'
|
86
87
|
requirements: []
|
87
|
-
rubygems_version: 3.
|
88
|
+
rubygems_version: 3.5.3
|
88
89
|
signing_key:
|
89
90
|
specification_version: 4
|
90
91
|
summary: ActiveRecord log entries on model changes
|