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: defines #clear! (visibility: private)

This method returns an undefined value.

Remove all registered plugins.

Primarily used in tests to reset state between examples.



131
132
133
134
135
# File 'lib/docscribe/plugin/registry.rb', line 131

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

.collector_entriesArray<Docscribe::Plugin::Registry::Entry>

Note:

module_function: defines #collector_entries (visibility: private)

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



121
122
123
# File 'lib/docscribe/plugin/registry.rb', line 121

def collector_entries
  @collector_entries.dup
end

.collector_pluginsArray<Object>

Note:

module_function: defines #collector_plugins (visibility: private)

All registered collector plugins in registration order.

Returns:

  • (Array<Object>)


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

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

.create_entry(plugin, priority) ⇒ Docscribe::Plugin::Registry::Entry

Note:

module_function: defines #create_entry (visibility: private)

Create a new Entry with the next order number.

Parameters:

  • plugin (Object)

    plugin instance

  • priority (Integer)

    plugin priority (higher wins for conflicts)

Returns:



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

def create_entry(plugin, priority)
  @order_seq += 1
  Entry.new(plugin: plugin, priority: priority, order: @order_seq)
end

.parse_priority(priority) ⇒ Integer, Object

Note:

module_function: defines #parse_priority (visibility: private)

Parse and validate plugin priority.

Parameters:

  • priority (String, Integer)

    plugin priority (higher wins for conflicts)

Returns:

  • (Integer)

    if StandardError

  • (Object)

    if StandardError

Raises:

  • (StandardError)
  • (ArgumentError)


59
60
61
62
63
# File 'lib/docscribe/plugin/registry.rb', line 59

def parse_priority(priority)
  Integer(priority)
rescue StandardError
  raise ArgumentError, "priority must be an Integer-like value, got: #{priority.inspect}"
end

.register(plugin, priority: 0) ⇒ void

Note:

module_function: defines #register (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)



45
46
47
48
49
# File 'lib/docscribe/plugin/registry.rb', line 45

def register(plugin, priority: 0)
  prio = parse_priority(priority)
  entry = create_entry(plugin, prio)
  route_entry(entry, plugin)
end

.route_entry(entry, plugin) ⇒ void

Note:

module_function: defines #route_entry (visibility: private)

This method returns an undefined value.

Route entry to tag or collector list.

Parameters:

Raises:

  • (ArgumentError)


83
84
85
86
87
88
89
90
91
# File 'lib/docscribe/plugin/registry.rb', line 83

def route_entry(entry, plugin)
  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<Docscribe::Plugin::Registry::Entry>

Note:

module_function: defines #tag_entries (visibility: private)

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



113
114
115
# File 'lib/docscribe/plugin/registry.rb', line 113

def tag_entries
  @tag_entries.dup
end

.tag_pluginsArray<Object>

Note:

module_function: defines #tag_plugins (visibility: private)

All registered tag plugins in registration order.

Returns:

  • (Array<Object>)


97
98
99
# File 'lib/docscribe/plugin/registry.rb', line 97

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