gcloud 0.10.0 → 0.11.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 (59) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG.md +36 -0
  3. data/lib/gcloud/backoff.rb +5 -5
  4. data/lib/gcloud/bigquery.rb +24 -0
  5. data/lib/gcloud/bigquery/connection.rb +32 -25
  6. data/lib/gcloud/bigquery/data.rb +99 -1
  7. data/lib/gcloud/bigquery/dataset.rb +5 -13
  8. data/lib/gcloud/bigquery/dataset/list.rb +124 -2
  9. data/lib/gcloud/bigquery/job/list.rb +125 -2
  10. data/lib/gcloud/bigquery/project.rb +30 -27
  11. data/lib/gcloud/bigquery/query_data.rb +102 -1
  12. data/lib/gcloud/bigquery/table.rb +17 -2
  13. data/lib/gcloud/bigquery/table/list.rb +132 -3
  14. data/lib/gcloud/datastore.rb +30 -19
  15. data/lib/gcloud/datastore/dataset.rb +2 -22
  16. data/lib/gcloud/datastore/dataset/lookup_results.rb +160 -4
  17. data/lib/gcloud/datastore/dataset/query_results.rb +229 -23
  18. data/lib/gcloud/datastore/transaction.rb +2 -5
  19. data/lib/gcloud/dns.rb +20 -0
  20. data/lib/gcloud/dns/change/list.rb +109 -6
  21. data/lib/gcloud/dns/connection.rb +18 -9
  22. data/lib/gcloud/dns/project.rb +4 -8
  23. data/lib/gcloud/dns/record/list.rb +96 -13
  24. data/lib/gcloud/dns/zone.rb +9 -24
  25. data/lib/gcloud/dns/zone/list.rb +102 -5
  26. data/lib/gcloud/dns/zone/transaction.rb +1 -1
  27. data/lib/gcloud/logging.rb +19 -0
  28. data/lib/gcloud/logging/entry/list.rb +83 -14
  29. data/lib/gcloud/logging/metric/list.rb +89 -12
  30. data/lib/gcloud/logging/project.rb +18 -30
  31. data/lib/gcloud/logging/resource_descriptor/list.rb +105 -6
  32. data/lib/gcloud/logging/sink/list.rb +89 -12
  33. data/lib/gcloud/pubsub.rb +23 -0
  34. data/lib/gcloud/pubsub/project.rb +21 -29
  35. data/lib/gcloud/pubsub/service.rb +1 -3
  36. data/lib/gcloud/pubsub/subscription/list.rb +167 -13
  37. data/lib/gcloud/pubsub/topic.rb +15 -13
  38. data/lib/gcloud/pubsub/topic/batch.rb +10 -4
  39. data/lib/gcloud/pubsub/topic/list.rb +134 -8
  40. data/lib/gcloud/resource_manager.rb +24 -0
  41. data/lib/gcloud/resource_manager/connection.rb +18 -9
  42. data/lib/gcloud/resource_manager/manager.rb +7 -4
  43. data/lib/gcloud/resource_manager/project/list.rb +93 -14
  44. data/lib/gcloud/storage.rb +63 -0
  45. data/lib/gcloud/storage/bucket.rb +100 -61
  46. data/lib/gcloud/storage/bucket/list.rb +132 -8
  47. data/lib/gcloud/storage/connection.rb +68 -44
  48. data/lib/gcloud/storage/errors.rb +9 -3
  49. data/lib/gcloud/storage/file.rb +48 -4
  50. data/lib/gcloud/storage/file/list.rb +151 -15
  51. data/lib/gcloud/storage/file/verifier.rb +3 -3
  52. data/lib/gcloud/storage/project.rb +15 -30
  53. data/lib/gcloud/translate.rb +20 -0
  54. data/lib/gcloud/translate/connection.rb +12 -3
  55. data/lib/gcloud/version.rb +1 -1
  56. data/lib/gcloud/vision.rb +20 -0
  57. data/lib/gcloud/vision/connection.rb +10 -1
  58. data/lib/gcloud/vision/image.rb +15 -18
  59. metadata +16 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDg1NjYxMTkxZjIxYmUzNmMyZGMzNDNlY2Y1MGZiZWYwNWYzZTdjOQ==
