lib/gcloud/pubsub/subscription/list.rb in gcloud-0.10.0 vs lib/gcloud/pubsub/subscription/list.rb in gcloud-0.11.0

- old
+ new

@@ -26,28 +26,182 @@ # that match the request and this value should be passed to # the next {Gcloud::Pubsub::Topic#subscriptions} to continue. attr_accessor :token ## - # Create a new Subscription::List with an array of values. - def initialize arr = [], token = nil + # @private Create a new Subscription::List with an array of values. + def initialize arr = [] super arr - @token = token - @token = nil if @token == "" end ## - # @private New Subscriptions::List from a - # Google::Pubsub::V1::ListSubscriptionsRequest object. - def self.from_grpc grpc_list, service - subs = Array(grpc_list.subscriptions).map do |grpc| - if grpc.is_a? String - Subscription.new_lazy grpc, service - else - Subscription.from_grpc grpc, service + # Whether there a next page of subscriptions. + # + # @return [Boolean] + # + # @example + # require "gcloud" + # + # gcloud = Gcloud.new + # pubsub = gcloud.pubsub + # + # subscriptions = pubsub.subscriptions + # if subscriptions.next? + # next_subscriptions = subscriptions.next + # end + # + def next? + !token.nil? + end + + ## + # Retrieve the next page of subscriptions. + # + # @return [Subscription::List] + # + # @example + # require "gcloud" + # + # gcloud = Gcloud.new + # pubsub = gcloud.pubsub + # + # subscriptions = pubsub.subscriptions + # if subscriptions.next? + # next_subscriptions = subscriptions.next + # end + # + def next + return nil unless next? + ensure_service! + if @topic + next_topic_subscriptions + else + next_subscriptions + end + end + + ## + # Retrieves all subscriptions by repeatedly loading {#next} until + # {#next?} returns `false`. Calls the given block once for each + # subscription, which is passed as the parameter. + # + # An Enumerator is returned if no block is given. + # + # This method may make several API calls until all subscriptions 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 subscriptions. Default is no limit. + # @yield [subscription] The block for accessing each subscription. + # @yieldparam [Subscription] subscription The subscription object. + # + # @return [Enumerator] + # + # @example Iterating each subscription by passing a block: + # require "gcloud" + # + # gcloud = Gcloud.new + # pubsub = gcloud.pubsub + # + # subscriptions = pubsub.subscriptions + # subscriptions.all do |subscription| + # puts subscription.name + # end + # + # @example Using the enumerator by not passing a block: + # require "gcloud" + # + # gcloud = Gcloud.new + # pubsub = gcloud.pubsub + # + # subscriptions = pubsub.subscriptions + # all_names = subscriptions.all.map do |subscription| + # subscription.name + # end + # + # @example Limit the number of API calls made: + # require "gcloud" + # + # gcloud = Gcloud.new + # pubsub = gcloud.pubsub + # + # subscriptions = pubsub.subscriptions + # subscriptions.all(request_limit: 10) do |subscription| + # puts subscription.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 - new subs, grpc_list.next_page_token + end + + ## + # @private New Subscriptions::List from a + # Google::Pubsub::V1::ListSubscriptionsRequest object. + def self.from_grpc grpc_list, service, max = nil + subs = new(Array(grpc_list.subscriptions).map do |grpc| + Subscription.from_grpc grpc, service + end) + token = grpc_list.next_page_token + token = nil if token == "" + subs.instance_variable_set "@token", token + subs.instance_variable_set "@service", service + subs.instance_variable_set "@max", max + subs + end + + ## + # @private New Subscriptions::List from a + # Google::Pubsub::V1::ListTopicSubscriptionsResponse object. + def self.from_topic_grpc grpc_list, service, topic, max = nil + subs = new(Array(grpc_list.subscriptions).map do |grpc| + Subscription.new_lazy grpc, service + end) + token = grpc_list.next_page_token + token = nil if token == "" + subs.instance_variable_set "@token", token + subs.instance_variable_set "@service", service + subs.instance_variable_set "@topic", topic + subs.instance_variable_set "@max", max + subs + end + + protected + + ## + # @private Raise an error unless an active connection to the service is + # available. + def ensure_service! + fail "Must have active connection to service" unless @service + end + + def next_subscriptions + options = { prefix: @prefix, token: @token, max: @max } + grpc = @service.list_subscriptions options + self.class.from_grpc grpc, @service, @max + rescue GRPC::BadStatus => e + raise Error.from_error(e) + end + + def next_topic_subscriptions + options = { token: @token, max: @max } + grpc = @service.list_topics_subscriptions @topic, options + self.class.from_topic_grpc grpc, @service, @topic, @max + rescue GRPC::BadStatus => e + raise Error.from_error(e) end end end end end