google-cloud-spanner 3.59.0__tar.gz → 3.61.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 (219) hide show
  1. {google_cloud_spanner-3.59.0/google_cloud_spanner.egg-info → google_cloud_spanner-3.61.0}/PKG-INFO +8 -8
  2. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/__init__.py +104 -0
  3. google_cloud_spanner-3.61.0/google/cloud/spanner_admin_database_v1/gapic_version.py +16 -0
  4. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/client.py +32 -14
  5. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/base.py +3 -2
  6. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc.py +6 -3
  7. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc_asyncio.py +6 -3
  8. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/rest.py +3 -2
  9. google_cloud_spanner-3.61.0/google/cloud/spanner_admin_instance_v1/__init__.py +214 -0
  10. google_cloud_spanner-3.61.0/google/cloud/spanner_admin_instance_v1/gapic_version.py +16 -0
  11. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/client.py +32 -14
  12. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/base.py +3 -2
  13. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc.py +6 -3
  14. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc_asyncio.py +6 -3
  15. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/rest.py +3 -2
  16. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/types/spanner_instance_admin.py +11 -0
  17. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/connection.py +6 -0
  18. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/version.py +2 -2
  19. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/_helpers.py +49 -4
  20. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/_opentelemetry_tracing.py +16 -20
  21. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/client.py +38 -5
  22. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/database.py +20 -1
  23. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/database_sessions_manager.py +3 -2
  24. google_cloud_spanner-3.61.0/google/cloud/spanner_v1/gapic_version.py +16 -0
  25. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/instance.py +2 -0
  26. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/constants.py +0 -1
  27. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/spanner_metrics_tracer_factory.py +3 -38
  28. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/request_id_header.py +1 -1
  29. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/async_client.py +6 -4
  30. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/client.py +38 -18
  31. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/base.py +3 -2
  32. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/grpc.py +6 -3
  33. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/grpc_asyncio.py +6 -3
  34. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/rest.py +3 -2
  35. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/session.py +44 -42
  36. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/snapshot.py +6 -2
  37. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/database_test.py +12 -0
  38. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/transaction.py +6 -2
  39. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/__init__.py +18 -0
  40. google_cloud_spanner-3.61.0/google/cloud/spanner_v1/types/location.py +677 -0
  41. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/mutation.py +94 -0
  42. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/query_plan.py +53 -0
  43. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/result_set.py +14 -0
  44. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/spanner.py +36 -7
  45. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/transaction.py +5 -4
  46. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0/google_cloud_spanner.egg-info}/PKG-INFO +8 -8
  47. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/SOURCES.txt +2 -0
  48. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/requires.txt +6 -8
  49. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/setup.py +13 -11
  50. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/_helpers.py +6 -0
  51. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/conftest.py +18 -2
  52. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/test_backup_api.py +6 -0
  53. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/test_database_api.py +15 -2
  54. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/test_dbapi.py +7 -1
  55. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/test_instance_api.py +1 -0
  56. google_cloud_spanner-3.61.0/tests/system/test_metrics.py +92 -0
  57. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/test_session_api.py +8 -4
  58. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py +231 -29
  59. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py +231 -29
  60. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_v1/test_spanner.py +232 -29
  61. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test__helpers.py +47 -1
  62. google_cloud_spanner-3.61.0/tests/unit/test__opentelemetry_tracing.py +222 -0
  63. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_batch.py +117 -23
  64. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_client.py +34 -3
  65. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_database.py +4 -1
  66. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_pool.py +208 -41
  67. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_session.py +100 -75
  68. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_snapshot.py +350 -113
  69. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_spanner.py +48 -68
  70. google_cloud_spanner-3.61.0/tests/unit/test_spanner_metrics_tracer_factory.py +47 -0
  71. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_transaction.py +218 -47
  72. google_cloud_spanner-3.59.0/google/cloud/spanner_admin_database_v1/gapic_version.py +0 -16
  73. google_cloud_spanner-3.59.0/google/cloud/spanner_admin_instance_v1/__init__.py +0 -110
  74. google_cloud_spanner-3.59.0/google/cloud/spanner_admin_instance_v1/gapic_version.py +0 -16
  75. google_cloud_spanner-3.59.0/google/cloud/spanner_v1/gapic_version.py +0 -16
  76. google_cloud_spanner-3.59.0/tests/unit/test__opentelemetry_tracing.py +0 -233
  77. google_cloud_spanner-3.59.0/tests/unit/test_spanner_metrics_tracer_factory.py +0 -97
  78. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/LICENSE +0 -0
  79. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/MANIFEST.in +0 -0
  80. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/README.rst +0 -0
  81. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner.py +0 -0
  82. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/gapic_metadata.json +0 -0
  83. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/py.typed +0 -0
  84. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/__init__.py +0 -0
  85. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/__init__.py +0 -0
  86. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/async_client.py +0 -0
  87. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/pagers.py +0 -0
  88. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/__init__.py +0 -0
  89. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/rest_base.py +0 -0
  90. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/__init__.py +0 -0
  91. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/backup.py +0 -0
  92. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/backup_schedule.py +0 -0
  93. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/common.py +0 -0
  94. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/spanner_database_admin.py +0 -0
  95. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/gapic_metadata.json +0 -0
  96. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/py.typed +0 -0
  97. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/__init__.py +0 -0
  98. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/__init__.py +0 -0
  99. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/async_client.py +0 -0
  100. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/pagers.py +0 -0
  101. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/__init__.py +0 -0
  102. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/rest_base.py +0 -0
  103. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/types/__init__.py +0 -0
  104. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/types/common.py +0 -0
  105. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/__init__.py +0 -0
  106. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/_helpers.py +0 -0
  107. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/batch_dml_executor.py +0 -0
  108. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/checksum.py +0 -0
  109. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/client_side_statement_executor.py +0 -0
  110. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/client_side_statement_parser.py +0 -0
  111. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/cursor.py +0 -0
  112. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/exceptions.py +0 -0
  113. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/parse_utils.py +0 -0
  114. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/parsed_statement.py +0 -0
  115. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/parser.py +0 -0
  116. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/partition_helper.py +0 -0
  117. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/transaction_helper.py +0 -0
  118. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/types.py +0 -0
  119. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/utils.py +0 -0
  120. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/__init__.py +0 -0
  121. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/backup.py +0 -0
  122. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/batch.py +0 -0
  123. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/data_types.py +0 -0
  124. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/gapic_metadata.json +0 -0
  125. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/keyset.py +0 -0
  126. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/merged_result_set.py +0 -0
  127. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_capture.py +0 -0
  128. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_exporter.py +0 -0
  129. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_interceptor.py +0 -0
  130. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_tracer.py +0 -0
  131. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_tracer_factory.py +0 -0
  132. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/param_types.py +0 -0
  133. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/pool.py +0 -0
  134. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/py.typed +0 -0
  135. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/__init__.py +0 -0
  136. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/__init__.py +0 -0
  137. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/pagers.py +0 -0
  138. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/__init__.py +0 -0
  139. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/rest_base.py +0 -0
  140. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/streamed.py +0 -0
  141. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/table.py +0 -0
  142. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/__init__.py +0 -0
  143. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/interceptors.py +0 -0
  144. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/mock_database_admin.py +0 -0
  145. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/mock_spanner.py +0 -0
  146. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/spanner_database_admin_pb2_grpc.py +0 -0
  147. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/spanner_pb2_grpc.py +0 -0
  148. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/change_stream.py +0 -0
  149. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/commit_response.py +0 -0
  150. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/keys.py +0 -0
  151. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/type.py +0 -0
  152. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/dependency_links.txt +0 -0
  153. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/not-zip-safe +0 -0
  154. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/top_level.txt +0 -0
  155. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/setup.cfg +0 -0
  156. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/__init__.py +0 -0
  157. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/_builders.py +0 -0
  158. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/_fixtures.py +0 -0
  159. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/_helpers.py +0 -0
  160. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/__init__.py +0 -0
  161. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/mock_server_test_base.py +0 -0
  162. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_aborted_transaction.py +0 -0
  163. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_basics.py +0 -0
  164. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_dbapi_autocommit.py +0 -0
  165. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_dbapi_isolation_level.py +0 -0
  166. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_request_id_header.py +0 -0
  167. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_tags.py +0 -0
  168. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/__init__.py +0 -0
  169. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/_sample_data.py +0 -0
  170. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/test_observability_options.py +0 -0
  171. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/test_streaming_chunking.py +0 -0
  172. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/test_table_api.py +0 -0
  173. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/testdata/descriptors.pb +0 -0
  174. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/testdata/singer.proto +0 -0
  175. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/testdata/singer_pb2.py +0 -0
  176. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/utils/__init__.py +0 -0
  177. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/utils/clear_streaming.py +0 -0
  178. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/utils/populate_streaming.py +0 -0
  179. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/utils/scrub_instances.py +0 -0
  180. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/system/utils/streaming_utils.py +0 -0
  181. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/__init__.py +0 -0
  182. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/__init__.py +0 -0
  183. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_admin_database_v1/__init__.py +0 -0
  184. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_admin_instance_v1/__init__.py +0 -0
  185. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_v1/__init__.py +0 -0
  186. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/__init__.py +0 -0
  187. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test__helpers.py +0 -0
  188. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_batch_dml_executor.py +0 -0
  189. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_checksum.py +0 -0
  190. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_client_side_statement_executor.py +0 -0
  191. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_connect.py +0 -0
  192. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_connection.py +0 -0
  193. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_cursor.py +0 -0
  194. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_globals.py +0 -0
  195. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_parse_utils.py +0 -0
  196. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_parser.py +0 -0
  197. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_transaction_helper.py +0 -0
  198. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_types.py +0 -0
  199. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_utils.py +0 -0
  200. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/streaming-read-acceptance-test.json +0 -0
  201. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_atomic_counter.py +0 -0
  202. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_backup.py +0 -0
  203. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_database_session_manager.py +0 -0
  204. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_datatypes.py +0 -0
  205. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_instance.py +0 -0
  206. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_keyset.py +0 -0
  207. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_merged_result_set.py +0 -0
  208. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics.py +0 -0
  209. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_capture.py +0 -0
  210. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_exporter.py +0 -0
  211. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_interceptor.py +0 -0
  212. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_tracer.py +0 -0
  213. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_tracer_factory.py +0 -0
  214. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_packaging.py +0 -0
  215. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_param_types.py +0 -0
  216. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_streamed.py +0 -0
  217. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/test_table.py +0 -0
  218. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.0}/tests/unit/testdata/singer.proto +0 -0
  219. {google_cloud_spanner-3.59.0 → google_cloud_spanner-3.61.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.59.0
3
+ Version: 3.61.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
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.9
16
16
  Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Classifier: Operating System :: OS Independent
20
21
  Classifier: Topic :: Internet
21
22
  Requires-Python: >=3.9
@@ -28,13 +29,12 @@ Requires-Dist: sqlparse>=0.4.4
28
29
  Requires-Dist: proto-plus<2.0.0,>=1.22.2; python_version >= "3.11"
29
30
  Requires-Dist: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<7.0.0,>=3.20.2
30
31
  Requires-Dist: grpc-interceptor>=0.15.4
31
- Provides-Extra: tracing
32
- Requires-Dist: opentelemetry-api>=1.22.0; extra == "tracing"
33
- Requires-Dist: opentelemetry-sdk>=1.22.0; extra == "tracing"
34
- Requires-Dist: opentelemetry-semantic-conventions>=0.43b0; extra == "tracing"
35
- Requires-Dist: opentelemetry-resourcedetector-gcp>=1.8.0a0; extra == "tracing"
36
- Requires-Dist: google-cloud-monitoring>=2.16.0; extra == "tracing"
37
- Requires-Dist: mmh3>=4.1.0; extra == "tracing"
32
+ Requires-Dist: opentelemetry-api>=1.22.0
33
+ Requires-Dist: opentelemetry-sdk>=1.22.0
34
+ Requires-Dist: opentelemetry-semantic-conventions>=0.43b0
35
+ Requires-Dist: opentelemetry-resourcedetector-gcp>=1.8.0a0
36
+ Requires-Dist: google-cloud-monitoring>=2.16.0
37
+ Requires-Dist: mmh3>=4.1.0
38
38
  Provides-Extra: libcst
39
39
  Requires-Dist: libcst>=0.2.5; extra == "libcst"
40
40
  Dynamic: author
@@ -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",
@@ -0,0 +1,16 @@
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
+ __version__ = "3.61.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):
@@ -81,9 +81,10 @@ class DatabaseAdminTransport(abc.ABC):
81
81
  credentials identify the application to the service; if none
82
82
  are specified, the client will attempt to ascertain the
83
83
  credentials from the environment.
84
- credentials_file (Optional[str]): A file with credentials that can
84
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
85
85
  be loaded with :func:`google.auth.load_credentials_from_file`.
86
- This argument is mutually exclusive with credentials.
86
+ This argument is mutually exclusive with credentials. This argument will be
87
+ removed in the next major version of this library.
87
88
  scopes (Optional[Sequence[str]]): A list of scopes.
88
89
  quota_project_id (Optional[str]): An optional project to use for billing
89
90
  and quota.
@@ -169,9 +169,10 @@ class DatabaseAdminGrpcTransport(DatabaseAdminTransport):
169
169
  are specified, the client will attempt to ascertain the
170
170
  credentials from the environment.
171
171
  This argument is ignored if a ``channel`` instance is provided.
172
- credentials_file (Optional[str]): A file with credentials that can
172
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
173
173
  be loaded with :func:`google.auth.load_credentials_from_file`.
174
174
  This argument is ignored if a ``channel`` instance is provided.
175
+ This argument will be removed in the next major version of this library.
175
176
  scopes (Optional(Sequence[str])): A list of scopes. This argument is
176
177
  ignored if a ``channel`` instance is provided.
177
178
  channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]):
