activerecord-spanner-adapter 1.8.0 → 2.0.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 (129) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/acceptance-tests-on-emulator.yaml +4 -6
  3. data/.github/workflows/ci.yaml +4 -6
  4. data/.github/workflows/nightly-acceptance-tests-on-emulator.yaml +4 -6
  5. data/.github/workflows/nightly-unit-tests.yaml +4 -6
  6. data/.github/workflows/rubocop.yaml +1 -1
  7. data/.github/workflows/samples.yaml +30 -0
  8. data/.kokoro/release.sh +1 -3
  9. data/.release-please-manifest.json +1 -1
  10. data/.rubocop.yml +2 -2
  11. data/CHANGELOG.md +18 -0
  12. data/Gemfile +6 -5
  13. data/README.md +11 -9
  14. data/acceptance/cases/migration/command_recorder_test.rb +7 -38
  15. data/acceptance/cases/migration/references_index_test.rb +2 -11
  16. data/acceptance/cases/models/binary_identifiers.rb +97 -0
  17. data/acceptance/models/binary_project.rb +20 -0
  18. data/acceptance/models/string_io.rb +28 -0
  19. data/acceptance/models/user.rb +20 -0
  20. data/acceptance/test_helper.rb +1 -0
  21. data/activerecord-spanner-adapter.gemspec +3 -3
  22. data/benchmarks/application.rb +3 -7
  23. data/examples/snippets/Rakefile +27 -5
  24. data/examples/snippets/array-data-type/application.rb +1 -5
  25. data/examples/snippets/array-data-type/config/database.yml +1 -0
  26. data/examples/snippets/bit-reversed-sequence/application.rb +0 -4
  27. data/examples/snippets/bit-reversed-sequence/config/database.yml +1 -0
  28. data/examples/snippets/bit-reversed-sequence/db/seeds.rb +2 -2
  29. data/examples/snippets/bulk-insert/application.rb +1 -5
  30. data/examples/snippets/bulk-insert/config/database.yml +1 -0
  31. data/examples/snippets/commit-timestamp/application.rb +0 -4
  32. data/examples/snippets/commit-timestamp/config/database.yml +1 -0
  33. data/examples/snippets/config/environment.rb +5 -0
  34. data/examples/snippets/create-records/application.rb +1 -5
  35. data/examples/snippets/create-records/config/database.yml +1 -0
  36. data/examples/snippets/date-data-type/application.rb +1 -5
  37. data/examples/snippets/date-data-type/config/database.yml +1 -0
  38. data/examples/snippets/date-data-type/db/seeds.rb +1 -1
  39. data/examples/snippets/generated-column/application.rb +0 -4
  40. data/examples/snippets/generated-column/config/database.yml +1 -0
  41. data/examples/snippets/generated-column/db/seeds.rb +1 -1
  42. data/examples/snippets/hints/application.rb +0 -4
  43. data/examples/snippets/hints/config/database.yml +1 -0
  44. data/examples/snippets/hints/db/seeds.rb +1 -1
  45. data/examples/snippets/interleaved-tables/application.rb +1 -5
  46. data/examples/snippets/interleaved-tables/config/database.yml +1 -0
  47. data/examples/snippets/interleaved-tables/db/seeds.rb +1 -1
  48. data/examples/snippets/interleaved-tables/models/album.rb +6 -2
  49. data/examples/snippets/interleaved-tables/models/track.rb +5 -1
  50. data/examples/snippets/interleaved-tables-before-7.1/application.rb +1 -5
  51. data/examples/snippets/interleaved-tables-before-7.1/config/database.yml +1 -0
  52. data/examples/snippets/interleaved-tables-before-7.1/db/seeds.rb +1 -1
  53. data/examples/snippets/migrations/application.rb +0 -4
  54. data/examples/snippets/migrations/config/database.yml +1 -0
  55. data/examples/snippets/mutations/application.rb +1 -5
  56. data/examples/snippets/mutations/config/database.yml +1 -0
  57. data/examples/snippets/mutations/db/seeds.rb +1 -1
  58. data/examples/snippets/optimistic-locking/application.rb +0 -4
  59. data/examples/snippets/optimistic-locking/config/database.yml +1 -0
  60. data/examples/snippets/optimistic-locking/db/seeds.rb +1 -1
  61. data/examples/snippets/partitioned-dml/application.rb +0 -4
  62. data/examples/snippets/partitioned-dml/config/database.yml +1 -0
  63. data/examples/snippets/partitioned-dml/db/seeds.rb +1 -1
  64. data/examples/snippets/query-logs/application.rb +15 -13
  65. data/examples/snippets/query-logs/config/database.yml +1 -0
  66. data/examples/snippets/query-logs/db/seeds.rb +1 -1
  67. data/examples/snippets/quickstart/application.rb +0 -4
  68. data/examples/snippets/quickstart/config/database.yml +1 -0
  69. data/examples/snippets/quickstart/db/seeds.rb +1 -1
  70. data/examples/snippets/read-only-transactions/application.rb +0 -4
  71. data/examples/snippets/read-only-transactions/config/database.yml +1 -0
  72. data/examples/snippets/read-only-transactions/db/seeds.rb +1 -1
  73. data/examples/snippets/read-write-transactions/application.rb +2 -6
  74. data/examples/snippets/read-write-transactions/config/database.yml +1 -0
  75. data/examples/snippets/read-write-transactions/db/seeds.rb +1 -1
  76. data/examples/snippets/stale-reads/application.rb +0 -4
  77. data/examples/snippets/stale-reads/config/database.yml +1 -0
  78. data/examples/snippets/stale-reads/db/seeds.rb +1 -1
  79. data/examples/snippets/tags/application.rb +0 -4
  80. data/examples/snippets/tags/config/database.yml +1 -0
  81. data/examples/snippets/tags/db/seeds.rb +1 -1
  82. data/examples/snippets/timestamp-data-type/application.rb +0 -4
  83. data/examples/snippets/timestamp-data-type/config/database.yml +1 -0
  84. data/lib/active_record/connection_adapters/spanner/column.rb +3 -3
  85. data/lib/active_record/connection_adapters/spanner/database_statements.rb +34 -22
  86. data/lib/active_record/connection_adapters/spanner/quoting.rb +2 -1
  87. data/lib/active_record/connection_adapters/spanner/schema_creation.rb +7 -9
  88. data/lib/active_record/connection_adapters/spanner/schema_definitions.rb +12 -2
  89. data/lib/active_record/connection_adapters/spanner/schema_statements.rb +17 -46
  90. data/lib/active_record/connection_adapters/spanner/type_metadata.rb +4 -6
  91. data/lib/active_record/connection_adapters/spanner_adapter.rb +20 -7
  92. data/lib/active_record/tasks/spanner_database_tasks.rb +4 -4
  93. data/lib/active_record/type/spanner/array.rb +4 -0
  94. data/lib/active_record/type/spanner/bytes.rb +10 -0
  95. data/lib/activerecord_spanner_adapter/base.rb +12 -18
  96. data/lib/activerecord_spanner_adapter/connection.rb +9 -5
  97. data/lib/activerecord_spanner_adapter/foreign_key.rb +9 -2
  98. data/lib/activerecord_spanner_adapter/index/column.rb +6 -1
  99. data/lib/activerecord_spanner_adapter/index.rb +10 -2
  100. data/lib/activerecord_spanner_adapter/information_schema.rb +1 -1
  101. data/lib/activerecord_spanner_adapter/primary_key.rb +2 -2
  102. data/lib/activerecord_spanner_adapter/table/column.rb +12 -3
  103. data/lib/activerecord_spanner_adapter/table.rb +8 -2
  104. data/lib/activerecord_spanner_adapter/transaction.rb +1 -1
  105. data/lib/activerecord_spanner_adapter/version.rb +1 -1
  106. data/lib/arel/visitors/spanner.rb +16 -11
  107. data/lib/spanner_client_ext.rb +4 -3
  108. metadata +13 -32
  109. data/examples/snippets/array-data-type/db/schema.rb +0 -31
  110. data/examples/snippets/bit-reversed-sequence/db/schema.rb +0 -31
  111. data/examples/snippets/bulk-insert/db/schema.rb +0 -31
  112. data/examples/snippets/commit-timestamp/db/schema.rb +0 -34
  113. data/examples/snippets/create-records/db/schema.rb +0 -31
  114. data/examples/snippets/date-data-type/db/schema.rb +0 -26
  115. data/examples/snippets/generated-column/db/schema.rb +0 -26
  116. data/examples/snippets/hints/db/schema.rb +0 -33
  117. data/examples/snippets/interleaved-tables/db/schema.rb +0 -39
  118. data/examples/snippets/interleaved-tables-before-7.1/db/schema.rb +0 -37
  119. data/examples/snippets/migrations/db/schema.rb +0 -38
  120. data/examples/snippets/mutations/db/schema.rb +0 -32
  121. data/examples/snippets/optimistic-locking/db/schema.rb +0 -34
  122. data/examples/snippets/partitioned-dml/db/schema.rb +0 -31
  123. data/examples/snippets/query-logs/db/schema.rb +0 -31
  124. data/examples/snippets/quickstart/db/schema.rb +0 -31
  125. data/examples/snippets/read-only-transactions/db/schema.rb +0 -31
  126. data/examples/snippets/read-write-transactions/db/schema.rb +0 -32
  127. data/examples/snippets/stale-reads/db/schema.rb +0 -31
  128. data/examples/snippets/tags/db/schema.rb +0 -31
  129. data/examples/snippets/timestamp-data-type/db/schema.rb +0 -26
