lamindb 0.55.0__tar.gz → 0.55.1__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 (282) hide show
  1. {lamindb-0.55.0 → lamindb-0.55.1}/PKG-INFO +5 -5
  2. {lamindb-0.55.0 → lamindb-0.55.1}/docs/changelog.md +10 -3
  3. {lamindb-0.55.0 → lamindb-0.55.1}/docs/features-lamindb.md +1 -1
  4. {lamindb-0.55.0 → lamindb-0.55.1}/docs/introduction.ipynb +15 -1
  5. {lamindb-0.55.0 → lamindb-0.55.1}/docs/transfer.ipynb +2 -1
  6. {lamindb-0.55.0 → lamindb-0.55.1}/docs/tutorial.ipynb +4 -3
  7. {lamindb-0.55.0 → lamindb-0.55.1}/docs/tutorial2.ipynb +4 -3
  8. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/__init__.py +1 -1
  9. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_dataset.py +41 -4
  10. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_file.py +2 -2
  11. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_filter.py +2 -9
  12. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_query_manager.py +20 -9
  13. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_registry.py +7 -2
  14. lamindb-0.55.1/lamindb/_storage.py +18 -0
  15. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_transform.py +7 -0
  16. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/_label_manager.py +4 -1
  17. {lamindb-0.55.0 → lamindb-0.55.1}/pyproject.toml +4 -4
  18. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/changelog.md +3 -0
  19. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/__init__.py +1 -1
  20. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_init_instance.py +1 -0
  21. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_load_instance.py +11 -20
  22. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_notebook.py +16 -10
  23. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/pyproject.toml +1 -1
  24. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/notebooks/test.py +1 -4
  25. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/test_vault.py +18 -22
  26. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/CHANGELOG.md +1 -0
  27. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/__init__.py +1 -1
  28. lamindb-0.55.1/sub/lnschema-core/lnschema_core/migrations/0021_dataset_storage_alter_dataset_file.py +23 -0
  29. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/models.py +49 -1
  30. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_dataset.py +18 -0
  31. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_file.py +38 -36
  32. lamindb-0.55.0/lamindb/_storage.py +0 -9
  33. {lamindb-0.55.0 → lamindb-0.55.1}/.github/workflows/build.yml +0 -0
  34. {lamindb-0.55.0 → lamindb-0.55.1}/.github/workflows/latest-changes.jinja2 +0 -0
  35. {lamindb-0.55.0 → lamindb-0.55.1}/.github/workflows/latest-changes.yml +0 -0
  36. {lamindb-0.55.0 → lamindb-0.55.1}/.gitignore +0 -0
  37. {lamindb-0.55.0 → lamindb-0.55.1}/.gitmodules +0 -0
  38. {lamindb-0.55.0 → lamindb-0.55.1}/.pre-commit-config.yaml +0 -0
  39. {lamindb-0.55.0 → lamindb-0.55.1}/LICENSE +0 -0
  40. {lamindb-0.55.0 → lamindb-0.55.1}/README.md +0 -0
  41. {lamindb-0.55.0 → lamindb-0.55.1}/docs/bio-registries.ipynb +0 -0
  42. {lamindb-0.55.0 → lamindb-0.55.1}/docs/bionty.md +0 -0
  43. {lamindb-0.55.0 → lamindb-0.55.1}/docs/data.ipynb +0 -0
  44. {lamindb-0.55.0 → lamindb-0.55.1}/docs/faq/acid.ipynb +0 -0
  45. {lamindb-0.55.0 → lamindb-0.55.1}/docs/faq/idempotency.ipynb +0 -0
  46. {lamindb-0.55.0 → lamindb-0.55.1}/docs/faq/import-schema.ipynb +0 -0
  47. {lamindb-0.55.0 → lamindb-0.55.1}/docs/faq/notebooks.ipynb +0 -0
  48. {lamindb-0.55.0 → lamindb-0.55.1}/docs/faq/reference-field.ipynb +0 -0
  49. {lamindb-0.55.0 → lamindb-0.55.1}/docs/faq/setup.ipynb +0 -0
  50. {lamindb-0.55.0 → lamindb-0.55.1}/docs/faq/test_notebooks.py +0 -0
  51. {lamindb-0.55.0 → lamindb-0.55.1}/docs/faq/track-run-inputs.ipynb +0 -0
  52. {lamindb-0.55.0 → lamindb-0.55.1}/docs/faq.md +0 -0
  53. {lamindb-0.55.0 → lamindb-0.55.1}/docs/features-laminhub.md +0 -0
  54. {lamindb-0.55.0 → lamindb-0.55.1}/docs/guide.md +0 -0
  55. {lamindb-0.55.0 → lamindb-0.55.1}/docs/index.md +0 -0
  56. {lamindb-0.55.0 → lamindb-0.55.1}/docs/installation.md +0 -0
  57. {lamindb-0.55.0 → lamindb-0.55.1}/docs/lamin-utils.md +0 -0
  58. {lamindb-0.55.0 → lamindb-0.55.1}/docs/lamindb.md +0 -0
  59. {lamindb-0.55.0 → lamindb-0.55.1}/docs/lnschema-bionty.md +0 -0
  60. {lamindb-0.55.0 → lamindb-0.55.1}/docs/meta.ipynb +0 -0
  61. {lamindb-0.55.0 → lamindb-0.55.1}/docs/nbproject.md +0 -0
  62. {lamindb-0.55.0 → lamindb-0.55.1}/docs/query-search.md +0 -0
  63. {lamindb-0.55.0 → lamindb-0.55.1}/docs/readfcs.md +0 -0
  64. {lamindb-0.55.0 → lamindb-0.55.1}/docs/reference.md +0 -0
  65. {lamindb-0.55.0 → lamindb-0.55.1}/docs/schemas.ipynb +0 -0
  66. {lamindb-0.55.0 → lamindb-0.55.1}/docs/setup.ipynb +0 -0
  67. {lamindb-0.55.0 → lamindb-0.55.1}/docs/signup-login.md +0 -0
  68. {lamindb-0.55.0 → lamindb-0.55.1}/docs/storage/add-replace-stage.ipynb +0 -0
  69. {lamindb-0.55.0 → lamindb-0.55.1}/docs/storage/anndata-accessor.ipynb +0 -0
  70. {lamindb-0.55.0 → lamindb-0.55.1}/docs/storage/test-files/iris.csv +0 -0
  71. {lamindb-0.55.0 → lamindb-0.55.1}/docs/storage/test-files/iris.data +0 -0
  72. {lamindb-0.55.0 → lamindb-0.55.1}/docs/storage/test-files/new_iris.csv +0 -0
  73. {lamindb-0.55.0 → lamindb-0.55.1}/docs/storage/test_notebooks.py +0 -0
  74. {lamindb-0.55.0 → lamindb-0.55.1}/docs/storage/upload.ipynb +0 -0
  75. {lamindb-0.55.0 → lamindb-0.55.1}/docs/storage.md +0 -0
  76. {lamindb-0.55.0 → lamindb-0.55.1}/docs/test_notebooks.py +0 -0
  77. {lamindb-0.55.0 → lamindb-0.55.1}/docs/validate.ipynb +0 -0
  78. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_delete.py +0 -0
  79. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_feature.py +0 -0
  80. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_feature_set.py +0 -0
  81. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_from_values.py +0 -0
  82. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_parents.py +0 -0
  83. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_query_set.py +0 -0
  84. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_run.py +0 -0
  85. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_save.py +0 -0
  86. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_ulabel.py +0 -0
  87. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_utils.py +0 -0
  88. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_validate.py +0 -0
  89. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/_view.py +0 -0
  90. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/__init__.py +0 -0
  91. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/_data.py +0 -0
  92. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/_feature_manager.py +0 -0
  93. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/_priors.py +0 -0
  94. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/_run_context.py +0 -0
  95. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/_settings.py +0 -0
  96. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/datasets/__init__.py +0 -0
  97. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/datasets/_core.py +0 -0
  98. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/datasets/_fake.py +0 -0
  99. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/exceptions.py +0 -0
  100. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/fields.py +0 -0
  101. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/hashing.py +0 -0
  102. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/storage/__init__.py +0 -0
  103. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/storage/_anndata_sizes.py +0 -0
  104. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/storage/_backed_access.py +0 -0
  105. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/storage/_zarr.py +0 -0
  106. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/storage/file.py +0 -0
  107. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/storage/object.py +0 -0
  108. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/types.py +0 -0
  109. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/dev/versioning.py +0 -0
  110. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/setup/__init__.py +0 -0
  111. {lamindb-0.55.0 → lamindb-0.55.1}/lamindb/setup/dev/__init__.py +0 -0
  112. {lamindb-0.55.0 → lamindb-0.55.1}/noxfile.py +0 -0
  113. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/.github/workflows/build.yml +0 -0
  114. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/.github/workflows/latest-changes.jinja2 +0 -0
  115. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/.github/workflows/latest-changes.yml +0 -0
  116. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/.gitignore +0 -0
  117. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/.pre-commit-config.yaml +0 -0
  118. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/LICENSE +0 -0
  119. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/README.md +0 -0
  120. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/index.md +0 -0
  121. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/notebooks.md +0 -0
  122. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-only/test-empty-init.ipynb +0 -0
  123. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-only/test-import-schema.ipynb +0 -0
  124. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-only/test-insufficient-user-info.ipynb +0 -0
  125. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-only/test-load-lock.ipynb +0 -0
  126. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-only/test-sqlite-sync.ipynb +0 -0
  127. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-only/test_notebooks2.py +0 -0
  128. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-staging/01-init-instance.ipynb +0 -0
  129. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-staging/02-load-instance.ipynb +0 -0
  130. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-staging/03-set-storage.ipynb +0 -0
  131. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-staging/04-test-bionty.ipynb +0 -0
  132. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-staging/test-multi-session.ipynb +0 -0
  133. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/prod-staging/test_notebooks.py +0 -0
  134. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/docs/reference.md +0 -0
  135. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/__main__.py +0 -0
  136. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_check_instance_setup.py +0 -0
  137. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_close.py +0 -0
  138. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_delete.py +0 -0
  139. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_deploy_server.py +0 -0
  140. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_docstrings.py +0 -0
  141. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_info.py +0 -0
  142. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_init_vault.py +0 -0
  143. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_migrate.py +0 -0
  144. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_register_instance.py +0 -0
  145. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_schema.py +0 -0
  146. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_set.py +0 -0
  147. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_settings.py +0 -0
  148. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_setup_user.py +0 -0
  149. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/_silence_loggers.py +0 -0
  150. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/__init__.py +0 -0
  151. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_deprecated.py +0 -0
  152. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_docs.py +0 -0
  153. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_hub_client.py +0 -0
  154. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_hub_core.py +0 -0
  155. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_hub_crud.py +0 -0
  156. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_hub_utils.py +0 -0
  157. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_settings_instance.py +0 -0
  158. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_settings_load.py +0 -0
  159. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_settings_save.py +0 -0
  160. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_settings_storage.py +0 -0
  161. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_settings_store.py +0 -0
  162. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_settings_user.py +0 -0
  163. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/_setup_bionty_sources.py +0 -0
  164. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/cloud_sqlite_locker.py +0 -0
  165. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/django.py +0 -0
  166. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/lamindb_setup/dev/upath.py +0 -0
  167. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/noxfile.py +0 -0
  168. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/hub-local/conftest.py +0 -0
  169. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/hub-local/test_all.py +0 -0
  170. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/notebooks/conftest.py +0 -0
  171. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/notebooks/test-notebooks/no-title.ipynb +0 -0
  172. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/notebooks/test-notebooks/not-initialized.ipynb +0 -0
  173. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/notebooks/test-notebooks/with-title-and-initialized-consecutive.ipynb +0 -0
  174. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/notebooks/test-notebooks/with-title-and-initialized-non-consecutive.ipynb +0 -0
  175. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-only/conftest.py +0 -0
  176. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-only/test_cli.py +0 -0
  177. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-only/test_django.py +0 -0
  178. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-only/test_switch_and_fallback_env.py +0 -0
  179. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-staging/test_delete_instance.py +0 -0
  180. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-staging/test_init_instance.py +0 -0
  181. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-staging/test_load_instance.py +0 -0
  182. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-staging/test_login.py +0 -0
  183. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-staging/test_migrate.py +0 -0
  184. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-staging/test_set_storage.py +0 -0
  185. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/prod-staging/test_signup.py +0 -0
  186. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lamindb-setup/tests/test_load_persistent_instance.py +0 -0
  187. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/.github/workflows/build.yml +0 -0
  188. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/.github/workflows/latest-changes.jinja2 +0 -0
  189. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/.github/workflows/latest-changes.yml +0 -0
  190. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/.gitignore +0 -0
  191. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/.pre-commit-config.yaml +0 -0
  192. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/LICENSE +0 -0
  193. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/README.md +0 -0
  194. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/docs/changelog.md +0 -0
  195. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/docs/index.md +0 -0
  196. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/docs/reference.md +0 -0
  197. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lamin-project.yaml +0 -0
  198. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/__init__.py +0 -0
  199. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/_bionty.py +0 -0
  200. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/dev/__init__.py +0 -0
  201. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/dev/_settings.py +0 -0
  202. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/ids.py +0 -0
  203. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0001_initial.py +0 -0
  204. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0002_rename_gene_type_gene_biotype_and_more.py +0 -0
  205. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0003_alter_biontysource_entity_alter_biontysource_source_and_more.py +0 -0
  206. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0004_alter_cellline_bionty_source_and_more.py +0 -0
  207. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0005_rename_short_name_cellline_abbr_and_more.py +0 -0
  208. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0006_alter_biontysource_options_alter_cellline_options_and_more.py +0 -0
  209. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0007_rename_readout_experimental_factor.py +0 -0
  210. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0008_remove_gene_hgnc_id_remove_gene_mgi_id_and_more.py +0 -0
  211. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0009_alter_gene_ensembl_gene_id.py +0 -0
  212. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0010_alter_species_name.py +0 -0
  213. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0011_cellline_datasets_cellmarker_datasets_and_more.py +0 -0
  214. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0012_gene_stable_id.py +0 -0
  215. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0013_alter_cellmarker_species_alter_gene_species_and_more.py +0 -0
  216. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/0014_ethnicity_developmentalstage.py +0 -0
  217. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/migrations/__init__.py +0 -0
  218. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/lnschema_bionty/models.py +0 -0
  219. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/noxfile.py +0 -0
  220. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/pyproject.toml +0 -0
  221. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/tests/test_hash_id.py +0 -0
  222. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-bionty/tests/test_integrity.py +0 -0
  223. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/.github/workflows/build.yml +0 -0
  224. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/.github/workflows/latest-changes.jinja2 +0 -0
  225. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/.github/workflows/latest-changes.yml +0 -0
  226. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/.gitignore +0 -0
  227. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/.pre-commit-config.yaml +0 -0
  228. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/LICENSE +0 -0
  229. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/README.md +0 -0
  230. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/ids.py +0 -0
  231. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0001_initial.py +0 -0
  232. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0002_alter_user_name.py +0 -0
  233. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0003_alter_storage_region_alter_transform_short_name.py +0 -0
  234. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0004_rename_folder_tag_alter_project_folders.py +0 -0
  235. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0005_alter_run_inputs_delete_runinput.py +0 -0
  236. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0006_feature_dataset.py +0 -0
  237. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0007_feature_synonyms_featureset_field_and_more.py +0 -0
  238. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0008_file_hash_type_transform_parents.py +0 -0
  239. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0009_remove_featureset_files_feature_unit_and_more.py +0 -0
  240. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0010_dataset_categories_file_categories.py +0 -0
  241. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0011_label_remove_tag_created_by_remove_tag_parents_and_more.py +0 -0
  242. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0012_remove_label_ref_id_remove_label_ref_orm_and_more.py +0 -0
  243. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0013_remove_feature_labels_orm_and_more.py +0 -0
  244. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0014_rename_ref_field_featureset_registry.py +0 -0
  245. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0015_file_initial_version_file_version.py +0 -0
  246. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0016_dataset_input_of_dataset_run_dataset_transform_and_more.py +0 -0
  247. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0017_dataset_initial_version_dataset_version.py +0 -0
  248. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0018_rename_datasetlabel_datasetulabel_and_more.py +0 -0
  249. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0019_dataset_reference_dataset_reference_type_and_more.py +0 -0
  250. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/0020_run_report_transform_latest_report_and_more.py +0 -0
  251. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/migrations/__init__.py +0 -0
  252. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/mocks.py +0 -0
  253. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/types.py +0 -0
  254. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/lnschema_core/users.py +0 -0
  255. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/noxfile.py +0 -0
  256. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/pyproject.toml +0 -0
  257. {lamindb-0.55.0 → lamindb-0.55.1}/sub/lnschema-core/tests/test_integrity.py +0 -0
  258. {lamindb-0.55.0 → lamindb-0.55.1}/tests/conftest.py +0 -0
  259. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_cache.py +0 -0
  260. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_data.py +0 -0
  261. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_db.py +0 -0
  262. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_delete.py +0 -0
  263. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_feature.py +0 -0
  264. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_feature_manager.py +0 -0
  265. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_feature_set.py +0 -0
  266. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_from_values.py +0 -0
  267. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_hashing.py +0 -0
  268. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_label_manager.py +0 -0
  269. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_manager.py +0 -0
  270. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_parents.py +0 -0
  271. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_queryset.py +0 -0
  272. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_registry.py +0 -0
  273. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_run.py +0 -0
  274. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_run_context.py +0 -0
  275. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_save.py +0 -0
  276. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_settings.py +0 -0
  277. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_storage.py +0 -0
  278. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_transform.py +0 -0
  279. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_ulabel.py +0 -0
  280. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_validate.py +0 -0
  281. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_versioning.py +0 -0
  282. {lamindb-0.55.0 → lamindb-0.55.1}/tests/test_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lamindb
3
- Version: 0.55.0
3
+ Version: 0.55.1
4
4
  Summary: Open-source data platform for biology.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
6
  Requires-Python: >=3.8
@@ -8,9 +8,9 @@ Description-Content-Type: text/markdown
8
8
  Classifier: Programming Language :: Python :: 3.8
9
9
  Classifier: Programming Language :: Python :: 3.9
10
10
  Classifier: Programming Language :: Python :: 3.10
11
- Requires-Dist: lnschema_core==0.49.2
12
- Requires-Dist: lamindb_setup==0.54.2
13
- Requires-Dist: lamin_utils==0.11.3
11
+ Requires-Dist: lnschema_core==0.50.0
12
+ Requires-Dist: lamindb_setup==0.54.3
13
+ Requires-Dist: lamin_utils==0.11.4
14
14
  Requires-Dist: rapidfuzz
15
15
  Requires-Dist: pyarrow
16
16
  Requires-Dist: typing_extensions!=4.6.0
@@ -35,7 +35,7 @@ Requires-Dist: pytest-cov ; extra == "dev"
35
35
  Requires-Dist: nbproject_test>=0.3.0 ; extra == "dev"
36
36
  Requires-Dist: faker-biology ; extra == "dev"
37
37
  Requires-Dist: django-schema-graph ; extra == "erdiagram"
38
- Requires-Dist: readfcs>=1.1.5 ; extra == "fcs"
38
+ Requires-Dist: readfcs>=1.1.7 ; extra == "fcs"
39
39
  Requires-Dist: fsspec[gs]==2023.9.0 ; extra == "gcp"
40
40
  Requires-Dist: nbproject==0.9.2 ; extra == "jupyter"
41
41
  Requires-Dist: nbstripout ; extra == "jupyter"
@@ -6,13 +6,20 @@
6
6
 
7
7
  ## 0.55
8
8
 
9
+ ### 0.55.1 {small}`2023-10-4`
10
+
11
+ - ✨ Dataset from paths aka storage [PR1222](https://github.com/laminlabs/lamindb/pull/1222) [@falexwolf](https://github.com/falexwolf)
12
+ - 🚸 Do not search for alternative names if id is passed [PR1225](https://github.com/laminlabs/lamindb/pull/1225) [@falexwolf](https://github.com/falexwolf)
13
+ - 📝 Added lamindata badge [PR1223](https://github.com/laminlabs/lamindb/pull/1223) [@sunnyosun](https://github.com/sunnyosun)
14
+ - ♻️ Refactor data flow tracking for Dataset [PR1224](https://github.com/laminlabs/lamindb/pull/1224) [@falexwolf](https://github.com/falexwolf)
15
+
9
16
  ### 0.55.0 {small}`2023-10-03`
10
17
 
11
18
  - ✨ Enable to transfer data between instances [PR1216](https://github.com/laminlabs/lamindb/pull/1216) [@falexwolf](https://github.com/falexwolf)
12
- - ✨ Save notebook files [PR1213](https://github.com/laminlabs/lamindb/pull/1213) [@falexwolf](https://github.com/falexwolf)
13
- - ♻️ Track dataset as run input also for dataset.files [PR1219](https://github.com/laminlabs/lamindb/pull/1219) [@falexwolf](https://github.com/falexwolf)
19
+ - ✨ Enable saving notebook files [PR1213](https://github.com/laminlabs/lamindb/pull/1213) [@falexwolf](https://github.com/falexwolf)
14
20
  - 💄 Display id in view_parents [PR1215](https://github.com/laminlabs/lamindb/pull/1215) [@sunnyosun](https://github.com/sunnyosun)
15
- - ♻️ Move lamin-vault dependency to postgres extra [PR1214](https://github.com/laminlabs/lamindb/pull/1214) [@falexwolf](https://github.com/falexwolf)
21
+
22
+ ## 0.54
16
23
 
17
24
  ### 0.54.4 {small}`2023-09-29`
18
25
 
@@ -1,4 +1,4 @@
1
- [Influenced](docs:influences) by a number of data tools, LaminDB's features address [key data management problem](https://lamin.ai/blog/2022/problems).
1
+ [Influenced](docs:influences) by a number of data tools, LaminDB's features address [key data management problems](https://lamin.ai/blog/2022/problems).
2
2
 
3
3
  **For data users**
4
4
 
@@ -25,7 +25,7 @@
25
25
  "```\n",
26
26
  ":::\n",
27
27
  "\n",
28
- "LaminHub is free for public data. Enterprise features, support, integration tests & wetlab plug-ins hosted in your or our infrastructure are available on a paid plan: please [reach out](https://lamin.ai/contact)!"
28
+ "LaminHub is free for public data. Enterprise features, support, integration tests & wetlab plug-ins hosted in your or our infrastructure are available on a [paid plan](https://lamin.ai/pricing): please [reach out](https://lamin.ai/contact)!"
29
29
  ]
30
30
  },
31
31
  {
@@ -578,6 +578,20 @@
578
578
  "dataset_v2.files.df()"
579
579
  ]
580
580
  },
581
+ {
582
+ "cell_type": "markdown",
583
+ "metadata": {},
584
+ "source": [
585
+ "### Explore data in LaminHub"
586
+ ]
587
+ },
588
+ {
589
+ "cell_type": "markdown",
590
+ "metadata": {},
591
+ "source": [
592
+ "You may explore [this notebook](https://lamin.ai/laminlabs/lamindata/record/core/Transform?id=Hc5AXzibjGg1z8) with [datasets & files](https://lamin.ai/laminlabs/lamindata/record/core/Dataset?id=PuCck2ARUd3rUrmdWYiI&tab=files&offset=0&limit=50) in `laminlabs/lamindata`."
593
+ ]
594
+ },
581
595
  {
582
596
  "cell_type": "markdown",
583
597
  "metadata": {},
@@ -75,7 +75,8 @@
75
75
  "outputs": [],
76
76
  "source": [
77
77
  "dataset = ln.Dataset.filter(\n",
78
- " using=\"laminlabs/cellxgene-census\", reference=\"c888b684-6c51-431f-972a-6c963044cef0\"\n",
78
+ " using=\"laminlabs/cellxgene-census\",\n",
79
+ " reference=\"c888b684-6c51-431f-972a-6c963044cef0\",\n",
79
80
  ").one()\n",
80
81
  "dataset"
81
82
  ]
@@ -4,8 +4,9 @@
4
4
  "cell_type": "markdown",
5
5
  "metadata": {},
6
6
  "source": [
7
- "![tutorial1/2](https://img.shields.io/badge/tutorial1/2-lightgrey)\n",
8
- "[![Jupyter Notebook](https://img.shields.io/badge/Jupyter%20Notebook-orange)](https://github.com/laminlabs/lamindb/blob/main/docs/tutorial.ipynb)"
7
+ "![](https://img.shields.io/badge/tutorial1/2-lightgrey)\n",
8
+ "[![](https://img.shields.io/badge/Jupyter%20Notebook-orange)](https://github.com/laminlabs/lamindb/blob/main/docs/tutorial.ipynb)\n",
9
+ "[![](https://img.shields.io/badge/laminlabs/lamindata-mediumseagreen)](https://lamin.ai/laminlabs/lamindata/record/core/Transform?id=NJvdsWWbJlZSz8)"
9
10
  ]
10
11
  },
11
12
  {
@@ -596,7 +597,7 @@
596
597
  "outputs": [],
597
598
  "source": [
598
599
  "transform = ln.Transform.filter(\n",
599
- " name__contains=\"files & datasets\"\n",
600
+ " name__icontains=\"files & datasets\"\n",
600
601
  ").one() # get exactly one result\n",
601
602
  "transform"
602
603
  ]
@@ -4,8 +4,9 @@
4
4
  "cell_type": "markdown",
5
5
  "metadata": {},
6
6
  "source": [
7
- "![tutorial2/2](https://img.shields.io/badge/tutorial2/2-lightgrey)\n",
8
- "[![Jupyter Notebook](https://img.shields.io/badge/Jupyter%20Notebook-orange)](https://github.com/laminlabs/lamindb/blob/main/docs/tutorial1.ipynb)"
7
+ "![](https://img.shields.io/badge/tutorial2/2-lightgrey)\n",
8
+ "[![](https://img.shields.io/badge/Jupyter%20Notebook-orange)](https://github.com/laminlabs/lamindb/blob/main/docs/tutorial1.ipynb)\n",
9
+ "[![](https://img.shields.io/badge/laminlabs/lamindata-mediumseagreen)](https://lamin.ai/laminlabs/lamindata/record/core/Transform?id=dMtrt8YMSdl6z8)"
9
10
  ]
10
11
  },
11
12
  {
@@ -490,7 +491,7 @@
490
491
  "\n",
491
492
  "```python\n",
492
493
  "for feature in features:\n",
493
- " if feature.type == \"float\":\n",
494
+ " if feature.type == \"number\":\n",
494
495
  " feature.unit = \"m\" # SI unit for meters\n",
495
496
  " feature.save()\n",
496
497
  "```\n",
@@ -54,7 +54,7 @@ Static classes & modules:
54
54
 
55
55
  """
56
56
 
57
- __version__ = "0.55.0" # denote a release candidate for 0.1.0 with 0.1rc1
57
+ __version__ = "0.55.1" # denote a release candidate for 0.1.0 with 0.1rc1
58
58
 
59
59
  import os as _os
60
60
 
@@ -1,10 +1,15 @@
1
1
  from collections import defaultdict
2
+ from pathlib import Path
2
3
  from typing import Dict, Iterable, Literal, Optional, Tuple, Union
3
4
 
4
5
  import anndata as ad
5
6
  import pandas as pd
6
7
  from lamin_utils import logger
8
+ from lamindb_setup._init_instance import register_storage
9
+ from lamindb_setup.dev import StorageSettings
7
10
  from lamindb_setup.dev._docs import doc_args
11
+ from lamindb_setup.dev._hub_utils import get_storage_region
12
+ from lamindb_setup.dev.upath import UPath
8
13
  from lnschema_core import Modality
9
14
  from lnschema_core.models import Dataset, Feature, FeatureSet
10
15
  from lnschema_core.types import AnnDataLike, DataLike, FieldAttr
@@ -84,11 +89,12 @@ def __init__(
84
89
  )
85
90
 
86
91
  run = get_run(run)
87
- # there are exactly two ways of creating a Dataset object right now
92
+ # there are exactly 3 ways of creating a Dataset object right now
88
93
  # using exactly one file or using more than one file
89
94
  # init file
90
95
  if isinstance(data, (pd.DataFrame, ad.AnnData, File)):
91
96
  files = None
97
+ storage = None
92
98
  if isinstance(data, File):
93
99
  file = data
94
100
  if file._state.adding:
@@ -116,9 +122,23 @@ def __init__(
116
122
  if file.description is None or file.description == "tmp":
117
123
  file.description = f"See dataset {provisional_id}" # type: ignore
118
124
  file._feature_sets = feature_sets
125
+ storage = None
126
+ # init from directory or bucket
127
+ elif isinstance(data, (str, Path, UPath)):
128
+ file = None
129
+ files = None
130
+ upath = UPath(data)
131
+ if not upath.is_dir:
132
+ raise ValueError(f"Can only pass buckets or directories, not {data}")
133
+ upath_str = upath.as_posix().rstrip("/")
134
+ region = get_storage_region(upath_str)
135
+ storage_settings = StorageSettings(upath_str, region)
136
+ storage = register_storage(storage_settings)
137
+ hash = None
119
138
  # init files
120
139
  else:
121
140
  file = None
141
+ storage = None
122
142
  if hasattr(data, "__getitem__"):
123
143
  assert isinstance(data[0], File) # type: ignore
124
144
  files = data
@@ -144,6 +164,7 @@ def __init__(
144
164
  reference=reference,
145
165
  reference_type=reference_type,
146
166
  file=file,
167
+ storage=storage,
147
168
  hash=hash,
148
169
  run=run,
149
170
  version=version,
@@ -276,8 +297,9 @@ def load(
276
297
  is_run_input: Optional[bool] = None,
277
298
  **kwargs,
278
299
  ) -> DataLike:
279
- _track_run_input(self, is_run_input)
300
+ # cannot call _track_run_input here, see comment further down
280
301
  if self.file is not None:
302
+ _track_run_input(self, is_run_input)
281
303
  return self.file.load()
282
304
  else:
283
305
  all_files = self.files.all()
@@ -291,9 +313,14 @@ def load(
291
313
  objects = [file.load(is_run_input=False) for file in all_files]
292
314
  file_ids = [file.id for file in all_files]
293
315
  if isinstance(objects[0], pd.DataFrame):
294
- return pd.concat(objects, join=join)
316
+ concat_object = pd.concat(objects, join=join)
295
317
  elif isinstance(objects[0], ad.AnnData):
296
- return ad.concat(objects, join=join, label="file_id", keys=file_ids)
318
+ concat_object = ad.concat(
319
+ objects, join=join, label="file_id", keys=file_ids
320
+ )
321
+ # only call it here because there might be errors during concat
322
+ _track_run_input(self, is_run_input)
323
+ return concat_object
297
324
 
298
325
 
299
326
  # docstring handled through attach_func_to_class_method
@@ -316,6 +343,14 @@ def save(self, *args, **kwargs) -> None:
316
343
  save_feature_set_links(self)
317
344
 
318
345
 
346
+ @property # type: ignore
347
+ @doc_args(Dataset.path.__doc__)
348
+ def path(self) -> Union[Path, UPath]:
349
+ """{}"""
350
+ _track_run_input(self)
351
+ return self.storage.path
352
+
353
+
319
354
  METHOD_NAMES = [
320
355
  "__init__",
321
356
  "from_anndata",
@@ -337,3 +372,5 @@ if _TESTING:
337
372
 
338
373
  for name in METHOD_NAMES:
339
374
  attach_func_to_class_method(name, Dataset, globals())
375
+
376
+ setattr(Dataset, "path", path)
@@ -85,9 +85,9 @@ def process_pathlike(
85
85
  new_root_str = new_root.as_posix().rstrip("/")
86
86
  region = get_storage_region(new_root_str)
87
87
  storage_settings = StorageSettings(new_root_str, region)
88
- register_storage(storage_settings)
88
+ storage_record = register_storage(storage_settings)
89
89
  use_existing_storage_key = True
90
- return storage_settings.record, use_existing_storage_key
90
+ return storage_record, use_existing_storage_key
91
91
  # if the filepath is local
92
92
  else:
93
93
  use_existing_storage_key = False
@@ -3,10 +3,6 @@ from uuid import UUID
3
3
 
4
4
  import dj_database_url
5
5
  from django.db import connections
6
- from django.db.backends.postgresql.base import (
7
- DatabaseWrapper as DatabaseWrapperPostgres,
8
- )
9
- from django.db.backends.sqlite3.base import DatabaseWrapper as DatabaseWrapperSQLite
10
6
  from lamindb_setup._init_instance import InstanceSettings
11
7
  from lamindb_setup._load_instance import get_owner_name_from_identifier
12
8
  from lamindb_setup.dev._hub_core import load_instance
@@ -22,11 +18,8 @@ def add_db_connection(isettings: InstanceSettings, using: str):
22
18
  db_config["TIME_ZONE"] = "UTC"
23
19
  db_config["OPTIONS"] = {}
24
20
  db_config["AUTOCOMMIT"] = True
25
- if isettings.dialect == "sqlite":
26
- db_wrapper = DatabaseWrapperSQLite(db_config, alias=using)
27
- else:
28
- db_wrapper = DatabaseWrapperPostgres(db_config, alias=using)
29
- connections[using] = db_wrapper
21
+
22
+ connections.settings[using] = db_config
30
23
 
31
24
 
32
25
  def filter(Registry: Type[Registry], using: str = None, **expressions) -> QuerySet:
@@ -25,6 +25,16 @@ class QueryManager(models.Manager):
25
25
  >>> manager.df()
26
26
  """
27
27
 
28
+ def _track_run_input_manager(self):
29
+ if hasattr(self, "source_field_name") and hasattr(self, "target_field_name"):
30
+ if self.source_field_name == "dataset" and self.target_field_name == "file":
31
+ from lamindb.dev._data import WARNING_RUN_TRANSFORM, _track_run_input
32
+ from lamindb.dev._run_context import run_context
33
+
34
+ if run_context.run is None:
35
+ logger.warning(WARNING_RUN_TRANSFORM)
36
+ _track_run_input(self.instance)
37
+
28
38
  def list(self, field: Optional[str] = None):
29
39
  """Populate a list with the results.
30
40
 
@@ -41,6 +51,7 @@ class QueryManager(models.Manager):
41
51
  >>> label.parents.list("name")
42
52
  ['ULabel1', 'ULabel2', 'ULabel3']
43
53
  """
54
+ self._track_run_input_manager()
44
55
  if field is None:
45
56
  return [item for item in self.all()]
46
57
  else:
@@ -58,15 +69,8 @@ class QueryManager(models.Manager):
58
69
 
59
70
  For `**kwargs`, see :meth:`lamindb.dev.QuerySet.df`.
60
71
  """
61
- if hasattr(self, "source_field_name") and hasattr(self, "target_field_name"):
62
- if self.source_field_name == "dataset" and self.target_field_name == "file":
63
- from lamindb.dev._data import WARNING_RUN_TRANSFORM, _track_run_input
64
- from lamindb.dev._run_context import run_context
65
-
66
- if run_context.run is None:
67
- logger.warning(WARNING_RUN_TRANSFORM)
68
- _track_run_input(self.instance)
69
- return self.all()
72
+ self._track_run_input_manager()
73
+ return self.all_base_class()
70
74
 
71
75
  def __getitem__(self, item: str):
72
76
  try:
@@ -86,3 +90,10 @@ class QueryManager(models.Manager):
86
90
  setattr(models.Manager, "list", QueryManager.list)
87
91
  setattr(models.Manager, "df", QueryManager.df)
88
92
  setattr(models.Manager, "__getitem__", QueryManager.__getitem__)
93
+ setattr(
94
+ models.Manager, "_track_run_input_manager", QueryManager._track_run_input_manager
95
+ )
96
+ # the two lines below would be easy if we could actually inherit; like this,
97
+ # they're suboptimal
98
+ setattr(models.Manager, "all_base_class", models.Manager.all)
99
+ setattr(models.Manager, "all", QueryManager.all)
@@ -82,7 +82,12 @@ def __init__(orm: Registry, *args, **kwargs):
82
82
  validate_required_fields(orm, kwargs)
83
83
  from .dev._settings import settings
84
84
 
85
- if settings.upon_create_search_names:
85
+ # do not search for names if an id is passed; this is important
86
+ # e.g. when synching ids from the notebook store to lamindb
87
+ has_consciously_provided_id = False
88
+ if "_has_consciously_provided_id" in kwargs:
89
+ has_consciously_provided_id = kwargs.pop("_has_consciously_provided_id")
90
+ if settings.upon_create_search_names and not has_consciously_provided_id:
86
91
  result = suggest_objects_with_same_name(orm, kwargs)
87
92
  if result == "object-with-same-name-exists":
88
93
  if "version" in kwargs:
@@ -341,7 +346,7 @@ def transfer_to_default_db(record: Registry, save: bool = False):
341
346
  record.transform_id = run_context.transform.id
342
347
  else:
343
348
  record.transform_id = None
344
- if hasattr(record, "storage_id"):
349
+ if hasattr(record, "storage_id") and record.storage_id is not None:
345
350
  record.storage.save()
346
351
  record._state.db = "default"
347
352
  if save:
@@ -0,0 +1,18 @@
1
+ from lamindb_setup.dev._docs import doc_args
2
+ from lamindb_setup.dev.upath import UPath, create_path
3
+ from lnschema_core import Storage
4
+
5
+
6
+ def root_as_path(self) -> UPath:
7
+ return create_path(self.root)
8
+
9
+
10
+ @property # type: ignore
11
+ @doc_args(Storage.path.__doc__)
12
+ def path(self) -> UPath:
13
+ """{}"""
14
+ return create_path(self.root)
15
+
16
+
17
+ setattr(Storage, "root_as_path", root_as_path)
18
+ setattr(Storage, "path", path)
@@ -44,8 +44,14 @@ def __init__(transform: Transform, *args, **kwargs):
44
44
  )
45
45
  if name is None:
46
46
  name = is_new_version_of.name
47
+
48
+ # this is only because the user-facing constructor allows passing an id
49
+ # most others don't
47
50
  if id is None:
51
+ has_consciously_provided_id = False
48
52
  id = new_id
53
+ else:
54
+ has_consciously_provided_id = True
49
55
  super(Transform, transform).__init__(
50
56
  id=id,
51
57
  name=name,
@@ -54,6 +60,7 @@ def __init__(transform: Transform, *args, **kwargs):
54
60
  version=version,
55
61
  initial_version_id=initial_version_id,
56
62
  reference=reference,
63
+ _has_consciously_provided_id=has_consciously_provided_id,
57
64
  )
58
65
 
59
66
 
@@ -127,4 +127,7 @@ class LabelManager:
127
127
  labels_list = labels.list()
128
128
  for label in labels_list:
129
129
  transfer_to_default_db(label, save=True)
130
- getattr(self._host, related_name).add(*labels_list)
130
+ # this should not occur as file and dataset should have the same attributes
131
+ # but this might not be true for custom schema
132
+ if hasattr(self._host, related_name):
133
+ getattr(self._host, related_name).add(*labels_list)
@@ -15,9 +15,9 @@ classifiers = [
15
15
  ]
16
16
  dependencies = [
17
17
  # Lamin PINNED packages
18
- "lnschema_core==0.49.2",
19
- "lamindb_setup==0.54.2",
20
- "lamin_utils==0.11.3",
18
+ "lnschema_core==0.50.0",
19
+ "lamindb_setup==0.54.3",
20
+ "lamin_utils==0.11.4",
21
21
  # others
22
22
  "rapidfuzz",
23
23
  "pyarrow",
@@ -59,7 +59,7 @@ zarr = [
59
59
  "zarr>=2.16.0",
60
60
  ]
61
61
  fcs = [
62
- "readfcs>=1.1.5",
62
+ "readfcs>=1.1.7",
63
63
  ]
64
64
  erdiagram = [
65
65
  "django-schema-graph",
@@ -3,6 +3,9 @@
3
3
  <!-- prettier-ignore -->
4
4
  Name | PR | Developer | Date | Version
5
5
  --- | --- | --- | --- | ---
6
+ 🚸 Allow saving notebooks of other users | [547](https://github.com/laminlabs/lamindb-setup/pull/547) | [falexwolf](https://github.com/falexwolf) | 2023-10-04 | 0.54.3
7
+ 🔊 Add more logging | [546](https://github.com/laminlabs/lamindb-setup/pull/546) | [falexwolf](https://github.com/falexwolf) | 2023-10-04 |
8
+ 🔒 Enforce compatibility with lamin-vault 0.0.7 | [545](https://github.com/laminlabs/lamindb-setup/pull/545) | [fredericenard](https://github.com/fredericenard) | 2023-10-03 |
6
9
  🐛 Prevent using vault by default when loading an instance | [544](https://github.com/laminlabs/lamindb-setup/pull/544) | [fredericenard](https://github.com/fredericenard) | 2023-10-03 | 0.54.2
7
10
  🚸 Do not use vault for SQLite instances | [543](https://github.com/laminlabs/lamindb-setup/pull/543) | [falexwolf](https://github.com/falexwolf) | 2023-10-02 | 0.54.2
8
11
  ✅ Complete notebook tests | [542](https://github.com/laminlabs/lamindb-setup/pull/542) | [falexwolf](https://github.com/falexwolf) | 2023-10-02 | 0.54.1
@@ -41,7 +41,7 @@ Developer API.
41
41
  """
42
42
 
43
43
 
44
- __version__ = "0.54.2" # denote a release candidate for 0.1.0 with 0.1rc1
44
+ __version__ = "0.54.3" # denote a release candidate for 0.1.0 with 0.1rc1
45
45
 
46
46
  import sys
47
47
  from os import name as _os_name
@@ -37,6 +37,7 @@ def register_storage(ssettings: StorageSettings):
37
37
  )
38
38
  if created:
39
39
  logger.save(f"saved: {storage}")
40
+ return storage
40
41
 
41
42
 
42
43
  def register_user(usettings):
@@ -3,8 +3,8 @@ from typing import Optional, Union
3
3
  from uuid import UUID
4
4
 
5
5
  from lamin_utils import logger
6
-
7
6
  from lamindb_setup.dev.upath import UPath
7
+
8
8
  from ._close import close as close_instance
9
9
  from ._init_instance import load_from_isettings
10
10
  from ._settings import InstanceSettings, settings
@@ -12,10 +12,7 @@ from ._silence_loggers import silence_loggers
12
12
  from .dev._settings_load import load_instance_settings
13
13
  from .dev._settings_storage import StorageSettings
14
14
  from .dev._settings_store import instance_settings_file
15
- from .dev.cloud_sqlite_locker import (
16
- unlock_cloud_sqlite_upon_exception,
17
- )
18
-
15
+ from .dev.cloud_sqlite_locker import unlock_cloud_sqlite_upon_exception
19
16
 
20
17
  # this is for testing purposes only
21
18
  # set to True only to test failed load
@@ -144,25 +141,19 @@ def get_db_from_vault(instance_result):
144
141
  from lamin_vault.client.postgres._get_db_from_vault import (
145
142
  get_db_from_vault as get_db_from_vault_base,
146
143
  )
147
- from lamin_vault.client.postgres._connection_config_db_exists import (
148
- connection_config_db_exists,
149
- )
150
144
 
151
145
  vault_client = create_vault_authenticated_client(
152
- access_token=settings.user.access_token,
146
+ access_token=settings.user.access_token, instance_id=instance_result["id"]
153
147
  )
154
- config_db_exists = connection_config_db_exists(
155
- vault_client, instance_result["id"]
148
+ return get_db_from_vault_base(
149
+ vault_client=vault_client,
150
+ scheme=instance_result["db_scheme"],
151
+ host=instance_result["db_host"],
152
+ port=instance_result["db_port"],
153
+ name=instance_result["db_database"],
154
+ role=f'{instance_result["id"]}-{settings.user.uuid}-db',
156
155
  )
157
- if config_db_exists:
158
- return get_db_from_vault_base(
159
- vault_client=vault_client,
160
- scheme=instance_result["db_scheme"],
161
- host=instance_result["db_host"],
162
- port=instance_result["db_port"],
163
- name=instance_result["db_database"],
164
- role=f'{instance_result["id"]}-{settings.user.uuid}-db',
165
- )
156
+
166
157
  except Exception:
167
158
  logger.warning("Failed to connect to vault!")
168
159
  return None
@@ -12,17 +12,22 @@ def update_notebook_metadata(nb, notebook_path):
12
12
  from nbproject.dev import write_notebook
13
13
  from nbproject.dev._initialize import nbproject_id
14
14
 
15
+ stem_id = nb.metadata["nbproject"]["id"]
16
+ current_version = nb.metadata["nbproject"]["version"]
17
+ logger.info(
18
+ f"the notebook {notebook_path} is already tracked (stem_id='{stem_id}',"
19
+ f" version: '{current_version}')"
20
+ )
15
21
  updated = False
16
22
  # ask for generating new id
17
23
  if os.getenv("LAMIN_TESTING") is None:
18
- response = input("Do you want to generate a new id? (y/n) ")
24
+ response = input("Do you want to generate a new id prefix? (y/n) ")
19
25
  else:
20
26
  response = "y"
21
27
  if response == "y":
22
28
  nb.metadata["nbproject"]["id"] = nbproject_id()
23
29
  updated = True
24
30
  else:
25
- current_version = nb.metadata["nbproject"]["version"]
26
31
  response = input(
27
32
  f"The current version is '{current_version}' - do you want to set a new"
28
33
  " version? (y/n) "
@@ -52,7 +57,6 @@ def track(notebook_path: str, pypackage: Optional[str] = None) -> None:
52
57
  write_notebook(nb, notebook_path)
53
58
  logger.success("attached notebook id to ipynb file")
54
59
  else:
55
- logger.info(f"the notebook {notebook_path} is already tracked")
56
60
  update_notebook_metadata(nb, notebook_path)
57
61
  return None
58
62
 
@@ -102,19 +106,21 @@ def save(notebook_path: str) -> Optional[str]:
102
106
  transform_family = ln.Transform.filter(id__startswith=meta_store.id).all()
103
107
  if len(transform_family) == 0:
104
108
  logger.error(
105
- "didn't find notebook in transform registry, did you run ln.track() in it?"
109
+ f"Didn't find notebook with stem_id {meta_store.id} (12 initial characters)"
110
+ " in transform registry, did you run ln.track() in it?"
106
111
  )
107
112
  return "not-tracked-in-transform-registry"
108
113
  # the specific version
109
114
  transform = transform_family.filter(version=transform_version).one()
110
115
  # latest run of this transform by user
111
- run = (
112
- ln.Run.filter(
113
- transform=transform, created_by__id=lamindb_setup.settings.user.id
116
+ run = ln.Run.filter(transform=transform).order_by("-run_at").first()
117
+ if run.created_by.id != lamindb_setup.settings.user.id:
118
+ response = input(
119
+ "You are trying to save a notebook created by another user: Source and"
120
+ " report files will be tagged with *your* user id. Proceed? (y/n)"
114
121
  )
115
- .order_by("-run_at")
116
- .first()
117
- )
122
+ if response != "y":
123
+ return "aborted-save-notebook-created-by-different-user"
118
124
  # convert the notebook file to html
119
125
  notebook_path_html = notebook_path.replace(".ipynb", ".html")
120
126
  logger.info(f"exporting notebook as html {notebook_path_html}")
@@ -19,7 +19,7 @@ dependencies = [
19
19
  "universal_pathlib==0.1.1", # is still experimental, need pinning
20
20
  "botocore<2.0.0",
21
21
  "supabase==1.0.3",
22
- "lamin_vault",
22
+ "lamin_vault==0.0.7",
23
23
  ]
24
24
 
25
25
  [project.urls]
@@ -74,10 +74,7 @@ def test_save_consecutive():
74
74
  env=env,
75
75
  )
76
76
  assert result.returncode == 1
77
- assert (
78
- "didn't find notebook in transform registry, did you run ln.track() in it?"
79
- in result.stdout.decode()
80
- )
77
+ assert "Didn't find notebook with stem_id" in result.stdout.decode()
81
78
 
82
79
  # now, let's re-run this notebook so that ln.track() is actually run
83
80
  nbproject_test.execute_notebooks(notebook_path)