google-cloud-pubsub 0.33.2 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHENTICATION.md +4 -4
  3. data/CHANGELOG.md +45 -0
  4. data/EMULATOR.md +2 -2
  5. data/OVERVIEW.md +81 -43
  6. data/lib/google-cloud-pubsub.rb +10 -7
  7. data/lib/google/cloud/pubsub.rb +38 -21
  8. data/lib/google/cloud/pubsub/async_publisher.rb +8 -6
  9. data/lib/google/cloud/pubsub/batch_publisher.rb +7 -5
  10. data/lib/google/cloud/pubsub/convert.rb +5 -3
  11. data/lib/google/cloud/pubsub/credentials.rb +6 -4
  12. data/lib/google/cloud/pubsub/message.rb +9 -6
  13. data/lib/google/cloud/pubsub/policy.rb +12 -10
  14. data/lib/google/cloud/pubsub/project.rb +30 -28
  15. data/lib/google/cloud/pubsub/publish_result.rb +3 -1
  16. data/lib/google/cloud/pubsub/received_message.rb +11 -10
  17. data/lib/google/cloud/pubsub/service.rb +47 -37
  18. data/lib/google/cloud/pubsub/snapshot.rb +11 -9
  19. data/lib/google/cloud/pubsub/snapshot/list.rb +10 -8
  20. data/lib/google/cloud/pubsub/subscriber.rb +32 -6
  21. data/lib/google/cloud/pubsub/subscriber/enumerator_queue.rb +3 -1
  22. data/lib/google/cloud/pubsub/subscriber/inventory.rb +4 -2
  23. data/lib/google/cloud/pubsub/subscriber/stream.rb +23 -43
  24. data/lib/google/cloud/pubsub/subscriber/timed_unary_buffer.rb +221 -0
  25. data/lib/google/cloud/pubsub/subscription.rb +157 -80
  26. data/lib/google/cloud/pubsub/subscription/list.rb +12 -10
  27. data/lib/google/cloud/pubsub/topic.rb +79 -51
  28. data/lib/google/cloud/pubsub/topic/list.rb +10 -8
  29. data/lib/google/cloud/pubsub/v1/credentials.rb +4 -2
  30. data/lib/google/cloud/pubsub/v1/doc/google/iam/v1/iam_policy.rb +1 -43
  31. data/lib/google/cloud/pubsub/v1/doc/google/iam/v1/policy.rb +1 -108
  32. data/lib/google/cloud/pubsub/v1/doc/google/protobuf/duration.rb +1 -1
  33. data/lib/google/cloud/pubsub/v1/doc/google/protobuf/empty.rb +1 -1
  34. data/lib/google/cloud/pubsub/v1/doc/google/protobuf/field_mask.rb +1 -1
  35. data/lib/google/cloud/pubsub/v1/doc/google/protobuf/timestamp.rb +1 -1
  36. data/lib/google/cloud/pubsub/v1/doc/google/pubsub/v1/pubsub.rb +107 -61
  37. data/lib/google/cloud/pubsub/v1/publisher_client.rb +58 -55
  38. data/lib/google/cloud/pubsub/v1/publisher_client_config.json +0 -4
  39. data/lib/google/cloud/pubsub/v1/subscriber_client.rb +177 -128
  40. data/lib/google/cloud/pubsub/v1/subscriber_client_config.json +0 -4
  41. data/lib/google/cloud/pubsub/version.rb +4 -2
  42. data/lib/google/pubsub/v1/pubsub_pb.rb +48 -40
  43. data/lib/google/pubsub/v1/pubsub_services_pb.rb +201 -161
  44. metadata +6 -7
  45. data/lib/google/cloud/pubsub/subscriber/async_stream_pusher.rb +0 -223
  46. data/lib/google/cloud/pubsub/subscriber/async_unary_pusher.rb +0 -271
