From 8a54f167e29d11551509697924e1de73e4ffd13b Mon Sep 17 00:00:00 2001 From: "Michael R. Crusoe" Date: Tue, 5 Dec 2023 14:22:54 +0100 Subject: [PATCH] spython: add type hints --- cwltool/singularity.py | 14 +++++------ mypy-stubs/spython/main/__init__.pyi | 9 ++++++++ mypy-stubs/spython/main/build.pyi | 23 +++++++++++++++++++ .../spython/main/parse/parsers/base.pyi | 14 +++++++++++ .../spython/main/parse/parsers/docker.pyi | 7 ++++++ mypy-stubs/spython/main/parse/recipe.pyi | 19 +++++++++++++++ .../spython/main/parse/writers/base.pyi | 6 +++++ .../main/parse/writers/singularity.pyi | 10 ++++++++ tests/test_tmpdir.py | 2 +- 9 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 mypy-stubs/spython/main/__init__.pyi create mode 100644 mypy-stubs/spython/main/build.pyi create mode 100644 mypy-stubs/spython/main/parse/parsers/base.pyi create mode 100644 mypy-stubs/spython/main/parse/parsers/docker.pyi create mode 100644 mypy-stubs/spython/main/parse/recipe.pyi create mode 100644 mypy-stubs/spython/main/parse/writers/base.pyi create mode 100644 mypy-stubs/spython/main/parse/writers/singularity.pyi diff --git a/cwltool/singularity.py b/cwltool/singularity.py index e893255d7..5d1e25c73 100644 --- a/cwltool/singularity.py +++ b/cwltool/singularity.py @@ -8,10 +8,11 @@ import sys from subprocess import check_call, check_output # nosec from typing import Callable, Dict, List, MutableMapping, Optional, Tuple, cast -from spython.main.parse.parsers import DockerParser # type: ignore -from spython.main.parse.writers import get_writer # type: ignore -from spython.main import Client # type: ignore + from schema_salad.sourceline import SourceLine +from spython.main import Client +from spython.main.parse.parsers.docker import DockerParser +from spython.main.parse.writers.singularity import SingularityWriter from .builder import Builder from .context import RuntimeContext @@ -180,12 +181,9 @@ def get_image( with open(dockerfile_path, "w") as dfile: dfile.write(dockerRequirement["dockerFile"]) - parser = DockerParser(dockerfile_path) - SingularityWriter = get_writer("singularity") - writer = SingularityWriter(parser.recipe) - result = writer.convert() + singularityfile = SingularityWriter(DockerParser(dockerfile_path).parse()).convert() with open(singularityfile_path, "w") as file: - file.write(result) + file.write(singularityfile) os.environ["APPTAINER_TMPDIR"] = absolute_path Client.build(recipe=singularityfile_path, build_folder=absolute_path, sudo=False) diff --git a/mypy-stubs/spython/main/__init__.pyi b/mypy-stubs/spython/main/__init__.pyi new file mode 100644 index 000000000..adced1f3a --- /dev/null +++ b/mypy-stubs/spython/main/__init__.pyi @@ -0,0 +1,9 @@ +from typing import Iterator, Optional + +from .base import Client as _BaseClient +from .build import build as base_build + +class _Client(_BaseClient): + build = base_build + +Client = _Client() diff --git a/mypy-stubs/spython/main/build.pyi b/mypy-stubs/spython/main/build.pyi new file mode 100644 index 000000000..098ba3436 --- /dev/null +++ b/mypy-stubs/spython/main/build.pyi @@ -0,0 +1,23 @@ +from typing import Iterator, Optional + +from .base import Client + +def build( + self: Client, + recipe: Optional[str] = ..., + image: Optional[str] = ..., + isolated: Optional[bool] = ..., + sandbox: Optional[bool] = ..., + writable: Optional[bool] = ..., + build_folder: Optional[str] = ..., + robot_name: Optional[bool] = ..., + ext: Optional[str] = ..., + sudo: Optional[bool] = ..., + stream: Optional[bool] = ..., + force: Optional[bool] = ..., + options: Optional[list[str]] | None = ..., + quiet: Optional[bool] = ..., + return_result: Optional[bool] = ..., + sudo_options: Optional[str | list[str]] = ..., + singularity_options: Optional[list[str]] = ..., +) -> tuple[str, Iterator[str]]: ... diff --git a/mypy-stubs/spython/main/parse/parsers/base.pyi b/mypy-stubs/spython/main/parse/parsers/base.pyi new file mode 100644 index 000000000..23eef9975 --- /dev/null +++ b/mypy-stubs/spython/main/parse/parsers/base.pyi @@ -0,0 +1,14 @@ +import abc + +from ..recipe import Recipe + +class ParserBase(metaclass=abc.ABCMeta): + filename: str + lines: list[str] + args: dict[str, str] + active_layer: str + active_layer_num: int + recipe: dict[str, Recipe] + def __init__(self, filename: str, load: bool = ...) -> None: ... + @abc.abstractmethod + def parse(self) -> dict[str, Recipe]: ... diff --git a/mypy-stubs/spython/main/parse/parsers/docker.pyi b/mypy-stubs/spython/main/parse/parsers/docker.pyi new file mode 100644 index 000000000..8adb8a547 --- /dev/null +++ b/mypy-stubs/spython/main/parse/parsers/docker.pyi @@ -0,0 +1,7 @@ +from ..recipe import Recipe +from .base import ParserBase as ParserBase + +class DockerParser(ParserBase): + name: str + def __init__(self, filename: str = ..., load: bool = ...) -> None: ... + def parse(self) -> dict[str, Recipe]: ... diff --git a/mypy-stubs/spython/main/parse/recipe.pyi b/mypy-stubs/spython/main/parse/recipe.pyi new file mode 100644 index 000000000..dabd4ebc5 --- /dev/null +++ b/mypy-stubs/spython/main/parse/recipe.pyi @@ -0,0 +1,19 @@ +from typing import Optional + +class Recipe: + cmd: Optional[str] + comments: list[str] + entrypoint: Optional[str] + environ: list[str] + files: list[str] + layer_files: dict[str, str] + install: list[str] + labels: list[str] + ports: list[str] + test: Optional[str] + volumes: list[str] + workdir: Optional[str] + layer: int + fromHeader: Optional[str] + source: Optional[Recipe] + def __init__(self, recipe: Optional[Recipe] = ..., layer: int = ...) -> None: ... diff --git a/mypy-stubs/spython/main/parse/writers/base.pyi b/mypy-stubs/spython/main/parse/writers/base.pyi new file mode 100644 index 000000000..3b4fe12da --- /dev/null +++ b/mypy-stubs/spython/main/parse/writers/base.pyi @@ -0,0 +1,6 @@ +from ..recipe import Recipe + +class WriterBase: + recipe: dict[str, Recipe] + def __init__(self, recipe: dict[str, Recipe] | None = ...) -> None: ... + def write(self, output_file: str | None = ..., force: bool = ...) -> None: ... diff --git a/mypy-stubs/spython/main/parse/writers/singularity.pyi b/mypy-stubs/spython/main/parse/writers/singularity.pyi new file mode 100644 index 000000000..c80198461 --- /dev/null +++ b/mypy-stubs/spython/main/parse/writers/singularity.pyi @@ -0,0 +1,10 @@ +from typing import Optional + +from ..recipe import Recipe +from .base import WriterBase as WriterBase + +class SingularityWriter(WriterBase): + name: str + def __init__(self, recipe: Optional[dict[str, Recipe]] = ...) -> None: ... + def validate(self) -> None: ... + def convert(self, runscript: str = ..., force: bool = ...) -> str: ... diff --git a/tests/test_tmpdir.py b/tests/test_tmpdir.py index 61debb1d0..f64d66def 100644 --- a/tests/test_tmpdir.py +++ b/tests/test_tmpdir.py @@ -1,7 +1,7 @@ """Test that all temporary directories respect the --tmpdir-prefix and --tmp-outdir-prefix options.""" +import os import re import shutil -import os import subprocess import sys from pathlib import Path