@@ -76,7 +76,7 @@ module ActiveRecord
76
76
  # Mutations cannot be used in combination with a sequence, as mutations do not support a THEN RETURN clause.
77
77
  if buffered_mutations? && sequence_name
78
78
  raise StatementInvalid, "Mutations cannot be used to create records that use a sequence " \
79
- "to generate the primary key. #{self} uses #{sequence_name}."
79
+ "to generate the primary key. #{self} uses #{sequence_name}."
80
80
  end
81
81
 
82
82
  return _buffer_record values, :insert, returning if buffered_mutations?
@@ -118,12 +118,10 @@ module ActiveRecord
118
118
  keys = returning || primary_key
119
119
  return primary_key_value if keys == primary_key
120
120
 
121
- primary_key_values_hash = Hash[primary_key.zip(primary_key_value)]
122
- values = []
123
- keys.each do |column|
124
- values.append primary_key_values_hash[column]
121
+ primary_key_values_hash = primary_key.zip(primary_key_value).to_h
122
+ keys.map do |column|
123
+ primary_key_values_hash[column]
125
124
  end
126
- values
127
125
  end
128
126
 
129
127
  def self._upsert_record values, returning
@@ -216,11 +214,9 @@ module ActiveRecord
216
214
  end
217
215
 
218
216
  def self._set_composite_primary_key_values primary_key, values
