| """Notes: |
| * 'test' command: nox will use poetry.lock to determine dependency versions |
| * 'lint' command: tools and environments are managed by pre-commit |
| * All other commands: the current environment will be used instead of creating new ones |
| """ |
| from os.path import join |
| from shutil import rmtree |
| |
| import nox |
| from nox_poetry import session |
| |
| nox.options.reuse_existing_virtualenvs = True |
| nox.options.sessions = ['lint', 'cov'] |
| |
| LIVE_DOCS_PORT = 8181 |
| LIVE_DOCS_IGNORE = ['*.pyc', '*.tmp', join('**', 'modules', '*')] |
| LIVE_DOCS_WATCH = ['requests_cache', 'examples'] |
| CLEAN_DIRS = ['dist', 'build', join('docs', '_build'), join('docs', 'modules')] |
| |
| UNIT_TESTS = join('tests', 'unit') |
| INTEGRATION_TESTS = join('tests', 'integration') |
| COVERAGE_ARGS = ( |
| '--cov --cov-report=term --cov-report=html' # Generate HTML + stdout coverage report |
| ) |
| XDIST_ARGS = '--numprocesses=auto --dist=loadfile' # Run tests in parallel, grouped by test module |
| |
| |
| @session(python=['3.7', '3.8', '3.9', '3.10']) |
| def test(session): |
| """Run tests for a specific python version""" |
| test_paths = session.posargs or [UNIT_TESTS] |
| session.install('.', 'pytest', 'pytest-xdist', 'requests-mock', 'timeout-decorator') |
| |
| cmd = f'pytest -rs {XDIST_ARGS}' |
| session.run(*cmd.split(' '), *test_paths) |
| |
| |
| @session(python=False) |
| def clean(session): |
| """Clean up temporary build + documentation files""" |
| for dir in CLEAN_DIRS: |
| print(f'Removing {dir}') |
| rmtree(dir, ignore_errors=True) |
| |
| |
| @session(python=False, name='cov') |
| def coverage(session): |
| """Run tests and generate coverage report""" |
| cmd_1 = f'pytest {UNIT_TESTS} -rs {XDIST_ARGS} {COVERAGE_ARGS}' |
| cmd_2 = f'pytest {INTEGRATION_TESTS} -rs {XDIST_ARGS} {COVERAGE_ARGS} --cov-append' |
| session.run(*cmd_1.split(' ')) |
| session.run(*cmd_2.split(' ')) |
| |
| |
| @session(python=False) |
| def docs(session): |
| """Build Sphinx documentation""" |
| cmd = 'sphinx-build docs docs/_build/html -j auto' |
| session.run(*cmd.split(' ')) |
| |
| |
| @session(python=False) |
| def livedocs(session): |
| """Auto-build docs with live reload in browser. |
| Add `--open` to also open the browser after starting. |
| """ |
| args = ['-a'] |
| args += [f'--watch {pattern}' for pattern in LIVE_DOCS_WATCH] |
| args += [f'--ignore {pattern}' for pattern in LIVE_DOCS_IGNORE] |
| args += [f'--port {LIVE_DOCS_PORT}', '-j auto'] |
| if session.posargs == ['open']: |
| args.append('--open-browser') |
| |
| clean(session) |
| cmd = 'sphinx-autobuild docs docs/_build/html ' + ' '.join(args) |
| session.run(*cmd.split(' ')) |
| |
| |
| @session(python=False) |
| def lint(session): |
| """Run linters and code formatters via pre-commit""" |
| cmd = 'pre-commit run --all-files' |
| session.run(*cmd.split(' ')) |