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.
- {lamindb-0.76.3 → lamindb-0.76.4}/PKG-INFO +7 -7
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/api.md +3 -17
- lamindb-0.76.4/docs/laminr.md +3 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/tutorial.ipynb +1 -1
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/__init__.py +4 -7
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_artifact.py +43 -30
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_can_validate.py +20 -4
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_curate.py +23 -6
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_finish.py +96 -80
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_query_set.py +41 -33
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_record.py +3 -2
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_transform.py +1 -2
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/__init__.py +0 -2
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_context.py +21 -11
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_label_manager.py +1 -3
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_anndata_accessor.py +6 -1
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_tiledbsoma.py +24 -20
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/versioning.py +4 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/integrations/_vitessce.py +1 -11
- {lamindb-0.76.3 → lamindb-0.76.4}/noxfile.py +1 -1
- {lamindb-0.76.3 → lamindb-0.76.4}/pyproject.toml +7 -7
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/__init__.py +1 -1
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/__init__.py +8 -21
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/models.py +4 -4
- lamindb-0.76.4/sub/lamin-cli/lamin_cli/__init__.py +3 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/_cache.py +1 -1
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/_get.py +18 -5
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/_save.py +3 -7
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_save_notebooks.py +42 -6
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_save_scripts.py +6 -6
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/07-keep-artifacts-local.ipynb +16 -12
- lamindb-0.76.4/sub/lamindb-setup/docs/hub-prod/test-init-load-local-anonymously.ipynb +140 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-insufficient-user-info.ipynb +2 -2
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/notebooks.md +1 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/__init__.py +1 -1
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_connect_instance.py +11 -4
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_schema_metadata.py +31 -11
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_setup_user.py +7 -5
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_setup_bionty_sources.py +3 -1
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_connect_instance.py +9 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/__init__.py +1 -1
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/models.py +36 -40
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_artifact.py +14 -5
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_context.py +8 -4
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_curate.py +25 -8
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/storage/test_storage.py +5 -0
- lamindb-0.76.3/docs/readfcs.md +0 -3
- lamindb-0.76.3/sub/lamin-cli/lamin_cli/__init__.py +0 -3
- {lamindb-0.76.3 → lamindb-0.76.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/.github/workflows/build.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/.github/workflows/doc-changes.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/.gitignore +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/.gitmodules +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/.pre-commit-config.yaml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/CONTRIBUTING.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/LICENSE +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/README.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/arrays.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/bio-registries.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/bionty.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/changelog.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/curate-any.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/curate-df.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/curate.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/acid.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/delete.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/idempotency.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/import-schema.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/keep-artifacts-local.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/key.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/reference-field.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/setup.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/test_notebooks.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/track-run-inputs.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq/visibility.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/faq.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/guide.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/includes/features-lamindb.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/includes/features-laminhub.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/includes/installation.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/index.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/introduction.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/lamindb.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/query-search.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/records.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/rest.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/schemas.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/setup.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/signup-login.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/add-replace-cache.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/anndata-accessor.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/prepare-transfer-local-to-cloud.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/test-files/iris.csv +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/test-files/iris.data +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/test-files/new_iris.csv +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/test_notebooks.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/transfer-local-to-cloud.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/upload.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage/vitessce.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/storage.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/test_notebooks.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/track.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/transfer.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/tutorial2.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/docs/wetlab.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_collection.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_feature.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_feature_set.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_filter.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_from_values.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_is_versioned.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_parents.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_query_manager.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_run.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_save.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_storage.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_ulabel.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_utils.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/_view.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_data.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_feature_manager.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_mapped_collection.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_settings.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_sync_git.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/_track_environment.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/datasets/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/datasets/_core.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/datasets/_fake.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/exceptions.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/fields.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/schema.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_anndata_sizes.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_backed_access.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_valid_suffixes.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/_zarr.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/objects.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/storage/paths.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/subsettings/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/subsettings/_creation_settings.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/subsettings/_transform_settings.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/core/types.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/integrations/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/setup/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/lamindb/setup/core/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.github/workflows/build.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.github/workflows/doc-changes.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.github/workflows/update_ontologies.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.gitignore +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/.pre-commit-config.yaml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/LICENSE +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/README.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/_bionty.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_display_sources.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_ontology.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_public_ontology.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_settings.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/_sync_sources.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/dev/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/dev/_handle_sources.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/dev/_io.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/dev/_md5.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_bfxpipeline.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_biosample.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_cellline.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_cellmarker.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_celltype.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_developmentalstage.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_disease.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_drug.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_ethnicity.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_experimentalfactor.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_gene.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_organism.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_pathway.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_phenotype.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_protein.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_shared_docstrings.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/entities/_tissue.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/bfxpipelines_info/custom_pipelines.json +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/check_ontologies_reachable.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/determine_md5s.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/generate_bfxpipelines.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/update_new_ontologies.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/scripts/upload_new_ontologies.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/base/sources.yaml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/core/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/core/_add_ontology.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/core/_bionty.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/core/_settings.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/ids.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0023_rename_publicsource_encode_uid.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0024_remove_cellline_collections_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0025_artifactcellline_alter_cellline_artifacts_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0026_artifactcellline_cell_line_ref_is_name_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0027_remove_artifactcellline_created_at_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0028_artifactcellline_created_at_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0028_squashed.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0029_alter_cellline_previous_runs_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0030_rename_publicsource_source_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0031_alter_cellmarker_name_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0032_rename_source_name_source_description_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0033_alter_artifactcellline_artifact_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0034_alter_source_unique_together.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0035_alter_protein_gene_symbol.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0036_alter_source_artifacts_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/0037_alter_cellline_source_alter_cellmarker_source_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/bionty/migrations/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide/concepts.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide/config.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide/extend.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide/test_notebooks.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/guide.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/index.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/docs/reference.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/lamin-project.yaml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/noxfile.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/pyproject.toml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/dev/test_handle_sources.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/dev/test_io.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_bfxpipeline.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_biosample.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_cellline.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_cellmarker.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_celltype.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_developmentalstage.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_disease.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_drug.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_ethnicity.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_experimentalfactor.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_gene.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_organism.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_pathway.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_phenotype.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_protein.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/entities/test_tissue.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/test_bionty.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/test_lamindb.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/test_md5.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/bionty/tests/test_ontology.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/.github/workflows/doc-changes.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/.gitignore +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/.pre-commit-config.yaml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/README.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/__main__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/lamin_cli/_migration.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/pyproject.toml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/conftest.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/notebooks/not-initialized.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/notebooks/with-title-and-initialized-consecutive.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/notebooks/with-title-and-initialized-non-consecutive.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/scripts/merely-import-lamindb.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/scripts/run-track-and-finish-sync-git.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/scripts/run-track-and-finish.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_cli.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_get.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_migrate.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_multi_process.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamin-cli/tests/test_save_files.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/.github/workflows/build.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/.github/workflows/doc-changes.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/.gitignore +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/.pre-commit-config.yaml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/LICENSE +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/README.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/changelog.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/01-init-local-instance.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/02-connect-local-instance.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/03-add-managed-storage.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/04-test-bionty.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/05-init-hosted-instance.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/06-connect-hosted-instance.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/08-test-multi-session.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-cloud/test_notebooks.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-cache-management.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-cloud-sync.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-connect-anonymously.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-empty-init.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-import-schema.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-invalid-schema.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test-sqlite-lock.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/hub-prod/test_notebooks2.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/index.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/docs/reference.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_cache.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_check.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_check_setup.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_close.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_delete.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_django.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_exportdb.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_importdb.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_init_instance.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_migrate.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_register_instance.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_schema.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_set_managed_storage.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/_silence_loggers.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_aws_credentials.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_aws_storage.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_deprecated.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_docs.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_hub_client.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_hub_core.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_hub_crud.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_hub_utils.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_private_django_api.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_instance.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_load.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_save.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_storage.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_store.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/_settings_user.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/cloud_sqlite_locker.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/django.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/exceptions.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/hashing.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/types.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/lamindb_setup/core/upath.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/noxfile.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/pyproject.toml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/scripts/script-to-fail-managed-storage.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_delete_instance.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_fail_managed_storage.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_init_instance.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_login.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_migrate.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-cloud/test_set_storage.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-local/conftest.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-local/test_all.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-local/test_update_schema_in_hub.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/conftest.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/test_django.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/test_global_settings.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/test_switch_and_fallback_env.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/hub-prod/test_upath.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_hashing.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_storage_access.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_storage_basis.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_storage_stats.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lamindb-setup/tests/storage/test_to_url.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/.github/workflows/build.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/.github/workflows/doc-changes.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/.gitignore +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/.pre-commit-config.yaml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/CHANGELOG.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/LICENSE +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/README.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/ids.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0037_rename_dataset_to_collection.py +0 -0
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0039_remove_collection_artifacts_collectionartifact_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0040_alter_transform_type.py +0 -0
- {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
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0043_run_json.py +0 -0
- {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
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0046_storage_instance_uid.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0047_featurevalue_artifactfeaturevalue_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0048_alter_artifactulabel_feature_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0049_rename_type_feature_dtype_and_more.py +0 -0
- {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
- {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
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0052_squashed.py +0 -0
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0054_alter_feature_previous_runs_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0055_artifact_type_artifactparamvalue_and_more.py +0 -0
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0057_link_models_latest_report_and_others.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0058_artifact__actions_collection__actions.py +0 -0
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0060_alter_artifact__actions.py +0 -0
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0062_add_is_latest_field.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/0063_populate_latest_field.py +0 -0
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/migrations/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/mocks.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/types.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/lnschema_core/users.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/noxfile.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/pyproject.toml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/tests/conftest.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/tests/test_integrity.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/tests/test_models.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/lnschema-core/tests/test_types.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/.github/workflows/build.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/.github/workflows/doc-changes.yml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/.gitignore +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/.pre-commit-config.yaml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/README.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/changelog.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/guide/get-started.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/guide/modeling_perturbations.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/guide.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/index.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/docs/reference.md +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/noxfile.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/pyproject.toml +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/tests/test_integrity.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/tests/test_notebooks.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0017_remove_biosample_artifacts.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0018_squashed.py +0 -0
- {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
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0019_alter_treatment_system.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0020_treatmenttarget_pathways_treatmenttarget_proteins_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/0021_alter_compoundtreatment_duration_unit_and_more.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/migrations/__init__.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/sub/wetlab/wetlab/models.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/conftest.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/duplicate/with-title-initialized-consecutive-finish.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/no-title.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/not-initialized.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/with-title-initialized-consecutive-finish-not-last-cell.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/notebooks/with-title-initialized-consecutive-finish.ipynb +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/duplicate1/script-to-test-versioning.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/duplicate2/script-to-test-versioning.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/duplicate3/script-to-test-versioning.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/script-to-test-filename-change.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/scripts/script-to-test-versioning.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_artifact_folders.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_cache.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_can_validate.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_collection.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_data.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_db.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_delete.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_feature.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_feature_manager.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_feature_set.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_from_values.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_label_manager.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_load.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_manager.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_notebooks.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_parents.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_queryset.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_record.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_run.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_save.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_search.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_settings.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_transfer.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_transform.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_uid.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_ulabel.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_versioning.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_view.py +0 -0
- {lamindb-0.76.3 → lamindb-0.76.4}/tests/core/test_visibility.py +0 -0
- {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
|
+
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.
|
13
|
-
Requires-Dist: lamindb_setup==0.76.
|
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.
|
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.
|
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.
|
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:
|
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:
|
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:
|
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
|
-
```
|
@@ -1,7 +1,6 @@
|
|
1
1
|
"""A data framework for biology.
|
2
2
|
|
3
|
-
|
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
|
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.
|
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
|
-
|
947
|
-
|
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,
|
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:
|
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:
|
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 |
|
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
|
-
|
108
|
+
source_code_path = filepath
|
40
109
|
# for notebooks, we need more work
|
41
110
|
if is_notebook:
|
42
111
|
try:
|
43
|
-
import
|
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
|
-
#
|
66
|
-
|
67
|
-
|
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
|
-
|
79
|
-
#
|
80
|
-
|
81
|
-
|
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
|
-
|
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
|
-
|
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
|
124
|
-
|
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.
|
135
|
-
transform.
|
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
|
-
|
148
|
-
|
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
|
)
|