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.
- {google_cloud_spanner-3.60.0/google_cloud_spanner.egg-info → google_cloud_spanner-3.62.0}/PKG-INFO +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/__init__.py +104 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/gapic_version.py +1 -1
- {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
- google_cloud_spanner-3.62.0/google/cloud/spanner_admin_instance_v1/__init__.py +214 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/gapic_version.py +1 -1
- {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
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/parse_utils.py +5 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/version.py +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/_helpers.py +9 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/gapic_version.py +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/param_types.py +1 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/client.py +32 -14
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/snapshot.py +31 -46
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/streamed.py +1 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/transaction.py +3 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0/google_cloud_spanner.egg-info}/PKG-INFO +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/setup.py +4 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_session_api.py +13 -0
- {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
- {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
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_v1/test_spanner.py +226 -29
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_parse_utils.py +23 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test__helpers.py +13 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_session.py +4 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_snapshot.py +50 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_transaction.py +1 -0
- google_cloud_spanner-3.60.0/google/cloud/spanner_admin_instance_v1/__init__.py +0 -110
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/LICENSE +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/MANIFEST.in +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/README.rst +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/gapic_metadata.json +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/py.typed +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/services/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/types/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/types/backup.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/types/backup_schedule.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_database_v1/types/common.py +0 -0
- {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
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/gapic_metadata.json +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/py.typed +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/services/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/types/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_admin_instance_v1/types/common.py +0 -0
- {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
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/_helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/batch_dml_executor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/checksum.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/client_side_statement_executor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/client_side_statement_parser.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/connection.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/cursor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/exceptions.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/parsed_statement.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/parser.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/partition_helper.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/transaction_helper.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/types.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_dbapi/utils.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/_opentelemetry_tracing.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/backup.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/batch.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/client.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/data_types.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/database.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/database_sessions_manager.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/gapic_metadata.json +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/instance.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/keyset.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/merged_result_set.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/constants.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_capture.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_exporter.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_interceptor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_tracer.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/metrics/spanner_metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/pool.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/py.typed +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/request_id_header.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/async_client.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/pagers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/grpc.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/grpc_asyncio.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/rest.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/services/spanner/transports/rest_base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/session.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/table.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/database_test.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/interceptors.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/mock_database_admin.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/mock_spanner.py +0 -0
- {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
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/testing/spanner_pb2_grpc.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/change_stream.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/commit_response.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/keys.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/location.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/mutation.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/query_plan.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/result_set.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/spanner.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/transaction.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/types/type.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/SOURCES.txt +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/dependency_links.txt +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/not-zip-safe +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/requires.txt +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google_cloud_spanner.egg-info/top_level.txt +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/setup.cfg +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/_builders.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/_fixtures.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/_helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/mock_server_test_base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_aborted_transaction.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_basics.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_dbapi_autocommit.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_dbapi_isolation_level.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_request_id_header.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/mockserver_tests/test_tags.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/_helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/_sample_data.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/conftest.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_backup_api.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_database_api.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_dbapi.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_instance_api.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_metrics.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_observability_options.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_streaming_chunking.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/test_table_api.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/testdata/descriptors.pb +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/testdata/singer.proto +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/testdata/singer_pb2.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/clear_streaming.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/populate_streaming.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/scrub_instances.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/system/utils/streaming_utils.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_admin_database_v1/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_admin_instance_v1/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/gapic/spanner_v1/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test__helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_batch_dml_executor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_checksum.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_client_side_statement_executor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_connect.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_connection.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_cursor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_globals.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_parser.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_transaction_helper.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_types.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/spanner_dbapi/test_utils.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/streaming-read-acceptance-test.json +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test__opentelemetry_tracing.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_atomic_counter.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_backup.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_batch.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_client.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_database.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_database_session_manager.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_datatypes.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_instance.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_keyset.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_merged_result_set.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_capture.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_exporter.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_interceptor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_tracer.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_packaging.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_param_types.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_pool.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_spanner.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_spanner_metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_streamed.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/test_table.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/testdata/singer.proto +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/tests/unit/testdata/singer_pb2.py +0 -0
|
@@ -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",
|
|
@@ -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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
+
)
|
|
@@ -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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
{google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/_helpers.py
RENAMED
|
@@ -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:
|
{google_cloud_spanner-3.60.0 → google_cloud_spanner-3.62.0}/google/cloud/spanner_v1/param_types.py
RENAMED
|
@@ -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)
|