latch 2.39.0.dev21__tar.gz → 2.39.0.dev22__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 (205) hide show
  1. {latch-2.39.0.dev21/latch.egg-info → latch-2.39.0.dev22}/PKG-INFO +1 -1
  2. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/types/metadata.py +1 -1
  3. {latch-2.39.0.dev21 → latch-2.39.0.dev22/latch.egg-info}/PKG-INFO +1 -1
  4. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch.egg-info/SOURCES.txt +3 -14
  5. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/docker_utils/__init__.py +1 -0
  6. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/common/serialize.py +12 -4
  7. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/build.py +11 -27
  8. latch-2.39.0.dev22/latch_cli/extras/nextflow/config.py +158 -0
  9. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/dag.py +0 -1
  10. latch-2.39.0.dev22/latch_cli/extras/nextflow/serialize.py +60 -0
  11. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/adapters.py +22 -4
  12. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/base.py +13 -0
  13. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/conditional.py +5 -14
  14. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/input.py +4 -0
  15. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/map.py +3 -1
  16. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/merge.py +7 -0
  17. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/operator.py +6 -2
  18. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/process.py +4 -2
  19. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/workflow.py +3 -2
  20. latch-2.39.0.dev21/latch_cli/extras/snakemake/config/parser.py → latch-2.39.0.dev22/latch_cli/extras/snakemake/config.py +110 -132
  21. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/snakemake/utils.py +0 -4
  22. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/snakemake/workflow.py +0 -1
  23. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/main.py +74 -11
  24. latch-2.39.0.dev22/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
  25. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/__pycache__/init.cpython-310.pyc +0 -0
  26. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/register/register.py +5 -0
  27. latch-2.39.0.dev22/latch_cli/utils/workflow.py +84 -0
  28. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/setup.py +1 -1
  29. latch-2.39.0.dev21/latch_cli/extras/nextflow/serialize.py +0 -11
  30. latch-2.39.0.dev21/latch_cli/extras/snakemake/config/utils.py +0 -320
  31. latch-2.39.0.dev21/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
  32. latch-2.39.0.dev21/latch_cli/services/init/__pycache__/__init__.cpython-311.pyc +0 -0
  33. latch-2.39.0.dev21/latch_cli/services/init/__pycache__/__init__.cpython-38.pyc +0 -0
  34. latch-2.39.0.dev21/latch_cli/services/init/__pycache__/__init__.cpython-39.pyc +0 -0
  35. latch-2.39.0.dev21/latch_cli/services/init/__pycache__/init.cpython-311.pyc +0 -0
  36. latch-2.39.0.dev21/latch_cli/services/init/__pycache__/init.cpython-38.pyc +0 -0
  37. latch-2.39.0.dev21/latch_cli/services/init/__pycache__/init.cpython-39.pyc +0 -0
  38. latch-2.39.0.dev21/latch_cli/services/init/assemble_and_sort/__pycache__/__init__.cpython-310.pyc +0 -0
  39. latch-2.39.0.dev21/latch_cli/services/init/example_conda/__pycache__/__init__.cpython-310.pyc +0 -0
  40. latch-2.39.0.dev21/latch_cli/services/init/example_nf_integration/latch_metadata/__pycache__/__init__.cpython-311.pyc +0 -0
  41. latch-2.39.0.dev21/latch_cli/services/init/example_r/__pycache__/__init__.cpython-310.pyc +0 -0
  42. latch-2.39.0.dev21/latch_cli/services/init/template/__pycache__/__init__.cpython-310.pyc +0 -0
  43. latch-2.39.0.dev21/tests/__init__.py +0 -0
  44. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/LICENSE +0 -0
  45. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/MANIFEST.in +0 -0
  46. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/README.md +0 -0
  47. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/__init__.py +0 -0
  48. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/account.py +0 -0
  49. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/executions.py +0 -0
  50. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/functions/__init__.py +0 -0
  51. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/functions/messages.py +0 -0
  52. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/functions/operators.py +0 -0
  53. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/functions/secrets.py +0 -0
  54. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/__init__.py +0 -0
  55. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/_transfer/__init__.py +0 -0
  56. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/_transfer/download.py +0 -0
  57. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/_transfer/manager.py +0 -0
  58. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/_transfer/node.py +0 -0
  59. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/_transfer/progress.py +0 -0
  60. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/_transfer/remote_copy.py +0 -0
  61. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/_transfer/throttle.py +0 -0
  62. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/_transfer/upload.py +0 -0
  63. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/_transfer/utils.py +0 -0
  64. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/path.py +0 -0
  65. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/ldata/type.py +0 -0
  66. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/registry/__init__.py +0 -0
  67. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/registry/project.py +0 -0
  68. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/registry/record.py +0 -0
  69. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/registry/table.py +0 -0
  70. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/registry/types.py +0 -0
  71. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/registry/upstream_types/__init__.py +0 -0
  72. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/registry/upstream_types/types.py +0 -0
  73. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/registry/upstream_types/values.py +0 -0
  74. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/registry/utils.py +0 -0
  75. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/resources/__init__.py +0 -0
  76. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/resources/conditional.py +0 -0
  77. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/resources/launch_plan.py +0 -0
  78. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/resources/map_tasks.py +0 -0
  79. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/resources/reference_workflow.py +0 -0
  80. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/resources/tasks.py +0 -0
  81. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/resources/workflow.py +0 -0
  82. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/types/__init__.py +0 -0
  83. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/types/directory.py +0 -0
  84. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/types/file.py +0 -0
  85. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/types/glob.py +0 -0
  86. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/types/json.py +0 -0
  87. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/types/utils.py +0 -0
  88. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/verified/__init__.py +0 -0
  89. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/verified/deseq2.py +0 -0
  90. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/verified/mafft.py +0 -0
  91. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/verified/pathway.py +0 -0
  92. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/verified/rnaseq.py +0 -0
  93. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch/verified/trim_galore.py +0 -0
  94. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch.egg-info/dependency_links.txt +0 -0
  95. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch.egg-info/entry_points.txt +0 -0
  96. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch.egg-info/requires.txt +0 -0
  97. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch.egg-info/top_level.txt +0 -0
  98. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/__init__.py +0 -0
  99. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/auth/__init__.py +0 -0
  100. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/auth/csrf.py +0 -0
  101. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/auth/oauth2.py +0 -0
  102. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/auth/pkce.py +0 -0
  103. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/auth/utils.py +0 -0
  104. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/centromere/__init__.py +0 -0
  105. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/centromere/ctx.py +0 -0
  106. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/centromere/utils.py +0 -0
  107. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/click_utils.py +0 -0
  108. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/constants.py +0 -0
  109. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/exceptions/__init__.py +0 -0
  110. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/exceptions/cache.py +0 -0
  111. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/exceptions/errors.py +0 -0
  112. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/exceptions/handler.py +0 -0
  113. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/exceptions/traceback.py +0 -0
  114. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/__init__.py +0 -0
  115. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/common/__init__.py +0 -0
  116. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/common/utils.py +0 -0
  117. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/__init__.py +0 -0
  118. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/channel.py +0 -0
  119. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/file_persistence.py +0 -0
  120. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/__init__.py +0 -0
  121. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/nextflow/tasks/output.py +0 -0
  122. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/snakemake/__init__.py +0 -0
  123. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/snakemake/serialize.py +0 -0
  124. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/extras/snakemake/single_task_snakemake.py +0 -0
  125. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/menus.py +0 -0
  126. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/__init__.py +0 -0
  127. {latch-2.39.0.dev21/latch_cli/extras/snakemake/config → latch-2.39.0.dev22/latch_cli/services/cp}/__init__.py +0 -0
  128. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/cp/autocomplete.py +0 -0
  129. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/cp/glob.py +0 -0
  130. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/cp/main.py +0 -0
  131. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/cp/utils.py +0 -0
  132. {latch-2.39.0.dev21/latch_cli/services/cp → latch-2.39.0.dev22/latch_cli/services/execute}/__init__.py +0 -0
  133. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/execute/main.py +0 -0
  134. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/execute/utils.py +0 -0
  135. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/get.py +0 -0
  136. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/get_executions.py +0 -0
  137. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/get_params.py +0 -0
  138. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/__init__.py +0 -0
  139. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/assemble_and_sort/.env +0 -0
  140. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/assemble_and_sort/LICENSE +0 -0
  141. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/assemble_and_sort/README.md +0 -0
  142. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/assemble_and_sort/__init__.py +0 -0
  143. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/assemble_and_sort/assemble.py +0 -0
  144. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/assemble_and_sort/sort.py +0 -0
  145. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/assemble_and_sort/system-requirements.txt +0 -0
  146. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/common/.dockerignore +0 -0
  147. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_conda/__init__.py +0 -0
  148. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_conda/conda_task.py +0 -0
  149. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_conda/environment.yaml +0 -0
  150. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_docker/__init__.py +0 -0
  151. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_docker/task.py +0 -0
  152. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_nf_integration/Dockerfile +0 -0
  153. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_nf_integration/latch_metadata/__init__.py +0 -0
  154. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_nf_integration/main.nf +0 -0
  155. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_nf_integration/workflow.nf +0 -0
  156. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_nfcore/Dockerfile +0 -0
  157. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_nfcore/__init__.py +0 -0
  158. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_nfcore/task.py +0 -0
  159. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_r/__init__.py +0 -0
  160. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_r/environment.R +0 -0
  161. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_r/r_task.py +0 -0
  162. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_snakemake/.latch/latch_entrypoint +0 -0
  163. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_snakemake/Dockerfile +0 -0
  164. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_snakemake/Snakefile +0 -0
  165. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_snakemake/config.yaml +0 -0
  166. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_snakemake/environment.yaml +0 -0
  167. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_snakemake/latch_metadata.py +0 -0
  168. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_snakemake/scripts/plot-quals.py +0 -0
  169. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/example_snakemake/version +0 -0
  170. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/init.py +0 -0
  171. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/template/LICENSE +0 -0
  172. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/template/README.md +0 -0
  173. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/template/__init__.py +0 -0
  174. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/init/template/task.py +0 -0
  175. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/launch.py +0 -0
  176. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/local_dev.py +0 -0
  177. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/local_dev_old.py +0 -0
  178. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/login.py +0 -0
  179. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/ls.py +0 -0
  180. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/mkdir.py +0 -0
  181. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/move.py +0 -0
  182. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/preview.py +0 -0
  183. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/register/__init__.py +0 -0
  184. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/register/constants.py +0 -0
  185. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/register/utils.py +0 -0
  186. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/rm.py +0 -0
  187. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/stop_pod.py +0 -0
  188. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/sync.py +0 -0
  189. {latch-2.39.0.dev21/latch_cli/services/execute → latch-2.39.0.dev22/latch_cli/services/test_data}/__init__.py +0 -0
  190. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/test_data/ls.py +0 -0
  191. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/test_data/remove.py +0 -0
  192. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/test_data/upload.py +0 -0
  193. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/test_data/utils.py +0 -0
  194. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/services/workspace.py +0 -0
  195. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/tinyrequests.py +0 -0
  196. {latch-2.39.0.dev21/latch_cli/services/test_data → latch-2.39.0.dev22/latch_cli/tui}/__init__.py +0 -0
  197. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/utils/__init__.py +0 -0
  198. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/utils/path.py +0 -0
  199. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/latch_cli/workflow_config.py +0 -0
  200. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/pyproject.toml +0 -0
  201. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/setup.cfg +0 -0
  202. {latch-2.39.0.dev21/latch_cli/tui → latch-2.39.0.dev22/tests}/__init__.py +0 -0
  203. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/tests/cp/__init__.py +0 -0
  204. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/tests/fixtures.py +0 -0
  205. {latch-2.39.0.dev21 → latch-2.39.0.dev22}/tests/test_ls.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: latch