@@ -0,0 +1,221 @@
1
+ # Copyright 2018 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "concurrent"
17
+
18
+ module Google
19
+ module Cloud
20
+ module PubSub
21
+ class Subscriber
22
+ ##
23
+ # @private
24
+ class TimedUnaryBuffer
25
+ attr_reader :max_bytes, :interval
26
+
27
+ def initialize subscriber, max_bytes: 10000000, interval: 1.0
28
+ @subscriber = subscriber
29
+ @max_bytes = max_bytes
30
+ @interval = interval
31
+
32
+ # Using a Hash ensures there is only one entry for each ack_id in
33
+ # the buffer. Adding an entry again will overwrite the previous
34
+ # entry.
35
+ @register = {}
36
+
37
+ @task = Concurrent::TimerTask.new(execution_interval: interval) do
38
+ flush!
39
+ end
40
+ end
41
+
42
+ def acknowledge ack_ids
43
+ return if ack_ids.empty?
44
+
45
+ ack_ids.each do |ack_id|
46
+ # ack has no deadline set, use :ack indicate it is an ack
47
+ @register[ack_id] = :ack
48
+ end
49
+
50
+ true
51
+ end
52
+
53
+ def modify_ack_deadline deadline, ack_ids
54
+ return if ack_ids.empty?
55
+
56
+ ack_ids.each do |ack_id|
57
+ @register[ack_id] = deadline
58
+ end
59
+
60
+ true
61
+ end
62
+
63
+ def renew_lease deadline, ack_ids
64
+ return if ack_ids.empty?
65
+
66
+ ack_ids.each do |ack_id|
67
+ # Do not overwrite pending actions when renewing leased messages.
68
+ @register[ack_id] ||= deadline
69
+ end
70
+
71
+ true
72
+ end
73
+
74
+ def flush!
75
+ # Grab requests from the buffer and release synchronize ASAP
76
+ requests = flush_requests!
77
+ return if requests.empty?
78
+
79
+ # Perform the RCP calls concurrently
80
+ with_threadpool do |pool|
81
+ requests[:acknowledge].each do |ack_req|
82
+ add_future pool do
83
+ @subscriber.service.acknowledge \
84
+ ack_req.subscription, *ack_req.ack_ids
85
+ end
86
+ end
87
+ requests[:modify_ack_deadline].each do |mod_ack_req|
88
+ add_future pool do
89
+ @subscriber.service.modify_ack_deadline \
90
+ mod_ack_req.subscription, mod_ack_req.ack_ids,
91
+ mod_ack_req.ack_deadline_seconds
92
+ end
93
+ end
94
+ end
95
+
96
+ true
97
+ end
98
+
99
+ def start
100
+ @task.execute
101
+
102
+ self
103
+ end
104
+
105
+ def stop
106
+ @task.shutdown
107
+ flush!
108
+
109
+ self
110
+ end
111
+
112
+ def started?
113
+ @task.running?
114
+ end
115
+
116
+ def stopped?
117
+ !started?
118
+ end
119
+
120
+ private
121
+
122
+ def flush_requests!
123
+ return {} if @register.empty?
124
+
125
+ prev_reg = @register
126
+ @register = Concurrent::Map.new
127
+
128
+ groups = prev_reg.each_pair.group_by { |_ack_id, delay| delay }
129
+ req_hash = Hash[groups.map { |k, v| [k, v.map(&:first)] }]
130
+
131
+ requests = { acknowledge: [] }
132
+ ack_ids = Array(req_hash.delete(:ack)) # ack has no deadline set
133
+ if ack_ids.any?
134
+ requests[:acknowledge] = create_acknowledge_requests ack_ids
135
+ end
136
+ requests[:modify_ack_deadline] =
137
+ req_hash.map do |mod_deadline, mod_ack_ids|
138
+ create_modify_ack_deadline_requests mod_deadline, mod_ack_ids
139
+ end.flatten
140
+ requests
141
+ end
142
+
143
+ def create_acknowledge_requests ack_ids
144
+ req = Google::Cloud::PubSub::V1::AcknowledgeRequest.new(
145
+ subscription: subscription_name,
146
+ ack_ids: ack_ids
147
+ )
148
+ addl_to_create = req.to_proto.bytesize / max_bytes
149
+ return [req] if addl_to_create.zero?
150
+
151
+ ack_ids.each_slice(addl_to_create + 1).map do |sliced_ack_ids|
152
+ Google::Cloud::PubSub::V1::AcknowledgeRequest.new(
153
+ subscription: subscription_name,
154
+ ack_ids: sliced_ack_ids
155
+ )
156
+ end
157
+ end
158
+
159
+ def create_modify_ack_deadline_requests deadline, ack_ids
160
+ req = Google::Cloud::PubSub::V1::ModifyAckDeadlineRequest.new(
161
+ subscription: subscription_name,
162
+ ack_ids: ack_ids,
163
+ ack_deadline_seconds: deadline
164
+ )
165
+ addl_to_create = req.to_proto.bytesize / max_bytes
166
+ return [req] if addl_to_create.zero?
167
+
168
+ ack_ids.each_slice(addl_to_create + 1).map do |sliced_ack_ids|
169
+ Google::Cloud::PubSub::V1::ModifyAckDeadlineRequest.new(
170
+ subscription: subscription_name,
171
+ ack_ids: sliced_ack_ids,
172
+ ack_deadline_seconds: deadline
173
+ )
174
+ end
175
+ end
176
+
177
+ def subscription_name
178
+ @subscriber.subscription_name
179
+ end
180
+
181
+ def push_threads
182
+ @subscriber.push_threads
183
+ end
184
+
185
+ def error! error
186
+ @subscriber.error! error
187
+ end
188
+
189
+ def with_threadpool
190
+ pool = Concurrent::FixedThreadPool.new @subscriber.push_threads
191
+
192
+ yield pool
193
+
194
+ pool.shutdown
195
+ pool.wait_for_termination 60
196
+ return if pool.shutdown?
197
+
198
+ pool.kill
199
+ begin
200
+ raise "Timeout making subscriber API calls"
201
+ rescue StandardError => error
202
+ error! error
203
+ end
204
+ end
205
+
206
+ def add_future pool
207
+ Concurrent::Future.new(executor: pool) do
208
+ begin
209
+ yield
210
+ rescue StandardError => error
211
+ error! error
212
+ end
213
+ end.execute
214
+ end
215
+ end
216
+ end
217
+ end
218
+
219
+ Pubsub = PubSub unless const_defined? :Pubsub
220
+ end
221
+ end
@@ -22,7 +22,7 @@ require "google/cloud/pubsub/subscriber"
22
22
 