219
- primary_key_value = []
220
- primary_key.each do |col|
221
- primary_key_value.append _set_composite_primary_key_value col, values
217
+ primary_key.map do |col|
218
+ _set_composite_primary_key_value col, values
222
219
  end
223
- primary_key_value
224
220
  end
225
221
 
226
222
  def self._set_composite_primary_key_value primary_key, values
@@ -419,14 +415,12 @@ module ActiveRecord
419
415
  end
420
416
 
421
417
  def serialize_keys metadata, keys
422
- serialized_values = []
423
- keys.each do |key|
424
- serialized_values << ActiveRecord::Type::Spanner::SpannerActiveRecordConverter
425
- .serialize_with_transaction_isolation_level(metadata.type(key),
426
- attribute_in_database(key),
427
- :mutation)
418
+ keys.map do |key|
419
+ ActiveRecord::Type::Spanner::SpannerActiveRecordConverter
420
+ .serialize_with_transaction_isolation_level(metadata.type(key),
421
+ attribute_in_database(key),
422
+ :mutation)
428
423
  end
429
- serialized_values
430
424
  end
431
425
 
432
426
  def _execute_version_check attempted_action # rubocop:disable Metrics/AbcSize
@@ -456,7 +450,7 @@ module ActiveRecord
456
450
 
457
451
  # We need to check the version using a SELECT query, as a mutation cannot include a WHERE clause.
458
452
  sql = "SELECT 1 FROM `#{self.class.arel_table.name}` " \
459
- "WHERE #{pk_sql} AND `#{locking_column}` = @lock_version"
453
+ "WHERE #{pk_sql} AND `#{locking_column}` = @lock_version"
460
454
  locked_row = self.class.connection.raw_connection.execute_query sql, params: params, types: param_types
461
455
  raise ActiveRecord::StaleObjectError.new(self, attempted_action) unless locked_row.rows.any?
462
456
  end
@@ -10,7 +10,9 @@ require "activerecord_spanner_adapter/information_schema"
10
10
 
11
11
  module ActiveRecordSpannerAdapter
12
12
  class Connection
13
- attr_reader :instance_id, :database_id, :spanner
13
+ attr_reader :instance_id
14
+ attr_reader :database_id
15
+ attr_reader :spanner
14
16
  attr_accessor :current_transaction
15
17
 
16
18
  def initialize config
@@ -45,7 +47,7 @@ module ActiveRecordSpannerAdapter
45
47
 
46
48
  def self.information_schema config
47
49
  @information_schemas ||= {}
48
- @information_schemas[database_path(config)] ||= \
50
+ @information_schemas[database_path(config)] ||=
49
51
  ActiveRecordSpannerAdapter::InformationSchema.new new(config)
50
52
  end
51
53
 
@@ -202,7 +204,7 @@ module ActiveRecordSpannerAdapter
202
204
 
203
205
  def execute_query sql, params: nil, types: nil, single_use_selector: nil, request_options: nil
204
206
  if params
205
- converted_params, types = \
207
+ converted_params, types =
206
208
  Google::Cloud::Spanner::Convert.to_input_params_and_types(
207
209
  params, types
208
210
  )
@@ -217,6 +219,7 @@ module ActiveRecordSpannerAdapter
217
219
  execute_sql_request sql, converted_params, types, selector, request_options
218
220
  end
219
221
 
222
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
220
223
  def execute_sql_request sql, converted_params, types, selector, request_options = nil
221
224
  res = session.execute_query \
222
225
  sql,
@@ -224,7 +227,7 @@ module ActiveRecordSpannerAdapter
224
227
  types: types,
225
228
  transaction: selector,
226
229
  request_options: request_options,
227
- seqno: (current_transaction&.next_sequence_number)
230
+ seqno: current_transaction&.next_sequence_number
228
231
  current_transaction.grpc_transaction = res.metadata.transaction \
229
232
  if current_transaction && res&.metadata&.transaction
230
233
  res
@@ -252,6 +255,7 @@ module ActiveRecordSpannerAdapter
252
255
  # It was not the first statement, so propagate the error.
253
256
  raise
254
257
  end
258
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
255
259
 
256
260
  # Creates a transaction using a BeginTransaction RPC. This is used if the first statement of a
257
261
  # transaction fails, as that also means that no transaction id was returned.
@@ -283,7 +287,7 @@ module ActiveRecordSpannerAdapter
283
287
  end
284
288
 
285
289
  def transaction_selector
286
- return current_transaction&.transaction_selector if current_transaction&.active?
290
+ current_transaction&.transaction_selector if current_transaction&.active?
287
291
  end
288
292
 
289
293
  def truncate table_name
@@ -6,8 +6,15 @@
6
6
 
7
7
  module ActiveRecordSpannerAdapter
