google-cloud-spanner 2.10.0 → 2.12.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 507e92dd7d005df48967afbdabd4df9df518bca1cd0da416742bf21de28afa76
4
- data.tar.gz: 14560745cbe0a401d6c5f7c82b9c67c739083e851177c0cbdcdc9006b4acb24e
3
+ metadata.gz: 542daf50ed73132fb41ef599e01527b0f90ea9c345c0a67325eb9fd6fc2a3d0b
4
+ data.tar.gz: 1768835bfc4a7f9c0ed168d9b56c09247e3bab6da4b53cad6e896378520cca7c
5
5
  SHA512:
6
- metadata.gz: 4b21e91bbe78fc964d9ab3c38209857d434ea9c3c3773298a6531527d60d882eb5cd805d6d4acc860454844dde411e9b08b595c1e3d742b759362eb6b9b8644c
7
- data.tar.gz: ee18b40a314dc71b3b58f42af1bb761d2fd36ce5d349bdb9425635e61051399400644faa1e5f43be4a3db6a01591242bfcd8077d051e5f7e00d50f8e766b575d
6
+ metadata.gz: 69cd1d9cdca59e2878b96476245b2395912afc68c9a94cae437e050dd7abe3b11a6d5bd8677822e7846c7cb3644a0cfc303d5d86e79b73b4a36fa8b9f823581b
7
+ data.tar.gz: b135eb58d7ca1f2673f6504e8e6fca8eb8e8ebb9ca85fd94bfa19ff75e6af1127ab9da6cbf6798a060d1ee2faab05cc91a75355b0e45e060308901311ebd354d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Release History
2
2
 
3
+ ### 2.12.1 / 2022-02-16
4
+
5
+ #### Bug Fixes
6
+
7
+ * pass quota_project_id from credentials
8
+
9
+ ### 2.12.0 / 2022-01-11
10
+
11
+ No significant changes.
12
+
13
+ ### 2.11.0 / 2021-12-10
14
+
15
+ #### Features
16
+
17
+ * add admin instance wrapper.
18
+ * Updated benchwrapper and proto for spanner.
19
+ * use gRPC clients for instance/database management.
20
+ * wrapper to create generated admin database client.
21
+
22
+ ### 2.10.1 / 2021-11-09
23
+
24
+ #### Documentation
25
+
26
+ * Add documentation for quota_project Configuration attribute
27
+
3
28
  ### 2.10.0 / 2021-08-24
4
29
 
5
30
  #### Features
