google-cloud-spanner 2.24.0 → 2.25.0

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: fe45aaee1d474b68ce2280271bd6d08756001451210dd35675405bc295c64385
4
- data.tar.gz: 5de2b1c338ec90c0d8acc645f70a362ca7c79924bc65fd7ec575734f454a95cd
3
+ metadata.gz: 6bc284cfdecb9d6261e1a545a6b7868205e21346a27f48e4d86a8051533b1746
4
+ data.tar.gz: f4cdc9f44e8723639ab0f8c07aedb4c6e3e6c989db95b8175a24a0ae232c0902
5
5
  SHA512:
6
- metadata.gz: 2a9190ee8a2c1b19465f6fe7ab46dfcb6bb757eb5500fe933d77e9d0fd6aef5f260c5c926553c07ca8f6360d0b23dd73bd9ed1f2541ce9626c5b2fdd8ee3e1a0
7
- data.tar.gz: e040dfdd82111133d685455b7cb2ce49bc0bb8e9a669b513cd9988e6478fd15076ebb004e651e626a5548f644f58a6c67c7a4cc529d0a58e54bb0becb71f2186
6
+ metadata.gz: 5f379e7460d19707ed13e73d6caebf00224d1fb97ba26bcba9efd72c00a300a7a81ac510688138143c35437ab5d75057c775a4e8445fe72e7462c66be141c0b3
7
+ data.tar.gz: 0d0fe1dbfd3f7bb47502b06f1854ac87233dc86bcd291f1732d4d6a6ba762483adac6883d9c8f534296811772dcb7930b2b4d8d6f39a59dcc27e8049a59ca380
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Release History
2
2
 
