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