activerecord-spanner-adapter 1.6.3 → 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 (141) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/acceptance-tests-on-emulator.yaml +3 -7
  3. data/.github/workflows/acceptance-tests-on-production.yaml +1 -1
  4. data/.github/workflows/ci.yaml +3 -7
  5. data/.github/workflows/nightly-acceptance-tests-on-emulator.yaml +4 -33
  6. data/.github/workflows/nightly-acceptance-tests-on-production.yaml +1 -1
  7. data/.github/workflows/nightly-unit-tests.yaml +5 -33
  8. data/.github/workflows/rubocop.yaml +1 -1
  9. data/.github/workflows/samples.yaml +30 -0
  10. data/.kokoro/populate-secrets.sh +5 -1
  11. data/.kokoro/release.cfg +22 -12
  12. data/.kokoro/release.sh +1 -3
  13. data/.kokoro/trampoline_v2.sh +19 -11
  14. data/.release-please-manifest.json +1 -1
  15. data/.rubocop.yml +2 -2
  16. data/.trampolinerc +6 -1
  17. data/CHANGELOG.md +37 -0
  18. data/Gemfile +7 -5
  19. data/README.md +11 -9
  20. data/Rakefile +2 -2
  21. data/acceptance/cases/migration/command_recorder_test.rb +7 -38
  22. data/acceptance/cases/migration/references_index_test.rb +2 -11
  23. data/acceptance/cases/migration/schema_dumper_test.rb +21 -9
  24. data/acceptance/cases/models/binary_identifiers.rb +97 -0
  25. data/acceptance/cases/models/insert_all_test.rb +22 -7
  26. data/acceptance/cases/sessions/session_not_found_test.rb +2 -0
  27. data/acceptance/cases/tasks/database_tasks_test.rb +1 -0
  28. data/acceptance/models/binary_project.rb +20 -0
  29. data/acceptance/models/string_io.rb +28 -0
  30. data/acceptance/models/user.rb +20 -0
  31. data/acceptance/test_helper.rb +6 -1
  32. data/activerecord-spanner-adapter.gemspec +3 -3
  33. data/benchmarks/application.rb +3 -7
  34. data/examples/snippets/Rakefile +27 -5
  35. data/examples/snippets/array-data-type/application.rb +1 -5
  36. data/examples/snippets/array-data-type/config/database.yml +1 -0
  37. data/examples/snippets/bit-reversed-sequence/application.rb +0 -4
  38. data/examples/snippets/bit-reversed-sequence/config/database.yml +1 -0
  39. data/examples/snippets/bit-reversed-sequence/db/seeds.rb +2 -2
  40. data/examples/snippets/bulk-insert/application.rb +1 -5
  41. data/examples/snippets/bulk-insert/config/database.yml +1 -0
  42. data/examples/snippets/commit-timestamp/application.rb +0 -4
  43. data/examples/snippets/commit-timestamp/config/database.yml +1 -0
  44. data/examples/snippets/config/environment.rb +5 -0
  45. data/examples/snippets/create-records/application.rb +1 -5
  46. data/examples/snippets/create-records/config/database.yml +1 -0
  47. data/examples/snippets/date-data-type/application.rb +1 -5
  48. data/examples/snippets/date-data-type/config/database.yml +1 -0
  49. data/examples/snippets/date-data-type/db/seeds.rb +1 -1
  50. data/examples/snippets/generated-column/application.rb +0 -4
  51. data/examples/snippets/generated-column/config/database.yml +1 -0
  52. data/examples/snippets/generated-column/db/seeds.rb +1 -1
  53. data/examples/snippets/hints/application.rb +0 -4
  54. data/examples/snippets/hints/config/database.yml +1 -0
  55. data/examples/snippets/hints/db/seeds.rb +1 -1
  56. data/examples/snippets/interleaved-tables/application.rb +1 -5
  57. data/examples/snippets/interleaved-tables/config/database.yml +1 -0
  58. data/examples/snippets/interleaved-tables/db/seeds.rb +1 -1
  59. data/examples/snippets/interleaved-tables/models/album.rb +6 -2
  60. data/examples/snippets/interleaved-tables/models/track.rb +5 -1
  61. data/examples/snippets/interleaved-tables-before-7.1/application.rb +1 -5
  62. data/examples/snippets/interleaved-tables-before-7.1/config/database.yml +1 -0
  63. data/examples/snippets/interleaved-tables-before-7.1/db/seeds.rb +1 -1
  64. data/examples/snippets/migrations/application.rb +0 -4
  65. data/examples/snippets/migrations/config/database.yml +1 -0
  66. data/examples/snippets/mutations/application.rb +1 -5
  67. data/examples/snippets/mutations/config/database.yml +1 -0
  68. data/examples/snippets/mutations/db/seeds.rb +1 -1
  69. data/examples/snippets/optimistic-locking/application.rb +0 -4
  70. data/examples/snippets/optimistic-locking/config/database.yml +1 -0
  71. data/examples/snippets/optimistic-locking/db/seeds.rb +1 -1
  72. data/examples/snippets/partitioned-dml/application.rb +0 -4
  73. data/examples/snippets/partitioned-dml/config/database.yml +1 -0
  74. data/examples/snippets/partitioned-dml/db/seeds.rb +1 -1
  75. data/examples/snippets/query-logs/application.rb +15 -13
  76. data/examples/snippets/query-logs/config/database.yml +1 -0
  77. data/examples/snippets/query-logs/db/seeds.rb +1 -1
  78. data/examples/snippets/quickstart/application.rb +0 -4
  79. data/examples/snippets/quickstart/config/database.yml +1 -0
  80. data/examples/snippets/quickstart/db/seeds.rb +1 -1
  81. data/examples/snippets/read-only-transactions/application.rb +0 -4
  82. data/examples/snippets/read-only-transactions/config/database.yml +1 -0
  83. data/examples/snippets/read-only-transactions/db/seeds.rb +1 -1
  84. data/examples/snippets/read-write-transactions/application.rb +2 -6
  85. data/examples/snippets/read-write-transactions/config/database.yml +1 -0
  86. data/examples/snippets/read-write-transactions/db/seeds.rb +1 -1
  87. data/examples/snippets/stale-reads/application.rb +0 -4
  88. data/examples/snippets/stale-reads/config/database.yml +1 -0
  89. data/examples/snippets/stale-reads/db/seeds.rb +1 -1
  90. data/examples/snippets/tags/application.rb +0 -4
  91. data/examples/snippets/tags/config/database.yml +1 -0
  92. data/examples/snippets/tags/db/seeds.rb +1 -1
  93. data/examples/snippets/timestamp-data-type/application.rb +0 -4
  94. data/examples/snippets/timestamp-data-type/config/database.yml +1 -0
  95. data/lib/active_record/connection_adapters/spanner/column.rb +3 -3
  96. data/lib/active_record/connection_adapters/spanner/database_statements.rb +37 -23
  97. data/lib/active_record/connection_adapters/spanner/quoting.rb +19 -6
  98. data/lib/active_record/connection_adapters/spanner/schema_creation.rb +7 -9
  99. data/lib/active_record/connection_adapters/spanner/schema_definitions.rb +12 -2
  100. data/lib/active_record/connection_adapters/spanner/schema_statements.rb +28 -46
  101. data/lib/active_record/connection_adapters/spanner/type_metadata.rb +4 -6
  102. data/lib/active_record/connection_adapters/spanner_adapter.rb +54 -27
  103. data/lib/active_record/tasks/spanner_database_tasks.rb +4 -4
  104. data/lib/active_record/type/spanner/array.rb +4 -0
  105. data/lib/active_record/type/spanner/bytes.rb +10 -0
  106. data/lib/activerecord-spanner-adapter.rb +5 -1
  107. data/lib/activerecord_spanner_adapter/base.rb +58 -30
  108. data/lib/activerecord_spanner_adapter/connection.rb +9 -5
  109. data/lib/activerecord_spanner_adapter/foreign_key.rb +9 -2
  110. data/lib/activerecord_spanner_adapter/index/column.rb +6 -1
  111. data/lib/activerecord_spanner_adapter/index.rb +10 -2
  112. data/lib/activerecord_spanner_adapter/information_schema.rb +1 -1
  113. data/lib/activerecord_spanner_adapter/primary_key.rb +2 -2
  114. data/lib/activerecord_spanner_adapter/table/column.rb +12 -3
  115. data/lib/activerecord_spanner_adapter/table.rb +8 -2
  116. data/lib/activerecord_spanner_adapter/transaction.rb +1 -1
  117. data/lib/activerecord_spanner_adapter/version.rb +1 -1
  118. data/lib/arel/visitors/spanner.rb +16 -11
  119. data/lib/spanner_client_ext.rb +4 -3
  120. metadata +15 -34
  121. data/examples/snippets/array-data-type/db/schema.rb +0 -31
  122. data/examples/snippets/bit-reversed-sequence/db/schema.rb +0 -31
  123. data/examples/snippets/bulk-insert/db/schema.rb +0 -31
  124. data/examples/snippets/commit-timestamp/db/schema.rb +0 -34
  125. data/examples/snippets/create-records/db/schema.rb +0 -31
  126. data/examples/snippets/date-data-type/db/schema.rb +0 -26
  127. data/examples/snippets/generated-column/db/schema.rb +0 -26
  128. data/examples/snippets/hints/db/schema.rb +0 -33
  129. data/examples/snippets/interleaved-tables/db/schema.rb +0 -39
  130. data/examples/snippets/interleaved-tables-before-7.1/db/schema.rb +0 -37
  131. data/examples/snippets/migrations/db/schema.rb +0 -38
  132. data/examples/snippets/mutations/db/schema.rb +0 -32
  133. data/examples/snippets/optimistic-locking/db/schema.rb +0 -34
  134. data/examples/snippets/partitioned-dml/db/schema.rb +0 -31
  135. data/examples/snippets/query-logs/db/schema.rb +0 -31
  136. data/examples/snippets/quickstart/db/schema.rb +0 -31
  137. data/examples/snippets/read-only-transactions/db/schema.rb +0 -31
  138. data/examples/snippets/read-write-transactions/db/schema.rb +0 -32
  139. data/examples/snippets/stale-reads/db/schema.rb +0 -31
  140. data/examples/snippets/tags/db/schema.rb +0 -31
  141. data/examples/snippets/timestamp-data-type/db/schema.rb +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c2a9a0a36a471ac93bdb0d59e50cc9b8e5c6647655487dc55a1d9e398abcf46