8
8
  class ForeignKey
9
- attr_accessor :table_schema, :table_name, :name, :columns, :ref_schema, :ref_table, :ref_columns,
10
- :on_delete, :on_update
9
+ attr_accessor :table_schema
10
+ attr_accessor :table_name
11
+ attr_accessor :name
12
+ attr_accessor :columns
13
+ attr_accessor :ref_schema
14
+ attr_accessor :ref_table
15
+ attr_accessor :ref_columns
16
+ attr_accessor :on_delete
17
+ attr_accessor :on_update
11
18
 
12
19
  def initialize \
13
20
  table_name,
@@ -7,7 +7,12 @@
7
7
  module ActiveRecordSpannerAdapter
8
8
  class Index
9
9
  class Column
10
- attr_accessor :table_name, :schema_name, :index_name, :name, :order, :ordinal_position
10
+ attr_accessor :table_name
11
+ attr_accessor :schema_name
12
+ attr_accessor :index_name
13
+ attr_accessor :name
14
+ attr_accessor :order
15
+ attr_accessor :ordinal_position
11
16
 
12
17
  def initialize \
13
18
  table_name,
@@ -8,8 +8,16 @@ require "activerecord_spanner_adapter/index/column"
8
8
 
9
9
  module ActiveRecordSpannerAdapter
10
10
  class Index
11
- attr_accessor :schema, :table, :name, :columns, :type, :unique, :null_filtered,
12
- :interleave_in, :storing, :state
11
+ attr_accessor :schema
12
+ attr_accessor :table
13
+ attr_accessor :name
14
+ attr_accessor :columns
15
+ attr_accessor :type
16
+ attr_accessor :unique
17
+ attr_accessor :null_filtered
18
+ attr_accessor :interleave_in
19
+ attr_accessor :storing
20
+ attr_accessor :state
13
21
 
14
22
  def initialize \
15
23
  table,
@@ -32,7 +32,7 @@ module ActiveRecordSpannerAdapter
32
32
 
33
33
  rows = execute_query(
34
34
  sql,
35
- schema_name: (schema_name || ""), table_name: table_name
35
+ schema_name: schema_name || "", table_name: table_name
36
36
  )
37
37
 
38
38
  rows.map do |row|
@@ -18,8 +18,8 @@ module ActiveRecord
18
18
  end
19
19
 
20
20
  def fetch_primary_and_parent_key
21
- return connection.spanner_schema_cache.primary_and_parent_keys table_name \
22
- if ActiveRecord::Base != self && table_exists?
21
+ connection.spanner_schema_cache.primary_and_parent_keys table_name \
22
+ if self != ActiveRecord::Base && table_exists?
23
23
  end
24
24
 
25
25
  def primary_and_parent_key= value
@@ -7,9 +7,18 @@
7
7
  module ActiveRecordSpannerAdapter
8
8
  class Table
9
9
  class Column
10
- attr_accessor :schema_name, :table_name, :name, :type, :limit, :ordinal_position,
11
- :allow_commit_timestamp, :default, :default_function, :generated,
12
- :primary_key, :nullable
10
+ attr_accessor :schema_name
11
+ attr_accessor :table_name
12
+ attr_accessor :name
13
+ attr_accessor :type
14
+ attr_accessor :limit
15
+ attr_accessor :ordinal_position
16
+ attr_accessor :allow_commit_timestamp
17
+ attr_accessor :default
18
+ attr_accessor :default_function
19
+ attr_accessor :generated
20
+ attr_accessor :primary_key
21
+ attr_accessor :nullable
13
22
 
14
23
  def initialize \
15
24
  table_name,
@@ -30,8 +30,14 @@ require "activerecord_spanner_adapter/table/column"
30
30
 
31
31
  module ActiveRecordSpannerAdapter
32
32
  class Table
33
- attr_accessor :name, :on_delete, :parent_table, :schema_name, :catalog,
34
- :indexes, :columns, :foreign_keys
33
+ attr_accessor :name
34
+ attr_accessor :on_delete
35
+ attr_accessor :parent_table
36
+ attr_accessor :schema_name
37
+ attr_accessor :catalog
38
+ attr_accessor :indexes
39
+ attr_accessor :columns
40
+ attr_accessor :foreign_keys
35
41
 
36
42
  # parent_table == interleave_in
37
43
  def initialize \
@@ -123,7 +123,7 @@ module ActiveRecordSpannerAdapter
123
123
 
124
124
  def shoot_and_forget_rollback
125
125
  @connection.session.rollback @grpc_transaction.transaction_id if @committable
126
- rescue StandardError # rubocop:disable Lint/HandleExceptions
126
+ rescue StandardError
127
127
  # Ignored
128
128
  end
129
129
 
@@ -5,5 +5,5 @@
5
5
  # https://opensource.org/licenses/MIT.
6
6
 
7
7
  module ActiveRecordSpannerAdapter
8
- VERSION = "1.8.0".freeze
8
+ VERSION = "2.0.0".freeze
9
9
  end
@@ -35,9 +35,7 @@ module Arel # :nodoc: all
35
35
  sql = collector.hints[:statement_hint].value + sql if collector.hints[:statement_hint]
36
36
 
37
37
  if binds
