journaled 5.3.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 519a94ed5c16626bdd0d6494b510eb1768a86e1f04119857fd8add4b7d6ea5f5
4
- data.tar.gz: 3f675a229c45fc08b71181be5d6934b44eea9e849a7bfeebabec553721833587
3
+ metadata.gz: cdfecf071b843818742d6fedc649d57e793e9abbd18906b09245124327ac4705
4
+ data.tar.gz: d92147f78529cbdbeeed3216c4ab14d0cfbcad9d716f3bff4a3f8b6af99c99e7
5
5
  SHA512:
6
- metadata.gz: 0a1d76ef86b435424e0902dc499cc9f9984450da09f0783129d831fc62b4d31bf30651cc0d8cb074592887b12c3eba335f3d5580d22e6e398e1729e4ffa6e1ca
7
- data.tar.gz: 93ddf98e9813da2bed0939aeb522806e5707d4f8563a46d595398e3edc8485b802c776cc14b95f3ec44e3aeb0eea25cc460d2b1b6cd3f9af84ac3f4a55e166cc
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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Journaled::Actor
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Journaled
2
4
  class ApplicationJob < Journaled.job_base_class_name.constantize
3
5
  end
@@ -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'.freeze
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, **legacy_kwargs)
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
- if Rails::VERSION::MAJOR > 5 || (Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR >= 2)
29
- def delete(force: false)
30
- if force || self.class.journaled_attribute_names.empty?
31
- super()
32
- else
33
- raise(<<~ERROR)
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
- Call #destroy instead to ensure journaling or invoke #delete(force: true)
37
- to override and skip journaling.
38
- ERROR
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
- def update_columns(attributes, opts = { force: false })
43
- unless opts[:force] || self.class.journaled_attribute_names.empty?
44
- conflicting_journaled_attribute_names = self.class.journaled_attribute_names & attributes.keys.map(&:to_sym)
45
- raise(<<~ERROR) if conflicting_journaled_attribute_names.present?
46
- #update_columns aborted by Journaled::Changes due to journaled attributes:
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
- #{conflicting_journaled_attribute_names.join(', ')}
49
+ #{conflicting_journaled_attribute_names.join(', ')}
49
50
 
50
- Call #update instead to ensure journaling or invoke #update_columns
51
- with additional arg `{ force: true }` to override and skip journaling.
52
- ERROR
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
- if Rails::VERSION::MAJOR > 5 || (Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR >= 2)
72
- def delete(id_or_array, opts = { force: false })
73
- if opts[:force] || journaled_attribute_names.empty?
74
- where(primary_key => id_or_array).delete_all(force: true)
75
- else
76
- raise(<<~ERROR)
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
- Call .destroy(id_or_array) instead to ensure journaling or invoke
80
- .delete(id_or_array, force: true) to override and skip journaling.
81
- ERROR
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
  class Journaled::ActorUriProvider
2
4
  include Singleton
3
5
 
@@ -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.each do |key, _value|
87
+ attrs.each_key do |key|
87
88
  attrs[key] = '[FILTERED]' if filter_key?(key)
88
89
  end
89
90
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Journaled::Change
2
4
  include Journaled::Event
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Journaled::ChangeDefinition
2
4
  attr_reader :attribute_names, :logical_operation
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Journaled::ChangeWriter
2
4
  attr_reader :model, :change_definition
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Journaled::Event
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Journaled::JsonSchemaModel::Validator
2
4
  def initialize(schema_name)
3
5
  @schema_name = schema_name
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Journaled::NotTrulyExceptionalError < RuntimeError
2
4
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Journaled::Writer
2
4
  EVENT_METHOD_NAMES = %i(
3
5
  journaled_schema_name
@@ -1,4 +1,4 @@
1
- if Rails::VERSION::MAJOR > 5 || (Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR >= 2)
2
- require 'journaled/relation_change_protection'
3
- ActiveRecord::Relation.class_eval { prepend Journaled::RelationChangeProtection }
4
- end
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
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Spring.application_root = './spec/dummy'
@@ -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 = %w(
8
- Delayed::Job
9
- PaperTrail::Version
10
- ActiveStorage::Attachment
11
- ActiveStorage::Blob
12
- ActiveRecord::InternalMetadata
13
- ActiveRecord::SchemaMigration
14
- ).freeze
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::VERSION::MAJOR >= 6 && Rails.autoloaders.zeitwerk_enabled?
42
+ if Rails.autoloaders.zeitwerk_enabled?
29
43
  zeitwerk_exclude!(name)
30
44
  else
31
45
  classic_exclude!(name)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Journaled
2
4
  module Connection
3
5
  class << self
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Journaled
2
4
  class Current < ActiveSupport::CurrentAttributes
3
5
  attribute :tags
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Journaled
2
4
  class Engine < ::Rails::Engine
3
5
  config.after_initialize do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Journaled
2
4
  class TransactionSafetyError < StandardError; end
3
5
  end
@@ -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] || !@klass.respond_to?(:journaled_attribute_names) || @klass.journaled_attribute_names.empty?
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
- @klass.journaled_attribute_names & updates.keys.map(&:to_sym)
8
+ model.journaled_attribute_names & updates.keys.map(&:to_sym)
7
9
  when String
8
- @klass.journaled_attribute_names.select do |a|
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 || !@klass.respond_to?(:journaled_attribute_names) || @klass.journaled_attribute_names.empty?
29
+ if force || !model.respond_to?(:journaled_attribute_names) || model.journaled_attribute_names.empty?
28
30
  super()
29
31
  else
30
32
  raise(<<~ERROR)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rspec/expectations'
2
4
 
3
5
  RSpec::Matchers.define :journal_changes_to do |*attribute_names, as:|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_record/connection_adapters/abstract/transaction'
2
4
 
3
5
  module Journaled
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Journaled
2
- VERSION = "5.3.1".freeze
4
+ VERSION = "6.0.0"
3
5
  end
data/lib/journaled.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "aws-sdk-kinesis"
2
4
  require "active_job"
3
5
  require "json-schema"
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: 5.3.1
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: 2023-05-19 00:00:00.000000000 Z
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: '5.2'
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: '5.2'
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.6'
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.3.5
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
+ ...