Class: Graphomaton::ExporterRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/graphomaton/exporter_registry.rb

Defined Under Namespace

Classes: Entry

Instance Method Summary collapse

Constructor Details

#initializeExporterRegistry

Returns a new instance of ExporterRegistry.



14
15
16
17
# File 'lib/graphomaton/exporter_registry.rb', line 14

def initialize
  @entries = {}
  @aliases = {}
end

Instance Method Details

#aliasesObject



66
67
68
# File 'lib/graphomaton/exporter_registry.rb', line 66

def aliases
  @aliases.dup.freeze
end

#fetch(format) ⇒ Object



58
59
60
# File 'lib/graphomaton/exporter_registry.rb', line 58

def fetch(format)
  @entries.fetch(resolve(format))
end

#formatsObject



62
63
64
# File 'lib/graphomaton/exporter_registry.rb', line 62

def formats
  @entries.keys.freeze
end

#register(name, aliases: [], extensions: [], binary: false, capabilities: [], exporter: nil, &loader) ⇒ Object

Raises:

  • (ArgumentError)


19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/graphomaton/exporter_registry.rb', line 19

def register(name, aliases: [], extensions: [], binary: false, capabilities: [], exporter: nil, &loader)
  canonical = name.to_sym
  resolved_loader = loader || (-> { exporter })
  raise ArgumentError, "Exporter #{canonical.inspect} requires an exporter class or loader block" unless exporter || loader

  keys = [canonical] + aliases.map(&:to_sym) + extensions.map { |extension| extension.to_s.delete_prefix('.').downcase.to_sym }
  collisions = keys.select { |key| @aliases.key?(key) }.uniq
  unless collisions.empty?
    raise ArgumentError, "Exporter identifiers are already registered: #{collisions.join(', ')}"
  end

  entry = Entry.new(
    name: canonical,
    aliases: aliases.map(&:to_sym).freeze,
    extensions: extensions.map { |extension| extension.to_s.delete_prefix('.').downcase }.freeze,
    binary: binary,
    capabilities: capabilities.map(&:to_sym).freeze,
    loader: resolved_loader
  )
  @entries[canonical] = entry
  ([canonical] + entry.aliases + entry.extensions.map(&:to_sym)).each { |key| @aliases[key] = canonical }
  entry
end

#resolve(format) ⇒ Object

Raises:

  • (ArgumentError)


50
51
52
53
54
55
56
# File 'lib/graphomaton/exporter_registry.rb', line 50

def resolve(format)
  key = format.to_s.delete_prefix('.').downcase.to_sym
  canonical = @aliases[key]
  return canonical if canonical

  raise ArgumentError, "Unknown format: #{format.inspect}. Available formats: #{formats.join(', ')}"
end

#unregister(format) ⇒ Object



43
44
45
46
47
48
# File 'lib/graphomaton/exporter_registry.rb', line 43

def unregister(format)
  canonical = resolve(format)
  entry = @entries.delete(canonical)
  @aliases.delete_if { |_key, value| value == canonical }
  entry
end