module ResourceMethods

Public Instance Methods

collection(name, template = nil, **hash_args, &block) click to toggle source
# File lib/klient/resource_methods.rb, line 10
def collection(name, template = nil, **hash_args, &block)
  klass_name = name.to_s.camelcase

  klass = Class.new(Klient::Resource) do
    @arguments = hash_args
    @type = :collection

    # Obtain the collection's resource identifier. Don't allow hash arg AND block
    # param for same thing -- it has to be either one or the other.
    if block_given? && block.arity > 0 && hash_args[:identifier]
      raise ArgumentError, "Collection identifier for :#{name} can be specified as a " \
      "hash argument OR a block parameter (You can't use both simultaneously.)"
    elsif block_given? && block.arity > 0
      @id = block.parameters[0][1]
    elsif hash_args[:identifier]
      @id = hash_args[:identifier]
    else
      # raise ArgumentError, "#{name} collection definition does not specify a resource identifier."
    end

    # Don't allow templates with variables.
    if template && template =~ /[\{\}]/
      raise ArgumentError, "URL template variables not supported."
    end

    # Build a URL template if the template arg was provided.
    if template && id
      @url_template = Addressable::Template.new(template.to_s + "{/#{id}}")
    elsif id
      @identifier = nil
      @url_template = Addressable::Template.new("/#{name}{/#{id}}")
    else
      @identifier = nil
      @url_template = Addressable::Template.new("/#{name}")
    end

    class_eval(&block) if block
  end
  const_set(klass_name, klass)

  define_method(name) do
    klass.new(self)
  end
end
default_collection_accessor(sym) click to toggle source
# File lib/klient/resource_methods.rb, line 2
def default_collection_accessor(sym)
  @collection_accessor = sym
end
headers(&block) click to toggle source
# File lib/klient/resource_methods.rb, line 6
def headers(&block)
  @header_proc = block
end
resource(name, template = nil, **hash_args, &block) click to toggle source
# File lib/klient/resource_methods.rb, line 55
def resource(name, template = nil, **hash_args, &block)
  klass_name = name.to_s.camelcase

  klass = Class.new(Klient::Resource) do
    @arguments = hash_args
    @type = :resource

    # TODO: Avoid identifier conflicts between hash and URL template.
    if template
      @url_template = Addressable::Template.new(template)
    else
      @identifier = nil
      @url_template = Addressable::Template.new("/#{name}")
    end

    class_eval(&block) if block
  end
  const_set(klass_name, klass)

  define_method(name) do
    klass.new(self)
  end
end
resources(*resource_names) click to toggle source
# File lib/klient/resource_methods.rb, line 79
def resources(*resource_names)
  resource_names.each { |rname| resource rname }
end