3
- Version: 2.39.0.dev21
3
+ Version: 2.39.0.dev22
4
4
  Summary: The Latch SDK
5
5
  Author-email: kenny@latch.bio
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -661,7 +661,7 @@ class SnakemakeMetadata(LatchMetadata):
661
661
  """
662
662
 
663
663
  def validate(self):
664
- from latch_cli.extras.snakemake.config.utils import validate_snakemake_type
664
+ from latch_cli.extras.snakemake.config import validate_snakemake_type
665
665
 
666
666
  for name, param in self.parameters.items():
667
667
  if param.default is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: latch
3
- Version: 2.39.0.dev21
3
+ Version: 2.39.0.dev22
4
4
  Summary: The Latch SDK
5
5
  Author-email: kenny@latch.bio
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -85,6 +85,7 @@ latch_cli/extras/common/utils.py
85
85
  latch_cli/extras/nextflow/__init__.py
86
86
  latch_cli/extras/nextflow/build.py
87
87
  latch_cli/extras/nextflow/channel.py
88
+ latch_cli/extras/nextflow/config.py
88
89
  latch_cli/extras/nextflow/dag.py
89
90
  latch_cli/extras/nextflow/file_persistence.py
90
91
  latch_cli/extras/nextflow/serialize.py
@@ -100,13 +101,11 @@ latch_cli/extras/nextflow/tasks/operator.py
100
101
  latch_cli/extras/nextflow/tasks/output.py
101
102
  latch_cli/extras/nextflow/tasks/process.py
102
103
  latch_cli/extras/snakemake/__init__.py
104
+ latch_cli/extras/snakemake/config.py
103
105
  latch_cli/extras/snakemake/serialize.py
104
106
  latch_cli/extras/snakemake/single_task_snakemake.py
105
107
  latch_cli/extras/snakemake/utils.py
106
108
  latch_cli/extras/snakemake/workflow.py
107
- latch_cli/extras/snakemake/config/__init__.py
108
- latch_cli/extras/snakemake/config/parser.py
109
- latch_cli/extras/snakemake/config/utils.py
110
109
  latch_cli/services/__init__.py
111
110
  latch_cli/services/get.py
112
111
  latch_cli/services/get_executions.py
@@ -134,13 +133,7 @@ latch_cli/services/execute/utils.py
134
133
  latch_cli/services/init/__init__.py
135
134
  latch_cli/services/init/init.py
136
135
  latch_cli/services/init/__pycache__/__init__.cpython-310.pyc
137
- latch_cli/services/init/__pycache__/__init__.cpython-311.pyc
138
- latch_cli/services/init/__pycache__/__init__.cpython-38.pyc
139
- latch_cli/services/init/__pycache__/__init__.cpython-39.pyc
140
136
  latch_cli/services/init/__pycache__/init.cpython-310.pyc
141
- latch_cli/services/init/__pycache__/init.cpython-311.pyc
142
- latch_cli/services/init/__pycache__/init.cpython-38.pyc
143
- latch_cli/services/init/__pycache__/init.cpython-39.pyc
144
137
  latch_cli/services/init/assemble_and_sort/.env
145
138
  latch_cli/services/init/assemble_and_sort/LICENSE
146
139
  latch_cli/services/init/assemble_and_sort/README.md
@@ -148,26 +141,22 @@ latch_cli/services/init/assemble_and_sort/__init__.py
148
141
  latch_cli/services/init/assemble_and_sort/assemble.py
149
142
  latch_cli/services/init/assemble_and_sort/sort.py
150
143
  latch_cli/services/init/assemble_and_sort/system-requirements.txt
151
- latch_cli/services/init/assemble_and_sort/__pycache__/__init__.cpython-310.pyc
152
144
  latch_cli/services/init/common/.dockerignore
153
145
  latch_cli/services/init/example_conda/__init__.py
154
146
  latch_cli/services/init/example_conda/conda_task.py
155
147
  latch_cli/services/init/example_conda/environment.yaml
156
- latch_cli/services/init/example_conda/__pycache__/__init__.cpython-310.pyc
157
148
  latch_cli/services/init/example_docker/__init__.py
158
149
  latch_cli/services/init/example_docker/task.py
159
150
  latch_cli/services/init/example_nf_integration/Dockerfile
160
151
  latch_cli/services/init/example_nf_integration/main.nf
161
152
  latch_cli/services/init/example_nf_integration/workflow.nf
162
153
  latch_cli/services/init/example_nf_integration/latch_metadata/__init__.py
163
- latch_cli/services/init/example_nf_integration/latch_metadata/__pycache__/__init__.cpython-311.pyc
164
154
  latch_cli/services/init/example_nfcore/Dockerfile
165
155
  latch_cli/services/init/example_nfcore/__init__.py
166
156
  latch_cli/services/init/example_nfcore/task.py
167
157
  latch_cli/services/init/example_r/__init__.py
168
158
  latch_cli/services/init/example_r/environment.R
169
159
  latch_cli/services/init/example_r/r_task.py
170
- latch_cli/services/init/example_r/__pycache__/__init__.cpython-310.pyc
171
160
  latch_cli/services/init/example_snakemake/Dockerfile
172
161
  latch_cli/services/init/example_snakemake/Snakefile
173
162
  latch_cli/services/init/example_snakemake/config.yaml
@@ -180,7 +169,6 @@ latch_cli/services/init/template/LICENSE
180
169
  latch_cli/services/init/template/README.md
181
170
  latch_cli/services/init/template/__init__.py
182
171
  latch_cli/services/init/template/task.py
183
- latch_cli/services/init/template/__pycache__/__init__.cpython-310.pyc
184
172
  latch_cli/services/register/__init__.py
185
173
  latch_cli/services/register/constants.py
186
174
  latch_cli/services/register/register.py
@@ -193,6 +181,7 @@ latch_cli/services/test_data/utils.py
193
181
  latch_cli/tui/__init__.py
194
182
  latch_cli/utils/__init__.py
195
183
  latch_cli/utils/path.py
184
+ latch_cli/utils/workflow.py
196
185
  tests/__init__.py
197
186
  tests/fixtures.py
198
187
  tests/test_ls.py
@@ -90,6 +90,7 @@ def get_epilogue(wf_type: WorkflowType = WorkflowType.latchbiosdk) -> List[str]:
90
90
  "# DO NOT CHANGE",
91
91
  "",
92
92
  "copy .latch/bin/nextflow /root/nextflow",
93
+ "copy .latch/.nextflow /root/.nextflow",
93
94
  "copy .latch/nf_entrypoint.py /root/nf_entrypoint.py",
94
95
  ]
95
96
 
@@ -15,7 +15,7 @@ from flytekit.core.context_manager import FlyteContextManager
15
15
  from flytekit.core.interface import Interface
16
16
  from flytekit.core.node import Node
17
17
  from flytekit.core.promise import Promise
18
- from flytekit.core.type_engine import TypeEngine
18
+ from flytekit.core.type_engine import TypeEngine, TypeTransformerFailedError
19
19
  from flytekit.core.utils import _dnsify
20
20
  from flytekit.core.workflow import WorkflowBase
21
21
  from flytekit.models import common as common_models
@@ -89,9 +89,17 @@ def interface_to_parameters(
89
89
 
90
90
  ctx = FlyteContextManager.current_context()
91
91
  if default is not None:
92
- default_lv = TypeEngine.to_literal(
93
- ctx, default, python_type=interface.inputs[k], expected=v.type
94
- )
92
+ try:
93
+ default_lv = TypeEngine.to_literal(
94
+ ctx, default, python_type=interface.inputs[k], expected=v.type
95
+ )
96
+ except TypeTransformerFailedError as e:
97
+ click.secho(
98
+ f"Failed to transform default value for parameter `{k}` to a"
99
+ f" literal: {str(e)}",
100
+ fg="red",
101
+ )
102
+ raise click.exceptions.Exit(1) from e
95
103
 
96
104
  params[k] = interface_models.Parameter(
97
105
  var=v, default=default_lv, required=required
@@ -6,21 +6,24 @@ import sys
6
6
  from collections import OrderedDict
7
7
  from pathlib import Path
8
8
  from textwrap import dedent
9
- from typing import Dict, List, Optional
9
+ from typing import Dict, List, Optional, cast
10
10
 
11
11
  import boto3
12
12
  import click
13
+ import gql
13
14
  from flytekit.core import constants as _common_constants
14
15
  from flytekit.core.interface import transform_variable_map
15
16
  from flytekit.core.node import Node
16
17
  from flytekit.core.promise import NodeOutput, Promise
17
18
  from flytekit.models import literals as literals_models
19
+ from latch_sdk_gql.execute import execute
18
20
 
19
21
  from latch_cli import tinyrequests
22
+ from latch_cli.extras.nextflow.tasks.base import NextflowBaseTask, NFTaskType
20
23
 
21
24
  from ...click_utils import italic
22
25
  from ...menus import select_tui
23
- from ...utils import identifier_from_str
26
+ from ...utils import current_workspace, identifier_from_str
24
27
  from ..common.serialize import binding_from_python
25
28
  from ..common.utils import reindent
26
29
  from .dag import DAG, VertexType
@@ -33,7 +36,6 @@ from .tasks.input import NextflowInputTask
33
36
  from .tasks.map import MapContainerTask
34
37
  from .tasks.merge import NextflowMergeTask
35
38
  from .tasks.operator import NextflowOperatorTask
36
- from .tasks.output import NextflowOutputTask
37
39
  from .tasks.process import NextflowProcessTask
38
40
  from .workflow import NextflowWorkflow
39
41
 
@@ -256,29 +258,6 @@ def build_from_nextflow_dag(
256
258
 
257
259
  node_map[vertex.id] = node
258
260
 
259
- elif vertex.type == VertexType.Output:
260
- output_task = NextflowOutputTask(
261
- inputs=task_inputs,
262
- outputs=task_outputs,
263
- name=vertex.label,
264
- id=vertex.id,
265
- statement=vertex.statement,
266
- ret=vertex.ret,
267
- branches=branches,
268
- wf=wf,
269
- )
270
- wf.nextflow_tasks.append(output_task)
271
-
272
- node = Node(
273
- id=node_name,
274
- metadata=output_task.construct_node_metadata(),
275
- bindings=task_bindings,
276
- upstream_nodes=upstream_nodes,
277
- flyte_entity=output_task,
278
- )
279
-
280
- node_map[vertex.id] = node
281
-
282
261
  elif vertex.type == VertexType.Merge:
283
262
  merge_task = NextflowMergeTask(
284
263
  inputs=task_inputs,
@@ -314,6 +293,9 @@ def build_from_nextflow_dag(
314
293
  )
315
294
  wf.nextflow_tasks.append(operator_task)
316
295
 
296
+ if vertex.type != "Operator":
297
+ operator_task.nf_task_type = NFTaskType(vertex.type)
298
+
317
299
  node = Node(
318
300
  id=node_name,
319
301
  metadata=operator_task.construct_node_metadata(),
@@ -391,6 +373,7 @@ def ensure_nf_dependencies(pkg_root: Path, *, force_redownload: bool = False):
391
373
 
392
374
  def build_nf_wf(
393
375
  pkg_root: Path,
376
+ version: str,
394
377
  nf_script: Path,
395
378
  *,
396
379
  redownload_dependencies: bool = False,
@@ -471,7 +454,7 @@ def build_nf_wf(
471
454
 
472
455
  raise click.exceptions.Exit(0)
473
456
 
474
- wf = NextflowWorkflow(nf_script, main_dag)
457
+ wf = NextflowWorkflow(nf_script, version, main_dag)
475
458
 
476
459
  build_from_nextflow_dag(wf, execution_profile=execution_profile)
477
460
 
@@ -507,6 +490,7 @@ def generate_nf_entrypoint(
507
490
  from latch_cli.extras.nextflow.file_persistence import download_files, stage_for_output, upload_files
508
491
  from latch_cli.extras.nextflow.channel import get_mapper_inputs, get_boolean_value, get_mapper_outputs
509
492
  from latch_cli.utils import check_exists_and_rename, get_parameter_json_value, urljoins
493
+ from latch_cli.utils.workflow import _override_task_status
510
494
 
511
495
  from latch.resources.tasks import custom_task
512
496
  from latch.types.directory import LatchDir, LatchOutputDir
@@ -0,0 +1,158 @@
1
+ import json
2
+ import os
3
+ import subprocess
4
+ from pathlib import Path
5
+ from typing import List
6
+
7
+ import click
8
+
9
+ from ...utils import best_effort_display_name, identifier_from_str
10
+ from ..common.config.parser import parse_config, write_metadata
11
+ from ..common.config.utils import JSONValue, get_preamble, type_repr
12
+ from ..common.utils import reindent
13
+ from .build import ensure_nf_dependencies
14
+
15
+ nextflow_metadata = """
16
+ from latch.types.metadata import NextflowMetadata, LatchAuthor, EnvironmentConfig
17
+ from latch.types.directory import LatchDir
18
+
19
+ from .parameters import generated_parameters
20
+
21
+ NextflowMetadata(
22
+ name="Your Workflow Name",
23
+ display_name="Your Workflow Name",
24
+ author=LatchAuthor(
25
+ name="Your Name",
26
+ ),
27
+ parameters=generated_parameters,
28
+ output_directory=LatchDir("latch:///your_output_directory"),
29
+ )
30
+
31
+ """
32
+
33
+
34
+ def generate_nf_metadata(
35
+ config_path: Path,
36
+ *,
37
+ skip_confirmation: bool = False,
38
+ generate_defaults: bool = False,
39
+ infer_files: bool = False,
40
+ ):
41
+ if not config_path.is_dir():
42
+ click.secho(
43
+ f"Nextflow config path must point to the package root directory.",
44
+ fg="red",
45
+ )
46
+ raise click.exceptions.Exit(1)
47
+
48
+ ensure_nf_dependencies(config_path)
49
+
50
+ env = {
51
+ **os.environ,
52
+ # read NF binaries from `.latch/.nextflow` instead of system
53
+ "NXF_HOME": str(config_path / ".latch" / ".nextflow"),
54
+ # don't display version mismatch warning
55
+ "NXF_DISABLE_CHECK_LATEST": "true",
56
+ # don't emit .nextflow.log files
57
+ "NXF_LOG_FILE": "/dev/null",
58
+ }
59
+
60
+ config_file = ".latch/nf-config.yaml"
61
+ try:
62
+ subprocess.run(
63
+ [
64
+ ".latch/bin/nextflow",
65
+ "config",
66
+ "-format",
67
+ "json",
68
+ "-output",
69
+ config_file,
70
+ ],
71
+ check=True,
72
+ env=env if os.environ.get("LATCH_NEXTFLOW_DEV") is not None else None,
73
+ cwd=config_path,
74
+ )
75
+ except subprocess.CalledProcessError as e:
76
+ click.secho(
77
+ "Failed to read config from nextflow package.",
78
+ fg="red",
79
+ )
80
+ raise click.exceptions.Exit(1) from e
81
+
82
+ config_file = config_path / config_file
83
+
84
+ try:
85
+ config: JSONValue = json.loads(config_file.read_text())
86
+ except json.JSONDecodeError as e:
87
+ click.secho(
88
+ reindent(
89
+ f"""
90
+ Error loading config from {config_file}:
91
+
92
+ {e}
93
+ """,
94
+ 0,
95
+ ),
96
+ fg="red",
97
+ )
98
+ raise click.exceptions.Exit(1) from e
99
+
100
+ parsed = parse_config(config.get("params", {}), infer_files=infer_files)
101
+
102
+ preambles: List[str] = []
103
+ params: List[str] = []
104
+
105
+ for k, (typ, (val, default)) in parsed.items():
106
+ preambles.append(get_preamble(typ))
107
+
108
+ param_str = reindent(
109
+ f"""\
110
+ {repr(identifier_from_str(k))}: NextflowParameter(
111
+ display_name={repr(best_effort_display_name(k))},
112
+ type={type_repr(typ)},
113
+ __default__),""",
114
+ 0,
115
+ )
116
+
117
+ default_str = ""
118
+ if generate_defaults and default is not None:
119
+ default_str = f" default={repr(default)},\n"
120
+
121
+ param_str = param_str.replace("__default__", default_str)
122
+
123
+ param_str = reindent(param_str, 1)
124
+ params.append(param_str)
125
+
126
+ params_file_str = (
127
+ reindent(
128
+ r"""
129
+ from dataclasses import dataclass
130
+ import typing
131
+ import typing_extensions
132
+
133
+ from flytekit.core.annotation import FlyteAnnotation
134
+
135
+ from latch.types.metadata import NextflowParameter
136
+ from latch.types.file import LatchFile
137
+ from latch.types.directory import LatchDir
138
+
139
+ __preambles__
140
+
141
+ # Import these into your `__init__.py` file:
142
+ #
143
+ # from .parameters import generated_parameters, file_metadata
144
+
145
+ generated_parameters = {
146
+ __params__
147
+ }
148
+
149
+ """,
150
+ 0,
151
+ )
152
+ .replace("__preambles__", "".join(preambles))
153
+ .replace("__params__", "\n".join(params))
154
+ )
155
+
156
+ write_metadata(
157
+ nextflow_metadata, params_file_str, skip_confirmation=skip_confirmation
158
+ )
@@ -24,7 +24,6 @@ class VertexType(str, Enum):
24
24
  Conditional = "Conditional"
25
25
  Merge = "Merge"
26
26
  Input = "Input"
27
- Output = "Output"
28
27
 
29
28
 
30
29
  @dataclass(frozen=True)
@@ -0,0 +1,60 @@
1
+ from typing import cast
2
+
3
+ import gql
4
+ from latch_sdk_gql.execute import execute
5
+
6
+ from latch_cli.extras.common.serialize import serialize
7
+ from latch_cli.extras.nextflow.tasks.base import NextflowBaseTask
8
+ from latch_cli.extras.nextflow.workflow import NextflowWorkflow
9
+ from latch_cli.utils import current_workspace
10
+
11
+
12
+ def serialize_nf(
13
+ nf_wf: NextflowWorkflow,
14
+ output_dir: str,
15
+ image_name: str,
16
+ dkr_repo: str,
17
+ ):
18
+ serialize(nf_wf, output_dir, image_name, dkr_repo, write_spec=True)
19
+
20
+
21
+ def add_task_metadata(wf: NextflowWorkflow):
22
+ node_names = []
23
+ task_types = []
24
+
25
+ for node in wf.nodes:
26
+ task = cast(NextflowBaseTask, node.flyte_entity)
27
+
28
+ node_names.append(node.id)
29
+ task_types.append(task.nf_task_type)
30
+
31
+ execute(
32
+ gql.gql("""
33
+ mutation NFBulkInsertMut(
34
+ $nodeNames: [String]!
35
+ $ownerId: BigInt!
36
+ $types: [String]!
37
+ $version: String!
38
+ $workflowName: String!
39
+ ) {
40
+ bulkInsertNextflowNodeInfo(
41
+ input: {
42
+ ownerId: $ownerId
43
+ workflowName: $workflowName
44
+ version: $version
45
+ nodeNames: $nodeNames
46
+ types: $types
47
+ }
48
+ ) {
49
+ clientMutationId
50
+ }
51
+ }
52
+ """),
53
+ {
54
+ "ownerId": current_workspace(),
55
+ "version": wf.version,
56
+ "workflowName": wf.name,
57
+ "nodeNames": node_names,
58
+ "types": task_types,
59
+ },
60
+ )
@@ -7,7 +7,7 @@ from latch.types.metadata import ParameterType, _IsDataclass
7
7
 
8
8
  from ...common.utils import reindent, type_repr
9
9
  from ..workflow import NextflowWorkflow
10
- from .base import NextflowBaseTask
10
+ from .base import NextflowBaseTask, NFTaskType
11
11
 
12
12
 
13
13
  def dataclass_from_python_params(
@@ -65,7 +65,13 @@ class NextflowProcessPreAdapterTask(NextflowBaseTask):
65
65
  self.dataclass = dataclass_from_python_params(inputs, id)
66
66
 
67
67
  super().__init__(
68
- inputs, {"default": List[self.dataclass]}, id, name, branches, wf
68
+ inputs,
69
+ {"default": List[self.dataclass]},
70
+ id,
71
+ name,
72
+ branches,
73
+ wf,
74
+ NFTaskType.Adapter,
69
75
  )
70
76
 
71
77
  def get_fn_interface(self):
@@ -110,7 +116,7 @@ class NextflowProcessPreAdapterTask(NextflowBaseTask):
110
116
  def get_fn_return_stmt(self):
111
117
  return reindent(f"return Res_{self.id}(default=result)", 1)
112
118
 
113
- def get_fn_code(self, nf_path_in_container: str):
119
+ def get_fn_code(self, nf_script_path_in_container: Path):
114
120
  code_block = self.get_fn_interface()
115
121
  code_block += self.get_fn_conditions()
116
122
 
@@ -142,6 +148,10 @@ class NextflowProcessPreAdapterTask(NextflowBaseTask):
142
148
  rf"""
