lamindb 0.75.1__py3-none-any.whl → 0.76.1__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.
@@ -149,7 +149,7 @@ class MappedCollection:
149
149
  self.storages = [] # type: ignore
150
150
  self.conns = [] # type: ignore
151
151
  self.parallel = parallel
152
- self._path_list = path_list
152
+ self.path_list = path_list
153
153
  self._make_connections(path_list, parallel)
154
154
 
155
155
  self.n_obs_list = []
@@ -165,11 +165,12 @@ class MappedCollection:
165
165
  self.indices = np.hstack([np.arange(n_obs) for n_obs in self.n_obs_list])
166
166
  self.storage_idx = np.repeat(np.arange(len(self.storages)), self.n_obs_list)
167
167
 
168
- self.join_vars = join
169
- self.var_indices = None
170
- self.var_joint = None
171
- self.n_vars_list = None
172
- self.n_vars = None
168
+ self.join_vars: Literal["inner", "outer"] | None = join
169
+ self.var_indices: list | None = None
170
+ self.var_joint: pd.Index | None = None
171
+ self.n_vars_list: list | None = None
172
+ self.var_list: list | None = None
173
+ self.n_vars: int | None = None
173
174
  if self.join_vars is not None:
174
175
  self._make_join_vars()
175
176
  self.n_vars = len(self.var_joint)
@@ -225,43 +226,71 @@ class MappedCollection:
225
226
  encoder.update({cat: i for i, cat in enumerate(cats)})
226
227
  self.encoders[label] = encoder
227
228
 
228
- def _make_join_vars(self):
229
- var_list = []
229
+ def _read_vars(self):
230
+ self.var_list = []
230
231
  self.n_vars_list = []
231
232
  for storage in self.storages:
232
233
  with _Connect(storage) as store:
233
234
  vars = _safer_read_index(store["var"])
234
- var_list.append(vars)
235
+ self.var_list.append(vars)
235
236
  self.n_vars_list.append(len(vars))
236
237
 
237
- vars_eq = all(var_list[0].equals(vrs) for vrs in var_list[1:])
238
+ def _make_join_vars(self):
239
+ if self.var_list is None:
240
+ self._read_vars()
241
+ vars_eq = all(self.var_list[0].equals(vrs) for vrs in self.var_list[1:])
238
242
  if vars_eq:
239
243
  self.join_vars = None
240
- self.var_joint = var_list[0]
244
+ self.var_joint = self.var_list[0]
241
245
  return
242
246
 
243
247
  if self.join_vars == "inner":
244
- self.var_joint = reduce(pd.Index.intersection, var_list)
248
+ self.var_joint = reduce(pd.Index.intersection, self.var_list)
245
249
  if len(self.var_joint) == 0:
246
250
  raise ValueError(
247
251
  "The provided AnnData objects don't have shared varibales.\n"
248
252
  "Use join='outer'."
249
253
  )
250
- self.var_indices = [vrs.get_indexer(self.var_joint) for vrs in var_list]
254
+ self.var_indices = [
255
+ vrs.get_indexer(self.var_joint) for vrs in self.var_list
256
+ ]
251
257
  elif self.join_vars == "outer":
252
- self.var_joint = reduce(pd.Index.union, var_list)
253
- self.var_indices = [self.var_joint.get_indexer(vrs) for vrs in var_list]
258
+ self.var_joint = reduce(pd.Index.union, self.var_list)
259
+ self.var_indices = [
260
+ self.var_joint.get_indexer(vrs) for vrs in self.var_list
261
+ ]
262
+
263
+ def check_vars_sorted(self, ascending: bool = True) -> bool:
264
+ """Returns `True` if all variables are sorted in all objects."""
265
+ if self.var_list is None:
266
+ self._read_vars()
267
+ if ascending:
268
+ vrs_sort_status = (vrs.is_monotonic_increasing for vrs in self.var_list)
269
+ else:
270
+ vrs_sort_status = (vrs.is_monotonic_decreasing for vrs in self.var_list)
271
+ return all(vrs_sort_status)
272
+
273
+ def check_vars_non_aligned(self, vars: pd.Index | list) -> list[int]:
274
+ """Returns indices of objects with non-aligned variables.
275
+
276
+ Args:
277
+ vars: Check alignment against these variables.
278
+ """
279
+ if self.var_list is None:
280
+ self._read_vars()
281
+ vars = pd.Index(vars)
282
+ return [i for i, vrs in enumerate(self.var_list) if not vrs.equals(vars)]
254
283
 
