From: Mike Bayer Date: Sat, 9 Dec 2023 15:43:37 +0000 (-0500) Subject: ensure test suite runs w/o greenlet X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2f972b6221ba271d16bbab5aa299a25f427a3710;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git ensure test suite runs w/o greenlet 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 --- diff --git a/doc/build/changelog/unreleased_20/10747.rst b/doc/build/changelog/unreleased_20/10747.rst new file mode 100644 index 0000000000..ac8133ac73 --- /dev/null +++ b/doc/build/changelog/unreleased_20/10747.rst @@ -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). diff --git a/lib/sqlalchemy/testing/provision.py b/lib/sqlalchemy/testing/provision.py index dcea52d3ba..884d558138 100644 --- a/lib/sqlalchemy/testing/provision.py +++ b/lib/sqlalchemy/testing/provision.py @@ -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: diff --git a/lib/sqlalchemy/util/concurrency.py b/lib/sqlalchemy/util/concurrency.py index df5e03ae19..575d249c9f 100644 --- a/lib/sqlalchemy/util/concurrency.py +++ b/lib/sqlalchemy/util/concurrency.py @@ -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 bcba1190b2..4c3cca1f76 100644 --- 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