From beb5bdf797ba056078bba86fc936846792fa25bc Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Thu, 19 Nov 2020 16:00:04 +0300 Subject: [PATCH 01/10] feat: autocommit sample --- samples/samples/__init__.py | 5 +++ samples/samples/autocommit.py | 68 ++++++++++++++++++++++++++++++ samples/samples/test_autocommit.py | 57 +++++++++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 samples/samples/__init__.py create mode 100644 samples/samples/autocommit.py create mode 100644 samples/samples/test_autocommit.py diff --git a/samples/samples/__init__.py b/samples/samples/__init__.py new file mode 100644 index 0000000000..6b607710ed --- /dev/null +++ b/samples/samples/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2020 Google LLC +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py new file mode 100644 index 0000000000..e28cd22f83 --- /dev/null +++ b/samples/samples/autocommit.py @@ -0,0 +1,68 @@ +# Copyright 2020 Google LLC +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +import argparse + +from google.cloud import spanner_dbapi +from google.cloud.spanner_dbapi import connect + + +def enable_autocommit_mode(instance_id, database_id): + """Enables autocommit mode.""" + # [START spanner_enable_autocommit_mode] + connection = connect(instance_id, database_id) + connection.autocommit = True + print("Autocommit mode is enabled.") + + cursor = connection.cursor() + + cursor.execute( + """CREATE TABLE Singers ( + SingerId INT64 NOT NULL, + FirstName STRING(1024), + LastName STRING(1024), + SingerInfo BYTES(MAX) + ) PRIMARY KEY (SingerId)""" + ) + + cursor.execute( + """INSERT INTO Singers (SingerId, FirstName, LastName) VALUES + (12, 'Melissa', 'Garcia'), + (13, 'Russell', 'Morales'), + (14, 'Jacqueline', 'Long'), + (15, 'Dylan', 'Shaw')""" + ) + + cursor.execute("""SELECT * FROM Singers WHERE SingerId = 13""") + + print( + "SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*cursor.fetchone()) + ) + + connection.close() + # [END spanner_enable_autocommit_mode] + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument("instance_id", help="Your Cloud Spanner instance ID.") + parser.add_argument( + "--database-id", + help="Your Cloud Spanner database ID.", + default="example_db", + ) + subparsers = parser.add_subparsers(dest="command") + subparsers.add_parser( + "enable_autocommit_mode", help=enable_autocommit_mode.__doc__ + ) + args = parser.parse_args() + if args.command == "enable_autocommit_mode": + enable_autocommit_mode(args.instance_id, args.database_id) + else: + print(f"Command {args.command} did not match expected commands.") diff --git a/samples/samples/test_autocommit.py b/samples/samples/test_autocommit.py new file mode 100644 index 0000000000..6f17e3ca92 --- /dev/null +++ b/samples/samples/test_autocommit.py @@ -0,0 +1,57 @@ +# Copyright 2020 Google LLC +# +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file or at +# https://developers.google.com/open-source/licenses/bsd + +import uuid + +from google.api_core.exceptions import DeadlineExceeded +from google.cloud import spanner +import pytest + +from . import autocommit + + +def unique_instance_id(): + """Creates a unique id for the database.""" + return f"test-instance-{uuid.uuid4().hex[:10]}" + + +def unique_database_id(): + """Creates a unique id for the database.""" + return f"test-db-{uuid.uuid4().hex[:10]}" + + +INSTANCE_ID = unique_instance_id() +DATABASE_ID = unique_database_id() + + +@pytest.fixture(scope="module") +def spanner_instance(): + spanner_client = spanner.Client() + config_name = ( + f"{spanner_client.project_name}/instanceConfigs/regional-us-central1" + ) + + instance = spanner_client.instance(INSTANCE_ID, config_name) + op = instance.create() + op.result(120) # block until completion + yield instance + instance.delete() + + +@pytest.fixture(scope="module") +def database(spanner_instance): + """Creates a temporary database that is removed after testing.""" + db = spanner_instance.database(DATABASE_ID) + db.create() + yield db + db.drop() + + +def test_enable_autocommit_mode(capsys, database): + autocommit.enable_autocommit_mode(INSTANCE_ID, DATABASE_ID) + out, _ = capsys.readouterr() + assert "Autocommit mode is enabled." in out + assert "SingerId: 13, AlbumId: Russell, AlbumTitle: Morales" in out From adc05b0ace9231bd2db3ec6a24e2e773fa5f950f Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Thu, 19 Nov 2020 17:19:49 +0300 Subject: [PATCH 02/10] remove unused imports --- samples/samples/autocommit.py | 9 ++------- samples/samples/test_autocommit.py | 5 +---- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py index e28cd22f83..6c3e23914f 100644 --- a/samples/samples/autocommit.py +++ b/samples/samples/autocommit.py @@ -6,7 +6,6 @@ import argparse -from google.cloud import spanner_dbapi from google.cloud.spanner_dbapi import connect @@ -38,9 +37,7 @@ def enable_autocommit_mode(instance_id, database_id): cursor.execute("""SELECT * FROM Singers WHERE SingerId = 13""") - print( - "SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*cursor.fetchone()) - ) + print("SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*cursor.fetchone())) connection.close() # [END spanner_enable_autocommit_mode] @@ -58,9 +55,7 @@ def enable_autocommit_mode(instance_id, database_id): default="example_db", ) subparsers = parser.add_subparsers(dest="command") - subparsers.add_parser( - "enable_autocommit_mode", help=enable_autocommit_mode.__doc__ - ) + subparsers.add_parser("enable_autocommit_mode", help=enable_autocommit_mode.__doc__) args = parser.parse_args() if args.command == "enable_autocommit_mode": enable_autocommit_mode(args.instance_id, args.database_id) diff --git a/samples/samples/test_autocommit.py b/samples/samples/test_autocommit.py index 6f17e3ca92..4c44c45699 100644 --- a/samples/samples/test_autocommit.py +++ b/samples/samples/test_autocommit.py @@ -6,7 +6,6 @@ import uuid -from google.api_core.exceptions import DeadlineExceeded from google.cloud import spanner import pytest @@ -30,9 +29,7 @@ def unique_database_id(): @pytest.fixture(scope="module") def spanner_instance(): spanner_client = spanner.Client() - config_name = ( - f"{spanner_client.project_name}/instanceConfigs/regional-us-central1" - ) + config_name = f"{spanner_client.project_name}/instanceConfigs/regional-us-central1" instance = spanner_client.instance(INSTANCE_ID, config_name) op = instance.create() From 1de5c29ad8e795649e030bbaba32354707c0f777 Mon Sep 17 00:00:00 2001 From: Chris Kleinknecht Date: Mon, 23 Nov 2020 16:16:32 -0800 Subject: [PATCH 03/10] Remove samples/samples init --- samples/samples/__init__.py | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 samples/samples/__init__.py diff --git a/samples/samples/__init__.py b/samples/samples/__init__.py deleted file mode 100644 index 6b607710ed..0000000000 --- a/samples/samples/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright 2020 Google LLC -# -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file or at -# https://developers.google.com/open-source/licenses/bsd From 85885f5619af1cbcae65edc4735d4eb0906e7adf Mon Sep 17 00:00:00 2001 From: Chris Kleinknecht Date: Mon, 23 Nov 2020 16:24:09 -0800 Subject: [PATCH 04/10] No package-relative imports in samples --- samples/samples/test_autocommit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/samples/test_autocommit.py b/samples/samples/test_autocommit.py index 4c44c45699..e88f10f439 100644 --- a/samples/samples/test_autocommit.py +++ b/samples/samples/test_autocommit.py @@ -9,7 +9,7 @@ from google.cloud import spanner import pytest -from . import autocommit +import autocommit def unique_instance_id(): From f8a6c8002077a294be56f15fc1f47e2164d35ae4 Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Wed, 25 Nov 2020 15:31:25 +0300 Subject: [PATCH 05/10] fix check errors, rename test file --- samples/samples/autocommit.py | 3 +++ samples/samples/{test_autocommit.py => autocommit_test.py} | 0 2 files changed, 3 insertions(+) rename samples/samples/{test_autocommit.py => autocommit_test.py} (100%) diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py index 6c3e23914f..7da8cc2c4c 100644 --- a/samples/samples/autocommit.py +++ b/samples/samples/autocommit.py @@ -12,11 +12,14 @@ def enable_autocommit_mode(instance_id, database_id): """Enables autocommit mode.""" # [START spanner_enable_autocommit_mode] + from google.cloud.spanner_dbapi.checksum import ResultsChecksum + connection = connect(instance_id, database_id) connection.autocommit = True print("Autocommit mode is enabled.") cursor = connection.cursor() + cursor._checksum = ResultsChecksum() cursor.execute( """CREATE TABLE Singers ( diff --git a/samples/samples/test_autocommit.py b/samples/samples/autocommit_test.py similarity index 100% rename from samples/samples/test_autocommit.py rename to samples/samples/autocommit_test.py From 1fb70190968286ed99caa5e346caadb4583d81a3 Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Mon, 30 Nov 2020 19:48:56 +0300 Subject: [PATCH 06/10] move ResultsChecksum() to test --- samples/samples/autocommit.py | 2 -- samples/samples/autocommit_test.py | 15 +++++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/samples/samples/autocommit.py b/samples/samples/autocommit.py index 7da8cc2c4c..873ed2b7bd 100644 --- a/samples/samples/autocommit.py +++ b/samples/samples/autocommit.py @@ -12,14 +12,12 @@ def enable_autocommit_mode(instance_id, database_id): """Enables autocommit mode.""" # [START spanner_enable_autocommit_mode] - from google.cloud.spanner_dbapi.checksum import ResultsChecksum connection = connect(instance_id, database_id) connection.autocommit = True print("Autocommit mode is enabled.") cursor = connection.cursor() - cursor._checksum = ResultsChecksum() cursor.execute( """CREATE TABLE Singers ( diff --git a/samples/samples/autocommit_test.py b/samples/samples/autocommit_test.py index e88f10f439..ec0cd2b901 100644 --- a/samples/samples/autocommit_test.py +++ b/samples/samples/autocommit_test.py @@ -48,7 +48,14 @@ def database(spanner_instance): def test_enable_autocommit_mode(capsys, database): - autocommit.enable_autocommit_mode(INSTANCE_ID, DATABASE_ID) - out, _ = capsys.readouterr() - assert "Autocommit mode is enabled." in out - assert "SingerId: 13, AlbumId: Russell, AlbumTitle: Morales" in out + import mock + from google.cloud.spanner_dbapi.checksum import ResultsChecksum + + with mock.patch( + "google.cloud.spanner_dbapi.cursor.Cursor._checksum", + new_callable=ResultsChecksum(), + ): + autocommit.enable_autocommit_mode(INSTANCE_ID, DATABASE_ID) + out, _ = capsys.readouterr() + assert "Autocommit mode is enabled." in out + assert "SingerId: 13, AlbumId: Russell, AlbumTitle: Morales" in out From 09c52464f557e0a97078d6d80f31f519f1925b17 Mon Sep 17 00:00:00 2001 From: Aleksandra Bogoslavetc Date: Mon, 30 Nov 2020 21:07:43 +0300 Subject: [PATCH 07/10] use connection.Cursor in patch --- samples/samples/autocommit_test.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/samples/samples/autocommit_test.py b/samples/samples/autocommit_test.py index ec0cd2b901..796e017ad1 100644 --- a/samples/samples/autocommit_test.py +++ b/samples/samples/autocommit_test.py @@ -50,10 +50,15 @@ def database(spanner_instance): def test_enable_autocommit_mode(capsys, database): import mock from google.cloud.spanner_dbapi.checksum import ResultsChecksum + from google.cloud.spanner_dbapi import connect + + connection = connect(INSTANCE_ID, DATABASE_ID) + cursor = connection.cursor() + cursor._checksum = ResultsChecksum() with mock.patch( - "google.cloud.spanner_dbapi.cursor.Cursor._checksum", - new_callable=ResultsChecksum(), + "google.cloud.spanner_dbapi.connection.Cursor", + return_value=cursor, ): autocommit.enable_autocommit_mode(INSTANCE_ID, DATABASE_ID) out, _ = capsys.readouterr() From cab9f08c8ba16b075866560b9ae03d138f7164af Mon Sep 17 00:00:00 2001 From: Ilya Gurov Date: Wed, 9 Dec 2020 11:53:23 +0300 Subject: [PATCH 08/10] Apply suggestions from code review Co-authored-by: Chris Kleinknecht --- samples/samples/autocommit_test.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/samples/samples/autocommit_test.py b/samples/samples/autocommit_test.py index 796e017ad1..e7aaefc199 100644 --- a/samples/samples/autocommit_test.py +++ b/samples/samples/autocommit_test.py @@ -6,8 +6,10 @@ import uuid -from google.cloud import spanner +import mock import pytest +from google.cloud import spanner +from google.cloud.spanner_dbapi import connect import autocommit @@ -29,7 +31,9 @@ def unique_database_id(): @pytest.fixture(scope="module") def spanner_instance(): spanner_client = spanner.Client() - config_name = f"{spanner_client.project_name}/instanceConfigs/regional-us-central1" + config_name = ( + f"{spanner_client.project_name}/instanceConfigs/regional-us-central1" + ) instance = spanner_client.instance(INSTANCE_ID, config_name) op = instance.create() @@ -48,10 +52,6 @@ def database(spanner_instance): def test_enable_autocommit_mode(capsys, database): - import mock - from google.cloud.spanner_dbapi.checksum import ResultsChecksum - from google.cloud.spanner_dbapi import connect - connection = connect(INSTANCE_ID, DATABASE_ID) cursor = connection.cursor() cursor._checksum = ResultsChecksum() From f1353a230ed3d073b24ce63f394ad3bc4e548387 Mon Sep 17 00:00:00 2001 From: Ilya Gurov Date: Wed, 9 Dec 2020 11:55:53 +0300 Subject: [PATCH 09/10] Update samples/samples/autocommit_test.py Co-authored-by: Chris Kleinknecht --- samples/samples/autocommit_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/samples/autocommit_test.py b/samples/samples/autocommit_test.py index e7aaefc199..7c51508dd0 100644 --- a/samples/samples/autocommit_test.py +++ b/samples/samples/autocommit_test.py @@ -54,7 +54,6 @@ def database(spanner_instance): def test_enable_autocommit_mode(capsys, database): connection = connect(INSTANCE_ID, DATABASE_ID) cursor = connection.cursor() - cursor._checksum = ResultsChecksum() with mock.patch( "google.cloud.spanner_dbapi.connection.Cursor", From 4e5465bea7998e36c8e0af8724fd5234a10f9344 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Wed, 9 Dec 2020 12:28:22 +0300 Subject: [PATCH 10/10] lint fix --- samples/samples/autocommit_test.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/samples/samples/autocommit_test.py b/samples/samples/autocommit_test.py index 7c51508dd0..c906f060e0 100644 --- a/samples/samples/autocommit_test.py +++ b/samples/samples/autocommit_test.py @@ -6,10 +6,10 @@ import uuid -import mock -import pytest from google.cloud import spanner from google.cloud.spanner_dbapi import connect +import mock +import pytest import autocommit @@ -31,9 +31,7 @@ def unique_database_id(): @pytest.fixture(scope="module") def spanner_instance(): spanner_client = spanner.Client() - config_name = ( - f"{spanner_client.project_name}/instanceConfigs/regional-us-central1" - ) + config_name = f"{spanner_client.project_name}/instanceConfigs/regional-us-central1" instance = spanner_client.instance(INSTANCE_ID, config_name) op = instance.create() @@ -56,8 +54,7 @@ def test_enable_autocommit_mode(capsys, database): cursor = connection.cursor() with mock.patch( - "google.cloud.spanner_dbapi.connection.Cursor", - return_value=cursor, + "google.cloud.spanner_dbapi.connection.Cursor", return_value=cursor, ): autocommit.enable_autocommit_mode(INSTANCE_ID, DATABASE_ID) out, _ = capsys.readouterr()