lamindb 0.74.2__tar.gz → 0.74.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 (379) hide show
  1. {lamindb-0.74.2 → lamindb-0.74.3}/PKG-INFO +4 -4
  2. {lamindb-0.74.2 → lamindb-0.74.3}/docs/api.md +0 -2
  3. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/__init__.py +1 -1
  4. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_record.py +3 -16
  5. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_save.py +5 -23
  6. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/_feature_manager.py +6 -11
  7. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/_label_manager.py +10 -16
  8. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/datasets/_core.py +0 -6
  9. {lamindb-0.74.2 → lamindb-0.74.3}/pyproject.toml +3 -3
  10. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/bionty/__init__.py +1 -1
  11. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/pyproject.toml +1 -1
  12. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/.github/workflows/build.yml +1 -1
  13. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/.pre-commit-config.yaml +0 -6
  14. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/__init__.py +1 -1
  15. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_connect_instance.py +3 -2
  16. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_init_instance.py +4 -1
  17. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_hub_client.py +4 -2
  18. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_hub_core.py +20 -16
  19. lamindb-0.74.3/sub/lamindb-setup/lamindb_setup/core/_hub_utils.py +109 -0
  20. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_settings_load.py +1 -1
  21. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_settings_save.py +2 -0
  22. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_settings_store.py +3 -9
  23. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/noxfile.py +5 -1
  24. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/pyproject.toml +2 -2
  25. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-local/test_all.py +2 -1
  26. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/docs/changelog.md +3 -0
  27. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/__init__.py +1 -1
  28. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/core/__init__.py +1 -0
  29. lamindb-0.74.3/sub/lnschema-bionty/lnschema_bionty/core/_add_ontology.py +152 -0
  30. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/core/_settings.py +0 -10
  31. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/models.py +56 -21
  32. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_can_validate.py +2 -2
  33. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_feature_manager.py +0 -4
  34. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_from_values.py +1 -1
  35. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_parents.py +9 -0
  36. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_search.py +1 -2
  37. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_transfer.py +3 -3
  38. lamindb-0.74.2/docs/lamin-utils.md +0 -3
  39. lamindb-0.74.2/docs/nbproject.md +0 -3
  40. lamindb-0.74.2/sub/lamindb-setup/lamindb_setup/core/_hub_utils.py +0 -76
  41. {lamindb-0.74.2 → lamindb-0.74.3}/.github/workflows/build.yml +0 -0
  42. {lamindb-0.74.2 → lamindb-0.74.3}/.github/workflows/doc-changes.yml +0 -0
  43. {lamindb-0.74.2 → lamindb-0.74.3}/.gitignore +0 -0
  44. {lamindb-0.74.2 → lamindb-0.74.3}/.gitmodules +0 -0
  45. {lamindb-0.74.2 → lamindb-0.74.3}/.pre-commit-config.yaml +0 -0
  46. {lamindb-0.74.2 → lamindb-0.74.3}/LICENSE +0 -0
  47. {lamindb-0.74.2 → lamindb-0.74.3}/README.md +0 -0
  48. {lamindb-0.74.2 → lamindb-0.74.3}/docs/arrays.ipynb +0 -0
  49. {lamindb-0.74.2 → lamindb-0.74.3}/docs/bio-registries.ipynb +0 -0
  50. {lamindb-0.74.2 → lamindb-0.74.3}/docs/bionty-base.md +0 -0
  51. {lamindb-0.74.2 → lamindb-0.74.3}/docs/bionty.md +0 -0
  52. {lamindb-0.74.2 → lamindb-0.74.3}/docs/changelog.md +0 -0
  53. {lamindb-0.74.2 → lamindb-0.74.3}/docs/curate-any.ipynb +0 -0
  54. {lamindb-0.74.2 → lamindb-0.74.3}/docs/curate-df.ipynb +0 -0
  55. {lamindb-0.74.2 → lamindb-0.74.3}/docs/curate.md +0 -0
  56. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/acid.ipynb +0 -0
  57. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/delete.ipynb +0 -0
  58. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/idempotency.ipynb +0 -0
  59. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/import-schema.ipynb +0 -0
  60. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/keep-artifacts-local.ipynb +0 -0
  61. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/key.ipynb +0 -0
  62. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/reference-field.ipynb +0 -0
  63. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/setup.ipynb +0 -0
  64. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/test_notebooks.py +0 -0
  65. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/track-run-inputs.ipynb +0 -0
  66. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq/visibility.ipynb +0 -0
  67. {lamindb-0.74.2 → lamindb-0.74.3}/docs/faq.md +0 -0
  68. {lamindb-0.74.2 → lamindb-0.74.3}/docs/guide.md +0 -0
  69. {lamindb-0.74.2 → lamindb-0.74.3}/docs/includes/features-lamindb.md +0 -0
  70. {lamindb-0.74.2 → lamindb-0.74.3}/docs/includes/features-laminhub.md +0 -0
  71. {lamindb-0.74.2 → lamindb-0.74.3}/docs/index.md +0 -0
  72. {lamindb-0.74.2 → lamindb-0.74.3}/docs/installation.md +0 -0
  73. {lamindb-0.74.2 → lamindb-0.74.3}/docs/introduction.ipynb +0 -0
  74. {lamindb-0.74.2 → lamindb-0.74.3}/docs/lamindb.md +0 -0
  75. {lamindb-0.74.2 → lamindb-0.74.3}/docs/query-search.md +0 -0
  76. {lamindb-0.74.2 → lamindb-0.74.3}/docs/readfcs.md +0 -0
  77. {lamindb-0.74.2 → lamindb-0.74.3}/docs/records.ipynb +0 -0
  78. {lamindb-0.74.2 → lamindb-0.74.3}/docs/schemas.ipynb +0 -0
  79. {lamindb-0.74.2 → lamindb-0.74.3}/docs/setup.ipynb +0 -0
  80. {lamindb-0.74.2 → lamindb-0.74.3}/docs/signup-login.md +0 -0
  81. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/add-replace-cache.ipynb +0 -0
  82. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/anndata-accessor.ipynb +0 -0
  83. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/prepare-transfer-local-to-cloud.ipynb +0 -0
  84. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/test-files/iris.csv +0 -0
  85. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/test-files/iris.data +0 -0
  86. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/test-files/new_iris.csv +0 -0
  87. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/test_notebooks.py +0 -0
  88. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/transfer-local-to-cloud.ipynb +0 -0
  89. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/upload.ipynb +0 -0
  90. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage/vitessce.ipynb +0 -0
  91. {lamindb-0.74.2 → lamindb-0.74.3}/docs/storage.md +0 -0
  92. {lamindb-0.74.2 → lamindb-0.74.3}/docs/test_notebooks.py +0 -0
  93. {lamindb-0.74.2 → lamindb-0.74.3}/docs/track.ipynb +0 -0
  94. {lamindb-0.74.2 → lamindb-0.74.3}/docs/transfer.ipynb +0 -0
  95. {lamindb-0.74.2 → lamindb-0.74.3}/docs/tutorial.ipynb +0 -0
  96. {lamindb-0.74.2 → lamindb-0.74.3}/docs/tutorial2.ipynb +0 -0
  97. {lamindb-0.74.2 → lamindb-0.74.3}/docs/wetlab.md +0 -0
  98. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_artifact.py +0 -0
  99. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_can_validate.py +0 -0
  100. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_collection.py +0 -0
  101. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_curate.py +0 -0
  102. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_feature.py +0 -0
  103. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_feature_set.py +0 -0
  104. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_filter.py +0 -0
  105. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_finish.py +0 -0
  106. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_from_values.py +0 -0
  107. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_is_versioned.py +0 -0
  108. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_parents.py +0 -0
  109. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_query_manager.py +0 -0
  110. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_query_set.py +0 -0
  111. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_run.py +0 -0
  112. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_storage.py +0 -0
  113. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_transform.py +0 -0
  114. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_ulabel.py +0 -0
  115. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_utils.py +0 -0
  116. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/_view.py +0 -0
  117. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/__init__.py +0 -0
  118. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/_data.py +0 -0
  119. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/_mapped_collection.py +0 -0
  120. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/_run_context.py +0 -0
  121. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/_settings.py +0 -0
  122. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/_sync_git.py +0 -0
  123. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/_track_environment.py +0 -0
  124. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/datasets/__init__.py +0 -0
  125. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/datasets/_fake.py +0 -0
  126. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/exceptions.py +0 -0
  127. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/fields.py +0 -0
  128. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/schema.py +0 -0
  129. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/storage/__init__.py +0 -0
  130. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/storage/_anndata_sizes.py +0 -0
  131. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/storage/_backed_access.py +0 -0
  132. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/storage/_valid_suffixes.py +0 -0
  133. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/storage/_zarr.py +0 -0
  134. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/storage/objects.py +0 -0
  135. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/storage/paths.py +0 -0
  136. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/subsettings/__init__.py +0 -0
  137. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/subsettings/_creation_settings.py +0 -0
  138. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/subsettings/_transform_settings.py +0 -0
  139. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/types.py +0 -0
  140. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/core/versioning.py +0 -0
  141. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/integrations/__init__.py +0 -0
  142. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/integrations/_vitessce.py +0 -0
  143. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/setup/__init__.py +0 -0
  144. {lamindb-0.74.2 → lamindb-0.74.3}/lamindb/setup/core/__init__.py +0 -0
  145. {lamindb-0.74.2 → lamindb-0.74.3}/noxfile.py +0 -0
  146. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/.github/workflows/build.yml +0 -0
  147. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/.github/workflows/latest-changes.jinja2 +0 -0
  148. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/.github/workflows/latest-changes.yml +0 -0
  149. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/.gitignore +0 -0
  150. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/.pre-commit-config.yaml +0 -0
  151. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/LICENSE +0 -0
  152. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/README.md +0 -0
  153. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/bionty/core/__init__.py +0 -0
  154. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/docs/changelog.md +0 -0
  155. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/docs/index.md +0 -0
  156. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/docs/reference.md +0 -0
  157. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/lamin-project.yaml +0 -0
  158. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/noxfile.py +0 -0
  159. {lamindb-0.74.2 → lamindb-0.74.3}/sub/bionty/tests/test_notebooks.py +0 -0
  160. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/.github/workflows/doc-changes.yml +0 -0
  161. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/.gitignore +0 -0
  162. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/.pre-commit-config.yaml +0 -0
  163. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/README.md +0 -0
  164. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/lamin_cli/__init__.py +0 -0
  165. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/lamin_cli/__main__.py +0 -0
  166. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/lamin_cli/_cache.py +0 -0
  167. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/lamin_cli/_get.py +0 -0
  168. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/lamin_cli/_migration.py +0 -0
  169. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/lamin_cli/_save.py +0 -0
  170. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/pyproject.toml +0 -0
  171. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/conftest.py +0 -0
  172. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/notebooks/not-initialized.ipynb +0 -0
  173. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/notebooks/with-title-and-initialized-consecutive.ipynb +0 -0
  174. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/notebooks/with-title-and-initialized-non-consecutive.ipynb +0 -0
  175. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/scripts/merely-import-lamindb.py +0 -0
  176. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/scripts/run-track-and-finish-sync-git.py +0 -0
  177. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/scripts/run-track-and-finish.py +0 -0
  178. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/test_cli.py +0 -0
  179. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/test_get.py +0 -0
  180. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/test_migrate.py +0 -0
  181. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/test_multi_process.py +0 -0
  182. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/test_save_files.py +0 -0
  183. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/test_save_notebooks.py +0 -0
  184. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamin-cli/tests/test_save_scripts.py +0 -0
  185. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/.github/workflows/doc-changes.yml +0 -0
  186. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/.gitignore +0 -0
  187. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/LICENSE +0 -0
  188. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/README.md +0 -0
  189. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/changelog.md +0 -0
  190. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-cloud/01-init-local-instance.ipynb +0 -0
  191. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-cloud/02-connect-local-instance.ipynb +0 -0
  192. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-cloud/03-add-managed-storage.ipynb +0 -0
  193. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-cloud/04-test-bionty.ipynb +0 -0
  194. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-cloud/05-init-hosted-instance.ipynb +0 -0
  195. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-cloud/06-connect-hosted-instance.ipynb +0 -0
  196. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-cloud/07-keep-artifacts-local.ipynb +0 -0
  197. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-cloud/test-multi-session.ipynb +0 -0
  198. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-cloud/test_notebooks.py +0 -0
  199. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-prod/test-cache-management.ipynb +0 -0
  200. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-prod/test-cloud-sync.ipynb +0 -0
  201. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-prod/test-connect-anonymously.ipynb +0 -0
  202. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-prod/test-empty-init.ipynb +0 -0
  203. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-prod/test-import-schema.ipynb +0 -0
  204. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-prod/test-insufficient-user-info.ipynb +0 -0
  205. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-prod/test-invalid-schema.ipynb +0 -0
  206. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-prod/test-sqlite-lock.ipynb +0 -0
  207. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/hub-prod/test_notebooks2.py +0 -0
  208. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/index.md +0 -0
  209. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/notebooks.md +0 -0
  210. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/docs/reference.md +0 -0
  211. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_cache.py +0 -0
  212. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_check.py +0 -0
  213. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_check_setup.py +0 -0
  214. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_close.py +0 -0
  215. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_delete.py +0 -0
  216. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_django.py +0 -0
  217. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_exportdb.py +0 -0
  218. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_importdb.py +0 -0
  219. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_migrate.py +0 -0
  220. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_register_instance.py +0 -0
  221. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_schema.py +0 -0
  222. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_schema_metadata.py +0 -0
  223. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_set_managed_storage.py +0 -0
  224. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_setup_user.py +0 -0
  225. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/_silence_loggers.py +0 -0
  226. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/__init__.py +0 -0
  227. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_aws_credentials.py +0 -0
  228. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_aws_storage.py +0 -0
  229. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_deprecated.py +0 -0
  230. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_docs.py +0 -0
  231. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_hub_crud.py +0 -0
  232. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_private_django_api.py +0 -0
  233. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_settings.py +0 -0
  234. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_settings_instance.py +0 -0
  235. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_settings_storage.py +0 -0
  236. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_settings_user.py +0 -0
  237. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/_setup_bionty_sources.py +0 -0
  238. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/cloud_sqlite_locker.py +0 -0
  239. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/django.py +0 -0
  240. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/exceptions.py +0 -0
  241. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/hashing.py +0 -0
  242. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/types.py +0 -0
  243. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/lamindb_setup/core/upath.py +0 -0
  244. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-cloud/test_connect_instance.py +0 -0
  245. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-cloud/test_delete_instance.py +0 -0
  246. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-cloud/test_init_instance.py +0 -0
  247. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-cloud/test_login.py +0 -0
  248. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-cloud/test_migrate.py +0 -0
  249. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-cloud/test_set_storage.py +0 -0
  250. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-local/conftest.py +0 -0
  251. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-local/test_update_schema_in_hub.py +0 -0
  252. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-prod/conftest.py +0 -0
  253. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-prod/test_django.py +0 -0
  254. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-prod/test_global_settings.py +0 -0
  255. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-prod/test_switch_and_fallback_env.py +0 -0
  256. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/hub-prod/test_upath.py +0 -0
  257. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/storage/test_hashing.py +0 -0
  258. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/storage/test_storage_access.py +0 -0
  259. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/storage/test_storage_basis.py +0 -0
  260. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/storage/test_storage_stats.py +0 -0
  261. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lamindb-setup/tests/storage/test_to_url.py +0 -0
  262. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/.github/workflows/build.yml +0 -0
  263. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/.github/workflows/latest-changes.jinja2 +0 -0
  264. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/.github/workflows/latest-changes.yml +0 -0
  265. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/.gitignore +0 -0
  266. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/.pre-commit-config.yaml +0 -0
  267. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/LICENSE +0 -0
  268. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/README.md +0 -0
  269. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/docs/index.md +0 -0
  270. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/docs/reference.md +0 -0
  271. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lamin-project.yaml +0 -0
  272. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/_bionty.py +0 -0
  273. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/core/_bionty.py +0 -0
  274. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/ids.py +0 -0
  275. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0023_rename_publicsource_encode_uid.py +0 -0
  276. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0024_remove_cellline_collections_and_more.py +0 -0
  277. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0025_artifactcellline_alter_cellline_artifacts_and_more.py +0 -0
  278. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0026_artifactcellline_cell_line_ref_is_name_and_more.py +0 -0
  279. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0027_remove_artifactcellline_created_at_and_more.py +0 -0
  280. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0028_artifactcellline_created_at_and_more.py +0 -0
  281. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0028_squashed.py +0 -0
  282. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/migrations/0029_alter_cellline_previous_runs_and_more.py +0 -0
  283. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/lnschema_bionty/migrations/__init__.py +0 -0
  284. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/noxfile.py +0 -0
  285. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/pyproject.toml +0 -0
  286. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-bionty/tests/test_integrity.py +0 -0
  287. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/.github/workflows/build.yml +0 -0
  288. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/.github/workflows/doc-changes.yml +0 -0
  289. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/.gitignore +0 -0
  290. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/.pre-commit-config.yaml +0 -0
  291. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/CHANGELOG.md +0 -0
  292. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/LICENSE +0 -0
  293. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/README.md +0 -0
  294. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/__init__.py +0 -0
  295. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/ids.py +0 -0
  296. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0037_rename_dataset_to_collection.py +0 -0
  297. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0038_alter_collection_artifact_alter_collection_artifacts_and_more.py +0 -0
  298. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0039_remove_collection_artifacts_collectionartifact_and_more.py +0 -0
  299. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0040_alter_transform_type.py +0 -0
  300. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0041_remove_transform_short_name_transform_description_and_more.py +0 -0
  301. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0042_rename_run_at_run_started_at_run_finished_at.py +0 -0
  302. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0043_run_json.py +0 -0
  303. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0044_run_replicated_outputs_transform_ulabels_and_more.py +0 -0
  304. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0045_rename_replicated_outputs_run_replicated_output_artifacts_and_more.py +0 -0
  305. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0046_storage_instance_uid.py +0 -0
  306. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0047_featurevalue_artifactfeaturevalue_and_more.py +0 -0
  307. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0048_alter_artifactulabel_feature_and_more.py +0 -0
  308. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0049_rename_type_feature_dtype_and_more.py +0 -0
  309. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0050_artifactfeatureset_feature_ref_is_semantic_and_more.py +0 -0
  310. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0051_remove_feature_feature_sets_featuresetfeature_and_more.py +0 -0
  311. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0052_rename_feature_value_artifactfeaturevalue_featurevalue_and_more.py +0 -0
  312. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0052_squashed.py +0 -0
  313. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0053_alter_featureset_hash_alter_paramvalue_created_by_and_more.py +0 -0
  314. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0054_alter_feature_previous_runs_and_more.py +0 -0
  315. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/0055_artifact_type_artifactparamvalue_and_more.py +0 -0
  316. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/migrations/__init__.py +0 -0
  317. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/mocks.py +0 -0
  318. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/models.py +0 -0
  319. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/types.py +0 -0
  320. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/lnschema_core/users.py +0 -0
  321. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/noxfile.py +0 -0
  322. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/pyproject.toml +0 -0
  323. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/tests/test_integrity.py +0 -0
  324. {lamindb-0.74.2 → lamindb-0.74.3}/sub/lnschema-core/tests/test_types.py +0 -0
  325. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/.github/workflows/build.yml +0 -0
  326. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/.github/workflows/latest-changes.jinja2 +0 -0
  327. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/.github/workflows/latest-changes.yml +0 -0
  328. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/.gitignore +0 -0
  329. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/.pre-commit-config.yaml +0 -0
  330. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/README.md +0 -0
  331. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/docs/changelog.md +0 -0
  332. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/docs/guide/get-started.ipynb +0 -0
  333. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/docs/guide.md +0 -0
  334. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/docs/index.md +0 -0
  335. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/docs/reference.md +0 -0
  336. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/noxfile.py +0 -0
  337. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/pyproject.toml +0 -0
  338. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/tests/test_integrity.py +0 -0
  339. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/tests/test_notebooks.py +0 -0
  340. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/wetlab/__init__.py +0 -0
  341. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/wetlab/migrations/0017_remove_biosample_artifacts.py +0 -0
  342. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/wetlab/migrations/0018_squashed.py +0 -0
  343. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/wetlab/migrations/0018_well_created_at_well_created_by_well_updated_at.py +0 -0
  344. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/wetlab/migrations/0019_alter_treatment_system.py +0 -0
  345. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/wetlab/migrations/__init__.py +0 -0
  346. {lamindb-0.74.2 → lamindb-0.74.3}/sub/wetlab/wetlab/models.py +0 -0
  347. {lamindb-0.74.2 → lamindb-0.74.3}/tests/conftest.py +0 -0
  348. {lamindb-0.74.2 → lamindb-0.74.3}/tests/notebooks/initialized-with-nbproject.ipynb +0 -0
  349. {lamindb-0.74.2 → lamindb-0.74.3}/tests/notebooks/no-title.ipynb +0 -0
  350. {lamindb-0.74.2 → lamindb-0.74.3}/tests/notebooks/not-initialized.ipynb +0 -0
  351. {lamindb-0.74.2 → lamindb-0.74.3}/tests/notebooks/with-title-initialized-consecutive-finish-not-last-cell.ipynb +0 -0
  352. {lamindb-0.74.2 → lamindb-0.74.3}/tests/notebooks/with-title-initialized-consecutive-finish.ipynb +0 -0
  353. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_artifact.py +0 -0
  354. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_artifact_folders.py +0 -0
  355. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_cache.py +0 -0
  356. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_collection.py +0 -0
  357. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_curate.py +0 -0
  358. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_data.py +0 -0
  359. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_db.py +0 -0
  360. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_delete.py +0 -0
  361. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_feature.py +0 -0
  362. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_feature_set.py +0 -0
  363. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_label_manager.py +0 -0
  364. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_load.py +0 -0
  365. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_manager.py +0 -0
  366. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_notebooks.py +0 -0
  367. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_queryset.py +0 -0
  368. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_record.py +0 -0
  369. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_run.py +0 -0
  370. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_run_context.py +0 -0
  371. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_save.py +0 -0
  372. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_settings.py +0 -0
  373. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_storage.py +0 -0
  374. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_transform.py +0 -0
  375. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_uid.py +0 -0
  376. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_ulabel.py +0 -0
  377. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_versioning.py +0 -0
  378. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_view.py +0 -0
  379. {lamindb-0.74.2 → lamindb-0.74.3}/tests/test_visibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lamindb
