Module: Kettle::Jem::PluginLoader

Defined in:
lib/kettle/jem.rb

Constant Summary collapse

REGISTRATION_METHOD =
:register_kettle_jem_plugin

Class Method Summary collapse

Class Method Details

.camelize(value) ⇒ Object



1641
1642
1643
# File 'lib/kettle/jem.rb', line 1641

def camelize(value)
  value.to_s.split("_").map(&:capitalize).join
end

.load!(plugin_names:) ⇒ Object



1603
1604
1605
1606
1607
1608
# File 'lib/kettle/jem.rb', line 1603

def load!(plugin_names:)
  names = normalize_plugin_names(plugin_names)
  registry = PluginRegistry.new(configured_plugins: names, loaded_plugins: names)
  names.each { |plugin_name| load_plugin!(plugin_name, registry: registry) }
  registry
end

.load_plugin!(plugin_name, registry:) ⇒ Object



1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
# File 'lib/kettle/jem.rb', line 1610

def load_plugin!(plugin_name, registry:)
  # Plugins are apply-time main-Ractor extensions; workers receive reports, not plugin callbacks.
  require(plugin_require_path(plugin_name))
  handle = plugin_handle(plugin_name)
  unless handle.respond_to?(REGISTRATION_METHOD)
    raise Error, "Plugin #{plugin_name.inspect} does not implement #{REGISTRATION_METHOD}."
  end

  handle.public_send(
    REGISTRATION_METHOD,
    PluginRegistrar.new(plugin_name: plugin_name, registry: registry)
  )
rescue LoadError => e
  raise Error, "Could not load plugin #{plugin_name.inspect}: #{e.message}"
end

.normalize_plugin_names(plugin_names) ⇒ Object



1626
1627
1628
# File 'lib/kettle/jem.rb', line 1626

def normalize_plugin_names(plugin_names)
  Array(plugin_names).flatten.map { |name| name.to_s.strip }.reject(&:empty?).uniq
end

.plugin_handle(plugin_name) ⇒ Object



1634
1635
1636
1637
1638
1639
# File 'lib/kettle/jem.rb', line 1634

def plugin_handle(plugin_name)
  constant_name = plugin_name.to_s.split("-").map { |part| camelize(part) }.join("::")
  constant_name.split("::").inject(Object) { |scope, name| scope.const_get(name) }
rescue NameError => e
  raise Error, "Could not resolve plugin handle for #{plugin_name.inspect}: #{e.message}"
end

.plugin_require_path(plugin_name) ⇒ Object



1630
1631
1632
# File 'lib/kettle/jem.rb', line 1630

def plugin_require_path(plugin_name)
  plugin_name.to_s.tr("-", "/")
end