4
- data.tar.gz: de680bcac6cf0f491bd0007d80d48496cf5e74b5eddf17d13b58353f06b818da
3
+ metadata.gz: df28341210b0da8f86475dc621e5c4113ad00a72b23fa6bc3e224a0064c7e267
4
+ data.tar.gz: 00eed36443cb2cd7c99869a6e2ff3821c16fd2a16a3d937dd831c3226743ef19
5
5
  SHA512:
6
- metadata.gz: '0658d456b4d6377bf5f95f44296869404ac9ac1c65aaa25360080bab1df7c122c4b7aba28992f5030e6465e51fefa1b6630a4e79547c65446edd29c40954ca61'
7
- data.tar.gz: 470e026052a753f08d59f2824044894afe84d5601735270250c09368c7541ef98d5356a6ca6810c10755033a81601afb40826656967bdf8cda132563a2e9b267
6
+ metadata.gz: a53ee5f7ab4d576a969631ce6125557a6171f91dd372f71c03c34c62b67b9363e0898d4b8d7ff3836d58efd73fd2a71dbf108668c5e837634864e017d129b8ca
7
+ data.tar.gz: 665f4e837ee3dee167c2d5e4160dfe03fb3008903f3be50dbae50dd07fcea8b01b7b561b683c825c460a3462d0f729c5ace143c4285d9eb05b2871776086cd94
@@ -18,16 +18,12 @@ jobs:
18
18
  strategy:
