From f602cf85d82ba946dac045e51cbd384381f3cee6 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 6 Mar 2024 09:54:41 -0500 Subject: [PATCH 1/7] build(deps): bump cryptography from 42.0.2 to 42.0.4 in .kokoro (#1108) Source-Link: https://github.com/googleapis/synthtool/commit/d895aec3679ad22aa120481f746bf9f2f325f26f Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:98f3afd11308259de6e828e37376d18867fd321aba07826e29e4f8d9cab56bad Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 4 +-- .kokoro/requirements.txt | 57 ++++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index d8a1bbca71..e4e943e025 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:5ea6d0ab82c956b50962f91d94e206d3921537ae5fe1549ec5326381d8905cfa -# created: 2024-01-15T16:32:08.142785673Z + digest: sha256:98f3afd11308259de6e828e37376d18867fd321aba07826e29e4f8d9cab56bad +# created: 2024-02-27T15:56:18.442440378Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index bb3d6ca38b..bda8e38c4f 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -93,30 +93,39 @@ colorlog==6.7.0 \ # via # gcp-docuploader # nox -cryptography==41.0.6 \ - --hash=sha256:068bc551698c234742c40049e46840843f3d98ad7ce265fd2bd4ec0d11306596 \ - --hash=sha256:0f27acb55a4e77b9be8d550d762b0513ef3fc658cd3eb15110ebbcbd626db12c \ - --hash=sha256:2132d5865eea673fe6712c2ed5fb4fa49dba10768bb4cc798345748380ee3660 \ - --hash=sha256:3288acccef021e3c3c10d58933f44e8602cf04dba96d9796d70d537bb2f4bbc4 \ - --hash=sha256:35f3f288e83c3f6f10752467c48919a7a94b7d88cc00b0668372a0d2ad4f8ead \ - --hash=sha256:398ae1fc711b5eb78e977daa3cbf47cec20f2c08c5da129b7a296055fbb22aed \ - --hash=sha256:422e3e31d63743855e43e5a6fcc8b4acab860f560f9321b0ee6269cc7ed70cc3 \ - --hash=sha256:48783b7e2bef51224020efb61b42704207dde583d7e371ef8fc2a5fb6c0aabc7 \ - --hash=sha256:4d03186af98b1c01a4eda396b137f29e4e3fb0173e30f885e27acec8823c1b09 \ - --hash=sha256:5daeb18e7886a358064a68dbcaf441c036cbdb7da52ae744e7b9207b04d3908c \ - --hash=sha256:60e746b11b937911dc70d164060d28d273e31853bb359e2b2033c9e93e6f3c43 \ - --hash=sha256:742ae5e9a2310e9dade7932f9576606836ed174da3c7d26bc3d3ab4bd49b9f65 \ - --hash=sha256:7e00fb556bda398b99b0da289ce7053639d33b572847181d6483ad89835115f6 \ - --hash=sha256:85abd057699b98fce40b41737afb234fef05c67e116f6f3650782c10862c43da \ - --hash=sha256:8efb2af8d4ba9dbc9c9dd8f04d19a7abb5b49eab1f3694e7b5a16a5fc2856f5c \ - --hash=sha256:ae236bb8760c1e55b7a39b6d4d32d2279bc6c7c8500b7d5a13b6fb9fc97be35b \ - --hash=sha256:afda76d84b053923c27ede5edc1ed7d53e3c9f475ebaf63c68e69f1403c405a8 \ - --hash=sha256:b27a7fd4229abef715e064269d98a7e2909ebf92eb6912a9603c7e14c181928c \ - --hash=sha256:b648fe2a45e426aaee684ddca2632f62ec4613ef362f4d681a9a6283d10e079d \ - --hash=sha256:c5a550dc7a3b50b116323e3d376241829fd326ac47bc195e04eb33a8170902a9 \ - --hash=sha256:da46e2b5df770070412c46f87bac0849b8d685c5f2679771de277a422c7d0b86 \ - --hash=sha256:f39812f70fc5c71a15aa3c97b2bbe213c3f2a460b79bd21c40d033bb34a9bf36 \ - --hash=sha256:ff369dd19e8fe0528b02e8df9f2aeb2479f89b1270d90f96a63500afe9af5cae +cryptography==42.0.4 \ + --hash=sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b \ + --hash=sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce \ + --hash=sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88 \ + --hash=sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7 \ + --hash=sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20 \ + --hash=sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9 \ + --hash=sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff \ + --hash=sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1 \ + --hash=sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764 \ + --hash=sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b \ + --hash=sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298 \ + --hash=sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1 \ + --hash=sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824 \ + --hash=sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257 \ + --hash=sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a \ + --hash=sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129 \ + --hash=sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb \ + --hash=sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929 \ + --hash=sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854 \ + --hash=sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52 \ + --hash=sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923 \ + --hash=sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885 \ + --hash=sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0 \ + --hash=sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd \ + --hash=sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2 \ + --hash=sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18 \ + --hash=sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b \ + --hash=sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992 \ + --hash=sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74 \ + --hash=sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660 \ + --hash=sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925 \ + --hash=sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449 # via # gcp-releasetool # secretstorage From ccdd59292c43b8f9e00cf3825cc3b60705212085 Mon Sep 17 00:00:00 2001 From: nginsberg-google <131713109+nginsberg-google@users.noreply.github.com> Date: Wed, 6 Mar 2024 22:15:13 -0800 Subject: [PATCH 2/7] samples: add a sample for the max commit delay feature (#1097) * Add a sample * Small addition. * Change sample to a transactional sample. * Comments * feat(spanner): update snippet tag position * fix test output --------- Co-authored-by: Sri Harsha CH <57220027+harshachinta@users.noreply.github.com> Co-authored-by: Sri Harsha CH --- samples/samples/snippets.py | 26 ++++++++++++++++++++++++++ samples/samples/snippets_test.py | 9 ++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/samples/samples/snippets.py b/samples/samples/snippets.py index 23d9d8aff1..ec466579ec 100644 --- a/samples/samples/snippets.py +++ b/samples/samples/snippets.py @@ -1527,6 +1527,29 @@ def insert_singers(transaction): # [END spanner_get_commit_stats] +def set_max_commit_delay(instance_id, database_id): + """Inserts sample data and sets a max commit delay.""" + # [START spanner_set_max_commit_delay] + # instance_id = "your-spanner-instance" + # database_id = "your-spanner-db-id" + spanner_client = spanner.Client() + instance = spanner_client.instance(instance_id) + database = instance.database(database_id) + + def insert_singers(transaction): + row_ct = transaction.execute_update( + "INSERT Singers (SingerId, FirstName, LastName) " + " VALUES (111, 'Grace', 'Bennis')" + ) + + print("{} record(s) inserted.".format(row_ct)) + + database.run_in_transaction( + insert_singers, max_commit_delay=datetime.timedelta(milliseconds=100) + ) + # [END spanner_set_max_commit_delay] + + def update_data_with_dml(instance_id, database_id): """Updates sample data from the database using a DML statement.""" # [START spanner_dml_standard_update] @@ -3082,6 +3105,7 @@ def set_custom_timeout_and_retry(instance_id, database_id): subparsers.add_parser("read_stale_data", help=read_stale_data.__doc__) subparsers.add_parser("add_column", help=add_column.__doc__) subparsers.add_parser("update_data", help=update_data.__doc__) + subparsers.add_parser("set_max_commit_delay", help=set_max_commit_delay.__doc__) subparsers.add_parser( "query_data_with_new_column", help=query_data_with_new_column.__doc__ ) @@ -3228,6 +3252,8 @@ def set_custom_timeout_and_retry(instance_id, database_id): add_column(args.instance_id, args.database_id) elif args.command == "update_data": update_data(args.instance_id, args.database_id) + elif args.command == "set_max_commit_delay": + set_max_commit_delay(args.instance_id, args.database_id) elif args.command == "query_data_with_new_column": query_data_with_new_column(args.instance_id, args.database_id) elif args.command == "read_write_transaction": diff --git a/samples/samples/snippets_test.py b/samples/samples/snippets_test.py index 7c8de8ab96..4eedd563b5 100644 --- a/samples/samples/snippets_test.py +++ b/samples/samples/snippets_test.py @@ -499,6 +499,13 @@ def test_log_commit_stats(capsys, instance_id, sample_database): assert "4 mutation(s) in transaction." in out +@pytest.mark.dependency(name="set_max_commit_delay") +def test_set_max_commit_delay(capsys, instance_id, sample_database): + snippets.set_max_commit_delay(instance_id, sample_database.database_id) + out, _ = capsys.readouterr() + assert "1 record(s) inserted." in out + + @pytest.mark.dependency(depends=["insert_data"]) def test_update_data_with_dml(capsys, instance_id, sample_database): snippets.update_data_with_dml(instance_id, sample_database.database_id) @@ -588,7 +595,7 @@ def update_data_with_partitioned_dml(capsys, instance_id, sample_database): def test_delete_data_with_partitioned_dml(capsys, instance_id, sample_database): snippets.delete_data_with_partitioned_dml(instance_id, sample_database.database_id) out, _ = capsys.readouterr() - assert "6 record(s) deleted" in out + assert "7 record(s) deleted" in out @pytest.mark.dependency(depends=["add_column"]) From e73c6718b23bf78a8f264419b2ba378f95fa2554 Mon Sep 17 00:00:00 2001 From: rahul2393 Date: Thu, 7 Mar 2024 13:43:59 +0530 Subject: [PATCH 3/7] docs: add sample for managed autoscaler (#1111) * docs: add sample for managed autoscaler * incorporate suggestions --------- Co-authored-by: Sri Harsha CH <57220027+harshachinta@users.noreply.github.com> --- samples/samples/snippets.py | 63 +++++++++++++++++++++++++++++++- samples/samples/snippets_test.py | 12 ++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/samples/samples/snippets.py b/samples/samples/snippets.py index ec466579ec..a5f8d8653f 100644 --- a/samples/samples/snippets.py +++ b/samples/samples/snippets.py @@ -3043,8 +3043,8 @@ def directed_read_options( def set_custom_timeout_and_retry(instance_id, database_id): """Executes a snapshot read with custom timeout and retry.""" # [START spanner_set_custom_timeout_and_retry] - from google.api_core import retry from google.api_core import exceptions as core_exceptions + from google.api_core import retry # instance_id = "your-spanner-instance" # database_id = "your-spanner-db-id" @@ -3085,6 +3085,65 @@ def set_custom_timeout_and_retry(instance_id, database_id): # [END spanner_set_custom_timeout_and_retry] +# [START spanner_create_instance_with_autoscaling_config] +def create_instance_with_autoscaling_config(instance_id): + """Creates a Cloud Spanner instance with an autoscaling configuration.""" + from google.cloud.spanner_admin_instance_v1.types import \ + spanner_instance_admin + + spanner_client = spanner.Client() + + config_name = "{}/instanceConfigs/regional-us-central1".format( + spanner_client.project_name + ) + + autoscaling_config = spanner_instance_admin.AutoscalingConfig( + # Only one of minNodes/maxNodes or minProcessingUnits/maxProcessingUnits can be set. + autoscaling_limits=spanner_instance_admin.AutoscalingConfig.AutoscalingLimits( + min_nodes=1, + max_nodes=2, + ), + # highPriorityCpuUtilizationPercent and storageUtilizationPercent are both + # percentages and must lie between 0 and 100. + autoscaling_targets=spanner_instance_admin.AutoscalingConfig.AutoscalingTargets( + high_priority_cpu_utilization_percent=65, + storage_utilization_percent=95, + ), + ) + + # Creates a new instance with autoscaling configuration + # When autoscalingConfig is enabled, nodeCount and processingUnits fields + # need not be specified. + request = spanner_instance_admin.CreateInstanceRequest( + parent=spanner_client.project_name, + instance_id=instance_id, + instance=spanner_instance_admin.Instance( + config=config_name, + display_name="This is a display name.", + autoscaling_config=autoscaling_config, + labels={ + "cloud_spanner_samples": "true", + "sample_name": "snippets-create_instance_with_autoscaling_config", + "created": str(int(time.time())), + }, + ), + ) + + operation = spanner_client.instance_admin_api.create_instance(request=request) + + print("Waiting for operation to complete...") + instance = operation.result(OPERATION_TIMEOUT_SECONDS) + + print( + "Created instance {} with {} autoscaling config".format( + instance_id, instance.autoscaling_config + ) + ) + + +# [END spanner_create_instance_with_autoscaling_config] + + if __name__ == "__main__": # noqa: C901 parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter @@ -3366,3 +3425,5 @@ def set_custom_timeout_and_retry(instance_id, database_id): directed_read_options(args.instance_id, args.database_id) elif args.command == "set_custom_timeout_and_retry": set_custom_timeout_and_retry(args.instance_id, args.database_id) + elif args.command == "create_instance_with_autoscaling_config": + create_instance_with_autoscaling_config(args.instance_id) diff --git a/samples/samples/snippets_test.py b/samples/samples/snippets_test.py index 4eedd563b5..b19784d453 100644 --- a/samples/samples/snippets_test.py +++ b/samples/samples/snippets_test.py @@ -154,6 +154,18 @@ def test_create_instance_with_processing_units(capsys, lci_instance_id): retry_429(instance.delete)() +def test_create_instance_with_autoscaling_config(capsys, lci_instance_id): + retry_429(snippets.create_instance_with_autoscaling_config)( + lci_instance_id, + ) + out, _ = capsys.readouterr() + assert lci_instance_id in out + assert "autoscaling config" in out + spanner_client = spanner.Client() + instance = spanner_client.instance(lci_instance_id) + retry_429(instance.delete)() + + def test_update_database(capsys, instance_id, sample_database): snippets.update_database(instance_id, sample_database.database_id) out, _ = capsys.readouterr() From a92c6d347f2ae84779ec8662280ea894d558a887 Mon Sep 17 00:00:00 2001 From: Ankit Agarwal <146331865+ankiaga@users.noreply.github.com> Date: Mon, 11 Mar 2024 14:18:32 +0530 Subject: [PATCH 4/7] fix: Correcting name of variable from `table_schema` to `schema_name` (#1114) --- google/cloud/spanner_dbapi/_helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/spanner_dbapi/_helpers.py b/google/cloud/spanner_dbapi/_helpers.py index e9a71d9ae9..7c41767ba4 100644 --- a/google/cloud/spanner_dbapi/_helpers.py +++ b/google/cloud/spanner_dbapi/_helpers.py @@ -24,7 +24,7 @@ SQL_GET_TABLE_COLUMN_SCHEMA = """ SELECT COLUMN_NAME, IS_NULLABLE, SPANNER_TYPE FROM INFORMATION_SCHEMA.COLUMNS -WHERE TABLE_SCHEMA = @table_schema AND TABLE_NAME = @table_name +WHERE TABLE_SCHEMA = @schema_name AND TABLE_NAME = @table_name """ # This table maps spanner_types to Spanner's data type sizes as per From 7e0b46aba7c48f7f944c0fca0cb394551b8d60c1 Mon Sep 17 00:00:00 2001 From: rahul2393 Date: Tue, 12 Mar 2024 19:45:35 +0530 Subject: [PATCH 5/7] feat: add support of float32 type (#1113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add support of float32 type * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * incorporate changes * incorporate changes * handle case for infinity * fix build * fix tests --------- Co-authored-by: Owl Bot --- google/cloud/spanner_v1/_helpers.py | 5 ++++ google/cloud/spanner_v1/param_types.py | 1 + google/cloud/spanner_v1/streamed.py | 1 + tests/system/_sample_data.py | 3 ++ tests/system/test_session_api.py | 41 ++++++++++++++++++++++++++ tests/unit/test__helpers.py | 21 +++++++++++++ tests/unit/test_param_types.py | 21 +++++++------ 7 files changed, 82 insertions(+), 11 deletions(-) diff --git a/google/cloud/spanner_v1/_helpers.py b/google/cloud/spanner_v1/_helpers.py index e0e2bfdbd0..d6b10dba18 100644 --- a/google/cloud/spanner_v1/_helpers.py +++ b/google/cloud/spanner_v1/_helpers.py @@ -228,6 +228,11 @@ def _parse_value_pb(value_pb, field_type): return float(value_pb.string_value) else: return value_pb.number_value + elif type_code == TypeCode.FLOAT32: + if value_pb.HasField("string_value"): + return float(value_pb.string_value) + else: + return value_pb.number_value elif type_code == TypeCode.DATE: return _date_from_iso8601_date(value_pb.string_value) elif type_code == TypeCode.TIMESTAMP: diff --git a/google/cloud/spanner_v1/param_types.py b/google/cloud/spanner_v1/param_types.py index 0c03f7ecc6..9b1910244d 100644 --- a/google/cloud/spanner_v1/param_types.py +++ b/google/cloud/spanner_v1/param_types.py @@ -26,6 +26,7 @@ BOOL = Type(code=TypeCode.BOOL) INT64 = Type(code=TypeCode.INT64) FLOAT64 = Type(code=TypeCode.FLOAT64) +FLOAT32 = Type(code=TypeCode.FLOAT32) DATE = Type(code=TypeCode.DATE) TIMESTAMP = Type(code=TypeCode.TIMESTAMP) NUMERIC = Type(code=TypeCode.NUMERIC) diff --git a/google/cloud/spanner_v1/streamed.py b/google/cloud/spanner_v1/streamed.py index ac8fc71ce6..d2c2b6216f 100644 --- a/google/cloud/spanner_v1/streamed.py +++ b/google/cloud/spanner_v1/streamed.py @@ -332,6 +332,7 @@ def _merge_struct(lhs, rhs, type_): TypeCode.BYTES: _merge_string, TypeCode.DATE: _merge_string, TypeCode.FLOAT64: _merge_float64, + TypeCode.FLOAT32: _merge_float64, TypeCode.INT64: _merge_string, TypeCode.STRING: _merge_string, TypeCode.STRUCT: _merge_struct, diff --git a/tests/system/_sample_data.py b/tests/system/_sample_data.py index 9c83f42224..d9c269c27f 100644 --- a/tests/system/_sample_data.py +++ b/tests/system/_sample_data.py @@ -90,5 +90,8 @@ def _check_cell_data(found_cell, expected_cell, recurse_into_lists=True): for found_item, expected_item in zip(found_cell, expected_cell): _check_cell_data(found_item, expected_item) + elif isinstance(found_cell, float) and not math.isinf(found_cell): + assert abs(found_cell - expected_cell) < 0.00001 + else: assert found_cell == expected_cell diff --git a/tests/system/test_session_api.py b/tests/system/test_session_api.py index 29d196b011..6f1844faa9 100644 --- a/tests/system/test_session_api.py +++ b/tests/system/test_session_api.py @@ -2216,6 +2216,47 @@ def test_execute_sql_w_float_bindings_transfinite(sessions_database, database_di ) +def test_execute_sql_w_float32_bindings(sessions_database, database_dialect): + pytest.skip("float32 is not yet supported in production.") + _bind_test_helper( + sessions_database, + database_dialect, + spanner_v1.param_types.FLOAT32, + 42.3, + [12.3, 456.0, 7.89], + ) + + +def test_execute_sql_w_float32_bindings_transfinite( + sessions_database, database_dialect +): + pytest.skip("float32 is not yet supported in production.") + key = "p1" if database_dialect == DatabaseDialect.POSTGRESQL else "neg_inf" + placeholder = "$1" if database_dialect == DatabaseDialect.POSTGRESQL else f"@{key}" + + # Find -inf + _check_sql_results( + sessions_database, + sql=f"SELECT {placeholder}", + params={key: NEG_INF}, + param_types={key: spanner_v1.param_types.FLOAT32}, + expected=[(NEG_INF,)], + order=False, + ) + + key = "p1" if database_dialect == DatabaseDialect.POSTGRESQL else "pos_inf" + placeholder = "$1" if database_dialect == DatabaseDialect.POSTGRESQL else f"@{key}" + # Find +inf + _check_sql_results( + sessions_database, + sql=f"SELECT {placeholder}", + params={key: POS_INF}, + param_types={key: spanner_v1.param_types.FLOAT32}, + expected=[(POS_INF,)], + order=False, + ) + + def test_execute_sql_w_bytes_bindings(sessions_database, database_dialect): _bind_test_helper( sessions_database, diff --git a/tests/unit/test__helpers.py b/tests/unit/test__helpers.py index 0e0ec903a2..cb2372406f 100644 --- a/tests/unit/test__helpers.py +++ b/tests/unit/test__helpers.py @@ -466,6 +466,27 @@ def test_w_float_str(self): self.assertEqual(self._callFUT(value_pb, field_type), expected_value) + def test_w_float32(self): + from google.cloud.spanner_v1 import Type, TypeCode + from google.protobuf.struct_pb2 import Value + + VALUE = 3.14159 + field_type = Type(code=TypeCode.FLOAT32) + value_pb = Value(number_value=VALUE) + + self.assertEqual(self._callFUT(value_pb, field_type), VALUE) + + def test_w_float32_str(self): + from google.cloud.spanner_v1 import Type, TypeCode + from google.protobuf.struct_pb2 import Value + + VALUE = "3.14159" + field_type = Type(code=TypeCode.FLOAT32) + value_pb = Value(string_value=VALUE) + expected_value = 3.14159 + + self.assertEqual(self._callFUT(value_pb, field_type), expected_value) + def test_w_date(self): import datetime from google.protobuf.struct_pb2 import Value diff --git a/tests/unit/test_param_types.py b/tests/unit/test_param_types.py index 02f41c1f25..645774d79b 100644 --- a/tests/unit/test_param_types.py +++ b/tests/unit/test_param_types.py @@ -18,9 +18,7 @@ class Test_ArrayParamType(unittest.TestCase): def test_it(self): - from google.cloud.spanner_v1 import Type - from google.cloud.spanner_v1 import TypeCode - from google.cloud.spanner_v1 import param_types + from google.cloud.spanner_v1 import Type, TypeCode, param_types expected = Type( code=TypeCode.ARRAY, array_element_type=Type(code=TypeCode.INT64) @@ -33,15 +31,13 @@ def test_it(self): class Test_Struct(unittest.TestCase): def test_it(self): - from google.cloud.spanner_v1 import Type - from google.cloud.spanner_v1 import TypeCode - from google.cloud.spanner_v1 import StructType - from google.cloud.spanner_v1 import param_types + from google.cloud.spanner_v1 import StructType, Type, TypeCode, param_types struct_type = StructType( fields=[ StructType.Field(name="name", type_=Type(code=TypeCode.STRING)), StructType.Field(name="count", type_=Type(code=TypeCode.INT64)), + StructType.Field(name="float32", type_=Type(code=TypeCode.FLOAT32)), ] ) expected = Type(code=TypeCode.STRUCT, struct_type=struct_type) @@ -50,6 +46,7 @@ def test_it(self): [ param_types.StructField("name", param_types.STRING), param_types.StructField("count", param_types.INT64), + param_types.StructField("float32", param_types.FLOAT32), ] ) @@ -58,10 +55,12 @@ def test_it(self): class Test_JsonbParamType(unittest.TestCase): def test_it(self): - from google.cloud.spanner_v1 import Type - from google.cloud.spanner_v1 import TypeCode - from google.cloud.spanner_v1 import TypeAnnotationCode - from google.cloud.spanner_v1 import param_types + from google.cloud.spanner_v1 import ( + Type, + TypeAnnotationCode, + TypeCode, + param_types, + ) expected = Type( code=TypeCode.JSON, From c9f4fbf2a42054ed61916fb544c5aca947a50598 Mon Sep 17 00:00:00 2001 From: Ankit Agarwal <146331865+ankiaga@users.noreply.github.com> Date: Wed, 13 Mar 2024 14:56:23 +0530 Subject: [PATCH 6/7] feat: Changes for float32 in dbapi (#1115) --- google/cloud/spanner_dbapi/_helpers.py | 1 + google/cloud/spanner_dbapi/types.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/google/cloud/spanner_dbapi/_helpers.py b/google/cloud/spanner_dbapi/_helpers.py index 7c41767ba4..b27ef1564f 100644 --- a/google/cloud/spanner_dbapi/_helpers.py +++ b/google/cloud/spanner_dbapi/_helpers.py @@ -40,6 +40,7 @@ param_types.BOOL.code: 1, param_types.DATE.code: 4, param_types.FLOAT64.code: 8, + param_types.FLOAT32.code: 4, param_types.INT64.code: 8, param_types.TIMESTAMP.code: 12, } diff --git a/google/cloud/spanner_dbapi/types.py b/google/cloud/spanner_dbapi/types.py index 80d7030402..363accdfa2 100644 --- a/google/cloud/spanner_dbapi/types.py +++ b/google/cloud/spanner_dbapi/types.py @@ -73,7 +73,7 @@ def __eq__(self, other): STRING = "STRING" BINARY = _DBAPITypeObject("TYPE_CODE_UNSPECIFIED", "BYTES", "ARRAY", "STRUCT") -NUMBER = _DBAPITypeObject("BOOL", "INT64", "FLOAT64", "NUMERIC") +NUMBER = _DBAPITypeObject("BOOL", "INT64", "FLOAT64", "FLOAT32", "NUMERIC") DATETIME = _DBAPITypeObject("TIMESTAMP", "DATE") ROWID = "STRING" From 4da06a6a883c0513d7c80f9462c871b0a00a8f2b Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 16:25:12 +0530 Subject: [PATCH 7/7] chore(main): release 3.44.0 (#1112) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- .release-please-manifest.json | 2 +- CHANGELOG.md | 18 ++++++++++++++++++ .../spanner_admin_database_v1/gapic_version.py | 2 +- .../spanner_admin_instance_v1/gapic_version.py | 2 +- google/cloud/spanner_v1/gapic_version.py | 2 +- ...adata_google.spanner.admin.database.v1.json | 2 +- ...adata_google.spanner.admin.instance.v1.json | 2 +- .../snippet_metadata_google.spanner.v1.json | 2 +- 8 files changed, 25 insertions(+), 7 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index e5cbfafe9d..6581790196 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "3.43.0" + ".": "3.44.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 40d7b46ef4..d73ddf901f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,24 @@ [1]: https://pypi.org/project/google-cloud-spanner/#history +## [3.44.0](https://github.com/googleapis/python-spanner/compare/v3.43.0...v3.44.0) (2024-03-13) + + +### Features + +* Add support of float32 type ([#1113](https://github.com/googleapis/python-spanner/issues/1113)) ([7e0b46a](https://github.com/googleapis/python-spanner/commit/7e0b46aba7c48f7f944c0fca0cb394551b8d60c1)) +* Changes for float32 in dbapi ([#1115](https://github.com/googleapis/python-spanner/issues/1115)) ([c9f4fbf](https://github.com/googleapis/python-spanner/commit/c9f4fbf2a42054ed61916fb544c5aca947a50598)) + + +### Bug Fixes + +* Correcting name of variable from `table_schema` to `schema_name` ([#1114](https://github.com/googleapis/python-spanner/issues/1114)) ([a92c6d3](https://github.com/googleapis/python-spanner/commit/a92c6d347f2ae84779ec8662280ea894d558a887)) + + +### Documentation + +* Add sample for managed autoscaler ([#1111](https://github.com/googleapis/python-spanner/issues/1111)) ([e73c671](https://github.com/googleapis/python-spanner/commit/e73c6718b23bf78a8f264419b2ba378f95fa2554)) + ## [3.43.0](https://github.com/googleapis/python-spanner/compare/v3.42.0...v3.43.0) (2024-03-06) diff --git a/google/cloud/spanner_admin_database_v1/gapic_version.py b/google/cloud/spanner_admin_database_v1/gapic_version.py index 9519d06159..d8ad1d2cc3 100644 --- a/google/cloud/spanner_admin_database_v1/gapic_version.py +++ b/google/cloud/spanner_admin_database_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.43.0" # {x-release-please-version} +__version__ = "3.44.0" # {x-release-please-version} diff --git a/google/cloud/spanner_admin_instance_v1/gapic_version.py b/google/cloud/spanner_admin_instance_v1/gapic_version.py index 9519d06159..d8ad1d2cc3 100644 --- a/google/cloud/spanner_admin_instance_v1/gapic_version.py +++ b/google/cloud/spanner_admin_instance_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.43.0" # {x-release-please-version} +__version__ = "3.44.0" # {x-release-please-version} diff --git a/google/cloud/spanner_v1/gapic_version.py b/google/cloud/spanner_v1/gapic_version.py index 9519d06159..d8ad1d2cc3 100644 --- a/google/cloud/spanner_v1/gapic_version.py +++ b/google/cloud/spanner_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "3.43.0" # {x-release-please-version} +__version__ = "3.44.0" # {x-release-please-version} diff --git a/samples/generated_samples/snippet_metadata_google.spanner.admin.database.v1.json b/samples/generated_samples/snippet_metadata_google.spanner.admin.database.v1.json index d82a3d122c..6f8f69a452 100644 --- a/samples/generated_samples/snippet_metadata_google.spanner.admin.database.v1.json +++ b/samples/generated_samples/snippet_metadata_google.spanner.admin.database.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-spanner-admin-database", - "version": "3.43.0" + "version": "3.44.0" }, "snippets": [ { diff --git a/samples/generated_samples/snippet_metadata_google.spanner.admin.instance.v1.json b/samples/generated_samples/snippet_metadata_google.spanner.admin.instance.v1.json index d5bccd9177..ff820272a6 100644 --- a/samples/generated_samples/snippet_metadata_google.spanner.admin.instance.v1.json +++ b/samples/generated_samples/snippet_metadata_google.spanner.admin.instance.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-spanner-admin-instance", - "version": "3.43.0" + "version": "3.44.0" }, "snippets": [ { diff --git a/samples/generated_samples/snippet_metadata_google.spanner.v1.json b/samples/generated_samples/snippet_metadata_google.spanner.v1.json index 468b6aac82..d78b329e04 100644 --- a/samples/generated_samples/snippet_metadata_google.spanner.v1.json +++ b/samples/generated_samples/snippet_metadata_google.spanner.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-spanner", - "version": "3.43.0" + "version": "3.44.0" }, "snippets": [ {