class Squad::Resource

Attributes

header[R]
id[RW]

Public Class Methods

attribute(name) click to toggle source
# File lib/squad.rb, line 145
def self.attribute(name)
  attributes << name unless attributes.include? name
  define_method(name) do 
    @attributes[name]
  end
  define_method(:"#{name}=") do |value|
    @attributes[name] = value
  end
end
attributes() click to toggle source
# File lib/squad.rb, line 155
def self.attributes; @attributes ||= [] end
bulk(name, &block) click to toggle source
# File lib/squad.rb, line 159
def self.bulk(name, &block)
  bulks[name] = block
end
bulks() click to toggle source
# File lib/squad.rb, line 157
def self.bulks; @bulks ||= {} end
collection(name) click to toggle source
# File lib/squad.rb, line 175
def self.collection(name)
  collections[name] = Proc.new do 
    show do |params|
      resource = Squad.routes[name].new(name)
      resource.query("#{@resource_name}_id", @id)
    end 
  end
end
collections() click to toggle source
# File lib/squad.rb, line 174
def self.collections; @collections ||= {} end
element(name, &block) click to toggle source
# File lib/squad.rb, line 165
def self.element(name, &block)
  elements[name] = block
end
elements() click to toggle source
# File lib/squad.rb, line 163
def self.elements; @elements ||= {} end
factor(&block) click to toggle source
# File lib/squad.rb, line 131
def self.factor(&block)
  klass = dup
  klass.class_eval(&block)
  klass 
end
index(attribute) click to toggle source
# File lib/squad.rb, line 170
def self.index(attribute)
  indices << attribute unless indices.include?(attribute)
end
indices() click to toggle source
# File lib/squad.rb, line 169
def self.indices; @indices ||= [] end
new(name, attributes = {}) click to toggle source
# File lib/squad.rb, line 137
def initialize(name, attributes = {}) 
  @attributes = Hash[self.class.attributes.map{|key| [key, nil]}]
  @resource_name = name
  update_attributes(attributes)
  @status = nil 
  @header = DEFAULT_HEADER
end
reference(name) click to toggle source
# File lib/squad.rb, line 184
def self.reference(name)
  field = :"#{name}_id" 
  attribute field 
  index field 
end

Public Instance Methods

all() click to toggle source
# File lib/squad.rb, line 196
def all; Collection.new(self, key[:all].call("SMEMBERS")) end
attributes() click to toggle source
# File lib/squad.rb, line 254
def attributes; @attributes end
bad_gateway() click to toggle source
# File lib/squad.rb, line 83
def bad_gateway;           @status = 502 end
bad_request() click to toggle source
# File lib/squad.rb, line 79
def bad_request;           @status = 400 end
created() click to toggle source
# File lib/squad.rb, line 77
def created;               @status = 201 end
delete() click to toggle source
# File lib/squad.rb, line 237
def delete
  OhmUtil.script(redis,
    OhmUtil::LUA_DELETE, 0, {
      "name" => @resource_name,
      "id" => id,
      "key" => key[id].to_s
    }.to_json,
    {}.to_json,
    {}.to_json
  )

  @attributes.each do |key, value|
    attributes[key] = nil 
  end
  @id = nil
end
element_type?() click to toggle source
# File lib/squad.rb, line 129
def element_type?; !defined?(@results) || !@results.kind_of?(Collection) end
execute(params) { |params| ... } click to toggle source
# File lib/squad.rb, line 125
def execute(params, &block)
  @results = yield params
end
find(id) click to toggle source
# File lib/squad.rb, line 192
def find(id)
  resource.new(@resource_name, {"id" => id}).load!
end
internal_server_error() click to toggle source
# File lib/squad.rb, line 81
def internal_server_error; @status = 500 end
key() click to toggle source
# File lib/squad.rb, line 275
def key;   @key ||= Nest.new(@resource_name, redis) end
load!() click to toggle source
# File lib/squad.rb, line 203
def load!
  result = key[id].call("HGETALL") 
  raise NotFoundError if result.size == 0
  update_attributes(Hash[*result])
  return self
end
no_cotent() click to toggle source
# File lib/squad.rb, line 78
def no_cotent;             @status = 204 end
not_found() click to toggle source
# File lib/squad.rb, line 80
def not_found;             @status = 404 end
not_implemented() click to toggle source
# File lib/squad.rb, line 82
def not_implemented;       @status = 501 end
ok() click to toggle source

