latch 2.45.2.dev1__tar.gz → 2.45.2.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {latch-2.45.2.dev1/latch.egg-info → latch-2.45.2.dev3}/PKG-INFO +1 -1
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/types/metadata.py +84 -4
- {latch-2.45.2.dev1 → latch-2.45.2.dev3/latch.egg-info}/PKG-INFO +1 -1
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/nextflow/workflow.py +51 -16
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/setup.py +1 -1
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/LICENSE +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/MANIFEST.in +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/README.md +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/account.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/executions.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/functions/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/functions/messages.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/functions/operators.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/functions/secrets.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/_transfer/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/_transfer/download.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/_transfer/manager.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/_transfer/node.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/_transfer/progress.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/_transfer/remote_copy.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/_transfer/throttle.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/_transfer/upload.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/_transfer/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/path.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/ldata/type.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/registry/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/registry/project.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/registry/record.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/registry/table.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/registry/types.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/registry/upstream_types/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/registry/upstream_types/types.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/registry/upstream_types/values.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/registry/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/resources/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/resources/conditional.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/resources/dynamic.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/resources/launch_plan.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/resources/map_tasks.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/resources/reference_workflow.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/resources/tasks.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/resources/workflow.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/types/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/types/directory.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/types/file.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/types/glob.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/types/json.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/types/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/verified/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/verified/deseq2.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/verified/mafft.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/verified/pathway.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/verified/rnaseq.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch/verified/trim_galore.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch.egg-info/SOURCES.txt +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch.egg-info/dependency_links.txt +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch.egg-info/entry_points.txt +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch.egg-info/requires.txt +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch.egg-info/top_level.txt +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/auth/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/auth/csrf.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/auth/oauth2.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/auth/pkce.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/auth/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/centromere/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/centromere/ctx.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/centromere/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/click_utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/constants.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/docker_utils/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/exceptions/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/exceptions/cache.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/exceptions/errors.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/exceptions/handler.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/exceptions/traceback.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/main.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/menus.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/nextflow/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/nextflow/dependencies.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/nextflow/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/cp/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/cp/autocomplete.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/cp/glob.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/cp/main.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/cp/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/execute/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/execute/main.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/execute/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/get.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/get_executions.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/get_params.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/__pycache__/init.cpython-310.pyc +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/assemble_and_sort/.env +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/assemble_and_sort/LICENSE +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/assemble_and_sort/README.md +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/assemble_and_sort/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/assemble_and_sort/assemble.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/assemble_and_sort/sort.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/assemble_and_sort/system-requirements.txt +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/common/.dockerignore +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_conda/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_conda/conda_task.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_conda/environment.yaml +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_docker/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_docker/task.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_nfcore/Dockerfile +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_nfcore/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_nfcore/task.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_r/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_r/environment.R +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_r/r_task.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/.latch/latch_entrypoint +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/Dockerfile +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/Snakefile +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/config.yaml +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/environment.yaml +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/latch_metadata.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/scripts/plot-quals.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/version +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/init.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/template/LICENSE +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/template/README.md +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/template/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/template/task.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/launch.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/local_dev.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/local_dev_old.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/login.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/ls.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/mkdir.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/move.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/preview.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/register/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/register/constants.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/register/register.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/register/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/rm.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/stop_pod.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/sync.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/test_data/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/test_data/ls.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/test_data/remove.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/test_data/upload.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/test_data/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/workspace.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/snakemake/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/snakemake/config/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/snakemake/config/parser.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/snakemake/config/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/snakemake/serialize.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/snakemake/serialize_utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/snakemake/single_task_snakemake.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/snakemake/utils.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/snakemake/workflow.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/tinyrequests.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/tui/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/utils/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/utils/path.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/workflow_config.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/pyproject.toml +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/setup.cfg +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/tests/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/tests/cp/__init__.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/tests/fixtures.py +0 -0
- {latch-2.45.2.dev1 → latch-2.45.2.dev3}/tests/test_ls.py +0 -0
|
@@ -1,21 +1,27 @@
|
|
|
1
|
+
import csv
|
|
2
|
+
import functools
|
|
1
3
|
import re
|
|
2
|
-
from dataclasses import Field, asdict, dataclass, field
|
|
4
|
+
from dataclasses import Field, asdict, dataclass, field, fields, is_dataclass
|
|
3
5
|
from enum import Enum
|
|
4
6
|
from pathlib import Path
|
|
5
|
-
from textwrap import indent
|
|
7
|
+
from textwrap import dedent, indent
|
|
6
8
|
from typing import (
|
|
7
9
|
Any,
|
|
10
|
+
Callable,
|
|
8
11
|
ClassVar,
|
|
9
12
|
Collection,
|
|
10
13
|
Dict,
|
|
11
14
|
Generic,
|
|
12
15
|
List,
|
|
16
|
+
Literal,
|
|
13
17
|
Optional,
|
|
14
18
|
Protocol,
|
|
15
19
|
Tuple,
|
|
16
20
|
Type,
|
|
17
21
|
TypeVar,
|
|
18
22
|
Union,
|
|
23
|
+
get_args,
|
|
24
|
+
get_origin,
|
|
19
25
|
)
|
|
20
26
|
|
|
21
27
|
import click
|
|
@@ -477,10 +483,84 @@ class NextflowParameter(Generic[T], LatchParameter):
|
|
|
477
483
|
The python type of the parameter.
|
|
478
484
|
"""
|
|
479
485
|
default: Optional[T] = None
|
|
486
|
+
"""
|
|
487
|
+
Default value of the parameter
|
|
488
|
+
"""
|
|
489
|
+
|
|
490
|
+
samplesheet_type: Literal["csv", "tsv", None] = None
|
|
491
|
+
"""
|
|
492
|
+
The type of samplesheet to construct from the input parameter.
|
|
493
|
+
|
|
494
|
+
Only used if the provided parameter is a samplesheet (samplesheet=True)
|
|
495
|
+
"""
|
|
496
|
+
samplesheet_constructor: Optional[Callable[[T], Path]] = None
|
|
497
|
+
"""
|
|
498
|
+
A custom samplesheet constructor.
|
|
499
|
+
|
|
500
|
+
Should return the path of the constructed samplesheet. If samplesheet_type is also specified, this takes precedence.
|
|
501
|
+
Only used if the provided parameter is a samplesheet (samplesheet=True)
|
|
502
|
+
"""
|
|
480
503
|
|
|
481
504
|
def __post_init__(self):
|
|
482
|
-
if self.samplesheet is
|
|
483
|
-
|
|
505
|
+
if not self.samplesheet or self.samplesheet_constructor is not None:
|
|
506
|
+
return
|
|
507
|
+
|
|
508
|
+
t = self.type
|
|
509
|
+
if get_origin(t) is not list or not is_dataclass(get_args(t)[0]):
|
|
510
|
+
click.secho(
|
|
511
|
+
dedent("""\
|
|
512
|
+
Samplesheets must be a list of dataclasses.
|
|
513
|
+
"""),
|
|
514
|
+
fg="red",
|
|
515
|
+
)
|
|
516
|
+
raise click.exceptions.Exit(1)
|
|
517
|
+
|
|
518
|
+
if self.samplesheet_type is not None:
|
|
519
|
+
delim = "," if self.samplesheet_type == "csv" else "\t"
|
|
520
|
+
self.samplesheet_constructor = functools.partial(
|
|
521
|
+
_samplesheet_constructor, t=get_args(self.type)[0], delim=delim
|
|
522
|
+
)
|
|
523
|
+
return
|
|
524
|
+
|
|
525
|
+
click.secho(
|
|
526
|
+
dedent("""\
|
|
527
|
+
A Samplesheet constructor is required for a samplesheet parameter. Please either provide a value for
|
|
528
|
+
`samplesheet_type` or provide a custom callable to the `samplesheet_constructor` argument.
|
|
529
|
+
"""),
|
|
530
|
+
fg="red",
|
|
531
|
+
)
|
|
532
|
+
raise click.exceptions.Exit(1)
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
DC = TypeVar("DC", bound=_IsDataclass)
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
def _samplesheet_repr(v: Any) -> str:
|
|
539
|
+
if v is None:
|
|
540
|
+
return ""
|
|
541
|
+
if isinstance(v, LatchFile) or isinstance(v, LatchDir):
|
|
542
|
+
return v.remote_path
|
|
543
|
+
if isinstance(v, Enum):
|
|
544
|
+
return getattr(v, "value")
|
|
545
|
+
|
|
546
|
+
return str(v)
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
def _samplesheet_constructor(samples: List[DC], t: DC, delim: str = ",") -> Path:
|
|
550
|
+
samplesheet = Path("samplesheet.csv")
|
|
551
|
+
|
|
552
|
+
with open(samplesheet, "w") as f:
|
|
553
|
+
writer = csv.DictWriter(f, [f.name for f in fields(t)], delimiter=delim)
|
|
554
|
+
writer.writeheader()
|
|
555
|
+
|
|
556
|
+
for sample in samples:
|
|
557
|
+
row_data = {
|
|
558
|
+
f.name: _samplesheet_repr(getattr(sample, f.name))
|
|
559
|
+
for f in fields(sample)
|
|
560
|
+
}
|
|
561
|
+
writer.writerow(row_data)
|
|
562
|
+
|
|
563
|
+
return samplesheet
|
|
484
564
|
|
|
485
565
|
|
|
486
566
|
@dataclass(frozen=True)
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
from dataclasses import fields, is_dataclass
|
|
1
|
+
from dataclasses import asdict, fields, is_dataclass
|
|
3
2
|
from enum import Enum
|
|
4
3
|
from pathlib import Path
|
|
5
4
|
from typing import Any, List, Optional, Tuple
|
|
@@ -37,15 +36,15 @@ from flytekit.core.annotation import FlyteAnnotation
|
|
|
37
36
|
|
|
38
37
|
import latch_metadata
|
|
39
38
|
|
|
40
|
-
|
|
41
39
|
@custom_task(cpu=0.25, memory=0.5, storage_gib=1)
|
|
42
40
|
def initialize() -> str:
|
|
43
41
|
token = os.environ.get("FLYTE_INTERNAL_EXECUTION_ID")
|
|
44
42
|
if token is None:
|
|
45
43
|
raise RuntimeError("failed to get execution token")
|
|
46
44
|
|
|
47
|
-
print("Provisioning shared storage volume...")
|
|
48
45
|
headers = {{"Authorization": f"Latch-Execution-Token {{token}}"}}
|
|
46
|
+
|
|
47
|
+
print("Provisioning shared storage volume... ", end="")
|
|
49
48
|
resp = requests.post(
|
|
50
49
|
"http://nf-dispatcher-service.flyte.svc.cluster.local/provision-storage",
|
|
51
50
|
headers=headers,
|
|
@@ -54,21 +53,26 @@ def initialize() -> str:
|
|
|
54
53
|
}}
|
|
55
54
|
)
|
|
56
55
|
resp.raise_for_status()
|
|
56
|
+
print("Done.")
|
|
57
|
+
|
|
57
58
|
return resp.json()["name"]
|
|
58
59
|
|
|
59
60
|
|
|
60
61
|
{preambles}
|
|
61
62
|
|
|
63
|
+
{samplesheet_funs}
|
|
62
64
|
|
|
63
65
|
@nextflow_runtime_task(cpu={cpu}, memory={memory})
|
|
64
66
|
def nextflow_runtime(pvc_name: str, {param_signature}) -> None:
|
|
65
67
|
try:
|
|
66
68
|
shared_dir = Path("/nf-workdir")
|
|
67
69
|
|
|
70
|
+
{samplesheet_constructors}
|
|
71
|
+
|
|
68
72
|
shutil.copytree(
|
|
69
73
|
Path("/root"),
|
|
70
74
|
shared_dir,
|
|
71
|
-
ignore=lambda src, names: ["latch", ".latch"],
|
|
75
|
+
ignore=lambda src, names: ["latch", ".latch", "nextflow", ".nextflow"],
|
|
72
76
|
ignore_dangling_symlinks=True,
|
|
73
77
|
dirs_exist_ok=True,
|
|
74
78
|
)
|
|
@@ -80,22 +84,26 @@ def nextflow_runtime(pvc_name: str, {param_signature}) -> None:
|
|
|
80
84
|
}}
|
|
81
85
|
subprocess.run(
|
|
82
86
|
[
|
|
83
|
-
"/root
|
|
87
|
+
"/root/nextflow",
|
|
84
88
|
"run",
|
|
85
89
|
str(shared_dir / "{nf_script}"),
|
|
86
90
|
"-work-dir",
|
|
87
91
|
str(shared_dir),
|
|
88
92
|
"-profile",
|
|
89
93
|
"{execution_profile}",
|
|
94
|
+
"-process.executor",
|
|
95
|
+
"k8s",
|
|
90
96
|
{params_to_flags}
|
|
91
97
|
],
|
|
92
98
|
env=env,
|
|
93
99
|
check=True,
|
|
100
|
+
cwd=str(shared_dir),
|
|
94
101
|
)
|
|
95
102
|
except subprocess.CalledProcessError:
|
|
96
103
|
remote = LPath(urljoins("{remote_output_dir}", _get_execution_name(), "nextflow.log"))
|
|
104
|
+
print()
|
|
97
105
|
print(f"Uploading .nextflow.log to {{remote.path}}")
|
|
98
|
-
remote.upload_from(
|
|
106
|
+
remote.upload_from(shared_dir / ".nextflow.log")
|
|
99
107
|
raise
|
|
100
108
|
finally:
|
|
101
109
|
token = os.environ.get("FLYTE_INTERNAL_EXECUTION_ID")
|
|
@@ -165,12 +173,11 @@ def generate_nextflow_workflow(
|
|
|
165
173
|
resources = metadata._nextflow_metadata.runtime_resources
|
|
166
174
|
|
|
167
175
|
flags = []
|
|
168
|
-
for param_name, param in parameters.items():
|
|
169
|
-
flags.append(reindent(f"*get_flag({repr(param_name)}, {param_name})", 3))
|
|
170
|
-
|
|
171
176
|
defaults: List[Tuple[str, str]] = []
|
|
172
177
|
no_defaults: List[str] = []
|
|
173
|
-
preambles:
|
|
178
|
+
preambles: set[str] = set()
|
|
179
|
+
samplesheet_funs: List[str] = []
|
|
180
|
+
samplesheet_constructors: List[str] = []
|
|
174
181
|
for param_name, param in parameters.items():
|
|
175
182
|
sig = f"{param_name}: {type_repr(param.type)}"
|
|
176
183
|
if param.default is not None:
|
|
@@ -191,9 +198,36 @@ def generate_nextflow_workflow(
|
|
|
191
198
|
else:
|
|
192
199
|
no_defaults.append(sig)
|
|
193
200
|
|
|
201
|
+
if param.samplesheet:
|
|
202
|
+
samplesheet_funs.append(
|
|
203
|
+
reindent(
|
|
204
|
+
f"""
|
|
205
|
+
{param_name}_construct_samplesheet = metadata._nextflow_metadata.parameters[{repr(param_name)}].samplesheet_constructor
|
|
206
|
+
""",
|
|
207
|
+
0,
|
|
208
|
+
),
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
samplesheet_constructors.append(
|
|
212
|
+
reindent(
|
|
213
|
+
f"{param_name}_samplesheet ="
|
|
214
|
+
f" {param_name}_construct_samplesheet({param_name})",
|
|
215
|
+
2,
|
|
216
|
+
),
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
flags.append(
|
|
220
|
+
reindent(
|
|
221
|
+
f"*get_flag({repr(param_name)}, {param_name}_samplesheet)",
|
|
222
|
+
4,
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
else:
|
|
226
|
+
flags.append(reindent(f"*get_flag({repr(param_name)}, {param_name})", 4))
|
|
227
|
+
|
|
194
228
|
preamble = get_preamble(param.type)
|
|
195
|
-
if len(preamble) > 0:
|
|
196
|
-
preambles.
|
|
229
|
+
if len(preamble) > 0 and preamble not in preambles:
|
|
230
|
+
preambles.add(preamble)
|
|
197
231
|
|
|
198
232
|
if metadata._nextflow_metadata.output_dir is None:
|
|
199
233
|
output_dir = "latch:///nextflow_outputs"
|
|
@@ -215,7 +249,9 @@ def generate_nextflow_workflow(
|
|
|
215
249
|
execution_profile=(
|
|
216
250
|
execution_profile if execution_profile is not None else "standard"
|
|
217
251
|
),
|
|
218
|
-
preambles="\n\n".join(preambles),
|
|
252
|
+
preambles="\n\n".join(list(preambles)),
|
|
253
|
+
samplesheet_funs="\n".join(samplesheet_funs),
|
|
254
|
+
samplesheet_constructors="\n".join(samplesheet_constructors),
|
|
219
255
|
cpu=resources.cpus,
|
|
220
256
|
memory=resources.memory,
|
|
221
257
|
storage_gib=resources.storage_gib,
|
|
@@ -227,6 +263,5 @@ def generate_nextflow_workflow(
|
|
|
227
263
|
entrypoint_path.write_text(entrypoint)
|
|
228
264
|
|
|
229
265
|
click.secho(
|
|
230
|
-
f"Nextflow workflow written to {pkg_root / 'wf' / 'entrypoint.py'}",
|
|
231
|
-
fg="green",
|
|
266
|
+
f"Nextflow workflow written to {pkg_root / 'wf' / 'entrypoint.py'}", fg="green"
|
|
232
267
|
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc
RENAMED
|
File without changes
|
{latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/__pycache__/init.cpython-310.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/assemble_and_sort/__init__.py
RENAMED
|
File without changes
|
{latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/assemble_and_sort/assemble.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_conda/environment.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/Dockerfile
RENAMED
|
File without changes
|
|
File without changes
|
{latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/config.yaml
RENAMED
|
File without changes
|
{latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/environment.yaml
RENAMED
|
File without changes
|
{latch-2.45.2.dev1 → latch-2.45.2.dev3}/latch_cli/services/init/example_snakemake/latch_metadata.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|