latch 2.46.1.dev1__tar.gz → 2.46.2.dev1__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 (173) hide show
  1. {latch-2.46.1.dev1/latch.egg-info → latch-2.46.2.dev1}/PKG-INFO +1 -1
  2. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/account.py +16 -13
  3. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/registry/project.py +16 -12
  4. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/registry/record.py +9 -1
  5. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/registry/table.py +19 -8
  6. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/utils.py +7 -8
  7. {latch-2.46.1.dev1 → latch-2.46.2.dev1/latch.egg-info}/PKG-INFO +1 -1
  8. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/nextflow/dependencies.py +1 -1
  9. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/nextflow/workflow.py +10 -10
  10. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/setup.py +1 -1
  11. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/LICENSE +0 -0
  12. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/MANIFEST.in +0 -0
  13. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/README.md +0 -0
  14. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/__init__.py +0 -0
  15. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/executions.py +0 -0
  16. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/functions/__init__.py +0 -0
  17. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/functions/messages.py +0 -0
  18. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/functions/operators.py +0 -0
  19. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/functions/secrets.py +0 -0
  20. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/__init__.py +0 -0
  21. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/_transfer/__init__.py +0 -0
  22. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/_transfer/download.py +0 -0
  23. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/_transfer/manager.py +0 -0
  24. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/_transfer/node.py +0 -0
  25. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/_transfer/progress.py +0 -0
  26. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/_transfer/remote_copy.py +0 -0
  27. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/_transfer/throttle.py +0 -0
  28. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/_transfer/upload.py +0 -0
  29. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/_transfer/utils.py +0 -0
  30. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/path.py +0 -0
  31. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/ldata/type.py +0 -0
  32. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/registry/__init__.py +0 -0
  33. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/registry/types.py +0 -0
  34. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/registry/upstream_types/__init__.py +0 -0
  35. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/registry/upstream_types/types.py +0 -0
  36. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/registry/upstream_types/values.py +0 -0
  37. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/registry/utils.py +0 -0
  38. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/resources/__init__.py +0 -0
  39. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/resources/conditional.py +0 -0
  40. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/resources/dynamic.py +0 -0
  41. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/resources/launch_plan.py +0 -0
  42. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/resources/map_tasks.py +0 -0
  43. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/resources/reference_workflow.py +0 -0
  44. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/resources/tasks.py +0 -0
  45. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/resources/workflow.py +0 -0
  46. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/types/__init__.py +0 -0
  47. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/types/directory.py +0 -0
  48. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/types/file.py +0 -0
  49. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/types/glob.py +0 -0
  50. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/types/json.py +0 -0
  51. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/types/metadata.py +0 -0
  52. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/types/utils.py +0 -0
  53. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/verified/__init__.py +0 -0
  54. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/verified/deseq2.py +0 -0
  55. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/verified/mafft.py +0 -0
  56. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/verified/pathway.py +0 -0
  57. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/verified/rnaseq.py +0 -0
  58. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch/verified/trim_galore.py +0 -0
  59. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch.egg-info/SOURCES.txt +0 -0
  60. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch.egg-info/dependency_links.txt +0 -0
  61. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch.egg-info/entry_points.txt +0 -0
  62. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch.egg-info/requires.txt +0 -0
  63. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch.egg-info/top_level.txt +0 -0
  64. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/__init__.py +0 -0
  65. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/auth/__init__.py +0 -0
  66. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/auth/csrf.py +0 -0
  67. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/auth/oauth2.py +0 -0
  68. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/auth/pkce.py +0 -0
  69. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/auth/utils.py +0 -0
  70. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/centromere/__init__.py +0 -0
  71. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/centromere/ctx.py +0 -0
  72. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/centromere/utils.py +0 -0
  73. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/click_utils.py +0 -0
  74. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/constants.py +0 -0
  75. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/docker_utils/__init__.py +0 -0
  76. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/exceptions/__init__.py +0 -0
  77. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/exceptions/cache.py +0 -0
  78. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/exceptions/errors.py +0 -0
  79. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/exceptions/handler.py +0 -0
  80. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/exceptions/traceback.py +0 -0
  81. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/main.py +0 -0
  82. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/menus.py +0 -0
  83. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/nextflow/__init__.py +0 -0
  84. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/nextflow/config.py +0 -0
  85. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/nextflow/utils.py +0 -0
  86. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/__init__.py +0 -0
  87. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/cp/__init__.py +0 -0
  88. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/cp/autocomplete.py +0 -0
  89. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/cp/glob.py +0 -0
  90. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/cp/main.py +0 -0
  91. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/cp/utils.py +0 -0
  92. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/execute/__init__.py +0 -0
  93. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/execute/main.py +0 -0
  94. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/execute/utils.py +0 -0
  95. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/get.py +0 -0
  96. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/get_executions.py +0 -0
  97. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/get_params.py +0 -0
  98. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/__init__.py +0 -0
  99. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/__pycache__/__init__.cpython-310.pyc +0 -0
  100. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/__pycache__/init.cpython-310.pyc +0 -0
  101. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/assemble_and_sort/.env +0 -0
  102. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/assemble_and_sort/LICENSE +0 -0
  103. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/assemble_and_sort/README.md +0 -0
  104. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/assemble_and_sort/__init__.py +0 -0
  105. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/assemble_and_sort/assemble.py +0 -0
  106. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/assemble_and_sort/sort.py +0 -0
  107. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/assemble_and_sort/system-requirements.txt +0 -0
  108. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/common/.dockerignore +0 -0
  109. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_conda/__init__.py +0 -0
  110. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_conda/conda_task.py +0 -0
  111. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_conda/environment.yaml +0 -0
  112. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_docker/__init__.py +0 -0
  113. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_docker/task.py +0 -0
  114. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_nfcore/Dockerfile +0 -0
  115. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_nfcore/__init__.py +0 -0
  116. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_nfcore/task.py +0 -0
  117. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_r/__init__.py +0 -0
  118. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_r/environment.R +0 -0
  119. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_r/r_task.py +0 -0
  120. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_snakemake/.latch/latch_entrypoint +0 -0
  121. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_snakemake/Dockerfile +0 -0
  122. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_snakemake/Snakefile +0 -0
  123. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_snakemake/config.yaml +0 -0
  124. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_snakemake/environment.yaml +0 -0
  125. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_snakemake/latch_metadata.py +0 -0
  126. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_snakemake/scripts/plot-quals.py +0 -0
  127. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/example_snakemake/version +0 -0
  128. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/init.py +0 -0
  129. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/template/LICENSE +0 -0
  130. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/template/README.md +0 -0
  131. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/template/__init__.py +0 -0
  132. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/init/template/task.py +0 -0
  133. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/launch.py +0 -0
  134. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/local_dev.py +0 -0
  135. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/local_dev_old.py +0 -0
  136. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/login.py +0 -0
  137. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/ls.py +0 -0
  138. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/mkdir.py +0 -0
  139. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/move.py +0 -0
  140. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/preview.py +0 -0
  141. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/register/__init__.py +0 -0
  142. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/register/constants.py +0 -0
  143. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/register/register.py +0 -0
  144. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/register/utils.py +0 -0
  145. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/rm.py +0 -0
  146. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/stop_pod.py +0 -0
  147. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/sync.py +0 -0
  148. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/test_data/__init__.py +0 -0
  149. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/test_data/ls.py +0 -0
  150. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/test_data/remove.py +0 -0
  151. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/test_data/upload.py +0 -0
  152. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/test_data/utils.py +0 -0
  153. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/services/workspace.py +0 -0
  154. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/snakemake/__init__.py +0 -0
  155. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/snakemake/config/__init__.py +0 -0
  156. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/snakemake/config/parser.py +0 -0
  157. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/snakemake/config/utils.py +0 -0
  158. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/snakemake/serialize.py +0 -0
  159. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/snakemake/serialize_utils.py +0 -0
  160. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/snakemake/single_task_snakemake.py +0 -0
  161. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/snakemake/utils.py +0 -0
  162. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/snakemake/workflow.py +0 -0
  163. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/tinyrequests.py +0 -0
  164. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/tui/__init__.py +0 -0
  165. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/utils/__init__.py +0 -0
  166. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/utils/path.py +0 -0
  167. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/latch_cli/workflow_config.py +0 -0
  168. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/pyproject.toml +0 -0
  169. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/setup.cfg +0 -0
  170. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/tests/__init__.py +0 -0
  171. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/tests/cp/__init__.py +0 -0
  172. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/tests/fixtures.py +0 -0
  173. {latch-2.46.1.dev1 → latch-2.46.2.dev1}/tests/test_ls.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: latch