255
284
  def __len__(self):
256
285
  return self.n_obs
257
286
 
258
287
  @property
259
- def shape(self):
288
+ def shape(self) -> tuple[int, int]:
260
289
  """Shape of the (virtually aligned) dataset."""
261
290
  return (self.n_obs, self.n_vars)
262
291
 
263
292
  @property
264
- def original_shapes(self):
293
+ def original_shapes(self) -> list[tuple[int, int]]:
265
294
  """Shapes of the underlying AnnData objects."""
266
295
  if self.n_vars_list is None:
267
296
  n_vars_list = [None] * len(self.n_obs_list)
@@ -374,8 +403,27 @@ class MappedCollection:
374
403
  label = label.decode("utf-8")
375
404
  return label
376
405
 
377
- def get_label_weights(self, obs_keys: str | list[str]):
378
- """Get all weights for the given label keys."""
406
+ def get_label_weights(
407
+ self,
408
+ obs_keys: str | list[str],
409
+ scaler: float | None = None,
410
+ return_categories: bool = False,
411
+ ):
412
+ """Get all weights for the given label keys.
413
+
414
+ This counts the number of labels for each label and returns
415
+ weights for each obs label accoding to the formula `1 / num of this label in the data`.
416
+ If `scaler` is provided, then `scaler / (scaler + num of this label in the data)`.
417
+
418
+ Args:
419
+ obs_keys: A key in the ``.obs`` slots or a list of keys. If a list is provided,
420
+ the labels from the obs keys will be concatenated with ``"__"`` delimeter
421
+ scaler: Use this number to scale the provided weights.
422
+ return_categories: If `False`, returns weights for each observation,
423
+ can be directly passed to a sampler. If `True`, returns a dictionary with
424
+ unique categories for labels (concatenated if `obs_keys` is a list)
425
+ and their weights.
426
+ """
379
427
  if isinstance(obs_keys, str):
380
428
  obs_keys = [obs_keys]
381
429
  labels_list = []
@@ -383,12 +431,20 @@ class MappedCollection:
383
431
  labels_to_str = self.get_merged_labels(label_key).astype(str).astype("O")
384
432
  labels_list.append(labels_to_str)
385
433
  if len(labels_list) > 1:
386
- labels = reduce(lambda a, b: a + b, labels_list)
434
+ labels = ["__".join(labels_obs) for labels_obs in zip(*labels_list)]
387
435
  else:
388
436
  labels = labels_list[0]
389
- labels = self.get_merged_labels(label_key)
390
- counter = Counter(labels) # type: ignore
391
- weights = 1.0 / np.array([counter[label] for label in labels])
437
+ counter = Counter(labels)
438
+ if return_categories:
439
+ return {
440
+ k: 1.0 / v if scaler is None else scaler / (v + scaler)
441
+ for k, v in counter.items()
442
+ }
443
+ counts = np.array([counter[label] for label in labels])
444
+ if scaler is None:
445
+ weights = 1.0 / counts
446
+ else:
447
+ weights = scaler / (counts + scaler)
392
448
  return weights
393
449
 
394
450
  def get_merged_labels(self, label_key: str):
@@ -426,7 +482,7 @@ class MappedCollection:
426
482
  codes = self._get_codes(store, label_key)
427
483
  codes = decode(codes) if isinstance(codes[0], bytes) else codes
428
484
  cats_merge.update(codes)
429
- return cats_merge
485
+ return sorted(cats_merge)
430
486
 
431
487
  def _get_categories(self, storage: StorageType, label_key: str): # type: ignore
432
488
  """Get categories."""
@@ -483,7 +539,7 @@ class MappedCollection:
483
539
  self._closed = True
484
540
 
485
541
  @property
486
- def closed(self):
542
+ def closed(self) -> bool:
487
543
  """Check if connections to array streaming backend are closed.
488
544
 
489
545
  Does not matter if `parallel=True`.
@@ -508,4 +564,4 @@ class MappedCollection:
508
564
  mapped.parallel = False
509
565
  mapped.storages = []
510
566
  mapped.conns = []
511
- mapped._make_connections(mapped._path_list, parallel=False)
567
+ mapped._make_connections(mapped.path_list, parallel=False)
lamindb/core/_settings.py CHANGED
@@ -54,7 +54,7 @@ class Settings:
54
54
  track_run_inputs: bool = True
55
55
  """Track files as input upon `.load()`, `.cache()` and `.backed()`.
