Class: JekyllImgFlow::ProviderRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/jekyll-imgflow/provider_registry.rb

Constant Summary collapse

MANUAL_ONLY_PROVIDERS =

Providers that don't work programmatically (manual use only)

[].freeze
NON_PROVIDER_FILES =

Files in providers/ that are not provider classes (modules, helpers)

%w[base_provider.rb].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ ProviderRegistry

Returns a new instance of ProviderRegistry.



10
11
12
13
# File 'lib/jekyll-imgflow/provider_registry.rb', line 10

def initialize(config)
  @config = config
  self.class.discover_providers unless self.class.providers_discovered?
end

Class Method Details

.discover_providersObject

Dynamic provider discovery



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/jekyll-imgflow/provider_registry.rb', line 19

def self.discover_providers
  return if @providers_discovered

  @provider_registry ||= {}
  providers_dir = File.join(File.dirname(__FILE__), "providers")

  Dir.glob(File.join(providers_dir, "*.rb")).each do |file|
    basename = File.basename(file)
    next if NON_PROVIDER_FILES.include?(basename)

    provider_name = File.basename(file, ".rb")
    register_provider(provider_name)
  end

  @providers_discovered = true
  Jekyll.logger.debug "ImgFlow:", "Discovered #{@provider_registry.size} providers"
end

.get_all_providers_with_status(config) ⇒ Object

Get all providers with their availability status



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/jekyll-imgflow/provider_registry.rb', line 67

def self.get_all_providers_with_status(config)
  registry = new(config)
  registry.providers.map do |provider|
    {
      name: provider.class.name.split("::").last,
      class: provider.class,
      instance: provider,
      available: provider.available?
    }
  end
end

.get_available_providers(config) ⇒ Object

Get all providers that are currently available (running/installed)



61
62
63
64
# File 'lib/jekyll-imgflow/provider_registry.rb', line 61

def self.get_available_providers(config)
  registry = new(config)
  registry.providers.select(&:available?)
end

.provider_registryObject



52
53
54
# File 'lib/jekyll-imgflow/provider_registry.rb', line 52

def self.provider_registry
  @provider_registry ||= {}
end

.providers_discovered?Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/jekyll-imgflow/provider_registry.rb', line 56

def self.providers_discovered?
  @providers_discovered ||= false
end

.register_provider(name) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/jekyll-imgflow/provider_registry.rb', line 37

def self.register_provider(name)
  class_name = name.split("_").map(&:capitalize).join

  begin
    require_relative "providers/#{name}"
    provider_class = JekyllImgFlow::Providers.const_get(class_name)
    @provider_registry[name.to_sym] = provider_class
    Jekyll.logger.debug "ImgFlow:", "Registered provider: #{class_name}"
  rescue NameError => e
    Jekyll.logger.warn "ImgFlow:", "Failed to load provider #{name}: #{e.message}"
  rescue LoadError => e
    Jekyll.logger.warn "ImgFlow:", "Failed to require provider #{name}: #{e.message}"
  end
end

Instance Method Details

#available_providersObject

Get list of available provider names



96
97
98
99
# File 'lib/jekyll-imgflow/provider_registry.rb', line 96

def available_providers
  available = providers.select(&:available?)
  available.map! { |p| p.class.name.split("::").last }
end

#current_providerObject

Get current provider (first available from priority list). If no provider is available, logs a warning and returns nil. The caller should check for nil and handle gracefully.



82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/jekyll-imgflow/provider_registry.rb', line 82

def current_provider
  provider = providers.find(&:available?)
  return provider if provider

  configured = @config.backend_priority.join(", ")
  Jekyll.logger.warn "ImgFlow:",
                     "No available image provider found. " \
                     "Configured backends: #{configured}. " \
                     "Install one of: sharp, libvips, imagemagick, " \
                     "or start the Docker HTTP providers."
  nil
end

#providersObject



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/jekyll-imgflow/provider_registry.rb', line 101

def providers
  @providers ||= @config.backend_priority.filter_map do |name|
    # Skip manual-only providers (they don't have programmatic APIs)
    if MANUAL_ONLY_PROVIDERS.include?(name)
      Jekyll.logger.debug "ImgFlow:",
                          "Skipping '#{name}' - manual use only (no programmatic API)"
      next
    end

    # Dynamic provider loading from registry
    provider_class = self.class.provider_registry[name.to_sym]
    if provider_class
      provider_class.new(@config)
    else
      Jekyll.logger.warn "ImgFlow:", "Unknown provider '#{name}' - not found in registry"
      nil
    end
  end
end