23
23
  module Google
24
24
  module Cloud
25
- module Pubsub
25
+ module PubSub
26
26
  ##
27
27
  # # Subscription
28
28
  #
@@ -32,7 +32,7 @@ module Google
32
32
  # @example
33
33
  # require "google/cloud/pubsub"
34
34
  #
35
- # pubsub = Google::Cloud::Pubsub.new
35
+ # pubsub = Google::Cloud::PubSub.new
36
36
  #
37
37
  # sub = pubsub.subscription "my-topic-sub"
38
38
  # subscriber = sub.listen do |received_message|
@@ -52,7 +52,7 @@ module Google
52
52
  attr_accessor :service
53
53
 
54
54
  ##
55
- # @private The gRPC Google::Pubsub::V1::Subscription object.
55
+ # @private The gRPC Google::Cloud::PubSub::V1::Subscription object.
56
56
  attr_accessor :grpc
57
57
 
58
58
  ##
@@ -60,49 +60,67 @@ module Google
60
60
  def initialize
61
61
  @service = nil
62
62
  @grpc = nil
63
- @lazy = nil
63
+ @resource_name = nil
64
64
  @exists = nil
65
65
  end
66
66
 
67
67
  ##
68
68
  # The name of the subscription.
69
+ #
70
+ # @return [String]
69
71
  def name
72
+ return @resource_name if reference?
70
73
  @grpc.name
71
74
  end
72
75
 
73
76
  ##
74
77
  # The {Topic} from which this subscription receives messages.
75
78
  #
79
+ # Makes an API call to retrieve the topic information when called on a
80
+ # reference object. See {#reference?}.
81
+ #
76
82
  # @return [Topic]
77
83
  #
78
84
  # @example
79
85
  # require "google/cloud/pubsub"
80
86
  #
81
- # pubsub = Google::Cloud::Pubsub.new
87
+ # pubsub = Google::Cloud::PubSub.new
82
88
  #
83
89
  # sub = pubsub.subscription "my-topic-sub"
84
90
  # sub.topic.name #=> "projects/my-project/topics/my-topic"
85
91
  #
86
92
  def topic
87
93
  ensure_grpc!
88
- Topic.new_lazy @grpc.topic, service
94
+ Topic.from_name @grpc.topic, service
89
95
  end
90
96
 
91
97
  ##
92
98
  # This value is the maximum number of seconds after a subscriber
93
99
  # receives a message before the subscriber should acknowledge the
94
100
  # message.
101
+ #
102
+ # Makes an API call to retrieve the deadline value when called on a
103
+ # reference object. See {#reference?}.
104
+ #
105
+ # @return [Integer]
95
106
  def deadline