56
56
 
57
- Requires a global run context with :func:`~lamindb.track` was created!
57
+ Requires a global run context with :func:`~lamindb.core.Context.track` was created!
58
58
 
59
59
  FAQ: :doc:`/faq/track-run-inputs`
60
60
  """
@@ -83,14 +83,10 @@ class Settings:
83
83
  def transform(self) -> TransformSettings:
84
84
  """Transform settings.
85
85
 
86
- For example::
87
-
88
- ln.settings.transform.stem_uid = "FPnfDtJz8qbE" # defines version family
89
- ln.settings.transform.version = "1" # defines version
90
- ln.settings.transform.name = "My good script" # semantic name
91
-
92
- The first two are typically auto-generated by :func:`~lamindb.track`.
86
+ Is deprecated since version 0.76.1.
93
87
  """
88
+ # enable warning soon
89
+ # logger.warning("Transform settings are deprecated, please instead set `ln.context.uid`")
94
90
  return transform_settings
95
91
 
96
92
  @property
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
+ from typing import TYPE_CHECKING
4
5
  from urllib.request import urlretrieve
5
6
 
6
7
  import anndata as ad
@@ -11,6 +12,9 @@ from upath import UPath
11
12
 
12
13
  from lamindb.core._settings import settings
13
14
 
15
+ if TYPE_CHECKING:
16
+ from mudata import MuData
17
+
14
18
 
15
19
  def file_fcs() -> Path:
16
20
  """Example FCS artifact."""
@@ -116,7 +120,7 @@ def file_mini_csv(in_storage_root=False) -> Path:
116
120
  return filepath
117
121
 
118
122
 
119
- def file_tiff_suo22(): # pragma: no cover
123
+ def file_tiff_suo22() -> Path: # pragma: no cover
120
124
  """Image file from Suo22.
121
125
 
122
126
  Pair with anndata_suo22_Visium10X
@@ -126,7 +130,7 @@ def file_tiff_suo22(): # pragma: no cover
126
130
  "F121_LP1_4LIV.tiff",
127
131
  )
128
132
  Path("suo22/").mkdir(exist_ok=True)
129
- filepath = Path(filepath).rename("suo22/F121_LP1_4LIV.tiff")
133
+ filepath = Path(filepath).rename("suo22/F121_LP1_4LIV.tiff") # type: ignore
130
134
  return Path(filepath)
131
135
 
132
136
 
@@ -282,17 +286,16 @@ def anndata_human_immune_cells(
282
286
  ) -> ad.AnnData: # pragma: no cover
283
287
  """Cross-tissue immune cell analysis reveals tissue-specific features in humans.
284
288
 
285
- From: https://cellxgene.cziscience.com/collections/62ef75e4-cbea-454e-a0ce-998ec40223d3 # noqa
289
+ From: https://cellxgene.cziscience.com/collections/62ef75e4-cbea-454e-a0ce-998ec40223d3
286
290
  Collection: Global
287
291
 
288
292
  To reproduce the subsample::
289
-
290
- adata = sc.read('Global.h5ad')
291
- adata.obs = adata.obs[['donor_id', 'tissue', 'cell_type', 'assay', 'tissue_ontology_term_id', 'cell_type_ontology_term_id', 'assay_ontology_term_id']].copy()
292
- sc.pp.subsample(adata, fraction=0.005)
293
- del adata.uns["development_cache_ontology_term_id_colors"]
294
- del adata.uns["sex_ontology_term_id_colors"]
295
- adata.write('human_immune.h5ad')
293
+ >>> adata = sc.read('Global.h5ad')
294
+ >>> adata.obs = adata.obs[['donor_id', 'tissue', 'cell_type', 'assay', 'tissue_ontology_term_id', 'cell_type_ontology_term_id', 'assay_ontology_term_id']].copy()
295
+ >>> sc.pp.subsample(adata, fraction=0.005)
296
+ >>> del adata.uns["development_cache_ontology_term_id_colors"]
297
+ >>> del adata.uns["sex_ontology_term_id_colors"]
298
+ >>> adata.write('human_immune.h5ad')
296
299
  """
297
300
  filepath, _ = urlretrieve("https://lamindb-test.s3.amazonaws.com/human_immune.h5ad")
298
301
  adata = ad.read_h5ad(filepath)
