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" ]
16- VENV_BACKEND = "venv"
1716VENV_PATH = ".venv"
1817REQUIREMENTS_PATH = "./requirements"
1918
3231 "./**/*.pyo" ,
3332]
3433
35-
3634# Define the default sessions run when `nox` is called on the CLI
35+ nox .options .default_venv_backend = "virtualenv"
3736nox .options .sessions = [
38- "version_coverage" ,
39- "coverage_combine" ,
37+ "test" ,
4038 "mypy" ,
4139]
4240
@@ -73,33 +71,40 @@ def dev(session: nox.Session) -> None:
7371 session .log (f"\n \n Run '{ activate_command } ' to enter the virtual environment.\n " )
7472
7573
76- @nox .session (python = PYTHON_MATRIX , venv_backend = VENV_BACKEND )
77- def version_coverage (session : nox .Session ) -> None :
78- """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 ."""
7977 print_standard_logs (session )
8078
8179 session .install ("." )
82- session .install ("-r" , "requirements/requirements.txt" )
83- session .install ("-r" , "requirements/requirements-test.txt" )
84- session .run ("coverage" , "run" , "-p" , "-m" , "pytest" , TESTS_PATH )
80+ session .install ("-r" , f"{ REQUIREMENTS_PATH } /requirements-test.txt" )
81+
82+ coverage = partial (session .run , "python" , "-m" , "coverage" )
83+
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" )
8592
8693
87- @nox .session (python = DEFAULT_PYTHON , venv_backend = VENV_BACKEND )
94+ @nox .session ()
8895def coverage_combine (session : nox .Session ) -> None :
89- """Combine all coverage partial files and generate JSON report ."""
96+ """CI: Combine parallel-mode coverage files and produce reports ."""
9097 print_standard_logs (session )
9198
92- fail_under = f"--fail-under= { COVERAGE_FAIL_UNDER } "
99+ session . install ( "-r" , f" { REQUIREMENTS_PATH } /requirements-test.txt" )
93100
94- session .install ("." )
95- session .install ("-r" , "requirements/requirements.txt" )
96- session .install ("-r" , "requirements/requirements-test.txt" )
97- session .run ("python" , "-m" , "coverage" , "combine" )
98- session .run ("python" , "-m" , "coverage" , "report" , "-m" , fail_under )
99- 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" )
100105
101106
102- @nox .session (python = DEFAULT_PYTHON , venv_backend = VENV_BACKEND )
107+ @nox .session (python = DEFAULT_PYTHON )
103108def mypy (session : nox .Session ) -> None :
104109 """Run mypy against package and all required dependencies."""
105110 print_standard_logs (session )
@@ -110,15 +115,7 @@ def mypy(session: nox.Session) -> None:
110115 session .run ("mypy" , "-p" , MODULE_NAME , "--no-incremental" )
111116
112117
113- @nox .session (python = False , venv_backend = VENV_BACKEND )
114- def coverage (session : nox .Session ) -> None :
115- """Generate a coverage report. Does not use a venv."""
116- session .run ("coverage" , "erase" )
117- session .run ("coverage" , "run" , "-m" , "pytest" , TESTS_PATH )
118- session .run ("coverage" , "report" , "-m" )
119-
120-
121- @nox .session (python = DEFAULT_PYTHON , venv_backend = VENV_BACKEND )
118+ @nox .session (python = DEFAULT_PYTHON )
122119def build (session : nox .Session ) -> None :
123120 """Build distribution files."""
124121 print_standard_logs (session )
@@ -127,7 +124,7 @@ def build(session: nox.Session) -> None:
127124 session .run ("python" , "-m" , "build" )
128125
129126
130- @nox .session (python = DEFAULT_PYTHON , venv_backend = VENV_BACKEND , name = "update-deps" )
127+ @nox .session (python = DEFAULT_PYTHON , name = "update-deps" )
131128def update_deps (session : nox .Session ) -> None :
132129 """Process requirement*.txt files, updating only additions/removals."""
133130 print_standard_logs (session )
@@ -145,7 +142,7 @@ def update_deps(session: nox.Session) -> None:
145142 )
146143
147144
148- @nox .session (python = DEFAULT_PYTHON , venv_backend = VENV_BACKEND , name = "upgrade-deps" )
145+ @nox .session (python = DEFAULT_PYTHON , name = "upgrade-deps" )
149146def upgrade_deps (session : nox .Session ) -> None :
150147 """Process requirement*.txt files and upgrade all libraries as possible."""
151148 print_standard_logs (session )
@@ -164,7 +161,7 @@ def upgrade_deps(session: nox.Session) -> None:
164161 )
165162
166163
167- @nox .session (python = False , venv_backend = VENV_BACKEND )
164+ @nox .session (python = False )
168165def clean (_ : nox .Session ) -> None :
169166 """Clean cache, .pyc, .pyo, and test/build artifact files from project."""
170167 count = 0
0 commit comments