diff --git a/docs/source/async.rst b/docs/source/async.rst index e37f4f97..d7bf12c2 100644 --- a/docs/source/async.rst +++ b/docs/source/async.rst @@ -16,6 +16,7 @@ For example: @pytest.fixture def async_pg(pmr_postgres_config): + # or `URL.create` in sqlalchemy 1.4+ create_async_engine(URL(host=pmr_postgres_config.host, database=pmr_postgres_config.database, ...)) diff --git a/src/pytest_mock_resources/compat/__init__.py b/src/pytest_mock_resources/compat/__init__.py index a28b1803..392f0d89 100644 --- a/src/pytest_mock_resources/compat/__init__.py +++ b/src/pytest_mock_resources/compat/__init__.py @@ -1,7 +1,7 @@ from pytest_mock_resources.compat.import_ import ImportAdaptor # isort: split -from pytest_mock_resources.compat import import_, sqlalchemy # flake8: ignore +from pytest_mock_resources.compat import sqlalchemy # noqa try: import psycopg2 diff --git a/src/pytest_mock_resources/compat/sqlalchemy.py b/src/pytest_mock_resources/compat/sqlalchemy.py index ed4ebed1..57ff3d19 100644 --- a/src/pytest_mock_resources/compat/sqlalchemy.py +++ b/src/pytest_mock_resources/compat/sqlalchemy.py @@ -1,10 +1,21 @@ +import sqlalchemy.engine.url + from pytest_mock_resources.compat.import_ import ImportAdaptor try: - from sqlalchemy.ext import asyncio as asyncio # type: ignore + from sqlalchemy.ext import asyncio # type: ignore except ImportError: - asyncio = ImportAdaptor( # type: ignore + asyncio = ImportAdaptor( "SQLAlchemy", "SQLAlchemy >= 1.4", fail_message="Cannot use sqlalchemy async features with SQLAlchemy < 1.4.\n", ) + +URL = sqlalchemy.engine.url.URL +try: + # Attempt to use the newly recommended `URL.create` method when available + URL = URL.create # type: ignore +except AttributeError: + # But if it's not available, the top-level contructor should still exist, + # as this is the only available option in sqlalchemy<1.4 versions. + pass diff --git a/src/pytest_mock_resources/container/mysql.py b/src/pytest_mock_resources/container/mysql.py index a990920a..ca83e108 100644 --- a/src/pytest_mock_resources/container/mysql.py +++ b/src/pytest_mock_resources/container/mysql.py @@ -1,6 +1,6 @@ import pytest import sqlalchemy -from sqlalchemy.engine.url import URL +from pytest_mock_resources import compat from pytest_mock_resources.config import DockerContainerConfig, fallback from pytest_mock_resources.container.base import ContainerCheckFailed, get_container @@ -52,7 +52,7 @@ def root_database(self): def get_sqlalchemy_engine(config, database_name, isolation_level=None): DB_URI = str( - URL( + compat.sqlalchemy.URL( "mysql+pymysql", username=config.username, password=config.password, diff --git a/src/pytest_mock_resources/fixture/database/generic.py b/src/pytest_mock_resources/fixture/database/generic.py index 49e31ae9..4137129f 100644 --- a/src/pytest_mock_resources/fixture/database/generic.py +++ b/src/pytest_mock_resources/fixture/database/generic.py @@ -1,4 +1,4 @@ -from sqlalchemy.engine.url import URL +from pytest_mock_resources import compat class Credentials: @@ -31,7 +31,7 @@ def as_url(self): def as_sqlalchemy_url(self): """Return a sqlalchemy :class:`sqlalchemy.engine.url.URL`.""" - return URL( + return compat.sqlalchemy.URL( drivername=self.drivername, host=self.host, port=self.port, diff --git a/src/pytest_mock_resources/fixture/database/relational/generic.py b/src/pytest_mock_resources/fixture/database/relational/generic.py index c787aa24..d90b5855 100644 --- a/src/pytest_mock_resources/fixture/database/relational/generic.py +++ b/src/pytest_mock_resources/fixture/database/relational/generic.py @@ -5,7 +5,6 @@ import attr import six from sqlalchemy import MetaData -from sqlalchemy.engine.url import URL from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.sql.ddl import CreateSchema @@ -200,7 +199,7 @@ async def manage_async(self, session=None): self.engine.dispose() def _get_async_engine(self, isolation_level=None): - url = URL( + url = compat.sqlalchemy.URL( drivername="postgresql+asyncpg", username=self.engine.pmr_credentials.username, password=self.engine.pmr_credentials.password, diff --git a/tests/fixture/database/test_database.py b/tests/fixture/database/test_database.py index e6620050..4234cde7 100644 --- a/tests/fixture/database/test_database.py +++ b/tests/fixture/database/test_database.py @@ -1,8 +1,8 @@ import pytest from sqlalchemy import create_engine, text -from sqlalchemy.engine.url import URL from pytest_mock_resources import ( + compat, create_mysql_fixture, create_postgres_fixture, create_redshift_fixture, @@ -89,7 +89,7 @@ def test_create_custom_connection_from_dict(postgres_3): def test_create_custom_connection_url(postgres_3): - url = URL(**postgres_3.pmr_credentials.as_sqlalchemy_url_kwargs()) + url = compat.sqlalchemy.URL(**postgres_3.pmr_credentials.as_sqlalchemy_url_kwargs()) engine = create_engine(url, isolation_level="AUTOCOMMIT") engine.execute("select 1")