Sha256: 6199a57089e54e85163de617e099e2881bb2f1bbdc5b227314ef20cadc81aa05

Contents?: true

Size: 1.56 KB

Versions: 6

Compression:

Stored size: 1.56 KB

Contents

module Embulk
  require 'embulk/error'

  class PluginRegistry
    def initialize(category, search_prefix)
      @category = category
      @search_prefix = search_prefix
      @map = {}
    end

    attr_reader :category

    def register(type, value)
      type = type.to_sym
      @map[type] = value
    end

    def lookup(type)
      type = type.to_sym
      if value = @map[type]
        return value
      end
      search(type)
      if value = @map[type]
        return value
      end
      raise ConfigError, "Unknown #{@category} plugin '#{type}'."
    end

    def search(type)
      name = "#{@search_prefix}#{type}"
      begin
        require name
        return
      rescue LoadError
      end

      # search from $LOAD_PATH
      load_paths = $LOAD_PATH.map do |lp|
        lpath = File.expand_path(File.join(lp, "#{name}.rb"))
        File.exist?(lpath) ? lpath : nil
      end

      paths = [name] + load_paths.compact.sort  # sort to prefer newer version
      paths.each do |path|
        begin
          require path
          return
        rescue LoadError
        end
      end

      # search gems
      if defined?(::Gem::Specification) && ::Gem::Specification.respond_to?(:find_all)
        specs = Gem::Specification.find_all do |spec|
          spec.contains_requirable_file? name
        end

        # prefer newer version
        specs = specs.sort_by {|spec| spec.version }
        if spec = specs.last
          spec.require_paths.each do |lib|
            require "#{spec.full_gem_path}/#{lib}/#{name}"
          end
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
embulk-0.3.2 lib/embulk/plugin_registry.rb
embulk-0.3.1 lib/embulk/plugin_registry.rb
embulk-0.3.0 lib/embulk/plugin_registry.rb
embulk-0.2.1 lib/embulk/plugin_registry.rb
embulk-0.2.0 lib/embulk/plugin_registry.rb
embulk-0.1.0 lib/embulk/plugin_registry.rb