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_1_4_37~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=067102a304012ce6afd0097627d5717994930488;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 (cherry picked from commit 43ff5b82dc0d91cacd625ac8943622ab340958c5) --- 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 eca4a9e10a..1507e159ed 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -133,8 +133,8 @@ class Connection(Connectable): 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) @@ -144,8 +144,8 @@ class Connection(Connectable): 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 07c5eff287..cc662ecf99 100644 --- a/lib/sqlalchemy/log.py +++ b/lib/sqlalchemy/log.py @@ -21,8 +21,18 @@ instance only. import logging import sys +from .util import py311 from .util import py38 +if py38: + STACKLEVEL = True + # needed as of py3.11.0b1 + # #8019 + STACKLEVEL_OFFSET = 2 if py311 else 1 +else: + STACKLEVEL = False + STACKLEVEL_OFFSET = 0 + # set initial level to WARN. This so that # log statements don't occur in the absence of explicit # logging being enabled for 'sqlalchemy'. @@ -161,8 +171,10 @@ class InstanceLogger(object): 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 49e3cefb41..b3f7ddb502 100644 --- a/lib/sqlalchemy/testing/requirements.py +++ b/lib/sqlalchemy/testing/requirements.py @@ -1382,6 +1382,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 497edb3b17..33427e3b50 100644 --- a/lib/sqlalchemy/util/__init__.py +++ b/lib/sqlalchemy/util/__init__.py @@ -77,6 +77,7 @@ from .compat import perf_counter from .compat import pickle from .compat import print_ from .compat import py2k +from .compat import py311 from .compat import py37 from .compat import py38 from .compat import py39 diff --git a/lib/sqlalchemy/util/compat.py b/lib/sqlalchemy/util/compat.py index c60d884214..21a9491f8e 100644 --- a/lib/sqlalchemy/util/compat.py +++ b/lib/sqlalchemy/util/compat.py @@ -14,6 +14,7 @@ import operator import platform import sys +py311 = sys.version_info >= (3, 11) py39 = sys.version_info >= (3, 9) py38 = sys.version_info >= (3, 8) py37 = sys.version_info >= (3, 7) diff --git a/test/ext/asyncio/test_engine_py3k.py b/test/ext/asyncio/test_engine_py3k.py index 9340f0828d..d8d9e70211 100644 --- a/test/ext/asyncio/test_engine_py3k.py +++ b/test/ext/asyncio/test_engine_py3k.py @@ -983,6 +983,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 4c9ac40c54..dda8fd6cbb 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -1439,7 +1439,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 2000351716..43eb04d817 100644 --- a/tox.ini +++ b/tox.ini @@ -21,6 +21,10 @@ deps= pytest-xdist mock; python_version < '3.3' + # cython and greenlet both not working on 3.11 + # note cython not working for 3.11 at all right now + git+https://github.com/sqlalchemyorg/greenlet/@fix_py311_cpp#egg=greenlet; python_version >= '3.11' + sqlite: .[aiosqlite] sqlite_file: .[aiosqlite] sqlite_file: .[sqlcipher]; python_version >= '3' and python_version < '3.10'