143
149
  else:
144
150
  print("TASK SKIPPED")
151
+ try:
152
+ _override_task_status(status="SKIPPED")
153
+ except Exception as e:
154
+ print(f"Failed to override task status: {{e}}")
145
155
  result = []
146
156
 
147
157
  """,
@@ -162,7 +172,15 @@ class NextflowProcessPostAdapterTask(NextflowBaseTask):
162
172
  ):
163
173
  self.dataclass = dataclass_from_python_params(outputs, id)
164
174
 
165
- super().__init__({"default": List[self.dataclass]}, outputs, id, name, {}, wf)
175
+ super().__init__(
176
+ {"default": List[self.dataclass]},
177
+ outputs,
178
+ id,
179
+ name,
180
+ {},
181
+ wf,
182
+ NFTaskType.Adapter,
183
+ )
166
184
 
167
185
  def get_fn_interface(self):
168
186
  res = ""
@@ -1,4 +1,5 @@
1
1
  import importlib
2
+ from enum import Enum
2
3
  from pathlib import Path
3
4
  from typing import Any, Dict, List, Mapping, Type, cast
4
5
 
@@ -25,6 +26,16 @@ from ...common.utils import reindent
25
26
  from ..workflow import NextflowWorkflow
26
27
 
27
28
 
29
+ class NFTaskType(str, Enum):
30
+ Process = "Process"
31
+ Adapter = "Adapter"
32
+ Operator = "Operator"
33
+ SubWorkflow = "SubWorkflow"
34
+ Generator = "Generator"
35
+ Conditional = "Conditional"
36
+ Merge = "Merge"
37
+
38
+
28
39
  class NextflowBaseTask(PythonAutoContainerTask[Pod]):
29
40
  def __init__(
30
41
  self,
@@ -34,12 +45,14 @@ class NextflowBaseTask(PythonAutoContainerTask[Pod]):
34
45
  name: str,
35
46
  branches: Dict[str, bool],
36
47
  wf: NextflowWorkflow,
48
+ nf_task_type: NFTaskType,
37
49
  # todo(ayush): expose / infer these somehow
38
50
  cpu: int = 4,
39
51
  memory: int = 8,
40
52
  ):
41
53
  self.id = id
42
54
  self.wf = wf
55
+ self.nf_task_type = nf_task_type
43
56
 
44
57
  interface = Interface(inputs, outputs, docstring=None)
45
58
  self._python_inputs = inputs
@@ -1,6 +1,7 @@
1
1
  from typing import Dict, List, Mapping, Optional, Type
2
2
 
3
3
  from latch.types.metadata import ParameterType
4
+ from latch_cli.extras.nextflow.tasks.base import NFTaskType
4
5
 
5
6
  from ...common.utils import reindent
6
7
  from ..workflow import NextflowWorkflow
@@ -29,23 +30,13 @@ class NextflowConditionalTask(NextflowOperatorTask):
29
30
  wf,
30
31
  )
31
32
 
33
+ self.nf_task_type = NFTaskType.Conditional
34
+
32
35
  def get_fn_return_stmt(self):
33
- results: List[str] = []
34
- for out_name, out_type in self._python_outputs.items():
35
- results.append(
36
- reindent(
37
- rf"""
38
- {out_name}=json.loads(out_channels.get("{out_name}", "true"))
39
- """,
40
- 2,
41
- ).rstrip()
42
- )
43
-
44
- return_str = ",\n".join(results)
45
36
 
46
37
  return reindent(
47
38
  rf"""
