google-cloud-spanner 0.21.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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/lib/google-cloud-spanner.rb +106 -0
  3. data/lib/google/cloud/spanner.rb +382 -0
  4. data/lib/google/cloud/spanner/admin/database/v1.rb +17 -0
  5. data/lib/google/cloud/spanner/admin/database/v1/database_admin_client.rb +703 -0
  6. data/lib/google/cloud/spanner/admin/database/v1/database_admin_client_config.json +73 -0
  7. data/lib/google/cloud/spanner/admin/database/v1/doc/google/iam/v1/policy.rb +139 -0
  8. data/lib/google/cloud/spanner/admin/database/v1/doc/google/protobuf/any.rb +114 -0
  9. data/lib/google/cloud/spanner/admin/database/v1/doc/google/rpc/status.rb +83 -0
  10. data/lib/google/cloud/spanner/admin/database/v1/doc/google/spanner/admin/database/v1/spanner_database_admin.rb +188 -0
  11. data/lib/google/cloud/spanner/admin/instance/v1.rb +17 -0
  12. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/iam/v1/policy.rb +139 -0
  13. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/protobuf/any.rb +114 -0
  14. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/protobuf/field_mask.rb +223 -0
  15. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/rpc/status.rb +83 -0
  16. data/lib/google/cloud/spanner/admin/instance/v1/doc/google/spanner/admin/instance/v1/spanner_instance_admin.rb +268 -0
  17. data/lib/google/cloud/spanner/admin/instance/v1/instance_admin_client.rb +868 -0
  18. data/lib/google/cloud/spanner/admin/instance/v1/instance_admin_client_config.json +78 -0
  19. data/lib/google/cloud/spanner/client.rb +1034 -0
  20. data/lib/google/cloud/spanner/commit.rb +351 -0
  21. data/lib/google/cloud/spanner/convert.rb +311 -0
  22. data/lib/google/cloud/spanner/credentials.rb +32 -0
  23. data/lib/google/cloud/spanner/data.rb +199 -0
  24. data/lib/google/cloud/spanner/database.rb +377 -0
  25. data/lib/google/cloud/spanner/database/job.rb +179 -0
  26. data/lib/google/cloud/spanner/database/list.rb +171 -0
  27. data/lib/google/cloud/spanner/errors.rb +73 -0
  28. data/lib/google/cloud/spanner/fields.rb +252 -0
  29. data/lib/google/cloud/spanner/instance.rb +472 -0
  30. data/lib/google/cloud/spanner/instance/config.rb +99 -0
  31. data/lib/google/cloud/spanner/instance/config/list.rb +171 -0
  32. data/lib/google/cloud/spanner/instance/job.rb +197 -0
  33. data/lib/google/cloud/spanner/instance/list.rb +167 -0
  34. data/lib/google/cloud/spanner/policy.rb +201 -0
  35. data/lib/google/cloud/spanner/pool.rb +279 -0
  36. data/lib/google/cloud/spanner/project.rb +480 -0
  37. data/lib/google/cloud/spanner/range.rb +99 -0
  38. data/lib/google/cloud/spanner/results.rb +280 -0
  39. data/lib/google/cloud/spanner/service.rb +458 -0
  40. data/lib/google/cloud/spanner/session.rb +565 -0
  41. data/lib/google/cloud/spanner/snapshot.rb +260 -0
  42. data/lib/google/cloud/spanner/transaction.rb +533 -0
  43. data/lib/google/cloud/spanner/v1.rb +17 -0
  44. data/lib/google/cloud/spanner/v1/doc/google/protobuf/duration.rb +77 -0
  45. data/lib/google/cloud/spanner/v1/doc/google/protobuf/struct.rb +73 -0
  46. data/lib/google/cloud/spanner/v1/doc/google/protobuf/timestamp.rb +81 -0
  47. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/keys.rb +148 -0
  48. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/mutation.rb +80 -0
  49. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/query_plan.rb +120 -0
  50. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/result_set.rb +175 -0
  51. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/spanner.rb +206 -0
  52. data/lib/google/cloud/spanner/v1/doc/google/spanner/v1/transaction.rb +351 -0
  53. data/lib/google/cloud/spanner/v1/spanner_client.rb +850 -0
  54. data/lib/google/cloud/spanner/v1/spanner_client_config.json +78 -0
  55. data/lib/google/cloud/spanner/version.rb +22 -0
  56. data/lib/google/spanner/admin/database/v1/spanner_database_admin_pb.rb +85 -0
  57. data/lib/google/spanner/admin/database/v1/spanner_database_admin_services_pb.rb +95 -0
  58. data/lib/google/spanner/admin/instance/v1/spanner_instance_admin_pb.rb +106 -0
  59. data/lib/google/spanner/admin/instance/v1/spanner_instance_admin_services_pb.rb +180 -0
  60. data/lib/google/spanner/v1/keys_pb.rb +33 -0
  61. data/lib/google/spanner/v1/mutation_pb.rb +38 -0
  62. data/lib/google/spanner/v1/query_plan_pb.rb +47 -0
  63. data/lib/google/spanner/v1/result_set_pb.rb +43 -0
  64. data/lib/google/spanner/v1/spanner_pb.rb +90 -0
  65. data/lib/google/spanner/v1/spanner_services_pb.rb +131 -0
  66. data/lib/google/spanner/v1/transaction_pb.rb +51 -0
  67. data/lib/google/spanner/v1/type_pb.rb +43 -0
  68. metadata +309 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3ecf7b383ed94a1522a5d90bd7574113f087c5ab
