lamindb 0.70.1__tar.gz → 0.70.3__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 (388) hide show
  1. {lamindb-0.70.1 → lamindb-0.70.3}/PKG-INFO +3 -3
  2. {lamindb-0.70.1 → lamindb-0.70.3}/docs/changelog.md +12 -1
  3. lamindb-0.70.3/docs/storage/vitessce.ipynb +157 -0
  4. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage.md +1 -0
  5. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/__init__.py +1 -1
  6. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_annotate.py +4 -4
  7. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_artifact.py +51 -18
  8. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_collection.py +2 -1
  9. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_finish.py +31 -29
  10. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_run_context.py +5 -0
  11. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/storage/__init__.py +1 -0
  12. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/storage/_backed_access.py +3 -3
  13. lamindb-0.70.3/lamindb/core/storage/_valid_suffixes.py +3 -0
  14. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/storage/_zarr.py +27 -11
  15. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/storage/paths.py +2 -2
  16. lamindb-0.70.3/lamindb/integrations/_vitessce.py +70 -0
  17. {lamindb-0.70.1 → lamindb-0.70.3}/noxfile.py +1 -0
  18. {lamindb-0.70.1 → lamindb-0.70.3}/pyproject.toml +2 -2
  19. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/changelog.md +3 -0
  20. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-cloud/06-connect-hosted-instance.ipynb +17 -1
  21. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/__init__.py +1 -1
  22. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_connect_instance.py +5 -2
  23. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/upath.py +37 -14
  24. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-cloud/test_connect_instance.py +20 -6
  25. {lamindb-0.70.1 → lamindb-0.70.3}/tests/notebooks/with-title-initialized-consecutive-finish-not-last-cell.ipynb +2 -3
  26. {lamindb-0.70.1 → lamindb-0.70.3}/tests/notebooks/with-title-initialized-consecutive-finish.ipynb +1 -1
  27. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_artifact.py +23 -4
  28. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_collection.py +8 -0
  29. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_notebooks.py +4 -0
  30. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_run_context.py +11 -0
  31. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_storage.py +15 -1
  32. lamindb-0.70.1/lamindb/integrations/_vitessce.py +0 -50
  33. {lamindb-0.70.1 → lamindb-0.70.3}/.github/workflows/build.yml +0 -0
  34. {lamindb-0.70.1 → lamindb-0.70.3}/.github/workflows/latest-changes.jinja2 +0 -0
  35. {lamindb-0.70.1 → lamindb-0.70.3}/.github/workflows/latest-changes.yml +0 -0
  36. {lamindb-0.70.1 → lamindb-0.70.3}/.gitignore +0 -0
  37. {lamindb-0.70.1 → lamindb-0.70.3}/.gitmodules +0 -0
  38. {lamindb-0.70.1 → lamindb-0.70.3}/.pre-commit-config.yaml +0 -0
  39. {lamindb-0.70.1 → lamindb-0.70.3}/LICENSE +0 -0
  40. {lamindb-0.70.1 → lamindb-0.70.3}/README.md +0 -0
  41. {lamindb-0.70.1 → lamindb-0.70.3}/docs/annotate-for-developers.ipynb +0 -0
  42. {lamindb-0.70.1 → lamindb-0.70.3}/docs/annotate.ipynb +0 -0
  43. {lamindb-0.70.1 → lamindb-0.70.3}/docs/bio-registries.ipynb +0 -0
  44. {lamindb-0.70.1 → lamindb-0.70.3}/docs/bionty-base.md +0 -0
  45. {lamindb-0.70.1 → lamindb-0.70.3}/docs/bionty.md +0 -0
  46. {lamindb-0.70.1 → lamindb-0.70.3}/docs/can-validate.ipynb +0 -0
  47. {lamindb-0.70.1 → lamindb-0.70.3}/docs/data.ipynb +0 -0
  48. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/acid.ipynb +0 -0
  49. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/delete.ipynb +0 -0
  50. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/idempotency.ipynb +0 -0
  51. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/import-schema.ipynb +0 -0
  52. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/key.ipynb +0 -0
  53. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/reference-field.ipynb +0 -0
  54. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/setup.ipynb +0 -0
  55. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/test_notebooks.py +0 -0
  56. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/track-run-inputs.ipynb +0 -0
  57. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq/visibility.ipynb +0 -0
  58. {lamindb-0.70.1 → lamindb-0.70.3}/docs/faq.md +0 -0
  59. {lamindb-0.70.1 → lamindb-0.70.3}/docs/features-lamindb.md +0 -0
  60. {lamindb-0.70.1 → lamindb-0.70.3}/docs/features-laminhub.md +0 -0
  61. {lamindb-0.70.1 → lamindb-0.70.3}/docs/guide.md +0 -0
  62. {lamindb-0.70.1 → lamindb-0.70.3}/docs/index.md +0 -0
  63. {lamindb-0.70.1 → lamindb-0.70.3}/docs/installation.md +0 -0
  64. {lamindb-0.70.1 → lamindb-0.70.3}/docs/introduction.ipynb +0 -0
  65. {lamindb-0.70.1 → lamindb-0.70.3}/docs/lamin-utils.md +0 -0
  66. {lamindb-0.70.1 → lamindb-0.70.3}/docs/lamindb.md +0 -0
  67. {lamindb-0.70.1 → lamindb-0.70.3}/docs/meta.ipynb +0 -0
  68. {lamindb-0.70.1 → lamindb-0.70.3}/docs/nbproject.md +0 -0
  69. {lamindb-0.70.1 → lamindb-0.70.3}/docs/query-search.md +0 -0
  70. {lamindb-0.70.1 → lamindb-0.70.3}/docs/readfcs.md +0 -0
  71. {lamindb-0.70.1 → lamindb-0.70.3}/docs/reference.md +0 -0
  72. {lamindb-0.70.1 → lamindb-0.70.3}/docs/schemas.ipynb +0 -0
  73. {lamindb-0.70.1 → lamindb-0.70.3}/docs/setup.ipynb +0 -0
  74. {lamindb-0.70.1 → lamindb-0.70.3}/docs/signup-login.md +0 -0
  75. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage/add-replace-stage.ipynb +0 -0
  76. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage/anndata-accessor.ipynb +0 -0
  77. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage/prepare-transfer-local-to-cloud.ipynb +0 -0
  78. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage/test-files/iris.csv +0 -0
  79. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage/test-files/iris.data +0 -0
  80. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage/test-files/new_iris.csv +0 -0
  81. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage/test_notebooks.py +0 -0
  82. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage/transfer-local-to-cloud.ipynb +0 -0
  83. {lamindb-0.70.1 → lamindb-0.70.3}/docs/storage/upload.ipynb +0 -0
  84. {lamindb-0.70.1 → lamindb-0.70.3}/docs/test_notebooks.py +0 -0
  85. {lamindb-0.70.1 → lamindb-0.70.3}/docs/track.ipynb +0 -0
  86. {lamindb-0.70.1 → lamindb-0.70.3}/docs/transfer.ipynb +0 -0
  87. {lamindb-0.70.1 → lamindb-0.70.3}/docs/tutorial.ipynb +0 -0
  88. {lamindb-0.70.1 → lamindb-0.70.3}/docs/tutorial2.ipynb +0 -0
  89. {lamindb-0.70.1 → lamindb-0.70.3}/docs/wetlab.md +0 -0
  90. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_can_validate.py +0 -0
  91. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_feature.py +0 -0
  92. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_feature_set.py +0 -0
  93. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_filter.py +0 -0
  94. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_from_values.py +0 -0
  95. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_is_versioned.py +0 -0
  96. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_parents.py +0 -0
  97. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_query_manager.py +0 -0
  98. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_query_set.py +0 -0
  99. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_registry.py +0 -0
  100. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_run.py +0 -0
  101. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_save.py +0 -0
  102. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_storage.py +0 -0
  103. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_transform.py +0 -0
  104. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_ulabel.py +0 -0
  105. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_utils.py +0 -0
  106. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/_view.py +0 -0
  107. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/__init__.py +0 -0
  108. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_data.py +0 -0
  109. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_feature_manager.py +0 -0
  110. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_label_manager.py +0 -0
  111. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_mapped_collection.py +0 -0
  112. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_settings.py +0 -0
  113. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_sync_git.py +0 -0
  114. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_track_environment.py +0 -0
  115. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_transform_settings.py +0 -0
  116. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/_view_tree.py +0 -0
  117. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/datasets/__init__.py +0 -0
  118. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/datasets/_core.py +0 -0
  119. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/datasets/_fake.py +0 -0
  120. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/exceptions.py +0 -0
  121. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/fields.py +0 -0
  122. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/storage/_anndata_sizes.py +0 -0
  123. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/storage/objects.py +0 -0
  124. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/types.py +0 -0
  125. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/core/versioning.py +0 -0
  126. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/integrations/__init__.py +0 -0
  127. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/setup/__init__.py +0 -0
  128. {lamindb-0.70.1 → lamindb-0.70.3}/lamindb/setup/core/__init__.py +0 -0
  129. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/.github/workflows/build.yml +0 -0
  130. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/.github/workflows/latest-changes.jinja2 +0 -0
  131. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/.github/workflows/latest-changes.yml +0 -0
  132. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/.gitignore +0 -0
  133. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/.pre-commit-config.yaml +0 -0
  134. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/LICENSE +0 -0
  135. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/README.md +0 -0
  136. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/bionty/__init__.py +0 -0
  137. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/bionty/core/__init__.py +0 -0
  138. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/docs/changelog.md +0 -0
  139. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/docs/index.md +0 -0
  140. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/docs/reference.md +0 -0
  141. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/lamin-project.yaml +0 -0
  142. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/noxfile.py +0 -0
  143. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/pyproject.toml +0 -0
  144. {lamindb-0.70.1 → lamindb-0.70.3}/sub/bionty/tests/test_notebooks.py +0 -0
  145. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/.gitignore +0 -0
  146. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/.pre-commit-config.yaml +0 -0
  147. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/README.md +0 -0
  148. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/lamin_cli/__init__.py +0 -0
  149. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/lamin_cli/__main__.py +0 -0
  150. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/lamin_cli/_cache.py +0 -0
  151. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/lamin_cli/_get.py +0 -0
  152. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/lamin_cli/_migration.py +0 -0
  153. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/lamin_cli/_save.py +0 -0
  154. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/pyproject.toml +0 -0
  155. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/conftest.py +0 -0
  156. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/notebooks/not-initialized.ipynb +0 -0
  157. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/notebooks/with-title-and-initialized-consecutive.ipynb +0 -0
  158. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/notebooks/with-title-and-initialized-non-consecutive.ipynb +0 -0
  159. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/scripts/initialized-no-git-sync.py +0 -0
  160. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/scripts/initialized.py +0 -0
  161. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/test_cli.py +0 -0
  162. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/test_get.py +0 -0
  163. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/test_migrate.py +0 -0
  164. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/test_multi_process.py +0 -0
  165. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/test_save_files.py +0 -0
  166. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/test_save_notebooks.py +0 -0
  167. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamin-cli/tests/test_save_scripts.py +0 -0
  168. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/.github/workflows/build.yml +0 -0
  169. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/.github/workflows/latest-changes.jinja2 +0 -0
  170. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/.github/workflows/latest-changes.yml +0 -0
  171. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/.gitignore +0 -0
  172. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/.pre-commit-config.yaml +0 -0
  173. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/LICENSE +0 -0
  174. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/README.md +0 -0
  175. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-cloud/01-init-on-prem-instance.ipynb +0 -0
  176. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-cloud/02-connect-on-prem-instance.ipynb +0 -0
  177. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-cloud/03-set-storage.ipynb +0 -0
  178. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-cloud/04-test-bionty.ipynb +0 -0
  179. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-cloud/05-init-hosted-instance.ipynb +0 -0
  180. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-cloud/test-multi-session.ipynb +0 -0
  181. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-cloud/test_notebooks.py +0 -0
  182. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-prod/test-cache-management.ipynb +0 -0
  183. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-prod/test-cloud-sync.ipynb +0 -0
  184. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-prod/test-connect-anonymously.ipynb +0 -0
  185. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-prod/test-empty-init.ipynb +0 -0
  186. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-prod/test-import-schema.ipynb +0 -0
  187. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-prod/test-insufficient-user-info.ipynb +0 -0
  188. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-prod/test-invalid-schema.ipynb +0 -0
  189. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-prod/test-sqlite-lock.ipynb +0 -0
  190. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/hub-prod/test_notebooks2.py +0 -0
  191. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/index.md +0 -0
  192. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/notebooks.md +0 -0
  193. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/docs/reference.md +0 -0
  194. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_add_remote_storage.py +0 -0
  195. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_cache.py +0 -0
  196. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_check.py +0 -0
  197. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_check_setup.py +0 -0
  198. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_close.py +0 -0
  199. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_delete.py +0 -0
  200. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_django.py +0 -0
  201. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_exportdb.py +0 -0
  202. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_importdb.py +0 -0
  203. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_init_instance.py +0 -0
  204. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_migrate.py +0 -0
  205. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_register_instance.py +0 -0
  206. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_schema.py +0 -0
  207. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_setup_user.py +0 -0
  208. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/_silence_loggers.py +0 -0
  209. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/__init__.py +0 -0
  210. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_aws_storage.py +0 -0
  211. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_deprecated.py +0 -0
  212. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_docs.py +0 -0
  213. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_hub_client.py +0 -0
  214. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_hub_core.py +0 -0
  215. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_hub_crud.py +0 -0
  216. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_hub_utils.py +0 -0
  217. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_settings.py +0 -0
  218. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_settings_instance.py +0 -0
  219. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_settings_load.py +0 -0
  220. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_settings_save.py +0 -0
  221. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_settings_storage.py +0 -0
  222. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_settings_store.py +0 -0
  223. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_settings_user.py +0 -0
  224. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/_setup_bionty_sources.py +0 -0
  225. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/cloud_sqlite_locker.py +0 -0
  226. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/django.py +0 -0
  227. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/exceptions.py +0 -0
  228. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/hashing.py +0 -0
  229. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/lamindb_setup/core/types.py +0 -0
  230. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/noxfile.py +0 -0
  231. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/pyproject.toml +0 -0
  232. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-cloud/test_delete_instance.py +0 -0
  233. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-cloud/test_init_instance.py +0 -0
  234. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-cloud/test_login.py +0 -0
  235. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-cloud/test_migrate.py +0 -0
  236. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-cloud/test_set_storage.py +0 -0
  237. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-local/conftest.py +0 -0
  238. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-local/test_all.py +0 -0
  239. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-prod/conftest.py +0 -0
  240. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-prod/test_auto_connect.py +0 -0
  241. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-prod/test_django.py +0 -0
  242. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-prod/test_switch_and_fallback_env.py +0 -0
  243. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/hub-prod/test_upath.py +0 -0
  244. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/storage/test_hashing.py +0 -0
  245. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/storage/test_storage_access.py +0 -0
  246. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/storage/test_storage_basis.py +0 -0
  247. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lamindb-setup/tests/storage/test_storage_stats.py +0 -0
  248. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/.github/workflows/build.yml +0 -0
  249. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/.github/workflows/latest-changes.jinja2 +0 -0
  250. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/.github/workflows/latest-changes.yml +0 -0
  251. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/.gitignore +0 -0
  252. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/.pre-commit-config.yaml +0 -0
  253. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/LICENSE +0 -0
  254. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/README.md +0 -0
  255. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/docs/changelog.md +0 -0
  256. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/docs/index.md +0 -0
  257. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/docs/reference.md +0 -0
  258. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lamin-project.yaml +0 -0
  259. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/__init__.py +0 -0
  260. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/_bionty.py +0 -0
  261. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/core/__init__.py +0 -0
  262. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/core/_bionty.py +0 -0
  263. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/core/_settings.py +0 -0
  264. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/ids.py +0 -0
  265. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0001_initial.py +0 -0
  266. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0001_initial_squashed_0016.py +0 -0
  267. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0002_rename_gene_type_gene_biotype_and_more.py +0 -0
  268. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0003_alter_biontysource_entity_alter_biontysource_source_and_more.py +0 -0
  269. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0004_alter_cellline_bionty_source_and_more.py +0 -0
  270. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0005_rename_short_name_cellline_abbr_and_more.py +0 -0
  271. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0006_alter_biontysource_options_alter_cellline_options_and_more.py +0 -0
  272. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0007_rename_readout_experimental_factor.py +0 -0
  273. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0008_remove_gene_hgnc_id_remove_gene_mgi_id_and_more.py +0 -0
  274. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0009_alter_gene_ensembl_gene_id.py +0 -0
  275. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0010_alter_species_name.py +0 -0
  276. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0011_cellline_datasets_cellmarker_datasets_and_more.py +0 -0
  277. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0012_gene_stable_id.py +0 -0
  278. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0013_alter_cellmarker_species_alter_gene_species_and_more.py +0 -0
  279. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0014_ethnicity_developmentalstage.py +0 -0
  280. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0015_migrate_to_integer_pks.py +0 -0
  281. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0016_export_legacy_data.py +0 -0
  282. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0017_import_legacy_data.py +0 -0
  283. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0018_organism_rename_species_biontysource_organism_and_more.py +0 -0
  284. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0019_rename_taxon_id_organism_ontology_id_and_more.py +0 -0
  285. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0020_alter_organism_bionty_source.py +0 -0
  286. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0021_rename_files_cellline_artifacts_and_more.py +0 -0
  287. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0022_rename_datasets_cellline_collections_and_more.py +0 -0
  288. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0023_rename_publicsource_encode_uid.py +0 -0
  289. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/migrations/__init__.py +0 -0
  290. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/lnschema_bionty/models.py +0 -0
  291. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/noxfile.py +0 -0
  292. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/pyproject.toml +0 -0
  293. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-bionty/tests/test_integrity.py +0 -0
  294. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/.github/workflows/build.yml +0 -0
  295. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/.github/workflows/latest-changes.jinja2 +0 -0
  296. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/.github/workflows/latest-changes.yml +0 -0
  297. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/.gitignore +0 -0
  298. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/.pre-commit-config.yaml +0 -0
  299. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/CHANGELOG.md +0 -0
  300. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/LICENSE +0 -0
  301. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/README.md +0 -0
  302. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/__init__.py +0 -0
  303. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/ids.py +0 -0
  304. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0001_initial.py +0 -0
  305. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0001_initial_squashed_0023.py +0 -0
  306. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0002_alter_user_name.py +0 -0
  307. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0003_alter_storage_region_alter_transform_short_name.py +0 -0
  308. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0004_rename_folder_tag_alter_project_folders.py +0 -0
  309. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0005_alter_run_inputs_delete_runinput.py +0 -0
  310. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0006_feature_dataset.py +0 -0
  311. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0007_feature_synonyms_featureset_field_and_more.py +0 -0
  312. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0008_file_hash_type_transform_parents.py +0 -0
  313. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0009_remove_featureset_files_feature_unit_and_more.py +0 -0
  314. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0010_dataset_categories_file_categories.py +0 -0
  315. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0011_label_remove_tag_created_by_remove_tag_parents_and_more.py +0 -0
  316. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0012_remove_label_ref_id_remove_label_ref_orm_and_more.py +0 -0
  317. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0013_remove_feature_labels_orm_and_more.py +0 -0
  318. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0014_rename_ref_field_featureset_registry.py +0 -0
  319. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0015_file_initial_version_file_version.py +0 -0
  320. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0016_dataset_input_of_dataset_run_dataset_transform_and_more.py +0 -0
  321. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0017_dataset_initial_version_dataset_version.py +0 -0
  322. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0018_rename_datasetlabel_datasetulabel_and_more.py +0 -0
  323. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0019_dataset_reference_dataset_reference_type_and_more.py +0 -0
  324. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0020_run_report_transform_latest_report_and_more.py +0 -0
  325. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0021_dataset_storage_alter_dataset_file.py +0 -0
  326. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0022_migrate_to_integer_pks.py +0 -0
  327. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0023_export_legacy_data.py +0 -0
  328. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0024_import_legacy_data.py +0 -0
  329. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0025_remove_user_email.py +0 -0
  330. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0026_dataset_visibility_file_visibility.py +0 -0
  331. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0027_file_key_is_virtual.py +0 -0
  332. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0028_alter_dataset_visibility_alter_file_visibility.py +0 -0
  333. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0029_remove_feature_modality_remove_featureset_modality_and_more.py +0 -0
  334. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0030_alter_dataset_visibility_alter_file_visibility.py +0 -0
  335. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0031_rename_file_to_artifact.py +0 -0
  336. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0032_remove_dataset_storage.py +0 -0
  337. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0033_alter_artifact_unique_together_artifact_n_objects_and_more.py +0 -0
  338. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0034_run_environment.py +0 -0
  339. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0035_remove_artifact_initial_version_and_more.py +0 -0
  340. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0036_storage_description.py +0 -0
  341. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0037_rename_dataset_to_collection.py +0 -0
  342. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0038_alter_collection_artifact_alter_collection_artifacts_and_more.py +0 -0
  343. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0039_remove_collection_artifacts_collectionartifact_and_more.py +0 -0
  344. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0040_alter_transform_type.py +0 -0
  345. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0041_remove_transform_short_name_transform_description_and_more.py +0 -0
  346. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0042_rename_run_at_run_started_at_run_finished_at.py +0 -0
  347. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0043_run_json.py +0 -0
  348. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0044_run_replicated_outputs_transform_ulabels_and_more.py +0 -0
  349. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/0045_rename_replicated_outputs_run_replicated_output_artifacts_and_more.py +0 -0
  350. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/migrations/__init__.py +0 -0
  351. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/mocks.py +0 -0
  352. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/models.py +0 -0
  353. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/types.py +0 -0
  354. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/lnschema_core/users.py +0 -0
  355. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/noxfile.py +0 -0
  356. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/pyproject.toml +0 -0
  357. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/tests/test_integrity.py +0 -0
  358. {lamindb-0.70.1 → lamindb-0.70.3}/sub/lnschema-core/tests/test_types.py +0 -0
  359. {lamindb-0.70.1 → lamindb-0.70.3}/tests/conftest.py +0 -0
  360. {lamindb-0.70.1 → lamindb-0.70.3}/tests/notebooks/initialized-with-nbproject.ipynb +0 -0
  361. {lamindb-0.70.1 → lamindb-0.70.3}/tests/notebooks/no-title.ipynb +0 -0
  362. {lamindb-0.70.1 → lamindb-0.70.3}/tests/notebooks/not-initialized.ipynb +0 -0
  363. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_annotate.py +0 -0
  364. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_cache.py +0 -0
  365. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_can_validate.py +0 -0
  366. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_data.py +0 -0
  367. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_db.py +0 -0
  368. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_delete.py +0 -0
  369. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_feature.py +0 -0
  370. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_feature_manager.py +0 -0
  371. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_feature_set.py +0 -0
  372. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_from_values.py +0 -0
  373. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_label_manager.py +0 -0
  374. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_load.py +0 -0
  375. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_manager.py +0 -0
  376. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_parents.py +0 -0
  377. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_queryset.py +0 -0
  378. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_registry.py +0 -0
  379. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_run.py +0 -0
  380. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_save.py +0 -0
  381. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_settings.py +0 -0
  382. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_transfer.py +0 -0
  383. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_transform.py +0 -0
  384. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_uid.py +0 -0
  385. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_ulabel.py +0 -0
  386. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_versioning.py +0 -0
  387. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_view.py +0 -0
  388. {lamindb-0.70.1 → lamindb-0.70.3}/tests/test_visibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lamindb
3
- Version: 0.70.1
3
+ Version: 0.70.3
4
4
  Summary: A data framework for biology.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
6
  Requires-Python: >=3.8
@@ -10,8 +10,8 @@ Classifier: Programming Language :: Python :: 3.9
10
10
  Classifier: Programming Language :: Python :: 3.10
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Requires-Dist: lnschema_core==0.65.1
13
- Requires-Dist: lamindb_setup==0.69.2
14
- Requires-Dist: lamin_utils==0.13.1
13
+ Requires-Dist: lamindb_setup==0.69.5
14
+ Requires-Dist: lamin_utils==0.13.2
15
15
  Requires-Dist: lamin_cli==0.12.3
16
16
  Requires-Dist: rapidfuzz
17
17
  Requires-Dist: pyarrow
@@ -14,9 +14,20 @@ When upgrading your LaminDB installation to a new `minor` version in `major.mino
14
14
 
15
15
  ## 0.70
16
16
 
17
+ ### 0.70.3 {small}`2024-04-22`
18
+
19
+ - 🚸 Update metadata like description upon re-running [PR](https://github.com/laminlabs/lamindb/pull/1588) [@falexwolf](https://github.com/falexwolf)
20
+ - 🐛 Fix detection of AnnData in zarr and h5ad, refactor directory upload [PR](https://github.com/laminlabs/lamindb/pull/1587) [@Koncopd](https://github.com/Koncopd)
21
+ - 🚸 Raise error if transforms of type notebook or script are passed manually [PR](https://github.com/laminlabs/lamindb/pull/1584) [@falexwolf](https://github.com/falexwolf)
22
+
23
+ ### 0.70.2 {small}`2024-04-19`
24
+
25
+ - ♻️ In Vitessce integration, separate `VitessceConfig` from its referenced artifacts [PR](https://github.com/laminlabs/lamindb/pull/1582) [@falexwolf](https://github.com/falexwolf)
26
+ - 🚸 In `ln.finish()`, remove flag `i_saved_the_notebook` [PR](https://github.com/laminlabs/lamindb/pull/1581) [@falexwolf](https://github.com/falexwolf)
27
+
17
28
  ### 0.70.1 {small}`2024-04-18`
18
29
 
19
- - 🚑️ Fix public_source in inspect [PR](https://github.com/laminlabs/lamindb/pull/1578) [@sunnyosun](https://github.com/sunnyosun)
30
+ - 🐛 Fix `public_source` in inspect [PR](https://github.com/laminlabs/lamindb/pull/1578) [@sunnyosun](https://github.com/sunnyosun)
20
31
 
21
32
  ### 0.70.0 {small}`2024-04-17`
22
33
 
@@ -0,0 +1,157 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "# Vitessce integration"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "markdown",
12
+ "metadata": {},
13
+ "source": [
14
+ "For more comprehensive integration tests, see: https://github.com/laminlabs/lamin-spatial"
15
+ ]
16
+ },
17
+ {
18
+ "cell_type": "code",
19
+ "execution_count": null,
20
+ "metadata": {},
21
+ "outputs": [],
22
+ "source": [
23
+ "import pytest\n",
24
+ "import lamindb as ln\n",
25
+ "\n",
26
+ "INSTANCE_NAME = \"test-vitessce\"\n",
27
+ "ln.setup.init(storage=f\"s3://lamindb-ci/{INSTANCE_NAME}\")"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": null,
33
+ "metadata": {},
34
+ "outputs": [],
35
+ "source": [
36
+ "pbmc68k = ln.core.datasets.anndata_pbmc68k_reduced()"
37
+ ]
38
+ },
39
+ {
40
+ "cell_type": "code",
41
+ "execution_count": null,
42
+ "metadata": {},
43
+ "outputs": [],
44
+ "source": [
45
+ "pbmc68k = pbmc68k[:100, :200].copy()"
46
+ ]
47
+ },
48
+ {
49
+ "cell_type": "code",
50
+ "execution_count": null,
51
+ "metadata": {},
52
+ "outputs": [],
53
+ "source": [
54
+ "zarr_filepath = \"my_test.zarr\"\n",
55
+ "pbmc68k.write_zarr(zarr_filepath)"
56
+ ]
57
+ },
58
+ {
59
+ "cell_type": "code",
60
+ "execution_count": null,
61
+ "metadata": {},
62
+ "outputs": [],
63
+ "source": [
64
+ "zarr_artifact = ln.Artifact(zarr_filepath, description=\"Test dataset\")\n",
65
+ "zarr_artifact.save()"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "code",
70
+ "execution_count": null,
71
+ "metadata": {},
72
+ "outputs": [],
73
+ "source": [
74
+ "from vitessce import (\n",
75
+ " VitessceConfig,\n",
76
+ " Component as cm,\n",
77
+ " AnnDataWrapper,\n",
78
+ ")\n",
79
+ "vc = VitessceConfig(\n",
80
+ " schema_version=\"1.0.15\",\n",
81
+ " name=\"Test dataset\",\n",
82
+ " description=\"Test description\",\n",
83
+ ")\n",
84
+ "dataset = vc.add_dataset(name=\"test1\").add_object(\n",
85
+ " AnnDataWrapper(adata_url=zarr_artifact.path.to_url()),\n",
86
+ ")\n",
87
+ "obs_sets = vc.add_view(cm.OBS_SETS, dataset=dataset)\n",
88
+ "obs_sets_sizes = vc.add_view(cm.OBS_SET_SIZES, dataset=dataset)\n",
89
+ "scatterplot = vc.add_view(cm.SCATTERPLOT, dataset=dataset, mapping=\"UMAP\")\n",
90
+ "heatmap = vc.add_view(cm.HEATMAP, dataset=dataset)\n",
91
+ "genes = vc.add_view(cm.FEATURE_LIST, dataset=dataset)\n",
92
+ "vc.layout(((scatterplot | obs_sets) / heatmap) | (obs_sets_sizes / genes))\n",
93
+ "\n",
94
+ "# inspect the config\n",
95
+ "vc.to_dict()"
96
+ ]
97
+ },
98
+ {
99
+ "cell_type": "code",
100
+ "execution_count": null,
101
+ "metadata": {},
102
+ "outputs": [],
103
+ "source": [
104
+ "from lamindb.integrations import save_vitessce_config"
105
+ ]
106
+ },
107
+ {
108
+ "cell_type": "code",
109
+ "execution_count": null,
110
+ "metadata": {},
111
+ "outputs": [],
112
+ "source": [
113
+ "vc_artifact = save_vitessce_config(vc, description=\"View Habib17 in Vitessce\")"
114
+ ]
115
+ },
116
+ {
117
+ "cell_type": "code",
118
+ "execution_count": null,
119
+ "metadata": {},
120
+ "outputs": [],
121
+ "source": [
122
+ "zarr_artifact.delete(permanent=True)\n",
123
+ "vc_artifact.delete(permanent=True)"
124
+ ]
125
+ },
126
+ {
127
+ "cell_type": "code",
128
+ "execution_count": null,
129
+ "metadata": {},
130
+ "outputs": [],
131
+ "source": [
132
+ "!lamin delete --force test-vitessce"
133
+ ]
134
+ }
135
+ ],
136
+ "metadata": {
137
+ "kernelspec": {
138
+ "display_name": "py310",
139
+ "language": "python",
140
+ "name": "python3"
141
+ },
142
+ "language_info": {
143
+ "codemirror_mode": {
144
+ "name": "ipython",
145
+ "version": 3
146
+ },
147
+ "file_extension": ".py",
148
+ "mimetype": "text/x-python",
149
+ "name": "python",
150
+ "nbconvert_exporter": "python",
151
+ "pygments_lexer": "ipython3",
152
+ "version": "3.10.13"
153
+ }
154
+ },
155
+ "nbformat": 4,
156
+ "nbformat_minor": 2
157
+ }
@@ -8,4 +8,5 @@ storage/add-replace-stage
8
8
  storage/anndata-accessor
9
9
  storage/prepare-transfer-local-to-cloud
10
10
  storage/transfer-local-to-cloud
11
+ storage/vitessce
11
12
  ```
@@ -40,7 +40,7 @@ Modules & settings:
40
40
 
41
41
  """
42
42
 
43
- __version__ = "0.70.1" # denote a release candidate for 0.1.0 with 0.1rc1
43
+ __version__ = "0.70.3" # denote a release candidate for 0.1.0 with 0.1rc1
44
44
 
45
45
  import os as _os
46
46
 
@@ -351,7 +351,7 @@ class AnnDataAnnotator(DataFrameAnnotator):
351
351
  self,
352
352
  adata: ad.AnnData,
353
353
  var_index: FieldAttr,
354
- categoricals: dict[str, FieldAttr],
354
+ categoricals: dict[str, FieldAttr] | None = None,
355
355
  using: str = "default",
356
356
  verbosity: str = "hint",
357
357
  organism: str | None = None,
@@ -494,7 +494,7 @@ class MuDataAnnotator:
494
494
  self,
495
495
  mdata: MuData,
496
496
  var_index: dict[str, dict[str, FieldAttr]],
497
- categoricals: dict[str, FieldAttr],
497
+ categoricals: dict[str, FieldAttr] | None = None,
498
498
  using: str = "default",
499
499
  verbosity: str = "hint",
500
500
  organism: str | None = None,
@@ -751,7 +751,7 @@ class Annotate:
751
751
  cls,
752
752
  adata: ad.AnnData,
753
753
  var_index: FieldAttr,
754
- categoricals: dict[str, FieldAttr],
754
+ categoricals: dict[str, FieldAttr] | None = None,
755
755
  using: str = "default",
756
756
  verbosity: str = "hint",
757
757
  organism: str | None = None,
@@ -772,7 +772,7 @@ class Annotate:
772
772
  cls,
773
773
  mdata: MuData,
774
774
  var_index: dict[str, dict[str, FieldAttr]],
775
- categoricals: dict[str, dict[str, FieldAttr]],
775
+ categoricals: dict[str, FieldAttr] | None = None,
776
776
  using: str = "default",
777
777
  verbosity: str = "hint",
778
778
  organism: str | None = None,
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from pathlib import Path, PurePath, PurePosixPath
4
- from typing import TYPE_CHECKING, Any
4
+ from typing import TYPE_CHECKING, Any, Mapping
5
5
 
6
6
  import fsspec
7
7
  import lamindb_setup as ln_setup
@@ -26,7 +26,7 @@ from lnschema_core.types import (
26
26
  )
27
27
 
28
28
  from lamindb._utils import attach_func_to_class_method
29
- from lamindb.core._data import _track_run_input
29
+ from lamindb.core._data import Data, _track_run_input
30
30
  from lamindb.core._settings import settings
31
31
  from lamindb.core.storage import (
32
32
  LocalPathClasses,
@@ -53,6 +53,14 @@ from .core._data import (
53
53
  from .core.storage.objects import _mudata_is_installed
54
54
  from .core.storage.paths import AUTO_KEY_PREFIX
55
55
 
56
+ try:
57
+ from .core.storage._zarr import zarr_is_adata
58
+ except ImportError:
59
+
60
+ def zarr_is_adata(storepath): # type: ignore
61
+ raise ImportError("Please install zarr: pip install zarr")
62
+
63
+
56
64
  if TYPE_CHECKING:
57
65
  from lamindb_setup.core.types import UPathStr
58
66
  from mudata import MuData
@@ -329,16 +337,17 @@ def get_artifact_kwargs_from_data(
329
337
  using_key=using_key,
330
338
  )
331
339
  if isinstance(stat_or_artifact, Artifact):
340
+ artifact = stat_or_artifact
332
341
  # update the run of the existing artifact
333
342
  if run is not None:
334
343
  # save the information that this artifact was previously
335
344
  # produced by another run
336
- if stat_or_artifact.run is not None:
337
- stat_or_artifact.run.replicated_output_artifacts.add(stat_or_artifact)
345
+ if artifact.run is not None:
346
+ artifact.run.replicated_output_artifacts.add(artifact)
338
347
  # update the run of the artifact with the latest run
339
348
  stat_or_artifact.run = run
340
349
  stat_or_artifact.transform = run.transform
341
- return stat_or_artifact, None
350
+ return artifact, None
342
351
  else:
343
352
  size, hash, hash_type, n_objects = stat_or_artifact
344
353
 
@@ -446,12 +455,19 @@ def data_is_anndata(data: AnnData | UPathStr):
446
455
  if isinstance(data, AnnData):
447
456
  return True
448
457
  if isinstance(data, (str, Path, UPath)):
449
- if Path(data).suffix == ".h5ad":
458
+ data_path = UPath(data)
459
+ if data_path.suffix == ".h5ad":
450
460
  return True
451
- elif Path(data).suffix == ".zarr":
452
- raise NotImplementedError(
453
- "auto-detecting AnnData from Zarr is not yet supported"
454
- )
461
+ elif data_path.suffix == ".zarr":
462
+ # ".anndata.zarr" is a valid suffix (core.storage._valid_suffixes)
463
+ if ".anndata" in data_path.suffixes:
464
+ return True
465
+ # check only for local, expensive for cloud
466
+ if fsspec.utils.get_protocol(data_path) == "file":
467
+ return zarr_is_adata(data_path)
468
+ else:
469
+ logger.warning("We do not check if cloud zarr is AnnData or not.")
470
+ return False
455
471
  return False
456
472
 
457
473
 
@@ -461,27 +477,39 @@ def data_is_mudata(data: MuData | UPathStr):
461
477
 
462
478
  if isinstance(data, MuData):
463
479
  return True
464
- if isinstance(data, (str, Path, UPath)):
465
- return Path(data).suffix in {".h5mu"}
480
+ if isinstance(data, (str, Path)):
481
+ return UPath(data).suffix in {".h5mu"}
466
482
  return False
467
483
 
468
484
 
469
485
  def _check_accessor_artifact(data: Any, accessor: str | None = None):
470
- if accessor is None and not isinstance(data, (str, Path, UPath)):
486
+ if accessor is None:
471
487
  if isinstance(data, pd.DataFrame):
472
488
  logger.warning("data is a DataFrame, please use .from_df()")
473
489
  accessor = "DataFrame"
474
- elif data_is_anndata(data):
475
- logger.warning("data is an AnnData, please use .from_anndata()")
490
+ return accessor
491
+
492
+ data_is_path = isinstance(data, (str, Path))
493
+ if data_is_anndata(data):
494
+ if not data_is_path:
495
+ logger.warning("data is an AnnData, please use .from_anndata()")
476
496
  accessor = "AnnData"
477
497
  elif data_is_mudata(data):
478
- logger.warning("data is a MuData, please use .from_mudata()")
498
+ if not data_is_path:
499
+ logger.warning("data is a MuData, please use .from_mudata()")
479
500
  accessor = "MuData"
480
- else:
501
+ elif not data_is_path: # UPath is a subclass of Path
481
502
  raise TypeError("data has to be a string, Path, UPath")
482
503
  return accessor
483
504
 
484
505
 
506
+ def update_attributes(data: Data, attributes: Mapping[str, str]):
507
+ for key, value in attributes.items():
508
+ if getattr(data, key) != value:
509
+ logger.warning(f"updated {key} from {getattr(data, key)} to {value}")
510
+ setattr(data, key, value)
511
+
512
+
485
513
  def __init__(artifact: Artifact, *args, **kwargs):
486
514
  # Below checks for the Django-internal call in from_db()
487
515
  # it'd be better if we could avoid this, but not being able to create a Artifact
@@ -558,8 +586,13 @@ def __init__(artifact: Artifact, *args, **kwargs):
558
586
  if isinstance(kwargs_or_artifact, Artifact):
559
587
  from ._registry import init_self_from_db
560
588
 
561
- # kwargs_or_artifact is an existing file
562
589
  init_self_from_db(artifact, kwargs_or_artifact)
590
+ # adding "key" here is dangerous because key might be auto-populated
591
+ update_attributes(artifact, {"description": description})
592
+ if artifact.key != key:
593
+ logger.warning(
594
+ f"key {artifact.key} on existing artifact differs from passed key {key}"
595
+ )
563
596
  return None
564
597
  else:
565
598
  kwargs = kwargs_or_artifact
@@ -18,13 +18,13 @@ from lamindb_setup.core.hashing import hash_set
18
18
  from lnschema_core.models import Collection, CollectionArtifact, FeatureSet
19
19
  from lnschema_core.types import VisibilityChoice
20
20
 
21
+ from lamindb._artifact import update_attributes
21
22
  from lamindb._utils import attach_func_to_class_method
22
23
  from lamindb.core._data import _track_run_input
23
24
  from lamindb.core._mapped_collection import MappedCollection
24
25
  from lamindb.core.versioning import get_uid_from_old_version, init_uid
25
26
 
26
27
  from . import Artifact, Run
27
- from ._artifact import data_is_anndata
28
28
  from ._registry import init_self_from_db
29
29
  from .core._data import (
30
30
  add_transform_to_kwargs,
@@ -128,6 +128,7 @@ def __init__(
128
128
  existing_collection.run = run
129
129
  existing_collection.transform = run.transform
130
130
  init_self_from_db(collection, existing_collection)
131
+ update_attributes(collection, {"description": description, "name": name})
131
132
  for slot, feature_set in collection.features._feature_set_by_slot.items():
132
133
  if slot in feature_sets:
133
134
  if not feature_sets[slot] == feature_set:
@@ -20,37 +20,40 @@ if TYPE_CHECKING:
20
20
  from ._query_set import QuerySet
21
21
 
22
22
 
23
- class CallFinishInLastCell(SystemExit):
23
+ class TrackNotCalled(SystemExit):
24
24
  pass
25
25
 
26
26
 
27
- def finish(i_saved_the_notebook: bool = False):
28
- """Mark a tracked run as finished.
27
+ class NotebookNotSaved(SystemExit):
28
+ pass
29
29
 
