lamindb 0.76.3__tar.gz → 0.76.4__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 (458) hide show
  1. {lamindb-0.76.3 → lamindb-0.76.4}/PKG-INFO +7 -7
  2. {lamindb-0.76.3 → lamindb-0.76.4}/docs/api.md +3 -17
  3. lamindb-0.76.4/docs/laminr.md +3 -0
  4. {lamindb-0.76.3 → lamindb-0.76.4}/docs/tutorial.ipynb +1 -1
  5. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/__init__.py +4 -7
  6. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_artifact.py +43 -30
  7. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_can_validate.py +20 -4
  8. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_curate.py +23 -6
  9. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_finish.py +96 -80
  10. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_query_set.py +41 -33
  11. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_record.py +3 -2
  12. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_transform.py +1 -2
  13. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/__init__.py +0 -2
  14. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_context.py +21 -11
  15. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_label_manager.py +1 -3
  16. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_anndata_accessor.py +6 -1
  17. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_tiledbsoma.py +24 -20
  18. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/versioning.py +4 -0
  19. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/integrations/_vitessce.py +1 -11
  20. {lamindb-0.76.3 → lamindb-0.76.4}/noxfile.py +1 -1
  21. {lamindb-0.76.3 → lamindb-0.76.4}/pyproject.toml +7 -7
  22. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/__init__.py +1 -1
  23. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/__init__.py +8 -21
  24. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/models.py +4 -4
  25. lamindb-0.76.4/sub/lamin-cli/lamin_cli/__init__.py +3 -0
  26. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/_cache.py +1 -1
  27. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/_get.py +18 -5
  28. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/_save.py +3 -7
  29. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_save_notebooks.py +42 -6
  30. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_save_scripts.py +6 -6
  31. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/07-keep-artifacts-local.ipynb +16 -12
  32. lamindb-0.76.4/sub/lamindb-setup/docs/hub-prod/test-init-load-local-anonymously.ipynb +140 -0
  33. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-insufficient-user-info.ipynb +2 -2
  34. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/notebooks.md +1 -0
  35. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/__init__.py +1 -1
  36. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_connect_instance.py +11 -4
  37. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_schema_metadata.py +31 -11
  38. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_setup_user.py +7 -5
  39. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_setup_bionty_sources.py +3 -1
  40. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_connect_instance.py +9 -0
  41. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/__init__.py +1 -1
  42. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/models.py +36 -40
  43. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_artifact.py +14 -5
  44. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_context.py +8 -4
  45. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_curate.py +25 -8
  46. {lamindb-0.76.3 → lamindb-0.76.4}/tests/storage/test_storage.py +5 -0
  47. lamindb-0.76.3/docs/readfcs.md +0 -3
  48. lamindb-0.76.3/sub/lamin-cli/lamin_cli/__init__.py +0 -3
  49. {lamindb-0.76.3 → lamindb-0.76.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  50. {lamindb-0.76.3 → lamindb-0.76.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  51. {lamindb-0.76.3 → lamindb-0.76.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  52. {lamindb-0.76.3 → lamindb-0.76.4}/.github/workflows/build.yml +0 -0
  53. {lamindb-0.76.3 → lamindb-0.76.4}/.github/workflows/doc-changes.yml +0 -0
  54. {lamindb-0.76.3 → lamindb-0.76.4}/.gitignore +0 -0
  55. {lamindb-0.76.3 → lamindb-0.76.4}/.gitmodules +0 -0
  56. {lamindb-0.76.3 → lamindb-0.76.4}/.pre-commit-config.yaml +0 -0
  57. {lamindb-0.76.3 → lamindb-0.76.4}/CONTRIBUTING.md +0 -0
  58. {lamindb-0.76.3 → lamindb-0.76.4}/LICENSE +0 -0
  59. {lamindb-0.76.3 → lamindb-0.76.4}/README.md +0 -0
  60. {lamindb-0.76.3 → lamindb-0.76.4}/docs/arrays.ipynb +0 -0
  61. {lamindb-0.76.3 → lamindb-0.76.4}/docs/bio-registries.ipynb +0 -0
  62. {lamindb-0.76.3 → lamindb-0.76.4}/docs/bionty.md +0 -0
  63. {lamindb-0.76.3 → lamindb-0.76.4}/docs/changelog.md +0 -0
  64. {lamindb-0.76.3 → lamindb-0.76.4}/docs/curate-any.ipynb +0 -0
  65. {lamindb-0.76.3 → lamindb-0.76.4}/docs/curate-df.ipynb +0 -0
  66. {lamindb-0.76.3 → lamindb-0.76.4}/docs/curate.md +0 -0
  67. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/acid.ipynb +0 -0
  68. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/delete.ipynb +0 -0
  69. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/idempotency.ipynb +0 -0
  70. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/import-schema.ipynb +0 -0
  71. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/keep-artifacts-local.ipynb +0 -0
  72. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/key.ipynb +0 -0
  73. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/reference-field.ipynb +0 -0
  74. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/setup.ipynb +0 -0
  75. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/test_notebooks.py +0 -0
  76. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/track-run-inputs.ipynb +0 -0
  77. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/visibility.ipynb +0 -0
  78. {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq.md +0 -0
  79. {lamindb-0.76.3 → lamindb-0.76.4}/docs/guide.md +0 -0
  80. {lamindb-0.76.3 → lamindb-0.76.4}/docs/includes/features-lamindb.md +0 -0
  81. {lamindb-0.76.3 → lamindb-0.76.4}/docs/includes/features-laminhub.md +0 -0
  82. {lamindb-0.76.3 → lamindb-0.76.4}/docs/includes/installation.md +0 -0
  83. {lamindb-0.76.3 → lamindb-0.76.4}/docs/index.md +0 -0
  84. {lamindb-0.76.3 → lamindb-0.76.4}/docs/introduction.ipynb +0 -0
  85. {lamindb-0.76.3 → lamindb-0.76.4}/docs/lamindb.md +0 -0
  86. {lamindb-0.76.3 → lamindb-0.76.4}/docs/query-search.md +0 -0
  87. {lamindb-0.76.3 → lamindb-0.76.4}/docs/records.ipynb +0 -0
  88. {lamindb-0.76.3 → lamindb-0.76.4}/docs/rest.md +0 -0
  89. {lamindb-0.76.3 → lamindb-0.76.4}/docs/schemas.ipynb +0 -0
  90. {lamindb-0.76.3 → lamindb-0.76.4}/docs/setup.ipynb +0 -0
  91. {lamindb-0.76.3 → lamindb-0.76.4}/docs/signup-login.md +0 -0
  92. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/add-replace-cache.ipynb +0 -0
  93. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/anndata-accessor.ipynb +0 -0
  94. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/prepare-transfer-local-to-cloud.ipynb +0 -0
  95. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/test-files/iris.csv +0 -0
  96. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/test-files/iris.data +0 -0
  97. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/test-files/new_iris.csv +0 -0
  98. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/test_notebooks.py +0 -0
  99. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/transfer-local-to-cloud.ipynb +0 -0
  100. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/upload.ipynb +0 -0
  101. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/vitessce.ipynb +0 -0
  102. {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage.md +0 -0
  103. {lamindb-0.76.3 → lamindb-0.76.4}/docs/test_notebooks.py +0 -0
  104. {lamindb-0.76.3 → lamindb-0.76.4}/docs/track.ipynb +0 -0
  105. {lamindb-0.76.3 → lamindb-0.76.4}/docs/transfer.ipynb +0 -0
  106. {lamindb-0.76.3 → lamindb-0.76.4}/docs/tutorial2.ipynb +0 -0
  107. {lamindb-0.76.3 → lamindb-0.76.4}/docs/wetlab.md +0 -0
  108. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_collection.py +0 -0
  109. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_feature.py +0 -0
  110. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_feature_set.py +0 -0
  111. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_filter.py +0 -0
  112. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_from_values.py +0 -0
  113. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_is_versioned.py +0 -0
  114. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_parents.py +0 -0
  115. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_query_manager.py +0 -0
  116. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_run.py +0 -0
  117. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_save.py +0 -0
  118. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_storage.py +0 -0
  119. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_ulabel.py +0 -0
  120. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_utils.py +0 -0
  121. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_view.py +0 -0
  122. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_data.py +0 -0
  123. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_feature_manager.py +0 -0
  124. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_mapped_collection.py +0 -0
  125. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_settings.py +0 -0
  126. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_sync_git.py +0 -0
  127. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_track_environment.py +0 -0
  128. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/datasets/__init__.py +0 -0
  129. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/datasets/_core.py +0 -0
  130. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/datasets/_fake.py +0 -0
  131. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/exceptions.py +0 -0
  132. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/fields.py +0 -0
  133. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/schema.py +0 -0
  134. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/__init__.py +0 -0
  135. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_anndata_sizes.py +0 -0
  136. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_backed_access.py +0 -0
  137. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_valid_suffixes.py +0 -0
  138. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_zarr.py +0 -0
  139. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/objects.py +0 -0
  140. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/paths.py +0 -0
  141. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/subsettings/__init__.py +0 -0
  142. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/subsettings/_creation_settings.py +0 -0
  143. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/subsettings/_transform_settings.py +0 -0
  144. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/types.py +0 -0
  145. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/integrations/__init__.py +0 -0
  146. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/setup/__init__.py +0 -0
  147. {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/setup/core/__init__.py +0 -0
  148. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.github/workflows/build.yml +0 -0
  149. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.github/workflows/doc-changes.yml +0 -0
  150. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.github/workflows/update_ontologies.yml +0 -0
  151. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.gitignore +0 -0
  152. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.pre-commit-config.yaml +0 -0
  153. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/LICENSE +0 -0
  154. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/README.md +0 -0
  155. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/_bionty.py +0 -0
  156. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_display_sources.py +0 -0
  157. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_ontology.py +0 -0
  158. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_public_ontology.py +0 -0
  159. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_settings.py +0 -0
  160. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_sync_sources.py +0 -0
  161. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/dev/__init__.py +0 -0
  162. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/dev/_handle_sources.py +0 -0
  163. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/dev/_io.py +0 -0
  164. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/dev/_md5.py +0 -0
  165. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/__init__.py +0 -0
  166. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_bfxpipeline.py +0 -0
  167. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_biosample.py +0 -0
  168. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_cellline.py +0 -0
  169. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_cellmarker.py +0 -0
  170. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_celltype.py +0 -0
  171. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_developmentalstage.py +0 -0
  172. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_disease.py +0 -0
  173. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_drug.py +0 -0
  174. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_ethnicity.py +0 -0
  175. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_experimentalfactor.py +0 -0
  176. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_gene.py +0 -0
  177. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_organism.py +0 -0
  178. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_pathway.py +0 -0
  179. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_phenotype.py +0 -0
  180. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_protein.py +0 -0
  181. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_shared_docstrings.py +0 -0
  182. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_tissue.py +0 -0
  183. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/bfxpipelines_info/custom_pipelines.json +0 -0
  184. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/check_ontologies_reachable.py +0 -0
  185. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/determine_md5s.py +0 -0
  186. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/generate_bfxpipelines.py +0 -0
  187. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/update_new_ontologies.py +0 -0
  188. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/upload_new_ontologies.py +0 -0
  189. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/sources.yaml +0 -0
  190. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/core/__init__.py +0 -0
  191. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/core/_add_ontology.py +0 -0
  192. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/core/_bionty.py +0 -0
  193. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/core/_settings.py +0 -0
  194. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/ids.py +0 -0
  195. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0023_rename_publicsource_encode_uid.py +0 -0
  196. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0024_remove_cellline_collections_and_more.py +0 -0
  197. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0025_artifactcellline_alter_cellline_artifacts_and_more.py +0 -0
  198. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0026_artifactcellline_cell_line_ref_is_name_and_more.py +0 -0
  199. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0027_remove_artifactcellline_created_at_and_more.py +0 -0
  200. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0028_artifactcellline_created_at_and_more.py +0 -0
  201. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0028_squashed.py +0 -0
  202. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0029_alter_cellline_previous_runs_and_more.py +0 -0
  203. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0030_rename_publicsource_source_and_more.py +0 -0
  204. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0031_alter_cellmarker_name_and_more.py +0 -0
  205. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0032_rename_source_name_source_description_and_more.py +0 -0
  206. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0033_alter_artifactcellline_artifact_and_more.py +0 -0
  207. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0034_alter_source_unique_together.py +0 -0
  208. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0035_alter_protein_gene_symbol.py +0 -0
  209. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0036_alter_source_artifacts_and_more.py +0 -0
  210. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0037_alter_cellline_source_alter_cellmarker_source_and_more.py +0 -0
  211. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/__init__.py +0 -0
  212. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide/concepts.md +0 -0
  213. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide/config.md +0 -0
  214. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide/extend.md +0 -0
  215. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide/test_notebooks.py +0 -0
  216. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide.md +0 -0
  217. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/index.md +0 -0
  218. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/reference.md +0 -0
  219. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/lamin-project.yaml +0 -0
  220. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/noxfile.py +0 -0
  221. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/pyproject.toml +0 -0
  222. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/dev/test_handle_sources.py +0 -0
  223. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/dev/test_io.py +0 -0
  224. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_bfxpipeline.py +0 -0
  225. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_biosample.py +0 -0
  226. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_cellline.py +0 -0
  227. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_cellmarker.py +0 -0
  228. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_celltype.py +0 -0
  229. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_developmentalstage.py +0 -0
  230. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_disease.py +0 -0
  231. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_drug.py +0 -0
  232. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_ethnicity.py +0 -0
  233. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_experimentalfactor.py +0 -0
  234. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_gene.py +0 -0
  235. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_organism.py +0 -0
  236. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_pathway.py +0 -0
  237. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_phenotype.py +0 -0
  238. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_protein.py +0 -0
  239. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_tissue.py +0 -0
  240. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/test_bionty.py +0 -0
  241. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/test_lamindb.py +0 -0
  242. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/test_md5.py +0 -0
  243. {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/test_ontology.py +0 -0
  244. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/.github/workflows/doc-changes.yml +0 -0
  245. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/.gitignore +0 -0
  246. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/.pre-commit-config.yaml +0 -0
  247. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/README.md +0 -0
  248. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/__main__.py +0 -0
  249. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/_migration.py +0 -0
  250. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/pyproject.toml +0 -0
  251. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/conftest.py +0 -0
  252. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/notebooks/not-initialized.ipynb +0 -0
  253. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/notebooks/with-title-and-initialized-consecutive.ipynb +0 -0
  254. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/notebooks/with-title-and-initialized-non-consecutive.ipynb +0 -0
  255. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/scripts/merely-import-lamindb.py +0 -0
  256. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/scripts/run-track-and-finish-sync-git.py +0 -0
  257. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/scripts/run-track-and-finish.py +0 -0
  258. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_cli.py +0 -0
  259. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_get.py +0 -0
  260. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_migrate.py +0 -0
  261. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_multi_process.py +0 -0
  262. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_save_files.py +0 -0
  263. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/.github/workflows/build.yml +0 -0
  264. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/.github/workflows/doc-changes.yml +0 -0
  265. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/.gitignore +0 -0
  266. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/.pre-commit-config.yaml +0 -0
  267. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/LICENSE +0 -0
  268. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/README.md +0 -0
  269. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/changelog.md +0 -0
  270. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/01-init-local-instance.ipynb +0 -0
  271. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/02-connect-local-instance.ipynb +0 -0
  272. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/03-add-managed-storage.ipynb +0 -0
  273. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/04-test-bionty.ipynb +0 -0
  274. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/05-init-hosted-instance.ipynb +0 -0
  275. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/06-connect-hosted-instance.ipynb +0 -0
  276. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/08-test-multi-session.ipynb +0 -0
  277. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/test_notebooks.py +0 -0
  278. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-cache-management.ipynb +0 -0
  279. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-cloud-sync.ipynb +0 -0
  280. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-connect-anonymously.ipynb +0 -0
  281. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-empty-init.ipynb +0 -0
  282. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-import-schema.ipynb +0 -0
  283. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-invalid-schema.ipynb +0 -0
  284. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-sqlite-lock.ipynb +0 -0
  285. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test_notebooks2.py +0 -0
  286. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/index.md +0 -0
  287. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/reference.md +0 -0
  288. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_cache.py +0 -0
  289. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_check.py +0 -0
  290. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_check_setup.py +0 -0
  291. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_close.py +0 -0
  292. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_delete.py +0 -0
  293. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_django.py +0 -0
  294. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_exportdb.py +0 -0
  295. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_importdb.py +0 -0
  296. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_init_instance.py +0 -0
  297. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_migrate.py +0 -0
  298. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_register_instance.py +0 -0
  299. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_schema.py +0 -0
  300. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_set_managed_storage.py +0 -0
  301. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_silence_loggers.py +0 -0
  302. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/__init__.py +0 -0
  303. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_aws_credentials.py +0 -0
  304. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_aws_storage.py +0 -0
  305. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_deprecated.py +0 -0
  306. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_docs.py +0 -0
  307. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_hub_client.py +0 -0
  308. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_hub_core.py +0 -0
  309. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_hub_crud.py +0 -0
  310. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_hub_utils.py +0 -0
  311. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_private_django_api.py +0 -0
  312. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings.py +0 -0
  313. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_instance.py +0 -0
  314. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_load.py +0 -0
  315. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_save.py +0 -0
  316. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_storage.py +0 -0
  317. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_store.py +0 -0
  318. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_user.py +0 -0
  319. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/cloud_sqlite_locker.py +0 -0
  320. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/django.py +0 -0
  321. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/exceptions.py +0 -0
  322. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/hashing.py +0 -0
  323. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/types.py +0 -0
  324. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/upath.py +0 -0
  325. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/noxfile.py +0 -0
  326. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/pyproject.toml +0 -0
  327. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/scripts/script-to-fail-managed-storage.py +0 -0
  328. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_delete_instance.py +0 -0
  329. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_fail_managed_storage.py +0 -0
  330. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_init_instance.py +0 -0
  331. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_login.py +0 -0
  332. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_migrate.py +0 -0
  333. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_set_storage.py +0 -0
  334. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-local/conftest.py +0 -0
  335. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-local/test_all.py +0 -0
  336. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-local/test_update_schema_in_hub.py +0 -0
  337. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/conftest.py +0 -0
  338. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/test_django.py +0 -0
  339. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/test_global_settings.py +0 -0
  340. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/test_switch_and_fallback_env.py +0 -0
  341. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/test_upath.py +0 -0
  342. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_hashing.py +0 -0
  343. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_storage_access.py +0 -0
  344. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_storage_basis.py +0 -0
  345. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_storage_stats.py +0 -0
  346. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_to_url.py +0 -0
  347. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/.github/workflows/build.yml +0 -0
  348. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/.github/workflows/doc-changes.yml +0 -0
  349. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/.gitignore +0 -0
  350. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/.pre-commit-config.yaml +0 -0
  351. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/CHANGELOG.md +0 -0
  352. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/LICENSE +0 -0
  353. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/README.md +0 -0
  354. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/ids.py +0 -0
  355. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0037_rename_dataset_to_collection.py +0 -0
  356. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0038_alter_collection_artifact_alter_collection_artifacts_and_more.py +0 -0
  357. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0039_remove_collection_artifacts_collectionartifact_and_more.py +0 -0
  358. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0040_alter_transform_type.py +0 -0
  359. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0041_remove_transform_short_name_transform_description_and_more.py +0 -0
  360. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0042_rename_run_at_run_started_at_run_finished_at.py +0 -0
  361. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0043_run_json.py +0 -0
  362. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0044_run_replicated_outputs_transform_ulabels_and_more.py +0 -0
  363. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0045_rename_replicated_outputs_run_replicated_output_artifacts_and_more.py +0 -0
  364. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0046_storage_instance_uid.py +0 -0
  365. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0047_featurevalue_artifactfeaturevalue_and_more.py +0 -0
  366. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0048_alter_artifactulabel_feature_and_more.py +0 -0
  367. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0049_rename_type_feature_dtype_and_more.py +0 -0
  368. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0050_artifactfeatureset_feature_ref_is_semantic_and_more.py +0 -0
  369. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0051_remove_feature_feature_sets_featuresetfeature_and_more.py +0 -0
  370. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0052_rename_feature_value_artifactfeaturevalue_featurevalue_and_more.py +0 -0
  371. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0052_squashed.py +0 -0
  372. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0053_alter_featureset_hash_alter_paramvalue_created_by_and_more.py +0 -0
  373. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0054_alter_feature_previous_runs_and_more.py +0 -0
  374. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0055_artifact_type_artifactparamvalue_and_more.py +0 -0
  375. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0056_rename_ulabel_ref_is_name_artifactulabel_label_ref_is_name_and_more.py +0 -0
  376. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0057_link_models_latest_report_and_others.py +0 -0
  377. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0058_artifact__actions_collection__actions.py +0 -0
  378. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0059_alter_artifact__accessor_alter_artifact__hash_type_and_more.py +0 -0
  379. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0060_alter_artifact__actions.py +0 -0
  380. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0061_alter_collection_meta_artifact_alter_run_environment_and_more.py +0 -0
  381. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0062_add_is_latest_field.py +0 -0
  382. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0063_populate_latest_field.py +0 -0
  383. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0064_alter_artifact_version_alter_collection_version_and_more.py +0 -0
  384. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/__init__.py +0 -0
  385. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/mocks.py +0 -0
  386. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/types.py +0 -0
  387. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/users.py +0 -0
  388. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/noxfile.py +0 -0
  389. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/pyproject.toml +0 -0
  390. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/tests/conftest.py +0 -0
  391. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/tests/test_integrity.py +0 -0
  392. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/tests/test_models.py +0 -0
  393. {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/tests/test_types.py +0 -0
  394. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/.github/workflows/build.yml +0 -0
  395. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/.github/workflows/doc-changes.yml +0 -0
  396. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/.gitignore +0 -0
  397. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/.pre-commit-config.yaml +0 -0
  398. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/README.md +0 -0
  399. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/changelog.md +0 -0
  400. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/guide/get-started.ipynb +0 -0
  401. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/guide/modeling_perturbations.ipynb +0 -0
  402. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/guide.md +0 -0
  403. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/index.md +0 -0
  404. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/reference.md +0 -0
  405. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/noxfile.py +0 -0
  406. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/pyproject.toml +0 -0
  407. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/tests/test_integrity.py +0 -0
  408. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/tests/test_notebooks.py +0 -0
  409. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/__init__.py +0 -0
  410. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0017_remove_biosample_artifacts.py +0 -0
  411. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0018_squashed.py +0 -0
  412. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0018_well_created_at_well_created_by_well_updated_at.py +0 -0
  413. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0019_alter_treatment_system.py +0 -0
  414. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0020_treatmenttarget_pathways_treatmenttarget_proteins_and_more.py +0 -0
  415. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0021_alter_compoundtreatment_duration_unit_and_more.py +0 -0
  416. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/__init__.py +0 -0
  417. {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/models.py +0 -0
  418. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/conftest.py +0 -0
  419. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/duplicate/with-title-initialized-consecutive-finish.ipynb +0 -0
  420. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/no-title.ipynb +0 -0
  421. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/not-initialized.ipynb +0 -0
  422. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/with-title-initialized-consecutive-finish-not-last-cell.ipynb +0 -0
  423. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/with-title-initialized-consecutive-finish.ipynb +0 -0
  424. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/duplicate1/script-to-test-versioning.py +0 -0
  425. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/duplicate2/script-to-test-versioning.py +0 -0
  426. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/duplicate3/script-to-test-versioning.py +0 -0
  427. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/script-to-test-filename-change.py +0 -0
  428. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/script-to-test-versioning.py +0 -0
  429. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_artifact_folders.py +0 -0
  430. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_cache.py +0 -0
  431. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_can_validate.py +0 -0
  432. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_collection.py +0 -0
  433. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_data.py +0 -0
  434. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_db.py +0 -0
  435. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_delete.py +0 -0
  436. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_feature.py +0 -0
  437. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_feature_manager.py +0 -0
  438. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_feature_set.py +0 -0
  439. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_from_values.py +0 -0
  440. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_label_manager.py +0 -0
  441. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_load.py +0 -0
  442. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_manager.py +0 -0
  443. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_notebooks.py +0 -0
  444. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_parents.py +0 -0
  445. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_queryset.py +0 -0
  446. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_record.py +0 -0
  447. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_run.py +0 -0
  448. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_save.py +0 -0
  449. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_search.py +0 -0
  450. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_settings.py +0 -0
  451. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_transfer.py +0 -0
  452. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_transform.py +0 -0
  453. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_uid.py +0 -0
  454. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_ulabel.py +0 -0
  455. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_versioning.py +0 -0
  456. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_view.py +0 -0
  457. {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_visibility.py +0 -0
  458. {lamindb-0.76.3 → lamindb-0.76.4}/tests/storage/conftest.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lamindb
3
- Version: 0.76.3
3
+ Version: 0.76.4
4
4
  Summary: A data framework for biology.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
6
  Requires-Python: >=3.8
@@ -9,22 +9,22 @@ Classifier: Programming Language :: Python :: 3.8
9
9
  Classifier: Programming Language :: Python :: 3.9
10
10
  Classifier: Programming Language :: Python :: 3.10
11
11
  Classifier: Programming Language :: Python :: 3.11
12
- Requires-Dist: lnschema_core==0.73.3
13
- Requires-Dist: lamindb_setup==0.76.7
12
+ Requires-Dist: lnschema_core==0.73.5
13
+ Requires-Dist: lamindb_setup==0.76.8
14
14
  Requires-Dist: lamin_utils==0.13.4
15
- Requires-Dist: lamin_cli==0.16.2
15
+ Requires-Dist: lamin_cli==0.17.0
16
16
  Requires-Dist: rapidfuzz
17
17
  Requires-Dist: pyarrow
18
18
  Requires-Dist: typing_extensions!=4.6.0
19
19
  Requires-Dist: python-dateutil
20
- Requires-Dist: anndata>=0.8.0,<=0.10.8
20
+ Requires-Dist: anndata>=0.8.0,<=0.10.9
21
21
  Requires-Dist: scipy<1.13.0rc1
22
22
  Requires-Dist: fsspec
23
23
  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.49.0 ; extra == "bionty"
27
+ Requires-Dist: bionty==0.49.1 ; 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"
@@ -38,7 +38,7 @@ 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
40
  Requires-Dist: nbproject==0.10.4 ; extra == "jupyter"
41
- Requires-Dist: nbstripout==0.6.1 ; extra == "jupyter"
41
+ Requires-Dist: jupytext ; extra == "jupyter"
42
42
  Requires-Dist: nbconvert ; extra == "jupyter"
43
43
  Requires-Dist: zarr>=2.16.0 ; extra == "zarr"
44
44
  Project-URL: Home, https://github.com/laminlabs/lamindb
@@ -12,33 +12,19 @@ cli
12
12
 
13
13
  ```{toctree}
14
14
  :maxdepth: 1
15
- :caption: Core API
15
+ :caption: Python
16
16
  :hidden:
17
17
 
18
18
  lamindb
19
- ```
20
-
21
- ```{toctree}
22
- :maxdepth: 1
23
- :caption: Plugins
24
- :hidden:
25
-
26
19
  bionty
27
20
  wetlab
28
21
  ```
29
22
 
30
23
  ```{toctree}
31
24
  :maxdepth: 1
32
- :caption: SDK
25
+ :caption: R & REST
33
26
  :hidden:
34
27
 
28
+ laminr
35
29
  rest
36
30
  ```
37
-
38
- ```{toctree}
39
- :maxdepth: 1
40
- :caption: Utilities
41
- :hidden:
42
-
43
- readfcs
44
- ```
@@ -0,0 +1,3 @@
1
+ # `laminr`
2
+
3
+ [github.com/laminlabs/laminr](https://github.com/laminlabs/laminr)
@@ -364,7 +364,7 @@
364
364
  "cell_type": "markdown",
365
365
  "metadata": {},
366
366
  "source": [
367
- "Visualize data lineage with {meth}`~lamindb.core.HasFeatures.view_lineage`:"
367
+ "Visualize data lineage with {meth}`~lamindb.Artifact.view_lineage`:"
368
368
  ]
369
369
  },
370
370
  {
@@ -1,7 +1,6 @@
1
1
  """A data framework for biology.
2
2
 
3
- Records
4
- =======
3
+ Core registries.
5
4
 
6
5
  .. autosummary::
7
6
  :toctree: .
@@ -17,8 +16,7 @@ Records
17
16
  FeatureSet
18
17
  Param
19
18
 
20
- Key functionality
21
- =================
19
+ Key functionality.
22
20
 
23
21
  .. autosummary::
24
22
  :toctree: .
@@ -29,8 +27,7 @@ Key functionality
29
27
  view
30
28
  save
31
29
 
32
- Modules & settings
33
- ==================
30
+ Modules and settings.
34
31
 
35
32
  .. autosummary::
36
33
  :toctree: .
@@ -44,7 +41,7 @@ Modules & settings
44
41
  """
45
42
 
46
43
  # denote a release candidate for 0.1.0 with 0.1rc1, 0.1a1, 0.1b1, etc.
47
- __version__ = "0.76.3"
44
+ __version__ = "0.76.4"
48
45
 
49
46
  import os as _os
50
47
 
@@ -366,11 +366,6 @@ def get_artifact_kwargs_from_data(
366
366
  else:
367
367
  storage = default_storage
368
368
 
369
- # for now comment out this error to allow creating new versions of stores
370
- # in the default folder (.lamindb)
371
- # if key is not None and key.startswith(AUTO_KEY_PREFIX):
372
- # raise ValueError(f"Key cannot start with {AUTO_KEY_PREFIX}")
373
-
374
369
  log_storage_hint(
375
370
  check_path_in_storage=check_path_in_storage,
376
371
  storage=storage,
@@ -542,10 +537,10 @@ def __init__(artifact: Artifact, *args, **kwargs):
542
537
  else VisibilityChoice.default.value
543
538
  )
544
539
  format = kwargs.pop("format") if "format" in kwargs else None
540
+ _is_internal_call = kwargs.pop("_is_internal_call", False)
545
541
  skip_check_exists = (
546
542
  kwargs.pop("skip_check_exists") if "skip_check_exists" in kwargs else False
547
543
  )
548
- _uid = kwargs.pop("_uid", None)
549
544
  if "default_storage" in kwargs:
550
545
  default_storage = kwargs.pop("default_storage")
551
546
  else:
@@ -561,9 +556,6 @@ def __init__(artifact: Artifact, *args, **kwargs):
561
556
  if "is_new_version_of" in kwargs:
562
557
  logger.warning("`is_new_version_of` will be removed soon, please use `revises`")
563
558
  revises = kwargs.pop("is_new_version_of")
564
- assert not ( # noqa: S101
565
- revises is not None and _uid is not None
566
- ), "Can not init with both `revises` and `_uid`"
567
559
  if not len(kwargs) == 0:
568
560
  raise ValueError(
569
561
  "Only data, key, run, description, version, revises, visibility"
@@ -579,15 +571,29 @@ def __init__(artifact: Artifact, *args, **kwargs):
579
571
  raise ValueError(
580
572
  f"`key` is {key}, but `revises.key` is '{revises.key}'\n\n Either do *not* pass `key`.\n\n{note}"
581
573
  )
582
- if _uid is not None:
583
- provisional_uid, revises = _uid, None
584
- else:
585
- provisional_uid, revises = create_uid(revises=revises, version=version)
586
574
  if revises is not None:
587
575
  if not isinstance(revises, Artifact):
588
576
  raise TypeError("`revises` has to be of type `Artifact`")
589
577
  if description is None:
590
578
  description = revises.description
579
+ if key is not None and AUTO_KEY_PREFIX in key:
580
+ raise ValueError(
581
+ f"Do not pass key that contains a managed storage path in `{AUTO_KEY_PREFIX}`"
582
+ )
583
+ # below is for internal calls that require defining the storage location
584
+ # ahead of constructing the Artifact
585
+ if isinstance(data, (str, Path)) and AUTO_KEY_PREFIX in str(data):
586
+ if _is_internal_call:
587
+ is_automanaged_path = True
588
+ user_provided_key = key
589
+ key = None
590
+ else:
591
+ raise ValueError(
592
+ f"Do not pass path inside the `{AUTO_KEY_PREFIX}` directory."
593
+ )
594
+ else:
595
+ is_automanaged_path = False
596
+ provisional_uid, revises = create_uid(revises=revises, version=version)
591
597
  kwargs_or_artifact, privates = get_artifact_kwargs_from_data(
592
598
  data=data,
593
599
  key=key,
@@ -615,16 +621,29 @@ def __init__(artifact: Artifact, *args, **kwargs):
615
621
  else:
616
622
  kwargs = kwargs_or_artifact
617
623
 
624
+ if data is not None:
625
+ artifact._local_filepath = privates["local_filepath"]
626
+ artifact._cloud_filepath = privates["cloud_filepath"]
627
+ artifact._memory_rep = privates["memory_rep"]
628
+ artifact._to_store = not privates["check_path_in_storage"]
629
+
630
+ if is_automanaged_path and _is_internal_call:
631
+ kwargs["_key_is_virtual"] = True
632
+ assert AUTO_KEY_PREFIX in kwargs["key"] # noqa: S101
633
+ uid = kwargs["key"].replace(AUTO_KEY_PREFIX, "").replace(kwargs["suffix"], "")
634
+ kwargs["key"] = user_provided_key
635
+ if revises is not None:
636
+ assert uid.startswith(revises.stem_uid) # noqa: S101
637
+ if len(uid) == 16:
638
+ if revises is None:
639
+ uid += "0000"
640
+ else:
641
+ uid, revises = create_uid(revises=revises, version=version)
642
+ kwargs["uid"] = uid
643
+
618
644
  # only set key now so that we don't do a look-up on it in case revises is passed
619
645
  if revises is not None:
620
646
  kwargs["key"] = revises.key
621
- # in case we have a new version of a folder with a different hash, print a
622
- # warning that the old version can't be recovered
623
- if revises is not None and revises.n_objects is not None and revises.n_objects > 1:
624
- logger.warning(
625
- f"artifact version {version} will _update_ the state of folder {revises.path} - "
626
- "to _retain_ the old state by duplicating the entire folder, do _not_ pass `revises`"
627
- )
628
647
 
629
648
  kwargs["type"] = type
630
649
  kwargs["version"] = version
@@ -643,12 +662,6 @@ def __init__(artifact: Artifact, *args, **kwargs):
643
662
 
644
663
  add_transform_to_kwargs(kwargs, kwargs["run"])
645
664
 
646
- if data is not None:
647
- artifact._local_filepath = privates["local_filepath"]
648
- artifact._cloud_filepath = privates["cloud_filepath"]
649
- artifact._memory_rep = privates["memory_rep"]
650
- artifact._to_store = not privates["check_path_in_storage"]
651
-
652
665
  super(Artifact, artifact).__init__(**kwargs)
653
666
 
654
667
 
@@ -943,10 +956,9 @@ def open(
943
956
  if self.hash != hash:
944
957
  from ._record import init_self_from_db
945
958
 
946
- logger.warning(
947
- "The hash of the tiledbsoma store has changed, creating a new version of the artifact."
948
- )
949
- new_version = Artifact(filepath, revises=self).save()
959
+ new_version = Artifact(
960
+ filepath, revises=self, _is_internal_call=True
961
+ ).save()
950
962
  init_self_from_db(self, new_version)
951
963
 
952
964
  if localpath != filepath and localpath.exists():
@@ -1174,3 +1186,4 @@ Artifact._delete_skip_storage = _delete_skip_storage
1174
1186
  Artifact._save_skip_storage = _save_skip_storage
1175
1187
  Artifact.path = path
1176
1188
  Artifact.backed = backed
1189
+ Artifact.view_lineage = HasFeatures.view_lineage
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Iterable, Literal
3
+ from typing import TYPE_CHECKING, Literal
4
4
 
5
5
  import lamindb_setup as ln_setup
6
6
  import numpy as np
@@ -79,6 +79,19 @@ def _check_organism_db(organism: Record, using_key: str | None):
79
79
  )
80
80
 
81
81
 
82
+ def _concat_lists(values: ListLike) -> list[str]:
83
+ """Concatenate a list of lists of strings into a single list."""
84
+ if len(values) > 0 and isinstance(values, (list, pd.Series)):
85
+ try:
86
+ if isinstance(values[0], list):
87
+ if isinstance(values, pd.Series):
88
+ values = values.tolist()
89
+ values = sum([v for v in values if isinstance(v, list)], [])
90
+ except KeyError:
91
+ pass
92
+ return values
93
+
94
+
82
95
  def _inspect(
83
96
  cls,
84
97
  values: ListLike,
@@ -94,6 +107,7 @@ def _inspect(
94
107
 
95
108
  if isinstance(values, str):
96
109
  values = [values]
110
+ values = _concat_lists(values)
97
111
 
98
112
  field = get_name_field(cls, field=field)
99
113
  queryset = _queryset(cls, using_key)
@@ -184,6 +198,7 @@ def _validate(
184
198
  return_str = True if isinstance(values, str) else False
185
199
  if isinstance(values, str):
186
200
  values = [values]
201
+ values = _concat_lists(values)
187
202
 
188
203
  field = get_name_field(cls, field=field)
189
204
 
@@ -229,7 +244,7 @@ def _validate(
229
244
  @doc_args(CanValidate.standardize.__doc__)
230
245
  def standardize(
231
246
  cls,
232
- values: Iterable,
247
+ values: ListLike,
233
248
  field: str | StrField | None = None,
234
249
  *,
235
250
  return_field: str = None,
@@ -295,7 +310,7 @@ def remove_synonym(self, synonym: str | ListLike):
295
310
 
296
311
  def _standardize(
297
312
  cls,
298
- values: Iterable,
313
+ values: ListLike,
299
314
  field: str | StrField | None = None,
300
315
  *,
301
316
  return_field: str = None,
@@ -315,6 +330,7 @@ def _standardize(
315
330
  return_str = True if isinstance(values, str) else False
316
331
  if isinstance(values, str):
317
332
  values = [values]
333
+ values = _concat_lists(values)
318
334
 
319
335
  field = get_name_field(cls, field=field)
320
336
  return_field = get_name_field(
@@ -416,7 +432,7 @@ def _standardize(
416
432
 
417
433
 
418
434
  def _add_or_remove_synonyms(
419
- synonym: str | Iterable,
435
+ synonym: str | ListLike,
420
436
  record: Record,
421
437
  action: Literal["add", "remove"],
422
438
  force: bool = False,
@@ -144,6 +144,7 @@ class DataFrameCurator(BaseCurator):
144
144
  organism: str | None = None,
145
145
  sources: dict[str, Record] | None = None,
146
146
  exclude: dict | None = None,
147
+ check_valid_keys: bool = True,
147
148
  ) -> None:
148
149
  from lamindb.core._settings import settings
149
150
 
@@ -163,6 +164,8 @@ class DataFrameCurator(BaseCurator):
163
164
  exclude = {}
164
165
  self._exclude = exclude
165
166
  self._non_validated = None
167
+ if check_valid_keys:
168
+ self._check_valid_keys()
166
169
  self._save_columns()
167
170
 
168
171
  @property
@@ -191,14 +194,25 @@ class DataFrameCurator(BaseCurator):
191
194
  using_key=using_key or self._using_key,
192
195
  )
193
196
 
197
+ def _check_valid_keys(self, extra: set = None) -> None:
198
+ if extra is None:
199
+ extra = set()
200
+ for name, d in {
201
+ "categoricals": self._fields,
202
+ "sources": self._sources,
203
+ "exclude": self._exclude,
204
+ }.items():
205
+ if not isinstance(d, dict):
206
+ raise TypeError(f"{name} must be a dictionary!")
207
+ valid_keys = set(self._df.columns) | {"columns"} | extra
208
+ nonval_keys = [key for key in d.keys() if key not in valid_keys]
209
+ if len(nonval_keys) > 0:
210
+ raise ValueError(
211
+ f"the following keys passed to {name} are not allowed: {nonval_keys}"
212
+ )
213
+
194
214
  def _save_columns(self, validated_only: bool = True, **kwargs) -> None:
195
215
  """Save column name records."""
196
- missing_columns = set(self.fields.keys()) - set(self._df.columns)
197
- if missing_columns:
198
- raise ValueError(
199
- f"Columns {missing_columns} are not found in the data object!"
200
- )
201
-
202
216
  # Always save features specified as the fields keys
203
217
  update_registry(
204
218
  values=list(self.fields.keys()),
@@ -426,8 +440,10 @@ class AnnDataCurator(DataFrameCurator):
426
440
  organism=organism,
427
441
  sources=sources,
428
442
  exclude=exclude,
443
+ check_valid_keys=False,
429
444
  )
430
445
  self._obs_fields = categoricals
446
+ self._check_valid_keys(extra={"var_index"})
431
447
 
432
448
  @property
433
449
  def var_index(self) -> FieldAttr:
@@ -633,6 +649,7 @@ class MuDataCurator:
633
649
  verbosity=verbosity,
634
650
  sources=self._sources.get(modality),
635
651
  exclude=self._exclude.get(modality),
652
+ check_valid_keys=False,
636
653
  **self._kwargs,
637
654
  )
638
655
  for modality in self._modalities
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import os
4
+ import re
4
5
  import shutil
5
- import subprocess
6
6
  from datetime import datetime, timezone
7
7
  from typing import TYPE_CHECKING
8
8
 
@@ -18,12 +18,81 @@ if TYPE_CHECKING:
18
18
  from ._query_set import QuerySet
19
19
 
20
20
 
21
+ # this is from the get_title function in nbproject
22
+ # should be moved into lamindb sooner or later
23
+ def prepare_notebook(
24
+ nb,
25
+ strip_title: bool = False,
26
+ ) -> str | None:
27
+ """Strip title from the notebook if requested."""
28
+ title_found = False
29
+ for cell in nb.cells:
30
+ cell.metadata.clear() # strip cell metadata
31
+ if not title_found and cell["cell_type"] == "markdown":
32
+ lines = cell["source"].split("\n")
33
+ for i, line in enumerate(lines):
34
+ if line.startswith("# "):
35
+ line.lstrip("#").strip(" .").strip()
36
+ title_found = True
37
+ if strip_title:
38
+ lines.pop(i)
39
+ cell["source"] = "\n".join(lines)
40
+ return None
41
+
42
+
43
+ def notebook_to_report(notebook_path: Path, output_path: Path) -> None:
44
+ import nbformat
45
+ import traitlets.config as config
46
+ from nbconvert import HTMLExporter
47
+
48
+ with open(notebook_path, encoding="utf-8") as f:
49
+ notebook = nbformat.read(f, as_version=4)
50
+ prepare_notebook(notebook, strip_title=True)
51
+ notebook.metadata.clear() # strip notebook metadata
52
+ # if we were to export as ipynb, the following two lines would do it
53
+ # with open(output_path, "w", encoding="utf-8") as f:
54
+ # nbformat.write(notebook, f)
55
+ # instead we need all this code
56
+ c = config.Config()
57
+ c.HTMLExporter.preprocessors = []
58
+ c.HTMLExporter.exclude_input_prompt = True
59
+ c.HTMLExporter.exclude_output_prompt = True
60
+ c.HTMLExporter.anchor_link_text = " "
61
+ html_exporter = HTMLExporter(config=c)
62
+ html, _ = html_exporter.from_notebook_node(notebook)
63
+ output_path.write_text(html, encoding="utf-8")
64
+
65
+
66
+ def notebook_to_script(
67
+ transform: Transform, notebook_path: Path, script_path: Path
68
+ ) -> None:
69
+ import jupytext
70
+
71
+ notebook = jupytext.read(notebook_path)
72
+ py_content = jupytext.writes(notebook, fmt="py:percent")
73
+ # remove global metadata header
74
+ py_content = re.sub(r"^# ---\n.*?# ---\n\n", "", py_content, flags=re.DOTALL)
75
+ # replace title
76
+ py_content = py_content.replace(f"# # {transform.name}", "# # transform.name")
77
+ script_path.write_text(py_content)
78
+
79
+
80
+ def script_to_notebook(transform: Transform, notebook_path: Path) -> None:
81
+ import jupytext
82
+
83
+ # get title back
84
+ py_content = transform.source_code.replace(
85
+ "# # transform.name", f"# # {transform.name}"
86
+ )
87
+ notebook = jupytext.reads(py_content, fmt="py:percent")
88
+ jupytext.write(notebook, notebook_path)
89
+
90
+
21
91
  def save_context_core(
22
92
  *,
23
93
  run: Run,
24
94
  transform: Transform,
25
95
  filepath: Path,
26
- transform_family: QuerySet | None = None,
27
96
  finished_at: bool = False,
28
97
  from_cli: bool = False,
29
98
  ) -> str | None:
@@ -36,19 +105,17 @@ def save_context_core(
36
105
  # for scripts, things are easy
37
106
  is_consecutive = True
38
107
  is_notebook = transform.type == "notebook"
39
- _source_code_artifact_path = filepath
108
+ source_code_path = filepath
40
109
  # for notebooks, we need more work
41
110
  if is_notebook:
42
111
  try:
43
- import nbstripout
112
+ import jupytext
44
113
  from nbproject.dev import (
45
114
  check_consecutiveness,
46
115
  read_notebook,
47
116
  )
48
117
  except ImportError:
49
- logger.error(
50
- "install nbproject & nbstripout: pip install nbproject nbstripout"
51
- )
118
+ logger.error("install nbproject & jupytext: pip install nbproject jupytext")
52
119
  return None
53
120
  notebook_content = read_notebook(filepath) # type: ignore
54
121
  is_consecutive = check_consecutiveness(
@@ -62,66 +129,30 @@ def save_context_core(
62
129
  response = "n"
63
130
  if response != "y":
64
131
  return "aborted-non-consecutive"
65
- # convert the notebook file to html
66
- # log_level is set to 40 to silence the nbconvert logging
67
- subprocess.run(
68
- [
69
- "jupyter",
70
- "nbconvert",
71
- "--to",
72
- "html",
73
- filepath.as_posix(),
74
- "--Application.log_level=40",
75
- ],
76
- check=True,
132
+ # write the report
133
+ report_path = ln_setup.settings.storage.cache_dir / filepath.name.replace(
134
+ ".ipynb", ".html"
77
135
  )
78
- # move the temporary file into the cache dir in case it's accidentally
79
- # in an existing storage location -> we want to move associated
80
- # artifacts into default storage and not register them in an existing
81
- # location
82
- report_path_orig = filepath.with_suffix(".html") # current location
83
- report_path = ln_setup.settings.storage.cache_dir / report_path_orig.name
84
- # don't use Path.rename here because of cross-device link error
85
- # https://laminlabs.slack.com/archives/C04A0RMA0SC/p1710259102686969
86
- shutil.move(
87
- report_path_orig, # type: ignore
88
- report_path,
136
+ notebook_to_report(filepath, report_path)
137
+ # write the source code
138
+ source_code_path = ln_setup.settings.storage.cache_dir / filepath.name.replace(
139
+ ".ipynb", ".py"
89
140
  )
90
- # strip the output from the notebook to create the source code file
91
- # first, copy the notebook file to a temporary file in the cache
92
- _source_code_artifact_path = ln_setup.settings.storage.cache_dir / filepath.name
93
- shutil.copy2(filepath, _source_code_artifact_path) # copy
94
- subprocess.run(
95
- [
96
- "nbstripout",
97
- _source_code_artifact_path,
98
- "--extra-keys",
99
- "metadata.version metadata.kernelspec metadata.language_info metadata.pygments_lexer metadata.name metadata.file_extension",
100
- ],
101
- check=True,
102
- )
103
- # find initial versions of source codes and html reports
104
- prev_report = None
105
- prev_source = None
106
- if transform_family is None:
107
- transform_family = transform.versions
108
- if len(transform_family) > 0:
109
- for prev_transform in transform_family.order_by("-created_at"):
110
- if (
111
- prev_transform.latest_run is not None
112
- and prev_transform.latest_run.report_id is not None
113
- ):
114
- prev_report = prev_transform.latest_run.report
115
- if prev_transform._source_code_artifact_id is not None:
116
- prev_source = prev_transform._source_code_artifact
141
+ notebook_to_script(transform, filepath, source_code_path)
117
142
  ln.settings.creation.artifact_silence_missing_run_warning = True
118
-
119
143
  # track source code
120
- if transform._source_code_artifact_id is not None:
144
+ hash, _ = hash_file(source_code_path) # ignore hash_type for now
145
+ if (
146
+ transform._source_code_artifact_id is not None
147
+ or transform.source_code is not None
148
+ ):
121
149
  # check if the hash of the transform source code matches
122
150
  # (for scripts, we already run the same logic in track() - we can deduplicate the call at some point)
123
- hash, _ = hash_file(_source_code_artifact_path) # ignore hash_type for now
124
- if hash != transform._source_code_artifact.hash:
151
+ if transform.hash is not None:
152
+ condition = hash != transform.hash
153
+ else:
154
+ condition = hash != transform._source_code_artifact.hash
155
+ if condition:
125
156
  if os.getenv("LAMIN_TESTING") is None:
126
157
  # in test, auto-confirm overwrite
127
158
  response = input(
@@ -131,11 +162,8 @@ def save_context_core(
131
162
  else:
132
163
  response = "y"
133
164
  if response == "y":
134
- transform._source_code_artifact.replace(_source_code_artifact_path)
135
- transform._source_code_artifact.save(upload=True)
136
- logger.success(
137
- f"replaced transform._source_code_artifact: {transform._source_code_artifact}"
138
- )
165
+ transform.source_code = source_code_path.read_text()
166
+ transform.hash = hash
139
167
  else:
140
168
  logger.warning(
141
169
  "Please re-run `ln.context.track()` to make a new version"
@@ -144,19 +172,8 @@ def save_context_core(
144
172
  else:
145
173
  logger.important("source code is already saved")
146
174
  else:
147
- _source_code_artifact = ln.Artifact(
148
- _source_code_artifact_path,
149
- description=f"Source of transform {transform.uid}",
150
- version=transform.version,
151
- revises=prev_source,
152
- visibility=0, # hidden file
153
- run=False,
154
- )
155
- _source_code_artifact.save(upload=True, print_progress=False)
156
- transform._source_code_artifact = _source_code_artifact
157
- logger.debug(
158
- f"saved transform._source_code_artifact: {transform._source_code_artifact}"
159
- )
175
+ transform.source_code = source_code_path.read_text()
176
+ transform.hash = hash
160
177
 
161
178
  # track environment
162
179
  env_path = ln_setup.settings.storage.cache_dir / f"run_env_pip_{run.uid}.txt"
@@ -211,7 +228,6 @@ def save_context_core(
211
228
  report_file = ln.Artifact(
212
229
  report_path,
213
230
  description=f"Report of run {run.uid}",
214
- revises=prev_report,
215
231
  visibility=0, # hidden file
216
232
  run=False,
217
233
  )