]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
adjust log stacklevel for py3.11.0b1; enable greenlet
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 14 May 2022 14:25:53 +0000 (10:25 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 15 May 2022 14:33:03 +0000 (10:33 -0400)
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)

doc/build/changelog/unreleased_14/8019.rst [new file with mode: 0644]
lib/sqlalchemy/engine/base.py
lib/sqlalchemy/log.py
lib/sqlalchemy/testing/requirements.py
lib/sqlalchemy/util/__init__.py
lib/sqlalchemy/util/compat.py
test/ext/asyncio/test_engine_py3k.py
test/requirements.py
tox.ini

diff --git a/doc/build/changelog/unreleased_14/8019.rst b/doc/build/changelog/unreleased_14/8019.rst
new file mode 100644 (file)
index 0000000..854703b
--- /dev/null
@@ -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.
index eca4a9e10aa84b7fa200d1d0d3ce1d20e96f0f0a..1507e159ed60d54027a0b25904550cda4e633718 100644 (file)
@@ -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)
 
index 07c5eff287c0933bb3c5c5c99ff757e344ffe717..cc662ecf9965385b245446a5a79baef4d503d63d 100644 (file)
@@ -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)
 
index 49e3cefb41337ad25595af07506caa3abc44bb4d..b3f7ddb502e64b507613bb6430fdcfbea7b557ce 100644 (file)
@@ -1382,6 +1382,10 @@ class SuiteRequirements(Requirements):
 
         return exclusions.closed()
 
+    @property
+    def asyncio(self):
+        return self.greenlet
+
     @property
     def greenlet(self):
         def go(config):
index 497edb3b17200a73c08a12c439c7e1cf0b147fb3..33427e3b504faae34d7b775712a12969f2302734 100644 (file)
@@ -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
index c60d884214741cb0fb601d50f269f38ae7adc152..21a9491f8e671d52377240cb3b02a824f8fd3d93 100644 (file)
@@ -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)
index 9340f0828ddb66aa69d85858d6b7f783f053303f..d8d9e702113ea8198f1be8de27f2f227ea81bfc1 100644 (file)
@@ -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,
index 4c9ac40c54df7a8f687974f8221711b7a7b09232..dda8fd6cbb7c60c087807497364b25005195622f 100644 (file)
@@ -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 2000351716b2d5396ff50365d9af8ae98d9f46b2..43eb04d8174c8a5c121f26d8d168bb52cadf5c5a 100644 (file)
--- 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'