latch 2.39.0.dev27__tar.gz → 2.39.0.dev29__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 (204) hide show
  1. {latch-2.39.0.dev27/latch.egg-info → latch-2.39.0.dev29}/PKG-INFO +1 -1
  2. {latch-2.39.0.dev27 → latch-2.39.0.dev29/latch.egg-info}/PKG-INFO +1 -1
  3. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/SOURCES.txt +0 -2
  4. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/build.py +15 -30
  5. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/dag.py +4 -0
  6. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/conditional.py +5 -0
  7. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/merge.py +4 -0
  8. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/operator.py +9 -0
  9. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/process.py +10 -20
  10. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/workflow.py +2 -1
  11. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/setup.py +1 -1
  12. latch-2.39.0.dev27/latch_cli/extras/nextflow/tasks/input.py +0 -67
  13. latch-2.39.0.dev27/latch_cli/extras/nextflow/tasks/output.py +0 -86
  14. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/LICENSE +0 -0
  15. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/MANIFEST.in +0 -0
  16. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/README.md +0 -0
  17. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/__init__.py +0 -0
  18. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/account.py +0 -0
  19. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/executions.py +0 -0
  20. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/functions/__init__.py +0 -0
  21. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/functions/messages.py +0 -0
  22. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/functions/operators.py +0 -0
  23. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/functions/secrets.py +0 -0
  24. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/__init__.py +0 -0
  25. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/__init__.py +0 -0
  26. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/download.py +0 -0
  27. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/manager.py +0 -0
  28. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/node.py +0 -0
  29. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/progress.py +0 -0
  30. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/remote_copy.py +0 -0
  31. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/throttle.py +0 -0
  32. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/upload.py +0 -0
  33. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/_transfer/utils.py +0 -0
  34. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/path.py +0 -0
  35. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/ldata/type.py +0 -0
  36. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/__init__.py +0 -0
  37. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/project.py +0 -0
  38. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/record.py +0 -0
  39. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/table.py +0 -0
  40. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/types.py +0 -0
  41. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/upstream_types/__init__.py +0 -0
  42. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/upstream_types/types.py +0 -0
  43. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/upstream_types/values.py +0 -0
  44. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/registry/utils.py +0 -0
  45. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/__init__.py +0 -0
  46. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/conditional.py +0 -0
  47. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/launch_plan.py +0 -0
  48. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/map_tasks.py +0 -0
  49. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/reference_workflow.py +0 -0
  50. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/tasks.py +0 -0
  51. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/resources/workflow.py +0 -0
  52. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/__init__.py +0 -0
  53. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/directory.py +0 -0
  54. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/file.py +0 -0
  55. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/glob.py +0 -0
  56. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/json.py +0 -0
  57. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/metadata.py +0 -0
  58. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/types/utils.py +0 -0
  59. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/__init__.py +0 -0
  60. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/deseq2.py +0 -0
  61. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/mafft.py +0 -0
  62. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/pathway.py +0 -0
  63. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/rnaseq.py +0 -0
  64. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch/verified/trim_galore.py +0 -0
  65. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/dependency_links.txt +0 -0
  66. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/entry_points.txt +0 -0
  67. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/requires.txt +0 -0
  68. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch.egg-info/top_level.txt +0 -0
  69. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/__init__.py +0 -0
  70. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/__init__.py +0 -0
  71. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/csrf.py +0 -0
  72. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/oauth2.py +0 -0
  73. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/pkce.py +0 -0
  74. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/auth/utils.py +0 -0
  75. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/centromere/__init__.py +0 -0
  76. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/centromere/ctx.py +0 -0
  77. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/centromere/utils.py +0 -0
  78. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/click_utils.py +0 -0
  79. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/constants.py +0 -0
  80. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/docker_utils/__init__.py +0 -0
  81. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/__init__.py +0 -0
  82. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/cache.py +0 -0
  83. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/errors.py +0 -0
  84. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/handler.py +0 -0
  85. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/exceptions/traceback.py +0 -0
  86. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/__init__.py +0 -0
  87. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/__init__.py +0 -0
  88. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/config/__init__.py +0 -0
  89. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/config/parser.py +0 -0
  90. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/config/utils.py +0 -0
  91. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/serialize.py +0 -0
  92. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/common/utils.py +0 -0
  93. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/__init__.py +0 -0
  94. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/channel.py +0 -0
  95. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/config.py +0 -0
  96. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/file_persistence.py +0 -0
  97. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/serialize.py +0 -0
  98. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/__init__.py +0 -0
  99. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/adapters.py +0 -0
  100. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/base.py +0 -0
  101. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/nextflow/tasks/map.py +0 -0
  102. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/__init__.py +0 -0
  103. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/config.py +0 -0
  104. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/serialize.py +0 -0
  105. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/single_task_snakemake.py +0 -0
  106. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/utils.py +0 -0
  107. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/extras/snakemake/workflow.py +0 -0
  108. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/main.py +0 -0
  109. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/menus.py +0 -0
  110. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/__init__.py +0 -0
  111. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/__init__.py +0 -0
  112. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/autocomplete.py +0 -0
  113. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/glob.py +0 -0
  114. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/main.py +0 -0
  115. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/cp/utils.py +0 -0
  116. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/execute/__init__.py +0 -0
  117. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/execute/main.py +0 -0
  118. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/execute/utils.py +0 -0
  119. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/get.py +0 -0
  120. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/get_executions.py +0 -0
  121. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/get_params.py +0 -0
  122. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__init__.py +0 -0
  123. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
  124. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/__init__.cpython-311.pyc +0 -0
  125. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/__init__.cpython-38.pyc +0 -0
  126. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/__init__.cpython-39.pyc +0 -0
  127. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/init.cpython-310.pyc +0 -0
  128. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/init.cpython-311.pyc +0 -0
  129. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/init.cpython-38.pyc +0 -0
  130. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/__pycache__/init.cpython-39.pyc +0 -0
  131. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/.env +0 -0
  132. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/LICENSE +0 -0
  133. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/README.md +0 -0
  134. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/__init__.py +0 -0
  135. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/__pycache__/__init__.cpython-310.pyc +0 -0
  136. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/assemble.py +0 -0
  137. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/sort.py +0 -0
  138. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/assemble_and_sort/system-requirements.txt +0 -0
  139. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/common/.dockerignore +0 -0
  140. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_conda/__init__.py +0 -0
  141. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_conda/__pycache__/__init__.cpython-310.pyc +0 -0
  142. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_conda/conda_task.py +0 -0
  143. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_conda/environment.yaml +0 -0
  144. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_docker/__init__.py +0 -0
  145. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_docker/task.py +0 -0
  146. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/Dockerfile +0 -0
  147. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/latch_metadata/__init__.py +0 -0
  148. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/latch_metadata/__pycache__/__init__.cpython-311.pyc +0 -0
  149. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/main.nf +0 -0
  150. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nf_integration/workflow.nf +0 -0
  151. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nfcore/Dockerfile +0 -0
  152. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nfcore/__init__.py +0 -0
  153. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_nfcore/task.py +0 -0
  154. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_r/__init__.py +0 -0
  155. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_r/__pycache__/__init__.cpython-310.pyc +0 -0
  156. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_r/environment.R +0 -0
  157. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_r/r_task.py +0 -0
  158. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/.latch/latch_entrypoint +0 -0
  159. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/Dockerfile +0 -0
  160. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/Snakefile +0 -0
  161. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/config.yaml +0 -0
  162. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/environment.yaml +0 -0
  163. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/latch_metadata.py +0 -0
  164. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/scripts/plot-quals.py +0 -0
  165. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/example_snakemake/version +0 -0
  166. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/init.py +0 -0
  167. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/LICENSE +0 -0
  168. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/README.md +0 -0
  169. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/__init__.py +0 -0
  170. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/__pycache__/__init__.cpython-310.pyc +0 -0
  171. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/init/template/task.py +0 -0
  172. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/launch.py +0 -0
  173. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/local_dev.py +0 -0
  174. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/local_dev_old.py +0 -0
  175. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/login.py +0 -0
  176. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/ls.py +0 -0
  177. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/mkdir.py +0 -0
  178. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/move.py +0 -0
  179. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/preview.py +0 -0
  180. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/register/__init__.py +0 -0
  181. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/register/constants.py +0 -0
  182. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/register/register.py +0 -0
  183. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/register/utils.py +0 -0
  184. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/rm.py +0 -0
  185. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/stop_pod.py +0 -0
  186. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/sync.py +0 -0
  187. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/__init__.py +0 -0
  188. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/ls.py +0 -0
  189. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/remove.py +0 -0
  190. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/upload.py +0 -0
  191. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/test_data/utils.py +0 -0
  192. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/services/workspace.py +0 -0
  193. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/tinyrequests.py +0 -0
  194. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/tui/__init__.py +0 -0
  195. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/utils/__init__.py +0 -0
  196. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/utils/path.py +0 -0
  197. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/utils/workflow.py +0 -0
  198. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/latch_cli/workflow_config.py +0 -0
  199. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/pyproject.toml +0 -0
  200. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/setup.cfg +0 -0
  201. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/tests/__init__.py +0 -0
  202. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/tests/cp/__init__.py +0 -0
  203. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/tests/fixtures.py +0 -0
  204. {latch-2.39.0.dev27 → latch-2.39.0.dev29}/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.dev27
