module DHS::Proxy::Accessors

Constants

BLACKLISTED_KEYWORDS

Keywords that would not be forwarded via method missing FIXME: Extend the set of keywords

Public Instance Methods

clear_cache!() click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 15
def clear_cache!
  @cache = nil
end

Private Instance Methods

access_collection(value, record, name) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 77
def access_collection(value, record, name)
  return unless accessing_collection?(value, record)
  collection_data = DHS::Data.new(value, _data)
  collection = DHS::Collection.new(collection_data)
  wrap_return(collection, record, name)
end
access_item(value, record, name) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 72
def access_item(value, record, name)
  return unless accessing_item?(value, record)
  wrap_return(value, record, name)
end
accessing_collection?(value, record) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 55
def accessing_collection?(value, record)
  return true if value.is_a?(Array)
  return true if value.is_a?(Hash) && record && access(input: value, record: record).present?
  return true if value.is_a?(Hash) && !record && value[:items].present?
end
accessing_item?(value, record) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 48
def accessing_item?(value, record)
  return false unless value.is_a?(Hash)
  return false if record && access(input: value, record: record).present?
  return false if !record && value[:items].present?
  true
end
cache() click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 128
def cache
  @cache ||= Concurrent::Map.new
end
convert(value) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 61
def convert(value)
  return value unless value.is_a?(String)
  if date_time?(value)
    Time.zone.parse(value)
  elsif date?(value)
    Date.parse(value)
  else
    value
  end
end
date?(value) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 112
def date?(value)
  value[date_time_regex, :date].presence
end
date_time?(value) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 120
def date_time?(value)
  date?(value) && time?(value)
end
date_time_regex() click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 124
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
get(name, *args) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 34
def get(name, *args)
  name = args.first if name == :[]
  value = _data._raw[name.to_s] if _data._raw
  if value.nil? && _data._raw.present? && _data._raw.is_a?(Hash)
    value = _data._raw[name.to_sym]
    value = _data._raw[name.to_s.classify.to_sym] if value.nil?
  end

  record = DHS::Record.for_url(value[:href]) if value.is_a?(Hash) && value[:href]
  access_item(value, record, name) ||
    access_collection(value, record, name) ||
    convert(value)
end
set(name, args) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 21
def set(name, args)
  clear_cache!
  return set_attribute_directly(name, args.try(:first)) if name != :[]=
  key = args[0]
  value = args[1]
  _data._raw[key.to_sym] = value
end
set_attribute_directly(name, value) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 29
def set_attribute_directly(name, value)
  key = name.to_s.gsub(/=$/, '')
  _data._raw[key.to_sym] = value
end
time?(value) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 116
def time?(value)
  value[date_time_regex, :time].presence
end
worth_wrapping?(value) click to toggle source
# File lib/dhs/concerns/proxy/accessors.rb, line 104
def worth_wrapping?(value)
  value.is_a?(DHS::Proxy)     ||
    value.is_a?(DHS::Data)    ||
    value.is_a?(DHS::Record)  ||
    value.is_a?(Hash)         ||
    value.is_a?(Array)
end
wrap_return(value, record, name, args = nil) click to toggle source

Wraps the return value with a record class. Adds errors and warnings if existing. Returns plain data if no record class was found.

# File lib/dhs/concerns/proxy/accessors.rb, line 87
def wrap_return(value, record, name, args = nil)
  name = args.first if name == :[]
  return value unless worth_wrapping?(value)
  data = (value.is_a?(DHS::Data) || value.is_a?(DHS::Record)) ? value : DHS::Data.new(value, _data, record, _request)
  data.errors = DHS::Problems::Nested::Errors.new(errors, name) if errors.any?
  data.warnings = DHS::Problems::Nested::Warnings.new(warnings, name) if warnings.any?
  if _record && _record._relations[name]
    klass = _record._relations[name][:record_class_name].constantize
    return cache.compute_if_absent(klass) do
      data.becomes(klass, errors: data.errors, warnings: data.warnings)
    end
  elsif record && !value.is_a?(DHS::Record)
    return data.becomes(record, errors: data.errors, warnings: data.warnings)
  end
  data
end