lamindb 0.76.1__py3-none-any.whl → 0.76.2__py3-none-any.whl

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.
@@ -0,0 +1,229 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Literal
4
+
5
+ from anndata import AnnData
6
+ from lamin_utils import logger
7
+ from lamindb_setup.core._settings_storage import get_storage_region
8
+ from lamindb_setup.core.upath import create_path
9
+ from lnschema_core import Artifact, Run, Storage
10
+ from upath import UPath
11
+
12
+ if TYPE_CHECKING:
13
+ from lamindb_setup.core.types import UPathStr
14
+ from tiledbsoma import Collection as SOMACollection
15
+ from tiledbsoma import Experiment as SOMAExperiment
16
+ from tiledbsoma.io import ExperimentAmbientLabelMapping
17
+
18
+
19
+ def _read_adata_h5ad_zarr(objpath: UPath):
20
+ from lamindb.core.storage.paths import read_adata_h5ad, read_adata_zarr
21
+
22
+ if objpath.is_dir():
23
+ adata = read_adata_zarr(objpath)
24
+ else:
25
+ adata = read_adata_h5ad(objpath)
26
+ return adata
27
+
28
+
29
+ def _tiledb_config_s3(storepath: UPath) -> dict:
30
+ region = get_storage_region(storepath)
31
+ tiledb_config = {"vfs.s3.region": region}
32
+ storage_options = storepath.storage_options
33
+ if "key" in storage_options:
34
+ tiledb_config["vfs.s3.aws_access_key_id"] = storage_options["key"]
35
+ if "secret" in storage_options:
36
+ tiledb_config["vfs.s3.aws_secret_access_key"] = storage_options["secret"]
37
+ if "token" in storage_options:
38
+ tiledb_config["vfs.s3.aws_session_token"] = storage_options["token"]
39
+
40
+ return tiledb_config
41
+
42
+
43
+ def _open_tiledbsoma(
44
+ storepath: UPath, mode: Literal["r", "w"] = "r"
45
+ ) -> SOMACollection | SOMAExperiment:
46
+ try:
47
+ import tiledbsoma as soma
48
+ except ImportError as e:
49
+ raise ImportError("Please install tiledbsoma: pip install tiledbsoma") from e
50
+
51
+ storepath_str = storepath.as_posix()
52
+ if storepath.protocol == "s3":
53
+ ctx = soma.SOMATileDBContext(tiledb_config=_tiledb_config_s3(storepath))
54
+ # this is a strange bug
55
+ # for some reason iterdir futher gives incorrect results
56
+ # if cache is not invalidated
57
+ # instead of obs and ms it gives ms and ms in the list of names
58
+ storepath.fs.invalidate_cache()
59
+ else:
60
+ ctx = None
61
+
62
+ soma_objects = [obj.name for obj in storepath.iterdir()]
63
+ if "obs" in soma_objects and "ms" in soma_objects:
64
+ SOMAType = soma.Experiment
65
+ else:
66
+ SOMAType = soma.Collection
67
+ return SOMAType.open(storepath_str, mode=mode, context=ctx)
68
+
69
+
70
+ def register_for_tiledbsoma_store(
71
+ store: UPathStr | Artifact | None,
72
+ adatas: list[AnnData | UPathStr],
73
+ measurement_name: str,
74
+ obs_field_name: str,
75
+ var_field_name: str,
76
+ append_obsm_varm: bool = False,
77
+ run: Run | None = None,
78
+ ) -> tuple[ExperimentAmbientLabelMapping, list[AnnData]]:
79
+ """Register `AnnData` objects to append to `tiledbsoma.Experiment`.
80
+
81
+ Pass the returned registration mapping and `AnnData` objects to `write_tiledbsoma_store`.
82
+
83
+ See `tiledbsoma.io.from_h5ad
84
+ <https://tiledbsoma.readthedocs.io/en/latest/_autosummary/tiledbsoma.io.from_h5ad.html>`__.
85
+ """
86
+ try:
87
+ import tiledbsoma as soma
88
+ import tiledbsoma.io as soma_io
89
+ except ImportError as e:
90
+ raise ImportError("Please install tiledbsoma: pip install tiledbsoma") from e
91
+
92
+ if isinstance(store, Artifact):
93
+ storepath = store.path
94
+ else:
95
+ storepath = None if store is None else create_path(store)
96
+
97
+ add_run_uid = True
98
+ ctx = None
99
+ if storepath is not None:
100
+ if storepath.protocol == "s3":
101
+ ctx = soma.SOMATileDBContext(tiledb_config=_tiledb_config_s3(storepath))
102
+ if storepath.exists():
103
+ with soma.Experiment.open(
104
+ storepath.as_posix(), mode="r", context=ctx
105
+ ) as store:
106
+ add_run_uid = "lamin_run_uid" in store["obs"].schema.names
107
+ storepath = storepath.as_posix()
108
+
109
+ if add_run_uid:
110
+ from lamindb.core._data import get_run
111
+
112
+ run = get_run(run)
113
+
114
+ adata_objects = []
115
+ for adata in adatas:
116
+ if isinstance(adata, AnnData):
117
+ if add_run_uid:
118
+ if adata.is_view:
119
+ raise ValueError(
120
+ "Can not register an `AnnData` view, please do `adata.copy()` before passing."
121
+ )
122
+ else:
123
+ logger.warning("Mutating in-memory AnnData.")
124
+ adata.obs["lamin_run_uid"] = run.uid
125
+ else:
126
+ adata = _read_adata_h5ad_zarr(create_path(adata))
127
+ if add_run_uid:
128
+ adata.obs["lamin_run_uid"] = run.uid
129
+ adata_objects.append(adata)
130
+
131
+ registration_mapping = soma_io.register_anndatas(
132
+ experiment_uri=storepath,
133
+ adatas=adata_objects,
134
+ measurement_name=measurement_name,
135
+ obs_field_name=obs_field_name,
136
+ var_field_name=var_field_name,
137
+ append_obsm_varm=append_obsm_varm,
138
+ context=ctx,
139
+ )
140
+
141
+ return registration_mapping, adata_objects
142
+
143
+
144
+ def write_tiledbsoma_store(
145
+ store: Artifact | UPathStr,
146
+ adata: AnnData | UPathStr,
147
+ run: Run | None = None,
148
+ artifact_kwargs: dict | None = None,
149
+ **kwargs,
150
+ ) -> Artifact:
151
+ """Write `AnnData` to `tiledbsoma.Experiment`.
152
+
153
+ Reads `AnnData`, writes it to `tiledbsoma.Experiment` and creates `lamindb.Artifact`.
154
+
155
+ See `tiledbsoma.io.from_h5ad
156
+ <https://tiledbsoma.readthedocs.io/en/latest/_autosummary/tiledbsoma.io.from_h5ad.html>`__.
157
+ """
158
+ try:
159
+ import tiledbsoma as soma
160
+ import tiledbsoma.io as soma_io
161
+ except ImportError as e:
162
+ raise ImportError("Please install tiledbsoma: pip install tiledbsoma") from e
163
+
164
+ from lamindb.core._data import get_run
165
+
166
+ if artifact_kwargs is None:
167
+ artifact_kwargs = {}
168
+
169
+ appending: bool = kwargs.get("registration_mapping", None) is not None
170
+ store_is_artifact: bool = isinstance(store, Artifact)
171
+ if store_is_artifact:
172
+ if not appending:
173
+ raise ValueError(
174
+ "Trying to append to an existing store without `registration_mapping`."
175
+ )
176
+ storepath = store.path
177
+ else:
178
+ storepath = create_path(store)
179
+ add_run_uid: bool = not appending
180
+
181
+ if not isinstance(adata, AnnData):
182
+ # create_path is used
183
+ # in case adata is somewhere in our managed s3 bucket or just in s3
184
+ adata = _read_adata_h5ad_zarr(create_path(adata))
185
+ elif add_run_uid and adata.is_view:
186
+ raise ValueError(
187
+ "Can not write from an `AnnData` view, please do `adata.copy()` before passing."
188
+ )
189
+
190
+ run = get_run(run)
191
+
192
+ if add_run_uid:
193
+ adata.obs["lamin_run_uid"] = run.uid
194
+
195
+ if storepath.protocol == "s3":
196
+ ctx = soma.SOMATileDBContext(tiledb_config=_tiledb_config_s3(storepath))
197
+ else:
198
+ ctx = None
199
+
200
+ soma_io.from_anndata(storepath.as_posix(), adata, context=ctx, **kwargs)
201
+
202
+ if add_run_uid:
203
+ del adata.obs["lamin_run_uid"]
204
+
205
+ revises = None
206
+ if appending:
207
+ if store_is_artifact:
208
+ revises = store
209
+ else:
210
+ from lamindb._artifact import (
211
+ check_path_in_existing_storage,
212
+ get_relative_path_to_directory,
213
+ )
214
+
215
+ storage = check_path_in_existing_storage(storepath)
216
+ if isinstance(storage, Storage):
217
+ search_by_key = get_relative_path_to_directory(
218
+ path=storepath, directory=UPath(storage.root)
219
+ ).as_posix()
220
+ revises = Artifact.filter(
221
+ key=search_by_key, is_latest=True, _key_is_virtual=False
222
+ ).one_or_none()
223
+ if revises is not None:
224
+ logger.info(f"Assuming it is a new version of {revises}.")
225
+
226
+ if revises is None:
227
+ return Artifact(storepath, run=run, **artifact_kwargs)
228
+ else:
229
+ return Artifact(storepath, run=run, revises=revises, **artifact_kwargs)
@@ -84,13 +84,9 @@ def attempt_accessing_path(
84
84
  )