@@ -369,29 +372,34 @@ def anndata_suo22_Visium10X(): # pragma: no cover
369
372
  return ad.read_h5ad(filepath)
370
373
 
371
374
 
372
- def mudata_papalexi21_subset(): # pragma: no cover
375
+ def mudata_papalexi21_subset() -> MuData: # pragma: no cover
373
376
  """A subsetted mudata from papalexi21.
374
377
 
375
378
  To reproduce the subsetting:
376
- >>> !wget https://figshare.com/ndownloader/files/36509460
377
- >>> import mudata as md
378
- >>> import scanpy as sc
379
- >>> mdata = md.read_h5mu("36509460")
380
- >>> mdata = sc.pp.subsample(mdata, n_obs=200, copy=True)[0]
381
- >>> mdata[:, -300:].copy().write("papalexi21_subset_200x300_lamindb_demo_2023-07-25.h5mu") # noqa
379
+ >>> !wget https://figshare.com/ndownloader/files/36509460
380
+ >>> import mudata as md
381
+ >>> import scanpy as sc
382
+ >>> mdata = md.read_h5mu("36509460")
383
+ >>> mdata = sc.pp.subsample(mdata, n_obs=200, copy=True)[0]
384
+ >>> mdata[:, -300:].copy().write("papalexi21_subset_200x300_lamindb_demo_2023-07-25.h5mu")
382
385
  """
383
386
  import mudata as md
384
387
 
388
+ md.set_options(pull_on_update=False)
389
+
385
390
  filepath, _ = urlretrieve(
386
391
  "https://lamindb-test.s3.amazonaws.com/papalexi21_subset_200x300_lamindb_demo_2023-07-25.h5mu",
387
392
  "papalexi21_subset.h5mu",
388
393
  )
389
394
 
390
395
  mdata = md.read_h5mu(filepath)
396
+
397
+ mdata.pull_obs()
398
+
399
+ # The MuData object is malformed with duplicated information
400
+ # Drop all columns for the modalities and add them again correspondingly
391
401
  for mod in ["rna", "adt", "hto", "gdo"]:
392
- mdata[mod].obs.drop(
393
- mdata[mod].obs.columns, axis=1, inplace=True
394
- ) # Drop all columns
402
+ mdata[mod].obs.drop(mdata[mod].obs.columns, axis=1, inplace=True)
395
403
  for col in mdata.obs.columns:
396
404
  for mod in ["rna", "adt", "hto", "gdo"]:
397
405
  if col.endswith(f"_{mod.upper()}"):
@@ -420,12 +428,11 @@ def mudata_papalexi21_subset(): # pragma: no cover
420
428
  "HTO_classification",
421
429
  ]:
422
430
  del mdata.obs[col]
423
- mdata.update()
424
431
 
425
- mdata["rna"].obs["percent.mito"] = mdata.obs.pop("percent.mito")
432
+ mdata.push_obs(["percent.mito"], mods=["rna"], drop=True)
426
433
  mdata["hto"].obs["technique"] = "cell hashing"
427
434
  mdata["hto"].obs["technique"] = mdata["hto"].obs["technique"].astype("category")
428
- mdata.update()
435
+ mdata.pull_obs(["technique"], mods="hto")
429
436
 
430
437
  return mdata
431
438
 
@@ -5,24 +5,41 @@ The registry base class:
5
5
  .. autosummary::
6
6
  :toctree: .
7
7
 
8
+ DoesNotExist
8
9
  ValidationError
9
10
  NotebookNotSavedError
10
11
  NoTitleError
11
- MissingTransformSettings
12
- UpdateTransformSettings
12
+ MissingContext
13
+ UpdateContext
13
14
  IntegrityError
14
15
 
15
16
  """
16
17
 
17
18
 
19
+ class TrackNotCalled(SystemExit):
20
+ pass
21
+
22
+
23
+ class NotebookNotSaved(SystemExit):
24
+ pass
25
+
26
+
18
27
  class ValidationError(SystemExit):
19
28
  """Validation error: not mapped in registry."""
20
29
 
21
30
  pass
22
31
 
23
32
 
33
+ # inspired by Django's DoesNotExist
34
+ # equivalent to SQLAlchemy's NoResultFound
35
+ class DoesNotExist(Exception):
36
+ """No record found."""
37
+
38
+ pass
39
+
40
+
24
41
  # -------------------------------------------------------------------------------------
25
- # ln.track() AKA run_context
42
+ # ln.context.track() AKA context
26
43
  # -------------------------------------------------------------------------------------
27
44
 
28
45
 
@@ -48,13 +65,13 @@ class NoTitleError(Exception):
48
65
  pass
49
66
 
50
67
 
51
- class MissingTransformSettings(SystemExit):
68
+ class MissingContext(SystemExit):
52
69
  """User didn't define transform settings."""
