class Asana::Resources::Resource

Public: The base resource class which provides some sugar over common resource functionality.

Public Class Methods

new(data, client: required('client')) click to toggle source
# File lib/asana/resource_includes/resource.rb, line 12
def initialize(data, client: required('client'))
  @_client = client
  @_data   = data
  data.each do |k, v|
    instance_variable_set(:"@#{k}", v) if respond_to?(k)
  end
end

Public Instance Methods

inspect()
Alias for: to_s
method_missing(m, *args) click to toggle source

Internal: Proxies method calls to the data, wrapping it accordingly and caching the result by defining a real reader method.

Returns the value for the requested property.

Raises a NoMethodError if the property doesn't exist.

Calls superclass method
# File lib/asana/resource_includes/resource.rb, line 33
def method_missing(m, *args)
  super unless respond_to_missing?(m, *args)
  cache(m, wrapped(to_h[m.to_s]))
end
refresh() click to toggle source

If it has findById, it implements refresh

# File lib/asana/resource_includes/resource.rb, line 21
def refresh
  raise "#{self.class.name} does not respond to #find_by_id" unless \
    self.class.respond_to?(:find_by_id)
  self.class.find_by_id(client, gid)
end
respond_to_missing?(m, *) click to toggle source

Internal: Guard for the method_missing proxy. Checks if the resource actually has a specific piece of data at all.

Returns true if the resource has the property, false otherwise.

# File lib/asana/resource_includes/resource.rb, line 42
def respond_to_missing?(m, *)
  to_h.key?(m.to_s)
end
to_h() click to toggle source

Public: Returns the raw Hash representation of the data.

# File lib/asana/resource_includes/resource.rb, line 48
def to_h
  @_data
end
to_s() click to toggle source
# File lib/asana/resource_includes/resource.rb, line 52
def to_s
  attrs = to_h.map { |k, _| "#{k}: #{public_send(k).inspect}" }.join(', ')
  "#<Asana::#{self.class.name.split('::').last} #{attrs}>"
end
Also aliased as: inspect

Private Instance Methods

cache(property, value) click to toggle source

Internal: Caches a property and a value by defining a reader method for it.

property - [#to_s] the property value - [Object] the corresponding value

Returns the value.

# File lib/asana/resource_includes/resource.rb, line 72
def cache(property, value)
  field = :"@#{property}"
  instance_variable_set(field, value)
  define_singleton_method(property) { instance_variable_get(field) }
  value
end
client() click to toggle source

Internal: The Asana::Client instance.

# File lib/asana/resource_includes/resource.rb, line 61
def client
  @_client
end
refresh_with(data) click to toggle source
# File lib/asana/resource_includes/resource.rb, line 91
def refresh_with(data)
  self.class.new(data, client: @_client)
end
wrapped(value) click to toggle source

Internal: Wraps a value in a more useful class if possible, namely a Resource or a Collection.

Returns the wrapped value or the plain value if it couldn't be wrapped.

# File lib/asana/resource_includes/resource.rb, line 83
def wrapped(value)
  case value
  when Hash then Resource.new(value, client: client)
  when Array then value.map(&method(:wrapped))
  else value
  end
end