From: Mike Bayer Date: Sat, 14 May 2022 14:25:53 +0000 (-0400) Subject: adjust log stacklevel for py3.11.0b1; enable greenlet X-Git-Tag: rel_2_0_0b1~314 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=257de6ebe15d3076e19f05f93c5b3c7fae25a4d3;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git adjust log stacklevel for py3.11.0b1; enable greenlet Fixed issue where support for logging "stacklevel" implemented in :ticket:`7612` required adjustment to work with recently released Python 3.11.0b1, also repairs the unit tests which tested this feature. Install greenlet from a py311 compat patch. re: the stacklevel thing, this is going to be very inconvenient if we have to keep hardcoding numbers everywhere for every new python version Change-Id: I0c8f7293e98c0ca5cc544538284bfd1d3020cb1f References: https://github.com/python-greenlet/greenlet/issues/288 Fixes: #8019 --- diff --git a/doc/build/changelog/unreleased_14/8019.rst b/doc/build/changelog/unreleased_14/8019.rst new file mode 100644 index 0000000000..854703bcea --- /dev/null +++ b/doc/build/changelog/unreleased_14/8019.rst @@ -0,0 +1,7 @@ +.. change:: + :tags: bug, engine, tests + :tickets: 8019 + + Fixed issue where support for logging "stacklevel" implemented in + :ticket:`7612` required adjustment to work with recently released Python + 3.11.0b1, also repairs the unit tests which tested this feature. diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index fe3bfa1adf..80e458e7c0 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -187,8 +187,8 @@ class Connection(ConnectionEventsTarget, inspection.Inspectable["Inspector"]): if fmt: message = fmt(message) - if util.py38: - kw["stacklevel"] = 2 + if log.STACKLEVEL: + kw["stacklevel"] = 1 + log.STACKLEVEL_OFFSET self.engine.logger.info(message, *arg, **kw) @@ -198,8 +198,8 @@ class Connection(ConnectionEventsTarget, inspection.Inspectable["Inspector"]): if fmt: message = fmt(message) - if util.py38: - kw["stacklevel"] = 2 + if log.STACKLEVEL: + kw["stacklevel"] = 1 + log.STACKLEVEL_OFFSET self.engine.logger.debug(message, *arg, **kw) diff --git a/lib/sqlalchemy/log.py b/lib/sqlalchemy/log.py index d463f5b9a3..f7050b93fb 100644 --- a/lib/sqlalchemy/log.py +++ b/lib/sqlalchemy/log.py @@ -29,9 +29,20 @@ from typing import Type from typing import TypeVar from typing import Union +from .util import py311 from .util import py38 from .util.typing import Literal + +if py38: + STACKLEVEL = True + # needed as of py3.11.0b1 + # #8019 + STACKLEVEL_OFFSET = 2 if py311 else 1 +else: + STACKLEVEL = False + STACKLEVEL_OFFSET = 0 + _IT = TypeVar("_IT", bound="Identified") _EchoFlagType = Union[None, bool, Literal["debug"]] @@ -191,8 +202,11 @@ class InstanceLogger: selected_level = self.logger.getEffectiveLevel() if level >= selected_level: - if py38: - kwargs["stacklevel"] = kwargs.get("stacklevel", 1) + 1 + + if STACKLEVEL: + kwargs["stacklevel"] = ( + kwargs.get("stacklevel", 1) + STACKLEVEL_OFFSET + ) self.logger._log(level, msg, args, **kwargs) diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py index 234f823c68..e63a3e1917 100644 --- a/lib/sqlalchemy/testing/requirements.py +++ b/lib/sqlalchemy/testing/requirements.py @@ -1418,6 +1418,10 @@ class SuiteRequirements(Requirements): return exclusions.closed() + @property + def asyncio(self): + return self.greenlet + @property def greenlet(self): def go(config): diff --git a/lib/sqlalchemy/util/__init__.py b/lib/sqlalchemy/util/__init__.py index 6d41231d98..756b93bb47 100644 --- a/lib/sqlalchemy/util/__init__.py +++ b/lib/sqlalchemy/util/__init__.py @@ -59,6 +59,7 @@ from .compat import has_refcount_gc as has_refcount_gc from .compat import inspect_getfullargspec as inspect_getfullargspec from .compat import local_dataclass_fields as local_dataclass_fields from .compat import osx as osx +from .compat import py311 as py311 from .compat import py38 as py38 from .compat import py39 as py39 from .compat import pypy as pypy diff --git a/test/ext/asyncio/test_engine_py3k.py b/test/ext/asyncio/test_engine_py3k.py index 462d0900f9..23c422bcf4 100644 --- a/test/ext/asyncio/test_engine_py3k.py +++ b/test/ext/asyncio/test_engine_py3k.py @@ -1010,6 +1010,8 @@ class AsyncResultTest(EngineFixture): class TextSyncDBAPI(fixtures.TestBase): + __requires__ = ("asyncio",) + def test_sync_dbapi_raises(self): with expect_raises_message( exc.InvalidRequestError, diff --git a/test/requirements.py b/test/requirements.py index 87fcf7e9dc..ba256c4dd7 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -1315,7 +1315,7 @@ class DefaultRequirements(SuiteRequirements): def async_dialect(self): """dialect makes use of await_() to invoke operations on the DBAPI.""" - return only_on( + return self.asyncio + only_on( LambdaPredicate( lambda config: config.db.dialect.is_async, "Async dialect required", diff --git a/tox.ini b/tox.ini index fb14a95545..21cdbdf45d 100644 --- a/tox.ini +++ b/tox.ini @@ -14,8 +14,9 @@ deps= pytest>=7.0.0rc1,<8 pytest-xdist + # cython and greenlet both not working on 3.11 # note cython not working for 3.11 at all right now - git+https://github.com/python-greenlet/greenlet.git#egg=greenlet; python_version >= '3.11' + git+https://github.com/sqlalchemyorg/greenlet/@fix_py311_cpp#egg=greenlet; python_version >= '3.11' sqlite: .[aiosqlite] sqlite_file: .[aiosqlite] @@ -89,8 +90,11 @@ setenv= sqlite: SQLITE={env:TOX_SQLITE:--db sqlite} sqlite_file: SQLITE={env:TOX_SQLITE_FILE:--db sqlite_file} + py3{,7,8,9,10,11}-sqlite: EXTRA_SQLITE_DRIVERS={env:EXTRA_SQLITE_DRIVERS:--dbdriver sqlite --dbdriver aiosqlite} + py3{,7,8,9}-sqlite_file: EXTRA_SQLITE_DRIVERS={env:EXTRA_SQLITE_DRIVERS:--dbdriver sqlite --dbdriver aiosqlite --dbdriver pysqlcipher} + # omit pysqlcipher for Python 3.10 py3{,10,11}-sqlite_file: EXTRA_SQLITE_DRIVERS={env:EXTRA_SQLITE_DRIVERS:--dbdriver sqlite --dbdriver aiosqlite}