@@ -276,6 +277,7 @@ class DatabaseAdminGrpcTransport(DatabaseAdminTransport):
276
277
  options=[
277
278
  ("grpc.max_send_message_length", -1),
278
279
  ("grpc.max_receive_message_length", -1),
280
+ ("grpc.keepalive_time_ms", 120000),
279
281
  ],
280
282
  )
281
283
 
@@ -305,9 +307,10 @@ class DatabaseAdminGrpcTransport(DatabaseAdminTransport):
305
307
  credentials identify this application to the service. If
306
308
  none are specified, the client will attempt to ascertain
307
309
  the credentials from the environment.
308
- credentials_file (Optional[str]): A file with credentials that can
310
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
309
311
  be loaded with :func:`google.auth.load_credentials_from_file`.
310
- This argument is mutually exclusive with credentials.
312
+ This argument is mutually exclusive with credentials. This argument will be
313
+ removed in the next major version of this library.
311
314
  scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
312
315
  service. These are only used when credentials are not specified and
313
316
  are passed to :func:`google.auth.default`.
@@ -166,8 +166,9 @@ class DatabaseAdminGrpcAsyncIOTransport(DatabaseAdminTransport):
166
166
  credentials identify this application to the service. If
167
167
  none are specified, the client will attempt to ascertain