4
+ MTIzYjc5OWY0M2E1MGJkMTVlNWI5NmM4YTdkZDM3ZWRmZTgyZDRiZQ==
5
5
  data.tar.gz: !binary |-
6
- ZDQwZjAxZGRmZmY4MmNlNGE1NmJiMTc3MTFkYWVmODkzNmFkZmU4Yw==
6
+ Nzg1ZTExY2RhMDRlMDUzMzkyY2FkYTI4ODUyMDc3NTEyMjIzM2QyMw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YzkwYWVjYWZhYTJjMjY2NWM0ZWFjYmNkZDI3YzBiZjc4YTcwOTVjYjhkZTBk
10
- ZmVjMDE4YmQ5Mjc3YmViMzZlNWExOTllMzRmYTE0NTJiMDNkYjI2MDlmMmJk
11
- OWU0N2UzODJlYWI3NjU5NDAwODQ2MjAzMDZkODAwMjVmYTEzYTk=
9
+ YmFjZmQyMjU4NjRhZGM0Zjc4NDYxYmVjYTQyNzhhZGI1ZTAyZjBhYTBjMDZm
10
+ N2U5OWZkOTYzZDk1NjEyNzk0MjJiMTU1OTVlYjZiN2Q1MjhjMTMwYjg2M2U3
11
+ OWI2NWYxMjlmZGE2NDM2MDZjOWExYzIyNDhiMjEzOTE4ZWRjMjY=
12
12
  data.tar.gz: !binary |-
13
- ZTEzMjg3Y2M5ZTAzNjk5MGRjYzZjOTE2ZGQyZjljOTljYjI2NDczMjhkMTgw
14
- OWZiZTZiNTg1YjI3ODU3NGY3NzIxMTBjN2Y2YmI1N2IzNTViMjc4MTNhOTFl
15
- MWZjMzFkZjFkOTM1NDM2YjU4MWM5ODEwNDdmMWJjNDVhOWQ3MGY=
13
+ ZjgzNWI3NjA3ZWFkNmJjZWUxYWM1M2M3MGIxMzdmOTcxMTdlZjIzZjRiOGU3
14
+ Yzk1MWQ0ZDQzYjg0N2Y1MDI2MzhmM2VlNTA0NWY2NWYyMDAzMjU3YmE5YzM3
15
+ ZWI3MTkyMDU2M2YyYzMyYWQ0MTg0YWMwYzc4NWNlNTBmMThlNzU=
data/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Release History
2
2
 
3
+ ### 0.11.0 / 2016-06-13
4
+
5
+ #### Changes
6
+
7
+ * Add backoff to all requests (dolzenko)
8
+ * BigQuery
9
+ * Add `#all` to `Data`
10
+ * Add `#all`, `#next` and `#next?` to `Dataset::List`, `Job::List`,
11
+ `QueryData`, `Table::List` and `Dataset::LookupResults`
12
+ * `#all` methods now return lazy enumerator with `request_limit`
13
+ * Datastore
14
+ * Add `#cursor_for`, `#each_with_cursor` and `#all_with_cursor` to
15
+ `Dataset::QueryResults`
16
+ * `#all` and `#all_with_cursor` methods now return lazy enumerator with
17
+ `request_limit`
18
+ * DNS
19
+ * Add `#all` to `Change::List` and  `Zone::List`
20
+ * `#all` methods now return lazy enumerator with `request_limit`
21
+ * Logging
22
+ * `#all` methods now return lazy enumerator with `request_limit`
23
+ * Pub/Sub
24
+ * Fix bug when publishing multi-byte strings
25
+ * Add support for IO-ish objects
26
+ * Add `#all`, `#next` and `#next?` to `Subscription::List` and `Topic::List`
27
+ * `#all` methods now return lazy enumerator with `request_limit`
28
+ * Resource Manager
29
+ * `#all` methods now return lazy enumerator with `request_limit`
30
+ * Storage
31
+ * Breaking Change: Remove `retries` option from `Bucket#delete` and
32
+ `Project#create_bucket` (configure in `Backoff` instead)
33
+ * Add support for customer-supplied encryption keys
34
+ * Fix issue verifying large files (Aguasvivas22)
35
+ * `#all` methods now return lazy enumerator with `request_limit`
36
+ * Vision
37
+ * Add support for IO-ish objects
38
+
3
39
  ### 0.10.0 / 2016-05-19
