lex-synapse 0.4.2 → 0.4.3

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: 0fd3abbde7ec695013ddfe41801f8da65b8513f87fb6bc7e2648238728f5d19a
4
- data.tar.gz: 67081b1e1ffb5b043f5c5123788d81289b01760a23626e220571fff8799a6c7f
3
+ metadata.gz: 8344eb31eac2aa068d8d33f98797e7e35c19d02a2fe1aac8abf612e17bdd05e5
4
+ data.tar.gz: ccd61928b4c8bf0e2f94fdfa06c1f568c59e07ad00767f1c82baea823d7924c3
5
5
  SHA512:
6
- metadata.gz: 3aa579de0a149d2c9e75725b8b444d387130e39c870d61bc6e6c5740ade2d55867f5642bd1da354d156db74f01f20e6ab8e5284fd565150c5eb227c34277d0e6
7
- data.tar.gz: ce0f497bc6eb45c32a45ae1be1adb56feac5ac43574ae53ab0fa9b44546e6c336fd8dfe1b99fa330f98f265b920a70eef0d1d564cfb0eb147737779535846801
6
+ metadata.gz: 37f95b2688000a6ef9219fc0e1de0708d12719b2df5d4043888e3b8e8cd1cde4a6daca0e0ff7967496218b500fb0660b4b534200784460d524faf33f9d83b9f5
7
+ data.tar.gz: f8b9c2ff7130b61ed862a958d96fe236f0aecfeafe4f18429ea6d4c6d2fa7997c24d759d3227764fc633fb11e062779f90237d7e90681563c6a9fc897a04a837
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.3] - 2026-03-22
4
+
5
+ ### Fixed
6
+ - Race condition in lazy model definition: concurrent threads could both pass `const_defined?` before either called `const_set`, producing "already initialized constant" warnings. Added shared mutex to all 5 `define_*_model` methods.
7
+
3
8
  ## [0.4.2] - 2026-03-22
4
9
 
5
10
  ### Fixed
@@ -5,23 +5,27 @@ module Legion
5
5
  module Synapse
6
6
  module Data
7
7
  module Model
8
+ @define_mutex = Mutex.new
9
+
8
10
  def self.define_synapse_model
9
- return if const_defined?(:Synapse, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
+ @define_mutex.synchronize do
12
+ return if const_defined?(:Synapse, false)
13
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
14
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapses)
15
+ db = Sequel::Model.db
16
+ return unless db&.table_exists?(:synapses)
14
17
 
15
- klass = Class.new(Sequel::Model(:synapses)) do
16
- one_to_many :mutations, class: 'Legion::Extensions::Synapse::Data::Model::SynapseMutation',
17
- key: :synapse_id
18
- one_to_many :signals, class: 'Legion::Extensions::Synapse::Data::Model::SynapseSignal',
19
- key: :synapse_id
20
- one_to_many :proposals, class: 'Legion::Extensions::Synapse::Data::Model::SynapseProposal',
21
- key: :synapse_id
18
+ klass = Class.new(Sequel::Model(:synapses)) do
19
+ one_to_many :mutations, class: 'Legion::Extensions::Synapse::Data::Model::SynapseMutation',
20
+ key: :synapse_id
21
+ one_to_many :signals, class: 'Legion::Extensions::Synapse::Data::Model::SynapseSignal',
22
+ key: :synapse_id
23
+ one_to_many :proposals, class: 'Legion::Extensions::Synapse::Data::Model::SynapseProposal',
24
+ key: :synapse_id
25
+ end
26
+ klass.set_primary_key :id
27
+ const_set(:Synapse, klass)
22
28
  end
23
- klass.set_primary_key :id
24
- const_set(:Synapse, klass)
25
29
  end
26
30
  end
27
31
  end
@@ -6,18 +6,20 @@ module Legion
6
6
  module Data
7
7
  module Model
8
8
  def self.define_synapse_challenge_model
9
- return if const_defined?(:SynapseChallenge, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
9
+ @define_mutex.synchronize do
10
+ return if const_defined?(:SynapseChallenge, false)
11
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
12
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapse_challenges)
13
+ db = Sequel::Model.db
14
+ return unless db&.table_exists?(:synapse_challenges)
14
15
 