19
19
  max-parallel: 4
20
20
  matrix:
21
- ruby: ["2.7", "3.0", "3.1", "3.2"]
22
- ar: ["~> 6.0.6", "~> 6.1.7", "~> 7.0.4", "~> 7.1.0"]
21
+ ruby: ["3.1", "3.2", "3.3"]
22
+ ar: ["~> 7.0.0", "~> 7.1.0", "~> 7.2.0", "~> 8.0.0"]
23
23
  # Exclude combinations that are not supported.
24
24
  exclude:
25
- - ruby: "3.0"
26
- ar: "~> 6.0.6"
27
25
  - ruby: "3.1"
28
- ar: "~> 6.0.6"
29
- - ruby: "3.2"
30
- ar: "~> 6.0.6"
26
+ ar: "~> 8.0.0"
31
27
  env:
32
28
  AR_VERSION: ${{ matrix.ar }}
33
29
  steps:
@@ -24,7 +24,7 @@ jobs:
24
24
  strategy:
25
25
  max-parallel: 4
26
26
  matrix:
27
- ruby: [3.0]
27
+ ruby: [3.3]
28
28
  steps:
29
29
  - uses: actions/checkout@v4
30
30
  - name: Set up Ruby
@@ -10,16 +10,12 @@ jobs:
10
10
  strategy:
11
11
  max-parallel: 4
12
12
  matrix:
13
- ruby: ["2.7", "3.0", "3.1", "3.2"]
14
- ar: ["~> 6.0.6", "~> 6.1.7", "~> 7.0.4", "~> 7.1.0"]
13
+ ruby: ["3.1", "3.2", "3.3"]
14
+ ar: ["~> 7.0.0", "~> 7.1.0", "~> 7.2.0", "~> 8.0.0"]
15
15
  # Exclude combinations that are not supported.
16
16
  exclude:
17
- - ruby: "3.0"
18
- ar: "~> 6.0.6"
19
17
  - ruby: "3.1"
20
- ar: "~> 6.0.6"
21
- - ruby: "3.2"
22
- ar: "~> 6.0.6"
18
+ ar: "~> 8.0.0"
23
19
  env:
24
20
  AR_VERSION: ${{ matrix.ar }}
25
21
  steps:
@@ -18,41 +18,12 @@ jobs:
18
18
  strategy:
19
19
  max-parallel: 4
20
20
  matrix:
21
- # Run acceptance tests all supported combinations of Ruby and ActiveRecord.
22
- ruby: [2.7, 3.0, 3.1, 3.2]
23
- ar: [6.0.0, 6.0.1, 6.0.2.2, 6.0.3.7, 6.0.4, 6.1.3.2, 6.1.4.7, 6.1.5.1, 6.1.6.1, 7.0.2.4, 7.0.3.1, 7.0.4, 7.0.5, 7.0.6, 7.0.7, 7.1.0, 7.1.1, 7.1.2]
21
+ ruby: ["3.1", "3.2", "3.3"]
22
+ ar: ["~> 7.0.0", "~> 7.1.0", "~> 7.2.0", "~> 8.0.0"]
24
23
  # Exclude combinations that are not supported.
25
24
  exclude:
26
- - ruby: 3.0
27
- ar: 6.0.0
28
- - ruby: 3.0
29
- ar: 6.0.1
30
- - ruby: 3.0
31
- ar: 6.0.2.2
32
- - ruby: 3.0
33
- ar: 6.0.3.7
34
- - ruby: 3.0
35
- ar: 6.0.4
36
- - ruby: 3.1
37
- ar: 6.0.0
38
- - ruby: 3.1
39
- ar: 6.0.1
40
- - ruby: 3.1
41
- ar: 6.0.2.2
42
- - ruby: 3.1
43
- ar: 6.0.3.7
44
- - ruby: 3.1
45
- ar: 6.0.4
46
- - ruby: 3.2
47
- ar: 6.0.0
48
- - ruby: 3.2
49
- ar: 6.0.1
50
- - ruby: 3.2
51
- ar: 6.0.2.2
52
- - ruby: 3.2
53
- ar: 6.0.3.7
54
- - ruby: 3.2
55
- ar: 6.0.4
25
+ - ruby: "3.1"
26
+ ar: "~> 8.0.0"
56
27
  env:
57
28
  AR_VERSION: ${{ matrix.ar }}
58
29
  steps:
@@ -10,7 +10,7 @@ jobs:
10
10
  strategy:
11
11
  max-parallel: 4
12
12
  matrix:
13
- ruby: [3.0]
13
+ ruby: [3.3]
14
14
  steps:
15
15
  - uses: actions/checkout@v4
16
16
  - name: Set up Ruby
@@ -10,41 +10,13 @@ jobs:
10
10
  strategy:
11
11
  max-parallel: 4
12
12
  matrix:
13
- # Run unit tests all supported combinations of Ruby and ActiveRecord.
14
- ruby: [2.7, 3.0, 3.1, 3.2]
15
- ar: [6.0.0, 6.0.1, 6.0.2.2, 6.0.3.7, 6.0.4, 6.1.3.2, 6.1.4.7, 6.1.5.1, 6.1.6.1, 7.0.2.4, 7.0.3.1, 7.0.4, 7.0.5, 7.1.0, 7.1.1, 7.1.2]
13
+ # Run acceptance tests all supported combinations of Ruby and ActiveRecord.
14
+ ruby: ["3.1", "3.2", "3.3"]
15
+ ar: ["~> 7.0.0", "~> 7.1.0", "~> 7.2.0", "~> 8.0.0"]
16
16
  # Exclude combinations that are not supported.
17
17
  exclude:
18
- - ruby: 3.0
19
- ar: 6.0.0
20
- - ruby: 3.0
21
- ar: 6.0.1
22
- - ruby: 3.0
23
- ar: 6.0.2.2
24
- - ruby: 3.0
25
- ar: 6.0.3.7
26
- - ruby: 3.0
27
- ar: 6.0.4
28
- - ruby: 3.1
29
- ar: 6.0.0
30
- - ruby: 3.1
31
- ar: 6.0.1
32
- - ruby: 3.1
33
- ar: 6.0.2.2
34
- - ruby: 3.1
35
- ar: 6.0.3.7
36
- - ruby: 3.1
37
- ar: 6.0.4
38
- - ruby: 3.2
39
- ar: 6.0.0
40
- - ruby: 3.2
41
- ar: 6.0.1
42
- - ruby: 3.2
43
- ar: 6.0.2.2
44
- - ruby: 3.2
45
- ar: 6.0.3.7
46
- - ruby: 3.2
47
- ar: 6.0.4
18
+ - ruby: "3.1"
19
+ ar: "~> 8.0.0"
48
20
  env:
49
21
  AR_VERSION: ${{ matrix.ar }}
50
22
  steps:
@@ -16,7 +16,7 @@ jobs:
16
16
  - name: setup ruby
17
17
  uses: ruby/setup-ruby@v1
18
18
  with:
19
- ruby-version: '2.7'
19
+ ruby-version: '3.3'
20
20
  - name: cache gems
21
21
  uses: actions/cache@v4
22
22
  with:
@@ -0,0 +1,30 @@
1
+ on:
2
+ pull_request:
3
+ name: samples
4
+ jobs:
5
+ test:
6
+ runs-on: ubuntu-latest
7
+
8
+ strategy:
9
+ max-parallel: 4
10
+ matrix:
11
+ ruby: ["3.1", "3.2", "3.3"]
12
+ ar: ["~> 7.0.0", "~> 7.1.0", "~> 7.2.0", "~> 8.0.0"]
13
+ # Exclude combinations that are not supported.
14
+ exclude:
15
+ - ruby: "3.1"
16
+ ar: "~> 8.0.0"
17
+ env:
18
+ AR_VERSION: ${{ matrix.ar }}
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - name: Set up Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ bundler-cache: false
25
+ ruby-version: ${{ matrix.ruby }}
26
+ - name: Install dependencies
27
+ run: bundle install
28
+ - name: Run samples
29
+ run: bundle exec rake all
30
+ working-directory: examples/snippets
@@ -24,6 +24,10 @@ function msg { println "$*" >&2 ;}
24
24
  function println { printf '%s\n' "$(now) $*" ;}
25
25
 
26
26
  # Populates requested secrets set in SECRET_MANAGER_KEYS
27
+ if [[ -z "${SECRET_MANAGER_PROJECT_ID-}" ]]; then
28
+ msg "SECRET_MANAGER_PROJECT_ID is not set in environment variables, using default"
29
+ SECRET_MANAGER_PROJECT_ID="cloud-devrel-kokoro-resources"
30
+ fi
27
31
 
28
32
  # In Kokoro CI builds, we use the service account attached to the
29
33
  # Kokoro VM. This means we need to setup auth on other CI systems.
@@ -65,7 +69,7 @@ do
65
69
  msg "Retrieving secret ${key}"
66
70
  "${GCLOUD_COMMANDS[@]}" \
67
71
  secrets versions access latest \
68
- --project cloud-devrel-kokoro-resources \
72
+ --project "${SECRET_MANAGER_PROJECT_ID}" \
69
73
  --secret $key > \
70
74
  "$SECRET_LOCATION/$key"
71
75
  if [[ $? == 0 ]]; then
data/.kokoro/release.cfg CHANGED
@@ -7,19 +7,13 @@ action {
7
7
  }