4
40
 
5
41
  #### Major Changes
@@ -33,26 +33,26 @@ module Gcloud
33
33
  ##
34
34
  # The number of times a retriable API call should be retried.
35
35
  #
36
- # The default value is 3.
36
+ # The default value is `3`.
37
37
  attr_accessor :retries
38
38
 
39
39
  ##
40
40
  # The GRPC Status Codes that should be retried.
41
41
  #
42
- # The default values are 14.
42
+ # The default values are `14`.
43
43
  attr_accessor :grpc_codes
44
44
 
45
45
  ##
46
46
  # The HTTP Status Codes that should be retried.
47
47
  #
48
- # The default values are 500 and 503.
48
+ # The default values are `500` and `503`.
49
49
  attr_accessor :http_codes
50
50
 
51
51
  ##
52
52
  # The Google API error reasons that should be retried.
53
53
  #
54
- # The default values are rateLimitExceeded and
55
- # userRateLimitExceeded.
54
+ # The default values are `rateLimitExceeded` and
55
+ # `userRateLimitExceeded`.
56
56
  attr_accessor :reasons
57
57
 
58
58
  ##
@@ -386,6 +386,30 @@ module Gcloud
386
386
  # BigQuery](https://cloud.google.com/bigquery/exporting-data-from-bigquery)
387
387
  # for details.
388
388
  #
389
+ # ## Configuring Backoff
390
+ #
391
+ # The {Gcloud::Backoff} class allows users to globally configure how Cloud API
392
+ # requests are automatically retried in the case of some errors, such as a
393
+ # `500` or `503` status code, or a specific internal error code such as
394
+ # `rateLimitExceeded`.
395
+ #
396
+ # If an API call fails, the response will be inspected to see if the call
397
+ # should be retried. If the response matches the criteria, then the request
398
+ # will be retried after a delay. If another error occurs, the delay will be
399
+ # increased incrementally before a subsequent attempt. The first retry will be
400
+ # delayed one second, the second retry two seconds, and so on.
401
+ #
402
+ # ```ruby
403
+ # require "gcloud"
404
+ # require "gcloud/backoff"
405
+ #
406
+ # Gcloud::Backoff.retries = 5 # Raise the maximum number of retries from 3
407
+ # ```
408
+ #
409
+ # See the [BigQuery error
410
+ # table](https://cloud.google.com/bigquery/troubleshooting-errors#errortable)
411
+ # for a list of error conditions.
412
+ #
389
413
  module Bigquery
390
414
  end
391
415
  end
@@ -15,6 +15,7 @@
15
15
 
16
16
  require "pathname"
17
17
  require "gcloud/version"
18
+ require "gcloud/backoff"
18
19
  require "google/api_client"
19
20
  require "digest/md5"
20
21
 
@@ -50,7 +51,7 @@ module Gcloud
50
51
  maxResults: options.delete(:max)
51
52
  }.delete_if { |_, v| v.nil? }
52
53
 
