44import pathlib
55import shutil
66import sys
7+ from functools import partial
78
89import nox
910
1213TESTS_PATH = "tests"
1314COVERAGE_FAIL_UNDER = 50
1415DEFAULT_PYTHON = "3.12"
15- PYTHON_MATRIX = ["3.9" , "3.10" , "3.11" , "3.12" , "3.13" ]
1616VENV_PATH = ".venv"
1717REQUIREMENTS_PATH = "./requirements"
1818
3232]
3333
3434# Define the default sessions run when `nox` is called on the CLI
35- nox .options .default_venv_backend = "uv| virtualenv"
35+ nox .options .default_venv_backend = "virtualenv"
3636nox .options .sessions = [
37- "version_coverage" ,
38- "coverage_combine" ,
37+ "test" ,
3938 "mypy" ,
4039]
4140
@@ -72,30 +71,37 @@ def dev(session: nox.Session) -> None:
7271 session .log (f"\n \n Run '{ activate_command } ' to enter the virtual environment.\n " )
7372
7473
75- @nox .session (python = PYTHON_MATRIX )
76- def version_coverage (session : nox .Session ) -> None :
77- """Run unit tests with coverage saved to partial file ."""
74+ @nox .session (name = "test" )
75+ def run_tests_with_coverage (session : nox .Session ) -> None :
76+ """Run pytest with coverage, outputs console report and json ."""
7877 print_standard_logs (session )
7978
8079 session .install ("." )
81- session .install ("-r" , "requirements/requirements.txt" )
82- session .install ("-r" , "requirements/requirements-test.txt" )
83- session .run ("coverage" , "run" , "-p" , "-m" , "pytest" , TESTS_PATH )
80+ session .install ("-r" , f"{ REQUIREMENTS_PATH } /requirements-test.txt" )
8481
82+ coverage = partial (session .run , "python" , "-m" , "coverage" )
8583
86- @nox .session (python = DEFAULT_PYTHON )
84+ coverage ("erase" )
85+
86+ if "partial-coverage" in session .posargs :
87+ coverage ("run" , "--parallel-mode" , "--module" , "pytest" , TESTS_PATH )
88+ else :
89+ coverage ("run" , "--module" , "pytest" , TESTS_PATH )
90+ coverage ("report" , "--show-missing" , f"--fail-under={ COVERAGE_FAIL_UNDER } " )
91+ coverage ("json" )
92+
93+
94+ @nox .session ()
8795def coverage_combine (session : nox .Session ) -> None :
88- """Combine all coverage partial files and generate JSON report ."""
96+ """CI: Combine parallel-mode coverage files and produce reports ."""
8997 print_standard_logs (session )
9098
91- fail_under = f"--fail-under= { COVERAGE_FAIL_UNDER } "
99+ session . install ( "-r" , f" { REQUIREMENTS_PATH } /requirements-test.txt" )
92100
93- session .install ("." )
94- session .install ("-r" , "requirements/requirements.txt" )
95- session .install ("-r" , "requirements/requirements-test.txt" )
96- session .run ("python" , "-m" , "coverage" , "combine" )
97- session .run ("python" , "-m" , "coverage" , "report" , "-m" , fail_under )
98- session .run ("python" , "-m" , "coverage" , "json" )
101+ coverage = partial (session .run , "python" , "-m" , "coverage" )
102+ coverage ("combine" )
103+ coverage ("report" , "--show-missing" , f"--fail-under={ COVERAGE_FAIL_UNDER } " )
104+ coverage ("json" )
99105
100106
101107@nox .session (python = DEFAULT_PYTHON )
@@ -109,14 +115,6 @@ def mypy(session: nox.Session) -> None:
109115 session .run ("mypy" , "-p" , MODULE_NAME , "--no-incremental" )
110116
111117
112- @nox .session (python = False )
113- def coverage (session : nox .Session ) -> None :
114- """Generate a coverage report. Does not use a venv."""
115- session .run ("coverage" , "erase" )
116- session .run ("coverage" , "run" , "-m" , "pytest" , TESTS_PATH )
117- session .run ("coverage" , "report" , "-m" )
118-
119-
120118@nox .session (python = DEFAULT_PYTHON )
121119def build (session : nox .Session ) -> None :
122120 """Build distribution files."""
0 commit comments