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
@@ -502,23 +502,15 @@ module Gcloud
502
502
  # puts table.name
503
503
  # end
504
504
  #
505
- # @example With pagination: (See {Dataset::List#token})
505
+ # @example Retrieve all tables: (See {Table::List#all})
506
506
  # require "gcloud"
507
507
  #
508
508
  # gcloud = Gcloud.new
509
509
  # bigquery = gcloud.bigquery
510
510
  # dataset = bigquery.dataset "my_dataset"
511
- #
512
- # all_tables = []
513
- # tmp_tables = dataset.tables
514
- # while tmp_tables.any? do
515
- # tmp_tables.each do |table|
516
- # all_tables << table
517
- # end
518
- # # break loop if no more tables available
519
- # break if tmp_tables.token.nil?
520
- # # get the next group of tables
521
- # tmp_tables = dataset.tables token: tmp_tables.token
511
+ # tables = dataset.tables
512
+ # tables.all do |table|
513
+ # puts table.name
522
514
  # end
523
515
  #
524
516
  # @!group Table
@@ -528,7 +520,7 @@ module Gcloud
528
520
  options = { token: token, max: max }
529
521
  resp = connection.list_tables dataset_id, options
530
522
  if resp.success?
531
- Table::List.from_response resp, connection
523
+ Table::List.from_response resp, connection, dataset_id, max
532
524
  else
533
525
  fail ApiError.from_response(resp)
534
526
  end
@@ -30,21 +30,143 @@ module Gcloud
30
30
  attr_accessor :etag
31
31
 
32
32
  ##
33
- # Create a new Dataset::List with an array of datasets.
33
+ # @private Create a new Dataset::List with an array of datasets.
34
34
  def initialize arr = []
35
35
  super arr
36
36
  end
37
37
 
38
+ ##
39
+ # Whether there is a next page of datasets.
40
+ #
41
+ # @return [Boolean]
42
+ #
43
+ # @example
44
+ # require "gcloud"
45
+ #
46
+ # gcloud = Gcloud.new
47
+ # bigquery = gcloud.bigquery
48
+ #
49
+ # datasets = bigquery.datasets
50
+ # if datasets.next?
51
+ # next_datasets = datasets.next
52
+ # end
53
+ def next?
54
+ !token.nil?
55
+ end
56
+
57
+ ##
58
+ # Retrieve the next page of datasets.
59
+ #
60
+ # @return [Dataset::List]
61
+ #
62
+ # @example
63
+ # require "gcloud"
64
+ #
65
+ # gcloud = Gcloud.new
66
+ # bigquery = gcloud.bigquery
67
+ #
68
+ # datasets = bigquery.datasets
69
+ # if datasets.next?
70
+ # next_datasets = datasets.next
71
+ # end
72
+ def next
73
+ return nil unless next?
74
+ ensure_connection!
75
+ options = { all: @hidden, token: token, max: @max }
76
+ resp = @connection.list_datasets options
77
+ if resp.success?
78
+ self.class.from_response resp, @connection
79
+ else
80
+ fail ApiError.from_response(resp)
81
+ end
82
+ end
83
+
84
+ ##
85
+ # Retrieves all datasets by repeatedly loading {#next} until {#next?}
86
+ # returns `false`. Calls the given block once for each dataset, which is
87
+ # passed as the parameter.
88
+ #
89
+ # An Enumerator is returned if no block is given.
90
+ #
91
+ # This method may make several API calls until all datasets are
92
+ # retrieved. Be sure to use as narrow a search criteria as possible.
93
+ # Please use with caution.
94
+ #
95
+ # @param [Integer] request_limit The upper limit of API requests to make
96
+ # to load all datasets. Default is no limit.
97
+ # @yield [dataset] The block for accessing each dataset.
98
+ # @yieldparam [Dataset] dataset The dataset object.
99
+ #
100
+ # @return [Enumerator]
101
+ #
102
+ # @example Iterating each result by passing a block:
103
+ # require "gcloud"
104
+ #
105
+ # gcloud = Gcloud.new
106
+ # bigquery = gcloud.bigquery
107
+ #
108
+ # bigquery.datasets.all do |dataset|
109
+ # puts dataset.name
110
+ # end
111
+ #
112
+ # @example Using the enumerator by not passing a block:
113
+ # require "gcloud"
114
+ #
115
+ # gcloud = Gcloud.new
116
+ # bigquery = gcloud.bigquery
117
+ #
118
+ # all_names = bigquery.datasets.all.map do |dataset|
119
+ # dataset.name
120
+ # end
121
+ #
122
+ # @example Limit the number of API calls made:
123
+ # require "gcloud"
124
+ #
125
+ # gcloud = Gcloud.new
126
+ # bigquery = gcloud.bigquery
127
+ #
128
+ # bigquery.datasets.all(request_limit: 10) do |dataset|
129
+ # puts dataset.name
130
+ # end
131
+ #
132
+ def all request_limit: nil
133
+ request_limit = request_limit.to_i if request_limit
134
+ unless block_given?
135
+ return enum_for(:all, request_limit: request_limit)
136
+ end
137
+ results = self
138
+ loop do
139
+ results.each { |r| yield r }
140
+ if request_limit
141
+ request_limit -= 1
142
+ break if request_limit < 0
143
+ end
144
+ break unless results.next?
145
+ results = results.next
146
+ end
147
+ end
148
+
38
149
  ##
