Module: Docscribe::Plugin::Registry

Defined in:
lib/docscribe/plugin/registry.rb

Overview

Global plugin registry.

Plugins are registered once at boot time (e.g. in a file loaded via ‘plugins.require:` in docscribe.yml) and called for every file Docscribe processes.

Thread safety: registration is expected to happen before any parallel rewriting begins.

Defined Under Namespace

Classes: Entry

Class Method Summary collapse

Class Method Details

.clear!void

Note:

module_function: when included, also defines #clear! (instance visibility: private)

This method returns an undefined value.

Remove all registered plugins.

Primarily used in tests to reset state between examples.



105
106
107
108
109
# File 'lib/docscribe/plugin/registry.rb', line 105

def clear!
  @tag_entries.clear
  @collector_entries.clear
  @order_seq = 0
end

.collector_entriesArray<Entry>

Note:

module_function: when included, also defines #collector_entries (instance visibility: private)

All registered collector plugin entries (plugin + priority metadata).

Returns:



95
96
97
# File 'lib/docscribe/plugin/registry.rb', line 95

def collector_entries
  @collector_entries.dup
end

.collector_pluginsArray<#collect>

Note:

module_function: when included, also defines #collector_plugins (instance visibility: private)

All registered collector plugins in registration order.

Returns:

  • (Array<#collect>)


79
80
81
# File 'lib/docscribe/plugin/registry.rb', line 79

def collector_plugins
  @collector_entries.map(&:plugin)
end

.register(plugin, priority: 0) ⇒ void

Note:

module_function: when included, also defines #register (instance visibility: private)

This method returns an undefined value.

Register a plugin.

Routes to the appropriate list based on plugin type:

  • subclass of Base::TagPlugin => tag plugin

  • subclass of Base::CollectorPlugin => collector plugin

  • responds to #call => tag plugin (duck typing)

  • responds to #collect => collector plugin (duck typing)

Parameters:

  • plugin (Object)

    plugin instance

  • priority (Integer) (defaults to: 0)

    plugin priority (higher wins for conflicts)

Raises:

  • (ArgumentError)

    if plugin type cannot be determined

  • (StandardError)


47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/docscribe/plugin/registry.rb', line 47

def register(plugin, priority: 0)
  prio =
    begin
      Integer(priority)
    rescue StandardError
      raise ArgumentError, "priority must be an Integer-like value, got: #{priority.inspect}"
    end

  @order_seq += 1
  entry = Entry.new(plugin: plugin, priority: prio, order: @order_seq)

  if plugin.is_a?(Base::CollectorPlugin) || plugin.respond_to?(:collect)
    @collector_entries << entry
  elsif plugin.is_a?(Base::TagPlugin) || plugin.respond_to?(:call)
    @tag_entries << entry
  else
    raise ArgumentError, 'Plugin must respond to #call (TagPlugin) or #collect (CollectorPlugin)'
  end
end

.tag_entriesArray<Entry>

Note:

module_function: when included, also defines #tag_entries (instance visibility: private)

All registered tag plugin entries (plugin + priority metadata).

Returns:



87
88
89
# File 'lib/docscribe/plugin/registry.rb', line 87

def tag_entries
  @tag_entries.dup
end

.tag_pluginsArray<#call>

Note:

module_function: when included, also defines #tag_plugins (instance visibility: private)

All registered tag plugins in registration order.

Returns:

  • (Array<#call>)


71
72
73
# File 'lib/docscribe/plugin/registry.rb', line 71

def tag_plugins
  @tag_entries.map(&:plugin)
end