google-cloud-spanner 3.60.0__tar.gz → 3.62.0__tar.gz

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 (214) hide show
  1. {google_cloud_spanner-3.60.0/google_cloud_spanner.egg-info → google_cloud_spanner-3.62.0}/PKG-INFO +1 -1
  2. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/__init__.py +104 -0
  3. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/gapic_version.py +1 -1
  4. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/client.py +32 -14
  5. google_cloud_spanner-3.62.0/google/cloud/spanner_admin_instance_v1/__init__.py +214 -0
  6. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/gapic_version.py +1 -1
  7. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/client.py +32 -14
  8. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/parse_utils.py +5 -0
  9. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/version.py +1 -1
  10. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/_helpers.py +9 -0
  11. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/gapic_version.py +1 -1
  12. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/param_types.py +1 -0
  13. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/client.py +32 -14
  14. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/snapshot.py +31 -46
  15. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/streamed.py +1 -0
  16. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/transaction.py +3 -1
  17. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0/google_cloud_spanner.egg-info}/PKG-INFO +1 -1
  18. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/setup.py +4 -0
  19. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_session_api.py +13 -0
  20. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py +226 -29
  21. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py +226 -29
  22. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_v1/test_spanner.py +226 -29
  23. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_parse_utils.py +23 -0
  24. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test__helpers.py +13 -0
  25. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_session.py +4 -1
  26. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_snapshot.py +50 -0
  27. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_transaction.py +1 -0
  28. google_cloud_spanner-3.60.0/google/cloud/spanner_admin_instance_v1/__init__.py +0 -110
  29. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/LICENSE +0 -0
  30. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/MANIFEST.in +0 -0
  31. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/README.rst +0 -0
  32. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner.py +0 -0
  33. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/gapic_metadata.json +0 -0
  34. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/py.typed +0 -0
  35. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/__init__.py +0 -0
  36. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/__init__.py +0 -0
  37. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/async_client.py +0 -0
  38. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/pagers.py +0 -0
  39. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/__init__.py +0 -0
  40. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/base.py +0 -0
  41. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc.py +0 -0
  42. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc_asyncio.py +0 -0
  43. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/rest.py +0 -0
  44. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/rest_base.py +0 -0
  45. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/types/__init__.py +0 -0
  46. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/types/backup.py +0 -0
  47. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/types/backup_schedule.py +0 -0
  48. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/types/common.py +0 -0
  49. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/types/spanner_database_admin.py +0 -0
  50. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/gapic_metadata.json +0 -0
  51. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/py.typed +0 -0
  52. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/__init__.py +0 -0
  53. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/__init__.py +0 -0
  54. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/async_client.py +0 -0
  55. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/pagers.py +0 -0
  56. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/__init__.py +0 -0
  57. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/base.py +0 -0
  58. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc.py +0 -0
  59. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc_asyncio.py +0 -0
  60. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/rest.py +0 -0
  61. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/rest_base.py +0 -0
  62. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/types/__init__.py +0 -0
  63. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/types/common.py +0 -0
  64. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/types/spanner_instance_admin.py +0 -0
  65. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/__init__.py +0 -0
  66. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/_helpers.py +0 -0
  67. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/batch_dml_executor.py +0 -0
  68. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/checksum.py +0 -0
  69. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/client_side_statement_executor.py +0 -0
  70. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/client_side_statement_parser.py +0 -0
  71. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/connection.py +0 -0
  72. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/cursor.py +0 -0
  73. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/exceptions.py +0 -0
  74. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/parsed_statement.py +0 -0
  75. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/parser.py +0 -0
  76. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/partition_helper.py +0 -0
  77. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/transaction_helper.py +0 -0
  78. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/types.py +0 -0
  79. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/utils.py +0 -0
  80. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/__init__.py +0 -0
  81. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/_opentelemetry_tracing.py +0 -0
  82. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/backup.py +0 -0
  83. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/batch.py +0 -0
  84. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/client.py +0 -0
  85. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/data_types.py +0 -0
  86. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/database.py +0 -0
  87. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/database_sessions_manager.py +0 -0
  88. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/gapic_metadata.json +0 -0
  89. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/instance.py +0 -0
  90. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/keyset.py +0 -0
  91. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/merged_result_set.py +0 -0
  92. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/constants.py +0 -0
  93. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_capture.py +0 -0
  94. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_exporter.py +0 -0
  95. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_interceptor.py +0 -0
  96. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_tracer.py +0 -0
  97. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_tracer_factory.py +0 -0
  98. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/spanner_metrics_tracer_factory.py +0 -0
  99. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/pool.py +0 -0
  100. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/py.typed +0 -0
  101. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/request_id_header.py +0 -0
  102. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/__init__.py +0 -0
  103. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/__init__.py +0 -0
  104. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/async_client.py +0 -0
  105. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/pagers.py +0 -0
  106. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/__init__.py +0 -0
  107. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/base.py +0 -0
  108. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/grpc.py +0 -0
  109. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/grpc_asyncio.py +0 -0
  110. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/rest.py +0 -0
  111. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/rest_base.py +0 -0
  112. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/session.py +0 -0
  113. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/table.py +0 -0
  114. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/__init__.py +0 -0
  115. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/database_test.py +0 -0
  116. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/interceptors.py +0 -0
  117. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/mock_database_admin.py +0 -0
  118. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/mock_spanner.py +0 -0
  119. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/spanner_database_admin_pb2_grpc.py +0 -0
  120. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/spanner_pb2_grpc.py +0 -0
  121. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/__init__.py +0 -0
  122. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/change_stream.py +0 -0
  123. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/commit_response.py +0 -0
  124. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/keys.py +0 -0
  125. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/location.py +0 -0
  126. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/mutation.py +0 -0
  127. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/query_plan.py +0 -0
  128. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/result_set.py +0 -0
  129. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/spanner.py +0 -0
  130. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/transaction.py +0 -0
  131. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/type.py +0 -0
  132. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/SOURCES.txt +0 -0
  133. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/dependency_links.txt +0 -0
  134. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/not-zip-safe +0 -0
  135. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/requires.txt +0 -0
  136. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/top_level.txt +0 -0
  137. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/setup.cfg +0 -0
  138. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/__init__.py +0 -0
  139. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/_builders.py +0 -0
  140. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/_fixtures.py +0 -0
  141. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/_helpers.py +0 -0
  142. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/__init__.py +0 -0
  143. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/mock_server_test_base.py +0 -0
  144. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_aborted_transaction.py +0 -0
  145. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_basics.py +0 -0
  146. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_dbapi_autocommit.py +0 -0
  147. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_dbapi_isolation_level.py +0 -0
  148. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_request_id_header.py +0 -0
  149. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_tags.py +0 -0
  150. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/__init__.py +0 -0
  151. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/_helpers.py +0 -0
  152. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/_sample_data.py +0 -0
  153. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/conftest.py +0 -0
  154. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_backup_api.py +0 -0
  155. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_database_api.py +0 -0
  156. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_dbapi.py +0 -0
  157. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_instance_api.py +0 -0
  158. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_metrics.py +0 -0
  159. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_observability_options.py +0 -0
  160. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_streaming_chunking.py +0 -0
  161. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_table_api.py +0 -0
  162. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/testdata/descriptors.pb +0 -0
  163. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/testdata/singer.proto +0 -0
  164. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/testdata/singer_pb2.py +0 -0
  165. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/__init__.py +0 -0
  166. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/clear_streaming.py +0 -0
  167. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/populate_streaming.py +0 -0
  168. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/scrub_instances.py +0 -0
  169. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/streaming_utils.py +0 -0
  170. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/__init__.py +0 -0
  171. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/__init__.py +0 -0
  172. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_admin_database_v1/__init__.py +0 -0
  173. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_admin_instance_v1/__init__.py +0 -0
  174. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_v1/__init__.py +0 -0
  175. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/__init__.py +0 -0
  176. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test__helpers.py +0 -0
  177. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_batch_dml_executor.py +0 -0
  178. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_checksum.py +0 -0
  179. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_client_side_statement_executor.py +0 -0
  180. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_connect.py +0 -0
  181. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_connection.py +0 -0
  182. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_cursor.py +0 -0
  183. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_globals.py +0 -0
  184. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_parser.py +0 -0
  185. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_transaction_helper.py +0 -0
  186. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_types.py +0 -0
  187. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_utils.py +0 -0
  188. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/streaming-read-acceptance-test.json +0 -0
  189. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test__opentelemetry_tracing.py +0 -0
  190. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_atomic_counter.py +0 -0
  191. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_backup.py +0 -0
  192. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_batch.py +0 -0
  193. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_client.py +0 -0
  194. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_database.py +0 -0
  195. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_database_session_manager.py +0 -0
  196. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_datatypes.py +0 -0
  197. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_instance.py +0 -0
  198. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_keyset.py +0 -0
  199. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_merged_result_set.py +0 -0
  200. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics.py +0 -0
  201. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_capture.py +0 -0
  202. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_exporter.py +0 -0
  203. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_interceptor.py +0 -0
  204. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_tracer.py +0 -0
  205. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_tracer_factory.py +0 -0
  206. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_packaging.py +0 -0
  207. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_param_types.py +0 -0
  208. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_pool.py +0 -0
  209. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_spanner.py +0 -0
  210. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_spanner_metrics_tracer_factory.py +0 -0
  211. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_streamed.py +0 -0
  212. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_table.py +0 -0
  213. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/testdata/singer.proto +0 -0
  214. {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/testdata/singer_pb2.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-cloud-spanner
3
- Version: 3.60.0
3
+ Version: 3.62.0
4
4
  Summary: Google Cloud Spanner API client library
5
5
  Home-page: https://github.com/googleapis/python-spanner
6
6
  Author: Google LLC
@@ -15,8 +15,18 @@
15
15
  #
16
16
  from google.cloud.spanner_admin_database_v1 import gapic_version as package_version
17
17
 
18
+ import google.api_core as api_core
19
+ import sys
20
+
18
21
  __version__ = package_version.__version__
19
22
 
23
+ if sys.version_info >= (3, 8): # pragma: NO COVER
24
+ from importlib import metadata
25
+ else: # pragma: NO COVER
26
+ # TODO(https://github.com/googleapis/python-api-core/issues/835): Remove
27
+ # this code path once we drop support for Python 3.7
28
+ import importlib_metadata as metadata
29
+
20
30
 
21
31
  from .services.database_admin import DatabaseAdminClient
22
32
  from .services.database_admin import DatabaseAdminAsyncClient
@@ -83,6 +93,100 @@ from .types.spanner_database_admin import UpdateDatabaseMetadata
83
93
  from .types.spanner_database_admin import UpdateDatabaseRequest
84
94
  from .types.spanner_database_admin import RestoreSourceType
85
95
 
96
+ if hasattr(api_core, "check_python_version") and hasattr(
97
+ api_core, "check_dependency_versions"
98
+ ): # pragma: NO COVER
99
+ api_core.check_python_version("google.cloud.spanner_admin_database_v1") # type: ignore
100
+ api_core.check_dependency_versions("google.cloud.spanner_admin_database_v1") # type: ignore
101
+ else: # pragma: NO COVER
102
+ # An older version of api_core is installed which does not define the
103
+ # functions above. We do equivalent checks manually.
104
+ try:
105
+ import warnings
106
+ import sys
107
+
108
+ _py_version_str = sys.version.split()[0]
109
+ _package_label = "google.cloud.spanner_admin_database_v1"
110
+ if sys.version_info < (3, 9):
111
+ warnings.warn(
112
+ "You are using a non-supported Python version "
113
+ + f"({_py_version_str}). Google will not post any further "
114
+ + f"updates to {_package_label} supporting this Python version. "
115
+ + "Please upgrade to the latest Python version, or at "
116
+ + f"least to Python 3.9, and then update {_package_label}.",
117
+ FutureWarning,
118
+ )
119
+ if sys.version_info[:2] == (3, 9):
120
+ warnings.warn(
121
+ f"You are using a Python version ({_py_version_str}) "
122
+ + f"which Google will stop supporting in {_package_label} in "
123
+ + "January 2026. Please "
124
+ + "upgrade to the latest Python version, or at "
125
+ + "least to Python 3.10, before then, and "
126
+ + f"then update {_package_label}.",
127
+ FutureWarning,
128
+ )
129
+
130
+ def parse_version_to_tuple(version_string: str):
131
+ """Safely converts a semantic version string to a comparable tuple of integers.
132
+ Example: "4.25.8" -> (4, 25, 8)
133
+ Ignores non-numeric parts and handles common version formats.
134
+ Args:
135
+ version_string: Version string in the format "x.y.z" or "x.y.z<suffix>"
136
+ Returns:
137
+ Tuple of integers for the parsed version string.
138
+ """
139
+ parts = []
140
+ for part in version_string.split("."):
141
+ try:
142
+ parts.append(int(part))
143
+ except ValueError:
144
+ # If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'), stop here.
145
+ # This is a simplification compared to 'packaging.parse_version', but sufficient
146
+ # for comparing strictly numeric semantic versions.
147
+ break
148
+ return tuple(parts)
149
+
150
+ def _get_version(dependency_name):
151
+ try:
152
+ version_string: str = metadata.version(dependency_name)
153
+ parsed_version = parse_version_to_tuple(version_string)
154
+ return (parsed_version, version_string)
155
+ except Exception:
156
+ # Catch exceptions from metadata.version() (e.g., PackageNotFoundError)
157
+ # or errors during parse_version_to_tuple
158
+ return (None, "--")
159
+
160
+ _dependency_package = "google.protobuf"
161
+ _next_supported_version = "4.25.8"
162
+ _next_supported_version_tuple = (4, 25, 8)
163
+ _recommendation = " (we recommend 6.x)"
164
+ (_version_used, _version_used_string) = _get_version(_dependency_package)
165
+ if _version_used and _version_used < _next_supported_version_tuple:
166
+ warnings.warn(
167
+ f"Package {_package_label} depends on "
168
+ + f"{_dependency_package}, currently installed at version "
169
+ + f"{_version_used_string}. Future updates to "
170
+ + f"{_package_label} will require {_dependency_package} at "
171
+ + f"version {_next_supported_version} or higher{_recommendation}."
172
+ + " Please ensure "
173
+ + "that either (a) your Python environment doesn't pin the "
174
+ + f"version of {_dependency_package}, so that updates to "
175
+ + f"{_package_label} can require the higher version, or "
176
+ + "(b) you manually update your Python environment to use at "
177
+ + f"least version {_next_supported_version} of "
178
+ + f"{_dependency_package}.",
179
+ FutureWarning,
180
+ )
181
+ except Exception:
182
+ warnings.warn(
183
+ "Could not determine the version of Python "
184
+ + "currently being used. To continue receiving "
185
+ + "updates for {_package_label}, ensure you are "
186
+ + "using a supported version of Python; see "
187
+ + "https://devguide.python.org/versions/"
188
+ )
189
+
86
190
  __all__ = (
87
191
  "DatabaseAdminAsyncClient",
88
192
  "AddSplitPointsRequest",
@@ -13,4 +13,4 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- __version__ = "3.60.0" # {x-release-please-version}
16
+ __version__ = "3.62.0" # {x-release-please-version}
@@ -172,6 +172,34 @@ class DatabaseAdminClient(metaclass=DatabaseAdminClientMeta):
172
172
  _DEFAULT_ENDPOINT_TEMPLATE = "spanner.{UNIVERSE_DOMAIN}"
173
173
  _DEFAULT_UNIVERSE = "googleapis.com"
174
174
 
175
+ @staticmethod
176
+ def _use_client_cert_effective():
177
+ """Returns whether client certificate should be used for mTLS if the
178
+ google-auth version supports should_use_client_cert automatic mTLS enablement.
179
+
180
+ Alternatively, read from the GOOGLE_API_USE_CLIENT_CERTIFICATE env var.
181
+
182
+ Returns:
183
+ bool: whether client certificate should be used for mTLS
184
+ Raises:
185
+ ValueError: (If using a version of google-auth without should_use_client_cert and
186
+ GOOGLE_API_USE_CLIENT_CERTIFICATE is set to an unexpected value.)
187
+ """
188
+ # check if google-auth version supports should_use_client_cert for automatic mTLS enablement
189
+ if hasattr(mtls, "should_use_client_cert"): # pragma: NO COVER
190
+ return mtls.should_use_client_cert()
191
+ else: # pragma: NO COVER
192
+ # if unsupported, fallback to reading from env var
193
+ use_client_cert_str = os.getenv(
194
+ "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
195
+ ).lower()
196
+ if use_client_cert_str not in ("true", "false"):
197
+ raise ValueError(
198
+ "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be"
199
+ " either `true` or `false`"
200
+ )
201
+ return use_client_cert_str == "true"
202
+
175
203
  @classmethod
176
204
  def from_service_account_info(cls, info: dict, *args, **kwargs):
177
205
  """Creates an instance of this client using the provided credentials
@@ -518,12 +546,8 @@ class DatabaseAdminClient(metaclass=DatabaseAdminClientMeta):
518
546
  )
519
547
  if client_options is None:
520
548
  client_options = client_options_lib.ClientOptions()
521
- use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false")
549
+ use_client_cert = DatabaseAdminClient._use_client_cert_effective()
522
550
  use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto")
523
- if use_client_cert not in ("true", "false"):
524
- raise ValueError(
525
- "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
526
- )
527
551
  if use_mtls_endpoint not in ("auto", "never", "always"):
528
552
  raise MutualTLSChannelError(
529
553
  "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
@@ -531,7 +555,7 @@ class DatabaseAdminClient(metaclass=DatabaseAdminClientMeta):
531
555
 
532
556
  # Figure out the client cert source to use.
533
557
  client_cert_source = None
534
- if use_client_cert == "true":
558
+ if use_client_cert:
535
559
  if client_options.client_cert_source:
536
560
  client_cert_source = client_options.client_cert_source
537
561
  elif mtls.has_default_client_cert_source():
@@ -563,20 +587,14 @@ class DatabaseAdminClient(metaclass=DatabaseAdminClientMeta):
563
587
  google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT
564
588
  is not any of ["auto", "never", "always"].
565
589
  """
566
- use_client_cert = os.getenv(
567
- "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
568
- ).lower()
590
+ use_client_cert = DatabaseAdminClient._use_client_cert_effective()
569
591
  use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower()
570
592
  universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN")
571
- if use_client_cert not in ("true", "false"):
572
- raise ValueError(
573
- "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
574
- )
575
593
  if use_mtls_endpoint not in ("auto", "never", "always"):
576
594
  raise MutualTLSChannelError(
577
595
  "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
578
596
  )
579
- return use_client_cert == "true", use_mtls_endpoint, universe_domain_env
597
+ return use_client_cert, use_mtls_endpoint, universe_domain_env
580
598
 
581
599
  @staticmethod
582
600
  def _get_client_cert_source(provided_cert_source, use_cert_flag):
@@ -0,0 +1,214 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright 2025 Google LLC
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ from google.cloud.spanner_admin_instance_v1 import gapic_version as package_version
17
+
18
+ import google.api_core as api_core
19
+ import sys
20
+
21
+ __version__ = package_version.__version__
22
+
23
+ if sys.version_info >= (3, 8): # pragma: NO COVER
24
+ from importlib import metadata
25
+ else: # pragma: NO COVER
26
+ # TODO(https://github.com/googleapis/python-api-core/issues/835): Remove
27
+ # this code path once we drop support for Python 3.7
28
+ import importlib_metadata as metadata
29
+
30
+
31
+ from .services.instance_admin import InstanceAdminClient
32
+ from .services.instance_admin import InstanceAdminAsyncClient
33
+
34
+ from .types.common import OperationProgress
35
+ from .types.common import ReplicaSelection
36
+ from .types.common import FulfillmentPeriod
37
+ from .types.spanner_instance_admin import AutoscalingConfig
38
+ from .types.spanner_instance_admin import CreateInstanceConfigMetadata
39
+ from .types.spanner_instance_admin import CreateInstanceConfigRequest
40
+ from .types.spanner_instance_admin import CreateInstanceMetadata
41
+ from .types.spanner_instance_admin import CreateInstancePartitionMetadata
42
+ from .types.spanner_instance_admin import CreateInstancePartitionRequest
43
+ from .types.spanner_instance_admin import CreateInstanceRequest
44
+ from .types.spanner_instance_admin import DeleteInstanceConfigRequest
45
+ from .types.spanner_instance_admin import DeleteInstancePartitionRequest
46
+ from .types.spanner_instance_admin import DeleteInstanceRequest
47
+ from .types.spanner_instance_admin import FreeInstanceMetadata
48
+ from .types.spanner_instance_admin import GetInstanceConfigRequest
49
+ from .types.spanner_instance_admin import GetInstancePartitionRequest
50
+ from .types.spanner_instance_admin import GetInstanceRequest
51
+ from .types.spanner_instance_admin import Instance
52
+ from .types.spanner_instance_admin import InstanceConfig
53
+ from .types.spanner_instance_admin import InstancePartition
54
+ from .types.spanner_instance_admin import ListInstanceConfigOperationsRequest
55
+ from .types.spanner_instance_admin import ListInstanceConfigOperationsResponse
56
+ from .types.spanner_instance_admin import ListInstanceConfigsRequest
57
+ from .types.spanner_instance_admin import ListInstanceConfigsResponse
58
+ from .types.spanner_instance_admin import ListInstancePartitionOperationsRequest
59
+ from .types.spanner_instance_admin import ListInstancePartitionOperationsResponse
60
+ from .types.spanner_instance_admin import ListInstancePartitionsRequest
61
+ from .types.spanner_instance_admin import ListInstancePartitionsResponse
62
+ from .types.spanner_instance_admin import ListInstancesRequest
63
+ from .types.spanner_instance_admin import ListInstancesResponse
64
+ from .types.spanner_instance_admin import MoveInstanceMetadata
65
+ from .types.spanner_instance_admin import MoveInstanceRequest
66
+ from .types.spanner_instance_admin import MoveInstanceResponse
67
+ from .types.spanner_instance_admin import ReplicaComputeCapacity
68
+ from .types.spanner_instance_admin import ReplicaInfo
69
+ from .types.spanner_instance_admin import UpdateInstanceConfigMetadata
70
+ from .types.spanner_instance_admin import UpdateInstanceConfigRequest
71
+ from .types.spanner_instance_admin import UpdateInstanceMetadata
72
+ from .types.spanner_instance_admin import UpdateInstancePartitionMetadata
73
+ from .types.spanner_instance_admin import UpdateInstancePartitionRequest
74
+ from .types.spanner_instance_admin import UpdateInstanceRequest
75
+
76
+ if hasattr(api_core, "check_python_version") and hasattr(
77
+ api_core, "check_dependency_versions"
78
+ ): # pragma: NO COVER
79
+ api_core.check_python_version("google.cloud.spanner_admin_instance_v1") # type: ignore
80
+ api_core.check_dependency_versions("google.cloud.spanner_admin_instance_v1") # type: ignore
81
+ else: # pragma: NO COVER
82
+ # An older version of api_core is installed which does not define the
83
+ # functions above. We do equivalent checks manually.
84
+ try:
85
+ import warnings
86
+ import sys
87
+
88
+ _py_version_str = sys.version.split()[0]
89
+ _package_label = "google.cloud.spanner_admin_instance_v1"
90
+ if sys.version_info < (3, 9):
91
+ warnings.warn(
92
+ "You are using a non-supported Python version "
93
+ + f"({_py_version_str}). Google will not post any further "
94
+ + f"updates to {_package_label} supporting this Python version. "
95
+ + "Please upgrade to the latest Python version, or at "
96
+ + f"least to Python 3.9, and then update {_package_label}.",
97
+ FutureWarning,
98
+ )
99
+ if sys.version_info[:2] == (3, 9):
100
+ warnings.warn(
101
+ f"You are using a Python version ({_py_version_str}) "
102
+ + f"which Google will stop supporting in {_package_label} in "
103
+ + "January 2026. Please "
104
+ + "upgrade to the latest Python version, or at "
105
+ + "least to Python 3.10, before then, and "
106
+ + f"then update {_package_label}.",
107
+ FutureWarning,
108
+ )
109
+
110
+ def parse_version_to_tuple(version_string: str):
111
+ """Safely converts a semantic version string to a comparable tuple of integers.
112
+ Example: "4.25.8" -> (4, 25, 8)
113
+ Ignores non-numeric parts and handles common version formats.
114
+ Args:
115
+ version_string: Version string in the format "x.y.z" or "x.y.z<suffix>"
116
+ Returns:
117
+ Tuple of integers for the parsed version string.
118
+ """
119
+ parts = []
120
+ for part in version_string.split("."):
121
+ try:
122
+ parts.append(int(part))
123
+ except ValueError:
124
+ # If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'), stop here.
125
+ # This is a simplification compared to 'packaging.parse_version', but sufficient
126
+ # for comparing strictly numeric semantic versions.
127
+ break
128
+ return tuple(parts)
129
+
130
+ def _get_version(dependency_name):
131
+ try:
132
+ version_string: str = metadata.version(dependency_name)
133
+ parsed_version = parse_version_to_tuple(version_string)
134
+ return (parsed_version, version_string)
135
+ except Exception:
136
+ # Catch exceptions from metadata.version() (e.g., PackageNotFoundError)
137
+ # or errors during parse_version_to_tuple
138
+ return (None, "--")
139
+
140
+ _dependency_package = "google.protobuf"
141
+ _next_supported_version = "4.25.8"
142
+ _next_supported_version_tuple = (4, 25, 8)
143
+ _recommendation = " (we recommend 6.x)"
144
+ (_version_used, _version_used_string) = _get_version(_dependency_package)
145
+ if _version_used and _version_used < _next_supported_version_tuple:
146
+ warnings.warn(
147
+ f"Package {_package_label} depends on "
148
+ + f"{_dependency_package}, currently installed at version "
149
+ + f"{_version_used_string}. Future updates to "
150
+ + f"{_package_label} will require {_dependency_package} at "
151
+ + f"version {_next_supported_version} or higher{_recommendation}."
152
+ + " Please ensure "
153
+ + "that either (a) your Python environment doesn't pin the "
154
+ + f"version of {_dependency_package}, so that updates to "
155
+ + f"{_package_label} can require the higher version, or "
156
+ + "(b) you manually update your Python environment to use at "
157
+ + f"least version {_next_supported_version} of "
158
+ + f"{_dependency_package}.",
159
+ FutureWarning,
160
+ )
161
+ except Exception:
162
+ warnings.warn(
163
+ "Could not determine the version of Python "
164
+ + "currently being used. To continue receiving "
165
+ + "updates for {_package_label}, ensure you are "
166
+ + "using a supported version of Python; see "
167
+ + "https://devguide.python.org/versions/"
168
+ )
169
+
170
+ __all__ = (
171
+ "InstanceAdminAsyncClient",
172
+ "AutoscalingConfig",
173
+ "CreateInstanceConfigMetadata",
174
+ "CreateInstanceConfigRequest",
175
+ "CreateInstanceMetadata",
176
+ "CreateInstancePartitionMetadata",
177
+ "CreateInstancePartitionRequest",
178
+ "CreateInstanceRequest",
179
+ "DeleteInstanceConfigRequest",
180
+ "DeleteInstancePartitionRequest",
181
+ "DeleteInstanceRequest",
182
+ "FreeInstanceMetadata",
183
+ "FulfillmentPeriod",
184
+ "GetInstanceConfigRequest",
185
+ "GetInstancePartitionRequest",
186
+ "GetInstanceRequest",
187
+ "Instance",
188
+ "InstanceAdminClient",
189
+ "InstanceConfig",
190
+ "InstancePartition",
191
+ "ListInstanceConfigOperationsRequest",
192
+ "ListInstanceConfigOperationsResponse",
193
+ "ListInstanceConfigsRequest",
194
+ "ListInstanceConfigsResponse",
195
+ "ListInstancePartitionOperationsRequest",
196
+ "ListInstancePartitionOperationsResponse",
197
+ "ListInstancePartitionsRequest",
198
+ "ListInstancePartitionsResponse",
199
+ "ListInstancesRequest",
200
+ "ListInstancesResponse",
201
+ "MoveInstanceMetadata",
202
+ "MoveInstanceRequest",
203
+ "MoveInstanceResponse",
204
+ "OperationProgress",
205
+ "ReplicaComputeCapacity",
206
+ "ReplicaInfo",
207
+ "ReplicaSelection",
208
+ "UpdateInstanceConfigMetadata",
209
+ "UpdateInstanceConfigRequest",
210
+ "UpdateInstanceMetadata",
211
+ "UpdateInstancePartitionMetadata",
212
+ "UpdateInstancePartitionRequest",
213
+ "UpdateInstanceRequest",
214
+ )
@@ -13,4 +13,4 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- __version__ = "3.60.0" # {x-release-please-version}
16
+ __version__ = "3.62.0" # {x-release-please-version}
@@ -178,6 +178,34 @@ class InstanceAdminClient(metaclass=InstanceAdminClientMeta):
178
178
  _DEFAULT_ENDPOINT_TEMPLATE = "spanner.{UNIVERSE_DOMAIN}"
179
179
  _DEFAULT_UNIVERSE = "googleapis.com"
180
180
 
181
+ @staticmethod
182
+ def _use_client_cert_effective():
183
+ """Returns whether client certificate should be used for mTLS if the
184
+ google-auth version supports should_use_client_cert automatic mTLS enablement.
185
+
186
+ Alternatively, read from the GOOGLE_API_USE_CLIENT_CERTIFICATE env var.
187
+
188
+ Returns:
189
+ bool: whether client certificate should be used for mTLS
190
+ Raises:
191
+ ValueError: (If using a version of google-auth without should_use_client_cert and
192
+ GOOGLE_API_USE_CLIENT_CERTIFICATE is set to an unexpected value.)
193
+ """
194
+ # check if google-auth version supports should_use_client_cert for automatic mTLS enablement
195
+ if hasattr(mtls, "should_use_client_cert"): # pragma: NO COVER
196
+ return mtls.should_use_client_cert()
197
+ else: # pragma: NO COVER
198
+ # if unsupported, fallback to reading from env var
199
+ use_client_cert_str = os.getenv(
200
+ "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
201
+ ).lower()
202
+ if use_client_cert_str not in ("true", "false"):
203
+ raise ValueError(
204
+ "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be"
205
+ " either `true` or `false`"
206
+ )
207
+ return use_client_cert_str == "true"
208
+
181
209
  @classmethod
182
210
  def from_service_account_info(cls, info: dict, *args, **kwargs):
183
211
  """Creates an instance of this client using the provided credentials
@@ -402,12 +430,8 @@ class InstanceAdminClient(metaclass=InstanceAdminClientMeta):
402
430
  )
403
431
  if client_options is None:
404
432
  client_options = client_options_lib.ClientOptions()
405
- use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false")
433
+ use_client_cert = InstanceAdminClient._use_client_cert_effective()
406
434
  use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto")
407
- if use_client_cert not in ("true", "false"):
408
- raise ValueError(
409
- "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
410
- )
411
435
  if use_mtls_endpoint not in ("auto", "never", "always"):
412
436
  raise MutualTLSChannelError(
413
437
  "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
@@ -415,7 +439,7 @@ class InstanceAdminClient(metaclass=InstanceAdminClientMeta):
415
439
 
416
440
  # Figure out the client cert source to use.
417
441
  client_cert_source = None
418
- if use_client_cert == "true":
442
+ if use_client_cert:
419
443
  if client_options.client_cert_source:
420
444
  client_cert_source = client_options.client_cert_source
421
445
  elif mtls.has_default_client_cert_source():
@@ -447,20 +471,14 @@ class InstanceAdminClient(metaclass=InstanceAdminClientMeta):
447
471
  google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT
448
472
  is not any of ["auto", "never", "always"].
449
473
  """
450
- use_client_cert = os.getenv(
451
- "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
452
- ).lower()
474
+ use_client_cert = InstanceAdminClient._use_client_cert_effective()
453
475
  use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower()
454
476
  universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN")
455
- if use_client_cert not in ("true", "false"):
456
- raise ValueError(
457
- "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
458
- )
459
477
  if use_mtls_endpoint not in ("auto", "never", "always"):
460
478
  raise MutualTLSChannelError(
461
479
  "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
462
480
  )
463
- return use_client_cert == "true", use_mtls_endpoint, universe_domain_env
481
+ return use_client_cert, use_mtls_endpoint, universe_domain_env
464
482
 
465
483
  @staticmethod
466
484
  def _get_client_cert_source(provided_cert_source, use_cert_flag):
@@ -233,6 +233,11 @@ def classify_statement(query, args=None):
233
233
  :rtype: ParsedStatement
234
234
  :returns: parsed statement attributes.
235
235
  """
236
+ # Check for RUN PARTITION command to avoid sqlparse processing it.
237
+ # sqlparse fails with "Maximum grouping depth exceeded" on long partition IDs.
238
+ if re.match(r"^\s*RUN\s+PARTITION\s+.+", query, re.IGNORECASE):
239
+ return client_side_statement_parser.parse_stmt(query.strip())
240
+
236
241
  # sqlparse will strip Cloud Spanner comments,
237
242
  # still, special commenting styles, like
238
243
  # PostgreSQL dollar quoted comments are not
@@ -15,6 +15,6 @@
15
15
  import platform
16
16
 
17
17
  PY_VERSION = platform.python_version()
18
- __version__ = "3.60.0"
18
+ __version__ = "3.62.0"
19
19
  VERSION = __version__
20
20
  DEFAULT_USER_AGENT = "gl-dbapi/" + VERSION
@@ -21,6 +21,7 @@ import time
21
21
  import base64
22
22
  import threading
23
23
  import logging
24
+ import uuid
24
25
 
25
26
  from google.protobuf.struct_pb2 import ListValue
26
27
  from google.protobuf.struct_pb2 import Value
@@ -298,6 +299,8 @@ def _make_value_pb(value):
298
299
  return Value(string_value=base64.b64encode(value))
299
300
  if isinstance(value, Interval):
300
301
  return Value(string_value=str(value))
302
+ if isinstance(value, uuid.UUID):
303
+ return Value(string_value=str(value))
301
304
 
302
305
  raise ValueError("Unknown type: %s" % (value,))
303
306
 
@@ -399,6 +402,8 @@ def _get_type_decoder(field_type, field_name, column_info=None):
399
402
  return _parse_numeric
400
403
  elif type_code == TypeCode.JSON:
401
404
  return _parse_json
405
+ elif type_code == TypeCode.UUID:
406
+ return _parse_uuid
402
407
  elif type_code == TypeCode.PROTO:
403
408
  return lambda value_pb: _parse_proto(value_pb, column_info, field_name)
404
409
  elif type_code == TypeCode.ENUM:
@@ -481,6 +486,10 @@ def _parse_json(value_pb):
481
486
  return JsonObject.from_str(value_pb.string_value)
482
487
 
483
488
 
489
+ def _parse_uuid(value_pb):
490
+ return uuid.UUID(value_pb.string_value)
491
+
492
+
484
493
  def _parse_proto(value_pb, column_info, field_name):
485
494
  bytes_value = base64.b64decode(value_pb.string_value)
486
495
  if column_info is not None and column_info.get(field_name) is not None:
@@ -13,4 +13,4 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- __version__ = "3.60.0" # {x-release-please-version}
16
+ __version__ = "3.62.0" # {x-release-please-version}
@@ -33,6 +33,7 @@ DATE = Type(code=TypeCode.DATE)
33
33
  TIMESTAMP = Type(code=TypeCode.TIMESTAMP)
34
34
  NUMERIC = Type(code=TypeCode.NUMERIC)
35
35
  JSON = Type(code=TypeCode.JSON)
36
+ UUID = Type(code=TypeCode.UUID)
36
37
  PG_NUMERIC = Type(code=TypeCode.NUMERIC, type_annotation=TypeAnnotationCode.PG_NUMERIC)
37
38
  PG_JSONB = Type(code=TypeCode.JSON, type_annotation=TypeAnnotationCode.PG_JSONB)
38
39
  PG_OID = Type(code=TypeCode.INT64, type_annotation=TypeAnnotationCode.PG_OID)