39
150
  # @private New Dataset::List from a response object.
40
- def self.from_response resp, conn
151
+ def self.from_response resp, conn, hidden = nil, max = nil
41
152
  datasets = List.new(Array(resp.data["datasets"]).map do |gapi_object|
42
153
  Dataset.from_gapi gapi_object, conn
43
154
  end)
44
155
  datasets.instance_variable_set "@token", resp.data["nextPageToken"]
45
156
  datasets.instance_variable_set "@etag", resp.data["etag"]
157
+ datasets.instance_variable_set "@connection", conn
158
+ datasets.instance_variable_set "@hidden", hidden
159
+ datasets.instance_variable_set "@max", max
46
160
  datasets
47
161
  end
162
+
163
+ protected
164
+
165
+ ##
166
+ # Raise an error unless an active connection is available.
167
+ def ensure_connection!
168
+ fail "Must have active connection" unless @connection
169
+ end
48
170
  end
49
171
  end
50
172
  end
@@ -33,22 +33,145 @@ module Gcloud
33
33
  attr_accessor :total
34
34
 
35
35
  ##
36
- # Create a new Job::List with an array of jobs.
36
+ # @private Create a new Job::List with an array of jobs.
37
37
  def initialize arr = []
38
38
  super arr
39
39
  end
40
40
 
