Sha256: 660df2b861ff78c0a0d62a49a5d504823402c8e52d7cdcd56b067b71f2e87ffc

Contents?: true

Size: 1.48 KB

Versions: 6

Compression:

Stored size: 1.48 KB

Contents

module Loquor
  class ApiCall::Index < ApiCall

    attr_reader :criteria

    def initialize(klass)
      super(klass)
      @criteria = {}
    end

    def where(value)
      value.each do |key, value|
        @criteria[key] = value
      end
      self
    end

    def select(value)
      @criteria[:fields] ||= []
      @criteria[:fields] += value
      self
    end

    # Proxy everything to the results so that this this class
    # transparently acts as an Array.
    def method_missing(name, *args, &block)
      results.send(name, *args, &block)
    end

    def find_each
      page = 1
      per = 200
      results = []
      begin
        results = Loquor.get("#{generate_url}&page=#{page}&per=#{per}")
        results.each do |result|
          yield klass.new(result)
        end
        page += 1
      end while(results.size == per)
    end

    private

    def results
      if @results.nil?
        @results = Loquor.get(generate_url).map {|obj| klass.new(obj)}
      end
      @results
    end

    def generate_url
      query_string = []
      @criteria.each do |key,value|
        case value
        when String, Symbol, Numeric
          query_string << "#{key}=#{URI.encode(value.to_s)}"
        when Array
          value.each do |v|
            query_string << "#{key}[]=#{URI.encode(v.to_s)}"
          end
        else
          raise LoquorError.new("Filter values must be strings or arrays.")
        end
      end
      "#{klass.path}?#{query_string.join("&")}"
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
loquor-0.7.0 lib/loquor/api_calls/index.rb
loquor-0.6.0 lib/loquor/api_calls/index.rb
loquor-0.5.4 lib/loquor/api_calls/index.rb
loquor-0.5.3 lib/loquor/api_calls/index.rb
loquor-0.5.2 lib/loquor/api_calls/index.rb
loquor-0.5.1 lib/loquor/api_calls/index.rb