8
8
  }
9
9
 
10
- # Download resources for system tests (service account key, etc.)
11
- gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/google-cloud-ruby"
12
-
13
- # Download trampoline resources.
14
- gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
15
-
16
10
  # Use the trampoline script to run in docker.
17
11
  build_file: "ruby-spanner-activerecord/.kokoro/trampoline_v2.sh"
18
12
 
19
13
  # Configure the docker image for kokoro-trampoline.
20
14
  env_vars: {
21
15
  key: "TRAMPOLINE_IMAGE"
22
- value: "gcr.io/cloud-devrel-kokoro-resources/yoshi-ruby/release"
16
+ value: "us-central1-docker.pkg.dev/cloud-sdk-release-custom-pool/release-images/ruby-multi"
23
17
  }
24
18
 
25
19
  env_vars: {
@@ -27,16 +21,32 @@ env_vars: {
27
21
  value: ".kokoro/release.sh"
28
22
  }
29
23
 
24
+ env_vars: {
25
+ key: "SECRET_MANAGER_PROJECT_ID"
26
+ value: "cloud-sdk-release-custom-pool"
27
+ }
28
+
30
29
  env_vars: {
31
30
  key: "SECRET_MANAGER_KEYS"
32
31
  value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem,docuploader_service_account"
33
32
  }
34
33
 
34
+ # Pick up Rubygems key from internal keystore
35
+ before_action {
36
+ fetch_keystore {
37
+ keystore_resource {
38
+ keystore_config_id: 73713
39
+ keyname: "rubygems-publish-key"
40
+ backend: "blade:keystore-fastconfigpush"
41
+ }
42
+ }
43
+ }
44
+
35
45
  # Store the packages uploaded to rubygems.org, which
36
46
  # we can later use to generate SBOMs and attestations.
37
47
  action {
38
- define_artifacts {
39
- regex: "github/ruby-spanner-activerecord/pkg/*.gem"
40
- strip_prefix: "github"
41
- }
42
- }
48
+ define_artifacts {
49
+ regex: "github/ruby-spanner-activerecord/pkg/*.gem"
50
+ strip_prefix: "github"
51
+ }
52
+ }
data/.kokoro/release.sh CHANGED
@@ -8,6 +8,4 @@ export GEM_HOME=$HOME/.gem
8
8
  export PATH=$GEM_HOME/bin:$PATH
9
9
 
10
10
  gem install --no-document toys
11
- toys release install-python-tools -v
12
- python3 -m releasetool publish-reporter-script > /tmp/publisher-script; source /tmp/publisher-script
13
- toys release perform -v --enable-docs < /dev/null
11
+ toys release perform -v --reporter-org=googleapis --enable-docs --force-republish --enable-docs --enable-rad < /dev/null
@@ -138,18 +138,26 @@ if [[ -n "${KOKORO_BUILD_ID:-}" ]]; then
138
138
  RUNNING_IN_CI="true"
139
139
  TRAMPOLINE_CI="kokoro"
140
140
  if [[ "${TRAMPOLINE_USE_LEGACY_SERVICE_ACCOUNT:-}" == "true" ]]; then
141
- if [[ ! -f "${KOKORO_GFILE_DIR}/kokoro-trampoline.service-account.json" ]]; then
142
- log_red "${KOKORO_GFILE_DIR}/kokoro-trampoline.service-account.json does not exist. Did you forget to mount cloud-devrel-kokoro-resources/trampoline? Aborting."
143
- exit 1
144
- fi
145
- # This service account will be activated later.
146
- TRAMPOLINE_SERVICE_ACCOUNT="${KOKORO_GFILE_DIR}/kokoro-trampoline.service-account.json"
141
+ if [[ ! -f "${KOKORO_GFILE_DIR}/kokoro-trampoline.service-account.json" ]]; then
142
+ log_red "${KOKORO_GFILE_DIR}/kokoro-trampoline.service-account.json does not exist. Did you forget to mount cloud-devrel-kokoro-resources/trampoline? Aborting."
143
+ exit 1
144
+ fi
145
+ # This service account will be activated later.
146
+ TRAMPOLINE_SERVICE_ACCOUNT="${KOKORO_GFILE_DIR}/kokoro-trampoline.service-account.json"
147
147
  else
148
- if [[ "${TRAMPOLINE_VERBOSE:-}" == "true" ]]; then
149
- gcloud auth list
150
- fi
151
- log_yellow "Configuring Container Registry access"
152
- gcloud auth configure-docker --quiet
148
+ if [[ "${TRAMPOLINE_VERBOSE:-}" == "true" ]]; then
149
+ gcloud auth list
150
+ fi
151
+ log_yellow "Configuring Container Registry access"
152
+ TRAMPOLINE_HOST=$(echo "${TRAMPOLINE_IMAGE}" | cut -d/ -f1)
153
+ if [[ ! "${TRAMPOLINE_HOST}" =~ "gcr.io" ]]; then
154
+ # If you need to specificy a host other than gcr.io, you have to run on an update version of gcloud.
155
+ echo "TRAMPOLINE_HOST: ${TRAMPOLINE_HOST}"
156
+ gcloud components update
157
+ gcloud auth configure-docker "${TRAMPOLINE_HOST}"
158
+ else
159
+ gcloud auth configure-docker --quiet
160
+ fi
153
161
  fi