41
+ ##
42
+ # Whether there is a next page of jobs.
43
+ #
44
+ # @return [Boolean]
45
+ #
46
+ # @example
47
+ # require "gcloud"
48
+ #
49
+ # gcloud = Gcloud.new
50
+ # bigquery = gcloud.bigquery
51
+ #
52
+ # jobs = bigquery.jobs
53
+ # if jobs.next?
54
+ # next_jobs = jobs.next
55
+ # end
56
+ def next?
57
+ !token.nil?
58
+ end
59
+
60
+ ##
61
+ # Retrieve the next page of jobs.
62
+ #
63
+ # @return [Job::List]
64
+ #
65
+ # @example
66
+ # require "gcloud"
67
+ #
68
+ # gcloud = Gcloud.new
69
+ # bigquery = gcloud.bigquery
70
+ #
71
+ # jobs = bigquery.jobs
72
+ # if jobs.next?
73
+ # next_jobs = jobs.next
74
+ # end
75
+ def next
76
+ return nil unless next?
77
+ ensure_connection!
78
+ options = { all: @hidden, token: token, max: @max, filter: @filter }
79
+ resp = @connection.list_jobs options
80
+ if resp.success?
81
+ self.class.from_response resp, @connection, @hidden, @max, @filter
82
+ else
83
+ fail ApiError.from_response(resp)
84
+ end
85
+ end
86
+
87
+ ##
88
+ # Retrieves all jobs by repeatedly loading {#next} until {#next?}
89
+ # returns `false`. Calls the given block once for each job, which is
90
+ # passed as the parameter.
91
+ #
92
+ # An Enumerator is returned if no block is given.
93
+ #
94
+ # This method may make several API calls until all jobs are retrieved.
95
+ # Be sure to use as narrow a search criteria as possible. Please use
96
+ # with caution.
97
+ #
98
+ # @param [Integer] request_limit The upper limit of API requests to make
99
+ # to load all jobs. Default is no limit.
100
+ # @yield [job] The block for accessing each job.
101
+ # @yieldparam [Job] job The job object.
102
+ #
103
+ # @return [Enumerator]
104
+ #
105
+ # @example Iterating each job by passing a block:
106
+ # require "gcloud"
107
+ #
108
+ # gcloud = Gcloud.new
109
+ # bigquery = gcloud.bigquery
110
+ #
111
+ # bigquery.jobs.all do |job|
112
+ # puts job.state
113
+ # end
114
+ #
115
+ # @example Using the enumerator by not passing a block:
116
+ # require "gcloud"
117
+ #
118
+ # gcloud = Gcloud.new
119
+ # bigquery = gcloud.bigquery
120
+ #
121
+ # all_states = bigquery.jobs.all.map do |job|
122
+ # job.state
123
+ # end
124
+ #
125
+ # @example Limit the number of API calls made:
126
+ # require "gcloud"
127
+ #
128
+ # gcloud = Gcloud.new
129
+ # bigquery = gcloud.bigquery
130
+ #
131
+ # bigquery.jobs.all(request_limit: 10) do |job|
132
+ # puts job.state
133
+ # end
134
+ #
135
+ def all request_limit: nil
136
+ request_limit = request_limit.to_i if request_limit
137
+ unless block_given?
138
+ return enum_for(:all, request_limit: request_limit)
139
+ end
140
+ results = self
141
+ loop do
142
+ results.each { |r| yield r }
143
+ if request_limit
144
+ request_limit -= 1
145
+ break if request_limit < 0
146
+ end
147
+ break unless results.next?
148
+ results = results.next
149
+ end
150
+ end
151
+
41
152
  ##
42
153
  # @private New Job::List from a response object.
43
- def self.from_response resp, conn
154
+ def self.from_response resp, conn, hidden = nil, max = nil, filter = nil
44
155
  jobs = List.new(Array(resp.data["jobs"]).map do |gapi_object|
45
156
  Job.from_gapi gapi_object, conn
46
157
  end)
47
158
  jobs.instance_variable_set "@token", resp.data["nextPageToken"]
48
159
  jobs.instance_variable_set "@etag", resp.data["etag"]
49
160
  jobs.instance_variable_set "@total", resp.data["totalItems"]
161
+ jobs.instance_variable_set "@connection", conn
162
+ jobs.instance_variable_set "@hidden", hidden
163
+ jobs.instance_variable_set "@max", max
164
+ jobs.instance_variable_set "@filter", filter
50
165
  jobs
51
166
  end
167
+
168
+ protected
169
+
170
+ ##
171
+ # Raise an error unless an active connection is available.
172
+ def ensure_connection!
173
+ fail "Must have active connection" unless @connection
174
+ end
52
175
  end
53
176
  end
54
177
  end
@@ -210,6 +210,17 @@ module Gcloud
210
210
  # puts row["name"]
211
211
  # end
212
212
  #
213
+ # @example Retrieve all rows: (See {QueryData#all})
214
+ # require "gcloud"
215
+ #
216
+ # gcloud = Gcloud.new
217
+ # bigquery = gcloud.bigquery
218
+ #
219
+ # data = bigquery.query "SELECT name FROM [my_proj:my_data.my_table]"
220
+ # data.all do |row|
221
+ # puts row["name"]
222
+ # end
223
+ #
213
224
  def query query, max: nil, timeout: 10000, dryrun: nil, cache: true,
