Sha256: a7dfac2d065f54115427ebc50c722194250f695546795dce3817423c935d275a

Contents?: true

Size: 1.81 KB

Versions: 7

Compression:

Stored size: 1.81 KB

Contents

# frozen_string_literal: true

module Liquidum
  class Drop < Liquid::Drop
    delegate :id, :errors, to: :@object

    def initialize(object)
      @object = object
    end

    def is_for_a?(klass)
      @object.is_a?(klass)
    end

    def to_gid
      @object.to_gid
    end

    def to_sgid
      @object.to_sgid
    end

    def to_h(max_level = 3, current_level: 0)
      return if current_level > max_level

      h = {}

      public_methods(false).each do |pm|
        result = send(pm)

        h[pm] = if result.is_a? ApplicationDrop
                  result.to_h(max_level, current_level: current_level + 1)
                elsif result.is_a? Enumerator::Lazy
                  result.map { |r| r.to_h(max_level, current_level: current_level + 1) }.force
                else
                  result
                end
      end
      h
    end

    class << self
      def association(*associations)
        associations.each do |name|
          define_method(name) do
            if @object.class.respond_to?(:reflect_on_all_associations)
              relation = @object.class.reflect_on_all_associations.find do |a|
                a.name == name
              end
            end
            return unless relation

            klass = "#{relation.class_name}Drop".classify.safe_constantize

            Rails.logger.warn "No #{klass}" and return unless klass

            if relation.collection?
              # FIXME: The LazyDrop has unexpected side effects for exisiting templates, this needs to be discussed further
              # Enumerator::LazyDrop.new(@object.send(name).lazy.map { |o| klass.new(o) })
              @object.send(name).map { |o| klass.new(o) }
            else
              klass.new(@object.send(name)) unless @object.send(name).nil?
            end
          end
        end
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
liquidum-1.2.1 lib/liquidum/drop.rb
liquidum-1.2.0 lib/liquidum/drop.rb
liquidum-1.1.2 lib/liquidum/drop.rb
liquidum-1.1.1 lib/liquidum/drop.rb
liquidum-1.1.0 lib/liquidum/drop.rb
liquidum-1.0.22 lib/liquidum/drop.rb
liquidum-1.0.17 lib/liquidum/drop.rb