66import os
77import shutil
88import sys
9- from typing import Optional
10- from typing import Sequence
119
1210import nox
1311from packaging .version import parse as parse_version
3432]
3533DATABASES = ["sqlite" , "postgresql" , "mysql" , "oracle" , "mssql" ]
3634SQLALCHEMY_VERSIONS = ["default" , "sqla14" , "sqla20" , "sqlamain" ]
35+ BACKEND = ["_nobackend" , "backendonly" ]
3736
3837pyproject = nox .project .load_toml ("pyproject.toml" )
3938
4241
4342
4443def filter_sqla (
45- python : str , sqlalchemy : str , database : Optional [str ] = None
44+ python : str ,
45+ sqlalchemy : str ,
46+ database : str | None = None ,
47+ backendonly : str | None = None ,
4648) -> bool :
4749 python_version = parse_version (python .rstrip ("t" ))
4850 if sqlalchemy == "sqla14" :
@@ -55,40 +57,52 @@ def filter_sqla(
5557
5658@nox .session ()
5759@tox_parameters (
58- ["python" , "sqlalchemy" , "database" ],
59- [PYTHON_VERSIONS , SQLALCHEMY_VERSIONS , DATABASES ],
60+ ["python" , "sqlalchemy" , "database" , "backendonly" ],
61+ [PYTHON_VERSIONS , SQLALCHEMY_VERSIONS , DATABASES , BACKEND ],
6062 filter_ = filter_sqla ,
6163)
6264def tests (
63- session : nox .Session , python : str , sqlalchemy : str , database : str
65+ session : nox .Session ,
66+ python : str ,
67+ sqlalchemy : str ,
68+ database : str ,
69+ backendonly : str ,
6470) -> None :
6571 """Run the main test suite against one database at a time"""
6672
67- _tests (session , sqlalchemy , [database ], python = python )
73+ _tests (
74+ session ,
75+ sqlalchemy ,
76+ database ,
77+ python = python ,
78+ backendonly = backendonly == "backendonly" ,
79+ )
6880
6981
7082@nox .session (name = "coverage" )
7183@tox_parameters (["database" ], [DATABASES ], base_tag = "coverage" )
7284def coverage (session : nox .Session , database : str ) -> None :
7385 """Run tests with coverage."""
7486
75- _tests (session , "default" , [ database ] , coverage = True )
87+ _tests (session , "default" , database , coverage = True )
7688
7789
7890def _tests (
7991 session : nox .Session ,
8092 sqlalchemy : str ,
81- databases : Sequence [ str ] ,
93+ database : str ,
8294 * ,
8395 python : str = OUR_PYTHON ,
8496 coverage : bool = False ,
97+ backendonly : bool = False ,
8598) -> None :
86- if sqlalchemy == "sqla14" :
87- session .install (f"{ SQLA_REPO } @rel_1_4#egg=sqlalchemy" )
88- elif sqlalchemy == "sqla20" :
89- session .install (f"{ SQLA_REPO } @rel_2_0#egg=sqlalchemy" )
90- elif sqlalchemy == "sqlamain" :
91- session .install (f"{ SQLA_REPO } #egg=sqlalchemy" )
99+ match sqlalchemy :
100+ case "sqla14" :
101+ session .install (f"{ SQLA_REPO } @rel_1_4#egg=sqlalchemy" )
102+ case "sqla20" :
103+ session .install (f"{ SQLA_REPO } @rel_2_0#egg=sqlalchemy" )
104+ case "sqlamain" :
105+ session .install (f"{ SQLA_REPO } #egg=sqlalchemy" )
92106
93107 # for sqlalchemy == "default", the alembic install will install
94108 # current released SQLAlchemy version as a dependency
@@ -120,22 +134,22 @@ def _tests(
120134
121135 cmd .extend (os .environ .get ("TOX_WORKERS" , "-n4" ).split ())
122136
123- for database in databases :
124- if database == "sqlite" :
137+ match database :
138+ case "sqlite" :
125139 cmd .extend (os .environ .get ("TOX_SQLITE" , "--db sqlite" ).split ())
126- elif database == "postgresql" :
140+ case "postgresql" :
127141 session .install (
128142 * nox .project .dependency_groups (pyproject , "tests_postgresql" )
129143 )
130144 cmd .extend (
131145 os .environ .get ("TOX_POSTGRESQL" , "--db postgresql" ).split ()
132146 )
133- elif database == "mysql" :
147+ case "mysql" :
134148 session .install (
135149 * nox .project .dependency_groups (pyproject , "tests_mysql" )
136150 )
137151 cmd .extend (os .environ .get ("TOX_MYSQL" , "--db mysql" ).split ())
138- elif database == "oracle" :
152+ case "oracle" :
139153 # we'd like to use oracledb but SQLAlchemy 1.4 does not have
140154 # oracledb support...
141155 session .install (
@@ -147,23 +161,21 @@ def _tests(
147161 session .env ["NLS_LANG" ] = os .environ .get ("NLS_LANG" )
148162 cmd .extend (os .environ .get ("TOX_ORACLE" , "--db oracle" ).split ())
149163 cmd .extend ("--write-idents db_idents.txt" .split ())
150- elif database == "mssql" :
164+ case "mssql" :
151165 session .install (
152166 * nox .project .dependency_groups (pyproject , "tests_mssql" )
153167 )
154168 cmd .extend (os .environ .get ("TOX_MSSQL" , "--db mssql" ).split ())
155169 cmd .extend ("--write-idents db_idents.txt" .split ())
156170
171+ if backendonly :
172+ cmd .append ("--backend-only" )
173+
157174 posargs , opts = extract_opts (session .posargs , "generate-junit" )
158175
159176 if opts .generate_junit :
160- # produce individual junit files that are per-database (or as close
161- # as we can get). jenkins junit plugin will merge all the files...
162- if len (databases ) == 1 :
163- tag = "-" .join (databases )
164- junitfile = f"junit-{ tag } .xml"
165- else :
166- junitfile = "junit-general.xml"
177+ # produce individual junit files that are per-database
178+ junitfile = f"junit-{ database } .xml"
167179 cmd .extend (["--junitxml" , junitfile ])
168180
169181 cmd .extend (posargs )
@@ -172,9 +184,8 @@ def _tests(
172184 session .run (* cmd )
173185 finally :
174186 # Run cleanup for oracle/mssql
175- for database in databases :
176- if database in ["oracle" , "mssql" ]:
177- session .run ("python" , "reap_dbs.py" , "db_idents.txt" )
187+ if database in ["oracle" , "mssql" ]:
188+ session .run ("python" , "reap_dbs.py" , "db_idents.txt" )
178189
179190 # Clean up scratch directories
180191 for scratch_dir in glob ("scratch*" ):
@@ -232,7 +243,7 @@ def test_pyoptimize(session: nox.Session) -> None:
232243
233244 posargs , opts = extract_opts (session .posargs , "generate-junit" )
234245 if opts .generate_junit :
235- cmd .extend (["--junitxml" , "junit-general .xml" ])
246+ cmd .extend (["--junitxml" , "junit-pyoptimize .xml" ])
236247
237248 cmd .extend (posargs )
238249
0 commit comments