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