38
- binds << collector.hints[:staleness] if collector.hints[:staleness]
39
- binds << collector.hints[:request_options] if collector.hints[:request_options]
40
- [sql, binds]
38
+ compile_with_binds collector, sql, binds
41
39
  else
42
40
  sql
43
41
  end
@@ -45,6 +43,12 @@ module Arel # :nodoc: all
45
43
 
46
44
  private
47
45
 
46
+ def compile_with_binds collector, sql, binds
47
+ binds << collector.hints[:staleness] if collector.hints[:staleness]
48
+ binds << collector.hints[:request_options] if collector.hints[:request_options]
49
+ [sql, binds]
50
+ end
51
+
48
52
  BIND_BLOCK = proc { |i| "@p#{i}" }
49
53
  private_constant :BIND_BLOCK
50
54
 
@@ -62,43 +66,44 @@ module Arel # :nodoc: all
62
66
  end
63
67
 
64
68
  def visit_statement_hint v, collector
65
- collector.hints[:statement_hint] = \
69
+ collector.hints[:statement_hint] =
66
70
  StatementHint.new v.delete_prefix("statement_hint:")
67
71
  end
68
72
 
69
- # rubocop:disable Naming/MethodName
73
+ # rubocop:disable Naming/MethodName, Metrics/AbcSize
70
74
  def visit_Arel_Nodes_OptimizerHints o, collector
71
75
  o.expr.each do |v|
72
76
  visit_table_hint v, collector if v.start_with? "table_hint:"
73
77
  visit_statement_hint v, collector if v.start_with? "statement_hint:"
74
78
  if v.start_with? "max_staleness:"
75
- collector.hints[:staleness] = \
79
+ collector.hints[:staleness] =
76
80
  StalenessHint.new max_staleness: v.delete_prefix("max_staleness:").to_f
77
81
  next
78
82
  end
79
83
  if v.start_with? "exact_staleness:"
80
- collector.hints[:staleness] = \
84
+ collector.hints[:staleness] =
81
85
  StalenessHint.new exact_staleness: v.delete_prefix("exact_staleness:").to_f
82
86
  next
83
87
  end
84
88
  if v.start_with? "min_read_timestamp:"
85
89
  time = Time.xmlschema v.delete_prefix("min_read_timestamp:")
86
- collector.hints[:staleness] = \
90
+ collector.hints[:staleness] =
87
91
  StalenessHint.new min_read_timestamp: time
88
92
  next
89
93
  end
90
94
  next unless v.start_with? "read_timestamp:"
91
95
  time = Time.xmlschema v.delete_prefix("read_timestamp:")
92
- collector.hints[:staleness] = \
96
+ collector.hints[:staleness] =
93
97
  StalenessHint.new read_timestamp: time
94
98
  end
95
99
  collector
96
100
  end
101
+ # rubocop:enable Metrics/AbcSize
97
102
 
98
103
  def visit_Arel_Nodes_Comment o, collector
99
- o.values.each do |v|
104
+ o.values.each do |v| # rubocop:disable Style/HashEachMethods
100
105
  if v.start_with?("request_tag:") || v.start_with?("transaction_tag:")
101
- collector.hints[:request_options] ||= \
106
+ collector.hints[:request_options] ||=
102
107
  Google::Cloud::Spanner::V1::RequestOptions.new
103
108
  end
104
109
 
@@ -66,8 +66,8 @@ module Google
66
66
  ensure_service!
67
67
 
68
68
  snp_grpc = service.create_snapshot \
69
- path, timestamp: (timestamp || read_timestamp),
70
- staleness: (staleness || exact_staleness)
69
+ path, timestamp: timestamp || read_timestamp,
70
+ staleness: staleness || exact_staleness
71
71
  num_args = Snapshot.method(:from_grpc).arity
72
72
  if num_args == 3
73
73
  Snapshot.from_grpc snp_grpc, self, nil
@@ -105,7 +105,8 @@ module Google
105
105
  end
106
106
 
107
107
  class Transaction
108
- attr_accessor :seqno, :commit
108
+ attr_accessor :seqno
109
+ attr_accessor :commit
109
110
  end
110
111
  end
111
112
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-spanner-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Google LLC
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-12-12 00:00:00.000000000 Z
10
+ date: 2025-01-23 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: google-cloud-spanner
@@ -47,7 +46,7 @@ dependencies:
47
46
  version: '6.1'
48
47
  - - "<"
49
48
  - !ruby/object:Gem::Version
50
- version: '7.3'
49
+ version: '9'
51
50
  type: :runtime
52
51
  prerelease: false
53
52
  version_requirements: !ruby/object:Gem::Requirement
@@ -57,7 +56,7 @@ dependencies:
57
56
  version: '6.1'
58
57
  - - "<"
59
58
  - !ruby/object:Gem::Version
60
- version: '7.3'
59
+ version: '9'
61
60
  - !ruby/object:Gem::Dependency
62
61
  name: autotest-suffix
63
62
  requirement: !ruby/object:Gem::Requirement
@@ -92,14 +91,14 @@ dependencies:
92
91
  requirements:
93
92
  - - "~>"
94
93
  - !ruby/object:Gem::Version
95
- version: 1.24.0
94
+ version: 1.30.1
96
95
  type: :development
97
96
  prerelease: false
98
97
  version_requirements: !ruby/object:Gem::Requirement
