Class: Braintrust::Contrib::Registry

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/braintrust/contrib/registry.rb

Overview

Thread-safe singleton registry for integrations. Provides registration, lookup, and require-path mapping for auto-instrumentation.

Instance Method Summary collapse

Constructor Details

#initializeRegistry

Returns a new instance of Registry.



12
13
14
15
16
# File 'lib/braintrust/contrib/registry.rb', line 12

def initialize
  @integrations = {}
  @require_path_map = nil # Lazy cache
  @mutex = Mutex.new
end

Instance Method Details

#[](name) ⇒ Class?

Look up an integration by name.

Parameters:

  • name (Symbol, String)

    The integration name

Returns:

  • (Class, nil)

    The integration class, or nil if not found



30
31
32
# File 'lib/braintrust/contrib/registry.rb', line 30

def [](name)
  @integrations[name.to_sym]
end

#allArray<Class>

Get all registered integrations.

Returns:

  • (Array<Class>)

    All registered integration classes



36
37
38
# File 'lib/braintrust/contrib/registry.rb', line 36

def all
  @integrations.values
end

#availableArray<Class>

Get all available integrations (target library is loaded).

Returns:

  • (Array<Class>)

    Available integration classes



42
43
44
# File 'lib/braintrust/contrib/registry.rb', line 42

def available
  @integrations.values.select(&:available?)
end

#each {|Class| ... } ⇒ Object

Iterate over all registered integrations.

Yields:

  • (Class)

    Each registered integration class



48
49
50
# File 'lib/braintrust/contrib/registry.rb', line 48

def each(&block)
  @integrations.values.each(&block)
end

#integrations_for_require_path(path) ⇒ Array<Class>

Returns integrations associated with a require path. Thread-safe with double-checked locking for performance.

Parameters:

  • path (String)

    The require path (e.g., “openai”, “anthropic”)

Returns:

  • (Array<Class>)

    Integrations matching the require path



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/braintrust/contrib/registry.rb', line 56

def integrations_for_require_path(path)
  map = @require_path_map
  if map.nil?
    map = @mutex.synchronize do
      @require_path_map ||= build_require_path_map
    end
  end

  path_str = path.to_s
  basename = File.basename(path_str, ".rb")

  # Quick check: is this basename even in our map?
  return EMPTY_ARRAY unless map.key?(basename)

  # Only match top-level requires or gem entry points.
  # Avoid matching internal subpaths (e.g., ruby_llm/providers/anthropic).
  return EMPTY_ARRAY unless gem_entry_point?(path_str, basename)

  map.fetch(basename, EMPTY_ARRAY)
end

#register(integration_class) ⇒ Object

Register an integration class with the registry.

Parameters:

  • integration_class (Class)

    The integration class to register



20
21
22
23
24
25
# File 'lib/braintrust/contrib/registry.rb', line 20

def register(integration_class)
  @mutex.synchronize do
    @integrations[integration_class.integration_name] = integration_class
    @require_path_map = nil # Invalidate cache
  end
end