3
- Version: 0.74.2
3
+ Version: 0.74.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,7 +10,7 @@ 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.70.5
13
- Requires-Dist: lamindb_setup==0.74.1
13
+ Requires-Dist: lamindb_setup==0.74.2
14
14
  Requires-Dist: lamin_utils==0.13.2
15
15
  Requires-Dist: lamin_cli==0.15.0
16
16
  Requires-Dist: rapidfuzz
@@ -24,7 +24,7 @@ Requires-Dist: pandas
24
24
  Requires-Dist: graphviz
25
25
  Requires-Dist: psycopg2-binary
26
26
  Requires-Dist: lamindb_setup[aws] ; extra == "aws"
27
- Requires-Dist: bionty==0.44.2 ; extra == "bionty"
27
+ Requires-Dist: bionty==0.44.3 ; extra == "bionty"
28
28
  Requires-Dist: pre-commit ; extra == "dev"
29
29
  Requires-Dist: nox ; extra == "dev"
30
30
  Requires-Dist: laminci>=0.3 ; extra == "dev"
@@ -37,7 +37,7 @@ Requires-Dist: faker-biology ; extra == "dev"
37
37
  Requires-Dist: django-schema-graph ; extra == "erdiagram"
38
38
  Requires-Dist: readfcs>=1.1.8 ; extra == "fcs"
39
39
  Requires-Dist: lamindb_setup[gcp] ; extra == "gcp"
40
- Requires-Dist: nbproject==0.10.3 ; extra == "jupyter"
40
+ Requires-Dist: nbproject==0.10.4 ; extra == "jupyter"
41
41
  Requires-Dist: nbstripout==0.6.1 ; extra == "jupyter"
42
42
  Requires-Dist: nbconvert ; extra == "jupyter"
43
43
  Requires-Dist: zarr>=2.16.0 ; extra == "zarr"
@@ -34,6 +34,4 @@ wetlab
34
34
 
35
35
  bionty-base
36
36
  readfcs
37
- nbproject
38
- lamin-utils
39
37
  ```
@@ -42,7 +42,7 @@ Modules & settings:
42
42
  """
43
43
 
44
44
  # denote a release candidate for 0.1.0 with 0.1rc1, 0.1a1, 0.1b1, etc.
45
- __version__ = "0.74.2"
45
+ __version__ = "0.74.3"
46
46
 
47
47
  import os as _os
48
48
 
@@ -529,12 +529,7 @@ def save(self, *args, **kwargs) -> Record:
529
529
  if result is not None:
530
530
  init_self_from_db(self, result)
531
531
  else:
532
- # here, we can't use the parents argument
533
- # parents are not saved for the self record
534
- save_kwargs = kwargs.copy()
535
- if "parents" in save_kwargs:
536
- save_kwargs.pop("parents")
537
- super(Record, self).save(*args, **save_kwargs)
532
+ super(Record, self).save(*args, **kwargs)
538
533
  # perform transfer of many-to-many fields
539
534
  # only supported for Artifact and Collection records
540
535
  if db is not None and db != "default" and using_key is None:
@@ -554,16 +549,8 @@ def save(self, *args, **kwargs) -> Record:
554
549
  self_on_db._state.db = db
555
550
  self_on_db.pk = pk_on_db # manually set the primary key
556
551
  self_on_db.features = FeatureManager(self_on_db)
557
- # by default, transfer parents of the labels to maintain ontological hierarchy
558
- try:
559
- import bionty as bt
560
-
561
- parents = kwargs.get("parents", bt.settings.auto_save_parents)
562
- except ImportError:
563
- parents = kwargs.get("parents", True)
564
- add_from_kwargs = {"parents": parents}
565
- self.features._add_from(self_on_db, **add_from_kwargs)
566
- self.labels.add_from(self_on_db, **add_from_kwargs)
552
+ self.features._add_from(self_on_db)
553
+ self.labels.add_from(self_on_db)
567
554
  return self
568
555
 
569
556
 
@@ -27,9 +27,7 @@ if TYPE_CHECKING:
27
27
  from lamindb_setup.core.upath import UPath
28
28
 
29
29
 
30
- def save(
31
- records: Iterable[Record], ignore_conflicts: bool | None = False, **kwargs
32
- ) -> None:
30
+ def save(records: Iterable[Record], ignore_conflicts: bool | None = False) -> None:
33
31
  """Bulk save to registries & storage.
34
32
 
35
33
  Note:
@@ -47,7 +45,6 @@ def save(
47
45
  unique or another constraint. However, it won't inplace update the id
48
46
  fields of records. If you need records with ids, you need to query
49
47
  them from the database.
50
- **kwargs: Get kwargs related to parents.
51
48
 
52
49
  Examples:
53
50
 
@@ -87,27 +84,12 @@ def save(
87
84
  non_artifacts_with_parents = [
88
85
  r for r in non_artifacts_new if hasattr(r, "_parents")
89
86
  ]
90
- if len(non_artifacts_with_parents) > 0 and kwargs.get("parents") is not False:
87
+ if len(non_artifacts_with_parents) > 0:
91
88
  # this can only happen within lnschema_bionty right now!!
92
89
  # we might extend to core lamindb later
93
- import bionty as bt
94
-
95
- if kwargs.get("parents") or (
96
- kwargs.get("parents") is None and bt.settings.auto_save_parents
97
- ):
98
- mute = False if kwargs.get("mute") is None else kwargs.get("mute")
99
- if not mute:
100
- # save the record with parents one by one
101
- logger.warning(
102
- "now recursing through parents: "
103
- "this only happens once, but is much slower than bulk saving"
104
- )
105
- logger.hint(
106
- "you can switch this off via: bt.settings.auto_save_parents ="
107
- " False"
108
- )
109
- for record in non_artifacts_with_parents:
110
- record._save_ontology_parents(mute=True)
90
+ from lnschema_bionty.core import add_ontology
91
+
92
+ add_ontology(non_artifacts_with_parents)
111
93
 
112
94
  if artifacts:
113
95
  with transaction.atomic():
@@ -770,7 +770,7 @@ def _add_set_from_mudata(
770
770
  self._host.save()
771
771
 
772
772
 
773
- def _add_from(self, data: HasFeatures, parents: bool = True):
773
+ def _add_from(self, data: HasFeatures):
774
774
  """Transfer features from a artifact or collection."""
775
775
  # This only covers feature sets, though.
776
776
  using_key = settings._using_key
@@ -782,23 +782,18 @@ def _add_from(self, data: HasFeatures, parents: bool = True):
782
782
  # note here the features are transferred based on an unique field
783
783
  field = REGISTRY_UNIQUE_FIELD.get(registry.__name__.lower(), "uid")
784
784
  # TODO: get a default ID field for the registry
785
- if hasattr(registry, "ontology_id") and parents:
785
+ if hasattr(registry, "ontology_id"):
786
786
  field = "ontology_id"
787
787
  elif hasattr(registry, "ensembl_gene_id"):
788
788
  field = "ensembl_gene_id"
789
789
  elif hasattr(registry, "uniprotkb_id"):
790
790
  field = "uniprotkb_id"
791
-
792
- if registry.__get_name_with_schema__() == "bionty.Organism":
793
- parents = False
794
791
  # this will be e.g. be a list of ontology_ids or uids
795
792
  member_uids = list(members.values_list(field, flat=True))
796
- # create records from ontology_id in order to populate parents
797
- if field == "ontology_id" and len(member_uids) > 0 and parents:
793
+ # create records from ontology_id
794
+ if field == "ontology_id" and len(member_uids) > 0:
798
795
  # create from bionty
799
- records = registry.from_values(member_uids, field=field)
800
- if len(records) > 0:
801
- save(records, parents=parents)
796
+ save(registry.from_values(member_uids, field=field))
802
797
  validated = registry.validate(member_uids, field=field, mute=True)
803
798
  new_members_uids = list(compress(member_uids, ~validated))
804
799
  new_members = members.filter(**{f"{field}__in": new_members_uids}).all()
@@ -814,7 +809,7 @@ def _add_from(self, data: HasFeatures, parents: bool = True):
814
809
  # in the previous step transfer_fk_to_default_db_bulk
815
810
  transfer_to_default_db(feature, using_key, mute=mute, transfer_fk=False)
816
811
  logger.info(f"saving {n_new_members} new {registry.__name__} records")
817
- save(new_members, parents=parents)
812
+ save(new_members)
818
813
 
819
814
  # create a new feature set from feature values using the same uid
820
815
  feature_set_self = FeatureSet.from_values(
@@ -76,32 +76,28 @@ def print_labels(self: HasFeatures, field: str = "name", print_types: bool = Fal
76
76
 
77
77
 
78
78
  # Alex: is this a label transfer function?
79
- def validate_labels(labels: QuerySet | list | dict, parents: bool = True):
79
+ def validate_labels(labels: QuerySet | list | dict):
80
80
  def validate_labels_registry(
81
- labels: QuerySet | list | dict, parents: bool = True
81
+ labels: QuerySet | list | dict,
82
82
  ) -> tuple[list[str], list[str]]:
83
83
  if len(labels) == 0:
84
84
  return [], []
85
85
  registry = labels[0].__class__
86
86
  field = REGISTRY_UNIQUE_FIELD.get(registry.__name__.lower(), "uid")
87
- if hasattr(registry, "ontology_id") and parents:
87
+ if hasattr(registry, "ontology_id"):
88
88
  field = "ontology_id"
89
89
  elif hasattr(registry, "ensembl_gene_id"):
90
90
  field = "ensembl_gene_id"
91
91
  elif hasattr(registry, "uniprotkb_id"):
92
92
  field = "uniprotkb_id"
93
- if registry.__get_name_with_schema__() == "bionty.Organism":
94
- parents = False
95
93
  # if the field value is None, use uid field
96
94
  label_uids = np.array(
97
95
  [getattr(label, field) for label in labels if label is not None]
98
96
  )
99
- # save labels from ontology_ids so that parents are populated
97
+ # save labels from ontology_ids
100
98
  if field == "ontology_id" and len(label_uids) > 0:
101
99
  try:
102
- records = registry.from_values(label_uids, field=field)
103
- if len(records) > 0:
104
- save(records, parents=parents)
100
+ save(registry.from_values(label_uids, field=field))
105
101
  except Exception: # noqa S110
106
102
  pass
107
103
  field = "uid"
@@ -117,11 +113,9 @@ def validate_labels(labels: QuerySet | list | dict, parents: bool = True):
117
113
  if isinstance(labels, Dict):
118
114
  result = {}
119
115
  for registry, labels_registry in labels.items():
120
- result[registry] = validate_labels_registry(
121
- labels_registry, parents=parents
122
- )
116
+ result[registry] = validate_labels_registry(labels_registry)
123
117
  else:
124
- return validate_labels_registry(labels, parents=parents)
118
+ return validate_labels_registry(labels)
125
119
 
126
120
 
127
121
  class LabelManager:
@@ -176,7 +170,7 @@ class LabelManager:
176
170
 
177
171
  return get_labels(self._host, feature=feature, mute=mute, flat_names=flat_names)
178
172
 
179
- def add_from(self, data: HasFeatures, parents: bool = True) -> None:
173
+ def add_from(self, data: HasFeatures) -> None:
180
174
  """Add labels from an artifact or collection to another artifact or collection.
181
175
 
182
176
  Examples:
@@ -202,7 +196,7 @@ class LabelManager:
202
196
  data_name_lower = data.__class__.__name__.lower()
203
197
  labels_by_features = defaultdict(list)
204
198
  features = set()
205
- _, new_labels = validate_labels(labels, parents=parents)
199
+ _, new_labels = validate_labels(labels)
206
200
  if len(new_labels) > 0:
207
201
  transfer_fk_to_default_db_bulk(new_labels, using_key)
208
202
  for label in labels:
@@ -237,7 +231,7 @@ class LabelManager:
237
231
  transfer_to_default_db(
238
232
  feature, using_key, mute=True, transfer_fk=False
239
233
  )
240
- save(new_features, parents=parents)
234
+ save(new_features)
241
235
  if hasattr(self._host, related_name):
242
236
  for feature_name, labels in labels_by_features.items():
243
237
  if feature_name is not None:
@@ -185,8 +185,6 @@ def anndata_mouse_sc_lymph_node(
185
185
 
186
186
  verbosity = ln.settings.verbosity
187
187
  ln.settings.verbosity = "error"
188
- auto_save_parents = bt.settings.auto_save_parents
189
- bt.settings.auto_save_parents = False
190
188
  # strain
191
189
  bt.ExperimentalFactor.from_public(ontology_id="EFO:0004472").save()
192
190
  # developmental stage
@@ -215,7 +213,6 @@ def anndata_mouse_sc_lymph_node(
215
213
  labels += [ln.ULabel(name=name) for name in adata.obs[col]]
216
214
  ln.save(labels)
217
215
  ln.settings.verbosity = verbosity
218
- bt.settings.auto_save_parents = auto_save_parents
219
216
 
220
217
  return adata
221
218
 
@@ -313,8 +310,6 @@ def anndata_human_immune_cells(
313
310
 
314
311
  verbosity = ln.settings.verbosity
315
312
  ln.settings.verbosity = "error"
316
- auto_save_parents = bt.settings.auto_save_parents
317
- bt.settings.auto_save_parents = False
318
313
  ln.save(
319
314
  bt.Gene.from_values(
320
315
  adata.var.index, field="ensembl_gene_id", organism="human"
@@ -331,7 +326,6 @@ def anndata_human_immune_cells(
331
326
  bt.ExperimentalFactor.from_public(ontology_id="EFO:0008913").save()
332
327
  ln.save([ln.ULabel(name=name) for name in adata.obs.donor.unique()])
333
328
  ln.settings.verbosity = verbosity
334
- bt.settings.auto_save_parents = auto_save_parents
335
329
  return adata
336
330
 
337
331
 
@@ -17,7 +17,7 @@ classifiers = [
17
17
  dependencies = [
18
18
  # Lamin PINNED packages
19
19
  "lnschema_core==0.70.5",
20
- "lamindb_setup==0.74.1",
20
+ "lamindb_setup==0.74.2",
21
21
  "lamin_utils==0.13.2",
22
22
  "lamin_cli==0.15.0",
23
23
  # others
@@ -38,7 +38,7 @@ Home = "https://github.com/laminlabs/lamindb"
38
38
 
39
39
  [project.optional-dependencies]
40
40
  bionty = [
41
- "bionty==0.44.2",
41
+ "bionty==0.44.3",
42
42
  ]
43
43
  aws = [
44
44
  "lamindb_setup[aws]",
@@ -47,7 +47,7 @@ gcp = [
47
47
  "lamindb_setup[gcp]",
48
48
  ]
49
49
  jupyter = [
50
- "nbproject==0.10.3", # keep pinning
50
+ "nbproject==0.10.4", # keep pinning
51
51
  "nbstripout==0.6.1", # 0.7.0 seems to be broken, 0.6.2 incompatible with orjson
52
52
  "nbconvert",
53
53
  ]
@@ -122,7 +122,7 @@ Developer API:
122
122
  core
123
123
  """
124
124
 
125
- __version__ = "0.44.2"
125
+ __version__ = "0.44.3"
126
126
 
127
127
  import lamindb # this is needed as even the Record base class is defined in lamindb
128
128
  from lamindb_setup._check_setup import InstanceNotSetupError as _InstanceNotSetupError
@@ -8,7 +8,7 @@ authors = [{name = "Lamin Labs", email = "open-source@lamin.ai"}]
8
8
  readme = "README.md"
9
9
  dynamic = ["version", "description"]
10
10
  dependencies = [
11
- "lnschema-bionty==0.43.2",
11
+ "lnschema-bionty==0.43.3",
12
12
  ]
13
13
 
14
14
  [project.urls]
@@ -43,7 +43,7 @@ jobs:
43
43
  python-version: "3.11"
44
44
  - lamin_env: "staging"
45
45
  python-version: "3.10" # test on 3.9
46
- timeout-minutes: 6
46
+ timeout-minutes: 7
47
47
  steps:
48
48
  - uses: aws-actions/configure-aws-credentials@v2
49
49
  with:
@@ -44,9 +44,3 @@ repos:
44
44
  (?x)(
45
45
  tests/hub-local/conftest.py
46
46
  )
47
- - repo: https://github.com/pycqa/pydocstyle
48
- rev: 6.1.1
49
- hooks:
50
- - id: pydocstyle
51
- args: # google style + __init__, see http://www.pydocstyle.org/en/stable/error_codes.html
52
- - --ignore=D100,D101,D102,D103,D104,D106,D107,D203,D204,D213,D215,D400,D401,D403,D404,D406,D407,D408,D409,D412,D413,D417
@@ -34,7 +34,7 @@ Modules & settings:
34
34
 
35
35
  """
36
36
 
37
- __version__ = "0.74.1" # denote a release candidate for 0.1.0 with 0.1rc1
37
+ __version__ = "0.74.2" # denote a release candidate for 0.1.0 with 0.1rc1
38
38
 
39
39
  import sys
40
40
  from os import name as _os_name
@@ -74,7 +74,8 @@ def update_db_using_local(
74
74
  # read from a cached settings file in case the hub result is only
75
75
  # read level or inexistent
76
76
  elif settings_file.exists() and (
77
- "read" in db_dsn_hub.db.user or db_dsn_hub.db.user is None
77
+ db_dsn_hub.db.user is None
78
+ or (db_dsn_hub.db.user is not None and "read" in db_dsn_hub.db.user)
78
79
  ):
79
80
  isettings = load_instance_settings(settings_file)
80
81
  db_dsn_local = LaminDsnModel(db=isettings.db)
@@ -101,7 +102,7 @@ def update_db_using_local(
101
102
  scheme=db_dsn_hub.db.scheme,
102
103
  user=db_dsn_local.db.user,
103
104
  password=db_dsn_local.db.password,
104
- host=db_dsn_hub.db.host,
105
+ host=db_dsn_hub.db.host, # type: ignore
105
106
  port=db_dsn_hub.db.port,
106
107
  database=db_dsn_hub.db.database,
107
108
  )
@@ -245,7 +245,10 @@ def init(
245
245
  if instance_state == "connected":
246
246
  settings.auto_connect = True # we can also debate this switch here
247
247
  return None
248
- ssettings = init_storage(storage, instance_id=instance_id)
248
+ # cannot past instance_id here because instance does not yet exist!
249
+ # the instance_id field of the storage table is populated at the end of
250
+ # init_instance_hub
251
+ ssettings = init_storage(storage)
249
252
  isettings = InstanceSettings(
250
253
  id=instance_id, # type: ignore
251
254
  owner=settings.user.handle,
@@ -5,7 +5,7 @@ from urllib.request import urlretrieve
5
5
 
6
6
  from gotrue.errors import AuthUnknownError
7
7
  from lamin_utils import logger
8
- from pydantic import BaseSettings
8
+ from pydantic_settings import BaseSettings
9
9
  from supabase import Client, create_client # type: ignore
10
10
  from supabase.lib.client_options import ClientOptions
11
11
 
@@ -59,9 +59,11 @@ class Environment:
59
59
 
60
60
  # runs ~0.5s
61
61
  def connect_hub(
62
- fallback_env: bool = False, client_options: ClientOptions = ClientOptions()
62
+ fallback_env: bool = False, client_options: ClientOptions | None = None
63
63
  ) -> Client:
64
64
  env = Environment(fallback=fallback_env)
65
+ if client_options is None:
66
+ client_options = ClientOptions(auto_refresh_token=False)
65
67
  return create_client(env.supabase_api_url, env.supabase_anon_key, client_options)
66
68
 
67
69
 
@@ -93,20 +93,21 @@ def _select_storage(
93
93
  return False
94
94
  else:
95
95
  existing_storage = response.data[0]
96
- if ssettings._instance_id is not None:
97
- # consider storage settings that are meant to be managed by an instance
98
- if UUID(existing_storage["instance_id"]) != ssettings._instance_id:
99
- # everything is alright if the instance_id matches
100
- # we're probably just switching storage locations
101
- # below can be turned into a warning and then delegate the error
102
- # to a unique constraint violation below
103
- raise ValueError(
104
- f"Storage root {root} is already managed by instance {existing_storage['instance_id']}."
105
- )
106
- else:
107
- # if the request is agnostic of the instance, that's alright,
108
- # we'll update the instance_id with what's stored in the hub
109
- ssettings._instance_id = UUID(existing_storage["instance_id"])
96
+ if existing_storage["instance_id"] is not None:
97
+ if ssettings._instance_id is not None:
98
+ # consider storage settings that are meant to be managed by an instance
99
+ if UUID(existing_storage["instance_id"]) != ssettings._instance_id:
100
+ # everything is alright if the instance_id matches
101
+ # we're probably just switching storage locations
102
+ # below can be turned into a warning and then delegate the error
103
+ # to a unique constraint violation below
104
+ raise ValueError(
105
+ f"Storage root {root} is already managed by instance {existing_storage['instance_id']}."
106
+ )
107
+ else:
108
+ # if the request is agnostic of the instance, that's alright,
109
+ # we'll update the instance_id with what's stored in the hub
110
+ ssettings._instance_id = UUID(existing_storage["instance_id"])
110
111
  ssettings._uuid_ = UUID(existing_storage["id"])
111
112
  if update_uid:
112
113
  ssettings._uid = existing_storage["lnid"]
@@ -145,11 +146,14 @@ def _init_storage(ssettings: StorageSettings, client: Client) -> None:
145
146
  id = uuid.uuid5(uuid.NAMESPACE_URL, root)
146
147
  else:
147
148
  id = uuid.uuid4()
148
- if ssettings._instance_id is None:
149
+ if ssettings._instance_id is None and settings._instance_exists:
149
150
  logger.warning(
150
151
  f"will manage storage location {ssettings.root_as_str} with instance {settings.instance.slug}"
151
152
  )
152
153
  ssettings._instance_id = settings.instance._id
154
+ instance_id_hex = (
155
+ None if ssettings._instance_id is None else ssettings._instance_id.hex
156
+ )
153
157
  fields = {
154
158
  "id": id.hex,
155
159
  "lnid": ssettings.uid,
@@ -157,7 +161,7 @@ def _init_storage(ssettings: StorageSettings, client: Client) -> None:
157
161
  "root": root,
158
162
  "region": ssettings.region,
159
163
  "type": ssettings.type,
160
- "instance_id": ssettings._instance_id.hex,
164
+ "instance_id": instance_id_hex,
161
165
  # the empty string is important as we want the user flow to be through LaminHub
162
166
  # if this errors with unique constraint error, the user has to update
163
167
  # the description in LaminHub
@@ -0,0 +1,109 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, ClassVar, Optional
4
+ from urllib.parse import urlparse, urlunparse
5
+
6
+ from pydantic import BaseModel, Field, GetCoreSchemaHandler
7
+ from pydantic_core import CoreSchema, core_schema
8
+
9
+
10
+ def validate_schema_arg(schema: str | None = None) -> str:
11
+ if schema is None or schema == "":
12
+ return ""
13
+ # currently no actual validation, can add back if we see a need
14
+ # the following just strips white spaces
15
+ to_be_validated = [s.strip() for s in schema.split(",")]
16
+ return ",".join(to_be_validated)
17
+
18
+
19
+ def validate_db_arg(db: str | None) -> None:
20
+ if db is not None:
21
+ LaminDsnModel(db=db)
22
+
23
+
24
+ class LaminDsn(str):
25
+ allowed_schemes: ClassVar[set[str]] = {
26
+ "postgresql",
27
+ # future enabled schemes
28
+ # "snowflake",
29
+ # "bigquery"
30
+ }
31
+
32
+ @classmethod
33
+ def __get_pydantic_core_schema__(
34
+ cls, source_type: Any, handler: GetCoreSchemaHandler
35
+ ) -> CoreSchema:
36
+ return core_schema.no_info_after_validator_function(
37
+ cls.validate,
38
+ core_schema.str_schema(),
39
+ serialization=core_schema.plain_serializer_function_ser_schema(str),
40
+ )
41
+
42
+ @classmethod
43
+ def validate(cls, v: Any) -> LaminDsn:
44
+ if isinstance(v, str):
45
+ parsed = urlparse(v)
46
+ if parsed.scheme not in cls.allowed_schemes:
47
+ raise ValueError(f"Invalid scheme: {parsed.scheme}")
48
+ return cls(v)
49
+ elif isinstance(v, cls):
50
+ return v
51
+ else:
52
+ raise ValueError(f"Invalid value for LaminDsn: {v}")
53
+
54
+ @property
55
+ def user(self) -> str | None:
56
+ return urlparse(self).username
57
+
58
+ @property
59
+ def password(self) -> str | None:
60
+ return urlparse(self).password
61
+
62
+ @property
63
+ def host(self) -> str | None:
64
+ return urlparse(self).hostname
65
+
66
+ @property
67
+ def port(self) -> int | None:
68
+ return urlparse(self).port
69
+
70
+ @property
71
+ def database(self) -> str:
72
+ return urlparse(self).path.lstrip("/")
73
+
74
+ @property
75
+ def scheme(self) -> str:
76
+ return urlparse(self).scheme
77
+
78
+ @classmethod
79
+ def build(
80
+ cls,
81
+ *,
82
+ scheme: str,
83
+ user: str | None = None,
84
+ password: str | None = None,
85
+ host: str,
86
+ port: int | None = None,
87
+ database: str | None = None,
88
+ query: str | None = None,
89
+ fragment: str | None = None,
90
+ ) -> LaminDsn:
91
+ netloc = host
92
+ if port is not None:
93
+ netloc = f"{netloc}:{port}"
94
+ if user is not None:
95
+ auth = user
96
+ if password is not None:
97
+ auth = f"{auth}:{password}"
98
+ netloc = f"{auth}@{netloc}"
99
+
100
+ path = f"/{database}" if database else ""
101
+
102
+ url = urlunparse((scheme, netloc, path, "", query or "", fragment or ""))
103
+ return cls(url)
104
+
105
+
106
+ class LaminDsnModel(BaseModel):
107
+ db: LaminDsn = Field(..., description="The database DSN")
108
+
109
+ model_config = {"arbitrary_types_allowed": True}
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Optional
4
4
  from uuid import UUID, uuid4
5
5
 
6
6
  from lamin_utils import logger
7
- from pydantic.error_wrappers import ValidationError
7
+ from pydantic import ValidationError
8
8
 
9
9
  from ._settings_instance import InstanceSettings
10
10
  from ._settings_storage import StorageSettings
@@ -44,6 +44,8 @@ def save_settings(
44
44
  if type == Optional[bool]:
45
45
  type = bool
46
46
  if "__" not in store_key:
47
+ if store_key == "model_config":
48
+ continue
47
49
  if store_key == "storage_root":
48
50
  value = settings.storage.root_as_str
49
51
  elif store_key == "storage_region":
@@ -2,7 +2,7 @@ import os
2
2
  from pathlib import Path
3
3
  from typing import Optional
4
4
 
5
- from pydantic import BaseSettings
5
+ from pydantic_settings import BaseSettings, SettingsConfigDict
6
6
 
7
7
  if "LAMIN_SETTINGS_DIR" in os.environ:
8
8
  # Needed when running with AWS Lambda, as only tmp/ directory has a write access
@@ -58,10 +58,7 @@ class InstanceSettingsStore(BaseSettings):
58
58
  id: str
59
59
  git_repo: Optional[str]
60
60
  keep_artifacts_local: Optional[bool]
61
-
62
- class Config:
63
- env_prefix = "lamindb_instance_"
64
- env_file = ".env"
61
+ model_config = SettingsConfigDict(env_prefix="lamindb_instance_", env_file=".env")
65
62
 
66
63
 
67
64
  class UserSettingsStore(BaseSettings):
@@ -72,7 +69,4 @@ class UserSettingsStore(BaseSettings):
72
69
  uuid: str
73
70
  handle: str
74
71
  name: str
75
-
76
- class Config:
77
- env_prefix = "lamin_user_"
78
- env_file = ".env"
72
+ model_config = SettingsConfigDict(env_prefix="lamin_user_", env_file=".env")