Sha256: 27891adf26b5eb366e188566d29d73e47cf11a949e8a9a64001b3dd6d12c861b

Contents?: true

Size: 1.49 KB

Versions: 4

Compression:

Stored size: 1.49 KB

Contents

# frozen_string_literal: true

module BulkLoader
  class LoaderNotFoundError < StandardError; end

  class ClassAttribute
    def initialize
      @loader_of = {}
    end

    def include?(name)
      @loader_of.include?(name)
    end

    def each(&block)
      @loader_of.each(&block)
    end

    def load(loader_names, attributes, *args)
      attrs = convert_attributes(attributes)

      loader_names = [loader_names] unless loader_names.is_a?(Array)
      loader_names.each do |name|
        raise LoaderNotFoundError, "bulk_loader :#{name} is not defined" unless @loader_of[name]

        @loader_of[name].load(attrs.map { |attr| attr.lazy(name) }, *args)
      end
    end

    def define_loader(name, loader)
      @loader_of[name] = loader
      define_singleton_method(name) { loader }
    end

    def inspect
      "#<BulkLoader::ClassAttribute:#{object_id} #{loader_inspect}>"
    end

    def dup
      new_object = self.class.new
      each do |key, loader|
        new_object.define_loader(key, loader)
      end
      new_object
    end

    private

    def loader_inspect
      @loader_of.map { |name, _| name }.join(' ')
    end

    def convert_attributes(attributes)
      attributes.map(&method(:convert_attribute))
    end

    def convert_attribute(attr)
      if attr.respond_to?(:bulk_loader)
        attr.bulk_loader
      elsif attr.respond_to?(:lazy)
        attr
      else
        raise 'attributes should be BulkLoader::Attribute or BulkLoader::DSL included class!!'
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
bulk_loader-1.1.0 lib/bulk_loader/class_attribute.rb
bulk_loader-1.0.0 lib/bulk_loader/class_attribute.rb
bulk_loader-0.4.0 lib/bulk_loader/class_attribute.rb
bulk_loader-0.3.0 lib/bulk_loader/class_attribute.rb