Sha256: 6557494cf12eb407ceb71e72bc70f518f0fa1bef73b8af51f98ca584cfd719f3

Contents?: true

Size: 1.69 KB

Versions: 14

Compression:

Stored size: 1.69 KB

Contents

module Sym
  module App
    module Password
      module Providers

        class << self
          attr_accessor :registry
          attr_accessor :providers
          attr_accessor :detected

          def register(provider_class)
            self.registry                        ||= {}
            registry[short_name(provider_class)] = provider_class
            self.providers                       ||= []
            self.providers << provider_class
          end

          # Detect first instance that is "alive?" and return it.
          def detect
            self.detected ||= self.providers.inject(nil) do |instance, provider_class|
              instance || (p = provider_class.new; p.alive? ? p : nil)
            end
          end

          def provider(p = nil, **opts, &block)
            provider_from_argument(p, **opts, &block) || detect
          end

          def provider_list
            registry.keys.map(&:to_s).join(', ')
          end

          private

          def short_name(klass)
            klass.name.gsub(/.*::(\w+)Provider/, '\1').downcase.to_sym
          end

          def provider_from_argument(p, **opts, &block)
            case p
              when String, Symbol
                provider_class_name = "#{p.to_s.capitalize}Provider"
                Sym::App::Password::Providers.const_defined?(provider_class_name) ?
                  Sym::App::Password::Providers.const_get(provider_class_name).new(**opts, &block) :
                  nil
            end
          end
        end
      end
    end
  end
end

# Order is important — they are tried in this order for auto detect
require 'sym/app/password/providers/memcached_provider'
require 'sym/app/password/providers/drb_provider'

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
sym-2.8.5 lib/sym/app/password/providers.rb
sym-2.8.4 lib/sym/app/password/providers.rb
sym-2.8.2 lib/sym/app/password/providers.rb
sym-2.8.1 lib/sym/app/password/providers.rb
sym-2.8.0 lib/sym/app/password/providers.rb
sym-2.7.0 lib/sym/app/password/providers.rb
sym-2.6.3 lib/sym/app/password/providers.rb
sym-2.6.2 lib/sym/app/password/providers.rb
sym-2.6.1 lib/sym/app/password/providers.rb
sym-2.6.0 lib/sym/app/password/providers.rb
sym-2.5.3 lib/sym/app/password/providers.rb
sym-2.5.1 lib/sym/app/password/providers.rb
sym-2.5.0 lib/sym/app/password/providers.rb
sym-2.4.3 lib/sym/app/password/providers.rb