48
- res = out_channels.get({repr(out_name)})
39
+ res = out_channels.get("condition")
49
40
 
50
41
  if res is not None:
51
42
  res = get_boolean_value(res)
@@ -53,4 +44,4 @@ class NextflowConditionalTask(NextflowOperatorTask):
53
44
  return Res{self.name}(condition=res)
54
45
  """,
55
46
  1,
56
- ).replace("__return_str__", return_str)
47
+ )
@@ -53,6 +53,10 @@ class NextflowInputTask(NextflowOperatorTask):
53
53
  res = {channel_input}
54
54
  else:
55
55
  print("TASK SKIPPED")
56
+ try:
57
+ _override_task_status(status="SKIPPED")
58
+ except Exception as e:
59
+ print(f"Failed to override task status: {{e}}")
56
60
  res = None
57
61
 
58
62
  """,
@@ -18,7 +18,7 @@ from flytekit.models.interface import Variable
18
18
  from flytekit.models.task import Container, K8sPod, Sql
19
19
  from flytekitplugins.pod.task import Pod
20
20
 
21
- from .base import NextflowBaseTaskResolver
21
+ from .base import NextflowBaseTaskResolver, NFTaskType
22
22
  from .process import NextflowProcessTask
23
23
 
24
24
 
@@ -38,6 +38,8 @@ class MapContainerTask(PythonAutoContainerTask[Pod]):
38
38
  container_task.python_interface