99
98
  requirements:
100
99
  - - "~>"
101
100
  - !ruby/object:Gem::Version
102
- version: 1.24.0
101
+ version: 1.30.1
103
102
  - !ruby/object:Gem::Dependency
104
103
  name: minitest
105
104
  requirement: !ruby/object:Gem::Requirement
@@ -245,6 +244,7 @@ files:
245
244
  - ".github/workflows/nightly-acceptance-tests-on-production.yaml"
246
245
  - ".github/workflows/nightly-unit-tests.yaml"
247
246
  - ".github/workflows/rubocop.yaml"
247
+ - ".github/workflows/samples.yaml"
248
248
  - ".gitignore"
249
249
  - ".kokoro/populate-secrets.sh"
250
250
  - ".kokoro/release.cfg"
@@ -283,6 +283,7 @@ files:
283
283
  - acceptance/cases/migration/references_statements_test.rb
284
284
  - acceptance/cases/migration/rename_column_test.rb
285
285
  - acceptance/cases/migration/schema_dumper_test.rb
286
+ - acceptance/cases/models/binary_identifiers.rb
286
287
  - acceptance/cases/models/calculation_query_test.rb
287
288
  - acceptance/cases/models/default_value_test.rb
288
289
  - acceptance/cases/models/generated_column_test.rb
@@ -313,6 +314,7 @@ files:
313
314
  - acceptance/models/album.rb
314
315
  - acceptance/models/all_types.rb
315
316
  - acceptance/models/author.rb
317
+ - acceptance/models/binary_project.rb
316
318
  - acceptance/models/club.rb
317
319
  - acceptance/models/comment.rb
318
320
  - acceptance/models/customer.rb
@@ -324,9 +326,11 @@ files:
324
326
  - acceptance/models/organization.rb
325
327
  - acceptance/models/post.rb
326
328
  - acceptance/models/singer.rb
329
+ - acceptance/models/string_io.rb
327
330
  - acceptance/models/table_with_sequence.rb
328
331
  - acceptance/models/track.rb
329
332
  - acceptance/models/transaction.rb
333
+ - acceptance/models/user.rb
330
334
  - acceptance/schema/schema.rb
331
335
  - acceptance/test_helper.rb
332
336
  - acceptance/test_helpers/with_separate_database.rb
@@ -351,7 +355,6 @@ files:
351
355
  - examples/snippets/array-data-type/application.rb
352
356
  - examples/snippets/array-data-type/config/database.yml
353
357
  - examples/snippets/array-data-type/db/migrate/01_create_tables.rb
354
- - examples/snippets/array-data-type/db/schema.rb
355
358
  - examples/snippets/array-data-type/db/seeds.rb
356
359
  - examples/snippets/array-data-type/models/entity_with_array_types.rb
357
360
  - examples/snippets/bin/create_emulator_instance.rb
@@ -360,7 +363,6 @@ files:
360
363
  - examples/snippets/bit-reversed-sequence/application.rb
361
364
  - examples/snippets/bit-reversed-sequence/config/database.yml
362
365
  - examples/snippets/bit-reversed-sequence/db/migrate/01_create_tables.rb
363
- - examples/snippets/bit-reversed-sequence/db/schema.rb
364
366
  - examples/snippets/bit-reversed-sequence/db/seeds.rb
365
367
  - examples/snippets/bit-reversed-sequence/models/album.rb
366
368
  - examples/snippets/bit-reversed-sequence/models/singer.rb
@@ -369,7 +371,6 @@ files:
369
371
  - examples/snippets/bulk-insert/application.rb
370
372
  - examples/snippets/bulk-insert/config/database.yml
371
373
  - examples/snippets/bulk-insert/db/migrate/01_create_tables.rb
372
- - examples/snippets/bulk-insert/db/schema.rb
373
374
  - examples/snippets/bulk-insert/db/seeds.rb
374
375
  - examples/snippets/bulk-insert/models/album.rb
375
376
  - examples/snippets/bulk-insert/models/singer.rb
@@ -378,7 +379,6 @@ files:
378
379
  - examples/snippets/commit-timestamp/application.rb
379
380
  - examples/snippets/commit-timestamp/config/database.yml
380
381
  - examples/snippets/commit-timestamp/db/migrate/01_create_tables.rb
381
- - examples/snippets/commit-timestamp/db/schema.rb
382
382
  - examples/snippets/commit-timestamp/db/seeds.rb
383
383
  - examples/snippets/commit-timestamp/models/album.rb
384
384
  - examples/snippets/commit-timestamp/models/singer.rb
@@ -388,7 +388,6 @@ files:
388
388
  - examples/snippets/create-records/application.rb
389
389
  - examples/snippets/create-records/config/database.yml
390
390
  - examples/snippets/create-records/db/migrate/01_create_tables.rb
391
- - examples/snippets/create-records/db/schema.rb
392
391
  - examples/snippets/create-records/db/seeds.rb
393
392
  - examples/snippets/create-records/models/album.rb
394
393
  - examples/snippets/create-records/models/singer.rb
@@ -397,7 +396,6 @@ files:
397
396
  - examples/snippets/date-data-type/application.rb
398
397
  - examples/snippets/date-data-type/config/database.yml
