You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.4 KiB
61 lines
1.4 KiB
import pathlib |
|
import tempfile |
|
import typing |
|
|
|
import nox |
|
|
|
|
|
class RepoCache: |
|
"""class for caching checkouts of downstream repos |
|
|
|
By caching the checkouts for downstream test runs, |
|
the nox invokation is faster and there is less load |
|
on the git server and network. |
|
""" |
|
|
|
_checkouts: typing.ClassVar = {} |
|
|
|
@classmethod |
|
def clone(cls, session: nox.Session, repo: str) -> str: |
|
"""clones a git repo only once |
|
|
|
Arguments: |
|
session: the nox session in use |
|
repo: a git repo url |
|
|
|
Returns: |
|
path to a temporary directory containing the |
|
cloned git repo |
|
""" |
|
tmpdir = cls._checkouts.get(repo, None) |
|
|
|
if tmpdir is None: |
|
tmpdir = tempfile.TemporaryDirectory() |
|
session.run("git", "clone", repo, tmpdir.name, external=True) |
|
cls._checkouts[repo] = tmpdir |
|
|
|
return tmpdir.name |
|
|
|
|
|
@nox.session(python=["3.9", "3.10", "3.11"]) |
|
def tests(session): |
|
session.install(".[test]") |
|
|
|
session.run("pytest", *session.posargs) |
|
|
|
|
|
@nox.session(python=["3.10", "3.11"]) |
|
@nox.parametrize( |
|
"repo", |
|
[ |
|
"https://git.sgbio.de/Safeguard/mbp_hyb_calls", |
|
], |
|
) |
|
def downstream(session, repo): |
|
tmpdir = RepoCache.clone(session, repo) |
|
|
|
session.install(".") |
|
session.install(f"{tmpdir}[test]") |
|
|
|
test_path = pathlib.Path(tmpdir) / "tests" |
|
session.run("pytest", test_path)
|
|
|