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 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
+ ...