3
- Version: 2.46.1.dev1
3
+ Version: 2.46.2.dev1
4
4
  Summary: The Latch SDK
5
5
  Author-email: kenny@latch.bio
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -16,7 +16,10 @@ from typing_extensions import Self, TypeAlias
16
16
 
17
17
  from latch.registry.project import Project
18
18
  from latch.registry.table import Table
19
- from latch.utils import current_workspace
19
+ from latch.utils import NotFoundError, current_workspace
20
+
21
+
22
+ class AccountNotFoundError(NotFoundError): ...
20
23
 
21
24
 
22
25
  class _CatalogExperiment(TypedDict):
@@ -121,7 +124,11 @@ class Account:
121
124
  """),
122
125
  {"ownerId": self.id},
123
126
  )["accountInfo"]
124
- # todo(maximsmol): deal with nonexistent accounts
127
+
128
+ if data is None:
129
+ raise AccountNotFoundError(
130
+ f"account does not exist or you lack permissions: id={self.id}"
131
+ )
125
132
 
126
133
  self._cache.catalog_projects = []
127
134
  for x in data["catalogProjectsByOwnerId"]["nodes"]:
@@ -258,12 +265,10 @@ class AccountUpdate:
258
265
 
259
266
  args = l.ArgumentNode()
260
267
  args.name = _name_node("input")
261
- args.value = _json_value(
262
- {
263
- "argOwnerId": self.account.id,
264
- "argDisplayNames": display_names,
265
- }
266
- )
268
+ args.value = _json_value({
269
+ "argOwnerId": self.account.id,
270
+ "argDisplayNames": display_names,
271
+ })
267
272
 
268
273
  res.alias = _name_node(f"upd{len(mutations)}")
269
274
  res.arguments = tuple([args])
@@ -299,11 +304,9 @@ class AccountUpdate:
299
304
 
300
305
  args = l.ArgumentNode()
301
306
  args.name = _name_node("input")
302
- args.value = _json_value(
303
- {
304
- "argIds": ids,
305
- }
306
- )
307
+ args.value = _json_value({
308
+ "argIds": ids,
309
+ })
307
310
 
308
311
  res.alias = _name_node(f"upd{len(mutations)}")
309
312
  res.arguments = tuple([args])
@@ -9,6 +9,7 @@ from latch_sdk_gql.utils import _GqlJsonValue, _json_value, _name_node, _parse_s
9
9
  from typing_extensions import TypeAlias
10
10
 
11
11
  from latch.registry.table import Table
12
+ from latch.utils import NotFoundError, current_workspace
12
13
 
13
14
 
14
15
  class _CatalogExperimentNode(TypedDict):
@@ -22,6 +23,9 @@ class _Cache:
22
23
  tables: Optional[List[Table]] = None
23
24
 
24
25
 
26
+ class ProjectNotFoundError(NotFoundError): ...
27
+
28
+
25
29
  @dataclass(frozen=True)
26
30
  class Project:
27
31
  """Registry project (folder containing :class:`tables <latch.registry.table.Table>`).
@@ -69,7 +73,11 @@ class Project:
69
73
  """),
70
74
  variables={"id": self.id},
71
75
  )["catalogProject"]
72
- # todo(maximsmol): deal with nonexistent projects
76
+
77
+ if data is None:
78
+ raise ProjectNotFoundError(
79
+ f"project does not exist or you lack permissions: id={self.id}"
80
+ )
73
81
 
74
82
  self._cache.display_name = data["displayName"]
75
83
 
@@ -228,12 +236,10 @@ class ProjectUpdate:
228
236
 
229
237
  args = l.ArgumentNode()
230
238
  args.name = _name_node("input")
231
- args.value = _json_value(
232
- {
233
- "argProjectId": self.project.id,
234
- "argDisplayNames": display_names,
235
- }
236
- )
239
+ args.value = _json_value({
240
+ "argProjectId": self.project.id,
241
+ "argDisplayNames": display_names,
242
+ })
237
243
 
238
244
  res.alias = _name_node(f"upd{len(mutations)}")
239
245
  res.arguments = tuple([args])
@@ -267,11 +273,9 @@ class ProjectUpdate:
267
273
 
268
274
  args = l.ArgumentNode()
269
275
  args.name = _name_node("input")
270
- args.value = _json_value(
271
- {
272
- "argIds": ids,
273
- }
274
- )
276
+ args.value = _json_value({
277
+ "argIds": ids,
278
+ })
275
279
 
276
280
  res.alias = _name_node(f"upd{len(mutations)}")
277
281
  res.arguments = tuple([args])
@@ -17,11 +17,15 @@ from latch_sdk_gql.execute import execute
17
17
 
18
18
  from latch.registry.upstream_types.types import DBType
19
19
  from latch.registry.upstream_types.values import DBValue
20
+ from latch.utils import NotFoundError, current_workspace
20
21
 
21
22
  if TYPE_CHECKING: # avoid circular type imports
22
23
  from latch.registry.types import Column, RecordValue
23
24
 
24
25
 
26
+ class RecordNotFoundError(NotFoundError): ...
27
+
28
+
25
29
  class NoSuchColumnError(KeyError):
26
30
  """Unknown column referenced by Registry method.