168
168
  the credentials from the environment.
169
- credentials_file (Optional[str]): A file with credentials that can
170
- be loaded with :func:`google.auth.load_credentials_from_file`.
169
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
170
+ be loaded with :func:`google.auth.load_credentials_from_file`. This argument will be
171
+ removed in the next major version of this library.
171
172
  scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
172
173
  service. These are only used when credentials are not specified and
173
174
  are passed to :func:`google.auth.default`.
@@ -218,9 +219,10 @@ class DatabaseAdminGrpcAsyncIOTransport(DatabaseAdminTransport):
218
219
  are specified, the client will attempt to ascertain the
219
220
  credentials from the environment.
220
221
  This argument is ignored if a ``channel`` instance is provided.
221
- credentials_file (Optional[str]): A file with credentials that can
222
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
222
223
  be loaded with :func:`google.auth.load_credentials_from_file`.
223
224
  This argument is ignored if a ``channel`` instance is provided.
225
+ This argument will be removed in the next major version of this library.
224
226
  scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
225
227
  service. These are only used when credentials are not specified and
226
228
  are passed to :func:`google.auth.default`.
@@ -325,6 +327,7 @@ class DatabaseAdminGrpcAsyncIOTransport(DatabaseAdminTransport):
325
327
  options=[
326
328
  ("grpc.max_send_message_length", -1),
327
329
  ("grpc.max_receive_message_length", -1),
330
+ ("grpc.keepalive_time_ms", 120000),
328
331
  ],
329
332
  )
330
333
 
@@ -1622,9 +1622,10 @@ class DatabaseAdminRestTransport(_BaseDatabaseAdminRestTransport):
1622
1622
  are specified, the client will attempt to ascertain the
1623
1623
  credentials from the environment.
1624
1624
 
1625
- credentials_file (Optional[str]): A file with credentials that can
1625
+ credentials_file (Optional[str]): Deprecated. A file with credentials that can
1626
1626
  be loaded with :func:`google.auth.load_credentials_from_file`.
1627
- This argument is ignored if ``channel`` is provided.
1627
+ This argument is ignored if ``channel`` is provided. This argument will be
1628
+ removed in the next major version of this library.
1628
1629
  scopes (Optional(Sequence[str])): A list of scopes. This argument is
1629
1630
  ignored if ``channel`` is provided.
1630
1631
  client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client
@@ -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
+ )
@@ -0,0 +1,16 @@
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
+ __version__ = "3.61.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):