53
- @client.execute(
54
+ execute(
54
55
  api_method: @bigquery.datasets.list,
55
56
  parameters: params
56
57
  )
@@ -59,7 +60,7 @@ module Gcloud
59
60
  ##
60
61
  # Returns the dataset specified by datasetID.
61
62
  def get_dataset dataset_id
62
- @client.execute(
63
+ execute(
63
64
  api_method: @bigquery.datasets.get,
64
65
  parameters: { projectId: @project, datasetId: dataset_id }
65
66
  )
@@ -68,7 +69,7 @@ module Gcloud
68
69
  ##
69
70
  # Creates a new empty dataset.
70
71
  def insert_dataset dataset_id, options = {}
71
- @client.execute(
72
+ execute(
72
73
  api_method: @bigquery.datasets.insert,
73
74
  parameters: { projectId: @project },
74
75
  body_object: insert_dataset_request(dataset_id, options)
@@ -81,7 +82,7 @@ module Gcloud
81
82
  def patch_dataset dataset_id, options = {}
82
83
  project_id = options[:project_id] || @project
83
84
 
84
- @client.execute(
85
+ execute(
85
86
  api_method: @bigquery.datasets.patch,
86
87
  parameters: { projectId: project_id, datasetId: dataset_id },
87
88
  body_object: patch_dataset_request(options)
@@ -95,7 +96,7 @@ module Gcloud
95
96
  # Immediately after deletion, you can create another dataset with
96
97
  # the same name.
97
98
  def delete_dataset dataset_id, force = nil
98
- @client.execute(
99
+ execute(
99
100
  api_method: @bigquery.datasets.delete,
100
101
  parameters: { projectId: @project, datasetId: dataset_id,
101
102
  deleteContents: force
@@ -113,14 +114,14 @@ module Gcloud
113
114
  maxResults: options.delete(:max)
114
115
  }.delete_if { |_, v| v.nil? }
115
116
 
116
- @client.execute(
117
+ execute(
117
118
  api_method: @bigquery.tables.list,
118
119
  parameters: params
119
120
  )
120
121
  end
121
122
 
122
123
  def get_project_table project_id, dataset_id, table_id
123
- @client.execute(
124
+ execute(
124
125
  api_method: @bigquery.tables.get,
125
126
  parameters: { projectId: project_id, datasetId: dataset_id,
126
127
  tableId: table_id }
@@ -139,7 +140,7 @@ module Gcloud
139
140
  ##
140
141
  # Creates a new, empty table in the dataset.
141
142
  def insert_table dataset_id, table_id, options = {}
142
- @client.execute(
143
+ execute(
143
144
  api_method: @bigquery.tables.insert,
144
145
  parameters: { projectId: @project, datasetId: dataset_id },
145
146
  body_object: insert_table_request(dataset_id, table_id, options)
@@ -150,7 +151,7 @@ module Gcloud
150
151
  # Updates information in an existing table, replacing fields that
151
152
  # are provided in the submitted table resource.
152
153
  def patch_table dataset_id, table_id, options = {}
153
- @client.execute(
154
+ execute(
154
155
  api_method: @bigquery.tables.patch,
155
156
  parameters: { projectId: @project, datasetId: dataset_id,
156
157
  tableId: table_id },
@@ -162,7 +163,7 @@ module Gcloud
162
163
  # Deletes the table specified by tableId from the dataset.
163
164
  # If the table contains data, all the data will be deleted.
164
165
  def delete_table dataset_id, table_id
165
- @client.execute(
166
+ execute(
166
167
  api_method: @bigquery.tables.delete,
167
168
  parameters: { projectId: @project, datasetId: dataset_id,
168
169
  tableId: table_id }
@@ -179,14 +180,14 @@ module Gcloud
179
180
  startIndex: options.delete(:start)
180
181
  }.delete_if { |_, v| v.nil? }
181
182
 
182
- @client.execute(
183
+ execute(
183
184
  api_method: @bigquery.tabledata.list,
184
185
  parameters: params
185
186
  )
186
187
  end
187
188
 
188
189
  def insert_tabledata dataset_id, table_id, rows, options = {}
189
- @client.execute(
190
+ execute(
190
191
  api_method: @bigquery.tabledata.insert_all,
191
192
  parameters: { projectId: @project,
192
193
  datasetId: dataset_id,
@@ -199,7 +200,7 @@ module Gcloud
199
200
  # Lists all jobs in the specified project to which you have
200
201
  # been granted the READER job role.
201
202
  def list_jobs options = {}
202
- @client.execute(
203
+ execute(
203
204
  api_method: @bigquery.jobs.list,
204
205
  parameters: list_jobs_params(options)
205
206
  )
@@ -208,14 +209,14 @@ module Gcloud
208
209
  ##
209
210
  # Returns the job specified by jobID.
210
211
  def get_job job_id
211
- @client.execute(
212
+ execute(
212
213
  api_method: @bigquery.jobs.get,
213
214
  parameters: { projectId: @project, jobId: job_id }
214
215
  )
215
216
  end
216
217
 
217
218
  def insert_job config
218
- @client.execute(
219
+ execute(
219
220
  api_method: @bigquery.jobs.insert,
220
221
  parameters: { projectId: @project },
221
222
  body_object: { "configuration" => config }
@@ -223,7 +224,7 @@ module Gcloud
223
224
  end
224
225
 
225
226
  def query_job query, options = {}
226
- @client.execute(
227
+ execute(
227
228
  api_method: @bigquery.jobs.insert,
228
229
  parameters: { projectId: @project },
229
230
  body_object: query_table_config(query, options)
@@ -231,7 +232,7 @@ module Gcloud
231
232
  end
232
233
 
233
234
  def query query, options = {}
234
- @client.execute(
235
+ execute(
235
236
  api_method: @bigquery.jobs.query,
236
237
  parameters: { projectId: @project },
237
238
  body_object: query_config(query, options)
@@ -248,14 +249,14 @@ module Gcloud
248
249
  timeoutMs: options.delete(:timeout)
249
250
  }.delete_if { |_, v| v.nil? }
250
251
 
251
- @client.execute(
252
+ execute(
252
253
  api_method: @bigquery.jobs.get_query_results,
253
254
  parameters: params
254
255
  )
255
256
  end
256
257
 
257
258
  def copy_table source, target, options = {}
258
- @client.execute(
259
+ execute(
259
260
  api_method: @bigquery.jobs.insert,
260
261
  parameters: { projectId: @project },
261
262
  body_object: copy_table_config(source, target, options)
@@ -263,7 +264,7 @@ module Gcloud
263
264
  end
264
265
 
265
266
  def link_table table, urls, options = {}
266
- @client.execute(
267
+ execute(
267
268
  api_method: @bigquery.jobs.insert,
268
269
  parameters: { projectId: @project },
269
270
  body_object: link_table_config(table, urls, options)
@@ -271,7 +272,7 @@ module Gcloud
271
272
  end
272
273
 
273
274
  def extract_table table, storage_files, options = {}
274
- @client.execute(
275
+ execute(
275
276
  api_method: @bigquery.jobs.insert,
276
277
  parameters: { projectId: @project },
277
278
  body_object: extract_table_config(table, storage_files, options)
@@ -279,7 +280,7 @@ module Gcloud
279
280
  end
280
281
 
281
282
  def load_table table, storage_url, options = {}
282
- @client.execute(
283
+ execute(
283
284
  api_method: @bigquery.jobs.insert,
284
285
  parameters: { projectId: @project },
285
286
  body_object: load_table_config(table, storage_url,
@@ -290,7 +291,7 @@ module Gcloud
290
291
  def load_multipart table, file, options = {}
291
292
  media = load_media file
292
293
 
293
- @client.execute(
294
+ execute(
294
295
  api_method: @bigquery.jobs.insert,
295
296
  media: media,
296
297
  parameters: { projectId: @project, uploadType: "multipart" },
@@ -301,14 +302,14 @@ module Gcloud
301
302
  def load_resumable table, file, chunk_size = nil, options = {}
302
303
  media = load_media file, chunk_size
303
304
 
304
- result = @client.execute(
305
+ result = execute(
305
306
  api_method: @bigquery.jobs.insert,
306
307
  media: media,
307
308
  parameters: { projectId: @project, uploadType: "resumable" },
308
309
  body_object: load_table_config(table, nil, file, options)
309
310
  )
310
311
  upload = result.resumable_upload
311
- result = @client.execute upload while upload.resumable?
312
+ result = execute upload while upload.resumable?
312
313
  result
313
314
  end
314
315
 
@@ -612,6 +613,12 @@ module Gcloud
612
613
  media.chunk_size = chunk_size unless chunk_size.nil?
613
614
  media
614
615
  end
616
+
617
+ def execute options
618
+ Gcloud::Backoff.new.execute_gapi do
619
+ @client.execute options
620
+ end
621
+ end
615
622
  end
616
623
  end
617
624
  end
@@ -61,17 +61,115 @@ module Gcloud
61
61
  end
62
62
 
63
63
  ##
64
- # Is there a next page of data?
64
+ # Whether there is a next page of data.
65
+ #
66
+ # @return [Boolean]
67
+ #
68
+ # @example
69
+ # require "gcloud"
70
+ #
71
+ # gcloud = Gcloud.new
72
+ # bigquery = gcloud.bigquery
73
+ # table = dataset.table "my_table"
74
+ #
75
+ # data = table.data
76
+ # if data.next?
77
+ # next_data = data.next
78
+ # end
79
+ #
65
80
  def next?
66
81
  !token.nil?
67
82
  end
68
83
 
84
+ ##
85
+ # Retrieve the next page of data.
86
+ #
87
+ # @return [Data]
88
+ #
89
+ # @example
90
+ # require "gcloud"
91
+ #
92
+ # gcloud = Gcloud.new
93
+ # bigquery = gcloud.bigquery
94
+ # table = dataset.table "my_table"
95
+ #
96
+ # data = table.data
97
+ # if data.next?
98
+ # next_data = data.next
99
+ # end
100
+ #
69
101
  def next
70
102
  return nil unless next?
71
103
  ensure_table!
72
104
  table.data token: token
73
105
  end
74
106
 
107
+ ##
108
+ # Retrieves all rows by repeatedly loading {#next} until {#next?} returns
109
+ # `false`. Calls the given block once for each row, which is passed as the
110
+ # parameter.
111
+ #
112
+ # An Enumerator is returned if no block is given.
113
+ #
114
+ # This method may make several API calls until all rows are retrieved. Be
115
+ # sure to use as narrow a search criteria as possible. Please use with
116
+ # caution.
117
+ #
118
+ # @param [Integer] request_limit The upper limit of API requests to make
119
+ # to load all data. Default is no limit.
120
+ # @yield [row] The block for accessing each row of data.
121
+ # @yieldparam [Hash] row The row object.
122
+ #
123
+ # @return [Enumerator]
124
+ #
125
+ # @example Iterating each rows by passing a block:
126
+ # require "gcloud"
127
+ #
128
+ # gcloud = Gcloud.new
129
+ # bigquery = gcloud.bigquery
130
+ # table = dataset.table "my_table"
131
+ #
132
+ # table.data.all do |row|
133
+ # puts row["word"]
134
+ # end
135
+ #
136
+ # @example Using the enumerator by not passing a block:
137
+ # require "gcloud"
138
+ #
139
+ # gcloud = Gcloud.new
140
+ # bigquery = gcloud.bigquery
141
+ # table = dataset.table "my_table"
142
+ #
143
+ # words = table.data.all.map do |row|
144
+ # row["word"]
145
+ # end
146
+ #
147
+ # @example Limit the number of API calls made:
148
+ # require "gcloud"
149
+ #
150
+ # gcloud = Gcloud.new
151
+ # bigquery = gcloud.bigquery
152
+ # table = dataset.table "my_table"
153
+ #
154
+ # table.data.all(request_limit: 10) do |row|
155
+ # puts row["word"]
156
+ # end
157
+ #
158
+ def all request_limit: nil
159
+ request_limit = request_limit.to_i if request_limit
160
+ return enum_for(:all, request_limit: request_limit) unless block_given?
161
+ results = self
162
+ loop do
163
+ results.each { |r| yield r }
164
+ if request_limit
165
+ request_limit -= 1
166
+ break if request_limit < 0
167
+ end
168
+ break unless results.next?
169
+ results = results.next
170
+ end
171
+ end
172
+
75
173
  ##
76
174
  # Represents Table Data as a list of positional values (array of arrays).
77
175
  # No type conversion is made, e.g. numbers are formatted as strings.