96
107
  ensure_grpc!
97
108
  @grpc.ack_deadline_seconds
98
109
  end
99
110
 
111
+ ##
112
+ # Sets the maximum number of seconds after a subscriber
113
+ # receives a message before the subscriber should acknowledge the
114
+ # message.
115
+ #
116
+ # @param [Integer] new_deadline The new deadline value.
117
+ #
100
118
  def deadline= new_deadline
101
- update_grpc = @grpc.dup
102
- update_grpc.ack_deadline_seconds = new_deadline
119
+ update_grpc = Google::Cloud::PubSub::V1::Subscription.new \
120
+ name: name, ack_deadline_seconds: new_deadline
103
121
  @grpc = service.update_subscription update_grpc,
104
122
  :ack_deadline_seconds
105
- @lazy = nil
123
+ @resource_name = nil
106
124
  end
107
125
 
108
126
  ##
@@ -111,6 +129,9 @@ module Google
111
129
  # they are acknowledged, until they fall out of the {#retention} window.
112
130
  # Default is `false`.
113
131
  #
132
+ # Makes an API call to retrieve the retain_acked value when called on a
133
+ # reference object. See {#reference?}.
134
+ #
114
135
  # @return [Boolean] Returns `true` if acknowledged messages are
115
136
  # retained.
116
137
  #
@@ -119,12 +140,18 @@ module Google
119
140
  @grpc.retain_acked_messages
120
141
  end
121
142
 
143
+ ##
144
+ # Sets whether to retain acknowledged messages.
145
+ #
146
+ # @param [Boolean] new_retain_acked The new retain acknowledged messages
147
+ # value.
148
+ #
122
149
  def retain_acked= new_retain_acked
123
- update_grpc = @grpc.dup
124
- update_grpc.retain_acked_messages = !(!new_retain_acked)
150
+ update_grpc = Google::Cloud::PubSub::V1::Subscription.new \
151
+ name: name, retain_acked_messages: !(!new_retain_acked)
125
152
  @grpc = service.update_subscription update_grpc,
126
153
  :retain_acked_messages
127
- @lazy = nil
154
+ @resource_name = nil
128
155
  end
129
156
 
130
157
  ##
@@ -136,6 +163,9 @@ module Google
136
163
  # less than 600 seconds (10 minutes). Default is 604,800 seconds (7
137
164
  # days).
138
165
  #
166
+ # Makes an API call to retrieve the retention value when called on a
167
+ # reference object. See {#reference?}.
168
+ #
139
169
  # @return [Numeric] The message retention duration in seconds.
140
170
  #
141
171
  def retention
@@ -143,18 +173,29 @@ module Google
143
173
  Convert.duration_to_number @grpc.message_retention_duration
144
174
  end
145
175
 
176
+ ##
177
+ # Sets the message retention duration in seconds.
178
+ #
179
+ # @param [Numeric] new_retention The new retention value.
180
+ #
146
181
  def retention= new_retention
147
- update_grpc = @grpc.dup
148
- update_grpc.message_retention_duration = \
149
- Convert.number_to_duration new_retention
182
+ new_retention_duration = Convert.number_to_duration new_retention
183
+ update_grpc = Google::Cloud::PubSub::V1::Subscription.new \
184
+ name: name, message_retention_duration: new_retention_duration
150
185
  @grpc = service.update_subscription update_grpc,
151
186
  :message_retention_duration
152
- @lazy = nil
187
+ @resource_name = nil
153
188
  end
154
189
 
155
190
  ##
156
191
  # Returns the URL locating the endpoint to which messages should be
157
192
  # pushed.
193
+ #
194
+ # Makes an API call to retrieve the endpoint value when called on a
195
+ # reference object. See {#reference?}.
196
+ #
197
+ # @return [String]
198
+ #
158
199
  def endpoint
159
200
  ensure_grpc!
160
201
  @grpc.push_config.push_endpoint if @grpc.push_config
@@ -162,15 +203,18 @@ module Google
162
203
 
163
204
  ##
164
205
  # Sets the URL locating the endpoint to which messages should be pushed.
206
+ #
207
+ # @param [String] new_endpoint The new endpoint value.
208
+ #
165
209
  def endpoint= new_endpoint
166
210
  ensure_service!
167
211
  service.modify_push_config name, new_endpoint, {}
168
212
 
