From a601f705af30b367ea0cc335857563f950a9a834 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Tue, 7 Sep 2021 11:23:26 +0300 Subject: [PATCH 1/4] fix: set correct user agent for the dialect --- .../sqlalchemy_spanner/sqlalchemy_spanner.py | 11 +++++++++- package_meta.py | 21 +++++++++++++++++++ setup.py | 17 ++++++++------- 3 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 package_meta.py diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index c68332e8..84d31ed0 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -29,6 +29,8 @@ from google.cloud import spanner_dbapi from google.cloud.sqlalchemy_spanner._opentelemetry_tracing import trace_call +from package_meta import __name__, __version__ + # Spanner-to-SQLAlchemy types map _type_map = { "BOOL": types.Boolean, @@ -434,7 +436,14 @@ def create_connect_args(self, url): url.database, ) return ( - [match.group("instance"), match.group("database"), match.group("project")], + [ + match.group("instance"), + match.group("database"), + match.group("project"), + None, + None, + __name__ + "/" + __version__, + ], {}, ) diff --git a/package_meta.py b/package_meta.py new file mode 100644 index 00000000..34931e79 --- /dev/null +++ b/package_meta.py @@ -0,0 +1,21 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Spanner dialect package metadata.""" + +__author__ = "Google LLC" +__author_email__ = "cloud-spanner-developers@googlegroups.com" +__description__ = "SQLAlchemy dialect integrated into Cloud Spanner database" +__name__ = "sqlalchemy-spanner" +__version__ = "0.1" diff --git a/setup.py b/setup.py index 3852af3d..0ad82471 100644 --- a/setup.py +++ b/setup.py @@ -14,11 +14,14 @@ import setuptools +from package_meta import __author__ +from package_meta import __author_email__ +from package_meta import __description__ +from package_meta import __name__ +from package_meta import __version__ # Package metadata. -name = "sqlalchemy-spanner" -description = "SQLAlchemy dialect integrated into Cloud Spanner database" dependencies = ["sqlalchemy>=1.1.13, <=1.3.23", "google-cloud-spanner>=3.3.0"] extras = { "tracing": [ @@ -42,10 +45,10 @@ namespaces.append("google.cloud") setuptools.setup( - author="Google LLC", - author_email="cloud-spanner-developers@googlegroups.com", + author=__author__, + author_email=__author_email__, classifiers=["Intended Audience :: Developers"], - description=description, + description=__description__, entry_points={ "sqlalchemy.dialects": [ "spanner = google.cloud.sqlalchemy_spanner:SpannerDialect" @@ -53,11 +56,11 @@ }, install_requires=dependencies, extras_require=extras, - name=name, + name=__name__, namespace_packages=namespaces, packages=packages, url="https://github.com/cloudspannerecosystem/python-spanner-sqlalchemy", - version="0.1", + version=__version__, include_package_data=True, zip_safe=False, ) From dd47a7922abfe7f262092bdbe0217a7319bfb968 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Tue, 7 Sep 2021 12:11:19 +0300 Subject: [PATCH 2/4] Revert "fix: set correct user agent for the dialect" This reverts commit a601f705af30b367ea0cc335857563f950a9a834. --- .../sqlalchemy_spanner/sqlalchemy_spanner.py | 11 +--------- package_meta.py | 21 ------------------- setup.py | 17 +++++++-------- 3 files changed, 8 insertions(+), 41 deletions(-) delete mode 100644 package_meta.py diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index 84d31ed0..c68332e8 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -29,8 +29,6 @@ from google.cloud import spanner_dbapi from google.cloud.sqlalchemy_spanner._opentelemetry_tracing import trace_call -from package_meta import __name__, __version__ - # Spanner-to-SQLAlchemy types map _type_map = { "BOOL": types.Boolean, @@ -436,14 +434,7 @@ def create_connect_args(self, url): url.database, ) return ( - [ - match.group("instance"), - match.group("database"), - match.group("project"), - None, - None, - __name__ + "/" + __version__, - ], + [match.group("instance"), match.group("database"), match.group("project")], {}, ) diff --git a/package_meta.py b/package_meta.py deleted file mode 100644 index 34931e79..00000000 --- a/package_meta.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Spanner dialect package metadata.""" - -__author__ = "Google LLC" -__author_email__ = "cloud-spanner-developers@googlegroups.com" -__description__ = "SQLAlchemy dialect integrated into Cloud Spanner database" -__name__ = "sqlalchemy-spanner" -__version__ = "0.1" diff --git a/setup.py b/setup.py index 0ad82471..3852af3d 100644 --- a/setup.py +++ b/setup.py @@ -14,14 +14,11 @@ import setuptools -from package_meta import __author__ -from package_meta import __author_email__ -from package_meta import __description__ -from package_meta import __name__ -from package_meta import __version__ # Package metadata. +name = "sqlalchemy-spanner" +description = "SQLAlchemy dialect integrated into Cloud Spanner database" dependencies = ["sqlalchemy>=1.1.13, <=1.3.23", "google-cloud-spanner>=3.3.0"] extras = { "tracing": [ @@ -45,10 +42,10 @@ namespaces.append("google.cloud") setuptools.setup( - author=__author__, - author_email=__author_email__, + author="Google LLC", + author_email="cloud-spanner-developers@googlegroups.com", classifiers=["Intended Audience :: Developers"], - description=__description__, + description=description, entry_points={ "sqlalchemy.dialects": [ "spanner = google.cloud.sqlalchemy_spanner:SpannerDialect" @@ -56,11 +53,11 @@ }, install_requires=dependencies, extras_require=extras, - name=__name__, + name=name, namespace_packages=namespaces, packages=packages, url="https://github.com/cloudspannerecosystem/python-spanner-sqlalchemy", - version=__version__, + version="0.1", include_package_data=True, zip_safe=False, ) From e057255b582e3e56b8d27a1cfd77c5986ac2103a Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Tue, 7 Sep 2021 12:11:46 +0300 Subject: [PATCH 3/4] use pkg_resources --- google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py index c68332e8..0e372fa4 100644 --- a/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py +++ b/google/cloud/sqlalchemy_spanner/sqlalchemy_spanner.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import pkg_resources import re from sqlalchemy import types, ForeignKeyConstraint @@ -433,9 +434,10 @@ def create_connect_args(self, url): ), url.database, ) + dist = pkg_resources.get_distribution("sqlalchemy-spanner") return ( [match.group("instance"), match.group("database"), match.group("project")], - {}, + {"user_agent": dist.project_name + "/" + dist.version}, ) @engine_to_connection From a083148261e4d273f376adfbdf5196fbd0090b15 Mon Sep 17 00:00:00 2001 From: IlyaFaer Date: Tue, 7 Sep 2021 18:20:54 +0300 Subject: [PATCH 4/4] add a test --- test/test_suite.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/test_suite.py b/test/test_suite.py index 906b20fa..74345b72 100644 --- a/test/test_suite.py +++ b/test/test_suite.py @@ -18,6 +18,7 @@ import decimal import operator import os +import pkg_resources import pytest from unittest import mock @@ -1525,3 +1526,23 @@ def test_interleave_on_delete_cascade(self): with mock.patch("google.cloud.spanner_dbapi.cursor.Cursor.execute") as execute: client.create(self._engine) execute.assert_called_once_with(EXP_QUERY, []) + + +class UserAgentTest(fixtures.TestBase): + """Check that SQLAlchemy dialect uses correct user agent.""" + + def setUp(self): + self._engine = create_engine( + "spanner:///projects/appdev-soda-spanner-staging/instances/" + "sqlalchemy-dialect-test/databases/compliance-test" + ) + self._metadata = MetaData(bind=self._engine) + + def test_user_agent(self): + dist = pkg_resources.get_distribution("sqlalchemy-spanner") + + with self._engine.connect() as connection: + assert ( + connection.connection.instance._client._client_info.user_agent + == dist.project_name + "/" + dist.version + )