]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
ensure test suite runs w/o greenlet
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 9 Dec 2023 15:43:37 +0000 (10:43 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 9 Dec 2023 22:36:47 +0000 (17:36 -0500)
This is a reopen of #6136 essentially that repaired the
test suite to run without greenlet but now this has regressed.
add a tox target that explicitly uninstalls greenlet, will
add to CI.

This also changes 2.0 in that the full tox target will
omit dbdrivers that require greenlet.

Fixes: #10747
Change-Id: Ia7d786d781e591539a388bfbe17b00a59f0e86d9

doc/build/changelog/unreleased_20/10747.rst [new file with mode: 0644]
lib/sqlalchemy/testing/provision.py
lib/sqlalchemy/util/concurrency.py
tox.ini

diff --git a/doc/build/changelog/unreleased_20/10747.rst b/doc/build/changelog/unreleased_20/10747.rst
new file mode 100644 (file)
index 0000000..ac8133a
--- /dev/null
@@ -0,0 +1,9 @@
+.. change::
+    :tags: bug, tests
+    :tickets: 10747
+
+    Improvements to the test suite to further harden its ability to run
+    when Python ``greenlet`` is not installed.   There is now a tox
+    target that includes the token "nogreenlet" that will run the suite
+    with greenlet not installed (note that it still temporarily installs
+    greenlet as part of the tox config, however).
index dcea52d3ba1100417cc3df16a727abf968b9971b..884d558138af079b013dd784cd0a12030df0dd3c 100644 (file)
@@ -74,6 +74,7 @@ def setup_config(db_url, options, file_config, follower_ident):
     # hooks
 
     dialect = sa_url.make_url(db_url).get_dialect()
+
     dialect.load_provisioning()
 
     if follower_ident:
index df5e03ae19c26e8e4090ba13b436db8abfae99d4..575d249c9ff43498284c80d42a3cef44af02899d 100644 (file)
@@ -84,6 +84,10 @@ class _concurrency_shim_cls:
             from greenlet import getcurrent
             from greenlet import greenlet
         except ImportError as e:
+            if not TYPE_CHECKING:
+                # set greenlet in the global scope to prevent re-init
+                greenlet = None
+
             self._initialize_no_greenlet()
             if raise_:
                 raise ImportError(_ERROR_MESSAGE) from e
@@ -313,7 +317,6 @@ def _util_async_run(fn: Callable[..., Any], *args: Any, **kwargs: Any) -> Any:
     """for test suite/ util only"""
 
     _util_async_run = _concurrency_shim._util_async_run
-
     return _util_async_run(fn, *args, **kwargs)
 
 
diff --git a/tox.ini b/tox.ini
index bcba1190b2a1a1a2a83d0d12c2b1c397931cff69..4c3cca1f76a24df20c2d7a75fd96b16a564194db 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -117,6 +117,7 @@ setenv=
     sqlite_file: SQLITE={env:TOX_SQLITE_FILE:--db sqlite_file}
 
     sqlite: EXTRA_SQLITE_DRIVERS={env:EXTRA_SQLITE_DRIVERS:--dbdriver sqlite --dbdriver pysqlite_numeric --dbdriver aiosqlite}
+    sqlite-nogreenlet: EXTRA_SQLITE_DRIVERS={env:EXTRA_SQLITE_DRIVERS:--dbdriver sqlite --dbdriver pysqlite_numeric}
 
     py{37,38,39}-sqlite_file: EXTRA_SQLITE_DRIVERS={env:EXTRA_SQLITE_DRIVERS:--dbdriver sqlite --dbdriver aiosqlite --dbdriver pysqlcipher}
 
@@ -126,6 +127,7 @@ setenv=
     postgresql: POSTGRESQL={env:TOX_POSTGRESQL:--db postgresql}
 
     postgresql: EXTRA_PG_DRIVERS={env:EXTRA_PG_DRIVERS:--dbdriver psycopg2 --dbdriver asyncpg --dbdriver pg8000 --dbdriver psycopg --dbdriver psycopg_async}
+    postgresql-nogreenlet: EXTRA_PG_DRIVERS={env:EXTRA_PG_DRIVERS:--dbdriver psycopg2 --dbdriver pg8000 --dbdriver psycopg}
 
     # limit driver list for memusage target
     memusage: EXTRA_SQLITE_DRIVERS={env:EXTRA_SQLITE_DRIVERS:--dbdriver sqlite}
@@ -135,10 +137,13 @@ setenv=
 
     mysql: MYSQL={env:TOX_MYSQL:--db mysql}
     mysql: EXTRA_MYSQL_DRIVERS={env:EXTRA_MYSQL_DRIVERS:--dbdriver mysqldb --dbdriver pymysql --dbdriver asyncmy --dbdriver aiomysql --dbdriver mariadbconnector}
+    mysql-nogreenlet: EXTRA_MYSQL_DRIVERS={env:EXTRA_MYSQL_DRIVERS:--dbdriver mysqldb --dbdriver pymysql --dbdriver mariadbconnector}
 
     mssql: MSSQL={env:TOX_MSSQL:--db mssql}
     py{3,38,39,310,311}-mssql: EXTRA_MSSQL_DRIVERS={env:EXTRA_MSSQL_DRIVERS:--dbdriver pyodbc --dbdriver aioodbc --dbdriver pymssql}
+    py{3,38,39,310,311}-mssql-nogreenlet: EXTRA_MSSQL_DRIVERS={env:EXTRA_MSSQL_DRIVERS:--dbdriver pyodbc --dbdriver pymssql}
     py312-mssql: EXTRA_MSSQL_DRIVERS={env:EXTRA_MSSQL_DRIVERS:--dbdriver pyodbc  --dbdriver aioodbc}
+    py312-mssql-nogreenlet: EXTRA_MSSQL_DRIVERS={env:EXTRA_MSSQL_DRIVERS:--dbdriver pyodbc}
 
     oracle,mssql,sqlite_file: IDENTS=--write-idents db_idents.txt
 
@@ -167,7 +172,7 @@ commands=
   # this line is only meaningful when usedevelop=True is enabled.  we use
   # that flag for coverage mode.
   nocext: sh -c "rm -f lib/sqlalchemy/*.so"
-
+  nogreenlet: pip uninstall -y greenlet
   {env:BASECOMMAND} {env:WORKERS} {env:SQLITE:} {env:EXTRA_SQLITE_DRIVERS:} {env:POSTGRESQL:} {env:EXTRA_PG_DRIVERS:} {env:MYSQL:} {env:EXTRA_MYSQL_DRIVERS:} {env:ORACLE:} {env:EXTRA_ORACLE_DRIVERS:} {env:MSSQL:} {env:EXTRA_MSSQL_DRIVERS:} {env:IDENTS:} {env:PYTEST_EXCLUDES:} {env:COVERAGE:} {posargs}
   oracle,mssql,sqlite_file: python reap_dbs.py db_idents.txt