Esempio n. 1
0
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"))
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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,
    )
Esempio n. 5
0
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,
    )
Esempio n. 6
0
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")
Esempio n. 7
0
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()
Esempio n. 8
0
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.")
Esempio n. 9
0
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,
    )
Esempio n. 10
0
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)
Esempio n. 11
0
def example(session: Session, name: str = None):
    if name is None:
        session.log("There are no examples.")
        return
    example_run(session, name)
Esempio n. 12
0
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)
Esempio n. 13
0
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)