journaled 5.3.1 → 6.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 +16 -1
- data/Rakefile +5 -0
- data/app/controllers/concerns/journaled/actor.rb +2 -0
- data/app/jobs/journaled/application_job.rb +2 -0
- data/app/jobs/journaled/delivery_job.rb +4 -3
- data/app/models/concerns/journaled/changes.rb +31 -33
- data/app/models/journaled/actor_uri_provider.rb +2 -0
- data/app/models/journaled/audit_log/event.rb +4 -3
- data/app/models/journaled/change.rb +2 -0
- data/app/models/journaled/change_definition.rb +2 -0
- data/app/models/journaled/change_writer.rb +2 -0
- data/app/models/journaled/event.rb +2 -0
- data/app/models/journaled/json_schema_model/validator.rb +2 -0
- data/app/models/journaled/not_truly_exceptional_error.rb +2 -0
- data/app/models/journaled/writer.rb +2 -0
- data/config/initializers/change_protection.rb +4 -4
- data/config/spring.rb +2 -0
- data/lib/journaled/audit_log.rb +23 -9
- data/lib/journaled/connection.rb +2 -0
- data/lib/journaled/current.rb +2 -0
- data/lib/journaled/engine.rb +2 -0
- data/lib/journaled/errors.rb +2 -0
- data/lib/journaled/relation_change_protection.rb +6 -4
- data/lib/journaled/rspec.rb +2 -0
- data/lib/journaled/transaction_ext.rb +2 -0
- data/lib/journaled/version.rb +3 -1
- data/lib/journaled.rb +2 -0
- metadata +15 -22
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
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
begin
|
2
4
|
require 'bundler/setup'
|
3
5
|
rescue LoadError
|
@@ -6,6 +8,9 @@ end
|
|
6
8
|
|
7
9
|
Bundler::GemHelper.install_tasks
|
8
10
|
|
11
|
+
APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
|
12
|
+
load 'rails/tasks/engine.rake'
|
13
|
+
|
9
14
|
require 'rubocop/rake_task'
|
10
15
|
RuboCop::RakeTask.new
|
11
16
|
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Journaled
|
2
4
|
class DeliveryJob < ApplicationJob
|
3
|
-
DEFAULT_REGION = 'us-east-1'
|
5
|
+
DEFAULT_REGION = 'us-east-1'
|
4
6
|
|
5
7
|
rescue_from(Aws::Kinesis::Errors::InternalFailure, Aws::Kinesis::Errors::ServiceUnavailable, Aws::Kinesis::Errors::Http503Error) do |e|
|
6
8
|
Rails.logger.error "Kinesis Error - Server Error occurred - #{e.class}"
|
@@ -12,8 +14,7 @@ module Journaled
|
|
12
14
|
raise KinesisTemporaryFailure
|
13
15
|
end
|
14
16
|
|
15
|
-
def perform(*events
|
16
|
-
events << legacy_kwargs if legacy_kwargs.present?
|
17
|
+
def perform(*events)
|
17
18
|
@kinesis_records = events.map { |e| KinesisRecord.new(**e.delete_if { |_k, v| v.nil? }) }
|
18
19
|
|
19
20
|
journal! if Journaled.enabled?
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Journaled::Changes
|
2
4
|
extend ActiveSupport::Concern
|
3
5
|
|
@@ -25,34 +27,32 @@ module Journaled::Changes
|
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
#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.
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
37
|
+
Call #destroy instead to ensure journaling or invoke #delete(force: true)
|
38
|
+
to override and skip journaling.
|
39
|
+
ERROR
|
40
40
|
end
|
41
|
+
end
|
41
42
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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:
|
47
48
|
|
48
|
-
|
49
|
+
#{conflicting_journaled_attribute_names.join(', ')}
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
54
|
-
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
|
55
54
|
end
|
55
|
+
super(attributes)
|
56
56
|
end
|
57
57
|
|
58
58
|
class_methods do
|
@@ -68,18 +68,16 @@ module Journaled::Changes
|
|
68
68
|
journaled_enqueue_opts.merge!(enqueue_with)
|
69
69
|
end
|
70
70
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
.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.
|
78
77
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
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
|
83
81
|
end
|
84
82
|
end
|
85
83
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# FIXME: This cannot be included in lib/ because Journaled::Event is autoloaded via app/models
|
2
4
|
# Autoloading Journaled::Event isn't strictly necessary, and for compatibility it would
|
3
5
|
# make sense to move it to lib/.
|
@@ -73,8 +75,7 @@ module Journaled
|
|
73
75
|
end
|
74
76
|
|
75
77
|
def encrypted_column?(key)
|
76
|
-
key.to_s.end_with?('_crypt', '_hmac') ||
|
77
|
-
(Rails::VERSION::MAJOR >= 7 && record.encrypted_attribute?(key))
|
78
|
+
key.to_s.end_with?('_crypt', '_hmac') || record.encrypted_attribute?(key)
|
78
79
|
end
|
79
80
|
|
80
81
|
def filter_params
|
@@ -83,7 +84,7 @@ module Journaled
|
|
83
84
|
|
84
85
|
def filtered_attributes
|
85
86
|
attrs = record.attributes.dup.symbolize_keys
|
86
|
-
attrs.
|
87
|
+
attrs.each_key do |key|
|
87
88
|
attrs[key] = '[FILTERED]' if filter_key?(key)
|
88
89
|
end
|
89
90
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'journaled/relation_change_protection'
|
4
|
+
ActiveRecord::Relation.class_eval { prepend Journaled::RelationChangeProtection }
|
data/config/spring.rb
CHANGED
data/lib/journaled/audit_log.rb
CHANGED
@@ -1,17 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/core_ext/module/attribute_accessors_per_thread'
|
2
4
|
|
3
5
|
module Journaled
|
4
6
|
module AuditLog
|
5
7
|
extend ActiveSupport::Concern
|
6
8
|
|
7
|
-
DEFAULT_EXCLUDED_CLASSES =
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
DEFAULT_EXCLUDED_CLASSES =
|
10
|
+
if Gem::Version.new(Rails.version) < Gem::Version.new('7.1')
|
11
|
+
%w(
|
12
|
+
Delayed::Job
|
13
|
+
PaperTrail::Version
|
14
|
+
ActiveStorage::Attachment
|
15
|
+
ActiveStorage::Blob
|
16
|
+
ActiveRecord::InternalMetadata
|
17
|
+
ActiveRecord::SchemaMigration
|
18
|
+
)
|
19
|
+
else
|
20
|
+
# ActiveRecord::InternalMetadata and SchemaMigration do not inherit from
|
21
|
+
# ActiveRecord::Base in Rails 7.1 so we do not need to exclude them.
|
22
|
+
%w(
|
23
|
+
Delayed::Job
|
24
|
+
PaperTrail::Version
|
25
|
+
ActiveStorage::Attachment
|
26
|
+
ActiveStorage::Blob
|
27
|
+
)
|
28
|
+
end.freeze
|
15
29
|
|
16
30
|
mattr_accessor(:default_ignored_columns) { %i(created_at updated_at) }
|
17
31
|
mattr_accessor(:default_stream_name) { Journaled.default_stream_name }
|
@@ -25,7 +39,7 @@ module Journaled
|
|
25
39
|
class << self
|
26
40
|
def exclude_classes!
|
27
41
|
excluded_classes.each do |name|
|
28
|
-
if Rails
|
42
|
+
if Rails.autoloaders.zeitwerk_enabled?
|
29
43
|
zeitwerk_exclude!(name)
|
30
44
|
else
|
31
45
|
classic_exclude!(name)
|
data/lib/journaled/connection.rb
CHANGED
data/lib/journaled/current.rb
CHANGED
data/lib/journaled/engine.rb
CHANGED
data/lib/journaled/errors.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Journaled::RelationChangeProtection
|
2
4
|
def update_all(updates, opts = { force: false }) # rubocop:disable Metrics/AbcSize
|
3
|
-
unless opts[:force] ||
|
5
|
+
unless opts[:force] || !model.respond_to?(:journaled_attribute_names) || model.journaled_attribute_names.empty?
|
4
6
|
conflicting_journaled_attribute_names = case updates
|
5
7
|
when Hash
|
6
|
-
|
8
|
+
model.journaled_attribute_names & updates.keys.map(&:to_sym)
|
7
9
|
when String
|
8
|
-
|
10
|
+
model.journaled_attribute_names.select do |a|
|
9
11
|
updates.match?(/\b(?<!')#{a}(?!')\b/)
|
10
12
|
end
|
11
13
|
else
|
@@ -24,7 +26,7 @@ module Journaled::RelationChangeProtection
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def delete_all(force: false)
|
27
|
-
if force ||
|
29
|
+
if force || !model.respond_to?(:journaled_attribute_names) || model.journaled_attribute_names.empty?
|
28
30
|
super()
|
29
31
|
else
|
30
32
|
raise(<<~ERROR)
|
data/lib/journaled/rspec.rb
CHANGED
data/lib/journaled/version.rb
CHANGED
data/lib/journaled.rb
CHANGED
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
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
|
8
8
|
- Corey Alexander
|
9
9
|
- Cyrus Eslami
|
10
10
|
- John Mileham
|
11
|
-
autorequire:
|
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: '0'
|
191
|
-
type: :development
|
192
|
-
prerelease: false
|
193
|
-
version_requirements: !ruby/object:Gem::Requirement
|
194
|
-
requirements:
|
195
|
-
- - ">="
|
196
|
-
- !ruby/object:Gem::Version
|
197
|
-
version: '0'
|
198
190
|
- !ruby/object:Gem::Dependency
|
199
191
|
name: timecop
|
200
192
|
requirement: !ruby/object:Gem::Requirement
|
@@ -312,15 +304,16 @@ 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.
|
323
|
-
signing_key:
|
314
|
+
rubygems_version: 3.5.23
|
315
|
+
signing_key:
|
324
316
|
specification_version: 4
|
325
317
|
summary: Journaling for Betterment apps.
|
326
318
|
test_files: []
|
319
|
+
...
|