Sha256: 470d95fe937749cc97f39eac5303d62c10d24613ecfbc26c66071e71f63124ae

Contents?: true

Size: 1.89 KB

Versions: 1

Compression:

Stored size: 1.89 KB

Contents

module Vk
  class Result
    include Enumerable

    # @example
    #   Vk::Result.new('database.getCountries', Vk::Country, options)
    def initialize(method, items_class, options = {}, merged_attributes = {})
      @items = []
      @amount = 0
      @client = options.delete(:client) { Vk.client }
      @items_class = items_class
      @method = method
      @options = options
      @options[:offset] ||= 0
      @options[:count] ||= 100
      @merged_attributes = merged_attributes
    end

    # @return [Fixnum]
    def count
      load_items unless @count
      @count
    end

    # @return [Fixnum]
    def amount
      @items.size
    end

    # @return [<Vk::Base>]
    attr_reader :items

    def each(&block)
      @items.each do |item|
        block.call(item)
      end
      while amount && count && amount < count
        increase_offset!
        load_items(&block)
      end
    end

    # @return [<Vk::Base>]
    def all
      while amount && count && amount < count
        increase_offset!
        load_items
      end
      @items
    end

    def method_missing(name, *arguments, &block)
      if respond_to_missing?(name, false)
        @items_class.public_send(name, *arguments, &block)
      else
        super
      end
    end

    # @param [String] name
    # @param [Boolean] include_all
    def respond_to_missing?(name, include_all)
      @items_class.respond_to?(name, include_all)
    end

    private

    def increase_offset!
      @options[:offset] = amount
    end

    def load_items(&block)
      raise Vk::TooMuchArguments.new(@method, 'count', 1000) if @options[:count].try(:>, 1000)
      data = @client.request(@method, @options)
      return unless data
      @count = data['count']
      sleep 0.5
      data['items'].each do |item|
        item = @items_class.new(item.merge(@merged_attributes))
        @items << item
        block.call(item) if block_given?
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
vk-0.6.5.53 lib/vk/result.rb