google-cloud-spanner 3.67.0__tar.gz → 3.68.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.67.0/google_cloud_spanner.egg-info → google_cloud_spanner-3.68.0}/PKG-INFO +8 -1
- {google_cloud_spanner-3.67.0/google/cloud/spanner_admin_instance → google_cloud_spanner-3.68.0/google/cloud/spanner}/gapic_version.py +1 -1
- {google_cloud_spanner-3.67.0/google/cloud/spanner_admin_database_v1 → google_cloud_spanner-3.68.0/google/cloud/spanner_admin_database}/gapic_version.py +1 -1
- {google_cloud_spanner-3.67.0/google/cloud/spanner_admin_database → google_cloud_spanner-3.68.0/google/cloud/spanner_admin_database_v1}/gapic_version.py +1 -1
- {google_cloud_spanner-3.67.0/google/cloud/spanner → google_cloud_spanner-3.68.0/google/cloud/spanner_admin_instance}/gapic_version.py +1 -1
- google_cloud_spanner-3.68.0/google/cloud/spanner_admin_instance_v1/gapic_version.py +16 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/partition_helper.py +1 -20
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/version.py +1 -1
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/streamed.py +33 -10
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_helpers.py +88 -47
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/data_types.py +6 -2
- google_cloud_spanner-3.68.0/google/cloud/spanner_v1/gapic_version.py +16 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/streamed.py +31 -12
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0/google_cloud_spanner.egg-info}/PKG-INFO +8 -1
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google_cloud_spanner.egg-info/requires.txt +8 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/setup.py +11 -1
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/test_dbapi_partition_query.py +1 -2
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/_async/test_database_api.py +4 -1
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/conftest.py +5 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_client.py +3 -1
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_client_extra.py +24 -8
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_session.py +17 -6
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/conftest.py +18 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/gapic/conftest.py +8 -4
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_partition_helper.py +2 -3
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test__helpers.py +136 -5
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_client.py +3 -1
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_metrics.py +3 -4
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_session.py +19 -4
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_spanner.py +47 -187
- google_cloud_spanner-3.67.0/google/cloud/spanner_admin_instance_v1/gapic_version.py +0 -16
- google_cloud_spanner-3.67.0/google/cloud/spanner_v1/gapic_version.py +0 -16
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/LICENSE +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/MANIFEST.in +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/README.rst +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/aio/_cross_sync/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/aio/_cross_sync/_decorators.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/aio/_cross_sync/_mapping_meta.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/aio/_cross_sync/cross_sync.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner/py.typed +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database/py.typed +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/gapic_metadata.json +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/py.typed +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/async_client.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/client.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/pagers.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/base.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc_asyncio.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/rest.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/rest_base.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/types/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/types/backup.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/types/backup_schedule.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/types/common.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_database_v1/types/spanner_database_admin.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance/py.typed +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/gapic_metadata.json +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/py.typed +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/async_client.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/client.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/pagers.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/base.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc_asyncio.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/rest.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/rest_base.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/types/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/types/common.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_admin_instance_v1/types/spanner_instance_admin.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/_helpers.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/batch_dml_executor.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/checksum.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/client_side_statement_executor.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/client_side_statement_parser.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/connection.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/cursor.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/exceptions.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/parse_utils.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/parsed_statement.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/parser.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/transaction_helper.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/types.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_dbapi/utils.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/_helpers.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/batch.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/client.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/database.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/database_sessions_manager.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/instance.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/pool.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/session.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/snapshot.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/testing/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/testing/database_test.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/testing/interceptors.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_async/transaction.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_opentelemetry_tracing.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/backup.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/batch.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/client.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/database.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/database_sessions_manager.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/exceptions.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/gapic_metadata.json +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/instance.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/keyset.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/merged_result_set.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/metrics/constants.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/metrics/metrics_capture.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/metrics/metrics_exporter.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/metrics/metrics_interceptor.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/metrics/metrics_tracer.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/metrics/metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/metrics/spanner_metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/param_types.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/pool.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/py.typed +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/request_id_header.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/async_client.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/client.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/pagers.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/transports/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/transports/base.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/transports/grpc.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/transports/grpc_asyncio.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/transports/rest.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/services/spanner/transports/rest_base.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/session.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/snapshot.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/snapshot_helpers.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/table.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/testing/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/testing/database_test.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/testing/interceptors.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/testing/mock_database_admin.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/testing/mock_spanner.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/testing/spanner_database_admin_pb2_grpc.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/testing/spanner_pb2_grpc.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/transaction.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/change_stream.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/commit_response.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/keys.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/location.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/mutation.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/query_plan.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/result_set.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/spanner.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/transaction.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/types/type.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google_cloud_spanner.egg-info/SOURCES.txt +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google_cloud_spanner.egg-info/dependency_links.txt +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google_cloud_spanner.egg-info/not-zip-safe +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google_cloud_spanner.egg-info/top_level.txt +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/setup.cfg +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/_builders.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/_fixtures.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/_helpers.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/mock_server_test_base.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/test_aborted_transaction.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/test_basics.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/test_dbapi_autocommit.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/test_dbapi_inline_begin.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/test_dbapi_isolation_level.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/test_request_id_header.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/mockserver_tests/test_tags.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/_async/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/_async/conftest.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/_async/pytest.ini +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/_helpers.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/_sample_data.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/test_backup_api.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/test_database_api.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/test_dbapi.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/test_instance_api.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/test_metrics.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/test_observability_options.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/test_session_api.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/test_streaming_chunking.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/test_table_api.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/testdata/descriptors.pb +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/testdata/singer.proto +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/testdata/singer_pb2.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/utils/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/utils/clear_streaming.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/utils/populate_streaming.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/utils/scrub_instances.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/utils/streaming_utils.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_batch.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_database.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_database_extra.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_helpers_extra.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_instance_extra.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_pool.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_sessions_manager_extra.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_snapshot.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_streamed.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_streamed_extra.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_transaction.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_transaction_extra.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/gapic/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/gapic/spanner_admin_database_v1/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/gapic/spanner_admin_instance_v1/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/gapic/spanner_v1/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/gapic/spanner_v1/test_spanner.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/__init__.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test__helpers.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_batch_dml_executor.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_checksum.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_client_side_statement_executor.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_connect.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_connection.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_cursor.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_globals.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_parse_utils.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_parser.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_transaction_helper.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_types.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/spanner_dbapi/test_utils.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/streaming-read-acceptance-test.json +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test__opentelemetry_tracing.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_atomic_counter.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_backup.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_batch.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_client_context.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_database.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_database_session_manager.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_datatypes.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_decorators_extra.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_exceptions.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_instance.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_keyset.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_merged_result_set.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_metrics_capture.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_metrics_concurrency.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_metrics_exporter.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_metrics_interceptor.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_metrics_tracer.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_packaging.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_param_types.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_pool.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_snapshot.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_spanner_metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_streamed.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_table.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/test_transaction.py +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/testdata/singer.proto +0 -0
- {google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/testdata/singer_pb2.py +0 -0
{google_cloud_spanner-3.67.0/google_cloud_spanner.egg-info → google_cloud_spanner-3.68.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: google-cloud-spanner
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.68.0
|
|
4
4
|
Summary: Google Cloud Spanner API client library
|
|
5
5
|
Home-page: https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-spanner
|
|
6
6
|
Author: Google LLC
|
|
@@ -40,6 +40,13 @@ Requires-Dist: google-cloud-monitoring>=2.16.0
|
|
|
40
40
|
Requires-Dist: mmh3>=4.1.0
|
|
41
41
|
Provides-Extra: libcst
|
|
42
42
|
Requires-Dist: libcst>=0.2.5; extra == "libcst"
|
|
43
|
+
Provides-Extra: test
|
|
44
|
+
Requires-Dist: pytest; extra == "test"
|
|
45
|
+
Requires-Dist: mock; extra == "test"
|
|
46
|
+
Requires-Dist: asyncmock; extra == "test"
|
|
47
|
+
Requires-Dist: pytest-cov; extra == "test"
|
|
48
|
+
Requires-Dist: pytest-asyncio; extra == "test"
|
|
49
|
+
Requires-Dist: pytest-xdist; extra == "test"
|
|
43
50
|
Dynamic: author
|
|
44
51
|
Dynamic: author-email
|
|
45
52
|
Dynamic: classifier
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright 2026 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.68.0" # {x-release-please-version}
|
|
@@ -90,23 +90,6 @@ def _deserialize_value(val: Any) -> Any:
|
|
|
90
90
|
return val
|
|
91
91
|
|
|
92
92
|
|
|
93
|
-
def _unpack_value_pb(value):
|
|
94
|
-
which = value.WhichOneof("kind")
|
|
95
|
-
if which == "null_value":
|
|
96
|
-
return None
|
|
97
|
-
elif which == "number_value":
|
|
98
|
-
return value.number_value
|
|
99
|
-
elif which == "string_value":
|
|
100
|
-
return value.string_value
|
|
101
|
-
elif which == "bool_value":
|
|
102
|
-
return value.bool_value
|
|
103
|
-
elif which == "struct_value":
|
|
104
|
-
return {k: _unpack_value_pb(v) for k, v in value.struct_value.fields.items()}
|
|
105
|
-
elif which == "list_value":
|
|
106
|
-
return [_unpack_value_pb(v) for v in value.list_value.values]
|
|
107
|
-
return None
|
|
108
|
-
|
|
109
|
-
|
|
110
93
|
def decode_from_string(encoded_partition_id):
|
|
111
94
|
gzip_bytes = base64.b64decode(bytes(encoded_partition_id, "utf-8"))
|
|
112
95
|
partition_id_bytes = gzip.decompress(gzip_bytes)
|
|
@@ -124,9 +107,7 @@ def decode_from_string(encoded_partition_id):
|
|
|
124
107
|
if "query" in partition_result and "params" in partition_result["query"]:
|
|
125
108
|
params_pb = partition_result["query"]["params"]
|
|
126
109
|
if params_pb:
|
|
127
|
-
partition_result["query"]["params"] =
|
|
128
|
-
k: _unpack_value_pb(v) for k, v in params_pb.fields.items()
|
|
129
|
-
}
|
|
110
|
+
partition_result["query"]["params"] = MessageToDict(params_pb)
|
|
130
111
|
|
|
131
112
|
return PartitionId(btid, partition_result)
|
|
132
113
|
|
|
@@ -129,16 +129,39 @@ class StreamedResultSet(object):
|
|
|
129
129
|
decoders = self._decoders
|
|
130
130
|
width = len(self.fields)
|
|
131
131
|
index = len(self._current_row)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
index
|
|
132
|
+
current_row = self._current_row
|
|
133
|
+
rows = self._rows
|
|
134
|
+
|
|
135
|
+
current_row_append = current_row.append
|
|
136
|
+
rows_append = rows.append
|
|
137
|
+
|
|
138
|
+
if self._lazy_decode:
|
|
139
|
+
for value in values:
|
|
140
|
+
current_row_append(value)
|
|
141
|
+
index += 1
|
|
142
|
+
if index == width:
|
|
143
|
+
rows_append(current_row)
|
|
144
|
+
current_row = []
|
|
145
|
+
current_row_append = current_row.append
|
|
146
|
+
index = 0
|
|
147
|
+
else:
|
|
148
|
+
for value in values:
|
|
149
|
+
# Note: We manually check value.HasField("null_value") here instead of
|
|
150
|
+
# wrapping every decoder in _parse_nullable to avoid the overhead of
|
|
151
|
+
# an extra Python function call layer for every cell value decoded in this loop.
|
|
152
|
+
# If the nullable check logic is updated in _parse_nullable, update this check.
|
|
153
|
+
if value.HasField("null_value"):
|
|
154
|
+
current_row_append(None)
|
|
155
|
+
else:
|
|
156
|
+
current_row_append(decoders[index](value))
|
|
157
|
+
index += 1
|
|
158
|
+
if index == width:
|
|
159
|
+
rows_append(current_row)
|
|
160
|
+
current_row = []
|
|
161
|
+
current_row_append = current_row.append
|
|
162
|
+
index = 0
|
|
163
|
+
|
|
164
|
+
self._current_row = current_row
|
|
142
165
|
|
|
143
166
|
@CrossSync.convert
|
|
144
167
|
async def _consume_next(self):
|
{google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/_helpers.py
RENAMED
|
@@ -19,6 +19,7 @@ import datetime
|
|
|
19
19
|
import decimal
|
|
20
20
|
import logging
|
|
21
21
|
import math
|
|
22
|
+
import operator
|
|
22
23
|
import threading
|
|
23
24
|
import time
|
|
24
25
|
import uuid
|
|
@@ -26,7 +27,6 @@ from contextlib import contextmanager
|
|
|
26
27
|
|
|
27
28
|
from google.api_core import datetime_helpers
|
|
28
29
|
from google.api_core.exceptions import Aborted
|
|
29
|
-
from google.cloud._helpers import _date_from_iso8601_date
|
|
30
30
|
from google.protobuf.internal.enum_type_wrapper import EnumTypeWrapper
|
|
31
31
|
from google.protobuf.message import DecodeError, Message
|
|
32
32
|
from google.protobuf.struct_pb2 import ListValue, Value
|
|
@@ -465,6 +465,12 @@ def _parse_value_pb(value_pb, field_type, field_name, column_info=None):
|
|
|
465
465
|
return _parse_nullable(value_pb, decoder)
|
|
466
466
|
|
|
467
467
|
|
|
468
|
+
_date_fromisoformat = datetime.date.fromisoformat
|
|
469
|
+
_Decimal = decimal.Decimal
|
|
470
|
+
_json_from_str = JsonObject.from_str
|
|
471
|
+
_uuid_UUID = uuid.UUID
|
|
472
|
+
|
|
473
|
+
|
|
468
474
|
def _get_type_decoder(field_type, field_name, column_info=None):
|
|
469
475
|
"""Returns a function that converts a Value protobuf to cell data.
|
|
470
476
|
|
|
@@ -489,28 +495,30 @@ def _get_type_decoder(field_type, field_name, column_info=None):
|
|
|
489
495
|
"""
|
|
490
496
|
|
|
491
497
|
type_code = field_type.code
|
|
498
|
+
# Note: STRING and BOOL use operator.attrgetter because direct attribute extraction
|
|
499
|
+
# is faster in Python. Other types require type transformation, so they use lambdas.
|
|
492
500
|
if type_code == TypeCode.STRING:
|
|
493
|
-
return
|
|
501
|
+
return operator.attrgetter("string_value")
|
|
494
502
|
elif type_code == TypeCode.BYTES:
|
|
495
|
-
return
|
|
503
|
+
return lambda value_pb: value_pb.string_value.encode("utf8")
|
|
496
504
|
elif type_code == TypeCode.BOOL:
|
|
497
|
-
return
|
|
505
|
+
return operator.attrgetter("bool_value")
|
|
498
506
|
elif type_code == TypeCode.INT64:
|
|
499
|
-
return
|
|
507
|
+
return lambda value_pb: int(value_pb.string_value)
|
|
500
508
|
elif type_code == TypeCode.FLOAT64:
|
|
501
509
|
return _parse_float
|
|
502
510
|
elif type_code == TypeCode.FLOAT32:
|
|
503
511
|
return _parse_float
|
|
504
512
|
elif type_code == TypeCode.DATE:
|
|
505
|
-
return
|
|
513
|
+
return lambda value_pb: _date_fromisoformat(value_pb.string_value)
|
|
506
514
|
elif type_code == TypeCode.TIMESTAMP:
|
|
507
515
|
return _parse_timestamp
|
|
508
516
|
elif type_code == TypeCode.NUMERIC:
|
|
509
|
-
return
|
|
517
|
+
return lambda value_pb: _Decimal(value_pb.string_value)
|
|
510
518
|
elif type_code == TypeCode.JSON:
|
|
511
|
-
return
|
|
519
|
+
return lambda value_pb: _json_from_str(value_pb.string_value)
|
|
512
520
|
elif type_code == TypeCode.UUID:
|
|
513
|
-
return
|
|
521
|
+
return lambda value_pb: _uuid_UUID(value_pb.string_value)
|
|
514
522
|
elif type_code == TypeCode.PROTO:
|
|
515
523
|
return lambda value_pb: _parse_proto(value_pb, column_info, field_name)
|
|
516
524
|
elif type_code == TypeCode.ENUM:
|
|
@@ -553,48 +561,81 @@ def _parse_list_value_pbs(rows, row_type):
|
|
|
553
561
|
return result
|
|
554
562
|
|
|
555
563
|
|
|
556
|
-
def _parse_string(value_pb) -> str:
|
|
557
|
-
return value_pb.string_value
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
def _parse_bytes(value_pb):
|
|
561
|
-
return value_pb.string_value.encode("utf8")
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
def _parse_bool(value_pb) -> bool:
|
|
565
|
-
return value_pb.bool_value
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
def _parse_int64(value_pb) -> int:
|
|
569
|
-
return int(value_pb.string_value)
|
|
570
|
-
|
|
571
|
-
|
|
572
564
|
def _parse_float(value_pb) -> float:
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
565
|
+
# Note: Storing val = value_pb.string_value and doing a truthiness check is faster
|
|
566
|
+
# than calling value_pb.HasField("string_value") because it avoids the C-extension
|
|
567
|
+
# method lookup/call overhead and accesses the attribute only once.
|
|
568
|
+
val = value_pb.string_value
|
|
569
|
+
return float(val) if val else value_pb.number_value
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
_POWERS_OF_10 = (
|
|
573
|
+
1,
|
|
574
|
+
10,
|
|
575
|
+
100,
|
|
576
|
+
1000,
|
|
577
|
+
10000,
|
|
578
|
+
100000,
|
|
579
|
+
1000000,
|
|
580
|
+
10000000,
|
|
581
|
+
100000000,
|
|
582
|
+
1000000000,
|
|
583
|
+
)
|
|
581
584
|
|
|
582
585
|
|
|
583
586
|
def _parse_timestamp(value_pb):
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
587
|
+
val = value_pb.string_value
|
|
588
|
+
try:
|
|
589
|
+
if len(val) < 20 or val[10] != "T":
|
|
590
|
+
raise ValueError()
|
|
591
|
+
no_fraction = val[:19]
|
|
592
|
+
bare = datetime.datetime.fromisoformat(no_fraction)
|
|
593
|
+
if val[19] == ".":
|
|
594
|
+
if val.endswith("Z"):
|
|
595
|
+
offset = "Z"
|
|
596
|
+
fraction = val[20:-1]
|
|
597
|
+
elif val[-6] in ("+", "-"):
|
|
598
|
+
offset = val[-6:]
|
|
599
|
+
fraction = val[20:-6]
|
|
600
|
+
else:
|
|
601
|
+
raise ValueError()
|
|
602
|
+
if not fraction or len(fraction) > 9 or not fraction.isdigit():
|
|
603
|
+
raise ValueError()
|
|
604
|
+
scale = 9 - len(fraction)
|
|
605
|
+
nanos = int(fraction) * _POWERS_OF_10[scale]
|
|
606
|
+
else:
|
|
607
|
+
nanos = 0
|
|
608
|
+
if val.endswith("Z"):
|
|
609
|
+
offset = "Z"
|
|
610
|
+
elif val[-6] in ("+", "-"):
|
|
611
|
+
offset = val[-6:]
|
|
612
|
+
else:
|
|
613
|
+
raise ValueError()
|
|
614
|
+
|
|
615
|
+
if offset != "Z":
|
|
616
|
+
sign = offset[0]
|
|
617
|
+
hours = int(offset[1:3])
|
|
618
|
+
minutes = int(offset[4:6])
|
|
619
|
+
if offset[3] != ":":
|
|
620
|
+
raise ValueError()
|
|
621
|
+
delta = datetime.timedelta(hours=hours, minutes=minutes)
|
|
622
|
+
if sign == "-":
|
|
623
|
+
delta = -delta
|
|
624
|
+
tzinfo = datetime.timezone(delta)
|
|
625
|
+
bare = bare.replace(tzinfo=tzinfo).astimezone(datetime.timezone.utc)
|
|
626
|
+
|
|
627
|
+
return datetime_helpers.DatetimeWithNanoseconds(
|
|
628
|
+
bare.year,
|
|
629
|
+
bare.month,
|
|
630
|
+
bare.day,
|
|
631
|
+
bare.hour,
|
|
632
|
+
bare.minute,
|
|
633
|
+
bare.second,
|
|
634
|
+
nanosecond=nanos,
|
|
635
|
+
tzinfo=datetime.timezone.utc,
|
|
636
|
+
)
|
|
637
|
+
except (IndexError, ValueError) as e:
|
|
638
|
+
raise ValueError("Timestamp: {} does not match pattern".format(val)) from e
|
|
598
639
|
|
|
599
640
|
|
|
600
641
|
def _parse_proto(value_pb, column_info, field_name):
|
{google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/data_types.py
RENAMED
|
@@ -99,6 +99,11 @@ class JsonObject(dict):
|
|
|
99
99
|
return json.dumps(self, sort_keys=True, separators=(",", ":"))
|
|
100
100
|
|
|
101
101
|
|
|
102
|
+
_INTERVAL_PATTERN = re.compile(
|
|
103
|
+
r"^P(-?\d+Y)?(-?\d+M)?(-?\d+D)?(T(-?\d+H)?(-?\d+M)?(-?((\d+([.,]\d{1,9})?)|([.,]\d{1,9}))S)?)?$"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
102
107
|
@dataclass
|
|
103
108
|
class Interval:
|
|
104
109
|
"""Represents a Spanner INTERVAL type.
|
|
@@ -187,8 +192,7 @@ class Interval:
|
|
|
187
192
|
@classmethod
|
|
188
193
|
def from_str(cls, s: str) -> "Interval":
|
|
189
194
|
"""Parse an ISO8601 duration format string into an Interval."""
|
|
190
|
-
|
|
191
|
-
match = re.match(pattern, s)
|
|
195
|
+
match = _INTERVAL_PATTERN.match(s)
|
|
192
196
|
if not match or len(s) == 1:
|
|
193
197
|
raise ValueError(f"Invalid interval format: {s}")
|
|
194
198
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright 2026 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.68.0" # {x-release-please-version}
|
{google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/google/cloud/spanner_v1/streamed.py
RENAMED
|
@@ -35,8 +35,7 @@ class StreamedResultSet(object):
|
|
|
35
35
|
instances.
|
|
36
36
|
|
|
37
37
|
:type source: :class:`~google.cloud.spanner_v1.snapshot.Snapshot`
|
|
38
|
-
:param source: Deprecated. Snapshot from which the result set was fetched.
|
|
39
|
-
"""
|
|
38
|
+
:param source: Deprecated. Snapshot from which the result set was fetched."""
|
|
40
39
|
|
|
41
40
|
def __init__(
|
|
42
41
|
self,
|
|
@@ -117,16 +116,36 @@ class StreamedResultSet(object):
|
|
|
117
116
|
decoders = self._decoders
|
|
118
117
|
width = len(self.fields)
|
|
119
118
|
index = len(self._current_row)
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
119
|
+
current_row = self._current_row
|
|
120
|
+
rows = self._rows
|
|
121
|
+
current_row_append = current_row.append
|
|
122
|
+
rows_append = rows.append
|
|
123
|
+
if self._lazy_decode:
|
|
124
|
+
for value in values:
|
|
125
|
+
current_row_append(value)
|
|
126
|
+
index += 1
|
|
127
|
+
if index == width:
|
|
128
|
+
rows_append(current_row)
|
|
129
|
+
current_row = []
|
|
130
|
+
current_row_append = current_row.append
|
|
131
|
+
index = 0
|
|
132
|
+
else:
|
|
133
|
+
for value in values:
|
|
134
|
+
# Note: We manually check value.HasField("null_value") here instead of
|
|
135
|
+
# wrapping every decoder in _parse_nullable to avoid the overhead of
|
|
136
|
+
# an extra Python function call layer for every cell value decoded in this loop.
|
|
137
|
+
# If the nullable check logic is updated in _parse_nullable, update this check.
|
|
138
|
+
if value.HasField("null_value"):
|
|
139
|
+
current_row_append(None)
|
|
140
|
+
else:
|
|
141
|
+
current_row_append(decoders[index](value))
|
|
142
|
+
index += 1
|
|
143
|
+
if index == width:
|
|
144
|
+
rows_append(current_row)
|
|
145
|
+
current_row = []
|
|
146
|
+
current_row_append = current_row.append
|
|
147
|
+
index = 0
|
|
148
|
+
self._current_row = current_row
|
|
130
149
|
|
|
131
150
|
def _consume_next(self):
|
|
132
151
|
"""Consume the next partial result set from the stream.
|
{google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0/google_cloud_spanner.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: google-cloud-spanner
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.68.0
|
|
4
4
|
Summary: Google Cloud Spanner API client library
|
|
5
5
|
Home-page: https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-spanner
|
|
6
6
|
Author: Google LLC
|
|
@@ -40,6 +40,13 @@ Requires-Dist: google-cloud-monitoring>=2.16.0
|
|
|
40
40
|
Requires-Dist: mmh3>=4.1.0
|
|
41
41
|
Provides-Extra: libcst
|
|
42
42
|
Requires-Dist: libcst>=0.2.5; extra == "libcst"
|
|
43
|
+
Provides-Extra: test
|
|
44
|
+
Requires-Dist: pytest; extra == "test"
|
|
45
|
+
Requires-Dist: mock; extra == "test"
|
|
46
|
+
Requires-Dist: asyncmock; extra == "test"
|
|
47
|
+
Requires-Dist: pytest-cov; extra == "test"
|
|
48
|
+
Requires-Dist: pytest-asyncio; extra == "test"
|
|
49
|
+
Requires-Dist: pytest-xdist; extra == "test"
|
|
43
50
|
Dynamic: author
|
|
44
51
|
Dynamic: author-email
|
|
45
52
|
Dynamic: classifier
|
|
@@ -60,7 +60,17 @@ dependencies = [
|
|
|
60
60
|
"google-cloud-monitoring >= 2.16.0",
|
|
61
61
|
"mmh3 >= 4.1.0",
|
|
62
62
|
]
|
|
63
|
-
extras = {
|
|
63
|
+
extras = {
|
|
64
|
+
"libcst": "libcst >= 0.2.5",
|
|
65
|
+
"test": [
|
|
66
|
+
"pytest",
|
|
67
|
+
"mock",
|
|
68
|
+
"asyncmock",
|
|
69
|
+
"pytest-cov",
|
|
70
|
+
"pytest-asyncio",
|
|
71
|
+
"pytest-xdist",
|
|
72
|
+
],
|
|
73
|
+
}
|
|
64
74
|
|
|
65
75
|
url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-spanner"
|
|
66
76
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
# Copyright
|
|
2
|
-
#
|
|
1
|
+
# Copyright 2026 Google LLC All rights reserved.
|
|
3
2
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
3
|
# you may not use this file except in compliance with the License.
|
|
5
4
|
# You may obtain a copy of the License at
|
{google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/system/_async/test_database_api.py
RENAMED
|
@@ -179,7 +179,10 @@ async def test_transaction_manual_abort_retry(shared_database):
|
|
|
179
179
|
transaction.insert_or_update(sd.TABLE, sd.COLUMNS, sd.ROW_DATA)
|
|
180
180
|
|
|
181
181
|
await shared_database.run_in_transaction(_unit_of_work)
|
|
182
|
-
|
|
182
|
+
# Expect at least 2 attempts due to our simulated manual abort on first try.
|
|
183
|
+
# We use >= 2 rather than == 2 because the live Spanner server can also
|
|
184
|
+
# trigger transient abort retries depending on real-world GCP resource contention.
|
|
185
|
+
assert attempts >= 2
|
|
183
186
|
|
|
184
187
|
|
|
185
188
|
@pytest.mark.asyncio
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import datetime
|
|
16
|
+
import os
|
|
16
17
|
import time
|
|
17
18
|
|
|
18
19
|
import pytest
|
|
@@ -25,6 +26,10 @@ from google.cloud.spanner_admin_database_v1.types.backup import (
|
|
|
25
26
|
|
|
26
27
|
from . import _helpers
|
|
27
28
|
|
|
29
|
+
# Disable builtin metrics for system tests by default to avoid 401 errors
|
|
30
|
+
# from the background thread exporting to Cloud Monitoring without permissions.
|
|
31
|
+
os.environ["SPANNER_DISABLE_BUILTIN_METRICS"] = "true"
|
|
32
|
+
|
|
28
33
|
|
|
29
34
|
@pytest.fixture(scope="function")
|
|
30
35
|
def if_create_instance():
|
{google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_client.py
RENAMED
|
@@ -799,7 +799,9 @@ class TestClient(IsolatedAsyncioTestCase):
|
|
|
799
799
|
info_logger.assert_not_called()
|
|
800
800
|
|
|
801
801
|
# Also test when the environment variable is not set at all
|
|
802
|
-
with mock.patch.dict(
|
|
802
|
+
with mock.patch.dict(
|
|
803
|
+
os.environ, {"SPANNER_DISABLE_BUILTIN_METRICS": "true"}, clear=True
|
|
804
|
+
):
|
|
803
805
|
with mock.patch.object(logger, "info") as info_logger:
|
|
804
806
|
client = self._make_one(project=self.PROJECT, credentials=creds)
|
|
805
807
|
self.assertIsNotNone(client)
|
{google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_client_extra.py
RENAMED
|
@@ -131,7 +131,21 @@ class TestClientExtra(unittest.IsolatedAsyncioTestCase):
|
|
|
131
131
|
self.assertIsNotNone(ia_api)
|
|
132
132
|
self.assertIsNotNone(da_api)
|
|
133
133
|
|
|
134
|
-
|
|
134
|
+
# Safety shield mocks: We intercept the OpenTelemetry metric classes at the client module namespace level
|
|
135
|
+
# to prevent instantiating real exporter objects. This prevents spawning live background worker threads
|
|
136
|
+
# that periodically wake up and trigger 401 credential errors inside unauthenticated unit test runs.
|
|
137
|
+
@mock.patch("google.cloud.spanner_v1._async.client.CloudMonitoringMetricsExporter")
|
|
138
|
+
@mock.patch("google.cloud.spanner_v1._async.client.PeriodicExportingMetricReader")
|
|
139
|
+
@mock.patch("google.cloud.spanner_v1._async.client.MeterProvider")
|
|
140
|
+
# Global state reset: Temporarily override the module's process-wide global boolean _metrics_monitor_initialized
|
|
141
|
+
# to False so that the client enters the initialization logic instead of returning early.
|
|
142
|
+
@mock.patch(
|
|
143
|
+
"google.cloud.spanner_v1._async.client._metrics_monitor_initialized",
|
|
144
|
+
False,
|
|
145
|
+
)
|
|
146
|
+
def test_initialize_metrics_double_check(
|
|
147
|
+
self, mock_provider, mock_reader, mock_exporter
|
|
148
|
+
):
|
|
135
149
|
# coverage for line 143->exit
|
|
136
150
|
from google.cloud.spanner_v1._async import client as MUT
|
|
137
151
|
|
|
@@ -147,15 +161,17 @@ class TestClientExtra(unittest.IsolatedAsyncioTestCase):
|
|
|
147
161
|
def __exit__(self, *args):
|
|
148
162
|
return original_lock.__exit__(*args)
|
|
149
163
|
|
|
164
|
+
# Concurrency race condition simulator: Replace the process synchronization lock with our custom SettingLock.
|
|
165
|
+
# When this lock enters, it toggles _metrics_monitor_initialized to True to simulate another thread
|
|
166
|
+
# completing metrics setup while this thread was waiting for the lock.
|
|
150
167
|
with mock.patch(
|
|
151
|
-
"google.cloud.spanner_v1._async.client.
|
|
168
|
+
"google.cloud.spanner_v1._async.client._metrics_monitor_lock",
|
|
169
|
+
SettingLock(),
|
|
152
170
|
):
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
)
|
|
157
|
-
MUT._initialize_metrics("project", self.credentials)
|
|
158
|
-
self.assertTrue(MUT._metrics_monitor_initialized)
|
|
171
|
+
# Trigger the initialization function and verify Spanner's double-checked lock safely
|
|
172
|
+
# checks the flag again and aborts cleanly to prevent dual-registration.
|
|
173
|
+
MUT._initialize_metrics("project", self.credentials)
|
|
174
|
+
self.assertTrue(MUT._metrics_monitor_initialized)
|
|
159
175
|
|
|
160
176
|
def test_default_transaction_options_validation(self):
|
|
161
177
|
# coverage for line 344
|
{google_cloud_spanner-3.67.0 → google_cloud_spanner-3.68.0}/tests/unit/_async/test_session.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import datetime
|
|
2
|
+
import threading
|
|
2
3
|
from datetime import timezone
|
|
3
4
|
|
|
4
5
|
import google.api_core.gapic_v1.method
|
|
@@ -1800,11 +1801,16 @@ class TestSession(OpenTelemetryBase):
|
|
|
1800
1801
|
called_with.append((txn, args, kw))
|
|
1801
1802
|
txn.insert(TABLE_NAME, COLUMNS, VALUES)
|
|
1802
1803
|
|
|
1804
|
+
main_thread = threading.current_thread()
|
|
1805
|
+
_results = [1, 1.5]
|
|
1806
|
+
|
|
1803
1807
|
# retry once w/ timeout_secs=1
|
|
1804
|
-
def _time(
|
|
1805
|
-
if
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
+
def _time():
|
|
1809
|
+
if threading.current_thread() is main_thread:
|
|
1810
|
+
if len(_results) > 1:
|
|
1811
|
+
return _results.pop(0)
|
|
1812
|
+
return _results[0]
|
|
1813
|
+
return 1.0
|
|
1808
1814
|
|
|
1809
1815
|
with mock.patch("time.time", _time):
|
|
1810
1816
|
with mock.patch(
|
|
@@ -1877,9 +1883,14 @@ class TestSession(OpenTelemetryBase):
|
|
|
1877
1883
|
called_with.append((txn, args, kw))
|
|
1878
1884
|
txn.insert(TABLE_NAME, COLUMNS, VALUES)
|
|
1879
1885
|
|
|
1886
|
+
main_thread = threading.current_thread()
|
|
1887
|
+
_results = [1] * 100
|
|
1888
|
+
|
|
1880
1889
|
# retry several times to check backoff
|
|
1881
|
-
def _time(
|
|
1882
|
-
|
|
1890
|
+
def _time():
|
|
1891
|
+
if threading.current_thread() is main_thread:
|
|
1892
|
+
return _results.pop(0)
|
|
1893
|
+
return 1.0
|
|
1883
1894
|
|
|
1884
1895
|
with (
|
|
1885
1896
|
mock.patch("time.time", _time),
|