Sha256: 15de73d775673c6637ab65b97fa5548d7e2f10135b4c00e8ac949e9be7e31ba3

Contents?: true

Size: 1.88 KB

Versions: 8

Compression:

Stored size: 1.88 KB

Contents

require File.join(__dir__, 'proxy.rb')
Dir[File.dirname(__FILE__) + '/concerns/item/*.rb'].each {|file| require file }

# An item is a concrete record.
# It can be part of another proxy like collection.
class LHS::Item < LHS::Proxy
  include Destroy
  include Save
  include Update
  include Validation

  delegate :present?, :blank?, :empty?, to: :_raw

  # prevent clashing with attributes of underlying data
  attr_accessor :errors

  def _raw
    _data._raw
  end

  protected

  def method_missing(name, *args, &block)
    return set(name, args.try(&:first)) if name.to_s[/=$/]
    name = args.first if name == :[]
    value = _data._raw[name.to_s]
    value = _data._raw[name.to_sym] if value.nil?
    if value.is_a?(Hash)
      handle_hash(value)
    elsif value.is_a?(Array)
      data = LHS::Data.new(value, _data)
      collection = LHS::Collection.new(data)
      LHS::Data.new(collection, _data)
    else
      convert(value)
    end
  end

  def respond_to_missing?(name, include_all = false)
    # We accept every message that does not belong to set of keywords
    BLACKLISTED_KEYWORDS.exclude?(name.to_s)
  end

  private

  # FIXME: Extend the set of keywords
  BLACKLISTED_KEYWORDS = %w( new proxy_association )

  def convert(value)
    return value unless value.is_a?(String)
    if date_time?(value)
      DateTime.parse(value)
    elsif date?(value)
      Date.parse(value)
    else
      value
    end
  end

  def handle_hash(value)
    LHS::Data.new(value, _data)
  end

  def set(name, value)
    key = name.to_s.gsub(/=$/, '')
    _data._raw[key.to_sym] = value
  end

  private

  def date?(value)
    value[date_time_regex, :date].presence
  end

  def time?(value)
    value[date_time_regex, :time].presence
  end

  def date_time?(value)
    date?(value) && time?(value)
  end

  def date_time_regex
    /(?<date>\d{4}-\d{2}-\d{2})?(?<time>T\d{2}:\d{2}:\d{2}\.\d*.\d{2}:\d{2})?/
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
lhs-2.2.0 lib/lhs/item.rb
lhs-2.1.1 lib/lhs/item.rb
lhs-2.1.0 lib/lhs/item.rb
lhs-2.0.5 lib/lhs/item.rb
lhs-2.0.4 lib/lhs/item.rb
lhs-2.0.3 lib/lhs/item.rb
lhs-2.0.2 lib/lhs/item.rb
lhs-2.0.1 lib/lhs/item.rb