Sha256: 3f47f15c09c3a38562aaddef1cfc588e74e7f9662e7980fd7983266455f6de0c

Contents?: true

Size: 1.3 KB

Versions: 11

Compression:

Stored size: 1.3 KB

Contents

require 'ostruct'
require 'active_support/core_ext/string/inflections'

module Lol
  # DynamicModel extends OpenStruct adding the following features:
  # - nested generation ({a: {}}) results in DynamicModel(a: DynamicModel)
  # - parsing of date/time when property name ends with _at or _date and the value is a number
  class DynamicModel < OpenStruct
    def initialize(hash={})
      raise ArgumentError, 'An hash is required as parameter' unless hash.is_a? Hash
      @table = {}
      @hash_table = {}

      hash.each do |k,v|
        key = k.to_s.underscore
        set_property key, v
        new_ostruct_member(key)
      end
    end

    def to_h
      @hash_table
    end

    def as_json opts={}
      @table.as_json
    end

    private

    def date_key? key
      key.match(/^(.+_)?(at|date)$/)
    end

    def set_property key, v
      if date_key?(key) && v.is_a?(Fixnum)
        @table[key.to_sym] = @hash_table[key.to_sym] = value_to_date v
      else
        @table[key.to_sym] = convert_object v
        @hash_table[key.to_sym] = v
      end
    end

    def value_to_date v
      Time.at(v / 1000)
    end

    def convert_object obj
      if obj.is_a? Hash
        self.class.new obj
      elsif obj.respond_to?(:map)
        obj.map { |o| convert_object o }
      else
        obj
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
ruby-lol-0.12.2 lib/lol/dynamic_model.rb
ruby-lol-0.12.1 lib/lol/dynamic_model.rb
ruby-lol-0.12.0 lib/lol/dynamic_model.rb
ruby-lol-0.11.6 lib/lol/dynamic_model.rb
ruby-lol-0.11.5 lib/lol/dynamic_model.rb
ruby-lol-0.11.4 lib/lol/dynamic_model.rb
ruby-lol-0.11.3 lib/lol/dynamic_model.rb
ruby-lol-0.11.2 lib/lol/dynamic_model.rb
ruby-lol-0.11.1 lib/lol/dynamic_model.rb
ruby-lol-0.11.0 lib/lol/dynamic_model.rb
ruby-lol-0.10.0 lib/lol/dynamic_model.rb