module Klient

Constants

VERSION

Attributes

base_url[R]
collection_accessor[R]
collection_key[R]
header_proc[R]
headers[R]
root[R]
url[R]
url_template[R]

Public Class Methods

included(klass) click to toggle source
# File lib/klient/klient.rb, line 14
def self.included(klass)
  klass.extend(KlientClassMethods)
  klass.send(:attr_reader, :header_proc)
  klass.send(:attr_reader, :resource_map)
  klass.send(:attr_reader, :identifier_map)
  klass.instance_variable_set(:@resource_map, {})
  klass.instance_variable_set(:@identifier_map, {})
end
new(base_url) click to toggle source
# File lib/klient/klient.rb, line 23
def initialize(base_url)
  @root = self
  @header_proc = self.class.header_proc
  @collection_accessor = self.class.instance_variable_get(:@collection_accessor)
  @base_url = base_url
  @headers = headers
  @url_template = Addressable::Template.new(base_url)

  rmap = {}
  self.class::Resource.descendants
    .select { |x| x.name.split('::').length == 2 }
    .sort   { |x, y| x.name.demodulize <=> y.name.demodulize }
    .each do |klass|
      next unless klass.id
      cname = klass.name.demodulize.underscore.singularize.to_sym
      cname_plural = klass.name.demodulize.underscore.pluralize.to_sym

      if rmap.include?(cname)
        next
      else
        rmap[cname_plural] = klass
        rmap[cname] = klass
      end
    end

  imap = {}
  rmap.values.each do |klass|
    next unless klass.id
    imap[klass.id] = klass
  end

  @resource_map = rmap
  @identifier_map = imap

  self.class::Resource.descendants.each do |rklass|
    cname = rklass.name.demodulize.underscore.to_sym

    if rklass && rklass.arguments && rklass.arguments[:type]
      rklass.resource_type = @resource_map[rklass.arguments[:type]]
    elsif @resource_map[rklass.arguments[:type]] && @identifier_map.key(rklass)
      rklass.resource_type = @resource_map[@identifier_map.key(rklass)]
    elsif @resource_map.values.include?(rklass)
      rklass.resource_type = rklass
    elsif @resource_map[cname]
      rklass.resource_type = @resource_map[cname]
    elsif @identifier_map[rklass.id]
      rklass.resource_type = rklass.id
    else
      rklass.resource_type = rklass
    end
  end
end