3
+ Version: 2.39.0.dev29
4
4
  Summary: The Latch SDK
5
5
  Author-email: kenny@latch.bio
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: latch
3
- Version: 2.39.0.dev27
3
+ Version: 2.39.0.dev29
4
4
  Summary: The Latch SDK
5
5
  Author-email: kenny@latch.bio
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -97,11 +97,9 @@ latch_cli/extras/nextflow/tasks/__init__.py
97
97
  latch_cli/extras/nextflow/tasks/adapters.py
98
98
  latch_cli/extras/nextflow/tasks/base.py
99
99
  latch_cli/extras/nextflow/tasks/conditional.py
100
- latch_cli/extras/nextflow/tasks/input.py
101
100
  latch_cli/extras/nextflow/tasks/map.py
102
101
  latch_cli/extras/nextflow/tasks/merge.py
103
102
  latch_cli/extras/nextflow/tasks/operator.py
104
- latch_cli/extras/nextflow/tasks/output.py
105
103
  latch_cli/extras/nextflow/tasks/process.py
106
104
  latch_cli/extras/snakemake/__init__.py
107
105
  latch_cli/extras/snakemake/config.py
@@ -33,7 +33,6 @@ from .tasks.adapters import (
33
33
  NextflowProcessPreAdapterTask,
34
34
  )
