def test_docs(session: Session) -> None: """Run the documentation related tests.""" show_help(session, {"skip-latex": "Skip the latex step."}) if "skip-latex" in session.posargs: session.log("Skipping LaTeX and PDF building for this session.") else: build_pdf(session) session.install(*test_requirements, *docs_requirements) session.run("pytest", "-vvv", "-rs", str(ROOT / "tests" / "docs"))
def test_python_suite(session: Session) -> None: """Run the Python-based test suite""" session.env["IDOM_DEBUG_MODE"] = "1" install_requirements_file(session, "test-env") session.run("playwright", "install", "chromium") posargs = session.posargs posargs += ["--reruns", "3", "--reruns-delay", "1"] if "--no-cov" in session.posargs: session.log("Coverage won't be checked") session.install(".[all]") else: posargs += ["--cov=src/idom", "--cov-report", "term"] install_idom_dev(session, extras="all") session.run("pytest", *posargs)
def build_pdf(session: Session) -> None: """Create pdf file.""" show_help( session, { "skip-latex": "Skip Pweave to LaTeX generation.", "clean": ("Clean LaTeX and Pweave cache files before creating tex files."), }, ) if "skip-latex" not in session.posargs: clean = "clean" in session.posargs build_latex(session, clean) session.log("Building figures...") with chdir(session, FIGURES_DIR_PATH): for latex_file in FIGURES_DIR_PATH.glob("*.tex"): session.run( "pdflatex", "-interaction=nonstopmode", "-shell-escape", str(latex_file), silent=True, external=True, ) session.log("Building pdf through pdflatex ...") pdflatex_cmd = [ "pdflatex", "-interaction=nonstopmode", "-shell-escape", f"{REPORT_NAME}.tex", ] with chdir(session, REPORT_DIR_PATH): session.run(*pdflatex_cmd, silent=True, external=True) # Ignore error if there are no citations try: session.run("bibtex", f"{REPORT_NAME}.aux", silent=True, external=True) except CommandFailed: pass session.run(*pdflatex_cmd, silent=True, external=True) session.run(*pdflatex_cmd, silent=True, external=True)
def test(session: Session) -> None: """Run the source code related tests.""" test_path = session.posargs[0] if session.posargs else str(ROOT / "tests") session.log("Running tests!") session.install( *test_requirements, *mlp_frameworks_requirements, *hp_optimization_requirements, env={"TMPDIR": "/var/tmp"}, ) session.run( "pytest", test_path, f"--cov={str(ROOT / 'src')}", "--cov-report=term-missing", "-vvv", silent=False, )
def clean_py(session: Session) -> None: """Celean python cache files. If ``verbose`` is provided in :attr:`Session.posargs`, each file removal will be logged. Nothing will print otherwise. """ show_help(session, {"verbose": "Show each deleted file."}) lggr = session.log if "verbose" in session.posargs else lambda *args: None session.log("Cleaning global unwanted files...") remove_files( [ *list(ROOT.glob("**/*.py[cod]")), *list(ROOT.glob("**/__pycache__/")), *list(ROOT.glob("**/.pytest_cache/")), *list(ROOT.glob("**/.mypy_cache/")), ], lggr, )
def tests(session: Session) -> None: """Run the test suite.""" path = Path(session.bin).parent args = session.posargs or ["--cov", "-m", "not e2e"] session.run( "poetry", "install", "--no-dev", external=True, ) install_with_constraints(session, "pytest", "pytest-cov", "pytest-mock", "coverage[toml]") if on_windows: session.bin_paths.insert(0, str( path / "Library/bin")) # here all the DLLs should be installed session.log(f"Session path: {session.bin_paths}") session.run("pytest", env={"LD_LIBRARY_PATH": str(path / "lib")}, *args) if "--cov" in args: session.run("coverage", "report", "--show-missing", "--skip-covered") session.run("coverage", "html")
def show_help(session: Session, help_dict: Dict[str, str]) -> None: """Process the extra arguments for a session. :param session: current session. :param help: arguments help for the curent session. """ if "help" in session.posargs: session.log("=" * 40) session.log("Function posargs:") for argument, description in help_dict.items(): session.log(f"\t- {argument}: {description}") session.log("=" * 40) session.skip()
def example_run(session: Session, name: str = None): descr = get_example_descr(name) install_dependencies(session, descr.get("requires", [])) show_environment_info(session) session.log("Running example %r", descr.get("name")) session.chdir(str(descr["dir"].absolute())) result = session.run(*descr["command"], silent=True) output = get_contents(Path(descr["dir"], descr["output"])) if result != output: session.error( "Example output did not match expected output:\n" "===== EXPECTED OUTPUT BEGIN =====\n%s\n" "===== EXPECTED OUTPUT END =====\n" "===== ACTUAL OUTPUT BEGIN =====\n%s\n" "===== ACTUAL OUTPUT END =====\n", output, result, ) session.log("Example output matched expected output, all is well.")
def clean_docs(session: Session) -> None: """Clean doc construction. If ``verbose`` is provided in :attr:`Session.posargs`, each file removal will be logged. Nothing will print otherwise. """ show_help(session, {"verbose": "Show each deleted file."}) lggr = session.log if "verbose" in session.posargs else lambda *args: None session.log("Cleaning latex and pweave files...") remove_files( [ *list(ROOT.glob("**/_minted-*/")), *list(REPORT_DIR_PATH.glob("_*")), *list(REPORT_DIR_PATH.glob("**/*.pkl")), *list(REPORT_DIR_PATH.glob("secciones/*.tex")), *list(FIGURES_DIR_PATH.glob("*.[!tex]*")), REPORT_DIR_PATH / "presentation.nav", REPORT_DIR_PATH / "presentation.snm", REPORT_DIR_PATH / "figures_pweave", REPORT_DIR_PATH / f"{REPORT_NAME}.bbl", REPORT_DIR_PATH / f"{REPORT_NAME}.blg", REPORT_DIR_PATH / f"{REPORT_NAME}.txt", REPORT_DIR_PATH / f"{REPORT_NAME}.aux", REPORT_DIR_PATH / f"{REPORT_NAME}.log", REPORT_DIR_PATH / f"{REPORT_NAME}.out", REPORT_DIR_PATH / f"{REPORT_NAME}.lof", REPORT_DIR_PATH / f"{REPORT_NAME}.lot", REPORT_DIR_PATH / f"{REPORT_NAME}.toc", REPORT_DIR_PATH / f"{REPORT_NAME}.fls", REPORT_DIR_PATH / f"{REPORT_NAME}.fdb_latexmk", REPORT_DIR_PATH / f"{REPORT_NAME}.pdf", REPORT_DIR_PATH / f"{REPORT_NAME}/", ], lggr, )
def build_latex(session: Session, clean: bool = False) -> None: """Create tex files from Pweave sources.""" session.log("Building latex files and figures through pweave ...") session.install(*docs_requirements, *prod_requirements) fig_dir = str(REPORT_DIR_PATH / "figures_pweave") if clean: clean_docs(session) with chdir(session, ROOT): for pweave_file in REPORT_DIR_PATH.glob("**/*.texw"): session.run( "pweave", "--format=texminted", "--documentation-mode", f"--figure-directory={fig_dir}", f"--output={str(pweave_file.with_suffix('.tex'))}", str(pweave_file), silent=True, ) session.log("Creating plain documentation from latex ...") plain_report_path = str(REPORT_DIR_PATH / f"{REPORT_NAME}.txt") filters_path = FILTER_DIR_PATH / "filters.py" pandoc_args = [ str(REPORT_DIR_PATH / f"{REPORT_NAME}.tex"), f"--output={plain_report_path}", "--from=latex", "--to=plain", ] if filters_path.exists(): pandoc_args.append(f"--filter={str(filters_path)}") with chdir(session, REPORT_DIR_PATH): session.run("pandoc", *pandoc_args, silent=True, external=True)
def example(session: Session, name: str = None): if name is None: session.log("There are no examples.") return example_run(session, name)
def install_latest_npm_in_ci(session: Session) -> None: if os.environ.get("CI") in TRUE_VALUES: session.log("Running in CI environment - installing latest NPM") session.run("npm", "install", "-g", "npm@latest", external=True)
def tag(session: Session) -> None: """Create a new git tag""" try: session.run( "git", "diff", "--cached", "--exit-code", silent=True, external=True, ) session.run( "git", "diff", "--exit-code", silent=True, external=True, ) except Exception: session.error("Cannot create a tag - there are uncommited changes") if len(session.posargs) > 1: session.error("To many arguments") try: new_version = session.posargs[0] except IndexError: session.error("No version tag given") install_requirements_file(session, "make-release") # check that version is valid semver session.run("pysemver", "check", new_version) old_version = get_version() session.log(f"Old version: {old_version}") session.log(f"New version: {new_version}") set_version(new_version) session.run("python", "scripts/update_versions.py") # trigger npm install to update package-lock.json session.install("-e", ".") version = get_version() install_requirements_file(session, "make-release") session.run("pysemver", "check", version) changelog_file = ROOT / "docs" / "source" / "about" / "changelog.rst" for line in changelog_file.read_text().splitlines(): if line == f"v{version}": session.log(f"Found changelog section for version {version}") break else: session.error( f"Something went wrong - could not find a title section for {version}" ) if session.interactive: response = input("Confirm (yes/no): ").lower() if response != "yes": session.error("Did not create tag") # stage, commit, tag, and push version bump session.run("git", "add", "--all", external=True) session.run("git", "commit", "-m", f"version {new_version}", external=True) session.run("git", "tag", version, external=True) session.run("git", "push", "origin", "main", "--tags", external=True)