169
- return unless @grpc
213
+ return if reference?
170
214
 
171
- @grpc.push_config = Google::Pubsub::V1::PushConfig.new(
215
+ @grpc.push_config = Google::Cloud::PubSub::V1::PushConfig.new(
172
216
  push_endpoint: new_endpoint,
173
- attributes: {}
217
+ attributes: {}
174
218
  )
175
219
  end
176
220
 
@@ -182,9 +226,13 @@ module Google
182
226
  # The returned hash is frozen and changes are not allowed. Use
183
227
  # {#labels=} to update the labels for this subscription.
184
228
  #
229
+ # Makes an API call to retrieve the labels value when called on a
230
+ # reference object. See {#reference?}.
231
+ #
185
232
  # @return [Hash] The frozen labels hash.
186
233
  #
187
234
  def labels
235
+ ensure_grpc!
188
236
  @grpc.labels.to_h.freeze
189
237
  end
190
238
 
@@ -202,28 +250,31 @@ module Google
202
250
  #
203
251
  def labels= new_labels
204
252
  raise ArgumentError, "Value must be a Hash" if new_labels.nil?
205
- labels_map = Google::Protobuf::Map.new(:string, :string)
206
- Hash(new_labels).each { |k, v| labels_map[String(k)] = String(v) }
207
- update_grpc = @grpc.dup
208
- update_grpc.labels = labels_map
253
+ update_grpc = Google::Cloud::PubSub::V1::Subscription.new \
254
+ name: name, labels: new_labels
209
255
  @grpc = service.update_subscription update_grpc, :labels
210
- @lazy = nil
256
+ @resource_name = nil
211
257
  end
212
258
 
213
259
  ##
214
260
  # Determines whether the subscription exists in the Pub/Sub service.
215
261
  #
262
+ # Makes an API call to determine whether the subscription resource
263
+ # exists when called on a reference object. See {#reference?}.
264
+ #
265
+ # @return [Boolean]
266
+ #
216
267
  # @example
217
268
  # require "google/cloud/pubsub"
218
269
  #
219
- # pubsub = Google::Cloud::Pubsub.new
270
+ # pubsub = Google::Cloud::PubSub.new
220
271
  #
221
272
  # sub = pubsub.subscription "my-topic-sub"
222
273
  # sub.exists? #=> true
223
274
  #
224
275
  def exists?
225
- # Always true if the object is not set as lazy
226
- return true unless lazy?
276
+ # Always true if the object is not set as reference
277
+ return true unless reference?
227
278
  # If we have a value, return it
228
279
  return @exists unless @exists.nil?
229
280
  ensure_grpc!
@@ -232,23 +283,6 @@ module Google
232
283
  @exists = false
233
284
  end
234
285
 
235
- ##
236
- # @private
237
- # Determines whether the subscription object was created with an
238
- # HTTP call.
239
- #
240
- # @example
241
- # require "google/cloud/pubsub"
242
- #
243
- # pubsub = Google::Cloud::Pubsub.new
244
- #
245
- # sub = pubsub.get_subscription "my-topic-sub"
246
- # sub.lazy? #=> nil
247
- #
248
- def lazy?
249
- @lazy
250
- end
251
-
252
286
  ##
253
287
  # Deletes an existing subscription.
254
288
  # All pending messages in the subscription are immediately dropped.
@@ -258,7 +292,7 @@ module Google
258
292
  # @example
259
293
  # require "google/cloud/pubsub"
260
294
  #
261
- # pubsub = Google::Cloud::Pubsub.new
295
+ # pubsub = Google::Cloud::PubSub.new
262
296
  #
263
297
  # sub = pubsub.subscription "my-topic-sub"
264
298
  # sub.delete
@@ -290,12 +324,12 @@ module Google
290
324
  # request. The Pub/Sub system may return fewer than the number
291
325
  # specified. The default value is `100`, the maximum value is `1000`.
292
326
  #
293
- # @return [Array<Google::Cloud::Pubsub::ReceivedMessage>]
327
+ # @return [Array<Google::Cloud::PubSub::ReceivedMessage>]
294
328
  #
295
329
  # @example
296
330
  # require "google/cloud/pubsub"
297
331
  #
298
- # pubsub = Google::Cloud::Pubsub.new
332
+ # pubsub = Google::Cloud::PubSub.new
299
333
  #
300
334
  # sub = pubsub.subscription "my-topic-sub"
301
335
  # sub.pull.each { |received_message| received_message.acknowledge! }
@@ -303,7 +337,7 @@ module Google
303
337
  # @example A maximum number of messages returned can also be specified:
304
338
  # require "google/cloud/pubsub"
305
339
  #
306
- # pubsub = Google::Cloud::Pubsub.new
340
+ # pubsub = Google::Cloud::PubSub.new
307
341
  #
308
342
  # sub = pubsub.subscription "my-topic-sub"
309
343
  # sub.pull(max: 10).each do |received_message|
@@ -313,7 +347,7 @@ module Google
313
347
  # @example The call can block until messages are available:
314
348
  # require "google/cloud/pubsub"
315
349
  #
316
- # pubsub = Google::Cloud::Pubsub.new
350
+ # pubsub = Google::Cloud::PubSub.new
317
351
  #
318
352
  # sub = pubsub.subscription "my-topic-sub"
319
353
  # received_messages = sub.pull immediate: false
@@ -345,12 +379,12 @@ module Google
345
379
  # request. The Pub/Sub system may return fewer than the number
346
380
  # specified. The default value is `100`, the maximum value is `1000`.
347
381
  #
348
- # @return [Array<Google::Cloud::Pubsub::ReceivedMessage>]
382
+ # @return [Array<Google::Cloud::PubSub::ReceivedMessage>]
349
383
  #
350
384
  # @example
351
385
  # require "google/cloud/pubsub"
352
386
  #
353
- # pubsub = Google::Cloud::Pubsub.new
387
+ # pubsub = Google::Cloud::PubSub.new
354
388
  #
355
389
  # sub = pubsub.subscription "my-topic-sub"
356
390
  # received_messages = sub.wait_for_messages
@@ -370,6 +404,9 @@ module Google
370
404
  # will hold received messages before modifying the message's ack
371
405
  # deadline. The minimum is 10, the maximum is 600. Default is
372
406
  # {#deadline}. Optional.
407
+ #
408
+ # Makes an API call to retrieve the deadline value when called on a
409
+ # reference object. See {#reference?}.
373
410
  # @param [Integer] streams The number of concurrent streams to open to
374
411
  # pull messages from the subscription. Default is 4. Optional.
375
412
  # @param [Integer] inventory The number of received messages to be
@@ -382,9 +419,9 @@ module Google
382
419
  # * `:callback` (Integer) The number of threads used to handle the
383
420
  # received messages. Default is 8.
384
421
  # * `:push` (Integer) The number of threads to handle
385
- # acknowledgement ({ReceivedMessage#ack!}) and delay messages
386
- # ({ReceivedMessage#nack!}, {ReceivedMessage#delay!}). Default is
387
- # 4.
422
+ # acknowledgement ({ReceivedMessage#ack!}) and modify ack deadline
423
+ # messages ({ReceivedMessage#nack!},
424
+ # {ReceivedMessage#modify_ack_deadline!}). Default is 4.
388
425
  #
389
426
  # @yield [received_message] a block for processing new messages
390
427
  # @yieldparam [ReceivedMessage] received_message the newly received
@@ -395,7 +432,7 @@ module Google
395
432
  # @example
396
433
  # require "google/cloud/pubsub"
397
434
  #
398
- # pubsub = Google::Cloud::Pubsub.new
435
+ # pubsub = Google::Cloud::PubSub.new
399
436
  #
400
437
  # sub = pubsub.subscription "my-topic-sub"
401
438
  #
@@ -413,7 +450,7 @@ module Google
413
450
  # @example Configuring to increase concurrent callbacks:
414
451
  # require "google/cloud/pubsub"
415
452
  #
416
- # pubsub = Google::Cloud::Pubsub.new
453
+ # pubsub = Google::Cloud::PubSub.new
417
454
  #
418
455
  # sub = pubsub.subscription "my-topic-sub"
419
456
  #
@@ -452,7 +489,7 @@ module Google
452
489
  # @example
453
490
  # require "google/cloud/pubsub"
454
491
  #
455
- # pubsub = Google::Cloud::Pubsub.new
492
+ # pubsub = Google::Cloud::PubSub.new
456
493
  #
457
494
  # sub = pubsub.subscription "my-topic-sub"
458
495
  # received_messages = sub.pull
@@ -474,7 +511,7 @@ module Google
474
511
  # make the messages available for redelivery if the processing was
475
512
  # interrupted.
476
513
  #
477
- # See also {ReceivedMessage#delay!}.
514
+ # See also {ReceivedMessage#modify_ack_deadline!}.
478
515
  #
479
516
  # @param [Integer] new_deadline The new ack deadline in seconds from the
480
517
  # time this request is sent to the Pub/Sub system. Must be >= 0. For
@@ -487,7 +524,7 @@ module Google
487
524
  # @example
488
525
  # require "google/cloud/pubsub"
489
526
  #
490
- # pubsub = Google::Cloud::Pubsub.new
527
+ # pubsub = Google::Cloud::PubSub.new
491
528
  #
492
529
  # sub = pubsub.subscription "my-topic-sub"
493
530
  # received_messages = sub.pull
@@ -499,7 +536,6 @@ module Google
499
536
  service.modify_ack_deadline name, ack_ids, new_deadline
500
537
  true
501
538
  end
502
- alias delay modify_ack_deadline
503
539
 
504
540
  ##
505
541
  # Creates a new {Snapshot} from the subscription. The created snapshot
@@ -529,12 +565,12 @@ module Google
529
565
  # label in the list must have a different key. See [Creating and
530
566
  # Managing Labels](https://cloud.google.com/pubsub/docs/labels).
531
567
  #
532
- # @return [Google::Cloud::Pubsub::Snapshot]
568
+ # @return [Google::Cloud::PubSub::Snapshot]
533
569
  #
534
570
  # @example
535
571
  # require "google/cloud/pubsub"
536
572
  #
537
- # pubsub = Google::Cloud::Pubsub.new
573
+ # pubsub = Google::Cloud::PubSub.new
538
574
  # sub = pubsub.subscription "my-sub"
539
575
  #
540
576
  # snapshot = sub.create_snapshot "my-snapshot"
@@ -543,7 +579,7 @@ module Google
543
579
  # @example Without providing a name:
544
580
  # require "google/cloud/pubsub"
545
581
  #
546
- # pubsub = Google::Cloud::Pubsub.new
582
+ # pubsub = Google::Cloud::PubSub.new
547
583
  # sub = pubsub.subscription "my-sub"
548
584
  #
549
585
  # snapshot = sub.create_snapshot
@@ -579,7 +615,7 @@ module Google
579
615
  # @example Using a snapshot
580
616
  # require "google/cloud/pubsub"
581
617
  #
582
- # pubsub = Google::Cloud::Pubsub.new
618
+ # pubsub = Google::Cloud::PubSub.new
583
619
  # sub = pubsub.subscription "my-sub"
584
620
  #
585
621
  # snapshot = sub.create_snapshot
@@ -592,7 +628,7 @@ module Google
592
628
  # @example Using a time:
593
629
  # require "google/cloud/pubsub"
594
630
  #
595
- # pubsub = Google::Cloud::Pubsub.new
631
+ # pubsub = Google::Cloud::PubSub.new
596
632
  # sub = pubsub.subscription "my-sub"
597
633
  #
598
634
  # time = Time.now
@@ -608,6 +644,44 @@ module Google
608
644
  true
609
645
  end
610
646
 
647
+ ##
648
+ # Determines whether the subscription object was created without
649
+ # retrieving the resource representation from the Pub/Sub service.
650
+ #
651
+ # @return [Boolean] `true` when the subscription was created without a
652
+ # resource representation, `false` otherwise.
653
+ #
654
+ # @example
655
+ # require "google/cloud/pubsub"
656
+ #
657
+ # pubsub = Google::Cloud::PubSub.new
658
+ #
659
+ # sub = pubsub.get_subscription "my-topic-sub", skip_lookup: true
660
+ # sub.reference? #=> true
661
+ #
662
+ def reference?
663
+ @grpc.nil?
664
+ end
665
+
666
+ ##
667
+ # Determines whether the subscription object was created with a resource
668
+ # representation from the Pub/Sub service.
669
+ #
670
+ # @return [Boolean] `true` when the subscription was created with a
671
+ # resource representation, `false` otherwise.
672
+ #
673
+ # @example
674
+ # require "google/cloud/pubsub"
675
+ #
676
+ # pubsub = Google::Cloud::PubSub.new
677
+ #
678
+ # sub = pubsub.get_subscription "my-topic-sub"
679
+ # sub.resource? #=> true
680
+ #
681
+ def resource?
682
+ !@grpc.nil?
683
+ end
684
+
611
685
  ##
612
686
  # Gets the [Cloud IAM](https://cloud.google.com/iam/) access control
613
687
  # policy for this subscription.
@@ -627,7 +701,7 @@ module Google
627
701
  # @example
628
702
  # require "google/cloud/pubsub"
629
703
  #
630
- # pubsub = Google::Cloud::Pubsub.new
704
+ # pubsub = Google::Cloud::PubSub.new
631
705
  # sub = pubsub.subscription "my-subscription"
632
706
  #
633
707
  # policy = sub.policy
@@ -635,7 +709,7 @@ module Google
635
709
  # @example Update the policy by passing a block:
636
710
  # require "google/cloud/pubsub"
637
711
  #
638
- # pubsub = Google::Cloud::Pubsub.new
712
+ # pubsub = Google::Cloud::PubSub.new
639
713
  # sub = pubsub.subscription "my-subscription"
640
714
  #
641
715
  # sub.policy do |p|
@@ -654,7 +728,7 @@ module Google
654
728
  ##
655
729
  # Updates the [Cloud IAM](https://cloud.google.com/iam/) access control
656
730
  # policy for this subscription. The policy should be read from
657
- # {#policy}. See {Google::Cloud::Pubsub::Policy} for an explanation of
731
+ # {#policy}. See {Google::Cloud::PubSub::Policy} for an explanation of
658
732
  # the policy `etag` property and how to modify policies.
659
733
  #
660
734
  # You can also update the policy by passing a block to {#policy}, which
@@ -671,7 +745,7 @@ module Google
671
745
  # @example
672
746
  # require "google/cloud/pubsub"
673
747
  #
674
- # pubsub = Google::Cloud::Pubsub.new
748
+ # pubsub = Google::Cloud::PubSub.new
675
749
  # sub = pubsub.subscription "my-subscription"
676
750
  #
677
751
  # policy = sub.policy # API call
@@ -712,7 +786,7 @@ module Google
712
786
  # @example
713
787
  # require "google/cloud/pubsub"
714
788
  #
715
- # pubsub = Google::Cloud::Pubsub.new
789
+ # pubsub = Google::Cloud::PubSub.new
716
790
  # sub = pubsub.subscription "my-subscription"
717
791
  # perms = sub.test_permissions "pubsub.subscriptions.get",
718
792
  # "pubsub.subscriptions.consume"
@@ -727,7 +801,8 @@ module Google
727
801
  end
728
802
 
729
803
  ##
730
- # @private New Subscription from a Google::Pubsub::V1::Subscription
804
+ # @private
805
+ # New Subscription from a Google::Cloud::PubSub::V1::Subscription
731
806
  # object.
732
807
  def self.from_grpc grpc, service
733
808
  new.tap do |f|
@@ -737,12 +812,12 @@ module Google
737
812
  end
738
813
 
739
814
  ##
740
- # @private New lazy {Topic} object without making an HTTP request.
741
- def self.new_lazy name, service, options = {}
742
- lazy_grpc = Google::Pubsub::V1::Subscription.new \
743
- name: service.subscription_path(name, options)
744
- from_grpc(lazy_grpc, service).tap do |s|
745
- s.instance_variable_set :@lazy, true
815
+ # @private New reference {Subscription} object without making an HTTP
816
+ # request.
817
+ def self.from_name name, service, options = {}
818
+ name = service.subscription_path name, options
819
+ from_grpc(nil, service).tap do |s|
820
+ s.instance_variable_set :@resource_name, name
746
821
  end
747
822
  end
748
823
 
@@ -756,11 +831,11 @@ module Google
756
831
  end
757
832
 
758
833
  ##
759
- # Ensures a Google::Pubsub::V1::Subscription object exists.
834
+ # Ensures a Google::Cloud::PubSub::V1::Subscription object exists.
760
835
  def ensure_grpc!
761
836
  ensure_service!
762
- @grpc = service.get_subscription name if lazy?
763
- @lazy = nil
837
+ @grpc = service.get_subscription name if reference?
838
+ @resource_name = nil
764
839
  end
765
840
 
766
841
  ##
@@ -773,5 +848,7 @@ module Google
773
848
  end
774
849
  end
775
850
  end
851
+
852
+ Pubsub = PubSub unless const_defined? :Pubsub
776
853
  end
777
854
  end