154
162
  pass_down_envvars+=(
155
163
  # KOKORO dynamic variables.
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "1.6.3"
2
+ ".": "2.0.0"
3
3
  }
data/.rubocop.yml CHANGED
@@ -16,7 +16,7 @@ AllCops:
16
16
 
17
17
  Documentation:
18
18
  Enabled: false
19
- Layout/AlignHash:
19
+ Layout/HashAlignment:
20
20
  Enabled: false
21
21
  Metrics/ClassLength:
22
22
  Enabled: false
@@ -24,7 +24,7 @@ Metrics/ModuleLength:
24
24
  Enabled: false
25
25
  Naming/RescuedExceptionsVariableName:
26
26
  Enabled: false
27
- Naming/UncommunicativeMethodParamName:
27
+ Naming/MethodParameterName:
28
28
  Enabled: false
29
29
  Style/EmptyMethod:
30
30
  Enabled: false
data/.trampolinerc CHANGED
@@ -18,7 +18,12 @@ required_envvars+=(
18
18
 
19
19
  # Add env vars which are passed down into the container here.
20
20
  pass_down_envvars+=(
21
- "AUTORELEASE_PR" "RELEASE_DRY_RUN" "RELEASE_PACKAGE" "KOKORO_GIT_COMMIT" "RUBY_VERSIONS" "EXTRA_CI_ARGS"
21
+ "AUTORELEASE_PR"
22
+ "EXTRA_CI_ARGS"
23
+ "KOKORO_GIT_COMMIT"
24
+ "RELEASE_DRY_RUN"
25
+ "RELEASE_PACKAGE"
26
+ "RUBY_VERSIONS"
22
27
  )
23
28
 
24
29
  # Prevent unintentional override on the default image.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # Changelog
2
2
 
3
+ ### 2.0.0 (2025-01-23)
4
+
5
+ ### ⚠ BREAKING CHANGES
6
+
7
+ * drop support for Rails 6.1 ([#346](https://github.com/googleapis/ruby-spanner-activerecord/issues/346))
8
+ * deserialize BYTES to StringIO ([#343](https://github.com/googleapis/ruby-spanner-activerecord/issues/343))
9
+
10
+ #### Features
11
+
12
+ * drop support for Rails 6.1 ([#346](https://github.com/googleapis/ruby-spanner-activerecord/issues/346))
13
+ * support Rails 8.0 ([#331](https://github.com/googleapis/ruby-spanner-activerecord/issues/331))
14
+ #### Bug Fixes
15
+
16
+ * deserialize BYTES to StringIO ([#343](https://github.com/googleapis/ruby-spanner-activerecord/issues/343))
17
+ #### Documentation
18
+
19
+ * add rails dbconsole to list of limitations ([#224](https://github.com/googleapis/ruby-spanner-activerecord/issues/224))
20
+
21
+ ### 1.8.0 (2024-12-12)
22
+
23
+ #### Features
24
+
25
+ * INSERT OR [IGNORE|UPDATE] ([#332](https://github.com/googleapis/ruby-spanner-activerecord/issues/332))
26
+ #### Bug Fixes
27
+
28
+ * Fixed incorrect argument handling. ([#333](https://github.com/googleapis/ruby-spanner-activerecord/issues/333))
29
+
30
+ ### 1.7.0 (2024-12-11)
31
+
32
+ #### Features
33
+
34
+ * support Rails 7.2.0 ([#328](https://github.com/googleapis/ruby-spanner-activerecord/issues/328))
35
+ #### Bug Fixes
36
+
37
+ * `SpannerAdapter` requires prepared statements to be enabled ([#323](https://github.com/googleapis/ruby-spanner-activerecord/issues/323))
38
+ * local emulator test ([#320](https://github.com/googleapis/ruby-spanner-activerecord/issues/320))
39
+
3
40
  ### 1.6.3 (2024-08-31)
4
41
 
5
42
  #### Bug Fixes
data/Gemfile CHANGED
@@ -3,16 +3,18 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in activerecord-spanner.gemspec
4
4
  gemspec
5
5
 
6
- gem "activerecord", ENV.fetch("AR_VERSION", "~> 6.1.6.1")
6
+ ar_version = ENV.fetch("AR_VERSION", "~> 7.1.0")
7
+ gem "activerecord", ar_version
8
+ gem "ostruct"
7
9
  gem "minitest", "~> 5.25.0"
8
10
  gem "minitest-rg", "~> 5.3.0"
9
- gem "pry", "~> 0.13.0"
10
- gem "pry-byebug", "~> 3.9.0"
11
+ gem "pry", "~> 0.14.2"
12
+ gem "pry-byebug", "~> 3.10.1"
11
13
  # Add sqlite3 for testing for compatibility with other adapters.
12
- gem 'sqlite3', '~> 1.4'
14
+ gem 'sqlite3'
13
15
 
14
16
  # Required for samples and testing.
15
- install_if -> { ENV.fetch("AR_VERSION", "~> 6.1.6.1").dup.to_s.sub("~>", "").strip < "7.1.0" && !ENV["SKIP_COMPOSITE_PK"] } do
17
+ install_if -> { ar_version.dup.to_s.sub("~>", "").strip < "7.1.0" && !ENV["SKIP_COMPOSITE_PK"] } do
16
18
  gem "composite_primary_keys"
17
19
  end
18
20
 
data/README.md CHANGED
@@ -89,15 +89,17 @@ Some noteworthy examples in the snippets directory:
89
89
 
90
90
  ## Limitations
91
91
 
92
- | Limitation | Comment | Resolution |
93
- |-----------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|
94
- | Interleaved tables require composite primary keys | Cloud Spanner requires composite primary keys for interleaved tables. See {file:examples/snippets/interleaved-tables/README.md this example} for an example on how to use interleaved tables with ActiveRecord | Use composite primary keys. |
95
- | Lack of sequential IDs | Cloud Spanner uses either using bit-reversed sequences or UUID4 to generated primary keys to avoid [hotspotting](https://cloud.google.com/spanner/docs/schema-design#uuid_primary_key) so you SHOULD NOT rely on IDs being sorted | Use either UUID4s or bit-reversed sequences to automatically generate primary keys. |
96
- | Table without Primary Key | Cloud Spanner support does not support tables without a primary key. | Always define a primary key for your table. |
97
- | Table names CANNOT have spaces within them whether back-ticked or not | Cloud Spanner DOES NOT support tables with spaces in them for example `Entity ID` | Ensure that your table names don't contain spaces. |
98
- | Table names CANNOT have punctuation marks and MUST contain valid UTF-8 | Cloud Spanner DOES NOT support punctuation marks e.g. periods ".", question marks "?" in table names | Ensure that your table names don't contain punctuation marks. |
99
- | Index with fields length [add_index](https://apidock.com/rails/v5.2.3/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index) | Cloud Spanner does not support index with fields length | Ensure that your database definition does not include index definitions with field lengths. |
100
- | Only GoogleSQL-dialect databases | Cloud Spanner supports both GoogleSQL- and PostgreSQL-dialect databases. This adapter only supports GoogleSQL-dialect databases. | Ensure that your database uses the GoogleSQL dialect. |
92
+ | Limitation | Comment | Resolution |
93
+ |-----------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|
94
+ | Interleaved tables require composite primary keys | Cloud Spanner requires composite primary keys for interleaved tables. See {file:examples/snippets/interleaved-tables/README.md this example} for an example on how to use interleaved tables with ActiveRecord | Use composite primary keys. |
95
+ | Lack of sequential IDs | Cloud Spanner uses either using bit-reversed sequences or UUID4 to generated primary keys to avoid [hotspotting](https://cloud.google.com/spanner/docs/schema-design#uuid_primary_key) so you SHOULD NOT rely on IDs being sorted | Use either UUID4s or bit-reversed sequences to automatically generate primary keys. |
96
+ | Table without Primary Key | Cloud Spanner support does not support tables without a primary key. | Always define a primary key for your table. |
97
+ | Table names CANNOT have spaces within them whether back-ticked or not | Cloud Spanner DOES NOT support tables with spaces in them for example `Entity ID` | Ensure that your table names don't contain spaces. |
98
+ | Table names CANNOT have punctuation marks and MUST contain valid UTF-8 | Cloud Spanner DOES NOT support punctuation marks e.g. periods ".", question marks "?" in table names | Ensure that your table names don't contain punctuation marks. |
99
+ | Index with fields length [add_index](https://apidock.com/rails/v5.2.3/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index) | Cloud Spanner does not support index with fields length | Ensure that your database definition does not include index definitions with field lengths. |
100
+ | Only GoogleSQL-dialect databases | Cloud Spanner supports both GoogleSQL- and PostgreSQL-dialect databases. This adapter only supports GoogleSQL-dialect databases. You can use the [PostgreSQL ActiveRecord provider in combination with PGAdapter](https://github.com/GoogleCloudPlatform/pgadapter/tree/postgresql-dialect/samples/ruby/activerecord) for Spanner PostgreSQL databases. | |
101
+ | `rails dbconsole` is not supported. | The `rails dbconsole` is not supported for Spanner databases. | |
102
+
101
103
 
102
104
  ## Contributing
103
105
 
data/Rakefile CHANGED
@@ -56,8 +56,8 @@ task :acceptance, [:project, :keyfile, :instance, :tests] do |t, args|
56
56
  tests ||= "**"
57
57
 
58
58
  # always overwrite when running tests
59
- ENV["SPANNER_PROJECT"] = project
60
- ENV["SPANNER_KEYFILE_JSON"] = keyfile
59
+ ENV["SPANNER_TEST_PROJECT"] = project
60
+ ENV["SPANNER_TEST_KEYFILE_JSON"] = keyfile
61
61
  ENV["SPANNER_TEST_INSTANCE"] = instance
62
62
  ENV["SPANNER_EMULATOR_HOST"] = emulator_host
63
63
 
@@ -13,9 +13,6 @@ module ActiveRecord
13
13
  class CommandRecorderTest < SpannerAdapter::TestCase
14
14
  include SpannerAdapter::Migration::TestHelper
15
15
 
16
- VERSION_6_1_0 = Gem::Version.create "6.1.0"
17
- VERSION_6_0_3 = Gem::Version.create "6.0.3"
18
-
19
16
  def setup
20
17
  skip_test_table_create!
21
18
  super
@@ -203,20 +200,12 @@ module ActiveRecord
203
200
 
204
201
  def test_invert_add_index
205
202
  remove = @recorder.inverse_of :add_index, [:table, [:one, :two]]
206
- if ActiveRecord::gem_version < Gem::Version.create('6.1.0')
207
- assert_equal [:remove_index, [:table, { column: [:one, :two] }]], remove
208
- else
209
- assert_equal [:remove_index, [:table, [:one, :two]], nil], remove
210
- end
203
+ assert_equal [:remove_index, [:table, [:one, :two]], nil], remove
211
204
  end
212
205
 
213
206
  def test_invert_add_index_with_name
214
207
  remove = @recorder.inverse_of :add_index, [:table, [:one, :two], name: "new_index"]
215
- if ActiveRecord::gem_version < Gem::Version.create('6.1.0')
216
- assert_equal [:remove_index, [:table, { name: "new_index" }]], remove
217
- else
218
- assert_equal [:remove_index, [:table, [:one, :two], {:name=>"new_index"}], nil], remove
219
- end
208
+ assert_equal [:remove_index, [:table, [:one, :two], {:name=>"new_index"}], nil], remove
220
209
  end
221
210
 
222
211
  def test_invert_remove_index
@@ -226,11 +215,7 @@ module ActiveRecord
226
215
 
227
216
  def test_invert_remove_index_with_options
228
217
  add = @recorder.inverse_of :remove_index, [:table, { column: :one }]
229
- if ActiveRecord::gem_version < Gem::Version.create('6.1.0')
230
- assert_equal [:add_index, [:table, :one, {} ]], add
231
- else
232
- assert_equal [:add_index, [:table, :one ]], add
233
- end
218
+ assert_equal [:add_index, [:table, :one ]], add
234
219
  end
235
220
 
236
221
  def test_invert_remove_index_with_positional_column
@@ -250,11 +235,7 @@ module ActiveRecord
250
235
 
251
236
  def test_invert_remove_index_with_no_special_options
252
237
  add = @recorder.inverse_of :remove_index, [:table, { column: [:one, :two] }]
253
- if ActiveRecord::gem_version < Gem::Version.create('6.1.0')
254
- assert_equal [:add_index, [:table, [:one, :two], {}]], add
255
- else
256
- assert_equal [:add_index, [:table, [:one, :two]]], add
257
- end
238
+ assert_equal [:add_index, [:table, [:one, :two]]], add
258
239
  end
259
240
 
260
241
  def test_invert_remove_index_with_no_column
@@ -315,11 +296,7 @@ module ActiveRecord
315
296
 
316
297
  def test_invert_add_foreign_key
317
298
  enable = @recorder.inverse_of :add_foreign_key, [:dogs, :people]
318
- if ActiveRecord.gem_version < VERSION_6_0_3
319
- assert_equal [:remove_foreign_key, [:dogs, :people]], enable
320
- else
321
- assert_equal [:remove_foreign_key, [:dogs, :people], nil], enable
322
- end
299
+ assert_equal [:remove_foreign_key, [:dogs, :people], nil], enable
323
300
  end
324
301
 
325
302
  def test_invert_remove_foreign_key
@@ -329,11 +306,7 @@ module ActiveRecord
329
306
 
330
307
  def test_invert_add_foreign_key_with_column
331
308
  enable = @recorder.inverse_of :add_foreign_key, [:dogs, :people, column: "owner_id"]
332
- if ActiveRecord.gem_version < VERSION_6_0_3
333
- assert_equal [:remove_foreign_key, [:dogs, column: "owner_id"]], enable
334
- else
335
- assert_equal [:remove_foreign_key, [:dogs, :people, column: "owner_id"], nil], enable
336
- end
309
+ assert_equal [:remove_foreign_key, [:dogs, :people, column: "owner_id"], nil], enable
337
310
  end
338
311
 
339
312
  def test_invert_remove_foreign_key_with_column
@@ -343,11 +316,7 @@ module ActiveRecord
343
316
 
344
317
  def test_invert_add_foreign_key_with_column_and_name
345
318
  enable = @recorder.inverse_of :add_foreign_key, [:dogs, :people, column: "owner_id", name: "fk"]
346
- if ActiveRecord.gem_version < VERSION_6_0_3
347
- assert_equal [:remove_foreign_key, [:dogs, { name: "fk" }]], enable
348
- else
349
- assert_equal [:remove_foreign_key, [:dogs, :people, { column: "owner_id", name: "fk" }], nil], enable
350
- end
319
+ assert_equal [:remove_foreign_key, [:dogs, :people, { column: "owner_id", name: "fk" }], nil], enable
351
320
  end
352
321
 
353
322
  def test_invert_remove_foreign_key_with_column_and_name
@@ -76,12 +76,7 @@ module ActiveRecord
76
76
  t.references :foo, polymorphic: true, index: true
77
77
  end
78
78
  end
79
-
80
- if ActiveRecord::gem_version < Gem::Version.create('6.1.0')
81
- assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo_type_and_foo_id)
82
- else
83
- assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo)
84
- end
79
+ assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo)
85
80
  end
86
81
 
87
82
  def test_creates_index_for_existing_table
@@ -124,11 +119,7 @@ module ActiveRecord
124
119
  end
125
120
  end
126
121
 
127
- if ActiveRecord::gem_version < Gem::Version.create('6.1.0')
128
- assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo_type_and_foo_id)
129
- else
130
- assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo)
131
- end
122
+ assert connection.index_exists?(table_name, [:foo_type, :foo_id], name: :index_testings_on_foo)
132
123
  end
133
124
  end
134
125
  end