Module: Smith::Models::ProviderQualifiedRegistry

Included in:
Smith::Models
Defined in:
lib/smith/models/provider_qualified_registry.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(registry) ⇒ Object



8
9
10
11
# File 'lib/smith/models/provider_qualified_registry.rb', line 8

def self.extended(registry)
  registry.instance_variable_set(:@registry_monitor, Monitor.new)
  registry.instance_variable_set(:@registry_index, {})
end

Instance Method Details

#allObject



39
40
41
42
43
44
45
# File 'lib/smith/models/provider_qualified_registry.rb', line 39

def all
  registry_monitor.synchronize do
    keys.map { |key| resolve(key) }.sort_by do |profile|
      [profile.model_id, profile.provider.to_s]
    end
  end
end

#clear!Object



47
48
49
50
51
52
# File 'lib/smith/models/provider_qualified_registry.rb', line 47

def clear!
  registry_monitor.synchronize do
    @_container&.clear
    @registry_index = {}
  end
end

#find(model_id, provider: nil) ⇒ Object



13
14
15
16
17
18
19
20
21
# File 'lib/smith/models/provider_qualified_registry.rb', line 13

def find(model_id, provider: nil)
  registry_monitor.synchronize do
    registered_keys = registered_keys_for(model_id, provider:)
    return nil if registered_keys.empty?

    reject_ambiguous_lookup!(model_id, registered_keys)
    resolve(registered_keys.first)
  end
end

#register(profile) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/smith/models/provider_qualified_registry.rb', line 23

def register(profile)
  registry_monitor.synchronize do
    profile = normalized_profile(profile)
    key = registry_key(profile.model_id, profile.provider)
    existing = key?(key) ? resolve(key) : nil

    return profile if existing == profile

    raise_collision!(key, existing, profile) if existing

    super(key, profile)
    index_profile(profile, key)
    profile
  end
end