3
+ ### 2.25.0 (2025-01-29)
4
+
5
+ #### Features
6
+
7
+ * Support Protobuf Columns ([#124](https://github.com/googleapis/ruby-spanner/issues/124))
8
+ * Update minimum Ruby version to 3.0 ([#140](https://github.com/googleapis/ruby-spanner/issues/140))
9
+
3
10
  ### 2.24.0 (2024-08-27)
4
11
 
5
12
  #### Features
data/CONTRIBUTING.md CHANGED
@@ -24,7 +24,7 @@ be able to accept your pull requests.
24
24
  In order to use the google-cloud-spanner console and run the project's tests,
25
25
  there is a small amount of setup:
26
26
 
27
- 1. Install Ruby. google-cloud-spanner requires Ruby 2.5+. You may choose to
27
+ 1. Install Ruby. google-cloud-spanner requires Ruby 3.0+. You may choose to
28
28
  manage your Ruby and gem installations with [RVM](https://rvm.io/),
29
29
  [rbenv](https://github.com/rbenv/rbenv), or
30
30
  [chruby](https://github.com/postmodern/chruby).
@@ -156,7 +156,7 @@ module Google
156
156
  # object. Operation object is a backup operation.
157
157
  #
158
158
  def self.from_grpc grpc, service
159
- operations_client = \
159
+ operations_client =
160
160
  service.databases.instance_variable_get "@operations_client"
161
161
  jobs = new(Array(grpc.response.operations).map do |job_grpc|
162
162
  Job.from_grpc \
@@ -1022,10 +1022,10 @@ module Google
1022
1022
  # | `TIMESTAMP` | `Time`, `DateTime` | |
1023
1023
  # | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
1024
1024
  # | `ARRAY` | `Array` | Nested arrays are not supported. |
1025
+ # | `PROTO` | Determined by proto_fqn | |
1025
1026
  #
1026
1027
  # See [Data
1027
1028
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
1028
- #
1029
1029
  # @param [Boolean] exclude_txn_from_change_streams If set to true,
1030
1030
  # mutations will not be recorded in change streams with DDL option
1031
1031
  # `allow_txn_exclusion=true`.
@@ -1169,6 +1169,7 @@ module Google
1169
1169
  # | `TIMESTAMP` | `Time`, `DateTime` | |
1170
1170
  # | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
1171
1171
  # | `ARRAY` | `Array` | Nested arrays are not supported. |
1172
+ # | `PROTO` | Determined by proto_fqn | |
1172
1173
  #
1173
1174
  # See [Data
1174
1175
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
@@ -1314,6 +1315,7 @@ module Google
1314
1315
  # | `TIMESTAMP` | `Time`, `DateTime` | |
1315
1316
  # | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
1316
1317
  # | `ARRAY` | `Array` | Nested arrays are not supported. |
1318
+ # | `PROTO` | Determined by proto_fqn | |
1317
1319
  #
1318
1320
  # See [Data
1319
1321
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
@@ -1460,6 +1462,7 @@ module Google
1460
1462
  # | `TIMESTAMP` | `Time`, `DateTime` | |
1461
1463
  # | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
1462
1464
  # | `ARRAY` | `Array` | Nested arrays are not supported. |
1465
+ # | `PROTO` | Determined by proto_fqn | |
1463
1466
  #
1464
1467
  # See [Data
1465
1468
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
@@ -76,6 +76,7 @@ module Google
76
76
  # | `TIMESTAMP` | `Time`, `DateTime` | |
77
77
  # | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
78
78
  # | `ARRAY` | `Array` | Nested arrays are not supported. |
79
+ # | `PROTO` | Determined by proto_fqn | |
79
80
  #
80
81
  # See [Data
81
82
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
@@ -93,19 +94,7 @@ module Google
93
94
  # end
94
95
  #
95
96
  def upsert table, *rows
96
- rows = Array(rows).flatten
97
- return rows if rows.empty?
98
- rows.compact
99
- rows.delete_if(&:empty?)
100
- @mutations += rows.map do |row|
101
- V1::Mutation.new(
102
- insert_or_update: V1::Mutation::Write.new(
103
- table: table, columns: row.keys.map(&:to_s),
104
- values: [Convert.object_to_grpc_value(row.values).list_value]
105
- )
106
- )
107
- end
108
- rows
97
+ mutations_from_rows table, rows, "insert_or_update"
109
98
  end
110
99
  alias save upsert
111
100
 
@@ -136,6 +125,7 @@ module Google
136
125
  # | `TIMESTAMP` | `Time`, `DateTime` | |
137
126
  # | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
138
127
  # | `ARRAY` | `Array` | Nested arrays are not supported. |
128
+ # | `PROTO` | Determined by proto_fqn | |
139
129
  #
140
130
  # See [Data
141
131
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
@@ -153,19 +143,7 @@ module Google
153
143
  # end
154
144
  #
155
145
  def insert table, *rows
156
- rows = Array(rows).flatten
157
- return rows if rows.empty?
158
- rows.compact
159
- rows.delete_if(&:empty?)
160
- @mutations += rows.map do |row|
161
- V1::Mutation.new(
162
- insert: V1::Mutation::Write.new(
163
- table: table, columns: row.keys.map(&:to_s),
164
- values: [Convert.object_to_grpc_value(row.values).list_value]
165
- )
166
- )
167
- end
168
- rows
146
+ mutations_from_rows table, rows, "insert"
169
147
  end
170
148
 
171
149
  ##
@@ -195,6 +173,7 @@ module Google
195
173
  # | `TIMESTAMP` | `Time`, `DateTime` | |
196
174
  # | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
197
175
  # | `ARRAY` | `Array` | Nested arrays are not supported. |
176
+ # | `PROTO` | Determined by proto_fqn | |
198
177
  #
199
178
  # See [Data
200
179
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
@@ -212,19 +191,7 @@ module Google
212
191
  # end
213
192
  #
214
193
  def update table, *rows
215
- rows = Array(rows).flatten
216
- return rows if rows.empty?
217
- rows.compact
218
- rows.delete_if(&:empty?)
219
- @mutations += rows.map do |row|
220
- V1::Mutation.new(
221
- update: V1::Mutation::Write.new(
222
- table: table, columns: row.keys.map(&:to_s),
223
- values: [Convert.object_to_grpc_value(row.values).list_value]
224
- )
225
- )
226
- end
227
- rows
194
+ mutations_from_rows table, rows, "update"
228
195
  end
229
196
 
230
197
  ##
@@ -256,6 +223,7 @@ module Google
256
223
  # | `TIMESTAMP` | `Time`, `DateTime` | |
257
224
  # | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
258
225
  # | `ARRAY` | `Array` | Nested arrays are not supported. |
226
+ # | `PROTO` | Determined by proto_fqn | |
259
227
  #
260
228
  # See [Data
261
229
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
@@ -273,19 +241,7 @@ module Google
273
241
  # end
274
242
  #
275
243
  def replace table, *rows
276
- rows = Array(rows).flatten
277
- return rows if rows.empty?
278
- rows.compact
279
- rows.delete_if(&:empty?)
280
- @mutations += rows.map do |row|
281
- V1::Mutation.new(
282
- replace: V1::Mutation::Write.new(
283
- table: table, columns: row.keys.map(&:to_s),
284
- values: [Convert.object_to_grpc_value(row.values).list_value]
285
- )
286
- )
287
- end
288
- rows
244
+ mutations_from_rows table, rows, "replace"
289
245
  end
290
246
 
291
247
  ##
@@ -330,6 +286,42 @@ module Google
330
286
 
331
287
  protected
332
288
 
289
+ ##
290
+ # @private
291
+ # Generates mutations from `rows` to be performed on a given table, converting
292
+ # given rows to their corresponding column and gRPC values.
293
+ #
294
+ # @param [String] table The name of the table in the database to be
295
+ # modified.
296
+ # @param [Array<Hash>] rows One or more hash objects with the hash keys
297
+ # matching the table's columns, and the hash values matching the
298
+ # table's values.
299
+ # @param [String] type The type of mutation to be performed.
300
+ #
301
+ def mutations_from_rows table, rows, type
302
+ rows = Array(rows).flatten
303
+ return rows if rows.empty?
304
+ rows.compact
305
+ rows.delete_if { |row| row.respond_to?(:empty?) && row.empty? }
306
+ @mutations += rows.map do |row|
307
+ # This case applies whenever a Protobuf object is the row itself, and not part of individual column fields.
308
+ if row.class.respond_to? :descriptor
309
+ columns = row.class.descriptor.map(&:name)
310
+ values = [Google::Protobuf::ListValue.new(values: [Convert.object_to_grpc_value(row, :PROTO)])]
311
+ else
312
+ columns = row.keys.map(&:to_s)
313
+ values = [Convert.object_to_grpc_value(row.values).list_value]
314
+ end
315
+ V1::Mutation.new(
316
+ "#{type}": V1::Mutation::Write.new(
317
+ table: table, columns: columns,
318
+ values: values
319
+ )
320
+ )
321
+ end
322
+ rows
323
+ end
324
+
333
325
  def key_set keys
334
326
  return V1::KeySet.new all: true if keys.nil?
335
327
  keys = [keys] unless keys.is_a? Array
@@ -45,9 +45,16 @@ module Google
45
45
  end
46
46
 
47
47
  field ||= field_for_object obj
48
- [object_to_grpc_value(obj, field), grpc_type_for_field(field)]
48
+ [object_to_grpc_value(obj, field), grpc_type_for_field(field, obj)]
49
49
  end
50
50
 
51
+ ##
52
+ # @private
53
+ # Convert objects to their corresponding gRPC values.
54
+ #
55
+ # `field` is used to determine whether the object itself is a value or
56
+ # a collection of values.
57
+ #
51
58
  def object_to_grpc_value obj, field = nil
52
59
  obj = obj.to_column_value if obj.respond_to? :to_column_value
53
60
 
@@ -101,12 +108,17 @@ module Google
101
108
  else
102
109
  Google::Protobuf::Value.new string_value: obj.to_json
103
110
  end
111
+ when Google::Protobuf::MessageExts
112
+ proto_class = obj.class
113
+ content = proto_class.encode obj
114
+ encoded_content = Base64.strict_encode64(content)
115
+ Google::Protobuf::Value.new string_value: encoded_content
104
116
  else
105
117
  if obj.respond_to?(:read) && obj.respond_to?(:rewind)
106
118
  obj.rewind
107
119
  content = obj.read.force_encoding("ASCII-8BIT")
108
120
  encoded_content = Base64.strict_encode64(content)
109
- Google::Protobuf::Value.new(string_value: encoded_content)
121
+ Google::Protobuf::Value.new string_value: encoded_content
110
122
  else
111
123
  raise ArgumentError,
112
124
  "A value of type #{obj.class} is not supported."
@@ -161,6 +173,8 @@ module Google
161
173
  Fields.new Hash[raw_type_pairs]
162
174
  when Data
163
175
  obj.fields
176
+ when Google::Protobuf::MessageExts
177
+ :PROTO
164
178
  else
165
179
  if obj.respond_to?(:read) && obj.respond_to?(:rewind)
166
180
  :BYTES
@@ -171,7 +185,7 @@ module Google
171
185
  end
172
186
  end
173
187
 
174
- def grpc_type_for_field field
188
+ def grpc_type_for_field field, obj = nil
175
189
  return field.to_grpc_type if field.respond_to? :to_grpc_type
176
190
 
177
191
  case field
@@ -184,11 +198,20 @@ module Google
184
198
  V1::Type.new(code: :NUMERIC, type_annotation: :PG_NUMERIC)
185
199
  when :PG_JSONB
186
200
  V1::Type.new(code: :JSON, type_annotation: :PG_JSONB)
201
+ when :PROTO
202
+ V1::Type.new(code: :PROTO, proto_type_fqn: obj.nil? ? "" : obj.class.descriptor.name)
187
203
  else
188
204
  V1::Type.new(code: field)
189
205
  end
190
206
  end
191
207
 
208
+ ##
209
+ # Converts a gRPC value to a Ruby object.
210
+ #
211
+ # @param [Google::Protobuf::Value] value The gRPC value to convert.
212
+ # @param [Google::Spanner::V1::Type] type The underlying type for data.
213
+ # @return [::Object] The Ruby object that represents the value, converted to the closest
214
+ # matching Ruby class based on the gRPC type.
192
215
  def grpc_value_to_object value, type
193
216
  return nil if value.kind == :null_value
194
217
 
@@ -229,6 +252,10 @@ module Google
229
252
  BigDecimal value.string_value
230
253
  when :JSON
231
254
  JSON.parse value.string_value
255
+ when :PROTO
256
+ descriptor = Google::Protobuf::DescriptorPool.generated_pool.lookup(type.proto_type_fqn).msgclass
257
+ content = Base64.decode64 value.string_value
258
+ descriptor.decode content
232
259
  end
233
260
  end
234
261
 
@@ -156,7 +156,7 @@ module Google
156
156
  # object. Operation object is a database operation.
157
157
  #
158
158
  def self.from_grpc grpc, service
159
- operations_client = \
159
+ operations_client =
160
160
  service.databases.instance_variable_get "@operations_client"
161
161
  jobs = new(Array(grpc.response.operations).map do |job_grpc|
162
162
  Job.from_grpc \
@@ -238,6 +238,10 @@ module Google
238
238
  # valid identifier: `[a-z][a-z0-9_]*`. Will raise
239
239
  # {Google::Cloud::AlreadyExistsError} if the named operation already
240
240
  # exists. Optional.
241
+ # @param [Google::Protobuf::FileDescriptorSet, String] descriptor_set The file
242
+ # descriptor set object to be used in the update, or alternatively, an absolute
243
+ # path to the generated file descriptor set. The descriptor set is only used
244
+ # during DDL statements, such as `CREATE PROTO BUNDLE`.
241
245
  #
242
246
  # @return [Database::Job] The job representing the long-running,
243
247
  # asynchronous processing of a database schema update operation.
@@ -248,22 +252,48 @@ module Google
248
252
  # spanner = Google::Cloud::Spanner.new
249
253
  # database = spanner.database "my-instance", "my-database"
250
254
  #
251
- # add_users_table_sql = %q(
252
- # CREATE TABLE users (
253
- # id INT64 NOT NULL,
254
- # username STRING(25) NOT NULL,
255
- # name STRING(45) NOT NULL,
256
- # email STRING(128),
257
- # ) PRIMARY KEY(id)
258
- # )
255
+ # add_users_table_sql =
256
+ # <<~SQL
257
+ # CREATE TABLE users (
258
+ # id INT64 NOT NULL,
259
+ # username STRING(25) NOT NULL,
260
+ # name STRING(45) NOT NULL,
261
+ # email STRING(128),
262
+ # ) PRIMARY KEY(id)
263
+ # SQL
259
264
  #
260
265
  # database.update statements: [add_users_table_sql]
261
266
  #
262
- def update statements: [], operation_id: nil
267
+ # @example
268
+ # require "google/cloud/spanner"
269
+ #
270
+ # spanner = Google::Cloud::Spanner.new
271
+ # database = spanner.database "my-instance", "my-database"
272
+ #
273
+ # create_proto_bundle_sql =
274
+ # <<~SQL
275
+ # CREATE PROTO BUNDLE (
276
+ # `examples.User`
277
+ # )
278
+ # SQL
279
+ #
280
+ # create_users_table_sql =
281
+ # <<~SQL
282
+ # CREATE TABLE users (
283
+ # id INT64 NOT NULL,
284
+ # user `examples.User` NOT NULL
285
+ # ) PRIMARY KEY (id)
286
+ # SQL
287
+ #
288
+ # database.update statements: [create_proto_bundle_sql, create_users_table_sql],
289
+ # descriptor_set: "/usr/local/user_descriptors.pb"
290
+ #
291
+ def update statements: [], operation_id: nil, descriptor_set: nil
263
292
  ensure_service!
264
293
  grpc = service.update_database_ddl instance_id, database_id,
265
294
  statements: statements,
266
- operation_id: operation_id
295
+ operation_id: operation_id,
296
+ descriptor_set: descriptor_set
267
297
  Database::Job.from_grpc grpc, service
268
298
  end
269
299
 
@@ -68,6 +68,7 @@ module Google
68
68
  # * `:INT64`
69
69
  # * `:STRING`
70
70
  # * `:TIMESTAMP`
71
+ # * `:PROTO`
71
72
  # * `Array` - Lists are specified by providing the type code in an
72
73
  # array. For example, an array of integers are specified as
73
74
  # `[:INT64]`.
@@ -275,24 +276,23 @@ module Google
275
276
  return Data.from_grpc nil, @grpc_fields
276
277
  elsif data.is_a? Array
277
278
  # Convert data in the order it was recieved
278
- values = data.map.with_index do |datum, index|
279
- Convert.object_to_grpc_value_and_type(datum, cached_types[index]).first
279
+ values_and_types = data.map.with_index do |datum, index|
280
+ Convert.object_to_grpc_value_and_type(datum, cached_types[index])
280
281
  end
281
- return Data.from_grpc values, @grpc_fields
282
282
  elsif data.is_a? Hash
283
283
  # Pull values from hash in order of the fields,
284
284
  # we can't always trust the Hash to be in order.
285
- values = @grpc_fields.map.with_index do |field, index|
285
+ values_and_types = @grpc_fields.map.with_index do |field, index|
286
286
  if data.key? index
287
287
  Convert.object_to_grpc_value_and_type(data[index],
288
- cached_types[index]).first
288
+ cached_types[index])
289
289
  elsif !field.name.to_s.empty?
290
290
  if data.key? field.name.to_s
291
291
  Convert.object_to_grpc_value_and_type(data[field.name.to_s],
292
- cached_types[index]).first
292
+ cached_types[index])
293
293
  elsif data.key? field.name.to_s.to_sym
294
294
  Convert.object_to_grpc_value_and_type(data[field.name.to_s.to_sym],
295
- cached_types[index]).first
295
+ cached_types[index])
296
296
  else
297
297
  raise "data value for field #{field.name} missing"
298
298
  end
@@ -300,9 +300,18 @@ module Google
300
300
  raise "data value for field #{index} missing"
301
301
  end
302
302
  end
303
- return Data.from_grpc values, @grpc_fields
303
+ else
304
+ raise ArgumentError, "can only accept Array or Hash"
305
+ end
306
+
307
+ # This is not ideal since we loop through `@grpc_fields` a second time after
308
+ # initialization. Refactoring can be done to perform this step later on when
309
+ # all information for the type is available.
310
+ values, grpc_types = values_and_types.transpose
311
+ grpc_types&.each_with_index do |grpc_type, index|
312
+ @grpc_fields[index].type = grpc_type
304
313
  end
305
- raise ArgumentError, "can only accept Array or Hash"
314
+ Data.from_grpc values, @grpc_fields
306
315
  end
307
316
  alias data struct
308
317
  alias new struct
@@ -173,7 +173,7 @@ module Google
173
173
  # TODO: raise if hash[:execute_query].nil? && hash[:read].nil?
174
174
  new.tap do |p|
175
175
  if data[:execute]
176
- execute_sql_grpc = \
176
+ execute_sql_grpc =
177
177
  V1::ExecuteSqlRequest.decode(
178
178
  Base64.decode64(data[:execute])
179
179
  )
@@ -74,7 +74,7 @@ module Google
74
74
 
75
75
  def service
76
76
  return mocked_service if mocked_service
77
- @service ||= \
77
+ @service ||=
78
78
  V1::Spanner::Client.new do |config|
79
79
  config.credentials = channel
80
80
  config.quota_project = @quota_project
@@ -89,7 +89,7 @@ module Google
89
89
 
90
90
  def instances
91
91
  return mocked_instances if mocked_instances
92
- @instances ||= \
92
+ @instances ||=
93
93
  Admin::Instance::V1::InstanceAdmin::Client.new do |config|
94
94
  config.credentials = channel
95
95
  config.quota_project = @quota_project
@@ -104,7 +104,7 @@ module Google
104
104
 
105
105
  def databases
106
106
  return mocked_databases if mocked_databases
107
- @databases ||= \
107
+ @databases ||=
108
108
  Admin::Database::V1::DatabaseAdmin::Client.new do |config|
109
109
  config.credentials = channel
110
110
  config.quota_project = @quota_project
@@ -257,12 +257,27 @@ module Google
257
257
  end
258
258
 
259
259
  def update_database_ddl instance_id, database_id, statements: [],
260
- operation_id: nil, call_options: nil
260
+ operation_id: nil, call_options: nil, descriptor_set: nil
261
+ bin_data =
262
+ case descriptor_set
263
+ when Google::Protobuf::FileDescriptorSet
264
+ Google::Protobuf::FileDescriptorSet.encode descriptor_set
265
+ when String
266
+ File.binread descriptor_set
267
+ when NilClass
268
+ nil
269
+ else
270
+ raise ArgumentError,
271
+ "A value of type #{descriptor_set.class} is not supported."
272
+ end
273
+
274
+ proto_descriptors = bin_data unless bin_data.nil?
261
275
  opts = default_options call_options: call_options
262
276
  request = {
263
277
  database: database_path(instance_id, database_id),
264
278
  statements: Array(statements),
265
- operation_id: operation_id
279
+ operation_id: operation_id,
280
+ proto_descriptors: proto_descriptors
266
281
  }
267
282
  databases.update_database_ddl request, opts
268
283
  end
@@ -125,6 +125,7 @@ module Google
125
125
  # | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
126
126
  # | `ARRAY` | `Array` | Nested arrays are not supported. |
127
127
  # | `STRUCT` | `Hash`, {Data} | |
128
+ # | `PROTO` | Determined by proto_fqn | |
128
129
  #
129
130
  # See [Data
130
131
  # types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Spanner
19
- VERSION = "2.24.0".freeze
19
+ VERSION = "2.25.0".freeze
20
20
  end
21
21
  end
22
22
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-cloud-spanner
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.24.0
4
+ version: 2.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Moore
8
8
  - Chris Smith
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2024-08-30 00:00:00.000000000 Z
11
+ date: 2025-01-29 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bigdecimal
@@ -45,74 +44,56 @@ dependencies:
45
44
  requirements:
46
45
  - - "~>"
47
46
  - !ruby/object:Gem::Version
48
- version: '1.5'
47
+ version: '1.7'
49
48
  type: :runtime
50
49
  prerelease: false
51
50
  version_requirements: !ruby/object:Gem::Requirement
52
51
  requirements:
53
52
  - - "~>"
54
53
  - !ruby/object:Gem::Version
55
- version: '1.5'
54
+ version: '1.7'
56
55
  - !ruby/object:Gem::Dependency
57
56
  name: google-cloud-spanner-admin-database-v1
58
57
  requirement: !ruby/object:Gem::Requirement
59
58
  requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: 0.19.0
63
- - - "<"
59
+ - - "~>"
64
60
  - !ruby/object:Gem::Version
65
- version: 2.a
61
+ version: '1.4'
66
62
  type: :runtime
67
63
  prerelease: false
68
64
  version_requirements: !ruby/object:Gem::Requirement
69
65
  requirements:
70
- - - ">="
71
- - !ruby/object:Gem::Version
72
- version: 0.19.0
73
- - - "<"
66
+ - - "~>"
74
67
  - !ruby/object:Gem::Version
75
- version: 2.a
68
+ version: '1.4'
76
69
  - !ruby/object:Gem::Dependency
77
70
  name: google-cloud-spanner-admin-instance-v1
78
71
  requirement: !ruby/object:Gem::Requirement
79
72
  requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: 0.16.0
83
- - - "<"
73
+ - - "~>"
84
74
  - !ruby/object:Gem::Version
85
- version: 2.a
75
+ version: '1.6'
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
79
  requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: 0.16.0
93
- - - "<"
80
+ - - "~>"
94
81
  - !ruby/object:Gem::Version
95
- version: 2.a
82
+ version: '1.6'
96
83
  - !ruby/object:Gem::Dependency
97
84
  name: google-cloud-spanner-v1
98
85
  requirement: !ruby/object:Gem::Requirement
99
86
  requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: 0.27.0
103
- - - "<"
87
+ - - "~>"
104
88
  - !ruby/object:Gem::Version
105
- version: 2.a
89
+ version: '1.6'
106
90
  type: :runtime
107
91
  prerelease: false
108
92
  version_requirements: !ruby/object:Gem::Requirement
109
93
  requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- version: 0.27.0
113
- - - "<"
94
+ - - "~>"
114
95
  - !ruby/object:Gem::Version
115
- version: 2.a
96
+ version: '1.6'
116
97
  description: google-cloud-spanner is the official library for Google Cloud Spanner
117
98
  API.
118
99
  email:
@@ -187,7 +168,6 @@ homepage: https://github.com/googleapis/ruby-spanner/blob/main/google-cloud-span
187
168
  licenses:
188
169
  - Apache-2.0
189
170
  metadata: {}
190
- post_install_message:
191
171
  rdoc_options: []
192
172
  require_paths:
193
173
  - lib
@@ -195,15 +175,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
195
175
  requirements:
196
176
  - - ">="
197
177
  - !ruby/object:Gem::Version
198
- version: '2.7'
178
+ version: '3.0'
199
179
  required_rubygems_version: !ruby/object:Gem::Requirement
200
180
  requirements:
201
181
  - - ">="
202
182
  - !ruby/object:Gem::Version
203
183
  version: '0'
204
184
  requirements: []
205
- rubygems_version: 3.5.6
206
- signing_key:
185
+ rubygems_version: 3.6.2
207
186
  specification_version: 4
208
187
  summary: API Client library for Google Cloud Spanner API
209
188
  test_files: []