Sha256: d626df21e89af23168d43b68ff723b3a78db2333410b9f329adf8bb69d04aa78

Contents?: true

Size: 1.15 KB

Versions: 12

Compression:

Stored size: 1.15 KB

Contents

# frozen_string_literal: true

module Immoscout
  module Models
    # The base/abstract model.
    class Base
      attr_reader :base

      def initialize(hash = {})
        define_singleton_method(:base) { hash }
        set_properties
      end

      protected

      def prepared_hash
        base
          .deep_stringify_keys
          .deep_transform_keys(&:underscore)
          .deep_symbolize_keys
      end

      def set_properties
        prepared_hash.each do |key, value|
          property = self.class.find_property(key)
          unless property
            # TODO: add optional logger
            # puts "#{self.class.name} - missing property '#{key}'"
            next
          end

          set_property(property, key, value)
        end
      end

      def set_property(property, key, value)
        coerce_klass = property.fetch(:coerce, nil)
        if coerce_klass
          if property.fetch(:array, false)
            send("#{key}=", value.map { |elem| coerce_klass.new(elem) })
          else
            send("#{key}=", coerce_klass.new(value))
          end
        else
          send("#{key}=", value)
        end
      end
    end
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
immoscout-1.9.0 lib/immoscout/models/base.rb
immoscout-1.8.1 lib/immoscout/models/base.rb
immoscout-1.8.0 lib/immoscout/models/base.rb
immoscout-1.7.0 lib/immoscout/models/base.rb
immoscout-1.6.5 lib/immoscout/models/base.rb
immoscout-1.6.4 lib/immoscout/models/base.rb
immoscout-1.6.3 lib/immoscout/models/base.rb
immoscout-1.6.2 lib/immoscout/models/base.rb
immoscout-1.6.1 lib/immoscout/models/base.rb
immoscout-1.6.0 lib/immoscout/models/base.rb
immoscout-1.5.0 lib/immoscout/models/base.rb
immoscout-1.4.0 lib/immoscout/models/base.rb