Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
# frozen_string_literal: true

module Faculty
  # Module to provide access to the database helpers interface
  module DatabaseHelper
    SCHEMAS = Hash.new { |h, k| h[k] = {} }

    # Search utility class
    class HashRedirector
      def initialize(hash)
        @hash = hash
      end

      def get(key)
        @hash.fetch(key, nil)
      end

      def find(subkey)
        raise KeyError, "Cannot find #{subkey}. Have you added the schema and tables to database table helpers?"
      end
    end

    # Search utility class with auto-detection
    class SchemaRedirector < HashRedirector
      def initialize(search_order)
        @search_order = search_order
        super(SCHEMAS)
      end

      def get(key)
        hash = super
        Interface.new(HashRedirector.new(hash)) if hash
      end

      def find(subkey)
        @search_order.each do |key|
          object = @hash.dig(key, subkey)
          return object if object
        end

        super
      end
    end

    # Main interface into the DB Helpers
    class Interface < BasicObject
      def initialize(redirector)
        @redirector = redirector
      end

      def method_missing(name, *_)
        @redirector.get(name) || @redirector.find(name)
      end

      def respond_to_missing?(name)
        return true if @redirector.get(name)
        return true if @redirector.find(name)

        false
      end
    end

    def dbt
      Interface.new(SchemaRedirector.new(dbt_search_order))
    end

    def dbt_search_order
      []
    end
  end
end