latch 2.40.4.dev3__tar.gz → 2.40.4.dev5__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.40.4.dev3/latch.egg-info → latch-2.40.4.dev5}/PKG-INFO +2 -2
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/account.py +7 -11
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/registry/project.py +7 -11
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/registry/table.py +14 -20
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/types/metadata.py +6 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/verified/deseq2.py +18 -28
- {latch-2.40.4.dev3 → latch-2.40.4.dev5/latch.egg-info}/PKG-INFO +2 -2
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch.egg-info/requires.txt +1 -1
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/centromere/utils.py +4 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/build.py +33 -8
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/channel.py +10 -2
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/file_persistence.py +14 -1
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/adapters.py +9 -5
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/base.py +4 -1
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/operator.py +1 -1
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/process.py +3 -1
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/workflow.py +13 -2
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/main.py +24 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/init.cpython-310.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/init.cpython-311.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/register/register.py +2 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/setup.py +2 -2
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/LICENSE +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/MANIFEST.in +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/README.md +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/executions.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/functions/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/functions/messages.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/functions/operators.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/functions/secrets.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/_transfer/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/_transfer/download.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/_transfer/manager.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/_transfer/node.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/_transfer/progress.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/_transfer/remote_copy.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/_transfer/throttle.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/_transfer/upload.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/_transfer/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/path.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/ldata/type.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/registry/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/registry/record.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/registry/types.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/registry/upstream_types/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/registry/upstream_types/types.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/registry/upstream_types/values.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/registry/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/resources/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/resources/conditional.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/resources/dynamic.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/resources/launch_plan.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/resources/map_tasks.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/resources/reference_workflow.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/resources/tasks.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/resources/workflow.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/types/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/types/directory.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/types/file.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/types/glob.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/types/json.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/types/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/verified/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/verified/mafft.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/verified/pathway.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/verified/rnaseq.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch/verified/trim_galore.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch.egg-info/SOURCES.txt +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch.egg-info/dependency_links.txt +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch.egg-info/entry_points.txt +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch.egg-info/top_level.txt +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/auth/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/auth/csrf.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/auth/oauth2.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/auth/pkce.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/auth/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/centromere/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/centromere/ctx.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/click_utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/constants.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/docker_utils/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/exceptions/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/exceptions/cache.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/exceptions/errors.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/exceptions/handler.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/exceptions/traceback.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/common/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/common/config/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/common/config/parser.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/common/config/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/common/serialize.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/common/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/config.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/dag.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/serialize.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/conditional.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/map.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/merge.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/config.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/serialize.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/single_task_snakemake.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/workflow.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/menus.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/cp/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/cp/autocomplete.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/cp/glob.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/cp/main.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/cp/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/execute/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/execute/main.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/execute/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/get.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/get_executions.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/get_params.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/__init__.cpython-311.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/__init__.cpython-38.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/__init__.cpython-39.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/init.cpython-38.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/init.cpython-39.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/.env +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/LICENSE +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/README.md +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/assemble.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/sort.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/system-requirements.txt +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/common/.dockerignore +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_conda/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_conda/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_conda/conda_task.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_conda/environment.yaml +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_docker/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_docker/task.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_nextflow/main.nf +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_nextflow/nextflow.config +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_nextflow/workflow.nf +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_nf_integration/latch_metadata/__pycache__/__init__.cpython-311.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_nfcore/Dockerfile +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_nfcore/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_nfcore/task.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_r/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_r/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_r/environment.R +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_r/r_task.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/.latch/latch_entrypoint +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/Dockerfile +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/Snakefile +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/config.yaml +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/environment.yaml +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/latch_metadata.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/scripts/plot-quals.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/version +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/init.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/template/LICENSE +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/template/README.md +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/template/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/template/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/template/task.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/launch.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/local_dev.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/local_dev_old.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/login.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/ls.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/mkdir.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/move.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/preview.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/register/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/register/constants.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/register/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/rm.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/stop_pod.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/sync.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/test_data/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/test_data/ls.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/test_data/remove.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/test_data/upload.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/test_data/utils.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/workspace.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/tinyrequests.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/tui/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/utils/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/utils/path.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/utils/workflow.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/workflow_config.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/pyproject.toml +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/setup.cfg +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/tests/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/tests/cp/__init__.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/tests/fixtures.py +0 -0
- {latch-2.40.4.dev3 → latch-2.40.4.dev5}/tests/test_ls.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: latch
|
|
3
|
-
Version: 2.40.4.
|
|
3
|
+
Version: 2.40.4.dev5
|
|
4
4
|
Summary: The Latch SDK
|
|
5
5
|
Author-email: kenny@latch.bio
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.8
|
|
@@ -18,7 +18,7 @@ Requires-Dist: paramiko>=3.2.0
|
|
|
18
18
|
Requires-Dist: scp>=0.14.0
|
|
19
19
|
Requires-Dist: boto3>=1.26.0
|
|
20
20
|
Requires-Dist: tqdm>=4.63.0
|
|
21
|
-
Requires-Dist: lytekit==0.15.
|
|
21
|
+
Requires-Dist: lytekit==0.15.6
|
|
22
22
|
Requires-Dist: lytekitplugins-pods==0.6.2
|
|
23
23
|
Requires-Dist: typing-extensions==4.7.1
|
|
24
24
|
Requires-Dist: apscheduler==3.9.1
|
|
@@ -258,12 +258,10 @@ class AccountUpdate:
|
|
|
258
258
|
|
|
259
259
|
args = l.ArgumentNode()
|
|
260
260
|
args.name = _name_node("input")
|
|
261
|
-
args.value = _json_value(
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
266
|
-
)
|
|
261
|
+
args.value = _json_value({
|
|
262
|
+
"argOwnerId": self.account.id,
|
|
263
|
+
"argDisplayNames": display_names,
|
|
264
|
+
})
|
|
267
265
|
|
|
268
266
|
res.alias = _name_node(f"upd{len(mutations)}")
|
|
269
267
|
res.arguments = tuple([args])
|
|
@@ -299,11 +297,9 @@ class AccountUpdate:
|
|
|
299
297
|
|
|
300
298
|
args = l.ArgumentNode()
|
|
301
299
|
args.name = _name_node("input")
|
|
302
|
-
args.value = _json_value(
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
}
|
|
306
|
-
)
|
|
300
|
+
args.value = _json_value({
|
|
301
|
+
"argIds": ids,
|
|
302
|
+
})
|
|
307
303
|
|
|
308
304
|
res.alias = _name_node(f"upd{len(mutations)}")
|
|
309
305
|
res.arguments = tuple([args])
|
|
@@ -228,12 +228,10 @@ class ProjectUpdate:
|
|
|
228
228
|
|
|
229
229
|
args = l.ArgumentNode()
|
|
230
230
|
args.name = _name_node("input")
|
|
231
|
-
args.value = _json_value(
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
)
|
|
231
|
+
args.value = _json_value({
|
|
232
|
+
"argProjectId": self.project.id,
|
|
233
|
+
"argDisplayNames": display_names,
|
|
234
|
+
})
|
|
237
235
|
|
|
238
236
|
res.alias = _name_node(f"upd{len(mutations)}")
|
|
239
237
|
res.arguments = tuple([args])
|
|
@@ -267,11 +265,9 @@ class ProjectUpdate:
|
|
|
267
265
|
|
|
268
266
|
args = l.ArgumentNode()
|
|
269
267
|
args.name = _name_node("input")
|
|
270
|
-
args.value = _json_value(
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
}
|
|
274
|
-
)
|
|
268
|
+
args.value = _json_value({
|
|
269
|
+
"argIds": ids,
|
|
270
|
+
})
|
|
275
271
|
|
|
276
272
|
res.alias = _name_node(f"upd{len(mutations)}")
|
|
277
273
|
res.arguments = tuple([args])
|
|
@@ -496,13 +496,11 @@ class TableUpdate:
|
|
|
496
496
|
|
|
497
497
|
args = l.ArgumentNode()
|
|
498
498
|
args.name = _name_node("input")
|
|
499
|
-
args.value = _json_value(
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
}
|
|
505
|
-
)
|
|
499
|
+
args.value = _json_value({
|
|
500
|
+
"argExperimentId": self.table.id,
|
|
501
|
+
"argNames": names,
|
|
502
|
+
"argData": _var_node(argDataVar),
|
|
503
|
+
})
|
|
506
504
|
|
|
507
505
|
res.alias = _name_node(f"upd{len(mutations)}")
|
|
508
506
|
res.arguments = tuple([args])
|
|
@@ -537,12 +535,10 @@ class TableUpdate:
|
|
|
537
535
|
|
|
538
536
|
args = l.ArgumentNode()
|
|
539
537
|
args.name = _name_node("input")
|
|
540
|
-
args.value = _json_value(
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
}
|
|
545
|
-
)
|
|
538
|
+
args.value = _json_value({
|
|
539
|
+
"argExperimentId": self.table.id,
|
|
540
|
+
"argNames": names,
|
|
541
|
+
})
|
|
546
542
|
|
|
547
543
|
res.alias = _name_node(f"upd{len(mutations)}")
|
|
548
544
|
res.arguments = tuple([args])
|
|
@@ -690,13 +686,11 @@ class TableUpdate:
|
|
|
690
686
|
|
|
691
687
|
args = l.ArgumentNode()
|
|
692
688
|
args.name = _name_node("input")
|
|
693
|
-
args.value = _json_value(
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
}
|
|
699
|
-
)
|
|
689
|
+
args.value = _json_value({
|
|
690
|
+
"argExperimentId": self.table.id,
|
|
691
|
+
"argKeys": keys,
|
|
692
|
+
"argTypes": _var_node(argTypesVar),
|
|
693
|
+
})
|
|
700
694
|
|
|
701
695
|
res.alias = _name_node(f"upd{len(mutations)}")
|
|
702
696
|
res.arguments = tuple([args])
|
|
@@ -553,6 +553,10 @@ class LatchMetadata:
|
|
|
553
553
|
""" A `LatchAuthor` object that describes the author of the workflow"""
|
|
554
554
|
documentation: Optional[str] = None
|
|
555
555
|
"""A link to documentation for the workflow itself"""
|
|
556
|
+
about_page_markdown: Optional[Path] = None
|
|
557
|
+
"""A path to a markdown file that will be rendered as the workflow About
|
|
558
|
+
page. If provided, it will override the docstring markdown, if it exists,
|
|
559
|
+
for SDK workflows."""
|
|
556
560
|
repository: Optional[str] = None
|
|
557
561
|
"""A link to the repository where the code for the workflow is hosted"""
|
|
558
562
|
license: str = "MIT"
|
|
@@ -577,6 +581,8 @@ class LatchMetadata:
|
|
|
577
581
|
metadata_dict = asdict(self)
|
|
578
582
|
# remove parameters since that will be handled by each parameters' dict() method
|
|
579
583
|
del metadata_dict["parameters"]
|
|
584
|
+
# pyyaml is unable to serialize PosixPath objects + unused after registration
|
|
585
|
+
del metadata_dict["about_page_markdown"]
|
|
580
586
|
metadata_dict["license"] = {"id": self.license}
|
|
581
587
|
|
|
582
588
|
# flows override all other rendering, so disable them entirely if not provided
|
|
@@ -19,17 +19,13 @@ def deseq2_wf(
|
|
|
19
19
|
raw_count_table: Optional[
|
|
20
20
|
Annotated[
|
|
21
21
|
LatchFile,
|
|
22
|
-
FlyteAnnotation(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
],
|
|
31
|
-
}
|
|
32
|
-
),
|
|
22
|
+
FlyteAnnotation({
|
|
23
|
+
"_tmp_hack_deseq2": "counts_table",
|
|
24
|
+
"rules": [{
|
|
25
|
+
"regex": r".*\.(csv|tsv|xlsx)$",
|
|
26
|
+
"message": "Expected a CSV, TSV, or XLSX file",
|
|
27
|
+
}],
|
|
28
|
+
}),
|
|
33
29
|
]
|
|
34
30
|
] = None,
|
|
35
31
|
raw_count_tables: List[LatchFile] = [],
|
|
@@ -44,17 +40,13 @@ def deseq2_wf(
|
|
|
44
40
|
conditions_table: Optional[
|
|
45
41
|
Annotated[
|
|
46
42
|
LatchFile,
|
|
47
|
-
FlyteAnnotation(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
],
|
|
56
|
-
}
|
|
57
|
-
),
|
|
43
|
+
FlyteAnnotation({
|
|
44
|
+
"_tmp_hack_deseq2": "design_matrix",
|
|
45
|
+
"rules": [{
|
|
46
|
+
"regex": r".*\.(csv|tsv|xlsx)$",
|
|
47
|
+
"message": "Expected a CSV, TSV, or XLSX file",
|
|
48
|
+
}],
|
|
49
|
+
}),
|
|
58
50
|
]
|
|
59
51
|
] = None,
|
|
60
52
|
design_matrix_sample_id_column: Optional[
|
|
@@ -62,12 +54,10 @@ def deseq2_wf(
|
|
|
62
54
|
] = None,
|
|
63
55
|
design_formula: Annotated[
|
|
64
56
|
List[List[str]],
|
|
65
|
-
FlyteAnnotation(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
),
|
|
57
|
+
FlyteAnnotation({
|
|
58
|
+
"_tmp_hack_deseq2": "design_formula",
|
|
59
|
+
"_tmp_hack_deseq2_allow_clustering": True,
|
|
60
|
+
}),
|
|
71
61
|
] = [],
|
|
72
62
|
number_of_genes_to_plot: int = 30,
|
|
73
63
|
) -> LatchDir: ...
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: latch
|
|
3
|
-
Version: 2.40.4.
|
|
3
|
+
Version: 2.40.4.dev5
|
|
4
4
|
Summary: The Latch SDK
|
|
5
5
|
Author-email: kenny@latch.bio
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.8
|
|
@@ -18,7 +18,7 @@ Requires-Dist: paramiko>=3.2.0
|
|
|
18
18
|
Requires-Dist: scp>=0.14.0
|
|
19
19
|
Requires-Dist: boto3>=1.26.0
|
|
20
20
|
Requires-Dist: tqdm>=4.63.0
|
|
21
|
-
Requires-Dist: lytekit==0.15.
|
|
21
|
+
Requires-Dist: lytekit==0.15.6
|
|
22
22
|
Requires-Dist: lytekitplugins-pods==0.6.2
|
|
23
23
|
Requires-Dist: typing-extensions==4.7.1
|
|
24
24
|
Requires-Dist: apscheduler==3.9.1
|
|
@@ -2,6 +2,7 @@ import builtins
|
|
|
2
2
|
import contextlib
|
|
3
3
|
import os
|
|
4
4
|
import random
|
|
5
|
+
import shutil
|
|
5
6
|
import string
|
|
6
7
|
import sys
|
|
7
8
|
import tempfile
|
|
@@ -261,6 +262,9 @@ class MaybeRemoteDir:
|
|
|
261
262
|
return
|
|
262
263
|
|
|
263
264
|
if self._tempdir is not None and not isinstance(self._tempdir, str):
|
|
265
|
+
if os.environ.get("LATCH_SAVE_PROTO") is not None:
|
|
266
|
+
shutil.copytree(Path(self._tempdir.name), Path.cwd() / "protos")
|
|
267
|
+
|
|
264
268
|
self._tempdir.cleanup()
|
|
265
269
|
|
|
266
270
|
|
|
@@ -50,7 +50,10 @@ def get_node_name(vertex_id: str) -> str:
|
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
def build_from_nextflow_dag(
|
|
53
|
-
wf: NextflowWorkflow,
|
|
53
|
+
wf: NextflowWorkflow,
|
|
54
|
+
*,
|
|
55
|
+
execution_profile: Optional[str] = None,
|
|
56
|
+
ephemeral_storage_gib: int = 500,
|
|
54
57
|
):
|
|
55
58
|
global_start_node = Node(
|
|
56
59
|
id=_common_constants.GLOBAL_INPUT_NODE_ID,
|
|
@@ -105,18 +108,22 @@ def build_from_nextflow_dag(
|
|
|
105
108
|
else:
|
|
106
109
|
input_name = f"channel_{dep.id}"
|
|
107
110
|
|
|
108
|
-
|
|
111
|
+
dep_output_name = "res"
|
|
109
112
|
if len(dep.outputNames) > 0:
|
|
110
113
|
idx = int(edge.label or "0")
|
|
111
114
|
input_name = f"{input_name}_{idx}"
|
|
112
|
-
|
|
115
|
+
dep_output_name = dep.outputNames[idx]
|
|
113
116
|
|
|
114
117
|
if vertex.type == VertexType.Merge:
|
|
115
|
-
|
|
118
|
+
vertex_output_name = "res"
|
|
119
|
+
if len(vertex.outputNames) > 0:
|
|
120
|
+
vertex_output_name = dep_output_name
|
|
121
|
+
|
|
122
|
+
merge_sources[vertex_output_name].append(input_name)
|
|
116
123
|
|
|
117
124
|
task_inputs[input_name] = Optional[str]
|
|
118
125
|
|
|
119
|
-
node = NodeOutput(node=node_map[dep.id], var=
|
|
126
|
+
node = NodeOutput(node=node_map[dep.id], var=dep_output_name)
|
|
120
127
|
|
|
121
128
|
task_bindings.append(
|
|
122
129
|
literals_models.Binding(
|
|
@@ -177,6 +184,7 @@ def build_from_nextflow_dag(
|
|
|
177
184
|
wf=wf,
|
|
178
185
|
cpu=vertex.cpu,
|
|
179
186
|
memory=vertex.memoryBytes,
|
|
187
|
+
storage_gib=ephemeral_storage_gib,
|
|
180
188
|
)
|
|
181
189
|
|
|
182
190
|
wf.nextflow_tasks.append(process_task)
|
|
@@ -220,9 +228,21 @@ def build_from_nextflow_dag(
|
|
|
220
228
|
),
|
|
221
229
|
).ref
|
|
222
230
|
),
|
|
223
|
-
)
|
|
231
|
+
),
|
|
232
|
+
literals_models.Binding(
|
|
233
|
+
var="is_skipped",
|
|
234
|
+
binding=literals_models.BindingData(
|
|
235
|
+
promise=Promise(
|
|
236
|
+
var="is_skipped",
|
|
237
|
+
val=NodeOutput(
|
|
238
|
+
node=pre_adapter_node,
|
|
239
|
+
var="is_skipped",
|
|
240
|
+
),
|
|
241
|
+
).ref
|
|
242
|
+
),
|
|
243
|
+
),
|
|
224
244
|
],
|
|
225
|
-
upstream_nodes=[mapped_process_node],
|
|
245
|
+
upstream_nodes=[mapped_process_node, pre_adapter_node],
|
|
226
246
|
flyte_entity=post_adapter_task,
|
|
227
247
|
)
|
|
228
248
|
|
|
@@ -396,6 +416,7 @@ def build_nf_wf(
|
|
|
396
416
|
*,
|
|
397
417
|
redownload_dependencies: bool = False,
|
|
398
418
|
execution_profile: Optional[str] = None,
|
|
419
|
+
ephemeral_storage_gib: int = 500,
|
|
399
420
|
) -> NextflowWorkflow:
|
|
400
421
|
ensure_nf_dependencies(pkg_root, force_redownload=redownload_dependencies)
|
|
401
422
|
|
|
@@ -474,7 +495,11 @@ def build_nf_wf(
|
|
|
474
495
|
|
|
475
496
|
wf = NextflowWorkflow(pkg_root, nf_script, version, main_dag)
|
|
476
497
|
|
|
477
|
-
build_from_nextflow_dag(
|
|
498
|
+
build_from_nextflow_dag(
|
|
499
|
+
wf,
|
|
500
|
+
execution_profile=execution_profile,
|
|
501
|
+
ephemeral_storage_gib=ephemeral_storage_gib,
|
|
502
|
+
)
|
|
478
503
|
|
|
479
504
|
return wf
|
|
480
505
|
|
|
@@ -64,8 +64,16 @@ def get_mapper_inputs(
|
|
|
64
64
|
NT = TypeVar("NT", bound=NamedTuple)
|
|
65
65
|
|
|
66
66
|
|
|
67
|
-
def get_mapper_outputs(
|
|
68
|
-
|
|
67
|
+
def get_mapper_outputs(
|
|
68
|
+
adapter_output_cls: Type[NT], mapper_outputs: List[DC], is_skipped: bool
|
|
69
|
+
) -> NT:
|
|
70
|
+
|
|
71
|
+
kwargs: Dict[str, Optional[str]] = {}
|
|
72
|
+
if is_skipped:
|
|
73
|
+
for f in adapter_output_cls._fields:
|
|
74
|
+
kwargs[f] = None
|
|
75
|
+
|
|
76
|
+
return adapter_output_cls(**kwargs)
|
|
69
77
|
|
|
70
78
|
if len(mapper_outputs) == 1:
|
|
71
79
|
output = mapper_outputs[0]
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import json
|
|
1
2
|
import os
|
|
2
|
-
import shutil
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from typing import Dict, List, Optional, Set, Union
|
|
@@ -230,5 +230,18 @@ def upload_files(channels: Dict[str, List[JSONValue]], outdir: LatchDir):
|
|
|
230
230
|
local_to_remote[local] = remote
|
|
231
231
|
data.parameter["remote"] = remote
|
|
232
232
|
|
|
233
|
+
published_files: List[str] = []
|
|
234
|
+
try:
|
|
235
|
+
with open(".latch/published.json", "r") as f:
|
|
236
|
+
data = f.read()
|
|
237
|
+
conf = json.loads(data)
|
|
238
|
+
published_files = conf.get("files", [])
|
|
239
|
+
except FileNotFoundError:
|
|
240
|
+
pass
|
|
241
|
+
|
|
242
|
+
for file in published_files:
|
|
243
|
+
relative_path = Path(file).relative_to(Path.home())
|
|
244
|
+
local_to_remote[file] = urljoins(remote_parent, str(relative_path))
|
|
245
|
+
|
|
233
246
|
for local, remote in local_to_remote.items():
|
|
234
247
|
_upload(local, remote)
|
|
@@ -66,7 +66,7 @@ class NextflowProcessPreAdapterTask(NextflowBaseTask):
|
|
|
66
66
|
|
|
67
67
|
super().__init__(
|
|
68
68
|
inputs,
|
|
69
|
-
{"default": List[self.dataclass]},
|
|
69
|
+
{"default": List[self.dataclass], "is_skipped": bool},
|
|
70
70
|
id,
|
|
71
71
|
name,
|
|
72
72
|
branches,
|
|
@@ -96,6 +96,7 @@ class NextflowProcessPreAdapterTask(NextflowBaseTask):
|
|
|
96
96
|
|
|
97
97
|
class Res_{self.id}(NamedTuple):
|
|
98
98
|
default: {type_repr(output_typ)}
|
|
99
|
+
is_skipped: bool
|
|
99
100
|
|
|
100
101
|
""",
|
|
101
102
|
0,
|
|
@@ -114,7 +115,9 @@ class NextflowProcessPreAdapterTask(NextflowBaseTask):
|
|
|
114
115
|
return res
|
|
115
116
|
|
|
116
117
|
def get_fn_return_stmt(self):
|
|
117
|
-
return reindent(
|
|
118
|
+
return reindent(
|
|
119
|
+
f"return Res_{self.id}(default=result, is_skipped = not cond)", 1
|
|
120
|
+
)
|
|
118
121
|
|
|
119
122
|
def get_fn_code(self, nf_script_path_in_container: Path):
|
|
120
123
|
code_block = self.get_fn_interface()
|
|
@@ -173,7 +176,7 @@ class NextflowProcessPostAdapterTask(NextflowBaseTask):
|
|
|
173
176
|
self.dataclass = dataclass_from_python_params(outputs, id)
|
|
174
177
|
|
|
175
178
|
super().__init__(
|
|
176
|
-
{"default": List[self.dataclass]},
|
|
179
|
+
{"default": List[self.dataclass], "is_skipped": bool},
|
|
177
180
|
outputs,
|
|
178
181
|
id,
|
|
179
182
|
name,
|
|
@@ -210,7 +213,8 @@ class NextflowProcessPostAdapterTask(NextflowBaseTask):
|
|
|
210
213
|
rf"""
|
|
211
214
|
@task(cache=True)
|
|
212
215
|
def {self.name}(
|
|
213
|
-
default: List[Dataclass_{self.id}]
|
|
216
|
+
default: List[Dataclass_{self.id}],
|
|
217
|
+
is_skipped: bool,
|
|
214
218
|
) -> Res{self.name}:
|
|
215
219
|
""",
|
|
216
220
|
0,
|
|
@@ -221,7 +225,7 @@ class NextflowProcessPostAdapterTask(NextflowBaseTask):
|
|
|
221
225
|
def get_fn_return_stmt(self):
|
|
222
226
|
return reindent(
|
|
223
227
|
rf"""
|
|
224
|
-
return get_mapper_outputs(Res{self.name}, default)
|
|
228
|
+
return get_mapper_outputs(Res{self.name}, default, is_skipped)
|
|
225
229
|
""",
|
|
226
230
|
1,
|
|
227
231
|
)
|
|
@@ -49,6 +49,7 @@ class NextflowBaseTask(PythonAutoContainerTask[Pod]):
|
|
|
49
49
|
# ayush: 0.5/1 is too small and stuff starts taking a while to run
|
|
50
50
|
cpu: float = 1,
|
|
51
51
|
memory: float = 2,
|
|
52
|
+
storage_gib: int = 500,
|
|
52
53
|
):
|
|
53
54
|
self.id = id
|
|
54
55
|
self.wf = wf
|
|
@@ -77,7 +78,9 @@ class NextflowBaseTask(PythonAutoContainerTask[Pod]):
|
|
|
77
78
|
task_type_version=2,
|
|
78
79
|
name=f"{name}_{id}",
|
|
79
80
|
interface=interface,
|
|
80
|
-
task_config=custom_task(
|
|
81
|
+
task_config=custom_task(
|
|
82
|
+
cpu=cpu, memory=memory, storage_gib=storage_gib
|
|
83
|
+
).keywords["task_config"],
|
|
81
84
|
task_resolver=NextflowBaseTaskResolver(),
|
|
82
85
|
)
|
|
83
86
|
|
|
@@ -34,6 +34,7 @@ class NextflowProcessTask(NextflowBaseTask):
|
|
|
34
34
|
wf: NextflowWorkflow,
|
|
35
35
|
cpu: Optional[int] = None,
|
|
36
36
|
memory: Optional[float] = None,
|
|
37
|
+
storage_gib: int = 500,
|
|
37
38
|
):
|
|
38
39
|
super().__init__(
|
|
39
40
|
inputs,
|
|
@@ -45,6 +46,7 @@ class NextflowProcessTask(NextflowBaseTask):
|
|
|
45
46
|
NFTaskType.Process,
|
|
46
47
|
cpu=cpu if cpu is not None else 4,
|
|
47
48
|
memory=memory / 1024 / 1024 / 1024 if memory is not None else 8,
|
|
49
|
+
storage_gib=storage_gib,
|
|
48
50
|
)
|
|
49
51
|
|
|
50
52
|
self.wf_inputs = {}
|
|
@@ -100,7 +102,7 @@ class NextflowProcessTask(NextflowBaseTask):
|
|
|
100
102
|
results.append(
|
|
101
103
|
reindent(
|
|
102
104
|
rf"""
|
|
103
|
-
{field.name}=out_channels.get(f"{field.name}"
|
|
105
|
+
{field.name}=out_channels.get(f"{field.name}")
|
|
104
106
|
""",
|
|
105
107
|
2,
|
|
106
108
|
).rstrip()
|
|
@@ -2,6 +2,7 @@ from dataclasses import fields, is_dataclass
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
from typing import Any, Dict, List, Tuple, Type
|
|
4
4
|
|
|
5
|
+
import click
|
|
5
6
|
from flytekit.core.class_based_resolver import ClassStorageTaskResolver
|
|
6
7
|
from flytekit.core.docstring import Docstring
|
|
7
8
|
from flytekit.core.interface import Interface
|
|
@@ -48,9 +49,19 @@ class NextflowWorkflow(WorkflowBase, ClassStorageTaskResolver):
|
|
|
48
49
|
|
|
49
50
|
self.output_directory = metadata._nextflow_metadata.output_directory
|
|
50
51
|
self.docker_metadata = metadata._nextflow_metadata.docker_metadata
|
|
51
|
-
|
|
52
|
+
md_path = metadata._nextflow_metadata.about_page_markdown
|
|
53
|
+
|
|
54
|
+
if md_path is not None and md_path.exists():
|
|
55
|
+
click.secho(f"Rendering workflow About page content from {md_path}")
|
|
56
|
+
markdown_content = md_path.read_text()
|
|
57
|
+
else:
|
|
58
|
+
markdown_content = (
|
|
59
|
+
"Add markdown content to a file and add the path",
|
|
60
|
+
"to your workflow metadata to populate this page.\nMore information",
|
|
61
|
+
"[here](https://wiki.latch.bio/docs/nextflow/quickstart).",
|
|
62
|
+
)
|
|
52
63
|
docstring = Docstring(
|
|
53
|
-
f"{metadata._nextflow_metadata.display_name}\n\
|
|
64
|
+
f"{metadata._nextflow_metadata.display_name}\n\n{markdown_content}\n\n"
|
|
54
65
|
+ str(metadata._nextflow_metadata)
|
|
55
66
|
)
|
|
56
67
|
python_interface = Interface(
|
|
@@ -473,6 +473,12 @@ def execute(
|
|
|
473
473
|
default=None,
|
|
474
474
|
help="Set execution profile for Nextflow workflow",
|
|
475
475
|
)
|
|
476
|
+
@click.option(
|
|
477
|
+
"--ephemeral-storage-gib",
|
|
478
|
+
default=500,
|
|
479
|
+
type=int,
|
|
480
|
+
help="Input the number of GiB needed of ephemeral storage.",
|
|
481
|
+
)
|
|
476
482
|
@requires_login
|
|
477
483
|
def register(
|
|
478
484
|
pkg_root: str,
|
|
@@ -486,6 +492,7 @@ def register(
|
|
|
486
492
|
nf_script: Optional[Path],
|
|
487
493
|
redownload_dependencies: bool,
|
|
488
494
|
execution_profile: Optional[str],
|
|
495
|
+
ephemeral_storage_gib: int,
|
|
489
496
|
):
|
|
490
497
|
"""Register local workflow code to Latch.
|
|
491
498
|
|
|
@@ -497,6 +504,22 @@ def register(
|
|
|
497
504
|
crash_handler.message = "Unable to register workflow."
|
|
498
505
|
crash_handler.pkg_root = pkg_root
|
|
499
506
|
|
|
507
|
+
if ephemeral_storage_gib > 4949:
|
|
508
|
+
click.secho(
|
|
509
|
+
f"You tried setting ephemeral storage to {ephemeral_storage_gib} GiB. "
|
|
510
|
+
"This value exceeds the maximum allowed size of 4949 GiB.",
|
|
511
|
+
fg="red",
|
|
512
|
+
)
|
|
513
|
+
raise click.exceptions.Exit(1)
|
|
514
|
+
|
|
515
|
+
if ephemeral_storage_gib <= 0:
|
|
516
|
+
click.secho(
|
|
517
|
+
f"You tried setting ephemeral storage to {ephemeral_storage_gib} GiB. "
|
|
518
|
+
"Ephemeral storage value must be a positive integer less than 4949.",
|
|
519
|
+
fg="red",
|
|
520
|
+
)
|
|
521
|
+
raise click.exceptions.Exit(1)
|
|
522
|
+
|
|
500
523
|
from latch_cli.services.register import register
|
|
501
524
|
|
|
502
525
|
register(
|
|
@@ -513,6 +536,7 @@ def register(
|
|
|
513
536
|
or docker_progress == "plain",
|
|
514
537
|
use_new_centromere=use_new_centromere,
|
|
515
538
|
cache_tasks=cache_tasks,
|
|
539
|
+
nf_ephemeral_storage_gib=ephemeral_storage_gib,
|
|
516
540
|
)
|
|
517
541
|
|
|
518
542
|
|
{latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/init.cpython-310.pyc
RENAMED
|
Binary file
|
{latch-2.40.4.dev3 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/init.cpython-311.pyc
RENAMED
|
Binary file
|
|
@@ -280,6 +280,7 @@ def register(
|
|
|
280
280
|
progress_plain: bool = False,
|
|
281
281
|
cache_tasks: bool = False,
|
|
282
282
|
use_new_centromere: bool = False,
|
|
283
|
+
nf_ephemeral_storage_gib: int = 500,
|
|
283
284
|
):
|
|
284
285
|
"""Registers a workflow, defined as python code, with Latch.
|
|
285
286
|
|
|
@@ -424,6 +425,7 @@ def register(
|
|
|
424
425
|
ctx.nf_script,
|
|
425
426
|
redownload_dependencies=nf_redownload_dependencies,
|
|
426
427
|
execution_profile=nf_execution_profile,
|
|
428
|
+
ephemeral_storage_gib=nf_ephemeral_storage_gib,
|
|
427
429
|
)
|
|
428
430
|
generate_nf_entrypoint(nf_wf, ctx.pkg_root, ctx.nf_script)
|
|
429
431
|
|
|
@@ -13,7 +13,7 @@ if cur_ver < (3, 8) or cur_ver > (3, 11):
|
|
|
13
13
|
|
|
14
14
|
setup(
|
|
15
15
|
name="latch",
|
|
16
|
-
version="v2.40.4.
|
|
16
|
+
version="v2.40.4.dev5",
|
|
17
17
|
author_email="kenny@latch.bio",
|
|
18
18
|
description="The Latch SDK",
|
|
19
19
|
packages=find_packages(),
|
|
@@ -30,7 +30,7 @@ setup(
|
|
|
30
30
|
"scp>=0.14.0",
|
|
31
31
|
"boto3>=1.26.0",
|
|
32
32
|
"tqdm>=4.63.0",
|
|
33
|
-
"lytekit==0.15.
|
|
33
|
+
"lytekit==0.15.6",
|
|
34
34
|
"lytekitplugins-pods==0.6.2",
|
|
35
35
|
"typing-extensions==4.7.1",
|
|
36
36
|
"apscheduler==3.9.1",
|
|
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
|