journaled 5.3.2 → 6.0.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 +4 -4
- data/README.md +16 -1
- data/Rakefile +3 -0
- data/app/jobs/journaled/delivery_job.rb +1 -2
- data/app/models/concerns/journaled/changes.rb +29 -33
- data/app/models/journaled/audit_log/event.rb +1 -2
- data/config/initializers/change_protection.rb +2 -4
- data/lib/journaled/audit_log.rb +1 -1
- data/lib/journaled/relation_change_protection.rb +4 -4
- data/lib/journaled/version.rb +1 -1
- metadata +12 -20
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cdfecf071b843818742d6fedc649d57e793e9abbd18906b09245124327ac4705
|
|
4
|
+
data.tar.gz: d92147f78529cbdbeeed3216c4ab14d0cfbcad9d716f3bff4a3f8b6af99c99e7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: eed184d251e7068985f9283bd8e4d855d547eef9b8abe090127eb46306984354583d7051dab90c78d8e351575467ea5a1c9213ffa210438cd016ea766caeb427
|
|
7
|
+
data.tar.gz: a25aee3b51b832a793a1a1168c9d58660f208787e0ee21af190a95e6b0c6d7de76dd285a2bccd8abf05c48ba3dd726ed9bf71be0b96eeca602ac103feb0d3d0e
|
data/README.md
CHANGED
|
@@ -37,6 +37,21 @@ to use one of the following queue adapters:
|
|
|
37
37
|
`ActiveJob::Base.queue_adapter` is not in the above list, it will raise an exception
|
|
38
38
|
and prevent your application from performing unsafe journaling.**
|
|
39
39
|
|
|
40
|
+
The following configurations are __not supported__ by Journaled:
|
|
41
|
+
|
|
42
|
+
```ruby
|
|
43
|
+
config.active_job.enqueue_after_transaction_commit = :always
|
|
44
|
+
config.active_job.enqueue_after_transaction_commit = true
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
If you're using Rails 7.2 with the `:test` adapter, please use the following configuration:
|
|
48
|
+
|
|
49
|
+
```ruby
|
|
50
|
+
config.active_job.enqueue_after_transaction_commit = :never
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
This configuration isn't necessary for applications running Rails 8+.
|
|
54
|
+
|
|
40
55
|
2. To integrate Journaled into your application, simply include the gem in your
|
|
41
56
|
app's Gemfile.
|
|
42
57
|
|
|
@@ -91,7 +106,7 @@ app's Gemfile.
|
|
|
91
106
|
|
|
92
107
|
Journaling provides a number of different configuation options that can be set in Ruby using an initializer. Those values are:
|
|
93
108
|
|
|
94
|
-
#### `Journaled.default_stream_name
|
|
109
|
+
#### `Journaled.default_stream_name`
|
|
95
110
|
|
|
96
111
|
This is described in the "Installation" section above, and is used to specify which stream name to use.
|
|
97
112
|
|
data/Rakefile
CHANGED
|
@@ -14,8 +14,7 @@ module Journaled
|
|
|
14
14
|
raise KinesisTemporaryFailure
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def perform(*events
|
|
18
|
-
events << legacy_kwargs if legacy_kwargs.present?
|
|
17
|
+
def perform(*events)
|
|
19
18
|
@kinesis_records = events.map { |e| KinesisRecord.new(**e.delete_if { |_k, v| v.nil? }) }
|
|
20
19
|
|
|
21
20
|
journal! if Journaled.enabled?
|
|
@@ -27,34 +27,32 @@ module Journaled::Changes
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
#delete aborted by Journaled::Changes.
|
|
30
|
+
def delete(force: false)
|
|
31
|
+
if force || self.class.journaled_attribute_names.empty?
|
|
32
|
+
super()
|
|
33
|
+
else
|
|
34
|
+
raise(<<~ERROR)
|
|
35
|
+
#delete aborted by Journaled::Changes.
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
end
|
|
37
|
+
Call #destroy instead to ensure journaling or invoke #delete(force: true)
|
|
38
|
+
to override and skip journaling.
|
|
39
|
+
ERROR
|
|
42
40
|
end
|
|
41
|
+
end
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
def update_columns(attributes, opts = { force: false })
|
|
44
|
+
unless opts[:force] || self.class.journaled_attribute_names.empty?
|
|
45
|
+
conflicting_journaled_attribute_names = self.class.journaled_attribute_names & attributes.keys.map(&:to_sym)
|
|
46
|
+
raise(<<~ERROR) if conflicting_journaled_attribute_names.present?
|
|
47
|
+
#update_columns aborted by Journaled::Changes due to journaled attributes:
|
|
49
48
|
|
|
50
|
-
|
|
49
|
+
#{conflicting_journaled_attribute_names.join(', ')}
|
|
51
50
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
end
|
|
56
|
-
super(attributes)
|
|
51
|
+
Call #update instead to ensure journaling or invoke #update_columns
|
|
52
|
+
with additional arg `{ force: true }` to override and skip journaling.
|
|
53
|
+
ERROR
|
|
57
54
|
end
|
|
55
|
+
super(attributes)
|
|
58
56
|
end
|
|
59
57
|
|
|
60
58
|
class_methods do
|
|
@@ -70,18 +68,16 @@ module Journaled::Changes
|
|
|
70
68
|
journaled_enqueue_opts.merge!(enqueue_with)
|
|
71
69
|
end
|
|
72
70
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
.delete aborted by Journaled::Changes.
|
|
71
|
+
def delete(id_or_array, opts = { force: false })
|
|
72
|
+
if opts[:force] || journaled_attribute_names.empty?
|
|
73
|
+
where(primary_key => id_or_array).delete_all(force: true)
|
|
74
|
+
else
|
|
75
|
+
raise(<<~ERROR)
|
|
76
|
+
.delete aborted by Journaled::Changes.
|
|
80
77
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
end
|
|
78
|
+
Call .destroy(id_or_array) instead to ensure journaling or invoke
|
|
79
|
+
.delete(id_or_array, force: true) to override and skip journaling.
|
|
80
|
+
ERROR
|
|
85
81
|
end
|
|
86
82
|
end
|
|
87
83
|
end
|
|
@@ -75,8 +75,7 @@ module Journaled
|
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
def encrypted_column?(key)
|
|
78
|
-
key.to_s.end_with?('_crypt', '_hmac') ||
|
|
79
|
-
(Rails::VERSION::MAJOR >= 7 && record.encrypted_attribute?(key))
|
|
78
|
+
key.to_s.end_with?('_crypt', '_hmac') || record.encrypted_attribute?(key)
|
|
80
79
|
end
|
|
81
80
|
|
|
82
81
|
def filter_params
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
ActiveRecord::Relation.class_eval { prepend Journaled::RelationChangeProtection }
|
|
6
|
-
end
|
|
3
|
+
require 'journaled/relation_change_protection'
|
|
4
|
+
ActiveRecord::Relation.class_eval { prepend Journaled::RelationChangeProtection }
|
data/lib/journaled/audit_log.rb
CHANGED
|
@@ -39,7 +39,7 @@ module Journaled
|
|
|
39
39
|
class << self
|
|
40
40
|
def exclude_classes!
|
|
41
41
|
excluded_classes.each do |name|
|
|
42
|
-
if Rails
|
|
42
|
+
if Rails.autoloaders.zeitwerk_enabled?
|
|
43
43
|
zeitwerk_exclude!(name)
|
|
44
44
|
else
|
|
45
45
|
classic_exclude!(name)
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
module Journaled::RelationChangeProtection
|
|
4
4
|
def update_all(updates, opts = { force: false }) # rubocop:disable Metrics/AbcSize
|
|
5
|
-
unless opts[:force] ||
|
|
5
|
+
unless opts[:force] || !model.respond_to?(:journaled_attribute_names) || model.journaled_attribute_names.empty?
|
|
6
6
|
conflicting_journaled_attribute_names = case updates
|
|
7
7
|
when Hash
|
|
8
|
-
|
|
8
|
+
model.journaled_attribute_names & updates.keys.map(&:to_sym)
|
|
9
9
|
when String
|
|
10
|
-
|
|
10
|
+
model.journaled_attribute_names.select do |a|
|
|
11
11
|
updates.match?(/\b(?<!')#{a}(?!')\b/)
|
|
12
12
|
end
|
|
13
13
|
else
|
|
@@ -26,7 +26,7 @@ module Journaled::RelationChangeProtection
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def delete_all(force: false)
|
|
29
|
-
if force ||
|
|
29
|
+
if force || !model.respond_to?(:journaled_attribute_names) || model.journaled_attribute_names.empty?
|
|
30
30
|
super()
|
|
31
31
|
else
|
|
32
32
|
raise(<<~ERROR)
|
data/lib/journaled/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: journaled
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 6.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jake Lipson
|
|
@@ -11,7 +11,7 @@ authors:
|
|
|
11
11
|
autorequire:
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date:
|
|
14
|
+
date: 2025-01-24 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: activejob
|
|
@@ -89,14 +89,20 @@ dependencies:
|
|
|
89
89
|
requirements:
|
|
90
90
|
- - ">="
|
|
91
91
|
- !ruby/object:Gem::Version
|
|
92
|
-
version: '
|
|
92
|
+
version: '7.0'
|
|
93
|
+
- - "<"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '8.1'
|
|
93
96
|
type: :runtime
|
|
94
97
|
prerelease: false
|
|
95
98
|
version_requirements: !ruby/object:Gem::Requirement
|
|
96
99
|
requirements:
|
|
97
100
|
- - ">="
|
|
98
101
|
- !ruby/object:Gem::Version
|
|
99
|
-
version: '
|
|
102
|
+
version: '7.0'
|
|
103
|
+
- - "<"
|
|
104
|
+
- !ruby/object:Gem::Version
|
|
105
|
+
version: '8.1'
|
|
100
106
|
- !ruby/object:Gem::Dependency
|
|
101
107
|
name: appraisal
|
|
102
108
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -181,20 +187,6 @@ dependencies:
|
|
|
181
187
|
- - ">="
|
|
182
188
|
- !ruby/object:Gem::Version
|
|
183
189
|
version: '0'
|
|
184
|
-
- !ruby/object:Gem::Dependency
|
|
185
|
-
name: sqlite3
|
|
186
|
-
requirement: !ruby/object:Gem::Requirement
|
|
187
|
-
requirements:
|
|
188
|
-
- - "~>"
|
|
189
|
-
- !ruby/object:Gem::Version
|
|
190
|
-
version: '1.4'
|
|
191
|
-
type: :development
|
|
192
|
-
prerelease: false
|
|
193
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
194
|
-
requirements:
|
|
195
|
-
- - "~>"
|
|
196
|
-
- !ruby/object:Gem::Version
|
|
197
|
-
version: '1.4'
|
|
198
190
|
- !ruby/object:Gem::Dependency
|
|
199
191
|
name: timecop
|
|
200
192
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -312,14 +304,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
312
304
|
requirements:
|
|
313
305
|
- - ">="
|
|
314
306
|
- !ruby/object:Gem::Version
|
|
315
|
-
version: '2
|
|
307
|
+
version: '3.2'
|
|
316
308
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
317
309
|
requirements:
|
|
318
310
|
- - ">="
|
|
319
311
|
- !ruby/object:Gem::Version
|
|
320
312
|
version: '0'
|
|
321
313
|
requirements: []
|
|
322
|
-
rubygems_version: 3.5.
|
|
314
|
+
rubygems_version: 3.5.23
|
|
323
315
|
signing_key:
|
|
324
316
|
specification_version: 4
|
|
325
317
|
summary: Journaling for Betterment apps.
|