30
- When run in notebooks, save the run report to your default storage location.
31
30
 
32
- Args:
33
- i_saved_the_notebook: Indicate that you saved the notebook in your
34
- editor (JupyterLab, VSCode, etc.).
35
- """
36
- if is_run_from_ipython:
37
- # notebooks
38
- from nbproject.dev import read_notebook
39
- from nbproject.dev._check_last_cell import check_last_cell
31
+ def get_seconds_since_modified(filepath) -> float:
32
+ return datetime.now().timestamp() - filepath.stat().st_mtime
40
33
 
41
- if not i_saved_the_notebook and not ln_setup._TESTING:
42
- logger.error(
43
- "Please pass `i_saved_the_notebook=True` to `ln.finish()`, save the notebook, and re-run this cell."
34
+
35
+ def finish():
36
+ """Mark a tracked run as finished.
37
+
38
+ If run in a notebook, it saves the run report & source code to your default storage location.
39
+ """
40
+ if run_context.path is None:
41
+ raise TrackNotCalled("Please run `ln.track()` before `ln.finish()`")
42
+ if is_run_from_ipython: # notebooks
43
+ if (
44
+ get_seconds_since_modified(run_context.path) > 3
45
+ and os.getenv("LAMIN_TESTING") is None
46
+ ):
47
+ raise NotebookNotSaved(
48
+ "Please save the notebook in your editor right before running `ln.finish()`"
44
49
  )
45
- return None
46
50
  save_run_context_core(
47
51
  run=run_context.run,
48
52
  transform=run_context.transform,
49
53
  filepath=run_context.path,
50
54
  finished_at=True,
51
55
  )
52
- else:
53
- # scripts
56
+ else: # scripts
54
57
  # save_run_context_core was already called during ln.track()
55
58
  run_context.run.finished_at = datetime.now(timezone.utc) # update run time
56
59
  run_context.run.save()
@@ -98,7 +101,7 @@ def save_run_context_core(
98
101
  # log_level is set to 40 to silence the nbconvert logging
99
102
  subprocess.run(
100
103
  "jupyter nbconvert --to html"
101
- f" {filepath.as_posix()} --Application.log_level=40",
104
+ f" '{filepath.as_posix()}' --Application.log_level=40",
102
105
  shell=True,
103
106
  check=True,
104
107
  )
@@ -118,7 +121,7 @@ def save_run_context_core(
118
121
  # first, copy the notebook file to a temporary file in the cache
119
122
  source_code_path = ln_setup.settings.storage.cache_dir / filepath.name
120
123
  shutil.copy2(filepath, source_code_path) # copy
121
- subprocess.run(f"nbstripout {source_code_path}", shell=True, check=True)
124
+ subprocess.run(f"nbstripout '{source_code_path}'", shell=True, check=True)
122
125
  # find initial versions of source codes and html reports
123
126
  prev_report = None
124
127
  prev_source = None
@@ -139,9 +142,8 @@ def save_run_context_core(
139
142
  if os.getenv("LAMIN_TESTING") is None:
140
143
  # in test, auto-confirm overwrite
141
144
  response = input(
142
- "You try to save a new notebook source code with the same version"
143
- f" '{transform.version}'; do you want to replace the content of the"
144
- f" existing source code {transform.source_code}? (y/n)"
145
+ f"You are about to overwrite existing source code (hash {transform.source_code.hash}) for transform version"
146
+ f" '{transform.version}'. Proceed? (y/n)"
145
147
  )
146
148
  else:
147
149
  response = "y"
@@ -149,10 +151,7 @@ def save_run_context_core(
149
151
  transform.source_code.replace(source_code_path)
150
152
  transform.source_code.save()
151
153
  else:
152
- logger.warning(
153
- "Please create a new version of the notebook via `lamin track"
154
- " <filepath>` and re-run the notebook"
155
- )
154
+ logger.warning("Please re-run `ln.track()` to make a new version")
156
155
  return "rerun-the-notebook"
157
156
  else:
158
157
  source_code = ln.Artifact(
@@ -207,8 +206,11 @@ def save_run_context_core(
207
206
  transform.save()
208
207
  if transform.type == TransformType.notebook:
209
208
  logger.success(f"saved transform.latest_report: {transform.latest_report}")
210
- identifier = ln_setup.settings.instance.slug
211
- logger.success(f"go to: https://lamin.ai/{identifier}/transform/{transform.uid}")
209
+ if ln_setup.settings.instance.is_remote:
210
+ identifier = ln_setup.settings.instance.slug
211
+ logger.success(
212
+ f"go to: https://lamin.ai/{identifier}/transform/{transform.uid}"
213
+ )
212
214
  # because run & transform changed, update the global run_context
213
215
  run_context.run = run
214
216
  run_context.transform = transform
@@ -306,6 +306,11 @@ class run_context:
306
306
  if not is_tracked:
307
307
  raise_transform_settings_error()
308
308
  else:
309
+ if transform.type in {"notebook", "script"}:
310
+ raise ValueError(
311
+ "Use ln.track() without passing transform in a notebook or script"
312
+ " - metadata is automatically parsed"
313
+ )
309
314
  transform_exists = None
310
315
  if transform.id is not None:
311
316
  # transform has an id but unclear whether already saved
@@ -10,5 +10,6 @@ from lamindb_setup.core.upath import LocalPathClasses, UPath, infer_filesystem
10
10
 
11
11
  from ._anndata_sizes import size_adata
12
12
  from ._backed_access import AnnDataAccessor, BackedAccessor
13
+ from ._valid_suffixes import VALID_SUFFIXES
13
14
  from .objects import infer_suffix, write_to_file
14
15
  from .paths import delete_storage, load_to_memory
@@ -733,7 +733,7 @@ class BackedAccessor:
733
733
 
734
734
 
735
735
  def backed_access(
736
- artifact_or_filepath: Artifact | Path, using_key: str | None
736
+ artifact_or_filepath: Artifact | Path, using_key: str | None = None
737
737
  ) -> AnnDataAccessor | BackedAccessor:
738
738
  if isinstance(artifact_or_filepath, Artifact):
739
739
  filepath = filepath_from_artifact(artifact_or_filepath, using_key=using_key)
@@ -747,11 +747,11 @@ def backed_access(
747
747
  conn, storage = registry.open("zarr", filepath)
748
748
  else:
749
749
  raise ValueError(
750
- "file should have .h5, .hdf5, .h5ad, .zarr suffix, not"
750
+ "object should have .h5, .hdf5, .h5ad, .zarr suffix, not"
751
751
  f" {filepath.suffix}."
752
752
  )
753
753
 
754
- if filepath.suffix in (".h5ad", ".zarr"):
754
+ if filepath.suffix == ".h5ad":
755
755
  return AnnDataAccessor(conn, storage, name)
756
756
  else:
757
757
  if get_spec(storage).encoding_type == "anndata":
@@ -0,0 +1,3 @@
1
+ from lamindb_setup.core.upath import VALID_SUFFIXES
2
+
3
+ VALID_SUFFIXES.update({".vitessce.json", ".anndata.zarr", ".spatialdata.zarr"})
@@ -7,28 +7,44 @@ import scipy.sparse as sparse
7
7
  import zarr
8
8
  from anndata._io import read_zarr
9
9
  from anndata._io.specs import write_elem
10
+ from anndata._io.specs.registry import get_spec
11
+ from fsspec.implementations.local import LocalFileSystem
10
12
  from lamindb_setup.core.upath import create_mapper, infer_filesystem
11
13
 
12
14
  from ._anndata_sizes import _size_elem, _size_raw, size_adata
13
15
 
14
16
  if TYPE_CHECKING:
15
17
  from anndata import AnnData
16
-
17
-
18
- def read_adata_zarr(storepath) -> AnnData:
19
- fs, storepath = infer_filesystem(storepath)
20
- store = create_mapper(fs, storepath, check=True)
21
-
22
- adata = read_zarr(store)
23
-
18
+ from lamindb_setup.core.types import UPathStr
19
+
20
+
21
+ def zarr_is_adata(storepath: UPathStr) -> bool:
22
+ fs, storepath_str = infer_filesystem(storepath)
23
+ if isinstance(fs, LocalFileSystem):
24
+ # this is faster than through an fsspec mapper for local
25
+ open_obj = storepath_str
26
+ else:
27
+ open_obj = create_mapper(fs, storepath_str, check=True)
28
+ storage = zarr.open(open_obj, mode="r")
29
+ return get_spec(storage).encoding_type == "anndata"
30
+
31
+
32
+ def read_adata_zarr(storepath: UPathStr) -> AnnData:
33
+ fs, storepath_str = infer_filesystem(storepath)
34
+ if isinstance(fs, LocalFileSystem):
35
+ # this is faster than through an fsspec mapper for local
36
+ open_obj = storepath_str
37
+ else:
38
+ open_obj = create_mapper(fs, storepath_str, check=True)
39
+ adata = read_zarr(open_obj)
24
40
  return adata
25
41
 
26
42
 
27
43
  def write_adata_zarr(
28
- adata: AnnData, storepath, callback=None, chunks=None, **dataset_kwargs
44
+ adata: AnnData, storepath: UPathStr, callback=None, chunks=None, **dataset_kwargs
29
45
  ):
30
- fs, storepath = infer_filesystem(storepath)
31
- store = create_mapper(fs, storepath, create=True)
46
+ fs, storepath_str = infer_filesystem(storepath)
47
+ store = create_mapper(fs, storepath_str, create=True)
32
48
 
33
49
  f = zarr.open(store, mode="w")
34
50
 
@@ -29,7 +29,7 @@ try:
29
29
  from ._zarr import read_adata_zarr
30
30
  except ImportError:
31
31
 
32
- def read_adata_zarr(filepath): # type: ignore
32
+ def read_adata_zarr(storepath): # type: ignore
33
33
  raise ImportError("Please install zarr: pip install zarr")
34
34
 
35
35
 
@@ -114,7 +114,7 @@ def store_file_or_folder(local_path: UPathStr, storage_path: UPath) -> None:
114
114
  local_path = Path(local_path)
115
115
  if not isinstance(storage_path, LocalPathClasses):
116
116
  # this uploads files and directories
117
- storage_path.upload_from(local_path, recursive=True, print_progress=True)
117
+ storage_path.upload_from(local_path, dir_inplace=True, print_progress=True)
118
118
  else: # storage path is local
119
119
  storage_path.parent.mkdir(parents=True, exist_ok=True)
120
120
  if local_path.is_file():