lamindb 0.75.1__py3-none-any.whl → 0.76.0__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.
lamindb/__init__.py CHANGED
@@ -42,7 +42,7 @@ Modules & settings:
42
42
  """
43
43
 
44
44
  # denote a release candidate for 0.1.0 with 0.1rc1, 0.1a1, 0.1b1, etc.
45
- __version__ = "0.75.1"
45
+ __version__ = "0.76.0"
46
46
 
47
47
  import os as _os
48
48
 
lamindb/_artifact.py CHANGED
@@ -594,6 +594,7 @@ def __init__(artifact: Artifact, *args, **kwargs):
594
594
  kwargs["description"] = description
595
595
  kwargs["visibility"] = visibility
596
596
  kwargs["_accessor"] = accessor
597
+ kwargs["is_new_version_of"] = is_new_version_of
597
598
  # this check needs to come down here because key might be populated from an
598
599
  # existing file path during get_artifact_kwargs_from_data()
599
600
  if (
lamindb/_collection.py CHANGED
@@ -158,6 +158,7 @@ def __init__(
158
158
  run=run,
159
159
  version=version,
160
160
  visibility=visibility,
161
+ is_new_version_of=is_new_version_of,
161
162
  **kwargs,
162
163
  )
163
164
  collection._artifacts = artifacts
lamindb/_feature.py CHANGED
@@ -42,7 +42,7 @@ def __init__(self, *args, **kwargs):
42
42
  return None
43
43
  # now we proceed with the user-facing constructor
44
44
  if len(args) != 0:
45
- raise ValueError("Only non-keyword args allowed")
45
+ raise ValueError("Only keyword args allowed")
46
46
  dtype: type | str = kwargs.pop("dtype") if "dtype" in kwargs else None
47
47
  # cast type
48
48
  if dtype is None:
lamindb/_from_values.py CHANGED
@@ -47,15 +47,35 @@ def get_or_create_records(
47
47
 
48
48
  # new records to be created based on new values
49
49
  if len(nonexist_values) > 0:
50
- if source:
51
- from_source = not source.in_db
52
- elif (
53
- records
54
- and hasattr(records[0], "source_id")
55
- and records[0].source_id
56
- and records[0].source.in_db
57
- ):
50
+ source_record = None
51
+ if from_source:
52
+ if isinstance(source, Record):
53
+ source_record = source
54
+ elif (
55
+ len(records) > 0
56
+ and hasattr(records[0], "source_id")
57
+ and records[0].source_id
58
+ ):
59
+ source_record = records[0].source
60
+ if not source_record and hasattr(Record, "public"):
61
+ from bionty._bionty import get_source_record
62
+
63
+ source_record = get_source_record(Record.public(organism=organism))
64
+ if source_record:
65
+ from bionty.core._add_ontology import check_source_in_db
66
+
67
+ check_source_in_db(
68
+ registry=Record,
69
+ source=source_record,
70
+ update=True,
71
+ )
72
+
73
+ from_source = not source_record.in_db
74
+ elif hasattr(Record, "source_id"):
75
+ from_source = True
76
+ else:
58
77
  from_source = False
78
+
59
79
  if from_source:
60
80
  records_bionty, unmapped_values = create_records_from_source(
61
81
  iterable_idx=nonexist_values,
@@ -211,10 +231,6 @@ def create_records_from_source(
211
231
  return records, iterable_idx
212
232
  # add source record to the kwargs
213
233
  source_record = get_source_record(public_ontology)
214
- if source_record is not None and source_record.in_db:
215
- # skips the creation of records from public if the source is already in the db
216
- return records, iterable_idx
217
-
218
234
  kwargs.update({"source": source_record})
219
235
 
220
236
  # filter the columns in bionty df based on fields
lamindb/_query_set.py CHANGED
@@ -243,10 +243,10 @@ class QuerySet(models.QuerySet, CanValidate):
243
243
  else:
244
244
  raise MultipleResultsFound(self.all())
245
245
 
246
- def latest_version(self) -> RecordsList:
246
+ def latest_version(self) -> QuerySet:
247
247
  """Filter every version family by latest version."""
248
248
  if issubclass(self.model, IsVersioned):
249
- return filter_query_set_by_latest_version(self)
249
+ return self.filter(is_latest=True)
250
250
  else:
251
251
  raise ValueError("Record isn't subclass of `lamindb.core.IsVersioned`")
252
252
 
@@ -288,29 +288,6 @@ class QuerySet(models.QuerySet, CanValidate):
288
288
  return _standardize(cls=self, values=values, field=field, **kwargs)
289
289
 
290
290
 
291
- def filter_query_set_by_latest_version(ordered_query_set: QuerySet) -> RecordsList:
292
- # evaluating length can be very costly, hence, the try-except block
293
- try:
294
- first_record = ordered_query_set[0]
295
- except IndexError:
296
- return ordered_query_set
297
- records_in_view = {}
298
- records_in_view[first_record.stem_uid] = first_record
299
- for record in ordered_query_set:
300
- # this overwrites user-provided ordering (relevant records ordered by a
301
- # certain field will not show if they are not the latest version)
302
- if record.stem_uid not in records_in_view:
303
- records_in_view[record.stem_uid] = record
304
- else:
305
- if record.created_at > records_in_view[record.stem_uid].created_at:
306
- # deleting the entry is needed to preserve the integrity of
307
- # user-provided ordering
308
- del records_in_view[record.stem_uid]
309
- records_in_view[record.stem_uid] = record
310
- list_records_in_view = RecordsList(records_in_view.values())
311
- return list_records_in_view
312
-
313
-
314
291
  models.QuerySet.df = QuerySet.df
315
292
  models.QuerySet.list = QuerySet.list
316
293
  models.QuerySet.first = QuerySet.first
lamindb/_record.py CHANGED
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, List, NamedTuple
5
5
 
6
6
  import dj_database_url
7
7
  import lamindb_setup as ln_setup
8
- from django.db import connections
8
+ from django.db import connections, transaction
9
9
  from django.db.models import IntegerField, Manager, Q, QuerySet, Value
10
10
  from lamin_utils import logger
11
11
  from lamin_utils._lookup import Lookup
@@ -132,7 +132,10 @@ def get(cls, idlike: int | str) -> Record:
132
132
  else:
133
133
  qs = filter(cls, uid__startswith=idlike)
134
134
  if issubclass(cls, IsVersioned):
135
- return qs.latest_version().one()
135
+ if len(idlike) <= cls._len_stem_uid:
136
+ return qs.latest_version().one()
137
+ else:
138
+ return qs.one()
136
139
  else:
137
140
  return qs.one()
138
141
 
@@ -165,9 +168,7 @@ def from_values(
165
168
  ) -> list[Record]:
166
169
  """{}""" # noqa: D415
167
170
  from_source = True if cls.__module__.startswith("bionty.") else False
168
- # if records from source is already saved in db, skip from_source
169
- if isinstance(source, Record) and source.in_db:
170
- from_source = False
171
+
171
172
  field_str = get_name_field(cls, field=field)
172
173
  return get_or_create_records(
173
174
  iterable=values,
@@ -528,7 +529,28 @@ def save(self, *args, **kwargs) -> Record:
528
529
  if result is not None:
529
530
  init_self_from_db(self, result)
530
531
  else:
531
- super(Record, self).save(*args, **kwargs)
532
+ # save versioned record
533
+ if isinstance(self, IsVersioned) and self._is_new_version_of is not None:
534
+ if self._is_new_version_of.is_latest:
535
+ is_new_version_of = self._is_new_version_of
536
+ else:
537
+ # need one additional request
538
+ is_new_version_of = self.__class__.objects.get(
539
+ is_latest=True, uid__startswith=self.stem_uid
540
+ )
541
+ logger.warning(
542
+ f"didn't pass the latest version in `is_new_version_of`, retrieved it: {is_new_version_of}"
543
+ )
544
+ is_new_version_of.is_latest = False
545
+ with transaction.atomic():
546
+ is_new_version_of._is_new_version_of = (
547
+ None # ensure we don't start a recursion
548
+ )
549
+ is_new_version_of.save()
550
+ super(Record, self).save(*args, **kwargs)
551
+ # save unversioned record
552
+ else:
553
+ super(Record, self).save(*args, **kwargs)
532
554
  # perform transfer of many-to-many fields
533
555
  # only supported for Artifact and Collection records
534
556
  if db is not None and db != "default" and using_key is None:
@@ -553,6 +575,30 @@ def save(self, *args, **kwargs) -> Record:
553
575
  return self
554
576
 
555
577
 
578
+ def delete(self) -> None:
579
+ """Delete the record."""
580
+ # note that the logic below does not fire if a record is moved to the trash
581
+ # the idea is that moving a record to the trash should move its entire version family
582
+ # to the trash, whereas permanently deleting should default to only deleting a single record
583
+ # of a version family
584
+ # we can consider making it easy to permanently delete entire version families as well,
585
+ # but that's for another time
586
+ if isinstance(self, IsVersioned) and self.is_latest:
587
+ new_latest = (
588
+ self.__class__.filter(is_latest=False, uid__startswith=self.stem_uid)
589
+ .order_by("-created_at")
590
+ .first()
591
+ )
592
+ if new_latest is not None:
593
+ new_latest.is_latest = True
594
+ with transaction.atomic():
595
+ new_latest.save()
596
+ super(Record, self).delete()
597
+ logger.warning(f"new latest version is {new_latest}")
598
+ return None
599
+ super(Record, self).delete()
600
+
601
+
556
602
  METHOD_NAMES = [
557
603
  "__init__",
558
604
  "filter",
@@ -561,6 +607,7 @@ METHOD_NAMES = [
561
607
  "search",
562
608
  "lookup",
563
609
  "save",
610
+ "delete",
564
611
  "from_values",
565
612
  "using",
566
613
  ]
lamindb/_run.py CHANGED
@@ -42,7 +42,7 @@ def delete_run_artifacts(run: Run) -> None:
42
42
  run.save()
43
43
  if environment is not None:
44
44
  # only delete if there are no other runs attached to this environment
45
- if environment.environment_of.count() == 0:
45
+ if environment._environment_of.count() == 0:
46
46
  environment.delete(permanent=True)
47
47
  if report is not None:
48
48
  report.delete(permanent=True)
lamindb/_transform.py CHANGED
@@ -22,7 +22,6 @@ def __init__(transform: Transform, *args, **kwargs):
22
22
  is_new_version_of: Transform | None = (
23
23
  kwargs.pop("is_new_version_of") if "is_new_version_of" in kwargs else None
24
24
  )
25
- (kwargs.pop("initial_version_id") if "initial_version_id" in kwargs else None)
26
25
  version: str | None = kwargs.pop("version") if "version" in kwargs else None
27
26
  type: TransformType | None = kwargs.pop("type") if "type" in kwargs else "pipeline"
28
27
  reference: str | None = kwargs.pop("reference") if "reference" in kwargs else None
@@ -55,6 +54,7 @@ def __init__(transform: Transform, *args, **kwargs):
55
54
  reference=reference,
56
55
  reference_type=reference_type,
57
56
  _has_consciously_provided_uid=has_consciously_provided_uid,
57
+ is_new_version_of=is_new_version_of,
58
58
  )
59
59
 
60
60
 
@@ -32,14 +32,15 @@ def get_labels_as_dict(self: HasFeatures, links: bool = False):
32
32
  "input_of_runs",
33
33
  "collections",
34
34
  "_source_code_artifact_of",
35
- "report_of",
36
- "environment_of",
35
+ "_report_of",
36
+ "_environment_of",
37
37
  "links_collection",
38
38
  "links_artifact",
39
39
  "links_feature_set",
40
40
  "previous_runs",
41
41
  "_feature_values",
42
- "_lnschema_core_collection__actions_+",
42
+ "_action_targets",
43
+ "_lnschema_core_collection__actions_+", # something seems off with this one
43
44
  "_actions",
44
45
  }
45
46
  labels = {} # type: ignore
@@ -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,10 @@ 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()
429
435
 
430
436
  return mdata
431
437
 
@@ -72,7 +72,6 @@ def set_version(version: str | None = None, previous_version: str | None = None)
72
72
  return version
73
73
 
74
74
 
75
- # uses `initial_version_id` to extract a stem_id that's part of id
76
75
  def init_uid(
77
76
  *,
78
77
  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.0
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.0
13
+ Requires-Dist: lamindb_setup==0.76.4
14
14
  Requires-Dist: lamin_utils==0.13.2
15
- Requires-Dist: lamin_cli==0.16.0
15
+ Requires-Dist: lamin_cli==0.16.1
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.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"
@@ -1,29 +1,29 @@
1
- lamindb/__init__.py,sha256=i66mHHYh9TUGKmCb5WgvaZx0flzOQyKKLcCpz01_8X0,2249
2
- lamindb/_artifact.py,sha256=pu0d2CuRkT4xP5hLpkrKlSPU3Maihmdk1B7VKu-cjj4,42575
1
+ lamindb/__init__.py,sha256=hMTLgL64GkHYHyLFHSCjR64xnvlZclrHKLlUWGuJ3i4,2249
2
+ lamindb/_artifact.py,sha256=z3hJL0A0NQFDf0hvWYt-hZG1nX_tXog9QKtXwCIZxqU,42627
3
3
  lamindb/_can_validate.py,sha256=jPZHhtPaZJos5bL8Mk8ZNh34mItwYRwOynhofKUxwfY,17472
4
- lamindb/_collection.py,sha256=vrvuww4MLPx6qHqRWy6tLvRHOmXdvEjYN7dnG9DIIPU,14894
4
+ lamindb/_collection.py,sha256=PIKeRZ9zttKSyzcz8UMjKNihPO1Qe-E2zfr-Ao5wtJo,14943
5
5
  lamindb/_curate.py,sha256=M42XxtcSKSo2Vh3xCio1UogVS0kCG1Dtx5cwEwnWOEM,55508
6
- lamindb/_feature.py,sha256=hLj5KDhIVkZrIa7IbiHGyUBGZS7PeDNxKsNK1EadBAc,7377
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
9
  lamindb/_finish.py,sha256=3rGY4RxhcKR1BIdgf6GPB03AArhlV5vYtD6wxtTHYxE,10817
10
- lamindb/_from_values.py,sha256=tE6LKWbixZWbt-ILsy2EeRh7i9eKvvAeJv081VQRGAk,12859
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
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
14
+ lamindb/_query_set.py,sha256=f2OAE9j6l6MGAXgKp5wr8bXB1KRzkye9UCp4utyNHeI,10581
15
+ lamindb/_record.py,sha256=PwelJVh5A0RMYa6o05wXvZU_gZyV8tPSILUW-M6m7lc,21195
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
23
  lamindb/core/__init__.py,sha256=uCtTkcUwJ7w40cWdaVBymiyxMuKlkdX-QZMtOr3k0us,1441
24
24
  lamindb/core/_data.py,sha256=AbBVvutI7iFZW5PVEYzx0HIlaLhR9KpnoPyba9OI86k,16253
25
25
  lamindb/core/_feature_manager.py,sha256=gJowe9-tifi0Z5IcChV-jtGYVdl6XgR2m_oswwhU17Y,31980
26
- lamindb/core/_label_manager.py,sha256=5jbBF9aYPeeqpDZDimAXskGw76YUaQTQak6XAt6madU,9183
26
+ lamindb/core/_label_manager.py,sha256=OO5Tl-ankQZNrF_PQ7_xfkuJ8ytMUvr-9cL9soe1Ceo,9249
27
27
  lamindb/core/_mapped_collection.py,sha256=wN2qEXnKrx0kqblVml_Kx9hYomUAZLYKckGXX4-9dr0,19621
28
28
  lamindb/core/_run_context.py,sha256=bk4hwbGbx1no-JKVpLioIOU5dyO8YCdg-srbQV7UuGE,18371
29
29
  lamindb/core/_settings.py,sha256=sDfIfq9H7H8nUE51FJF4EO_Zihlxh44S3GbaliHKJY4,6108
@@ -33,9 +33,9 @@ lamindb/core/exceptions.py,sha256=rNLDlqDJt6stM_HGeE9qR0oWRNn4Kq0WDdIi85P53VA,10
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=bDpD_UejR7Jr-DTsIvoVV3SyHNxIdjziJvCyUSskxNc,4898
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=DnAKMw1MzCrEcqYHoRSaqZYRnO1wwpykPS3YThMN9Es,19827
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
@@ -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.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
56
+ lamindb-0.76.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
57
+ lamindb-0.76.0.dist-info/METADATA,sha256=5NduEIMIlIq6hW-MADbfFtJKsuxY5JZGQwlBO5WZxUQ,2669
58
+ lamindb-0.76.0.dist-info/RECORD,,