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