27
31
 
@@ -133,7 +137,11 @@ class Record:
133
137
  """),
134
138
  {"id": self.id},
135
139
  )["catalogSample"]
136
- # todo(maximsmol): deal with nonexistent records
140
+
141
+ if data is None:
142
+ raise RecordNotFoundError(
143
+ f"record does not exist or you lack permissions: id={self.id}"
144
+ )
137
145
 
138
146
  self._cache.table_id = data["experiment"]["id"]
139
147
  self._cache.name = data["name"]
@@ -56,7 +56,7 @@ from latch.registry.utils import (
56
56
  )
57
57
  from latch.types.directory import LatchDir
58
58
  from latch.types.file import LatchFile
59
- from latch.utils import current_workspace
59
+ from latch.utils import NotFoundError, current_workspace
60
60
  from latch_cli.utils import human_readable_time
61
61
 
62
62
  from ..types.json import JsonValue
@@ -81,6 +81,9 @@ class _Cache:
81
81
  project_id: Optional[str] = None
82
82
 
83
83
 
84
+ class TableNotFoundError(NotFoundError): ...
85
+
86
+
84
87
  @dataclass(frozen=True)
85
88
  class Table:
86
89
  """Registry table. Contains :class:`records <latch.registry.record.Record>`.
@@ -125,7 +128,11 @@ class Table:
125
128
  """),
126
129
  variables={"id": self.id},
127
130
  )["catalogExperiment"]
128
- # todo(maximsmol): deal with nonexistent tables
131
+
132
+ if data is None:
133
+ raise TableNotFoundError(
134
+ f"table does not exist or you lack permissions: id={self.id}"
135
+ )
129
136
 
130
137
  self._cache.project_id = data["projectId"]
131
138
  self._cache.display_name = data["displayName"]
@@ -243,7 +250,7 @@ class Table:
243
250
 
244
251
  # todo(maximsmol): because allSamples returns each column as its own
245
252
  # row, we can't paginate by samples because we don't know when a sample is finished
246
- nodes: List[_AllRecordsNode] = execute(
253
+ data = execute(
247
254
  gql.gql("""
248
255
  query TableQuery($id: BigInt!) {
249
256
  catalogExperiment(id: $id) {
@@ -258,11 +265,15 @@ class Table:
258
265
  }
259
266
  }
