Sha256: ec1a9af6653a11cc3336634542f32e62a610b3f8cc6c453e44edb8aa8e139af5

Contents?: true

Size: 1.75 KB

Versions: 7

Compression:

Stored size: 1.75 KB

Contents

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
    end

    def create(attrs = {})
      raise ArgumentError.new("You must specify one only root element which is the type of resource (e.g. `:project => { :name => 'Wadus' }` instead of just `:name => 'Wadus'`)") if attrs.size > 1
      root, body = attrs.first
      response = http.post(@url, body.to_xml(root: root, convert_links: true, skip_links_one_level: true), query_params, { "Content-Type" => "application/xml" })
      check_errors(response, @url, query_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 ||= 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
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
almodovar-1.7.7 lib/almodovar/resource_collection.rb
almodovar-1.7.6 lib/almodovar/resource_collection.rb
almodovar-1.7.3 lib/almodovar/resource_collection.rb
almodovar-1.7.2 lib/almodovar/resource_collection.rb
almodovar-1.7.1 lib/almodovar/resource_collection.rb
almodovar-1.7.0 lib/almodovar/resource_collection.rb
almodovar-1.6.0 lib/almodovar/resource_collection.rb