35
35
  from .tasks.conditional import NextflowConditionalTask
36
- from .tasks.input import NextflowInputTask
37
36
  from .tasks.map import MapContainerTask
38
37
  from .tasks.merge import NextflowMergeTask
39
38
  from .tasks.operator import NextflowOperatorTask
@@ -165,7 +164,8 @@ def build_from_nextflow_dag(
165
164
  name=identifier_from_str(vertex.label),
166
165
  statement=vertex.statement,
167
166
  ret=vertex.ret,
168
- import_path=Path(vertex.module),
167
+ script_path=Path(vertex.subWorkflowPath),
168
+ calling_subwf_name=vertex.subWorkflowName,
169
169
  process_name=vertex.label,
170
170
  unaliased=vertex.unaliased,
171
171
  execution_profile=execution_profile,
@@ -223,43 +223,24 @@ def build_from_nextflow_dag(
223
223
 
224
224
  elif vertex.type in VertexType.Conditional:
225
225
  conditional_task = NextflowConditionalTask(
226
- task_inputs,
227
- vertex.id,
228
- f"conditional_{vertex.label}",
229
- vertex.statement,
230
- vertex.ret,
231
- branches,
232
- wf,
233
- )
234
- wf.nextflow_tasks.append(conditional_task)
235
-
236
- node = Node(
237
- id=node_name,
238
- metadata=conditional_task.construct_node_metadata(),
239
- bindings=task_bindings,
240
- upstream_nodes=upstream_nodes,
241
- flyte_entity=conditional_task,
242
- )
243
-
244
- node_map[vertex.id] = node
245
-
246
- elif vertex.type == VertexType.Input:
247
- input_task = NextflowInputTask(
248
226
  inputs=task_inputs,
249
- outputs=task_outputs,
250
- name=vertex.label,
251
227
  id=vertex.id,
228
+ name=f"conditional_{vertex.label}",
229
+ statement=vertex.statement,
230
+ ret=vertex.ret,
252
231
  branches=branches,
232
+ script_path=Path(vertex.subWorkflowPath),
233
+ calling_subwf_name=vertex.subWorkflowName,
253
234
  wf=wf,
254
235
  )
255
- wf.nextflow_tasks.append(input_task)
236
+ wf.nextflow_tasks.append(conditional_task)
256
237
 
257
238
  node = Node(
258
239
  id=node_name,
259
- metadata=input_task.construct_node_metadata(),
240
+ metadata=conditional_task.construct_node_metadata(),
260
241
  bindings=task_bindings,
261
242
  upstream_nodes=upstream_nodes,
262
- flyte_entity=input_task,
243
+ flyte_entity=conditional_task,
263
244
  )
264
245
 
265
246
  node_map[vertex.id] = node
@@ -272,6 +253,8 @@ def build_from_nextflow_dag(
272
253
  id=vertex.id,
273
254
  branches=branches,
274
255
  sources=merge_sources,
256
+ script_path=Path(vertex.subWorkflowPath),
257
+ calling_subwf_name=vertex.subWorkflowName,
275
258
  wf=wf,
276
259
  )
277
260
 
@@ -296,6 +279,8 @@ def build_from_nextflow_dag(
296
279
  statement=vertex.statement,
297
280
  ret=vertex.ret,
298
281
  branches=branches,
282
+ script_path=Path(vertex.subWorkflowPath),
283
+ calling_subwf_name=vertex.subWorkflowName,
299
284
  wf=wf,
300
285
  )
301
286
  wf.nextflow_tasks.append(operator_task)
@@ -461,7 +446,7 @@ def build_nf_wf(
461
446
 
462
447
  raise click.exceptions.Exit(0)
463
448
 
464
- wf = NextflowWorkflow(nf_script, version, main_dag)
449
+ wf = NextflowWorkflow(pkg_root, nf_script, version, main_dag)
465
450
 
466
451
  build_from_nextflow_dag(wf, execution_profile=execution_profile)
467
452
 
@@ -36,6 +36,8 @@ class Vertex:
36
36
  outputNames: List[str] = field(hash=False)
37
37
  module: str
38
38
  unaliased: str
39
+ subWorkflowName: str
40
+ subWorkflowPath: str
39
41
 
40
42
 
41
43
  @dataclass(frozen=True)
@@ -55,6 +57,8 @@ class _VertexContentJson(TypedDict):
55
57
  outputNames: List[str]
56
58
  module: str
57
59
  unaliased: str
60
+ subWorkflowName: str
61
+ subWorkflowPath: str
58
62
 
59
63
 
60
64
  class _VertexJson(TypedDict):
@@ -1,3 +1,4 @@
1
+ from pathlib import Path
1
2
  from typing import Dict, List, Mapping, Optional, Type
2
3
 
3
4
  from latch.types.metadata import ParameterType
@@ -17,6 +18,8 @@ class NextflowConditionalTask(NextflowOperatorTask):
17
18
  statement: str,
18
19
  ret: List[str],
19
20
  branches: Dict[str, bool],
21
+ script_path: Path,
22
+ calling_subwf_name: str,
20
23
  wf: NextflowWorkflow,
21
24
  ):
22
25
  super().__init__(
@@ -27,6 +30,8 @@ class NextflowConditionalTask(NextflowOperatorTask):
27
30
  statement,
28
31
  ret,
29
32
  branches,
33
+ script_path,
34
+ calling_subwf_name,
30
35
  wf,
31
36
  )
32
37
 
@@ -18,6 +18,8 @@ class NextflowMergeTask(NextflowOperatorTask):
18
18
  name: str,
19
19
  branches: Dict[str, bool],
20
20
  sources: Dict[str, List[str]],
21
+ script_path: Path,
22
+ calling_subwf_name: str,
21
23
  wf: NextflowWorkflow,
22
24
  ):
23
25
  super().__init__(
@@ -28,6 +30,8 @@ class NextflowMergeTask(NextflowOperatorTask):
28
30
  "",
29
31
  [],
30
32
  branches,
33
+ script_path,
34
+ calling_subwf_name,
31
35
  wf,
32
36
  )
33
37
 
@@ -21,10 +21,14 @@ class NextflowOperatorTask(NextflowBaseTask):
21
21
  statement: str,
22
22
  ret: List[str],
23
23
  branches: Dict[str, bool],
24
+ script_path: Path,
25
+ calling_subwf_name: str,
24
26
  wf: NextflowWorkflow,
25
27
  ):
26
28
  self.statement = statement
27
29
  self.ret = ret
30
+ self.script_path = script_path
31
+ self.calling_subwf_name = calling_subwf_name
28
32
 
29
33
  super().__init__(inputs, outputs, id, name, branches, wf, NFTaskType.Operator)
30
34
 
@@ -171,6 +175,11 @@ class NextflowOperatorTask(NextflowBaseTask):
171
175
  download_str = rf"""download_files(channel_vals, LatchDir({repr(self.wf.output_directory.remote_path)}))"""
172
176
  upload_str = rf"""upload_files({{k: json.loads(v) for k, v in out_channels.items()}}, LatchDir({repr(self.wf.output_directory.remote_path)}))"""
173
177
 
178
+ if self.script_path.resolve() != self.wf.nf_script.resolve():
179
+ stem = self.script_path.resolve().relative_to(self.wf.pkg_root.resolve())
180
+ run_task_entrypoint[2] = str(Path("/root") / stem)
181
+ run_task_entrypoint.extend(["-entry", self.calling_subwf_name])
182
+
174
183
  code_block += reindent(
175
184
  rf"""
176
185
  channel_vals = [{", ".join([f"json.loads({x})" for x in self.channel_inputs])}]
@@ -21,14 +21,15 @@ class NextflowProcessTask(NextflowBaseTask):
21
21
  name: str,
22
22
  statement: str,
23
23
  ret: List[str],
24
- import_path: Path,
24
+ script_path: Path,
25
+ calling_subwf_name: str,
25
26
  process_name: str,
26
27
  unaliased: str,
27
28
  execution_profile: Optional[str],
28
29
  wf: NextflowWorkflow,
29
30
  ):
30
31
  super().__init__(
31
- inputs, outputs, id, name, {}, wf, NFTaskType.Process, cpu=16, memory=32
32
+ inputs, outputs, id, name, {}, wf, NFTaskType.Process, cpu=16, memory=48
32
33
  )
33
34
 
34
35
  self.wf_inputs = {}
@@ -50,7 +51,8 @@ class NextflowProcessTask(NextflowBaseTask):
50
51
 
51
52
  self.statement = statement
52
53
  self.ret = ret
53
- self.import_path = import_path
54
+ self.script_path = script_path
55
+ self.calling_subwf_name = calling_subwf_name
54
56
  self.process_name = process_name
55
57
  self.unaliased = unaliased
56
58
  self.execution_profile = execution_profile
@@ -152,19 +154,10 @@ class NextflowProcessTask(NextflowBaseTask):
152
154
  1,
153
155
  )
154
156
 
155
- include_str = ""
156
- if self.import_path.resolve() != self.wf.nf_script.resolve():
157
- include_meta = {}
158
- stem = str(
159
- self.import_path.resolve().relative_to(
160
- self.wf.nf_script.parent.resolve()
161
- )
162
- )
163
- include_meta["path"] = f"./{stem}"
164
- include_meta["alias"] = self.process_name
165
- include_meta["name"] = self.unaliased
166
-
167
- include_str = json.dumps(include_meta)
157
+ if self.script_path.resolve() != self.wf.nf_script.resolve():
158
+ stem = self.script_path.resolve().relative_to(self.wf.pkg_root.resolve())
159
+ run_task_entrypoint[2] = str(Path("/root") / stem)
160
+ run_task_entrypoint.extend(["-entry", self.calling_subwf_name])
168
161
 
169
162
  code_block += reindent(
170
163
  rf"""
@@ -178,7 +171,6 @@ class NextflowProcessTask(NextflowBaseTask):
178
171
  [{','.join([f"str({x})" if x.startswith("wf_") else repr(x) for x in run_task_entrypoint])}],
179
172
  env={{
180
173
  **os.environ,
181
- "LATCH_INCLUDE_META": {repr(include_str)},
182
174
  "LATCH_EXPRESSION": {repr(self.statement)},
183
175
  "LATCH_RETURN": {repr(json.dumps(self.ret))},
184
176
  "LATCH_PARAM_VALS": json.dumps(channel_vals),
@@ -188,9 +180,7 @@ class NextflowProcessTask(NextflowBaseTask):
188
180
  except subprocess.CalledProcessError:
189
181
  log = Path("/root/.nextflow.log").read_text()
190
182
  print("\n\n\n\n\n" + log)
191
-
192
- import time
193
- time.sleep(10000)
183
+ raise
194
184
 
195
185
  out_channels = {{}}
196
186
  files = [Path(f) for f in glob.glob(".latch/task-outputs/*.json")]
@@ -42,7 +42,7 @@ def _get_flags_to_params(key: str, t: Type, flags: Dict[str, str]):
42
42
 
43
43
 
44
44
  class NextflowWorkflow(WorkflowBase, ClassStorageTaskResolver):
45
- def __init__(self, nf_script: Path, version: str, dag: DAG):
45
+ def __init__(self, pkg_root: Path, nf_script: Path, version: str, dag: DAG):
46
46
  assert metadata._nextflow_metadata is not None
47
47
  assert metadata._nextflow_metadata.output_directory is not None
48
48
 
@@ -91,6 +91,7 @@ class NextflowWorkflow(WorkflowBase, ClassStorageTaskResolver):
91
91
 
92
92
  self.nextflow_tasks: List[NextflowBaseTask] = []
93
93
 
94
+ self.pkg_root = pkg_root
94
95
  self.nf_script = nf_script
95
96
  self.version = version
96
97
  self.dag = dag
@@ -13,7 +13,7 @@ if cur_ver < (3, 8) or cur_ver > (3, 11):
13
13
 
14
14
  setup(
15
15
  name="latch",
16
- version="v2.39.0.dev27",
16
+ version="v2.39.0.dev29",
17
17
  author_email="kenny@latch.bio",
18
18
  description="The Latch SDK",
19
19
  packages=find_packages(),
@@ -1,67 +0,0 @@
1
- from pathlib import Path
2
- from typing import Dict, List, Mapping, Type
3
-
4
- from latch.types.metadata import ParameterType
5
-
6
- from ....extras.common.utils import reindent
7
- from ..workflow import NextflowWorkflow
8
- from .operator import NextflowOperatorTask
9
-
10
-
11
- class NextflowInputTask(NextflowOperatorTask):
12
- def __init__(
13
- self,
14
- inputs: Mapping[str, Type[ParameterType]],
15
- outputs: Mapping[str, Type[ParameterType]],
16
- id: str,
17
- name: str,
18
- branches: Dict[str, bool],
19
- wf: NextflowWorkflow,
20
- ):
21
- super().__init__(inputs, outputs, id, name, "", [], branches, wf)
22
-
23
- assert len(self.channel_inputs) == 1, (
24
- self.channel_inputs,
25
- self.conditional_inputs,
26
- self.wf_inputs,
27
- )
28
-
29
- def get_fn_return_stmt(self):
30
- results: List[str] = []
31
- for out_name in self._python_outputs.keys():
32
- results.append(reindent(rf"{out_name}=res", 2).rstrip())
33
-
34
- return_str = ",\n".join(results)
35
-
36
- return reindent(
37
- rf"""
38
- return Res{self.name}(
39
- __return_str__
40
- )
41
- """,
42
- 0,
43
- ).replace("__return_str__", return_str)
44
-
45
- def get_fn_code(self, nf_script_path_in_container: Path):
46
- code_block = self.get_fn_interface()
47
- code_block += self.get_fn_conditions()
48
-
49
- channel_input = self.channel_inputs.popitem()[0]
50
-
51
- code_block += reindent(
52
- rf"""
53
- res = {channel_input}
54
- else:
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}}")
60
- res = None
61
-
62
- """,
63
- 1,
64
- )
65
-
66
- code_block += self.get_fn_return_stmt()
67
- return code_block
@@ -1,86 +0,0 @@
1
- import json
2
- from pathlib import Path
3
- from typing import Dict, List, Mapping, Type
4
-
5
- from latch.types.metadata import ParameterType
6
-
7
- from ....extras.common.utils import reindent
8
- from ..workflow import NextflowWorkflow
9
- from .operator import NextflowOperatorTask
10
-
11
-
12
- class NextflowOutputTask(NextflowOperatorTask):
13
- def __init__(
14
- self,
15
- inputs: Mapping[str, Type[ParameterType]],
16
- outputs: Mapping[str, Type[ParameterType]],
17
- id: str,
18
- name: str,
19
- statement: str,
20
- ret: List[str],
21
- branches: Dict[str, bool],
22
- wf: NextflowWorkflow,
23
- ):
24
- super().__init__(
25
- inputs,
26
- outputs,
27
- id,
28
- name,
29
- statement,
30
- ret,
31
- branches,
32
- wf,
33
- )
34
-
35
- def get_fn_return_stmt(self):
36
- assert len(self._python_outputs) == len(
37
- self.channel_inputs
38
- ), f"{self.name, self._python_outputs, self.channel_inputs}"
39
-
40
- results: List[str] = []
41
- for out_name, param_name in zip(
42
- self._python_outputs.keys(), self.channel_inputs.keys()
43
- ):
44
- results.append(
45
- reindent(rf"{out_name}=({param_name} if cond else None)", 2).rstrip()
46
- )
47
-
48
- return_str = ",\n".join(results)
49
-
50
- return reindent(
51
- rf"""
52
- return Res{self.name}(
53
- __return_str__
54
- )
55
- """,
56
- 0,
57
- ).replace("__return_str__", return_str)
58
-
59
- def get_fn_conditions(self):
60
- res: List[str] = []
61
- for k in self.conditional_inputs.keys():
62
- res.append(f"({k} == {self.branches[k]})")
63
- for k in self.channel_inputs.keys():
64
- res.append(f"({k} is not None)")
65
-
66
- if len(res) == 0:
67
- return reindent(
68
- f"""\
69
- cond = True
70
- """,
71
- 1,
72
- )
73
-
74
- return reindent(
75
- f"""\
76
- cond = ({' and '.join(res)})
77
- """,
78
- 1,
79
- )
80
-
81
- def get_fn_code(self, nf_script_path_in_container: Path):
82
- code_block = self.get_fn_interface()
83
- code_block += self.get_fn_conditions()
84
- code_block += self.get_fn_return_stmt()
85
-
86
- return code_block
File without changes
File without changes
File without changes