53
70
 
54
71
  pass
55
72
 
56
73
 
57
- class UpdateTransformSettings(SystemExit):
74
+ class UpdateContext(SystemExit):
58
75
  """Transform settings require update."""
59
76
 
60
77
  pass
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  from lamindb_setup.core.upath import VALID_COMPOSITE_SUFFIXES, VALID_SIMPLE_SUFFIXES
2
4
 
3
5
  # add new composite suffixes like so
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING, Literal
4
4
 
5
5
  from lamin_utils import logger
6
+ from lamin_utils._base62 import CHARSET_DEFAULT as BASE62_CHARS
6
7
  from lamindb_setup.core.upath import LocalPathClasses, UPath
7
8
  from lnschema_core import ids
8
9
 
@@ -10,6 +11,18 @@ if TYPE_CHECKING:
10
11
  from lnschema_core.models import IsVersioned
11
12
 
12
13
 
14
+ def increment_base62(s: str) -> str:
15
+ # we don't need to throw an error for zzzz because uids are enforced to be unique
16
+ # on the db level and have an enforced maximum length
17
+ value = sum(BASE62_CHARS.index(c) * (62**i) for i, c in enumerate(reversed(s)))
18
+ value += 1
19
+ result = ""
20
+ while value:
21
+ value, remainder = divmod(value, 62)
22
+ result = BASE62_CHARS[remainder] + result
23
+ return result.zfill(len(s))
24
+
25
+
13
26
  def bump_version(
14
27
  version: str,
15
28
  bump_type: str = "minor",
@@ -72,7 +85,6 @@ def set_version(version: str | None = None, previous_version: str | None = None)
72
85
  return version
73
86
 
74
87
 
75
- # uses `initial_version_id` to extract a stem_id that's part of id
76
88
  def init_uid(
77
89
  *,
78
90
  version: str | None = None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lamindb
3
- Version: 0.75.1
3
+ Version: 0.76.1
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,10 +9,10 @@ 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.72.2
13
- Requires-Dist: lamindb_setup==0.76.3
12
+ Requires-Dist: lnschema_core==0.73.1
13
+ Requires-Dist: lamindb_setup==0.76.5
14
14
  Requires-Dist: lamin_utils==0.13.2
15
- Requires-Dist: lamin_cli==0.16.0
15
+ Requires-Dist: lamin_cli==0.16.2
16
16
  Requires-Dist: rapidfuzz
17
17
  Requires-Dist: pyarrow
18
18
  Requires-Dist: typing_extensions!=4.6.0
@@ -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.0 ; extra == "bionty"
27
+ Requires-Dist: bionty==0.48.2 ; 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"
@@ -1,47 +1,47 @@
1
- lamindb/__init__.py,sha256=i66mHHYh9TUGKmCb5WgvaZx0flzOQyKKLcCpz01_8X0,2249
2
- lamindb/_artifact.py,sha256=pu0d2CuRkT4xP5hLpkrKlSPU3Maihmdk1B7VKu-cjj4,42575
1
+ lamindb/__init__.py,sha256=d7viqFNu34u9fGs2xJq5AAD-4-M7VS2reIRP-uEYn54,2270
2
+ lamindb/_artifact.py,sha256=wmcofYb1-23YblpjwFo8X-dLNgB7EfwMtzS7p-CKvhs,42630
3
3
  lamindb/_can_validate.py,sha256=jPZHhtPaZJos5bL8Mk8ZNh34mItwYRwOynhofKUxwfY,17472
4
- lamindb/_collection.py,sha256=vrvuww4MLPx6qHqRWy6tLvRHOmXdvEjYN7dnG9DIIPU,14894
5
- lamindb/_curate.py,sha256=M42XxtcSKSo2Vh3xCio1UogVS0kCG1Dtx5cwEwnWOEM,55508
6
- lamindb/_feature.py,sha256=hLj5KDhIVkZrIa7IbiHGyUBGZS7PeDNxKsNK1EadBAc,7377
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
7
7
  lamindb/_feature_set.py,sha256=DmAy96V_RyV0yiyvWOCHgustXPsCaMwn4TrWwh2qDd8,8104
8
8
  lamindb/_filter.py,sha256=I1tSIF-izmD48YpB8NtKmau59Vpt6C54RPHWc3oinGM,1412
9
- lamindb/_finish.py,sha256=3rGY4RxhcKR1BIdgf6GPB03AArhlV5vYtD6wxtTHYxE,10817
10
- lamindb/_from_values.py,sha256=tE6LKWbixZWbt-ILsy2EeRh7i9eKvvAeJv081VQRGAk,12859
9
+ lamindb/_finish.py,sha256=VtUfnHQOxbxKUMm3IXmxGO4T0XH64w-yeyeIdwvApBw,9433
10
+ lamindb/_from_values.py,sha256=zBOJGt_3mBKjqW5LuzuUysMwGbEcEFtYBJXAcL4Vx_0,13432
11
11
  lamindb/_is_versioned.py,sha256=Z_zVsHTnNaWvD15dEz18VocsSgka53jUzs_wDr78ltI,1344
12
12
  lamindb/_parents.py,sha256=eMavdd6IO6STOVJSlR2TzdRtx6sKYDKsMOtlR3DZlgQ,15599
13
- lamindb/_query_manager.py,sha256=6_ZqQr0SKTYsbMtJd5BmaMoyASIVel5v2F1KMgacWlU,4252
14
- lamindb/_query_set.py,sha256=LM5NsAWy5FCZZSxX1VbE20RdA5nsyk4_5p4abuMjdcI,11662
15
- lamindb/_record.py,sha256=XtNKZol9X5u3h1fecDhOn5Z1OpTXunQ9UrZwcHSiajM,19219
16
- lamindb/_run.py,sha256=xj3ER4F_yWvuNw1mr0XU-QuIPi5hBO7Ue0ygBgJQ6mc,1887
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
16
+ lamindb/_run.py,sha256=5M_r1zGDv9HlqbqRKTWCYCOtENovJ-8mQ4kY7XqcLaU,1888
17
17
  lamindb/_save.py,sha256=9lpFpQLgmPOp6JcoM9XetNkbYu2JgY70sGQZVz3Gzmw,11027
18
18
  lamindb/_storage.py,sha256=GBVChv-DHVMNEBJL5l_JT6B4RDhZ6NnwgzmUICphYKk,413
19
- lamindb/_transform.py,sha256=OtZmCSS-mxWPJU0S6p79sYauY-cKIxqBYfeMX0-SQ_A,3435
19
+ lamindb/_transform.py,sha256=Vw0Ct15nCOmL8-UwDs-hH-rgdX8PfcAadgbh_ynBzQE,3397
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
- lamindb/core/__init__.py,sha256=uCtTkcUwJ7w40cWdaVBymiyxMuKlkdX-QZMtOr3k0us,1441
24
- lamindb/core/_data.py,sha256=AbBVvutI7iFZW5PVEYzx0HIlaLhR9KpnoPyba9OI86k,16253
23
+ lamindb/core/__init__.py,sha256=QePKN3dkGuNEfIc2CKwBt3Kcl39bbghX6XwXKpK3BA0,1491
24
+ lamindb/core/_context.py,sha256=cNj_LDpA9gmkE6P6Gg1cBwp4eFukvMlggivYdrVqM8E,19407
25
+ lamindb/core/_data.py,sha256=eocOXsZGu62LPtz6yIlvHhPSJTf3yF2ITZTffyflWYI,16269
25
26
  lamindb/core/_feature_manager.py,sha256=gJowe9-tifi0Z5IcChV-jtGYVdl6XgR2m_oswwhU17Y,31980
26
- lamindb/core/_label_manager.py,sha256=5jbBF9aYPeeqpDZDimAXskGw76YUaQTQak6XAt6madU,9183
27
- lamindb/core/_mapped_collection.py,sha256=wN2qEXnKrx0kqblVml_Kx9hYomUAZLYKckGXX4-9dr0,19621
28
- lamindb/core/_run_context.py,sha256=bk4hwbGbx1no-JKVpLioIOU5dyO8YCdg-srbQV7UuGE,18371
29
- lamindb/core/_settings.py,sha256=sDfIfq9H7H8nUE51FJF4EO_Zihlxh44S3GbaliHKJY4,6108
27
+ lamindb/core/_label_manager.py,sha256=OO5Tl-ankQZNrF_PQ7_xfkuJ8ytMUvr-9cL9soe1Ceo,9249
28
+ lamindb/core/_mapped_collection.py,sha256=ST-cTfokIGkRadjSHEyvIK2san8cGr7WZpgbgs5neLI,22025
29
+ lamindb/core/_settings.py,sha256=GGEB8BU5GinIfD4ktr1Smp6GPHGaInu46MhP4EecZDY,5950
30
30
  lamindb/core/_sync_git.py,sha256=qc0yfPyKeG4uuNT_3qsv-mkIMqhLFqfXNeNVO49vV00,4547
31
31
  lamindb/core/_track_environment.py,sha256=STzEVUzOeUEWdX7WDJUkKH4u08k7eupRX6AXQwoVt14,828
32
- lamindb/core/exceptions.py,sha256=rNLDlqDJt6stM_HGeE9qR0oWRNn4Kq0WDdIi85P53VA,1057
32
+ lamindb/core/exceptions.py,sha256=qNFYN5Jc7Y6kw4re-jsW0AEIprsV2HB1wTcJiO-u-ks,1278
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=8fapNQmpxlUaiJG9oo9Y4I7xtFXzD077dMwzkeWTMMY,4965
36
+ lamindb/core/versioning.py,sha256=fVzxFcJ8xPPSRuLZuUz_lfAKirI550NQTyKIowQUhhs,5404
37
37
  lamindb/core/datasets/__init__.py,sha256=zRP98oqUAaXhqWyKMiH0s_ImVIuNeziQQ2kQ_t0f-DI,1353
38
- lamindb/core/datasets/_core.py,sha256=04mqj3IVIpY97HlD7VVL6-E6tf7za9suzE3lH07Z698,19564
38
+ lamindb/core/datasets/_core.py,sha256=CgVF_pXuBXLElzubDMsl1DbpYOnXCY0HleITVvBKih4,19873
39
39
  lamindb/core/datasets/_fake.py,sha256=BZF9R_1iF0HDnvtZNqL2FtsjSMuqDIfuFxnw_LJYIh4,953
40
40
  lamindb/core/storage/__init__.py,sha256=MjKg2-p8EbOYTVsgufnK93ut7HG7_MzLDAqtzXt0U2Q,501
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
43
  lamindb/core/storage/_backed_access.py,sha256=MsSgiIccHVhqOcur2lZ4mj5LSIL5OL8nX4eqK6mloU0,4732
44
- lamindb/core/storage/_valid_suffixes.py,sha256=9erE4FX1ArRoTkvn5pzUmlKQSYnKeQBymOnOPCv2TD4,465
44
+ lamindb/core/storage/_valid_suffixes.py,sha256=vUSeQ4s01rdhD_vSd6wKmFBsgMJAKkBMnL_T9Y1znMg,501
45
45
  lamindb/core/storage/_zarr.py,sha256=5ceEz6YIvgvUnVVNWhK5Z4W0WfrvyvY82Yna5jSX1_E,3661
46
46
  lamindb/core/storage/objects.py,sha256=OzvBCS-Urz5mr-O95qYt6RGBDDX5HmjfRRKWPPDn1ZE,1797
47
47
  lamindb/core/storage/paths.py,sha256=I0UjQfXfh3MptfLgpA0iSyR-X9pLOvgtXNr4B_Lwk4g,7810
@@ -52,7 +52,7 @@ lamindb/integrations/__init__.py,sha256=MoLRD_qqX5WHFUAqHL6zoY_cDkWH0zimaGT_1CyX
52
52
  lamindb/integrations/_vitessce.py,sha256=jcpLUNFq1BsDpZDkG5L3nzWNXDLuy3Eep_GfY0XqhhA,5077
53
53
  lamindb/setup/__init__.py,sha256=OwZpZzPDv5lPPGXZP7-zK6UdO4FHvvuBh439yZvIp3A,410
54
54
  lamindb/setup/core/__init__.py,sha256=SevlVrc2AZWL3uALbE5sopxBnIZPWZ1IB0NBDudiAL8,167
55
- lamindb-0.75.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
56
- lamindb-0.75.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
57
- lamindb-0.75.1.dist-info/METADATA,sha256=dhUZDNTu6BtE-J67uGuRwJMQEJk8V_NpEurzVc90GoM,2669
58
- lamindb-0.75.1.dist-info/RECORD,,
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,,