399
398
  - examples/snippets/date-data-type/db/migrate/01_create_tables.rb
400
- - examples/snippets/date-data-type/db/schema.rb
401
399
  - examples/snippets/date-data-type/db/seeds.rb
402
400
  - examples/snippets/date-data-type/models/singer.rb
403
401
  - examples/snippets/generated-column/README.md
@@ -405,7 +403,6 @@ files:
405
403
  - examples/snippets/generated-column/application.rb
406
404
  - examples/snippets/generated-column/config/database.yml
407
405
  - examples/snippets/generated-column/db/migrate/01_create_tables.rb
408
- - examples/snippets/generated-column/db/schema.rb
409
406
  - examples/snippets/generated-column/db/seeds.rb
410
407
  - examples/snippets/generated-column/models/singer.rb
411
408
  - examples/snippets/hints/README.md
@@ -413,7 +410,6 @@ files:
413
410
  - examples/snippets/hints/application.rb
414
411
  - examples/snippets/hints/config/database.yml
415
412
  - examples/snippets/hints/db/migrate/01_create_tables.rb
416
- - examples/snippets/hints/db/schema.rb
417
413
  - examples/snippets/hints/db/seeds.rb
418
414
  - examples/snippets/hints/models/album.rb
419
415
  - examples/snippets/hints/models/singer.rb
@@ -422,7 +418,6 @@ files:
422
418
  - examples/snippets/interleaved-tables-before-7.1/application.rb
423
419
  - examples/snippets/interleaved-tables-before-7.1/config/database.yml
424
420
  - examples/snippets/interleaved-tables-before-7.1/db/migrate/01_create_tables.rb
425
- - examples/snippets/interleaved-tables-before-7.1/db/schema.rb
426
421
  - examples/snippets/interleaved-tables-before-7.1/db/seeds.rb
427
422
  - examples/snippets/interleaved-tables-before-7.1/models/album.rb
428
423
  - examples/snippets/interleaved-tables-before-7.1/models/singer.rb
@@ -432,7 +427,6 @@ files:
432
427
  - examples/snippets/interleaved-tables/application.rb
433
428
  - examples/snippets/interleaved-tables/config/database.yml
434
429
  - examples/snippets/interleaved-tables/db/migrate/01_create_tables.rb
435
- - examples/snippets/interleaved-tables/db/schema.rb
436
430
  - examples/snippets/interleaved-tables/db/seeds.rb
437
431
  - examples/snippets/interleaved-tables/models/album.rb
438
432
  - examples/snippets/interleaved-tables/models/singer.rb
@@ -442,7 +436,6 @@ files:
442
436
  - examples/snippets/migrations/application.rb
443
437
  - examples/snippets/migrations/config/database.yml
444
438
  - examples/snippets/migrations/db/migrate/01_create_tables.rb
445
- - examples/snippets/migrations/db/schema.rb
446
439
  - examples/snippets/migrations/db/seeds.rb
447
440
  - examples/snippets/migrations/models/album.rb
448
441
  - examples/snippets/migrations/models/singer.rb
@@ -452,7 +445,6 @@ files:
452
445
  - examples/snippets/mutations/application.rb
453
446
  - examples/snippets/mutations/config/database.yml
454
447
  - examples/snippets/mutations/db/migrate/01_create_tables.rb
455
- - examples/snippets/mutations/db/schema.rb
456
448
  - examples/snippets/mutations/db/seeds.rb
457
449
  - examples/snippets/mutations/models/album.rb
458
450
  - examples/snippets/mutations/models/singer.rb
@@ -461,7 +453,6 @@ files:
461
453
  - examples/snippets/optimistic-locking/application.rb
462
454
  - examples/snippets/optimistic-locking/config/database.yml
463
455
  - examples/snippets/optimistic-locking/db/migrate/01_create_tables.rb
464
- - examples/snippets/optimistic-locking/db/schema.rb
465
456
  - examples/snippets/optimistic-locking/db/seeds.rb
466
457
  - examples/snippets/optimistic-locking/models/album.rb
467
458
  - examples/snippets/optimistic-locking/models/singer.rb
@@ -470,7 +461,6 @@ files:
470
461
  - examples/snippets/partitioned-dml/application.rb
471
462
  - examples/snippets/partitioned-dml/config/database.yml
472
463
  - examples/snippets/partitioned-dml/db/migrate/01_create_tables.rb
473
- - examples/snippets/partitioned-dml/db/schema.rb
474
464
  - examples/snippets/partitioned-dml/db/seeds.rb
475
465
  - examples/snippets/partitioned-dml/models/album.rb
476
466
  - examples/snippets/partitioned-dml/models/singer.rb
@@ -479,7 +469,6 @@ files:
479
469
  - examples/snippets/query-logs/application.rb
480
470
  - examples/snippets/query-logs/config/database.yml
481
471
  - examples/snippets/query-logs/db/migrate/01_create_tables.rb
482
- - examples/snippets/query-logs/db/schema.rb
483
472
  - examples/snippets/query-logs/db/seeds.rb
484
473
  - examples/snippets/query-logs/models/album.rb
485
474
  - examples/snippets/query-logs/models/singer.rb
@@ -488,7 +477,6 @@ files:
488
477
  - examples/snippets/quickstart/application.rb