data/OVERVIEW.md CHANGED
@@ -23,29 +23,36 @@ create an instance, you choose where your data is stored and how many nodes are
23
23
  used for your data. (For more information, see [Configuration
24
24
  Guide](https://googleapis.dev/ruby/stackdriver/latest/file.INSTRUMENTATION_CONFIGURATION.html).
25
25
 
26
- Use {Google::Cloud::Spanner::Project#create_instance Project#create_instance} to
27
- create an instance:
26
+ Use {Google::Cloud::Spanner::Admin::Instance#instance_admin
27
+ Client#create_instance} to create an instance:
28
28
 
29
29
  ```ruby
30
30
  require "google/cloud/spanner"
31
31
 
32
- spanner = Google::Cloud::Spanner.new
33
-
34
- job = spanner.create_instance "my-instance",
35
- name: "My Instance",
36
- config: "regional-us-central1",
37
- nodes: 5,
38
- labels: { production: :env }
39
-
40
- job.done? #=> false
41
- job.reload! # API call
42
- job.done? #=> true
43
-
44
- if job.error?
45
- status = job.error
46
- else
47
- instance = job.instance
48
- end
32
+ instance_admin_client = \
33
+ Google::Cloud::Spanner::Admin::Instance.instance_admin project_id: "my-project"
34
+
35
+ project_path = \
36
+ instance_admin_client.project_path project: "my-project"
37
+ config_path = \
38
+ instance_admin_client.instance_config_path project: "my-project",
39
+ instance_config: "regional-us-central1"
40
+ instance_path = \
41
+ instance_admin_client.instance_path project: "my-project",
42
+ instance: "my-instance"
43
+
44
+ job = instance_admin_client.create_instance parent: project_path,
45
+ instance_id: "my-instance",
46
+ instance: Google::Cloud::Spanner::Admin::Instance::V1::Instance.new({
47
+ name: instance_path
48
+ display_name: "My Instance",
49
+ config: config_path,
50
+ node_count: 5,
51
+ labels: { "production": :env }
52
+ })
53
+
54
+ job.wait_until_done!
55
+ instance = job.results
49
56
  ```
50
57
 
51
58
  ## Creating databases
@@ -54,26 +61,23 @@ Now that you have created an instance, you can create a database. Cloud
54
61
  Spanner databases hold the tables and indexes that allow you to read and
55
62
  write data. You may create multiple databases in an instance.
56
63
 
57
- Use {Google::Cloud::Spanner::Project#create_database Project#create_database}
58
- (or {Google::Cloud::Spanner::Instance#create_database Instance#create_database})
59
- to create a database:
64
+ Use {Google::Cloud::Spanner::Admin::Database#database_admin
65
+ Client#create_database} to create a database:
60
66
 
61
67
  ```ruby
62
68
  require "google/cloud/spanner"
63
69
 
64
- spanner = Google::Cloud::Spanner.new
70
+ db_admin_client = \
71
+ Google::Cloud::Spanner::Admin::Database.database_admin project_id: "my-project"
65
72
 
66
- job = spanner.create_database "my-instance", "my-database"
73
+ instance_path = \
74
+ db_admin_client.instance_path project: "my-project", instance: "my-instance"
67
75
 
68
- job.done? #=> false
69
- job.reload! # API call
70
- job.done? #=> true
76
+ job = db_admin_client.create_database parent: instance_path,
77
+ create_statement: "CREATE DATABASE my-database",
71
78
 
72
- if job.error?
73
- status = job.error
74
- else
75
- database = job.database
76
- end
79
+ job.wait_until_done!
80
+ database = job.results
77
81
  ```
78
82
 
79
83
  ## Updating database schemas
@@ -83,16 +87,19 @@ continues to serve traffic. Schema updates do not require taking the
83
87
  database offline and they do not lock entire tables or columns; you can
84
88
  continue writing data to the database during the schema update.
85
89
 
86
- Use {Google::Cloud::Spanner::Database#update Database#update} to execute one or
87
- more statements in Cloud Spanner's Data Definition Language (DDL):
90
+ Use {Google::Cloud::Spanner::Admin::Database#database_admin
91
+ Client#update_database_ddl} to execute one or more statements in Cloud Spanner's
92
+ Data Definition Language (DDL):
88
93
 
89
94
  ```ruby
90
95
  require "google/cloud/spanner"
91
96
 
92
- spanner = Google::Cloud::Spanner.new
93
-
94
- database = spanner.database "my-instance", "my-database"
97
+ db_admin_client = \
98
+ Google::Cloud::Spanner::Admin::Database.database_admin project_id: "my-project"
95
99
 
100
+ db_path = db_admin_client.database_path project: "my-project",
101
+ instance: "my-instance",
102
+ database: "my-database"
96
103
  add_users_table_sql = %q(
97
104
  CREATE TABLE users (
98
105
  id INT64 NOT NULL,
@@ -102,13 +109,17 @@ add_users_table_sql = %q(
102
109
  ) PRIMARY KEY(id)
103
110
  )
104
111
 
105
- database.update statements: [add_users_table_sql]
112
+ job = db_admin_client.update_database_ddl database: db_path,
113
+ statements: [add_users_table_sql]
114
+
115
+ job.wait_until_done!
116
+ database = job.results
106
117
  ```
107
118
 
108
119
  ## Creating clients
109
120
 
110
- In order to read and/or write data, you must create a database client. You can
111
- think of a client as a database connection: All of your interactions with Cloud
121
+ In order to read and/or write data, you must create a data client. You can think
122
+ of a client as a database connection: All of your interactions with Cloud
112
123
  Spanner data must go through a client. Typically you create a client when your
113
124
  application starts up, then you re-use that client to read, write, and execute
114
125
  transactions.
@@ -289,33 +300,41 @@ end
289
300
 
290
301
  ## Deleting databases
291
302
 
292
- Use {Google::Cloud::Spanner::Database#drop Database#drop} to delete a database:
303
+ Use {Google::Cloud::Spanner::Admin::Database#database_admin
304
+ Client#drop_database} to delete a database:
293
305
 
294
306
  ```ruby
295
307
  require "google/cloud/spanner"
296
308
 
297
- spanner = Google::Cloud::Spanner.new
309
+ db_admin_client = \
310
+ Google::Cloud::Spanner::Admin::Database.database_admin project_id: "my-project"
298
311
 
299
- database = spanner.database "my-instance", "my-database"
300
-
301
- database.drop
312
+ db_path = db_admin_client.database_path project: "my-project",
313
+ instance: "my-instance",
314
+ database: "my-database"
315
+ db_admin_client.drop_database database: db_path
302
316
  ```
303
317
 
304
318
  ## Deleting instances
305
319
 
306
320
  When you delete an instance, all databases within it are automatically deleted.
307
321
  (If you only delete databases and not your instance, you will still incur
308
- charges for the instance.) Use {Google::Cloud::Spanner::Instance#delete
309
- Instance#delete} to delete an instance:
322
+ charges for the instance.)
323
+
324
+ Use {Google::Cloud::Spanner::Admin::Instance#instance_admin
325
+ Client#delete_instance} to delete an instance:
310
326
 
311
327
  ```ruby
312
328
  require "google/cloud/spanner"
313
329
 
314
- spanner = Google::Cloud::Spanner.new
330
+ instance_admin_client = \
331
+ Google::Cloud::Spanner::Admin::Instance.instance_admin project_id: "my-project"
315
332
 
316
- instance = spanner.instance "my-instance"
333
+ instance_path = \
334
+ instance_admin_client.instance_path project: "my-project",
335
+ instance: "my-instance"
317
336
 
318
- instance.delete
337
+ instance_admin_client.delete_instance name: instance_path
319
338
  ```
320
339
 
321
340
  ## Additional information
@@ -0,0 +1,324 @@
1
+ # Copyright 2021 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
+ require "google-cloud-spanner"
16
+ require "google/cloud/config"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Spanner
21
+ module Admin
22
+ module Database
23
+ ##
24
+ # Create a new client object for a DatabaseAdmin.
25
+ #
26
+ # This returns an instance of
27
+ # [Google::Cloud::Spanner::Admin::Database::V1::DatabaseAdmin::Client](https://googleapis.dev/ruby/google-cloud-spanner-admin-database-v1/latest/Google/Cloud/Spanner/Admin/Database/V1/DatabaseAdmin/Client.html)
28
+ # for version V1 of the API.
29
+ #
30
+ # ## About DatabaseAdmin
31
+ #
32
+ # Google Cloud Spanner Database Admin Service
33
+ #
34
+ # The Cloud Spanner Database Admin API can be used to create, drop, and
35
+ # list databases. It also enables updating the schema of pre-existing
36
+ # databases. It can be also used to create, delete and list backups for a
37
+ # database and to restore from an existing backup.
38
+ #
39
+ # For more information on connecting to Google Cloud see the
40
+ # {file:AUTHENTICATION.md Authentication Guide}.
41
+ #
42
+ # @param [String] project_id Project identifier for the Spanner service
43
+ # you are connecting to. If not present, the default project for the
44
+ # credentials is used.
45
+ # @param [String, Hash, Google::Auth::Credentials] credentials The path to
46
+ # the keyfile as a String, the contents of the keyfile as a Hash, or a
47
+ # Google::Auth::Credentials object. (See {Spanner::Credentials})
48
+ # If `emulator_host` is present, this becomes optional and the value is
49
+ # internally overriden with `:this_channel_is_insecure`.
50
+ # @param [String, Array<String>] scope The OAuth 2.0 scopes controlling
51
+ # the set of resources and operations that the connection can access.
52
+ # See [Using OAuth 2.0 to Access Google
53
+ # APIs](https://developers.google.com/identity/protocols/OAuth2).
54
+ #
55
+ # The default scopes are:
56
+ #
57
+ # * `https://www.googleapis.com/auth/spanner`
58
+ # * `https://www.googleapis.com/auth/spanner.data`
59
+ # @param [Integer] timeout Default timeout to use in requests. Optional.
60
+ # @param [String] endpoint Override of the endpoint host name. Optional.
61
+ # If the param is nil, uses `emulator_host` or the default endpoint.
62
+ # @param [String] project Alias for the `project_id` argument. Deprecated.
63
+ # @param [String] keyfile Alias for the `credentials` argument.
64
+ # Deprecated.
65
+ # @param [String] emulator_host Spanner emulator host. Optional.
66
+ # If the param is nil, uses the value of the `emulator_host` config.
67
+ # @param [String] lib_name Library name. This will be added as a prefix
68
+ # to the API call tracking header `x-goog-api-client` with provided
69
+ # lib version for telemetry. Optional. For example prefix looks like
70
+ # `spanner-activerecord/0.0.1 gccl/1.13.1`. Here,
71
+ # `spanner-activerecord/0.0.1` is provided custom library name and
72
+ # version and `gccl/1.13.1` represents the Cloud Spanner Ruby library
73
+ # with version.
74
+ # @param [String] lib_version Library version. This will be added as a
75
+ # prefix to the API call tracking header `x-goog-api-client` with
76
+ # provided lib name for telemetry. Optional. For example prefix look like
77
+ # `spanner-activerecord/0.0.1 gccl/1.13.1`. Here,
78
+ # `spanner-activerecord/0.0.1` is provided custom library name and
79
+ # version and `gccl/1.13.1` represents the Cloud Spanner Ruby library
80
+ # with version.
81
+ #
82
+ # @return [Admin::Database::V1::DatabaseAdmin::Client] A client object of version V1.
83
+ #
84
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/MethodLength
85
+ def self.database_admin project_id: nil,
86
+ credentials: nil,
87
+ scope: nil,
88
+ timeout: nil,
89
+ endpoint: nil,
90
+ project: nil,
91
+ keyfile: nil,
92
+ emulator_host: nil,
93
+ lib_name: nil,
94
+ lib_version: nil
95
+ project_id ||= project || default_project_id
96
+ scope ||= configure.scope
97
+ timeout ||= configure.timeout
98
+ emulator_host ||= configure.emulator_host
99
+ endpoint ||= emulator_host || configure.endpoint
100
+ credentials ||= keyfile
101
+ lib_name ||= configure.lib_name
102
+ lib_version ||= configure.lib_version
103
+
104
+ if emulator_host
105
+ credentials = :this_channel_is_insecure
106
+ else
107
+ credentials ||= default_credentials scope: scope
108
+ unless credentials.is_a? Google::Auth::Credentials
109
+ credentials = Spanner::Credentials.new credentials, scope: scope
110
+ end
111
+
112
+ if credentials.respond_to? :project_id
113
+ project_id ||= credentials.project_id
114
+ end
115
+ end
116
+
117
+ project_id = project_id.to_s # Always cast to a string
118
+ raise ArgumentError, "project_id is missing" if project_id.empty?
119
+
120
+ configure.quota_project ||= credentials.quota_project_id if credentials.respond_to? :quota_project_id
121
+
122
+ Admin::Database::V1::DatabaseAdmin::Client.new do |config|
123
+ config.credentials = channel endpoint, credentials
124
+ config.quota_project = configure.quota_project
125
+ config.timeout = timeout if timeout
126
+ config.endpoint = endpoint if endpoint
127
+ config.lib_name = lib_name_with_prefix lib_name, lib_version
128
+ config.lib_version = Google::Cloud::Spanner::VERSION
129
+ config.metadata = { "google-cloud-resource-prefix" => "projects/#{project_id}" }
130
+ end
131
+ end
132
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/MethodLength
133
+
134
+ ##
135
+ # Configure the Google Cloud Spanner Database Admin library. This configuration can be
136
+ # applied globally to all clients.
137
+ #
138
+ # @example
139
+ #
140
+ # Modify the global config, setting the timeout to 10 seconds for all admin databases.
141
+ #
142
+ # require "google/cloud/spanner/admin/database"
143
+ #
144
+ # ::Google::Cloud::Spanner::Admin::Database.configure do |config|
145
+ # config.timeout = 10.0
146
+ # end
147
+ #
148
+ # The following configuration parameters are supported:
149
+ #
150
+ # * `credentials` (*type:* `String, Hash, Google::Auth::Credentials`) -
151
+ # The path to the keyfile as a String, the contents of the keyfile as a
152
+ # Hash, or a Google::Auth::Credentials object.
153
+ # * `lib_name` (*type:* `String`) -
154
+ # The library name as recorded in instrumentation and logging.
155
+ # * `lib_version` (*type:* `String`) -
156
+ # The library version as recorded in instrumentation and logging.
157
+ # * `interceptors` (*type:* `Array<GRPC::ClientInterceptor>`) -
158
+ # An array of interceptors that are run before calls are executed.
159
+ # * `timeout` (*type:* `Numeric`) -
160
+ # Default timeout in seconds.
161
+ # * `emulator_host` - (String) Host name of the emulator. Defaults to
162
+ # `ENV["SPANNER_EMULATOR_HOST"]`.
163
+ # * `metadata` (*type:* `Hash{Symbol=>String}`) -
164
+ # Additional gRPC headers to be sent with the call.
165
+ # * `retry_policy` (*type:* `Hash`) -
166
+ # The retry policy. The value is a hash with the following keys:
167
+ # * `:initial_delay` (*type:* `Numeric`) - The initial delay in seconds.
168
+ # * `:max_delay` (*type:* `Numeric`) - The max delay in seconds.
169
+ # * `:multiplier` (*type:* `Numeric`) - The incremental backoff multiplier.
170
+ # * `:retry_codes` (*type:* `Array<String>`) -
171
+ # The error codes that should trigger a retry.
172
+ #
173
+ # @return [::Google::Cloud::Config] The default configuration used by this library
174
+ #
175
+ def self.configure
176
+ @configure ||= begin
177
+ namespace = ["Google", "Cloud", "Spanner"]
178
+ parent_config = while namespace.any?
179
+ parent_name = namespace.join "::"
180
+ parent_const = const_get parent_name
181
+ break parent_const.configure if parent_const.respond_to? :configure
182
+ namespace.pop
183
+ end
184
+
185
+ default_config = Database::Configuration.new parent_config
186
+ default_config
187
+ end
188
+ yield @configure if block_given?
189
+ @configure
190
+ end
191
+
192
+ ##
193
+ # @private Default project.
194
+ def self.default_project_id
195
+ Google::Cloud.configure.spanner.project_id ||
196
+ Google::Cloud.configure.project_id ||
197
+ Google::Cloud.env.project_id
198
+ end
199
+
200
+ ##
201
+ # @private Default credentials.
202
+ def self.default_credentials scope: nil
203
+ Google::Cloud.configure.spanner.credentials ||
204
+ Google::Cloud.configure.credentials ||
205
+ Spanner::Credentials.default(scope: scope)
206
+ end
207
+
208
+ ##
209
+ # @private gRPC channel.
210
+ def self.channel host, credentials
211
+ require "grpc"
212
+ GRPC::Core::Channel.new host, chan_args, chan_creds(credentials)
213
+ end
214
+
215
+ ##
216
+ # @private gRPC channel args.
217
+ def self.chan_args
218
+ { "grpc.service_config_disable_resolution" => 1 }
219
+ end
220
+
221
+ ##
222
+ # @private gRPC channel credentials
223
+ def self.chan_creds credentials
224
+ return credentials if credentials == :this_channel_is_insecure
225
+ require "grpc"
226
+ GRPC::Core::ChannelCredentials.new.compose \
227
+ GRPC::Core::CallCredentials.new credentials.client.updater_proc
228
+ end
229
+
230
+ ##
231
+ # @private Spanner client library version with the prefix.
232
+ def self.lib_name_with_prefix lib_name, lib_version
233
+ return "gccl" if [nil, "gccl"].include? lib_name
234
+
235
+ value = lib_name.dup
236
+ value << "/#{lib_version}" if lib_version
237
+ value << " gccl"
238
+ end
239
+
240
+ ##
241
+ # Configuration class for the Spanner Admin Database.
242
+ #
243
+ # This class provides control over timeouts, retry behavior,
244
+ # query options, and other low-level controls.
245
+ #
246
+ # @!attribute [rw] endpoint
247
+ # The hostname or hostname:port of the service endpoint.
248
+ # Defaults to `"spanner.googleapis.com"`.
249
+ # @return [::String]
250
+ # @!attribute [rw] credentials
251
+ # Credentials to send with calls. You may provide any of the following types:
252
+ # * (`String`) The path to a service account key file in JSON format
253
+ # * (`Hash`) A service account key as a Hash
254
+ # * (`Google::Auth::Credentials`) A googleauth credentials object
255
+ # (see the [googleauth docs](https://googleapis.dev/ruby/googleauth/latest/index.html))
256
+ # * (`Signet::OAuth2::Client`) A signet oauth2 client object
257
+ # (see the [signet docs](https://googleapis.dev/ruby/signet/latest/Signet/OAuth2/Client.html))
258
+ # * (`GRPC::Core::Channel`) a gRPC channel with included credentials
259
+ # * (`GRPC::Core::ChannelCredentials`) a gRPC credentails object
260
+ # * (`nil`) indicating no credentials
261
+ # @return [::Object]
262
+ # @!attribute [rw] scope
263
+ # The OAuth scopes
264
+ # @return [::Array<::String>]
265
+ # @!attribute [rw] lib_name
266
+ # The library name as recorded in instrumentation and logging
267
+ # @return [::String]
268
+ # @!attribute [rw] lib_version
269
+ # The library version as recorded in instrumentation and logging
270
+ # @return [::String]
271
+ # @!attribute [rw] interceptors
272
+ # An array of interceptors that are run before calls are executed.
273
+ # @return [::Array<::GRPC::ClientInterceptor>]
274
+ # @!attribute [rw] timeout
275
+ # The call timeout in seconds.
276
+ # @return [::Numeric]
277
+ # @!attribute [rw] metadata
278
+ # Additional gRPC headers to be sent with the call.
279
+ # @return [::Hash{::Symbol=>::String}]
280
+ # @!attribute [rw] retry_policy
281
+ # The retry policy. The value is a hash with the following keys:
282
+ # * `:initial_delay` (*type:* `Numeric`) - The initial delay in seconds.
283
+ # * `:max_delay` (*type:* `Numeric`) - The max delay in seconds.
284
+ # * `:multiplier` (*type:* `Numeric`) - The incremental backoff multiplier.
285
+ # * `:retry_codes` (*type:* `Array<String>`) - The error codes that should
286
+ # trigger a retry.
287
+ # @return [::Hash]
288
+ # @!attribute [rw] quota_project
289
+ # A separate project against which to charge quota.
290
+ # @return [::String]
291
+ #
292
+ class Configuration
293
+ extend ::Gapic::Config
294
+
295
+ config_attr :endpoint, "spanner.googleapis.com", ::String
296
+ config_attr :credentials, nil do |value|
297
+ allowed = [::String, ::Hash, ::Google::Auth::Credentials, ::Signet::OAuth2::Client, nil]
298
+ allowed += [::GRPC::Core::Channel, ::GRPC::Core::ChannelCredentials] if defined? ::GRPC
299
+ allowed.any? { |klass| klass === value }
300
+ end
301
+ config_attr :project_id, nil, ::String, nil
302
+ config_attr :scope, nil, ::String, ::Array, nil
303
+ config_attr :lib_name, nil, ::String, nil
304
+ config_attr :lib_version, nil, ::String, nil
305
+ config_attr :interceptors, nil, ::Array, nil
306
+ config_attr :timeout, nil, ::Numeric, nil
307
+ config_attr :quota_project, nil, ::String, nil
308
+ config_attr :emulator_host, nil, ::String, nil
309
+ config_attr :query_options, nil, ::Hash, nil
310
+ config_attr :metadata, nil, ::Hash, nil
311
+ config_attr :retry_policy, nil, ::Hash, nil
312
+
313
+ # @private
314
+ def initialize parent_config = nil
315
+ @parent_config = parent_config unless parent_config.nil?
316
+
317
+ yield self if block_given?
318
+ end
319
+ end
320
+ end
321
+ end
322
+ end
323
+ end
324
+ end