Skip to content

Commit

Permalink
ensure test suite runs w/o greenlet
Browse files Browse the repository at this point in the history
This is a reopen of sqlalchemy#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: sqlalchemy#10747
Change-Id: Ia7d786d781e591539a388bfbe17b00a59f0e86d9
  • Loading branch information
zzzeek committed Dec 9, 2023
1 parent 86f335c commit 2f972b6
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 2 deletions.
9 changes: 9 additions & 0 deletions doc/build/changelog/unreleased_20/10747.rst
Original file line number Diff line number Diff line change
@@ -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).
1 change: 1 addition & 0 deletions lib/sqlalchemy/testing/provision.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
5 changes: 4 additions & 1 deletion lib/sqlalchemy/util/concurrency.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ def _initialize(self, *, raise_: bool = True) -> None:
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
Expand Down Expand Up @@ -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)


Expand Down
7 changes: 6 additions & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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}

Expand All @@ -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}
Expand All @@ -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

Expand Down Expand Up @@ -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

Expand Down

0 comments on commit 2f972b6

Please sign in to comment.