489
478
  - examples/snippets/quickstart/config/database.yml
490
479
  - examples/snippets/quickstart/db/migrate/01_create_tables.rb
491
- - examples/snippets/quickstart/db/schema.rb
492
480
  - examples/snippets/quickstart/db/seeds.rb
493
481
  - examples/snippets/quickstart/models/album.rb
494
482
  - examples/snippets/quickstart/models/singer.rb
@@ -497,7 +485,6 @@ files:
497
485
  - examples/snippets/read-only-transactions/application.rb
498
486
  - examples/snippets/read-only-transactions/config/database.yml
499
487
  - examples/snippets/read-only-transactions/db/migrate/01_create_tables.rb
500
- - examples/snippets/read-only-transactions/db/schema.rb
501
488
  - examples/snippets/read-only-transactions/db/seeds.rb
502
489
  - examples/snippets/read-only-transactions/models/album.rb
503
490
  - examples/snippets/read-only-transactions/models/singer.rb
@@ -506,7 +493,6 @@ files:
506
493
  - examples/snippets/read-write-transactions/application.rb
507
494
  - examples/snippets/read-write-transactions/config/database.yml
508
495
  - examples/snippets/read-write-transactions/db/migrate/01_create_tables.rb
509
- - examples/snippets/read-write-transactions/db/schema.rb
510
496
  - examples/snippets/read-write-transactions/db/seeds.rb
511
497
  - examples/snippets/read-write-transactions/models/album.rb
512
498
  - examples/snippets/read-write-transactions/models/singer.rb
@@ -515,7 +501,6 @@ files:
515
501
  - examples/snippets/stale-reads/application.rb
516
502
  - examples/snippets/stale-reads/config/database.yml
517
503
  - examples/snippets/stale-reads/db/migrate/01_create_tables.rb
518
- - examples/snippets/stale-reads/db/schema.rb
519
504
  - examples/snippets/stale-reads/db/seeds.rb
520
505
  - examples/snippets/stale-reads/models/album.rb
521
506
  - examples/snippets/stale-reads/models/singer.rb
@@ -524,7 +509,6 @@ files:
524
509
  - examples/snippets/tags/application.rb
525
510
  - examples/snippets/tags/config/database.yml
526
511
  - examples/snippets/tags/db/migrate/01_create_tables.rb
527
- - examples/snippets/tags/db/schema.rb
528
512
  - examples/snippets/tags/db/seeds.rb
529
513
  - examples/snippets/tags/models/album.rb
530
514
  - examples/snippets/tags/models/singer.rb
@@ -533,7 +517,6 @@ files:
533
517
  - examples/snippets/timestamp-data-type/application.rb
534
518
  - examples/snippets/timestamp-data-type/config/database.yml
535
519
  - examples/snippets/timestamp-data-type/db/migrate/01_create_tables.rb
536
- - examples/snippets/timestamp-data-type/db/schema.rb
537
520
  - examples/snippets/timestamp-data-type/db/seeds.rb
538
521
  - examples/snippets/timestamp-data-type/models/meeting.rb
539
522
  - examples/solidus/README.md
@@ -574,7 +557,6 @@ homepage: https://github.com/googleapis/ruby-spanner-activerecord
574
557
  licenses:
575
558
  - MIT
576
559
  metadata: {}
577
- post_install_message:
578
560
  rdoc_options: []
579
561
  require_paths:
580
562
  - lib
@@ -582,15 +564,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
582
564
  requirements:
583
565
  - - ">="
584
566
  - !ruby/object:Gem::Version
585
- version: '2.7'
567
+ version: '3.1'
586
568
  required_rubygems_version: !ruby/object:Gem::Requirement
587
569
  requirements:
588
570
  - - ">="
589
571
  - !ruby/object:Gem::Version
590
572
  version: '0'
591
573
  requirements: []
592
- rubygems_version: 3.5.23
593
- signing_key:
574
+ rubygems_version: 3.6.2
594
575
  specification_version: 4
595
576
  summary: Rails ActiveRecord connector for Google Spanner Database
596
577
  test_files: []
@@ -1,31 +0,0 @@
1
- # This file is auto-generated from the current state of the database. Instead
2
- # of editing this file, please use the migrations feature of Active Record to
3
- # incrementally modify your database, and then regenerate this schema definition.
4
- #
5
- # This file is the source Rails uses to define your schema when running `bin/rails
6
- # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
7
- # be faster and is potentially less error prone than running all of your
8
- # migrations from scratch. Old migrations may fail to apply correctly if those
9
- # migrations use external dependencies or application code.
10
- #
11
- # It's strongly recommended that you check this file into your version control system.
12
-
13
- ActiveRecord::Schema.define(version: 1) do
14
- connection.start_batch_ddl
15
-
16
- create_table "entity_with_array_types", id: { limit: 8 }, force: :cascade do |t|
17
- t.string "col_array_string"
18
- t.integer "col_array_int64", limit: 8
19
- t.float "col_array_float64"
20
- t.decimal "col_array_numeric"
21
- t.boolean "col_array_bool"
22
- t.binary "col_array_bytes"
23
- t.date "col_array_date"
24
- t.time "col_array_timestamp"
25
- end
26
-
27
- connection.run_batch
28
- rescue
29
- abort_batch
30
- raise
31
- end