15
- klass = Class.new(Sequel::Model(:synapse_challenges)) do
16
- many_to_one :proposal, class: 'Legion::Extensions::Synapse::Data::Model::SynapseProposal',
17
- key: :proposal_id
16
+ klass = Class.new(Sequel::Model(:synapse_challenges)) do
17
+ many_to_one :proposal, class: 'Legion::Extensions::Synapse::Data::Model::SynapseProposal',
18
+ key: :proposal_id
19
+ end
20
+ klass.set_primary_key :id
21
+ const_set(:SynapseChallenge, klass)
18
22
  end
19
- klass.set_primary_key :id
20
- const_set(:SynapseChallenge, klass)
21
23
  end
22
24
  end
23
25
  end
@@ -6,18 +6,20 @@ module Legion
6
6
  module Data
7
7
  module Model
8
8
  def self.define_synapse_mutation_model
9
- return if const_defined?(:SynapseMutation, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
9
+ @define_mutex.synchronize do
10
+ return if const_defined?(:SynapseMutation, false)
11
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
12
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapse_mutations)
13
+ db = Sequel::Model.db
14
+ return unless db&.table_exists?(:synapse_mutations)
14
15
 
15
- klass = Class.new(Sequel::Model(:synapse_mutations)) do
16
- many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
17
- key: :synapse_id
16
+ klass = Class.new(Sequel::Model(:synapse_mutations)) do
17
+ many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
18
+ key: :synapse_id
19
+ end
20
+ klass.set_primary_key :id
21
+ const_set(:SynapseMutation, klass)
18
22
  end
19
- klass.set_primary_key :id
20
- const_set(:SynapseMutation, klass)
21
23
  end
22
24
  end
23
25
  end
@@ -6,18 +6,20 @@ module Legion
6
6
  module Data
7
7
  module Model
8
8
  def self.define_synapse_proposal_model
9
- return if const_defined?(:SynapseProposal, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
9
+ @define_mutex.synchronize do
10
+ return if const_defined?(:SynapseProposal, false)
11
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
12
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapse_proposals)
13
+ db = Sequel::Model.db
14
+ return unless db&.table_exists?(:synapse_proposals)
14
15
 
15
- klass = Class.new(Sequel::Model(:synapse_proposals)) do
16
- many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
17
- key: :synapse_id
16
+ klass = Class.new(Sequel::Model(:synapse_proposals)) do
17
+ many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
18
+ key: :synapse_id
19
+ end
20
+ klass.set_primary_key :id
21
+ const_set(:SynapseProposal, klass)
18
22
  end
19
- klass.set_primary_key :id
20
- const_set(:SynapseProposal, klass)
21
23
  end
22
24
  end
23
25
  end
@@ -6,18 +6,20 @@ module Legion
6
6
  module Data
7
7
  module Model
8
8
  def self.define_synapse_signal_model
9
- return if const_defined?(:SynapseSignal, false)
10
- return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
9
+ @define_mutex.synchronize do
10
+ return if const_defined?(:SynapseSignal, false)
11
+ return unless defined?(Legion::Data) && Legion::Settings.dig(:data, :connected)
11
12
 
12
- db = Sequel::Model.db
13
- return unless db&.table_exists?(:synapse_signals)
13
+ db = Sequel::Model.db
14
+ return unless db&.table_exists?(:synapse_signals)
14
15
 
15
- klass = Class.new(Sequel::Model(:synapse_signals)) do
16
- many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
17
- key: :synapse_id
16
+ klass = Class.new(Sequel::Model(:synapse_signals)) do
17
+ many_to_one :synapse, class: 'Legion::Extensions::Synapse::Data::Model::Synapse',
18
+ key: :synapse_id
19
+ end
20
+ klass.set_primary_key :id
21
+ const_set(:SynapseSignal, klass)
18
22
  end
19
- klass.set_primary_key :id
20
- const_set(:SynapseSignal, klass)
21
23
  end
22
24
  end
23
25
  end
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Synapse
6
- VERSION = '0.4.2'
6
+ VERSION = '0.4.3'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-synapse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity