class Sawyer::Resource

Constants

ATTR_PREDICATE
ATTR_SETTER
SPECIAL_METHODS

Attributes

_agent[R]
_fields[R]
_rels[R]
attrs[R]

Public Class Methods

attr_accessor(*attrs) click to toggle source

Wire up accessor methods to pull from attrs

# File lib/sawyer/resource.rb, line 100
def self.attr_accessor(*attrs)
  attrs.each do |attribute|
    class_eval do
      define_method attribute do
        @attrs[attribute.to_sym]
      end

      define_method "#{attribute}=" do |value|
        @attrs[attribute.to_sym] = value
      end

      define_method "#{attribute}?" do
        !!@attrs[attribute.to_sym]
      end
    end
  end
end
new(agent, data = {}) click to toggle source

Initializes a Resource with the given data.

agent - The Sawyer::Agent that made the API request. data - Hash of key/value properties.

# File lib/sawyer/resource.rb, line 12
def initialize(agent, data = {})
  @_agent  = agent
  data, links = agent.parse_links(data)
  @_rels = Relation.from_links(agent, links)
  @_fields = Set.new
  @_metaclass = (class << self; self; end)
  @attrs = {}
  data.each do |key, value|
    @_fields << key
    @attrs[key.to_sym] = process_value(value)
  end
  @_metaclass.send(:attr_accessor, *data.keys)
end

Public Instance Methods

[](method) click to toggle source

Allow fields to be retrieved via Hash notation

method - key name

Returns the value from attrs if exists

# File lib/sawyer/resource.rb, line 54
def [](method)
  send(method.to_sym)
rescue NoMethodError
  nil
end
[]=(method, value) click to toggle source

Allow fields to be set via Hash notation

method - key name value - value to set for the attr key

Returns - value

# File lib/sawyer/resource.rb, line 66
def []=(method, value)
  send("#{method}=", value)
rescue NoMethodError
  nil
end
each(&block) click to toggle source
# File lib/sawyer/resource.rb, line 122
def each(&block)
  @attrs.each(&block)
end
inspect() click to toggle source
# File lib/sawyer/resource.rb, line 118
def inspect
  to_attrs.respond_to?(:pretty_inspect) ? to_attrs.pretty_inspect : to_attrs.inspect
end
key?(key) click to toggle source

Checks to see if the given key is in this resource.

key - A Symbol key.

Returns true if the key exists, or false.

# File lib/sawyer/resource.rb, line 45
def key?(key)
  @_fields.include? key
end
marshal_dump() click to toggle source
# File lib/sawyer/resource.rb, line 146
def marshal_dump
  [@attrs, @_fields, @_rels]
end
marshal_load(dumped) click to toggle source
# File lib/sawyer/resource.rb, line 150
def marshal_load(dumped)
  @attrs, @_fields, @_rels = *dumped.shift(3)
  @_metaclass = (class << self; self; end)
end
method_missing(method, *args) click to toggle source

Provides access to a resource's attributes.

Calls superclass method
# File lib/sawyer/resource.rb, line 76
def method_missing(method, *args)
  attr_name, suffix = method.to_s.scan(/([a-z0-9\_]+)(\?|\=)?$/i).first
  if suffix == ATTR_SETTER
    @_metaclass.send(:attr_accessor, attr_name)
    @_fields << attr_name.to_sym
    send(method, args.first)
  elsif attr_name && @_fields.include?(attr_name.to_sym)
    value = @attrs[attr_name.to_sym]
    case suffix
    when nil
      @_metaclass.send(:attr_accessor, attr_name)
      value
    when ATTR_PREDICATE then !!value
    end
  elsif suffix.nil? && SPECIAL_METHODS.include?(attr_name)
    instance_variable_get "@_#{attr_name}"
  elsif attr_name && !@_fields.include?(attr_name.to_sym)
    nil
  else
    super
  end
end
process_value(value) click to toggle source

Processes an individual value of this resource. Hashes get exploded into another Resource, and Arrays get their values processed too.

value - An Object value of a Resource's data.

Returns an Object to set as the value of a Resource key.

# File lib/sawyer/resource.rb, line 32
def process_value(value)
  case value
  when Hash  then self.class.new(@_agent, value)
  when Array then value.map { |v| process_value(v) }
  else value
  end
end
to_attrs() click to toggle source
# File lib/sawyer/resource.rb, line 131
def to_attrs
  hash = self.attrs.clone
  hash.keys.each do |k|
    if hash[k].is_a?(Sawyer::Resource)
      hash[k] = hash[k].to_attrs
    elsif hash[k].is_a?(Array) && hash[k].all?{|el| el.is_a?(Sawyer::Resource)}
      hash[k] = hash[k].collect{|el| el.to_attrs}
    end
  end
  hash
end
Also aliased as: to_hash, to_h
to_h()
Alias for: to_attrs
to_hash()
Alias for: to_attrs
to_yaml_properties() click to toggle source

private

# File lib/sawyer/resource.rb, line 127
def to_yaml_properties
  [:@attrs, :@_fields, :@_rels]
end