Module: Smith::Agent::Registry

Extended by:
Dry::Container::Mixin, Introspection
Defined in:
lib/smith/agent/registry.rb,
lib/smith/agent/registry/introspection.rb

Defined Under Namespace

Modules: Introspection

Class Method Summary collapse

Methods included from Introspection

binding_for, bindings

Class Method Details

.clear!Object



36
37
38
39
40
# File 'lib/smith/agent/registry.rb', line 36

def self.clear!
  registry_monitor.synchronize do
    @_container&.clear
  end
end

.delete(name) ⇒ Object



30
31
32
33
34
# File 'lib/smith/agent/registry.rb', line 30

def self.delete(name)
  registry_monitor.synchronize do
    _container.delete(normalize_key(name))
  end
end

.ensure_registered(name, klass) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/smith/agent/registry.rb', line 42

def self.ensure_registered(name, klass)
  validate_agent_class!(klass)
  key = normalize_key(name)

  registry_monitor.synchronize do
    existing = registered_binding(key)

    if existing.nil?
      register_unchecked!(key, klass)
    elsif existing.equal?(klass)
      # same object — no-op
    elsif stale_reload_binding?(existing, klass)
      # same class name, different object — Rails reload case
      _container.delete(key)
      register_unchecked!(key, klass)
    else
      raise Smith::AgentRegistryError,
            "agent registry collision for key #{key.inspect}: " \
            "already registered to #{binding_label(existing)}, " \
            "cannot replace with #{binding_label(klass)}"
    end

    klass
  end
end

.fetch!(name, workflow_class: nil, transition_name: nil, role: :agent) ⇒ Object



68
69
70
71
72
73
74
75
76
# File 'lib/smith/agent/registry.rb', line 68

def self.fetch!(name, workflow_class: nil, transition_name: nil, role: :agent)
  registry_monitor.synchronize do
    key = normalize_key(name)
    binding = registered_binding(key)
    return binding if binding

    raise Smith::WorkflowError, "unresolved #{role} :#{key}#{fetch_suffix(workflow_class, transition_name)}"
  end
end

.find(name) ⇒ Object



16
17
18
19
20
# File 'lib/smith/agent/registry.rb', line 16

def self.find(name)
  registry_monitor.synchronize do
    registered_binding(normalize_key(name))
  end
end

.normalize_key(name) ⇒ Object



12
13
14
# File 'lib/smith/agent/registry.rb', line 12

def self.normalize_key(name)
  name.to_s
end

.register(key, contents = nil, options = {}, &block) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/smith/agent/registry.rb', line 22

def self.register(key, contents = nil, options = {}, &block)
  if block_given? || !(contents.is_a?(Class) && contents <= Smith::Agent)
    registry_monitor.synchronize { super(key, contents, options, &block) }
  else
    ensure_registered(key, contents)
  end
end

.registry_monitorObject



78
79
80
# File 'lib/smith/agent/registry.rb', line 78

def self.registry_monitor
  @registry_monitor ||= Monitor.new
end

.validate_agent_class!(klass) ⇒ Object



82
83
84
85
86
87
# File 'lib/smith/agent/registry.rb', line 82

def self.validate_agent_class!(klass)
  return if klass.is_a?(Class) && klass <= Smith::Agent

  raise Smith::AgentRegistryError,
        "expected a Smith::Agent subclass, got #{klass.inspect}"
end