260
267
  """),
261
- {
262
- "id": self.id,
263
- },
264
- )["catalogExperiment"]["allSamples"]["nodes"]
265
- # todo(maximsmol): deal with nonexistent tables
268
+ {"id": self.id},
269
+ )["catalogExperiment"]
270
+
271
+ if data is None:
272
+ raise TableNotFoundError(
273
+ f"table does not exist or you lack permissions: id={self.id}"
274
+ )
275
+
276
+ nodes: List[_AllRecordsNode] = data["allSamples"]["nodes"]
266
277
 
267
278
  record_names: Dict[str, str] = {}
268
279
  record_values: Dict[str, Dict[str, RecordValue]] = {}
@@ -55,8 +55,7 @@ def get_workspaces() -> Dict[str, WSInfo]:
55
55
  """
56
56
  account_id = account_id_from_token(retrieve_or_login())
57
57
  res = execute(
58
- gql.gql(
59
- """
58
+ gql.gql("""
60
59
  query GetWorkspaces($accountId: BigInt!) {
61
60
  userInfoByAccountId(accountId: $accountId) {
62
61
  id
@@ -103,8 +102,7 @@ def get_workspaces() -> Dict[str, WSInfo]:
103
102
  }
104
103
  }
105
104
  }
106
- """
107
- ),
105
+ """),
108
106
  {"accountId": account_id},
109
107
  )
110
108
 
@@ -153,8 +151,7 @@ def current_workspace() -> str:
153
151
  ws = user_config.workspace_id
154
152
  if ws == "":
155
153
  res = execute(
156
- gql.gql(
157
- """
154
+ gql.gql("""
158
155
  query DefaultAccountQuery {
159
156
  accountInfoCurrent {
160
157
  id
@@ -163,8 +160,7 @@ def current_workspace() -> str:
163
160
  }
164
161
  }
165
162
  }
166
- """
167
- ),
163
+ """),
168
164
  )["accountInfoCurrent"]
169
165
 
170
166
  default_ws = res["id"]
@@ -177,3 +173,6 @@ def current_workspace() -> str:
177
173
  ws = default_ws
178
174
 
179
175
  return ws
176
+
177
+
178
+ class NotFoundError(ValueError): ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: latch
3
- Version: 2.46.1.dev1
3
+ Version: 2.46.2.dev1
4
4
  Summary: The Latch SDK
5
5
  Author-email: kenny@latch.bio
6
6
  Classifier: Programming Language :: Python :: 3.8
@@ -12,7 +12,7 @@ from botocore.handlers import disable_signing
12
12
 
13
13
  from latch_cli import tinyrequests
14
14
 
15
- target_version = "v1.0.1"
15
+ target_version = "v1.0.2"
16
16
 
17
17
 
18
18
  def _do_download(
@@ -127,18 +127,18 @@ def nextflow_runtime(pvc_name: str, {param_signature}) -> None:
127
127
  check=True,
128
128
  cwd=str(shared_dir),
129
129
  )
130
- except subprocess.CalledProcessError:
130
+ finally:
131
131
  print()
132
132
 
133
- name = _get_execution_name()
134
- if name is None:
135
- print("Skipping logs upload, failed to get execution name")
136
- else:
137
- remote = LPath(urljoins("{log_dir}", name, "nextflow.log"))
138
- print(f"Uploading .nextflow.log to {{remote.path}}")
139
- remote.upload_from(shared_dir / ".nextflow.log")
140
-
141
- raise
133
+ nextflow_log = shared_dir / ".nextflow.log"
134
+ if nextflow_log.exists():
135
+ name = _get_execution_name()
136
+ if name is None:
137
+ print("Skipping logs upload, failed to get execution name")
138
+ else:
139
+ remote = LPath(urljoins("{log_dir}", name, "nextflow.log"))
140
+ print(f"Uploading .nextflow.log to {{remote.path}}")
141
+ remote.upload_from(nextflow_log)
142
142
 
143
143
 
144
144
 
@@ -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.46.1.dev1",
16
+ version="v2.46.2.dev1",
17
17
  author_email="kenny@latch.bio",
18
18
  description="The Latch SDK",
19
19
  packages=find_packages(),
File without changes
File without changes
File without changes
File without changes
File without changes