lib/ruby-box/item.rb in ruby-box-1.0.0 vs lib/ruby-box/item.rb in ruby-box-1.0.1
- old
+ new
@@ -1,15 +1,26 @@
require 'time'
module RubyBox
class Item
+ @@has_many = []
+ @@has_many_paginated = []
+
def initialize( session, raw_item )
@session = session
@raw_item = raw_item
end
+ def self.has_many(*keys)
+ keys.each {|key| @@has_many << key.to_s}
+ end
+
+ def self.has_many_paginated(*keys)
+ keys.each {|key| @@has_many_paginated << key.to_s}
+ end
+
def update
reload_meta unless etag
url = "#{RubyBox::API_URL}/#{resource_name}/#{id}"
uri = URI.parse(url)
@@ -35,10 +46,14 @@
self
end
def method_missing(method, *args, &block)
key = method.to_s
+
+ # Support has many and paginated has many relationships.
+ return many(key) if @@has_many.include?(key)
+ return paginated(key, args[0] || 100, args[1] || 0) if @@has_many_paginated.include?(key)
# update @raw_item hash if this appears to be a setter.
setter = method.to_s.end_with?('=')
key = key[0...-1] if setter
@raw_item[key] = args[0] if setter and update_fields.include?(key)
@@ -72,9 +87,29 @@
end
entry
end
private
+
+ def many(key)
+ url = "#{RubyBox::API_URL}/#{resource_name}/#{id}/#{key}"
+ resp = @session.get( url )
+ resp['entries'].map {|i| RubyBox::Item.factory(@session, i)}
+ end
+
+ def paginated(key, item_limit=100, offset=0)
+ Enumerator.new do |yielder|
+ while true
+ url = "#{RubyBox::API_URL}/#{resource_name}/#{id}/#{key}?limit=#{item_limit}&offset=#{offset}"
+ resp = @session.get( url )
+ resp['entries'].each do |entry|
+ yielder.yield(RubyBox::Item.factory(@session, entry))
+ end
+ offset += resp['entries'].count
+ break if resp['offset'].to_i + resp['limit'].to_i >= resp['total_count'].to_i
+ end
+ end
+ end
def serialize
update_fields.inject({}) {|hash, field| hash[field] = @raw_item[field]; hash}
end
\ No newline at end of file