214
225
  dataset: nil, project: nil
215
226
  ensure_connection!
@@ -352,30 +363,23 @@ module Gcloud
352
363
  # puts dataset.name
353
364
  # end
354
365
  #
355
- # @example Retrieve all datasets, including hidden ones, with `:all`:
366
+ # @example Retrieve hidden datasets with the `all` optional arg:
356
367
  # require "gcloud"
357
368
  #
358
369
  # gcloud = Gcloud.new
359
370
  # bigquery = gcloud.bigquery
360
371
  #
361
- # all_datasets = bigquery.datasets, all: true
372
+ # all_datasets = bigquery.datasets all: true
362
373
  #
363
- # @example With pagination: (See {Dataset::List#token})
374
+ # @example Retrieve all datasets: (See {Dataset::List#all})
364
375
  # require "gcloud"
365
376
  #
366
377
  # gcloud = Gcloud.new
367
378
  # bigquery = gcloud.bigquery
368
379
  #
369
- # all_datasets = []
370
- # tmp_datasets = bigquery.datasets
371
- # while tmp_datasets.any? do
372
- # tmp_datasets.each do |dataset|
373
- # all_datasets << dataset
374
- # end
375
- # # break loop if no more datasets available
376
- # break if tmp_datasets.token.nil?
377
- # # get the next group of datasets
378
- # tmp_datasets = bigquery.datasets token: tmp_datasets.token
380
+ # datasets = bigquery.datasets
381
+ # datasets.all do |dataset|
382
+ # puts dataset.name
379
383
  # end
380
384
  #
381
385
  def datasets all: nil, token: nil, max: nil
@@ -383,7 +387,7 @@ module Gcloud
383
387
  options = { all: all, token: token, max: max }
384
388
  resp = connection.list_datasets options
385
389
  if resp.success?
386
- Dataset::List.from_response resp, connection
390
+ Dataset::List.from_response resp, connection, all, max
387
391
  else
388
392
  fail ApiError.from_response(resp)
389
393
  end
@@ -442,31 +446,30 @@ module Gcloud
442
446
  # bigquery = gcloud.bigquery
443
447
  #
444
448
  # jobs = bigquery.jobs
449
+ # jobs.each do |job|
450
+ # # process job
451
+ # end
445
452
  #
446
- # @example Retrieve only running jobs using the `:filter` option:
453
+ # @example Retrieve only running jobs using the `filter` optional arg:
447
454
  # require "gcloud"
448
455
  #
449
456
  # gcloud = Gcloud.new
450
457
  # bigquery = gcloud.bigquery
451
458
  #
452
459
  # running_jobs = bigquery.jobs filter: "running"
460
+ # running_jobs.each do |job|
461
+ # # process job
462
+ # end
453
463
  #
454
- # @example With pagination: (See {Job::List#token})
464
+ # @example Retrieve all jobs: (See {Job::List#all})
455
465
  # require "gcloud"
456
466
  #
457
467
  # gcloud = Gcloud.new
458
468
  # bigquery = gcloud.bigquery
459
469
  #
460
- # all_jobs = []
461
- # tmp_jobs = bigquery.jobs
462
- # while tmp_jobs.any? do
463
- # tmp_jobs.each do |job|
464
- # all_jobs << job
465
- # end
466
- # # break loop if no more jobs available
467
- # break if tmp_jobs.token.nil?
468
- # # get the next group of jobs
469
- # tmp_jobs = bigquery.jobs token: tmp_jobs.token
470
+ # jobs = bigquery.jobs
471
+ # jobs.all do |job|
472
+ # # process job
470
473
  # end
471
474
  #
472
475
  def jobs all: nil, token: nil, max: nil, filter: nil
@@ -474,7 +477,7 @@ module Gcloud
474
477
  options = { all: all, token: token, max: max, filter: filter }
475
478
  resp = connection.list_jobs options
476
479
  if resp.success?