85
85
  else:
86
86
  if artifact._state.db not in ("default", None) and using_key is None:
87
- storage = (
88
- Storage.using(artifact._state.db).filter(id=artifact.storage_id).one()
89
- )
87
+ storage = Storage.using(artifact._state.db).get(id=artifact.storage_id)
90
88
  else:
91
- storage = (
92
- Storage.objects.using(using_key).filter(id=artifact.storage_id).one()
93
- )
89
+ storage = Storage.objects.using(using_key).get(id=artifact.storage_id)
94
90
  # find a better way than passing None to instance_settings in the future!
95
91
  storage_settings = StorageSettings(storage.root, access_token=access_token)
96
92
  path = storage_settings.key_to_filepath(storage_key)
@@ -11,6 +11,16 @@ if TYPE_CHECKING:
11
11
  from lnschema_core.models import IsVersioned
12
12
 
13
13
 
14
+ def message_update_key_in_version_family(
15
+ *,
16
+ suid: str,
17
+ existing_key: str,
18
+ registry: str,
19
+ new_key: str,
20
+ ) -> str:
21
+ return f'Or update key "{existing_key}" in your existing family:\n\nln.{registry}.filter(uid__startswith="{suid}").update(key="{new_key}")'
22
+
23
+
14
24
  def increment_base62(s: str) -> str:
15
25
  # we don't need to throw an error for zzzz because uids are enforced to be unique
16
26
  # on the db level and have an enforced maximum length
@@ -78,57 +88,43 @@ def set_version(version: str | None = None, previous_version: str | None = None)
78
88
  version: Version string.
79
89
  previous_version: Previous version string.
80
90
  """
81
- if version == previous_version:
82
- raise ValueError(f"Please increment the previous version: '{previous_version}'")
83
91
  if version is None and previous_version is not None:
84
92
  version = bump_version(previous_version, bump_type="major")
85
93
  return version
86
94
 
87
95
 
88
- def init_uid(
96
+ def create_uid(
89
97
  *,
90
98
  version: str | None = None,
91
99
  n_full_id: int = 20,
92
- is_new_version_of: IsVersioned | None = None,
93
- ) -> str:
94
- if is_new_version_of is not None:
95
- stem_uid = is_new_version_of.stem_uid
100
+ revises: IsVersioned | None = None,
101
+ ) -> tuple[str, IsVersioned | None]:
102
+ if revises is not None:
103
+ if not revises.is_latest:
104
+ # need one more request
105
+ revises = revises.__class__.objects.get(
106
+ is_latest=True, uid__startswith=revises.stem_uid
107
+ )
108
+ logger.warning(
109
+ f"didn't pass the latest version in `revises`, retrieved it: {revises}"
110
+ )
111
+ suid = revises.stem_uid
112
+ vuid = increment_base62(revises.uid[-4:])
96
113
  else:
97
- stem_uid = ids.base62(n_full_id - 4)
114
+ suid = ids.base62(n_full_id - 4)
115
+ vuid = "0000"
98
116
  if version is not None:
99
117
  if not isinstance(version, str):
100
118
  raise ValueError(
101
119
  "`version` parameter must be `None` or `str`, e.g., '0.1', '1', '2',"
102
120
  " etc."
103
121
  )
104
- return stem_uid + ids.base62_4()
105
-
106
-
107
- def get_uid_from_old_version(
108
- is_new_version_of: IsVersioned,
109
- version: str | None = None,
110
- using_key: str | None = None,
111
- ) -> tuple[str, str]:
112
- """{}""" # noqa: D415
113
- msg = ""
114
- if is_new_version_of.version is None:
115
- previous_version = "1"
116
- msg = f"setting previous version to '{previous_version}'"
117
- else:
118
- previous_version = is_new_version_of.version
119
- version = set_version(version, previous_version)
120
- new_uid = init_uid(
121
- version=version,
122
- n_full_id=is_new_version_of._len_full_uid,
123
- is_new_version_of=is_new_version_of,
124
- )
125
- # the following covers the edge case where the old file was unversioned
126
- if is_new_version_of.version is None:
127
- is_new_version_of.version = previous_version
128
- is_new_version_of.save(using=using_key)
129
- if msg != "":
130
- msg += f"& new version to '{version}'"
131
- return new_uid, version
122
+ if revises is not None:
123
+ if version == revises.version:
124
+ raise ValueError(
125
+ f"Please increment the previous version: '{revises.version}'"
126
+ )
127
+ return suid + vuid, revises
132
128
 
133
129
 
134
130
  def get_new_path_from_uid(old_path: UPath, old_uid: str, new_uid: str):
@@ -141,18 +137,18 @@ def get_new_path_from_uid(old_path: UPath, old_uid: str, new_uid: str):
141
137
  return new_path
142
138
 
143
139
 
144
- def process_is_new_version_of(
145
- is_new_version_of: IsVersioned,
140
+ def process_revises(
141
+ revises: IsVersioned | None,
146
142
  version: str | None,
147
143
  name: str | None,
148
144
  type: type[IsVersioned],
149
- ) -> tuple[str, str, str]:
150
- if is_new_version_of is not None and not isinstance(is_new_version_of, type):
151
- raise TypeError(f"is_new_version_of has to be of type {type.__name__}")
152
- if is_new_version_of is None:
153
- uid = init_uid(version=version, n_full_id=type._len_full_uid)
154
- else:
155
- uid, version = get_uid_from_old_version(is_new_version_of, version)
145
+ ) -> tuple[str, str, str, IsVersioned | None]:
146
+ if revises is not None and not isinstance(revises, type):
147
+ raise TypeError(f"`revises` has to be of type `{type.__name__}`")
148
+ uid, revises = create_uid(
149
+ revises=revises, version=version, n_full_id=type._len_full_uid
150
+ )
151
+ if revises is not None:
156
152
  if name is None:
157
- name = is_new_version_of.name
158
- return uid, version, name
153
+ name = revises.name
154
+ return uid, version, name, revises
@@ -109,4 +109,6 @@ def save_vitessce_config(
109
109
  logger.important(
110
110
  f"go to: https://lamin.ai/{slug}/artifact/{vitessce_config_artifact.uid}"
111
111
  )
112
+ run.finished_at = datetime.now(timezone.utc)
113
+ run.save()
112
114
  return vitessce_config_artifact
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lamindb
3
- Version: 0.76.1
3
+ Version: 0.76.2
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,9 +9,9 @@ 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.1
13
- Requires-Dist: lamindb_setup==0.76.5
14
- Requires-Dist: lamin_utils==0.13.2
12
+ Requires-Dist: lnschema_core==0.73.2
13
+ Requires-Dist: lamindb_setup==0.76.6
14
+ Requires-Dist: lamin_utils==0.13.4
15
15
  Requires-Dist: lamin_cli==0.16.2
16
16
  Requires-Dist: rapidfuzz
17
17
  Requires-Dist: pyarrow
@@ -24,7 +24,7 @@ Requires-Dist: pandas
24
24
  Requires-Dist: graphviz
25
25
  Requires-Dist: psycopg2-binary
26
26
  Requires-Dist: lamindb_setup[aws] ; extra == "aws"
27
- Requires-Dist: bionty==0.48.2 ; extra == "bionty"
27
+ Requires-Dist: bionty==0.48.3 ; extra == "bionty"
28
28
  Requires-Dist: pre-commit ; extra == "dev"
29
29
  Requires-Dist: nox ; extra == "dev"
30
30
  Requires-Dist: laminci>=0.3 ; extra == "dev"
@@ -57,13 +57,5 @@ Provides-Extra: zarr
57
57
 
58
58
  # LaminDB - A data framework for biology
59
59
 
60
- - Manage data & metadata with a unified Python API ("lakehouse").
61
- - Track data lineage across notebooks & pipelines.
62
- - Integrate registries for experimental metadata & in-house ontologies.
63
- - Validate, standardize & annotate.
64
- - Collaborate across distributed databases.
65
-
66
- ## Documentation
67
-
68
- Read the [docs](https://lamin.ai/docs).
60
+ Read the [docs](https://docs.lamin.ai).
69
61
 
@@ -1,30 +1,30 @@
1
- lamindb/__init__.py,sha256=d7viqFNu34u9fGs2xJq5AAD-4-M7VS2reIRP-uEYn54,2270
2
- lamindb/_artifact.py,sha256=wmcofYb1-23YblpjwFo8X-dLNgB7EfwMtzS7p-CKvhs,42630
3
- lamindb/_can_validate.py,sha256=jPZHhtPaZJos5bL8Mk8ZNh34mItwYRwOynhofKUxwfY,17472
4
- lamindb/_collection.py,sha256=PIKeRZ9zttKSyzcz8UMjKNihPO1Qe-E2zfr-Ao5wtJo,14943
5
- lamindb/_curate.py,sha256=Ww_1UlHAIj_fmdxRAuhphqSEi-_qQvjJCIlNbhe8yhA,55486
6
- lamindb/_feature.py,sha256=27PBSJoT0yI400WwdWPFz8cmUI4KAQ58jVep-wIDsfM,7373
1
+ lamindb/__init__.py,sha256=OCLxYHwhRyaf6Zx-AKHTSEFWM-J342YRxDP2hhCIu6c,2309
2
+ lamindb/_artifact.py,sha256=RygNHePDo895KG61FctFRdHO4jVa9cmj-yBBsyRE50A,43840
3
+ lamindb/_can_validate.py,sha256=ne8-9sAG9vXnMXZqso6mYMt-xDg16h-gq6yHJXKFpuI,17690
4
+ lamindb/_collection.py,sha256=F_VgpLBprrzUQ-tPngWvO9vFd7jX66MVwIi031JOris,14871
5
+ lamindb/_curate.py,sha256=EAikoFg2rL8kRsWEIXH33P1VplSGAACMuFHanicguWw,55964
6
+ lamindb/_feature.py,sha256=nZhtrH0ssoNls-hV-dkwfK9sKypg2El59R9qfarxfUE,5340
7
7
  lamindb/_feature_set.py,sha256=DmAy96V_RyV0yiyvWOCHgustXPsCaMwn4TrWwh2qDd8,8104
8
- lamindb/_filter.py,sha256=I1tSIF-izmD48YpB8NtKmau59Vpt6C54RPHWc3oinGM,1412
9
- lamindb/_finish.py,sha256=VtUfnHQOxbxKUMm3IXmxGO4T0XH64w-yeyeIdwvApBw,9433
10
- lamindb/_from_values.py,sha256=zBOJGt_3mBKjqW5LuzuUysMwGbEcEFtYBJXAcL4Vx_0,13432
11
- lamindb/_is_versioned.py,sha256=Z_zVsHTnNaWvD15dEz18VocsSgka53jUzs_wDr78ltI,1344
8
+ lamindb/_filter.py,sha256=Fs7_x3tA_KVz0lYt0bJkWfjnEKAnkVN20CfKhp9aKWg,1403
9
+ lamindb/_finish.py,sha256=wCjPmTBmL_z2WcZq9v6TZroZ_J_Te9KC5GzFuYdrIRc,9413
10
+ lamindb/_from_values.py,sha256=8kYpR8Q85EOaTcsPGjVHeZh29fGVgum5OEQf4Hsz_80,13533
11
+ lamindb/_is_versioned.py,sha256=5lAnhTboltFkZCKVRV1uxkm0OCjJz_HKi3yQq_vEuMs,1306
12
12
  lamindb/_parents.py,sha256=eMavdd6IO6STOVJSlR2TzdRtx6sKYDKsMOtlR3DZlgQ,15599
13
- lamindb/_query_manager.py,sha256=uLg3YneNcnRP8-fV0f-_t255PMGnDO47ueQqGiDZwis,4240
14
- lamindb/_query_set.py,sha256=T1VmEC-rQTmOEwILKJVu5DRBLwp4DA9XnId2ndURcOo,10587
15
- lamindb/_record.py,sha256=mhIg7QxvWKdWW0QDAUmKwMQefDeg9k3mlw93rsVsf0Q,21422
13
+ lamindb/_query_manager.py,sha256=Ipe85HL31DDwMbC8CN_1Svbwk48a_DUh_INGQdZL08I,4222
14
+ lamindb/_query_set.py,sha256=mwNfGWcZbI5a1VfuiQzkweU4VQchE8Va8HiCIa0GNu4,11604
15
+ lamindb/_record.py,sha256=MDLvcsZ23lZkThnrYQtj_uW-1BnxCPpyJ5mKl9KPs4A,21199
16
16
  lamindb/_run.py,sha256=5M_r1zGDv9HlqbqRKTWCYCOtENovJ-8mQ4kY7XqcLaU,1888
17
- lamindb/_save.py,sha256=9lpFpQLgmPOp6JcoM9XetNkbYu2JgY70sGQZVz3Gzmw,11027
17
+ lamindb/_save.py,sha256=Fu7Z84btKOXfTfpunKLni21s5ER2zIllqg5e3nPq-0A,10910
18
18
  lamindb/_storage.py,sha256=GBVChv-DHVMNEBJL5l_JT6B4RDhZ6NnwgzmUICphYKk,413
19
- lamindb/_transform.py,sha256=Vw0Ct15nCOmL8-UwDs-hH-rgdX8PfcAadgbh_ynBzQE,3397
19
+ lamindb/_transform.py,sha256=Ck674iuKIp9HDpHuyFFM2xKJcFAUvQDRTnEdnx00Rq0,4114
20
20
  lamindb/_ulabel.py,sha256=XDSdZBXX_ki5s1vOths3MjF2x5DPggBR_PV_KF4SGyg,1611
21
21
  lamindb/_utils.py,sha256=LGdiW4k3GClLz65vKAVRkL6Tw-Gkx9DWAdez1jyA5bE,428
22
22
  lamindb/_view.py,sha256=4Ln2ItTb3857PAI-70O8eJYqoTJ_NNFc7E_wds6OGns,2412
23
23
  lamindb/core/__init__.py,sha256=QePKN3dkGuNEfIc2CKwBt3Kcl39bbghX6XwXKpK3BA0,1491
24
- lamindb/core/_context.py,sha256=cNj_LDpA9gmkE6P6Gg1cBwp4eFukvMlggivYdrVqM8E,19407
24
+ lamindb/core/_context.py,sha256=O4ovdIfvIC9E4oaqpSjBqwHOKThmP8_aod0MiOWaEwI,19517
25
25
  lamindb/core/_data.py,sha256=eocOXsZGu62LPtz6yIlvHhPSJTf3yF2ITZTffyflWYI,16269
26
- lamindb/core/_feature_manager.py,sha256=gJowe9-tifi0Z5IcChV-jtGYVdl6XgR2m_oswwhU17Y,31980
27
- lamindb/core/_label_manager.py,sha256=OO5Tl-ankQZNrF_PQ7_xfkuJ8ytMUvr-9cL9soe1Ceo,9249
26
+ lamindb/core/_feature_manager.py,sha256=94tX6gq_Rx7fkDARQBxB2z92qUDpHocFSAdKv5izMT4,32490
27
+ lamindb/core/_label_manager.py,sha256=jSLvxAuTuOYosSh_QJhIz3bqnbmWKP43y5abVMb-hOQ,9240
28
28
  lamindb/core/_mapped_collection.py,sha256=ST-cTfokIGkRadjSHEyvIK2san8cGr7WZpgbgs5neLI,22025
29
29
  lamindb/core/_settings.py,sha256=GGEB8BU5GinIfD4ktr1Smp6GPHGaInu46MhP4EecZDY,5950
30
30
  lamindb/core/_sync_git.py,sha256=qc0yfPyKeG4uuNT_3qsv-mkIMqhLFqfXNeNVO49vV00,4547
@@ -33,26 +33,27 @@ lamindb/core/exceptions.py,sha256=qNFYN5Jc7Y6kw4re-jsW0AEIprsV2HB1wTcJiO-u-ks,12
33
33
  lamindb/core/fields.py,sha256=47Jmh3efUr5ZscgimR_yckY-I3cNf8ScLutbwKCK3j4,162
34
34
  lamindb/core/schema.py,sha256=KiYQn_8fokSMztTNDe6qUocZzKXWxU32H-YChNJv51A,1877
35
35
  lamindb/core/types.py,sha256=uVBqSVLoQaTkqP9nqsJhwU6yYnx8H5e6-ZxrB6vpOOw,265
36
- lamindb/core/versioning.py,sha256=fVzxFcJ8xPPSRuLZuUz_lfAKirI550NQTyKIowQUhhs,5404
36
+ lamindb/core/versioning.py,sha256=__SOHhk5OjMJgAUjixzp0GFcQrpjm8sBUXC9Fouk2AE,5162
37
37
  lamindb/core/datasets/__init__.py,sha256=zRP98oqUAaXhqWyKMiH0s_ImVIuNeziQQ2kQ_t0f-DI,1353
38
38
  lamindb/core/datasets/_core.py,sha256=CgVF_pXuBXLElzubDMsl1DbpYOnXCY0HleITVvBKih4,19873
39
39
  lamindb/core/datasets/_fake.py,sha256=BZF9R_1iF0HDnvtZNqL2FtsjSMuqDIfuFxnw_LJYIh4,953
40
- lamindb/core/storage/__init__.py,sha256=MjKg2-p8EbOYTVsgufnK93ut7HG7_MzLDAqtzXt0U2Q,501
40
+ lamindb/core/storage/__init__.py,sha256=9B3JqHydQnclP4NUY2kEc99K1cJBQZA4jyy3EmDxsYk,541
41
41
  lamindb/core/storage/_anndata_accessor.py,sha256=jmEZeeZlt8-qBXRkU0tTA-t6dVEb_dH86wc1ok0jSRY,24030
42
42
  lamindb/core/storage/_anndata_sizes.py,sha256=aXO3OB--tF5MChenSsigW6Q-RuE8YJJOUTVukkLrv9A,1029
43
- lamindb/core/storage/_backed_access.py,sha256=MsSgiIccHVhqOcur2lZ4mj5LSIL5OL8nX4eqK6mloU0,4732
43
+ lamindb/core/storage/_backed_access.py,sha256=YcWCeT2eligJGsBdjJS_-4el_eC9J088jxUWG9lsleM,3231
44
+ lamindb/core/storage/_tiledbsoma.py,sha256=GNPG8pDYmZLFBSujsQ8VqlfWaFmDO58kgBXw6JESQJs,7812
44
45
  lamindb/core/storage/_valid_suffixes.py,sha256=vUSeQ4s01rdhD_vSd6wKmFBsgMJAKkBMnL_T9Y1znMg,501
45
46
  lamindb/core/storage/_zarr.py,sha256=5ceEz6YIvgvUnVVNWhK5Z4W0WfrvyvY82Yna5jSX1_E,3661
46
47
  lamindb/core/storage/objects.py,sha256=OzvBCS-Urz5mr-O95qYt6RGBDDX5HmjfRRKWPPDn1ZE,1797
47
- lamindb/core/storage/paths.py,sha256=I0UjQfXfh3MptfLgpA0iSyR-X9pLOvgtXNr4B_Lwk4g,7810
48
+ lamindb/core/storage/paths.py,sha256=woOrjtBhNnzm8DjF262ipwyZaQ_A-7MT2ZPoiefAfYk,7728
48
49
  lamindb/core/subsettings/__init__.py,sha256=KFHPzIE7f7Bj4RgMjGQF4CjTdHVG_VNFBrCndo49ixo,198
49
50
  lamindb/core/subsettings/_creation_settings.py,sha256=54mfMH_osC753hpxcl7Dq1rwBD2LHnWveXtQpkLBITE,1194
50
51
  lamindb/core/subsettings/_transform_settings.py,sha256=4YbCuZtJo6zdytl6UQR4GvdDkTtT6SRBqVzofGzNOt8,583
51
52
  lamindb/integrations/__init__.py,sha256=MoLRD_qqX5WHFUAqHL6zoY_cDkWH0zimaGT_1CyXKnk,124
52
- lamindb/integrations/_vitessce.py,sha256=jcpLUNFq1BsDpZDkG5L3nzWNXDLuy3Eep_GfY0XqhhA,5077
53
+ lamindb/integrations/_vitessce.py,sha256=aDCyZTddpMfUzjEo0DXQ3XlD--ebSqnsGiMxJBunX90,5141
53
54
  lamindb/setup/__init__.py,sha256=OwZpZzPDv5lPPGXZP7-zK6UdO4FHvvuBh439yZvIp3A,410
54
55
  lamindb/setup/core/__init__.py,sha256=SevlVrc2AZWL3uALbE5sopxBnIZPWZ1IB0NBDudiAL8,167
55
- lamindb-0.76.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
56
- lamindb-0.76.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
57
- lamindb-0.76.1.dist-info/METADATA,sha256=_h45JtUTV8vsLXe7ePddBMIhWo4CkFD4zKvxjNq99fM,2669
58
- lamindb-0.76.1.dist-info/RECORD,,
56
+ lamindb-0.76.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
57
+ lamindb-0.76.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
58
+ lamindb-0.76.2.dist-info/METADATA,sha256=99nkmjVubVfQahE9S4aO1e8Ot6G4iFaPZltNBE-oFPo,2381
59
+ lamindb-0.76.2.dist-info/RECORD,,