latch 2.40.4.dev4__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.
Files changed (209) hide show
  1. latch-2.40.4.dev5/PKG-INFO +39 -0
  2. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/account.py +7 -11
  3. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/registry/project.py +7 -11
  4. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/registry/table.py +14 -20
  5. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/verified/deseq2.py +18 -28
  6. latch-2.40.4.dev5/latch.egg-info/PKG-INFO +39 -0
  7. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch.egg-info/SOURCES.txt +11 -3
  8. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/centromere/utils.py +4 -0
  9. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/build.py +33 -8
  10. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/channel.py +10 -2
  11. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/file_persistence.py +14 -1
  12. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/adapters.py +9 -5
  13. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/base.py +4 -1
  14. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/operator.py +1 -1
  15. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/process.py +3 -1
  16. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/main.py +24 -0
  17. latch-2.40.4.dev5/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
  18. latch-2.40.4.dev5/latch_cli/services/init/__pycache__/__init__.cpython-311.pyc +0 -0
  19. latch-2.40.4.dev5/latch_cli/services/init/__pycache__/__init__.cpython-38.pyc +0 -0
  20. latch-2.40.4.dev5/latch_cli/services/init/__pycache__/__init__.cpython-39.pyc +0 -0
  21. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/__pycache__/init.cpython-310.pyc +0 -0
  22. latch-2.40.4.dev5/latch_cli/services/init/__pycache__/init.cpython-311.pyc +0 -0
  23. latch-2.40.4.dev5/latch_cli/services/init/__pycache__/init.cpython-38.pyc +0 -0
  24. latch-2.40.4.dev5/latch_cli/services/init/__pycache__/init.cpython-39.pyc +0 -0
  25. latch-2.40.4.dev5/latch_cli/services/init/assemble_and_sort/__pycache__/__init__.cpython-310.pyc +0 -0
  26. latch-2.40.4.dev5/latch_cli/services/init/example_conda/__pycache__/__init__.cpython-310.pyc +0 -0
  27. latch-2.40.4.dev5/latch_cli/services/init/example_nf_integration/latch_metadata/__pycache__/__init__.cpython-311.pyc +0 -0
  28. latch-2.40.4.dev5/latch_cli/services/init/example_r/__pycache__/__init__.cpython-310.pyc +0 -0
  29. latch-2.40.4.dev5/latch_cli/services/init/template/__pycache__/__init__.cpython-310.pyc +0 -0
  30. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/register/register.py +2 -0
  31. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/setup.py +1 -1
  32. latch-2.40.4.dev4/PKG-INFO +0 -13
  33. latch-2.40.4.dev4/latch.egg-info/PKG-INFO +0 -13
  34. latch-2.40.4.dev4/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
  35. latch-2.40.4.dev4/latch_cli/services/init/example_docker/.__init__.py.swn +0 -0
  36. latch-2.40.4.dev4/latch_cli/services/init/example_docker/.__init__.py.swo +0 -0
  37. latch-2.40.4.dev4/latch_cli/services/init/example_docker/.__init__.py.swp +0 -0
  38. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/LICENSE +0 -0
  39. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/MANIFEST.in +0 -0
  40. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/README.md +0 -0
  41. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/__init__.py +0 -0
  42. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/executions.py +0 -0
  43. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/functions/__init__.py +0 -0
  44. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/functions/messages.py +0 -0
  45. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/functions/operators.py +0 -0
  46. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/functions/secrets.py +0 -0
  47. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/__init__.py +0 -0
  48. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/_transfer/__init__.py +0 -0
  49. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/_transfer/download.py +0 -0
  50. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/_transfer/manager.py +0 -0
  51. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/_transfer/node.py +0 -0
  52. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/_transfer/progress.py +0 -0
  53. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/_transfer/remote_copy.py +0 -0
  54. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/_transfer/throttle.py +0 -0
  55. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/_transfer/upload.py +0 -0
  56. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/_transfer/utils.py +0 -0
  57. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/path.py +0 -0
  58. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/ldata/type.py +0 -0
  59. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/registry/__init__.py +0 -0
  60. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/registry/record.py +0 -0
  61. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/registry/types.py +0 -0
  62. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/registry/upstream_types/__init__.py +0 -0
  63. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/registry/upstream_types/types.py +0 -0
  64. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/registry/upstream_types/values.py +0 -0
  65. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/registry/utils.py +0 -0
  66. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/resources/__init__.py +0 -0
  67. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/resources/conditional.py +0 -0
  68. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/resources/dynamic.py +0 -0
  69. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/resources/launch_plan.py +0 -0
  70. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/resources/map_tasks.py +0 -0
  71. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/resources/reference_workflow.py +0 -0
  72. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/resources/tasks.py +0 -0
  73. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/resources/workflow.py +0 -0
  74. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/types/__init__.py +0 -0
  75. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/types/directory.py +0 -0
  76. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/types/file.py +0 -0
  77. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/types/glob.py +0 -0
  78. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/types/json.py +0 -0
  79. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/types/metadata.py +0 -0
  80. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/types/utils.py +0 -0
  81. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/utils.py +0 -0
  82. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/verified/__init__.py +0 -0
  83. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/verified/mafft.py +0 -0
  84. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/verified/pathway.py +0 -0
  85. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/verified/rnaseq.py +0 -0
  86. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch/verified/trim_galore.py +0 -0
  87. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch.egg-info/dependency_links.txt +0 -0
  88. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch.egg-info/entry_points.txt +0 -0
  89. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch.egg-info/requires.txt +0 -0
  90. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch.egg-info/top_level.txt +0 -0
  91. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/__init__.py +0 -0
  92. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/auth/__init__.py +0 -0
  93. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/auth/csrf.py +0 -0
  94. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/auth/oauth2.py +0 -0
  95. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/auth/pkce.py +0 -0
  96. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/auth/utils.py +0 -0
  97. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/centromere/__init__.py +0 -0
  98. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/centromere/ctx.py +0 -0
  99. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/click_utils.py +0 -0
  100. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/constants.py +0 -0
  101. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/docker_utils/__init__.py +0 -0
  102. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/exceptions/__init__.py +0 -0
  103. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/exceptions/cache.py +0 -0
  104. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/exceptions/errors.py +0 -0
  105. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/exceptions/handler.py +0 -0
  106. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/exceptions/traceback.py +0 -0
  107. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/__init__.py +0 -0
  108. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/common/__init__.py +0 -0
  109. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/common/config/__init__.py +0 -0
  110. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/common/config/parser.py +0 -0
  111. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/common/config/utils.py +0 -0
  112. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/common/serialize.py +0 -0
  113. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/common/utils.py +0 -0
  114. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/__init__.py +0 -0
  115. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/config.py +0 -0
  116. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/dag.py +0 -0
  117. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/serialize.py +0 -0
  118. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/__init__.py +0 -0
  119. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/conditional.py +0 -0
  120. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/map.py +0 -0
  121. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/tasks/merge.py +0 -0
  122. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/nextflow/workflow.py +0 -0
  123. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/__init__.py +0 -0
  124. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/config.py +0 -0
  125. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/serialize.py +0 -0
  126. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/single_task_snakemake.py +0 -0
  127. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/utils.py +0 -0
  128. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/extras/snakemake/workflow.py +0 -0
  129. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/menus.py +0 -0
  130. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/__init__.py +0 -0
  131. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/cp/__init__.py +0 -0
  132. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/cp/autocomplete.py +0 -0
  133. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/cp/glob.py +0 -0
  134. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/cp/main.py +0 -0
  135. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/cp/utils.py +0 -0
  136. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/execute/__init__.py +0 -0
  137. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/execute/main.py +0 -0
  138. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/execute/utils.py +0 -0
  139. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/get.py +0 -0
  140. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/get_executions.py +0 -0
  141. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/get_params.py +0 -0
  142. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/__init__.py +0 -0
  143. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/.env +0 -0
  144. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/LICENSE +0 -0
  145. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/README.md +0 -0
  146. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/__init__.py +0 -0
  147. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/assemble.py +0 -0
  148. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/sort.py +0 -0
  149. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/assemble_and_sort/system-requirements.txt +0 -0
  150. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/common/.dockerignore +0 -0
  151. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_conda/__init__.py +0 -0
  152. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_conda/conda_task.py +0 -0
  153. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_conda/environment.yaml +0 -0
  154. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_docker/__init__.py +0 -0
  155. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_docker/task.py +0 -0
  156. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_nextflow/main.nf +0 -0
  157. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_nextflow/nextflow.config +0 -0
  158. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_nextflow/workflow.nf +0 -0
  159. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_nfcore/Dockerfile +0 -0
  160. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_nfcore/__init__.py +0 -0
  161. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_nfcore/task.py +0 -0
  162. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_r/__init__.py +0 -0
  163. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_r/environment.R +0 -0
  164. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_r/r_task.py +0 -0
  165. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/.latch/latch_entrypoint +0 -0
  166. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/Dockerfile +0 -0
  167. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/Snakefile +0 -0
  168. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/config.yaml +0 -0
  169. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/environment.yaml +0 -0
  170. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/latch_metadata.py +0 -0
  171. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/scripts/plot-quals.py +0 -0
  172. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/example_snakemake/version +0 -0
  173. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/init.py +0 -0
  174. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/template/LICENSE +0 -0
  175. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/template/README.md +0 -0
  176. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/template/__init__.py +0 -0
  177. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/init/template/task.py +0 -0
  178. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/launch.py +0 -0
  179. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/local_dev.py +0 -0
  180. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/local_dev_old.py +0 -0
  181. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/login.py +0 -0
  182. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/ls.py +0 -0
  183. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/mkdir.py +0 -0
  184. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/move.py +0 -0
  185. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/preview.py +0 -0
  186. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/register/__init__.py +0 -0
  187. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/register/constants.py +0 -0
  188. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/register/utils.py +0 -0
  189. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/rm.py +0 -0
  190. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/stop_pod.py +0 -0
  191. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/sync.py +0 -0
  192. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/test_data/__init__.py +0 -0
  193. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/test_data/ls.py +0 -0
  194. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/test_data/remove.py +0 -0
  195. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/test_data/upload.py +0 -0
  196. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/test_data/utils.py +0 -0
  197. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/services/workspace.py +0 -0
  198. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/tinyrequests.py +0 -0
  199. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/tui/__init__.py +0 -0
  200. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/utils/__init__.py +0 -0
  201. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/utils/path.py +0 -0
  202. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/utils/workflow.py +0 -0
  203. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/latch_cli/workflow_config.py +0 -0
  204. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/pyproject.toml +0 -0
  205. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/setup.cfg +0 -0
  206. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/tests/__init__.py +0 -0
  207. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/tests/cp/__init__.py +0 -0
  208. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/tests/fixtures.py +0 -0
  209. {latch-2.40.4.dev4 → latch-2.40.4.dev5}/tests/test_ls.py +0 -0
