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



1698
1699
1700
# File 'lib/kettle/jem.rb', line 1698

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

.load!(plugin_names:) ⇒ Object



1660
1661
1662
1663
1664
1665
# File 'lib/kettle/jem.rb', line 1660

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



1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
# File 'lib/kettle/jem.rb', line 1667

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



1683
1684
1685
# File 'lib/kettle/jem.rb', line 1683

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



1691
1692
1693
1694
1695
1696
# File 'lib/kettle/jem.rb', line 1691

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



1687
1688
1689
# File 'lib/kettle/jem.rb', line 1687

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