477
- Job::List.from_response resp, connection
480
+ Job::List.from_response resp, connection, all, max, filter
478
481
  else
479
482
  fail ApiError.from_response(resp)
480
483
  end
@@ -73,11 +73,43 @@ module Gcloud
73
73
  end
74
74
 
75
75
  ##
76
- # Is there a next page of data?
76
+ # Whether there is a next page of query data.
77
+ #
78
+ # @return [Boolean]
79
+ #
80
+ # @example
81
+ # require "gcloud"
82
+ #
83
+ # gcloud = Gcloud.new
84
+ # bigquery = gcloud.bigquery
85
+ # job = bigquery.job "my_job"
86
+ #
87
+ # data = job.query_results
88
+ # if data.next?
89
+ # next_data = data.next
90
+ # end
91
+ #
77
92
  def next?
78
93
  !token.nil?
79
94
  end
80
95
 
96
+ ##
97
+ # Retrieve the next page of query data.
98
+ #
99
+ # @return [QueryData]
100
+ #
101
+ # @example
102
+ # require "gcloud"
103
+ #
104
+ # gcloud = Gcloud.new
105
+ # bigquery = gcloud.bigquery
106
+ # job = bigquery.job "my_job"
107
+ #
108
+ # data = job.query_results
109
+ # if data.next?
110
+ # next_data = data.next
111
+ # end
112
+ #
81
113
  def next
82
114
  return nil unless next?
83
115
  ensure_connection!
@@ -89,6 +121,75 @@ module Gcloud
89
121
  end
90
122
  end
91
123
 
124
+ ##
125
+ # Retrieves all rows by repeatedly loading {#next} until {#next?} returns
126
+ # `false`. Calls the given block once for each row, which is passed as the
127
+ # parameter.
128
+ #
129
+ # An Enumerator is returned if no block is given.
130
+ #
131
+ # This method may make several API calls until all rows are retrieved. Be
132
+ # sure to use as narrow a search criteria as possible. Please use with
133
+ # caution.
134
+ #
135
+ # @param [Integer] request_limit The upper limit of API requests to make
136
+ # to load all data. Default is no limit.
137
+ # @yield [row] The block for accessing each row of data.
138
+ # @yieldparam [Hash] row The row object.
139
+ #
140
+ # @return [Enumerator]
141
+ #
142
+ # @example Iterating each row by passing a block:
143
+ # require "gcloud"
144
+ #
145
+ # gcloud = Gcloud.new
146
+ # bigquery = gcloud.bigquery
147
+ # job = bigquery.job "my_job"
148
+ #
149
+ # data = job.query_results
150
+ # data.all do |row|
151
+ # puts row["word"]
152
+ # end
153
+ #
154
+ # @example Using the enumerator by not passing a block:
155
+ # require "gcloud"
156
+ #
157
+ # gcloud = Gcloud.new
158
+ # bigquery = gcloud.bigquery
159
+ # job = bigquery.job "my_job"
160
+ #
161
+ # data = job.query_results
162
+ # words = data.all.map do |row|
163
+ # row["word"]
164
+ # end
165
+ #
166
+ # @example Limit the number of API calls made:
167
+ # require "gcloud"
168
+ #
169
+ # gcloud = Gcloud.new
170
+ # bigquery = gcloud.bigquery
171
+ # job = bigquery.job "my_job"
172
+ #
173
+ # data = job.query_results
174
+ # data.all(request_limit: 10) do |row|
175
+ # puts row["word"]
176
+ # end
177
+ #
178
+ def all request_limit: nil
179
+ request_limit = request_limit.to_i if request_limit
180
+ return enum_for(:all, request_limit: request_limit) unless block_given?
181
+ results = self
182
+ loop do
183
+ results.each { |r| yield r }
184
+ if request_limit
185
+ request_limit -= 1
186
+ break if request_limit < 0
187
+ end
188
+ break unless results.next?
189
+ results = results.next
190
+ end
191
+ end
192
+
92
193
  ##
93
194
  # The BigQuery {Job} that was created to run the query.
94
195
  def job