@@ -0,0 +1,39 @@
1
+ Metadata-Version: 2.1
2
+ Name: latch
3
+ Version: 2.40.4.dev5
4
+ Summary: The Latch SDK
5
+ Author-email: kenny@latch.bio
6
+ Classifier: Programming Language :: Python :: 3.8
7
+ Classifier: Programming Language :: Python :: 3.9
8
+ Classifier: Programming Language :: Python :: 3.10
9
+ Classifier: Programming Language :: Python :: 3.11
10
+ Requires-Python: >=3.8,<3.12
11
+ License-File: LICENSE
12
+ Requires-Dist: kubernetes>=24.2.0
13
+ Requires-Dist: pyjwt>=0.2.0
14
+ Requires-Dist: requests>=2.28.1
15
+ Requires-Dist: click>=8.0
16
+ Requires-Dist: docker>=5.0
17
+ Requires-Dist: paramiko>=3.2.0
18
+ Requires-Dist: scp>=0.14.0
19
+ Requires-Dist: boto3>=1.26.0
20
+ Requires-Dist: tqdm>=4.63.0
21
+ Requires-Dist: lytekit==0.15.6
22
+ Requires-Dist: lytekitplugins-pods==0.6.2
23
+ Requires-Dist: typing-extensions==4.7.1
24
+ Requires-Dist: apscheduler==3.9.1
25
+ Requires-Dist: gql==3.4.0
26
+ Requires-Dist: graphql-core==3.2.3
27
+ Requires-Dist: requests-toolbelt==0.10.1
28
+ Requires-Dist: latch-sdk-gql==0.0.6
29
+ Requires-Dist: latch-sdk-config==0.0.4
30
+ Requires-Dist: python-dateutil>=2.8
31
+ Requires-Dist: aioconsole==0.6.1
32
+ Requires-Dist: asyncssh==2.13.2
33
+ Requires-Dist: websockets==11.0.3
34
+ Requires-Dist: watchfiles==0.19.0
35
+ Provides-Extra: snakemake
36
+ Requires-Dist: snakemake<7.30.2,>=7.18.0; extra == "snakemake"
37
+ Requires-Dist: pulp<2.8,>=2.0; extra == "snakemake"
38
+ Provides-Extra: pandas
39
+ Requires-Dist: pandas>=2.0.0; extra == "pandas"
@@ -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
- "argOwnerId": self.account.id,
264
- "argDisplayNames": display_names,
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
- "argIds": ids,
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
- "argProjectId": self.project.id,
234
- "argDisplayNames": display_names,
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
- "argIds": ids,
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
- "argExperimentId": self.table.id,
502
- "argNames": names,
503
- "argData": _var_node(argDataVar),
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
- "argExperimentId": self.table.id,
543
- "argNames": names,
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
- "argExperimentId": self.table.id,
696
- "argKeys": keys,
697
- "argTypes": _var_node(argTypesVar),
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])
@@ -19,17 +19,13 @@ def deseq2_wf(
19
19
  raw_count_table: Optional[
20
20
  Annotated[
21
21
  LatchFile,
22
- FlyteAnnotation(
23
- {
24
- "_tmp_hack_deseq2": "counts_table",
25
- "rules": [
26
- {
27
- "regex": r".*\.(csv|tsv|xlsx)$",
28
- "message": "Expected a CSV, TSV, or XLSX file",
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
- "_tmp_hack_deseq2": "design_matrix",
50
- "rules": [
51
- {
52
- "regex": r".*\.(csv|tsv|xlsx)$",
53
- "message": "Expected a CSV, TSV, or XLSX file",
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
- "_tmp_hack_deseq2": "design_formula",
68
- "_tmp_hack_deseq2_allow_clustering": True,
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: ...
@@ -0,0 +1,39 @@
1
+ Metadata-Version: 2.1
2
+ Name: latch
3
+ Version: 2.40.4.dev5
4
+ Summary: The Latch SDK
5
+ Author-email: kenny@latch.bio
6
+ Classifier: Programming Language :: Python :: 3.8
7
+ Classifier: Programming Language :: Python :: 3.9
8
+ Classifier: Programming Language :: Python :: 3.10
9
+ Classifier: Programming Language :: Python :: 3.11
10
+ Requires-Python: >=3.8,<3.12
11
+ License-File: LICENSE
12
+ Requires-Dist: kubernetes>=24.2.0
13
+ Requires-Dist: pyjwt>=0.2.0
14
+ Requires-Dist: requests>=2.28.1
15
+ Requires-Dist: click>=8.0
16
+ Requires-Dist: docker>=5.0
17
+ Requires-Dist: paramiko>=3.2.0
18
+ Requires-Dist: scp>=0.14.0
19
+ Requires-Dist: boto3>=1.26.0
20
+ Requires-Dist: tqdm>=4.63.0
21
+ Requires-Dist: lytekit==0.15.6
22
+ Requires-Dist: lytekitplugins-pods==0.6.2
23
+ Requires-Dist: typing-extensions==4.7.1
24
+ Requires-Dist: apscheduler==3.9.1
25
+ Requires-Dist: gql==3.4.0
26
+ Requires-Dist: graphql-core==3.2.3
27
+ Requires-Dist: requests-toolbelt==0.10.1
28
+ Requires-Dist: latch-sdk-gql==0.0.6
29
+ Requires-Dist: latch-sdk-config==0.0.4
30
+ Requires-Dist: python-dateutil>=2.8
31
+ Requires-Dist: aioconsole==0.6.1
32
+ Requires-Dist: asyncssh==2.13.2
33
+ Requires-Dist: websockets==11.0.3
34
+ Requires-Dist: watchfiles==0.19.0
35
+ Provides-Extra: snakemake
36
+ Requires-Dist: snakemake<7.30.2,>=7.18.0; extra == "snakemake"
37
+ Requires-Dist: pulp<2.8,>=2.0; extra == "snakemake"
38
+ Provides-Extra: pandas
39
+ Requires-Dist: pandas>=2.0.0; extra == "pandas"
@@ -136,7 +136,13 @@ latch_cli/services/execute/utils.py
136
136
  latch_cli/services/init/__init__.py
137
137
  latch_cli/services/init/init.py
138
138
  latch_cli/services/init/__pycache__/__init__.cpython-310.pyc
139
+ latch_cli/services/init/__pycache__/__init__.cpython-311.pyc
140
+ latch_cli/services/init/__pycache__/__init__.cpython-38.pyc
141
+ latch_cli/services/init/__pycache__/__init__.cpython-39.pyc
139
142
  latch_cli/services/init/__pycache__/init.cpython-310.pyc
143
+ latch_cli/services/init/__pycache__/init.cpython-311.pyc
144
+ latch_cli/services/init/__pycache__/init.cpython-38.pyc
145
+ latch_cli/services/init/__pycache__/init.cpython-39.pyc
140
146
  latch_cli/services/init/assemble_and_sort/.env
141
147
  latch_cli/services/init/assemble_and_sort/LICENSE
142
148
  latch_cli/services/init/assemble_and_sort/README.md
@@ -144,24 +150,25 @@ latch_cli/services/init/assemble_and_sort/__init__.py
144
150
  latch_cli/services/init/assemble_and_sort/assemble.py
145
151
  latch_cli/services/init/assemble_and_sort/sort.py
146
152
  latch_cli/services/init/assemble_and_sort/system-requirements.txt
153
+ latch_cli/services/init/assemble_and_sort/__pycache__/__init__.cpython-310.pyc
147
154
  latch_cli/services/init/common/.dockerignore
148
155
  latch_cli/services/init/example_conda/__init__.py
149
156
  latch_cli/services/init/example_conda/conda_task.py
150
157
  latch_cli/services/init/example_conda/environment.yaml
151
- latch_cli/services/init/example_docker/.__init__.py.swn
152
- latch_cli/services/init/example_docker/.__init__.py.swo
153
- latch_cli/services/init/example_docker/.__init__.py.swp
158
+ latch_cli/services/init/example_conda/__pycache__/__init__.cpython-310.pyc
154
159
  latch_cli/services/init/example_docker/__init__.py
155
160
  latch_cli/services/init/example_docker/task.py
156
161
  latch_cli/services/init/example_nextflow/main.nf
157
162
  latch_cli/services/init/example_nextflow/nextflow.config
158
163
  latch_cli/services/init/example_nextflow/workflow.nf
164
+ latch_cli/services/init/example_nf_integration/latch_metadata/__pycache__/__init__.cpython-311.pyc
159
165
  latch_cli/services/init/example_nfcore/Dockerfile
160
166
  latch_cli/services/init/example_nfcore/__init__.py
161
167
  latch_cli/services/init/example_nfcore/task.py
162
168
  latch_cli/services/init/example_r/__init__.py
163
169
  latch_cli/services/init/example_r/environment.R
164
170
  latch_cli/services/init/example_r/r_task.py
171
+ latch_cli/services/init/example_r/__pycache__/__init__.cpython-310.pyc
165
172
  latch_cli/services/init/example_snakemake/Dockerfile
166
173
  latch_cli/services/init/example_snakemake/Snakefile
167
174
  latch_cli/services/init/example_snakemake/config.yaml
@@ -174,6 +181,7 @@ latch_cli/services/init/template/LICENSE
174
181
  latch_cli/services/init/template/README.md
175
182
  latch_cli/services/init/template/__init__.py
176
183
  latch_cli/services/init/template/task.py
184
+ latch_cli/services/init/template/__pycache__/__init__.cpython-310.pyc
177
185
  latch_cli/services/register/__init__.py
178
186
  latch_cli/services/register/constants.py
179
187
  latch_cli/services/register/register.py
@@ -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, *, execution_profile: Optional[str] = None
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
- output_name = "res"
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
- output_name = dep.outputNames[idx]
115
+ dep_output_name = dep.outputNames[idx]
113
116
 
114
117
  if vertex.type == VertexType.Merge:
115
- merge_sources[output_name].append(input_name)
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=output_name)
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(wf, execution_profile=execution_profile)
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(adapter_output_cls: Type[NT], mapper_outputs: List[DC]) -> NT:
68
- kwargs: Dict[str, str] = {}
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(f"return Res_{self.id}(default=result)", 1)
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(cpu=cpu, memory=memory).keywords["task_config"],
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
 
@@ -90,7 +90,7 @@ class NextflowOperatorTask(NextflowBaseTask):
90
90
  results.append(
91
91
  reindent(
92
92
  rf"""
93
- {out_name}=out_channels.get("{out_name}", "[]")
93
+ {out_name}=out_channels.get("{out_name}")
94
94
  """,
95
95
  2,
96
96
  ).rstrip()
@@ -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()
@@ -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