4
+ data.tar.gz: c4698851d6e116762e2ea65a3e6e74f252af7060
5
+ SHA512:
6
+ metadata.gz: 6014ed1d974e1524681604fc4da27ff8404308e7e5998ff6b2aa7c69cfc9d599d41a4312755177c33c4c499cc18c8623ce59fe433cebe30ce0dff96c63c73439
7
+ data.tar.gz: a38b63f7ebada70240457881d43d12df69238ad0562f2a9384647c74cf8ddcec34e286e7946e657c55cfe5d09e467e0ae2655fbe32ac89c4ab2cef26e6e2e7c1
@@ -0,0 +1,106 @@
1
+ # Copyright 2016 Google Inc. All rights reserved.
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
+ # http://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
+ # This file is here to be autorequired by bundler, so that the .spanner and
17
+ # #spanner methods can be available, but the library and all dependencies won't
18
+ # be loaded until required and used.
19
+
20
+
21
+ gem "google-cloud-core"
22
+ require "google/cloud"
23
+
24
+ module Google
25
+ module Cloud
26
+ ##
27
+ # Creates a new object for connecting to the Spanner service.
28
+ # Each call creates a new connection.
29
+ #
30
+ # For more information on connecting to Google Cloud see the [Authentication
31
+ # Guide](https://googlecloudplatform.github.io/google-cloud-ruby/#/docs/guides/authentication).
32
+ #
33
+ # @param [String, Array<String>] scope The OAuth 2.0 scopes controlling the
34
+ # set of resources and operations that the connection can access. See
35
+ # [Using OAuth 2.0 to Access Google
36
+ # APIs](https://developers.google.com/identity/protocols/OAuth2).
37
+ #
38
+ # The default scopes are:
39
+ #
40
+ # * `https://www.googleapis.com/auth/spanner`
41
+ # * `https://www.googleapis.com/auth/spanner.data`
42
+ # @param [Integer] timeout Default timeout to use in requests. Optional.
43
+ # @param [Hash] client_config A hash of values to override the default
44
+ # behavior of the API client. Optional.
45
+ #
46
+ # @return [Google::Cloud::Spanner::Project]
47
+ #
48
+ # @example
49
+ # require "google/cloud"
50
+ #
51
+ # gcloud = Google::Cloud.new
52
+ # spanner = gcloud.spanner
53
+ #
54
+ # @example The default scope can be overridden with the `scope` option:
55
+ # require "google/cloud"
56
+ #
57
+ # gcloud = Google::Cloud.new
58
+ # platform_scope = "https://www.googleapis.com/auth/cloud-platform"
59
+ # spanner = gcloud.spanner scope: platform_scope
60
+ #
61
+ def spanner scope: nil, timeout: nil, client_config: nil
62
+ Google::Cloud.spanner @project, @keyfile, scope: scope,
63
+ timeout: (timeout || @timeout),
64
+ client_config: client_config
65
+ end
66
+
67
+ ##
68
+ # Creates a new object for connecting to the Spanner service.
69
+ # Each call creates a new connection.
70
+ #
71
+ # For more information on connecting to Google Cloud see the [Authentication
72
+ # Guide](https://googlecloudplatform.github.io/google-cloud-ruby/#/docs/guides/authentication).
73
+ #
74
+ # @param [String] project Project identifier for the Spanner service you are
75
+ # connecting to.
76
+ # @param [String, Hash] keyfile Keyfile downloaded from Google Cloud. If
77
+ # file path the file must be readable.
78
+ # @param [String, Array<String>] scope The OAuth 2.0 scopes controlling the
79
+ # set of resources and operations that the connection can access. See
80
+ # [Using OAuth 2.0 to Access Google
81
+ # APIs](https://developers.google.com/identity/protocols/OAuth2).
82
+ #
83
+ # The default scopes are:
84
+ #
85
+ # * `https://www.googleapis.com/auth/spanner`
86
+ # * `https://www.googleapis.com/auth/spanner.data`
87
+ # @param [Integer] timeout Default timeout to use in requests. Optional.
88
+ # @param [Hash] client_config A hash of values to override the default
89
+ # behavior of the API client. Optional.
90
+ #
91
+ # @return [Google::Cloud::Spanner::Project]
92
+ #
93
+ # @example
94
+ # require "google/cloud"
95
+ #
96
+ # spanner = Google::Cloud.spanner
97
+ #
98
+ def self.spanner project = nil, keyfile = nil, scope: nil, timeout: nil,
99
+ client_config: nil
100
+ require "google/cloud/spanner"
101
+ Google::Cloud::Spanner.new project: project, keyfile: keyfile,
102
+ scope: scope, timeout: timeout,
103
+ client_config: client_config
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,382 @@
1
+ # Copyright 2016 Google Inc. All rights reserved.
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
+ # http://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 "google-cloud-spanner"
17
+ require "google/cloud/spanner/project"
18
+
19
+ module Google
20
+ module Cloud
21
+ ##
22
+ # # Cloud Spanner
23
+ #
24
+ # Cloud Spanner is a fully managed, mission-critical, relational database
25
+ # service that offers transactional consistency at global scale, schemas,
26
+ # SQL (ANSI 2011 with extensions), and automatic, synchronous replication
27
+ # for high availability.
28
+ #
29
+ # For more information about Cloud Spanner, read the [Cloud
30
+ # Spanner Documentation](https://cloud.google.com/spanner/docs/).
31
+ #
32
+ # The goal of google-cloud is to provide an API that is comfortable to
33
+ # Rubyists. Authentication is handled by {Google::Cloud#spanner}. You can
34
+ # provide the project and credential information to connect to the Cloud
35
+ # Spanner service, or if you are running on Google Compute Engine this
36
+ # configuration is taken care of for you. You can read more about the
37
+ # options for connecting in the [Authentication
38
+ # Guide](https://googlecloudplatform.github.io/google-cloud-ruby/#/docs/guides/authentication).
39
+ #
40
+ # ## Creating instances
41
+ #
42
+ # When you first use Cloud Spanner, you must create an instance, which is an
43
+ # allocation of resources that are used by Cloud Spanner databases. When you
44
+ # create an instance, you choose where your data is stored and how many
45
+ # nodes are used for your data. (For more information, see [Instance
46
+ # Configuration](https://cloud.google.com/spanner/docs/instance-configuration)).
47
+ #
48
+ # Use {Spanner::Project#create_instance} to create an instance:
49
+ #
50
+ # ```ruby
51
+ # require "google/cloud/spanner"
52
+ #
53
+ # spanner = Google::Cloud::Spanner.new
54
+ #
55
+ # job = spanner.create_instance "my-instance",
56
+ # name: "My Instance",
57
+ # config: "regional-us-central1",
58
+ # nodes: 5,
59
+ # labels: { production: :env }
60
+ #
61
+ # job.done? #=> false
62
+ # job.reload! # API call
63
+ # job.done? #=> true
64
+ # instance = job.instance
65
+ # ```
66
+ #
67
+ # ## Creating databases
68
+ #
69
+ # Now that you have created an instance, you can create a database. Cloud
70
+ # Spanner databases hold the tables and indexes that allow you to read and
71
+ # write data. You may create multiple databases in an instance.
72
+ #
73
+ # Use {Spanner::Project#create_database} (or
74
+ # {Spanner::Instance#create_database}) to create a database:
75
+ #
76
+ # ```ruby
77
+ # require "google/cloud/spanner"
78
+ #
79
+ # spanner = Google::Cloud::Spanner.new
80
+ #
81
+ # job = spanner.create_database "my-instance", "my-database"
82
+ #
83
+ # job.done? #=> false
84
+ # job.reload! # API call
85
+ # job.done? #=> true
86
+ # database = job.database
87
+ # ```
88
+ #
89
+ # ## Updating database schemas
90
+ #
91
+ # Cloud Spanner supports schema updates to a database while the database
92
+ # continues to serve traffic. Schema updates do not require taking the
93
+ # database offline and they do not lock entire tables or columns; you can
94
+ # continue writing data to the database during the schema update.
95
+ #
96
+ # Use {Spanner::Database#update} to execute one or more statements in Cloud
97
+ # Spanner's Data Definition Language (DDL):
98
+ #
99
+ # ```ruby
100
+ # require "google/cloud/spanner"
101
+ #
102
+ # spanner = Google::Cloud::Spanner.new
103
+ #
104
+ # database = spanner.database "my-instance", "my-database"
105
+ #
106
+ # add_users_table_sql = %q(
107
+ # CREATE TABLE users (
108
+ # id INT64 NOT NULL,
109
+ # username STRING(25) NOT NULL,
110
+ # name STRING(45) NOT NULL,
111
+ # email STRING(128),
112
+ # ) PRIMARY KEY(id)
113
+ # )
114
+ #
115
+ # database.update statements: [add_users_table_sql]
116
+ # ```
117
+ #
118
+ # ## Creating clients
119
+ #
120
+ # In order to read and/or write data, you must create a database client.
121
+ # You can think of a client as a database connection: All of your
122
+ # interactions with Cloud Spanner data must go through a client. Typically
123
+ # you create a client when your application starts up, then you re-use that
124
+ # client to read, write, and execute transactions.
125
+ #
126
+ # Use {Spanner::Project#client} to create a client:
127
+ #
128
+ # ```ruby
129
+ # require "google/cloud/spanner"
130
+ #
131
+ # spanner = Google::Cloud::Spanner.new
132
+ #
133
+ # db = spanner.client "my-instance", "my-database"
134
+ #
135
+ # results = client.execute "SELECT 1"
136
+ #
137
+ # results.rows.each do |row|
138
+ # puts row
139
+ # end
140
+ # ```
141
+ #
142
+ # ## Writing data
143
+ #
144
+ # You write data using your client object. The client object supports
145
+ # various mutation operations, as well as combinations of inserts, updates,
146
+ # deletes, etc., that can be applied atomically to different rows and/or
147
+ # tables in a database.
148
+ #
149
+ # Use {Spanner::Client#commit} to execute various mutations atomically at a
150
+ # single logical point in time. All changes are accumulated in memory until
151
+ # the block completes. Unlike {Spanner::Client#transaction}, which can also
152
+ # perform reads, this operation accepts only mutations and makes a single
153
+ # API request.
154
+ #
155
+ # ```ruby
156
+ # require "google/cloud/spanner"
157
+ #
158
+ # spanner = Google::Cloud::Spanner.new
159
+ #
160
+ # db = spanner.client "my-instance", "my-database"
161
+ #
162
+ # db.commit do |c|
163
+ # c.update "users", [{ id: 1, name: "Charlie", active: false }]
164
+ # c.insert "users", [{ id: 2, name: "Harvey", active: true }]
165
+ # end
166
+ # ```
167
+ #
168
+ # ## Querying data using SQL
169
+ #
170
+ # Cloud Spanner supports a native SQL interface for reading data that is
171
+ # available through {Spanner::Client#execute}:
172
+ #
173
+ # ```ruby
174
+ # require "google/cloud/spanner"
175
+ #
176
+ # spanner = Google::Cloud::Spanner.new
177
+ #
178
+ # db = spanner.client "my-instance", "my-database"
179
+ #
180
+ # results = db.execute "SELECT * FROM users"
181
+ #
182
+ # results.rows.each do |row|
183
+ # puts "User #{row[:id]} is #{row[:name]}"
184
+ # end
185
+ # ```
186
+ #
187
+ # ## Reading data using the read method
188
+ #
189
+ # In addition to Cloud Spanner's SQL interface, Cloud Spanner also supports
190
+ # a read interface. Use the {Spanner::Client#read} method to read rows from
191
+ # the database, and use its `keys` option to pass unique identifiers as both
192
+ # lists and ranges:
193
+ #
194
+ # ```ruby
195
+ # require "google/cloud/spanner"
196
+ #
197
+ # spanner = Google::Cloud::Spanner.new
198
+ #
199
+ # db = spanner.client "my-instance", "my-database"
200
+ #
201
+ # results = db.read "users", [:id, :name], keys: 1..5
202
+ #
203
+ # results.rows.each do |row|
204
+ # puts "User #{row[:id]} is #{row[:name]}"
205
+ # end
206
+ # ```
207
+ #
208
+ # ## Using read-write transactions
209
+ #
210
+ # When an operation might write data depending on values it reads, you
211
+ # should use a read-write transaction to perform the reads and writes
212
+ # atomically.
213
+ #
214
+ # Suppose that sales of `Albums(1, 1)` are lower than expected and you want
215
+ # to move $200,000 from the marketing budget of `Albums(2, 2)` to it, but
216
+ # only if the budget of `Albums(2, 2)` is at least $300,000.
217
+ #
218
+ # Use {Spanner::Client#transaction} to execute both reads and writes
219
+ # atomically at a single logical point in time. All changes are accumulated
220
+ # in memory until the block completes. Transactions will be automatically
221
+ # retried when possible. This operation makes separate API requests to begin
222
+ # and commit the transaction.
223
+ #
224
+ # ```ruby
225
+ # require "google/cloud/spanner"
226
+ #
227
+ # spanner = Google::Cloud::Spanner.new
228
+ #
229
+ # db = spanner.client "my-instance", "my-database"
230
+ #
231
+ # db.transaction do |tx|
232
+ # # Read the second album budget.
233
+ # second_album_result = tx.read "Albums", ["marketing_budget"],
234
+ # keys: [[2, 2]], limit: 1
235
+ # second_album_row = second_album_result.first
236
+ # second_album_budget = second_album_row.values.first
237
+ #
238
+ # transfer_amount = 200000
239
+ #
240
+ # if second_album_budget < 300000
241
+ # # Raising an exception will automatically roll back the transaction.
242
+ # raise "The second album doesn't have enough funds to transfer"
243
+ # end
244
+ #
245
+ # # Read the first album's budget.
246
+ # first_album_result = tx.read "Albums", ["marketing_budget"],
247
+ # keys: [[1, 1]], limit: 1
248
+ # first_album_row = first_album_result.first
249
+ # first_album_budget = first_album_row.values.first
250
+ #
251
+ # # Update the budgets.
252
+ # second_album_budget -= transfer_amount
253
+ # first_album_budget += transfer_amount
254
+ # puts "Setting first album's budget to #{first_album_budget} and the " \
255
+ # "second album's budget to #{second_album_budget}."
256
+ #
257
+ # # Update the rows.
258
+ # rows = [
259
+ # {singer_id: 1, album_id: 1, marketing_budget: first_album_budget},
260
+ # {singer_id: 2, album_id: 2, marketing_budget: second_album_budget}
261
+ # ]
262
+ # tx.update "Albums", rows
263
+ # end
264
+ # ```
265
+ #
266
+ # ## Using read-only transactions
267
+ #
268
+ # Suppose you want to execute more than one read at the same timestamp.
269
+ # Read-only transactions observe a consistent prefix of the transaction
270
+ # commit history, so your application always gets consistent data. Because
271
+ # read-only transactions are much faster than locking read-write
272
+ # transactions, we strongly recommend that you do all of your transaction
273
+ # reads in read-only transactions if possible.
274
+ #
275
+ # Use a {Spanner::Snapshot} object to execute statements in a read-only
276
+ # transaction. The snapshot object is available via a block provided to
277
+ # {Spanner::Client#snapshot}:
278
+ #
279
+ # ```ruby
280
+ # require "google/cloud/spanner"
281
+ #
282
+ # spanner = Google::Cloud::Spanner.new
283
+ #
284
+ # db = spanner.client "my-instance", "my-database"
285
+ #
286
+ # db.snapshot do |snp|
287
+ # results_1 = snp.execute "SELECT * FROM users"
288
+ # results_1.rows.each do |row|
289
+ # puts "User #{row[:id]} is #{row[:name]}"
290
+ # end
291
+ #
292
+ # # Perform another read using the `read` method. Even if the data
293
+ # # is updated in-between the reads, the snapshot ensures that both
294
+ # # return the same data.
295
+ # results_2 = db.read "users", [:id, :name]
296
+ # results_2.rows.each do |row|
297
+ # puts "User #{row[:id]} is #{row[:name]}"
298
+ # end
299
+ # end
300
+ # ```
301
+ #
302
+ # ## Deleting databases
303
+ #
304
+ # Use {Spanner::Database#drop} to delete a database:
305
+ #
306
+ # ```ruby
307
+ # require "google/cloud/spanner"
308
+ #
309
+ # spanner = Google::Cloud::Spanner.new
310
+ #
311
+ # database = spanner.database "my-instance", "my-database"
312
+ #
313
+ # database.drop
314
+ # ```
315
+ #
316
+ # ## Deleting instances
317
+ #
318
+ # When you delete an instance, all databases within it are automatically
319
+ # deleted. (If you only delete databases and not your instance, you will
320
+ # still incur charges for the instance.) Use {Spanner::Instance#delete} to
321
+ # delete an instance:
322
+ #
323
+ # ```ruby
324
+ # require "google/cloud/spanner"
325
+ #
326
+ # spanner = Google::Cloud::Spanner.new
327
+ #
328
+ # instance = spanner.instance "my-instance"
329
+ #
330
+ # instance.delete
331
+ # ````
332
+ #
333
+ module Spanner
334
+ ##
335
+ # Creates a new object for connecting to the Spanner service.
336
+ # Each call creates a new connection.
337
+ #
338
+ # For more information on connecting to Google Cloud see the
339
+ # [Authentication
340
+ # Guide](https://googlecloudplatform.github.io/google-cloud-ruby/#/docs/guides/authentication).
341
+ #
342
+ # @param [String] project Project identifier for the Spanner service you
343
+ # are connecting to.
344
+ # @param [String, Hash] keyfile Keyfile downloaded from Google Cloud. If
345
+ # file path the file must be readable.
346
+ # @param [String, Array<String>] scope The OAuth 2.0 scopes controlling
347
+ # the set of resources and operations that the connection can access.
348
+ # See [Using OAuth 2.0 to Access Google
349
+ # APIs](https://developers.google.com/identity/protocols/OAuth2).
350
+ #
351
+ # The default scopes are:
352
+ #
353
+ # * `https://www.googleapis.com/auth/spanner`
354
+ # * `https://www.googleapis.com/auth/spanner.data`
355
+ # @param [Integer] timeout Default timeout to use in requests. Optional.
356
+ # @param [Hash] client_config A hash of values to override the default
357
+ # behavior of the API client. Optional.
358
+ #
359
+ # @return [Google::Cloud::Spanner::Project]
360
+ #
361
+ # @example
362
+ # require "google/cloud/spanner"
363
+ #
364
+ # spanner = Google::Cloud::Spanner.new
365
+ #
366
+ def self.new project: nil, keyfile: nil, scope: nil, timeout: nil,
367
+ client_config: nil
368
+ project ||= Google::Cloud::Spanner::Project.default_project
369
+ if keyfile.nil?
370
+ credentials = Google::Cloud::Spanner::Credentials.default scope: scope
371
+ else
372
+ credentials = Google::Cloud::Spanner::Credentials.new(
373
+ keyfile, scope: scope)
374
+ end
375
+ Google::Cloud::Spanner::Project.new(
376
+ Google::Cloud::Spanner::Service.new(
377
+ project, credentials, timeout: timeout,
378
+ client_config: client_config))
379
+ end
380
+ end
381
+ end
382
+ end