Sha256: 5ec0e04e2193c72a5adb5951137ebe81553b88bbe16b182ce3a17d58ffb026e3

Contents?: true

Size: 1.81 KB

Versions: 4

Compression:

Stored size: 1.81 KB

Contents

module NCore
  module Util
    extend ActiveSupport::Concern

    def self.deep_clone(value)
      case value
      when Hash
        cl = value.clone
        value.each{|k,v| cl[k] = deep_clone(v)}
        cl
      when Array
        cl = value.clone
        cl.clear
        value.each{|v| cl << deep_clone(v)}
        cl
      when NilClass, Numeric, TrueClass, FalseClass
        value
      else
        value.clone rescue value
      end
    end


    module ClassMethods

      def interpret_type(val_or_enum, api_creds)
        case val_or_enum
        when Hash
          if key = val_or_enum[:object]
            discover_class(key).new({data: val_or_enum}, api_creds)
          else
            val_or_enum
          end
        when Array
          val_or_enum.map{|v| interpret_type v, api_creds }
        else
          val_or_enum
        end
      end

      def factory(parsed, api_creds, preload: nil)
        if key = (parsed[:data] || parsed)[:object]
          discover_class(key, self).new(parsed, api_creds, preload: preload)
        else
          new(parsed, api_creds, preload: preload)
        end
      end


      private

      def discover_class(key, default_klass=module_parent::GenericObject)
        klass_name = key.to_s.camelize.singularize
        begin
          "#{module_name}::#{klass_name}".constantize
        rescue NameError
          default_klass
        end
      end

    end


    delegate :factory, to: :class


    def inspect
      base = "#{self.class}:0x#{'%016x'%self.object_id} id: #{id.inspect}"
      @@inspect_chain ||= []
      return "#<#{base}, ...>" if @@inspect_chain.include? self
      begin
        @@inspect_chain.push self
        "#<#{base}, attribs: #{@attribs.except(:id).inspect}, metadata: #{metadata.inspect}>"
      ensure
        @@inspect_chain.pop
      end
    end

  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ncore-3.8.1 lib/ncore/util.rb
ncore-3.8.0 lib/ncore/util.rb
ncore-3.7.1 lib/ncore/util.rb
ncore-3.7.0 lib/ncore/util.rb