jetstream_bridge 1.9.0 → 1.10.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: 601869d9b83276fd0e3b6a249dafc1bb7a749ffe6aade556077b60b95eb24124
4
- data.tar.gz: b7ea75cdabb21f5f71d5ff447cd4a449c470a56ff6a3723737895c1cfa260bbc
3
+ metadata.gz: 1fef54e5e8426e80c735e83ef11cf816643af9a0a8c3fac97089239f0b3743a7
4
+ data.tar.gz: 17442379f0f1a984fd89976b814a69752c83ec7efe4cc33602fb2998602999ce
5
5
  SHA512:
6
- metadata.gz: 4de9e146864e60fda36d68380e7bf5485d317d599c689d2594e719c1f71f73da3667d43add5e646289a2e5dc8f4dc93495b2f615b99d90c120d4674684b415fe
7
- data.tar.gz: 4b4f148a4dea6c38c108f84f07bb179e601faf8aec06f01cbf495a6b645e14dc11ce805d69ab7c91dbd747966f6f44866d19a9b429e347617fa06e208b159c8c
6
+ metadata.gz: 690ec24627cce26f73db546832083ed823ef4481451523260daf0d3802376ac999f631f8d56abd5a949d8a942210881b9da8656c0489264328215c5428db26b4
7
+ data.tar.gz: a7d17b77244fe5c3c260dad42c31cba8ddeef4988d96a0722cafc46cf5792d02e91f23332d0873d0230f624a331563652f2928e2219fde1572412dd6a4cca440
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- jetstream_bridge (1.9.0)
4
+ jetstream_bridge (1.10.0)
5
5
  activerecord (>= 6.0)
6
6
  activesupport (>= 6.0)
7
7
  nats-pure (~> 2.4)
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JetstreamBridge
4
+ module ModelCodecSetup
5
+ module_function
6
+
7
+ def apply!
8
+ return unless ar_connected?
9
+
10
+ [JetstreamBridge::OutboxEvent, JetstreamBridge::InboxEvent].each { |k| apply_to(k) }
11
+ end
12
+
13
+ def apply_to(klass)
14
+ return unless table_exists_safely?(klass)
15
+
16
+ %w[payload headers].each do |attr|
17
+ next unless column?(klass, attr)
18
+ next if json_column?(klass, attr) || already_serialized?(klass, attr)
19
+
20
+ klass.serialize attr.to_sym, coder: JSON
21
+ end
22
+ rescue ActiveRecord::StatementInvalid, ActiveRecord::ConnectionNotEstablished, ActiveRecord::NoDatabaseError
23
+ # ignore when schema isn’t available yet
24
+ end
25
+
26
+ # --- helpers ---
27
+
28
+ def ar_connected?
29
+ ActiveRecord::Base.connected?
30
+ rescue StandardError
31
+ false
32
+ end
33
+
34
+ def table_exists_safely?(klass)
35
+ klass.table_exists?
36
+ rescue StandardError
37
+ false
38
+ end
39
+
40
+ def column?(klass, attr)
41
+ klass.columns_hash.key?(attr)
42
+ rescue StandardError
43
+ false
44
+ end
45
+
46
+ def json_column?(klass, attr)
47
+ sql = klass.columns_hash.fetch(attr).sql_type.to_s.downcase
48
+ sql.include?('json') # covers json & jsonb
49
+ rescue StandardError
50
+ false
51
+ end
52
+
53
+ def already_serialized?(klass, attr)
54
+ klass.attribute_types.fetch(attr, nil).is_a?(ActiveRecord::Type::Serialized)
55
+ rescue StandardError
56
+ false
57
+ end
58
+ end
59
+ end
@@ -1,32 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # lib/jetstream_bridge/railtie.rb
3
+ require_relative 'core/model_codec_setup'
4
+
4
5
  module JetstreamBridge
5
6
  class Railtie < ::Rails::Railtie
6
7
  initializer 'jetstream_bridge.defer_model_tweaks' do
7
8
  ActiveSupport.on_load(:active_record) do
8
- ActiveSupport::Reloader.to_prepare do
9
- # Skip if not connected (e.g., non-DB rake tasks)
10
- begin
11
- next unless ActiveRecord::Base.connected?
12
- rescue StandardError
13
- next
14
- end
15
-
16
- [JetstreamBridge::OutboxEvent, JetstreamBridge::InboxEvent].each do |klass|
17
- next unless klass.table_exists?
18
-
19
- %w[payload headers].each do |attr|
20
- next unless klass.columns_hash.key?(attr)
21
-
22
- # Only add serialize if the column is not JSON/JSONB
23
- type = klass.type_for_attribute(attr)
24
- klass.serialize attr.to_sym, coder: JSON unless type&.json?
25
- end
26
- rescue ActiveRecord::StatementInvalid, ActiveRecord::ConnectionNotEstablished
27
- # Ignore in tasks/environments without DB
28
- end
29
- end
9
+ ActiveSupport::Reloader.to_prepare { JetstreamBridge::ModelCodecSetup.apply! }
30
10
  end
31
11
  end
32
12
 
@@ -4,5 +4,5 @@
4
4
  #
5
5
  # Version constant for the gem.
6
6
  module JetstreamBridge
7
- VERSION = '1.9.0'
7
+ VERSION = '1.10.0'
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jetstream_bridge
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Attara
@@ -192,6 +192,7 @@ files:
192
192
  - lib/jetstream_bridge/core/connection.rb
193
193
  - lib/jetstream_bridge/core/duration.rb
194
194
  - lib/jetstream_bridge/core/logging.rb
195
+ - lib/jetstream_bridge/core/model_codec_setup.rb
195
196
  - lib/jetstream_bridge/core/model_utils.rb
196
197
  - lib/jetstream_bridge/models/inbox_event.rb
197
198
  - lib/jetstream_bridge/models/outbox_event.rb