39
39
  )
40
40
 
41
+ self.nf_task_type = NFTaskType.Process
42
+
41
43
  super().__init__(
42
44
  name=name,
43
45
  interface=collection_interface,
@@ -2,6 +2,7 @@ from pathlib import Path
2
2
  from typing import Dict, List, Mapping, Type
3
3
 
4
4
  from latch.types.metadata import ParameterType
5
+ from latch_cli.extras.nextflow.tasks.base import NFTaskType
5
6
 
6
7
  from ....extras.common.utils import reindent
7
8
  from ..workflow import NextflowWorkflow
@@ -29,6 +30,8 @@ class NextflowMergeTask(NextflowOperatorTask):
29
30
  wf,
30
31
  )
31
32
 
33
+ self.nf_task_type = NFTaskType.Merge
34
+
32
35
  def get_fn_conditions(self):
33
36
  res: List[str] = []
34
37
  for k in self.conditional_inputs.keys():
@@ -80,6 +83,10 @@ class NextflowMergeTask(NextflowOperatorTask):
80
83
  res = {expr}
81
84
  else:
82
85
  print("TASK SKIPPED")
86
+ try:
87
+ _override_task_status(status="SKIPPED")
88
+ except Exception as e:
89
+ print(f"Failed to override task status: {{e}}")
83
90
  res = None
84
91
 
85
92
  """,