lib/gcloud/bigquery/dataset/list.rb in gcloud-0.10.0 vs lib/gcloud/bigquery/dataset/list.rb in gcloud-0.11.0

- old
+ new

@@ -28,23 +28,145 @@ # A hash of this page of results. attr_accessor :etag ## - # Create a new Dataset::List with an array of datasets. + # @private Create a new Dataset::List with an array of datasets. def initialize arr = [] super arr end ## + # Whether there is a next page of datasets. + # + # @return [Boolean] + # + # @example + # require "gcloud" + # + # gcloud = Gcloud.new + # bigquery = gcloud.bigquery + # + # datasets = bigquery.datasets + # if datasets.next? + # next_datasets = datasets.next + # end + def next? + !token.nil? + end + + ## + # Retrieve the next page of datasets. + # + # @return [Dataset::List] + # + # @example + # require "gcloud" + # + # gcloud = Gcloud.new + # bigquery = gcloud.bigquery + # + # datasets = bigquery.datasets + # if datasets.next? + # next_datasets = datasets.next + # end + def next + return nil unless next? + ensure_connection! + options = { all: @hidden, token: token, max: @max } + resp = @connection.list_datasets options + if resp.success? + self.class.from_response resp, @connection + else + fail ApiError.from_response(resp) + end + end + + ## + # Retrieves all datasets by repeatedly loading {#next} until {#next?} + # returns `false`. Calls the given block once for each dataset, which is + # passed as the parameter. + # + # An Enumerator is returned if no block is given. + # + # This method may make several API calls until all datasets are + # retrieved. Be sure to use as narrow a search criteria as possible. + # Please use with caution. + # + # @param [Integer] request_limit The upper limit of API requests to make + # to load all datasets. Default is no limit. + # @yield [dataset] The block for accessing each dataset. + # @yieldparam [Dataset] dataset The dataset object. + # + # @return [Enumerator] + # + # @example Iterating each result by passing a block: + # require "gcloud" + # + # gcloud = Gcloud.new + # bigquery = gcloud.bigquery + # + # bigquery.datasets.all do |dataset| + # puts dataset.name + # end + # + # @example Using the enumerator by not passing a block: + # require "gcloud" + # + # gcloud = Gcloud.new + # bigquery = gcloud.bigquery + # + # all_names = bigquery.datasets.all.map do |dataset| + # dataset.name + # end + # + # @example Limit the number of API calls made: + # require "gcloud" + # + # gcloud = Gcloud.new + # bigquery = gcloud.bigquery + # + # bigquery.datasets.all(request_limit: 10) do |dataset| + # puts dataset.name + # end + # + def all request_limit: nil + request_limit = request_limit.to_i if request_limit + unless block_given? + return enum_for(:all, request_limit: request_limit) + end + results = self + loop do + results.each { |r| yield r } + if request_limit + request_limit -= 1 + break if request_limit < 0 + end + break unless results.next? + results = results.next + end + end + + ## # @private New Dataset::List from a response object. - def self.from_response resp, conn + def self.from_response resp, conn, hidden = nil, max = nil datasets = List.new(Array(resp.data["datasets"]).map do |gapi_object| Dataset.from_gapi gapi_object, conn end) datasets.instance_variable_set "@token", resp.data["nextPageToken"] datasets.instance_variable_set "@etag", resp.data["etag"] + datasets.instance_variable_set "@connection", conn + datasets.instance_variable_set "@hidden", hidden + datasets.instance_variable_set "@max", max datasets + end + + protected + + ## + # Raise an error unless an active connection is available. + def ensure_connection! + fail "Must have active connection" unless @connection end end end end end