latch 2.52.1.dev2__tar.gz → 2.52.2__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.52.1.dev2/latch.egg-info → latch-2.52.2}/PKG-INFO +1 -1
- {latch-2.52.1.dev2 → latch-2.52.2/latch.egg-info}/PKG-INFO +1 -1
- {latch-2.52.1.dev2 → latch-2.52.2}/latch.egg-info/SOURCES.txt +2 -16
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/constants.py +1 -1
- latch-2.52.1.dev2/latch_cli/menus/vt100.py → latch-2.52.2/latch_cli/menus.py +72 -50
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/execute/main.py +11 -4
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/get_executions.py +79 -80
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/get_params.py +8 -1
- latch-2.52.2/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/__pycache__/init.cpython-310.pyc +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/launch.py +0 -1
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/local_dev_old.py +6 -2
- latch-2.52.2/latch_cli/services/preview.py +186 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/setup.py +1 -1
- latch-2.52.2/tests/__init__.py +0 -0
- latch-2.52.1.dev2/latch_cli/menus/__init__.py +0 -8
- latch-2.52.1.dev2/latch_cli/menus/common.py +0 -37
- latch-2.52.1.dev2/latch_cli/menus/win32.py +0 -422
- latch-2.52.1.dev2/latch_cli/menus/win32_types.py +0 -232
- latch-2.52.1.dev2/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/__pycache__/__init__.cpython-311.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/__pycache__/__init__.cpython-38.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/__pycache__/__init__.cpython-39.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/__pycache__/init.cpython-311.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/__pycache__/init.cpython-38.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/__pycache__/init.cpython-39.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/assemble_and_sort/__pycache__/__init__.cpython-310.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/example_conda/__pycache__/__init__.cpython-310.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/example_nf_integration/latch_metadata/__pycache__/__init__.cpython-311.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/example_r/__pycache__/__init__.cpython-310.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/init/template/__pycache__/__init__.cpython-310.pyc +0 -0
- latch-2.52.1.dev2/latch_cli/services/preview.py +0 -70
- {latch-2.52.1.dev2 → latch-2.52.2}/LICENSE +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/MANIFEST.in +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/README.md +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/account.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/executions.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/functions/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/functions/messages.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/functions/operators.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/functions/secrets.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/_transfer/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/_transfer/download.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/_transfer/manager.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/_transfer/node.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/_transfer/progress.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/_transfer/remote_copy.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/_transfer/throttle.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/_transfer/upload.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/_transfer/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/path.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/ldata/type.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/registry/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/registry/project.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/registry/record.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/registry/table.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/registry/types.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/registry/upstream_types/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/registry/upstream_types/types.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/registry/upstream_types/values.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/registry/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/resources/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/resources/conditional.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/resources/dynamic.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/resources/launch_plan.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/resources/map_tasks.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/resources/reference_workflow.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/resources/tasks.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/resources/workflow.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/types/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/types/directory.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/types/file.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/types/glob.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/types/json.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/types/metadata.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/types/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/verified/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/verified/deseq2.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/verified/mafft.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/verified/pathway.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/verified/rnaseq.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch/verified/trim_galore.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch.egg-info/dependency_links.txt +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch.egg-info/entry_points.txt +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch.egg-info/requires.txt +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch.egg-info/top_level.txt +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/auth/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/auth/csrf.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/auth/oauth2.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/auth/pkce.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/auth/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/centromere/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/centromere/ctx.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/centromere/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/click_utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/docker_utils/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/exceptions/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/exceptions/cache.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/exceptions/errors.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/exceptions/handler.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/exceptions/traceback.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/main.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/nextflow/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/nextflow/config.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/nextflow/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/nextflow/workflow.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/cp/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/cp/autocomplete.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/cp/glob.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/cp/main.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/cp/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/execute/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/execute/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/get.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/assemble_and_sort/.env +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/assemble_and_sort/LICENSE +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/assemble_and_sort/README.md +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/assemble_and_sort/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/assemble_and_sort/assemble.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/assemble_and_sort/sort.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/assemble_and_sort/system-requirements.txt +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/common/.dockerignore +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_conda/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_conda/conda_task.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_conda/environment.yaml +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_docker/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_docker/task.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_nfcore/Dockerfile +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_nfcore/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_nfcore/task.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_r/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_r/environment.R +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_r/r_task.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_snakemake/.latch/latch_entrypoint +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_snakemake/Dockerfile +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_snakemake/Snakefile +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_snakemake/config.yaml +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_snakemake/environment.yaml +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_snakemake/latch_metadata.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_snakemake/scripts/plot-quals.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/example_snakemake/version +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/init.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/template/LICENSE +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/template/README.md +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/template/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/init/template/task.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/local_dev.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/login.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/ls.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/mkdir.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/move.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/register/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/register/constants.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/register/register.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/register/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/rm.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/stop_pod.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/sync.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/test_data/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/test_data/ls.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/test_data/remove.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/test_data/upload.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/test_data/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/services/workspace.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/snakemake/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/snakemake/config/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/snakemake/config/parser.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/snakemake/config/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/snakemake/serialize.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/snakemake/serialize_utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/snakemake/single_task_snakemake.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/snakemake/utils.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/snakemake/workflow.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/tinyrequests.py +0 -0
- {latch-2.52.1.dev2/tests → latch-2.52.2/latch_cli/tui}/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/utils/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/utils/path.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/latch_cli/workflow_config.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/pyproject.toml +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/setup.cfg +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/tests/cp/__init__.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/tests/fixtures.py +0 -0
- {latch-2.52.1.dev2 → latch-2.52.2}/tests/test_ls.py +0 -0
|
@@ -63,6 +63,7 @@ latch_cli/__init__.py
|
|
|
63
63
|
latch_cli/click_utils.py
|
|
64
64
|
latch_cli/constants.py
|
|
65
65
|
latch_cli/main.py
|
|
66
|
+
latch_cli/menus.py
|
|
66
67
|
latch_cli/tinyrequests.py
|
|
67
68
|
latch_cli/workflow_config.py
|
|
68
69
|
latch_cli/auth/__init__.py
|
|
@@ -79,11 +80,6 @@ latch_cli/exceptions/cache.py
|
|
|
79
80
|
latch_cli/exceptions/errors.py
|
|
80
81
|
latch_cli/exceptions/handler.py
|
|
81
82
|
latch_cli/exceptions/traceback.py
|
|
82
|
-
latch_cli/menus/__init__.py
|
|
83
|
-
latch_cli/menus/common.py
|
|
84
|
-
latch_cli/menus/vt100.py
|
|
85
|
-
latch_cli/menus/win32.py
|
|
86
|
-
latch_cli/menus/win32_types.py
|
|
87
83
|
latch_cli/nextflow/__init__.py
|
|
88
84
|
latch_cli/nextflow/config.py
|
|
89
85
|
latch_cli/nextflow/utils.py
|
|
@@ -115,13 +111,7 @@ latch_cli/services/execute/utils.py
|
|
|
115
111
|
latch_cli/services/init/__init__.py
|
|
116
112
|
latch_cli/services/init/init.py
|
|
117
113
|
latch_cli/services/init/__pycache__/__init__.cpython-310.pyc
|
|
118
|
-
latch_cli/services/init/__pycache__/__init__.cpython-311.pyc
|
|
119
|
-
latch_cli/services/init/__pycache__/__init__.cpython-38.pyc
|
|
120
|
-
latch_cli/services/init/__pycache__/__init__.cpython-39.pyc
|
|
121
114
|
latch_cli/services/init/__pycache__/init.cpython-310.pyc
|
|
122
|
-
latch_cli/services/init/__pycache__/init.cpython-311.pyc
|
|
123
|
-
latch_cli/services/init/__pycache__/init.cpython-38.pyc
|
|
124
|
-
latch_cli/services/init/__pycache__/init.cpython-39.pyc
|
|
125
115
|
latch_cli/services/init/assemble_and_sort/.env
|
|
126
116
|
latch_cli/services/init/assemble_and_sort/LICENSE
|
|
127
117
|
latch_cli/services/init/assemble_and_sort/README.md
|
|
@@ -129,22 +119,18 @@ latch_cli/services/init/assemble_and_sort/__init__.py
|
|
|
129
119
|
latch_cli/services/init/assemble_and_sort/assemble.py
|
|
130
120
|
latch_cli/services/init/assemble_and_sort/sort.py
|
|
131
121
|
latch_cli/services/init/assemble_and_sort/system-requirements.txt
|
|
132
|
-
latch_cli/services/init/assemble_and_sort/__pycache__/__init__.cpython-310.pyc
|
|
133
122
|
latch_cli/services/init/common/.dockerignore
|
|
134
123
|
latch_cli/services/init/example_conda/__init__.py
|
|
135
124
|
latch_cli/services/init/example_conda/conda_task.py
|
|
136
125
|
latch_cli/services/init/example_conda/environment.yaml
|
|
137
|
-
latch_cli/services/init/example_conda/__pycache__/__init__.cpython-310.pyc
|
|
138
126
|
latch_cli/services/init/example_docker/__init__.py
|
|
139
127
|
latch_cli/services/init/example_docker/task.py
|
|
140
|
-
latch_cli/services/init/example_nf_integration/latch_metadata/__pycache__/__init__.cpython-311.pyc
|
|
141
128
|
latch_cli/services/init/example_nfcore/Dockerfile
|
|
142
129
|
latch_cli/services/init/example_nfcore/__init__.py
|
|
143
130
|
latch_cli/services/init/example_nfcore/task.py
|
|
144
131
|
latch_cli/services/init/example_r/__init__.py
|
|
145
132
|
latch_cli/services/init/example_r/environment.R
|
|
146
133
|
latch_cli/services/init/example_r/r_task.py
|
|
147
|
-
latch_cli/services/init/example_r/__pycache__/__init__.cpython-310.pyc
|
|
148
134
|
latch_cli/services/init/example_snakemake/Dockerfile
|
|
149
135
|
latch_cli/services/init/example_snakemake/Snakefile
|
|
150
136
|
latch_cli/services/init/example_snakemake/config.yaml
|
|
@@ -157,7 +143,6 @@ latch_cli/services/init/template/LICENSE
|
|
|
157
143
|
latch_cli/services/init/template/README.md
|
|
158
144
|
latch_cli/services/init/template/__init__.py
|
|
159
145
|
latch_cli/services/init/template/task.py
|
|
160
|
-
latch_cli/services/init/template/__pycache__/__init__.cpython-310.pyc
|
|
161
146
|
latch_cli/services/register/__init__.py
|
|
162
147
|
latch_cli/services/register/constants.py
|
|
163
148
|
latch_cli/services/register/register.py
|
|
@@ -176,6 +161,7 @@ latch_cli/snakemake/workflow.py
|
|
|
176
161
|
latch_cli/snakemake/config/__init__.py
|
|
177
162
|
latch_cli/snakemake/config/parser.py
|
|
178
163
|
latch_cli/snakemake/config/utils.py
|
|
164
|
+
latch_cli/tui/__init__.py
|
|
179
165
|
latch_cli/utils/__init__.py
|
|
180
166
|
latch_cli/utils/path.py
|
|
181
167
|
tests/__init__.py
|
|
@@ -22,7 +22,7 @@ class LatchConstants:
|
|
|
22
22
|
base_image: str = (
|
|
23
23
|
"812206152185.dkr.ecr.us-west-2.amazonaws.com/latch-base:fe0b-main"
|
|
24
24
|
)
|
|
25
|
-
nextflow_latest_version: str = "v1.1.
|
|
25
|
+
nextflow_latest_version: str = "v1.1.8"
|
|
26
26
|
|
|
27
27
|
file_max_size: int = 4 * Units.MiB
|
|
28
28
|
file_chunk_size: int = 64 * Units.MiB
|
|
@@ -1,25 +1,37 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import sys
|
|
3
|
-
import
|
|
4
|
-
import tty
|
|
5
|
-
from functools import wraps
|
|
6
|
-
from typing import Callable, List, Optional, Tuple, TypeVar
|
|
3
|
+
from typing import Any, Callable, Generic, List, Optional, Tuple, TypeVar
|
|
7
4
|
|
|
8
|
-
from typing_extensions import
|
|
5
|
+
from typing_extensions import TypedDict
|
|
9
6
|
|
|
10
7
|
from latch_cli.click_utils import AnsiCodes
|
|
11
8
|
|
|
12
|
-
from . import common
|
|
13
9
|
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
def buffered_print() -> Tuple[Callable, Callable]:
|
|
11
|
+
buffer = []
|
|
12
|
+
|
|
13
|
+
def __print(*args):
|
|
14
|
+
for arg in args:
|
|
15
|
+
buffer.append(arg)
|
|
16
|
+
|
|
17
|
+
def __show():
|
|
18
|
+
nonlocal buffer
|
|
19
|
+
print("".join(buffer), flush=True, end="")
|
|
20
|
+
buffer = []
|
|
21
|
+
|
|
22
|
+
return __print, __show
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# Allows for exactly one print per render, removing any weird flashing
|
|
26
|
+
# behavior and also speeding things up considerably
|
|
27
|
+
_print, _show = buffered_print()
|
|
16
28
|
|
|
17
29
|
|
|
18
30
|
def clear(k: int):
|
|
19
31
|
"""
|
|
20
|
-
Clear `k` lines below the cursor, returning the cursor to
|
|
32
|
+
Clear `k` lines below the cursor, returning the cursor to its original position
|
|
21
33
|
"""
|
|
22
|
-
|
|
34
|
+
_print(f"\x1b[2K\x1b[1E" * (k) + f"\x1b[{k}F")
|
|
23
35
|
|
|
24
36
|
|
|
25
37
|
def draw_box(
|
|
@@ -38,15 +50,15 @@ def draw_box(
|
|
|
38
50
|
|
|
39
51
|
|
|
40
52
|
def clear_screen():
|
|
41
|
-
|
|
53
|
+
_print("\x1b[2J")
|
|
42
54
|
|
|
43
55
|
|
|
44
56
|
def remove_cursor():
|
|
45
|
-
|
|
57
|
+
_print("\x1b[?25l")
|
|
46
58
|
|
|
47
59
|
|
|
48
60
|
def reveal_cursor():
|
|
49
|
-
|
|
61
|
+
_print("\x1b[?25h")
|
|
50
62
|
|
|
51
63
|
|
|
52
64
|
def move_cursor(pos: Tuple[int, int]):
|
|
@@ -56,45 +68,55 @@ def move_cursor(pos: Tuple[int, int]):
|
|
|
56
68
|
x, y = pos
|
|
57
69
|
if x < 0 or y < 0:
|
|
58
70
|
return
|
|
59
|
-
|
|
71
|
+
_print(f"\x1b[{y};{x}H")
|
|
60
72
|
|
|
61
73
|
|
|
62
74
|
def move_cursor_up(n: int):
|
|
63
75
|
if n <= 0:
|
|
64
76
|
return
|
|
65
|
-
|
|
77
|
+
_print(f"\x1b[{n}A")
|
|
66
78
|
|
|
67
79
|
|
|
68
80
|
def line_up(n: int):
|
|
69
81
|
"""Moves to the start of the destination line"""
|
|
70
82
|
if n <= 0:
|
|
71
83
|
return
|
|
72
|
-
|
|
84
|
+
_print(f"\x1b[{n}F")
|
|
73
85
|
|
|
74
86
|
|
|
75
87
|
def move_cursor_down(n: int):
|
|
76
88
|
if n <= 0:
|
|
77
89
|
return
|
|
78
|
-
|
|
90
|
+
_print(f"\x1b[{n}B")
|
|
79
91
|
|
|
80
92
|
|
|
81
93
|
def line_down(n: int):
|
|
82
94
|
"""Moves to the start of the destination line"""
|
|
83
95
|
if n <= 0:
|
|
84
96
|
return
|
|
85
|
-
|
|
97
|
+
_print(f"\x1b[{n}E")
|
|
86
98
|
|
|
87
99
|
|
|
88
100
|
def move_cursor_right(n: int):
|
|
89
101
|
if n <= 0:
|
|
90
102
|
return
|
|
91
|
-
|
|
103
|
+
_print(f"\x1b[{n}C")
|
|
92
104
|
|
|
93
105
|
|
|
94
106
|
def move_cursor_left(n: int):
|
|
95
107
|
if n <= 0:
|
|
96
108
|
return
|
|
97
|
-
|
|
109
|
+
_print(f"\x1b[{n}D")
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def current_cursor_position() -> Tuple[int, int]:
|
|
113
|
+
res = b""
|
|
114
|
+
sys.stdout.write("\x1b[6n")
|
|
115
|
+
sys.stdout.flush()
|
|
116
|
+
while not res.endswith(b"R"):
|
|
117
|
+
res += sys.stdin.buffer.read(1)
|
|
118
|
+
y, x = res.strip(b"\x1b[R").split(b";")
|
|
119
|
+
return int(x), int(y)
|
|
98
120
|
|
|
99
121
|
|
|
100
122
|
def draw_vertical_line(
|
|
@@ -112,16 +134,16 @@ def draw_vertical_line(
|
|
|
112
134
|
return
|
|
113
135
|
|
|
114
136
|
if color is not None:
|
|
115
|
-
|
|
137
|
+
_print(color)
|
|
116
138
|
sep = "\x1b[1A" if up else "\x1b[1B"
|
|
117
139
|
for i in range(height):
|
|
118
140
|
if i == 0 and make_corner:
|
|
119
141
|
corner = "\u2514" if up else "\u2510"
|
|
120
|
-
|
|
142
|
+
_print(f"{corner}\x1b[1D{sep}")
|
|
121
143
|
else:
|
|
122
|
-
|
|
144
|
+
_print(f"\u2502\x1b[1D{sep}")
|
|
123
145
|
if color is not None:
|
|
124
|
-
|
|
146
|
+
_print("\x1b[0m")
|
|
125
147
|
|
|
126
148
|
|
|
127
149
|
def draw_horizontal_line(
|
|
@@ -139,30 +161,16 @@ def draw_horizontal_line(
|
|
|
139
161
|
return
|
|
140
162
|
|
|
141
163
|
if color is not None:
|
|
142
|
-
|
|
164
|
+
_print(color)
|
|
143
165
|
sep = "\x1b[2D" if left else ""
|
|
144
166
|
for i in range(width):
|
|
145
167
|
if i == 0 and make_corner:
|
|
146
168
|
corner = "\u2518" if left else "\u250c"
|
|
147
|
-
|
|
169
|
+
_print(f"{corner}{sep}")
|
|
148
170
|
else:
|
|
149
|
-
|
|
171
|
+
_print(f"\u2500{sep}")
|
|
150
172
|
if color is not None:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
def raw_input(f: Callable[P, T]) -> Callable[P, T]:
|
|
155
|
-
@wraps(f)
|
|
156
|
-
def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
|
|
157
|
-
old_settings = termios.tcgetattr(sys.stdin.fileno())
|
|
158
|
-
tty.setraw(sys.stdin.fileno())
|
|
159
|
-
|
|
160
|
-
try:
|
|
161
|
-
return f(*args, **kwargs)
|
|
162
|
-
finally:
|
|
163
|
-
termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, old_settings)
|
|
164
|
-
|
|
165
|
-
return wrapper
|
|
173
|
+
_print("\x1b[0m")
|
|
166
174
|
|
|
167
175
|
|
|
168
176
|
def read_next_byte() -> bytes:
|
|
@@ -186,9 +194,16 @@ def read_bytes(num_bytes: int) -> bytes:
|
|
|
186
194
|
return result
|
|
187
195
|
|
|
188
196
|
|
|
189
|
-
|
|
197
|
+
T = TypeVar("T")
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class SelectOption(TypedDict, Generic[T]):
|
|
201
|
+
display_name: str
|
|
202
|
+
value: T
|
|
203
|
+
|
|
204
|
+
|
|
190
205
|
def select_tui(
|
|
191
|
-
title: str, options: List[
|
|
206
|
+
title: str, options: List[SelectOption[T]], clear_terminal: bool = True
|
|
192
207
|
) -> Optional[T]:
|
|
193
208
|
"""
|
|
194
209
|
Renders a terminal UI that allows users to select one of the options
|
|
@@ -213,7 +228,7 @@ def select_tui(
|
|
|
213
228
|
if curr_selected < 0 or curr_selected >= len(options):
|
|
214
229
|
curr_selected = 0
|
|
215
230
|
|
|
216
|
-
|
|
231
|
+
_print(title)
|
|
217
232
|
line_down(2)
|
|
218
233
|
|
|
219
234
|
num_lines_rendered = 4 # 4 "extra" lines for header + footer
|
|
@@ -229,21 +244,27 @@ def select_tui(
|
|
|
229
244
|
|
|
230
245
|
prefix = indent[:-2] + "> "
|
|
231
246
|
|
|
232
|
-
|
|
247
|
+
_print(f"{color}{bold}{prefix}{name}{reset}\x1b[1E")
|
|
233
248
|
else:
|
|
234
|
-
|
|
249
|
+
_print(f"{indent}{name}\x1b[1E")
|
|
235
250
|
num_lines_rendered += 1
|
|
236
251
|
|
|
237
252
|
line_down(1)
|
|
238
253
|
|
|
239
254
|
control_str = "[ARROW-KEYS] Navigate\t[ENTER] Select\t[Q] Quit"
|
|
240
|
-
|
|
255
|
+
_print(control_str)
|
|
241
256
|
line_up(num_lines_rendered - 1)
|
|
242
257
|
|
|
243
|
-
|
|
258
|
+
_show()
|
|
244
259
|
|
|
245
260
|
return num_lines_rendered
|
|
246
261
|
|
|
262
|
+
import termios
|
|
263
|
+
import tty
|
|
264
|
+
|
|
265
|
+
old_settings = termios.tcgetattr(sys.stdin.fileno())
|
|
266
|
+
tty.setraw(sys.stdin.fileno())
|
|
267
|
+
|
|
247
268
|
curr_selected = 0
|
|
248
269
|
start_index = 0
|
|
249
270
|
_, term_height = os.get_terminal_size()
|
|
@@ -298,4 +319,5 @@ def select_tui(
|
|
|
298
319
|
finally:
|
|
299
320
|
clear(num_lines_rendered)
|
|
300
321
|
reveal_cursor()
|
|
301
|
-
|
|
322
|
+
_show()
|
|
323
|
+
termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, old_settings)
|
|
@@ -4,14 +4,13 @@ import json
|
|
|
4
4
|
import os
|
|
5
5
|
import signal
|
|
6
6
|
import sys
|
|
7
|
-
from typing import Literal, Optional, TypedDict, Union
|
|
7
|
+
from typing import Generic, Literal, Optional, Tuple, TypedDict, TypeVar, Union
|
|
8
8
|
from urllib.parse import urljoin, urlparse
|
|
9
9
|
|
|
10
10
|
import websockets.client as websockets
|
|
11
11
|
from latch_sdk_config.latch import NUCLEUS_URL
|
|
12
12
|
from typing_extensions import TypeAlias
|
|
13
13
|
|
|
14
|
-
from latch_cli.menus import raw_input
|
|
15
14
|
from latch_cli.services.execute.utils import (
|
|
16
15
|
ContainerNode,
|
|
17
16
|
EGNNode,
|
|
@@ -173,7 +172,6 @@ async def connect(egn_info: EGNNode, container_info: Optional[ContainerNode]):
|
|
|
173
172
|
pass
|
|
174
173
|
|
|
175
174
|
|
|
176
|
-
@raw_input
|
|
177
175
|
def exec(
|
|
178
176
|
execution_id: Optional[str] = None,
|
|
179
177
|
egn_id: Optional[str] = None,
|
|
@@ -186,4 +184,13 @@ def exec(
|
|
|
186
184
|
egn_info = get_egn_info(execution_info, egn_id)
|
|
187
185
|
container_info = get_container_info(egn_info, container_index)
|
|
188
186
|
|
|
189
|
-
|
|
187
|
+
import termios
|
|
188
|
+
import tty
|
|
189
|
+
|
|
190
|
+
old_settings_stdin = termios.tcgetattr(sys.stdin.fileno())
|
|
191
|
+
tty.setraw(sys.stdin)
|
|
192
|
+
|
|
193
|
+
try:
|
|
194
|
+
asyncio.run(connect(egn_info, container_info))
|
|
195
|
+
finally:
|
|
196
|
+
termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, old_settings_stdin)
|