class Plangrade::Resources::Base

Attributes

attrs[R]
id[R]

Public Class Methods

base_name() click to toggle source

Returns the non-qualified class name @!scope class

# File lib/plangrade/resources/base.rb, line 9
def base_name
  @base_name ||= begin
    word = "#{name.split(/::/).last}"
    word.gsub!(/::/, '/')
    word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
    word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
    word.tr!("-", "_")
    word.downcase!
    word
  end
end
fetch(id) click to toggle source

@!scope class

# File lib/plangrade/resources/base.rb, line 33
def fetch(id)
  return unless identity_map
  attributes = identity_map.get("#{base_name}_#{id}")
  unless attributes
    result = api_handler.send("get_#{base_name}", id)
    attributes = result.empty? ? nil : result.body
    unless attributes.empty?
      identity_map.put("#{base_name}_#{id}", attributes)
    end
  end
  attributes
end
get(id) click to toggle source

Fetches JSON reprsentation for object model with provided ‘id` and returns a model instance with attributes @return [Yammer::Base] @param id [Integer] @!scope class

# File lib/plangrade/resources/base.rb, line 26
def get(id)
  attrs = fetch(id)
  attrs ? new(attrs) : nil
end
identity_map() click to toggle source

@!scope class

# File lib/plangrade/resources/base.rb, line 47
def identity_map
  @identity_map ||= Plangrade::Resources::IdentityMap.new
end
model_attributes() click to toggle source

Returns a hash of all attributes that are meant to trigger an HTTP request @!scope class

# File lib/plangrade/resources/base.rb, line 53
def model_attributes
  @model_attributes ||= {}
end
new(props={}) { |self| ... } click to toggle source
# File lib/plangrade/resources/base.rb, line 86
def initialize(props={})
  @klass               = self.class
  @modified_attributes = {}
  @new_record          = true
  @loaded              = false
  @attrs               = props
  self.id              = @attrs.delete(:id)
  self.update(@attrs)

  yield self if block_given?
end

Protected Class Methods

attr_accessor_deffered(*symbols) click to toggle source
# File lib/plangrade/resources/base.rb, line 59
def attr_accessor_deffered(*symbols)
  symbols.each do |key|
    # track attributes that should trigger a fetch
    model_attributes[key] = false

    # getter
    define_method(key.to_s) do
      load_deferred_attribute!(key)
      instance_variable_get("@#{key}")
    end

    # setter
    define_method("#{key}=") do |value|
      load_deferred_attribute!(key)
      if persisted? && loaded?
        @modified_attributes[key] = value
      else
        @attrs[key] = value
      end
      instance_variable_set("@#{key}", value)
    end
  end
end

Public Instance Methods

api_handler() click to toggle source
# File lib/plangrade/resources/base.rb, line 98
def api_handler
  @klass.api_handler
end
base_name() click to toggle source
# File lib/plangrade/resources/base.rb, line 102
def base_name
  @klass.base_name
end
changes() click to toggle source
# File lib/plangrade/resources/base.rb, line 114
def changes
  @modified_attributes
end
delete!() click to toggle source
# File lib/plangrade/resources/base.rb, line 150
def delete!
  return if new_record?
  result = api_handler.send("delete_#{base_name}", @id)
  result.success?
end
load!() click to toggle source
# File lib/plangrade/resources/base.rb, line 126
def load!
  @attrs = @klass.fetch(@id)
  @loaded = true
  update(@attrs)
  self
end
loaded?() click to toggle source
# File lib/plangrade/resources/base.rb, line 122
def loaded?
  @loaded
end
modified?() click to toggle source
# File lib/plangrade/resources/base.rb, line 118
def modified?
  !changes.empty?
end
new_record?() click to toggle source
# File lib/plangrade/resources/base.rb, line 106
def new_record?
  @new_record
end
persisted?() click to toggle source
# File lib/plangrade/resources/base.rb, line 110
def persisted?
  !new_record?
end
reload!() click to toggle source
# File lib/plangrade/resources/base.rb, line 133
def reload!
  reset!
  load!
end
save() click to toggle source
# File lib/plangrade/resources/base.rb, line 138
def save
  return self if ((persisted? && @modified_attributes.empty?) || @attrs.empty?)

  result = if new_record?
    api_handler.send("create_#{base_name}", @attrs)
  else
    api_handler.send("update_#{base_name}", @id, @modified_attributes)
  end
  @modified_attributes = {}
  self
end

Protected Instance Methods

load_deferred_attribute!(key) click to toggle source

loads model

# File lib/plangrade/resources/base.rb, line 174
def load_deferred_attribute!(key)
  if @attrs.empty? && persisted? && !loaded?
    load!
    if !@attrs.has_key?(key)
      raise "The key: #{key} appears not to be supported for model: #{self.base_name} \n #{@attrs.keys.inspect}"
    end
  end
end
update(attrs={}) click to toggle source

set all fetchable attributes

# File lib/plangrade/resources/base.rb, line 184
def update(attrs={})
  attrs.each do |key, value|
    send("#{key}=", value) if self.respond_to?("#{key}=")
  end
  if persisted? && !loaded?
    @loaded = @klass.model_attributes.keys.inject(true) do |result, key|
      result && @attrs.has_key?(key)
    end
  end
end

Private Instance Methods

id=(model_id) click to toggle source
# File lib/plangrade/resources/base.rb, line 158
def id=(model_id)
  return if model_id.nil?
  @id = model_id.to_i
  @new_record = false
end
reset!() click to toggle source

clear the entire class

# File lib/plangrade/resources/base.rb, line 165
def reset!
  @modified_attributes = {}
  @attrs  = {}
  @new_record = true
  @loaded = false
end