status code sytax suger

# File lib/squad.rb, line 76
def ok;                    @status = 200 end
query(attribute, value) click to toggle source
# File lib/squad.rb, line 198
def query(attribute, value)
  ids = key[:indices][attribute][value].call("SMEMBERS")
  Collection.new(self, ids)
end
redis() click to toggle source
# File lib/squad.rb, line 276
def redis; Squad.redis end
render(request) click to toggle source
# File lib/squad.rb, line 119
def render(request)
  raise NotImplementedError unless method_block = @request_methods[request.request_method]
  load! unless id.nil?
  execute(request.params, &method_block)
end
reproduce(attributes) click to toggle source
# File lib/squad.rb, line 256
def reproduce(attributes)
  self.class.new(@resource_name, OhmUtil.dict(attributes))
end
resource() click to toggle source
# File lib/squad.rb, line 190
def resource; self.class end
run(seg) click to toggle source
# File lib/squad.rb, line 85
def run(seg)  
  inbox = {}
  default_actions

  while seg.capture(:segment, inbox)
    segment = inbox[:segment].to_sym
    @request_methods = {}

    if new? && !defined?(@bulk_name)
      if bulk = self.class.bulks[segment]
        @bulk_name = segment
        return instance_eval(&bulk)
      else
        @id = segment
        load!
        default_element_action
        next 
      end
    end

    if !defined?(@element_name) && !defined?(@collection_name)
      if element = self.class.elements[segment]
        @element_name = segment
        return instance_eval(&element)
      elsif collection = self.class.collections[segment]
        @collection_name = segment
        return instance_eval(&collection)
      end
    end

    raise BadRequestError 
  end
end
save() click to toggle source
# File lib/squad.rb, line 217
def save
  feature = {name: @resource_name}
  feature["id"] = @id unless new? 
  
  indices = {}
  resource.indices.each do |field|
    next unless (value = send(field))
    indices[field] = Array(value).map(&:to_s)
  end

  @id = OhmUtil.script(redis,
    OhmUtil::LUA_SAVE,
    0,
    feature.to_json,
    serialize_attributes.to_json,
    indices.to_json,
    {}.to_json
  )
end
status() click to toggle source
# File lib/squad.rb, line 73
def status; @status || ok end
to_hash() click to toggle source
# File lib/squad.rb, line 260
def to_hash
  hash = attributes
  hash[:id] = @id unless @id.nil?

  return hash
end
to_json() click to toggle source
# File lib/squad.rb, line 267
def to_json
  if element_type?
    JSON.dump(self.to_hash)
  else
    @results.to_json
  end
end
update_attributes(atts) click to toggle source
# File lib/squad.rb, line 210
def update_attributes(atts)
  @attributes.each do |attribute, value|
    send(:"#{attribute}=", atts[attribute.to_s]) if atts.has_key?(attribute.to_s)
  end
  @id = atts["id"] if atts["id"]
end

Private Instance Methods

create(&block) click to toggle source
# File lib/squad.rb, line 293
def create(&block);  @request_methods['POST']   = block end
default_actions() click to toggle source
# File lib/squad.rb, line 297
def default_actions
  @request_methods = {} 

  show do |params| 
    if params.size == 0
      all
    else
      query(*params.first)
    end
  end

  create do |params|
    update_attributes(params)
    save
    created
  end
end
default_element_action() click to toggle source
# File lib/squad.rb, line 315
def default_element_action
  show { |params| }

  update do |params|
    update_attributes(params)
    save
  end

  destory { |params| delete }
end
destory(&block) click to toggle source
# File lib/squad.rb, line 295
def destory(&block); @request_methods['DELETE'] = block end
new?() click to toggle source
# File lib/squad.rb, line 281
def new?; !defined?(@id) end
serialize_attributes() click to toggle source
# File lib/squad.rb, line 282
def serialize_attributes
  result = []
  
  attributes.each do |key, value| 
    result.push(key, value.to_s) if value
  end

  result
end
show(&block) click to toggle source
# File lib/squad.rb, line 292
def show(&block);    @request_methods['GET']    = block end
update(&block) click to toggle source
# File lib/squad.rb, line 294
def update(&block);  @request_methods['PUT']    = block end