lib/almodovar/resource_collection.rb in almodovar-0.9.8 vs lib/almodovar/resource_collection.rb in almodovar-1.0.0.pre
- old
+ new
@@ -1,12 +1,14 @@
module Almodovar
class ResourceCollection
include HttpAccessor
include Enumerable
+ PAGINATION_ENTITIES = ["self::total-entries", "self::link[@rel='next']", "self::link[@rel='prev']"].join('|').freeze
+
delegate :inspect, :to => :resources
-
+
def initialize(url, auth, xml = nil, options = {})
@url = url
@auth = auth
@xml = xml if options.empty?
@options = options
@@ -17,14 +19,37 @@
root, body = attrs.first
response = http.post(url_with_params, body.to_xml(:root => root, :convert_links => true, :skip_links_one_level => true), "Content-Type" => "application/xml")
check_errors(response, url_with_params)
Resource.new(nil, @auth, Nokogiri::XML.parse(response.body).root)
end
+
+ def total_entries
+ @total_entries ||= xml.at_xpath("./total-entries").try(:text).try(:to_i) || resources.size
+ end
+
+ def next_url
+ @next_url ||= xml.at_xpath("./link[@rel='next']").try(:[], "href")
+ end
+
+ def prev_url
+ @prev_url ||= xml.at_xpath("./link[@rel='prev']").try(:[], "href")
+ end
+
+ def next_page
+ Resource.new(next_url, @auth) if next_url
+ end
+
+ def prev_page
+ Resource.new(prev_url, @auth) if prev_url
+ end
private
def resources
- @resources ||= xml.xpath("./*").map { |subnode| Resource.new(subnode.at_xpath("./link[@rel='self']").try(:[], "href"), @auth, subnode, @options) }
+ @resources ||= begin
+ xml.xpath("./*[not(#{PAGINATION_ENTITIES})]").
+ map { |subnode| Resource.new(subnode.at_xpath("./link[@rel='self']").try(:[], "href"), @auth, subnode, @options) }
+ end
end
def method_missing(meth, *args, &blk)
resources.send(meth, *args, &blk)
end
\ No newline at end of file