lamindb 0.74.2__py3-none-any.whl → 0.74.3__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.74.2"
45
+ __version__ = "0.74.3"
46
46
 
47
47
  import os as _os
48
48
 
lamindb/_record.py CHANGED
@@ -529,12 +529,7 @@ def save(self, *args, **kwargs) -> Record:
529
529
  if result is not None:
530
530
  init_self_from_db(self, result)
531
531
  else:
532
- # here, we can't use the parents argument
533
- # parents are not saved for the self record
534
- save_kwargs = kwargs.copy()
535
- if "parents" in save_kwargs:
536
- save_kwargs.pop("parents")
537
- super(Record, self).save(*args, **save_kwargs)
532
+ super(Record, self).save(*args, **kwargs)
538
533
  # perform transfer of many-to-many fields
539
534
  # only supported for Artifact and Collection records
540
535
  if db is not None and db != "default" and using_key is None:
@@ -554,16 +549,8 @@ def save(self, *args, **kwargs) -> Record:
554
549
  self_on_db._state.db = db
555
550
  self_on_db.pk = pk_on_db # manually set the primary key
556
551
  self_on_db.features = FeatureManager(self_on_db)
557
- # by default, transfer parents of the labels to maintain ontological hierarchy
558
- try:
559
- import bionty as bt
560
-
561
- parents = kwargs.get("parents", bt.settings.auto_save_parents)
562
- except ImportError:
563
- parents = kwargs.get("parents", True)
564
- add_from_kwargs = {"parents": parents}
565
- self.features._add_from(self_on_db, **add_from_kwargs)
566
- self.labels.add_from(self_on_db, **add_from_kwargs)
552
+ self.features._add_from(self_on_db)
553
+ self.labels.add_from(self_on_db)
567
554
  return self
568
555
 
569
556
 
lamindb/_save.py CHANGED
@@ -27,9 +27,7 @@ if TYPE_CHECKING:
27
27
  from lamindb_setup.core.upath import UPath
28
28
 
29
29
 
30
- def save(
31
- records: Iterable[Record], ignore_conflicts: bool | None = False, **kwargs
32
- ) -> None:
30
+ def save(records: Iterable[Record], ignore_conflicts: bool | None = False) -> None:
33
31
  """Bulk save to registries & storage.
34
32
 
35
33
  Note:
@@ -47,7 +45,6 @@ def save(
47
45
  unique or another constraint. However, it won't inplace update the id
48
46
  fields of records. If you need records with ids, you need to query
49
47
  them from the database.
50
- **kwargs: Get kwargs related to parents.
51
48
 
52
49
  Examples:
53
50
 
@@ -87,27 +84,12 @@ def save(
87
84
  non_artifacts_with_parents = [
88
85
  r for r in non_artifacts_new if hasattr(r, "_parents")
89
86
  ]
90
- if len(non_artifacts_with_parents) > 0 and kwargs.get("parents") is not False:
87
+ if len(non_artifacts_with_parents) > 0:
91
88
  # this can only happen within lnschema_bionty right now!!
92
89
  # we might extend to core lamindb later
93
- import bionty as bt
94
-
95
- if kwargs.get("parents") or (
96
- kwargs.get("parents") is None and bt.settings.auto_save_parents
97
- ):
98
- mute = False if kwargs.get("mute") is None else kwargs.get("mute")
99
- if not mute:
100
- # save the record with parents one by one
101
- logger.warning(
102
- "now recursing through parents: "
103
- "this only happens once, but is much slower than bulk saving"
104
- )
105
- logger.hint(
106
- "you can switch this off via: bt.settings.auto_save_parents ="
107
- " False"
108
- )
109
- for record in non_artifacts_with_parents:
110
- record._save_ontology_parents(mute=True)
90
+ from lnschema_bionty.core import add_ontology
91
+
92
+ add_ontology(non_artifacts_with_parents)
111
93
 
112
94
  if artifacts:
113
95
  with transaction.atomic():
@@ -770,7 +770,7 @@ def _add_set_from_mudata(
770
770
  self._host.save()
771
771
 
772
772
 
773
- def _add_from(self, data: HasFeatures, parents: bool = True):
773
+ def _add_from(self, data: HasFeatures):
774
774
  """Transfer features from a artifact or collection."""
775
775
  # This only covers feature sets, though.
776
776
  using_key = settings._using_key
@@ -782,23 +782,18 @@ def _add_from(self, data: HasFeatures, parents: bool = True):
782
782
  # note here the features are transferred based on an unique field
783
783
  field = REGISTRY_UNIQUE_FIELD.get(registry.__name__.lower(), "uid")
784
784
  # TODO: get a default ID field for the registry
785
- if hasattr(registry, "ontology_id") and parents:
785
+ if hasattr(registry, "ontology_id"):
786
786
  field = "ontology_id"
787
787
  elif hasattr(registry, "ensembl_gene_id"):
788
788
  field = "ensembl_gene_id"
789
789
  elif hasattr(registry, "uniprotkb_id"):
790
790
  field = "uniprotkb_id"
791
-
792
- if registry.__get_name_with_schema__() == "bionty.Organism":
793
- parents = False
794
791
  # this will be e.g. be a list of ontology_ids or uids
795
792
  member_uids = list(members.values_list(field, flat=True))
796
- # create records from ontology_id in order to populate parents
797
- if field == "ontology_id" and len(member_uids) > 0 and parents:
793
+ # create records from ontology_id
794
+ if field == "ontology_id" and len(member_uids) > 0:
798
795
  # create from bionty
799
- records = registry.from_values(member_uids, field=field)
800
- if len(records) > 0:
801
- save(records, parents=parents)
796
+ save(registry.from_values(member_uids, field=field))
802
797
  validated = registry.validate(member_uids, field=field, mute=True)
803
798
  new_members_uids = list(compress(member_uids, ~validated))
804
799
  new_members = members.filter(**{f"{field}__in": new_members_uids}).all()
@@ -814,7 +809,7 @@ def _add_from(self, data: HasFeatures, parents: bool = True):
814
809
  # in the previous step transfer_fk_to_default_db_bulk
815
810
  transfer_to_default_db(feature, using_key, mute=mute, transfer_fk=False)
816
811
  logger.info(f"saving {n_new_members} new {registry.__name__} records")
817
- save(new_members, parents=parents)
812
+ save(new_members)
818
813
 
819
814
  # create a new feature set from feature values using the same uid
820
815
  feature_set_self = FeatureSet.from_values(
@@ -76,32 +76,28 @@ def print_labels(self: HasFeatures, field: str = "name", print_types: bool = Fal
76
76
 
77
77
 
78
78
  # Alex: is this a label transfer function?
79
- def validate_labels(labels: QuerySet | list | dict, parents: bool = True):
79
+ def validate_labels(labels: QuerySet | list | dict):
80
80
  def validate_labels_registry(
81
- labels: QuerySet | list | dict, parents: bool = True
81
+ labels: QuerySet | list | dict,
82
82
  ) -> tuple[list[str], list[str]]:
83
83
  if len(labels) == 0:
84
84
  return [], []
85
85
  registry = labels[0].__class__
86
86
  field = REGISTRY_UNIQUE_FIELD.get(registry.__name__.lower(), "uid")
87
- if hasattr(registry, "ontology_id") and parents:
87
+ if hasattr(registry, "ontology_id"):
88
88
  field = "ontology_id"
89
89
  elif hasattr(registry, "ensembl_gene_id"):
90
90
  field = "ensembl_gene_id"
91
91
  elif hasattr(registry, "uniprotkb_id"):
92
92
  field = "uniprotkb_id"
93
- if registry.__get_name_with_schema__() == "bionty.Organism":
94
- parents = False
95
93
  # if the field value is None, use uid field
96
94
  label_uids = np.array(
97
95
  [getattr(label, field) for label in labels if label is not None]
98
96
  )
99
- # save labels from ontology_ids so that parents are populated
97
+ # save labels from ontology_ids
100
98
  if field == "ontology_id" and len(label_uids) > 0:
101
99
  try:
102
- records = registry.from_values(label_uids, field=field)
103
- if len(records) > 0:
104
- save(records, parents=parents)
100
+ save(registry.from_values(label_uids, field=field))
105
101
  except Exception: # noqa S110
106
102
  pass
107
103
  field = "uid"
@@ -117,11 +113,9 @@ def validate_labels(labels: QuerySet | list | dict, parents: bool = True):
117
113
  if isinstance(labels, Dict):
118
114
  result = {}
119
115
  for registry, labels_registry in labels.items():
120
- result[registry] = validate_labels_registry(
121
- labels_registry, parents=parents
122
- )
116
+ result[registry] = validate_labels_registry(labels_registry)
123
117
  else:
124
- return validate_labels_registry(labels, parents=parents)
118
+ return validate_labels_registry(labels)
125
119
 
126
120
 
127
121
  class LabelManager:
@@ -176,7 +170,7 @@ class LabelManager:
176
170
 
177
171
  return get_labels(self._host, feature=feature, mute=mute, flat_names=flat_names)
178
172
 
179
- def add_from(self, data: HasFeatures, parents: bool = True) -> None:
173
+ def add_from(self, data: HasFeatures) -> None:
180
174
  """Add labels from an artifact or collection to another artifact or collection.
181
175
 
182
176
  Examples:
@@ -202,7 +196,7 @@ class LabelManager:
202
196
  data_name_lower = data.__class__.__name__.lower()
203
197
  labels_by_features = defaultdict(list)
204
198
  features = set()
205
- _, new_labels = validate_labels(labels, parents=parents)
199
+ _, new_labels = validate_labels(labels)
206
200
  if len(new_labels) > 0:
207
201
  transfer_fk_to_default_db_bulk(new_labels, using_key)
208
202
  for label in labels:
@@ -237,7 +231,7 @@ class LabelManager:
237
231
  transfer_to_default_db(
238
232
  feature, using_key, mute=True, transfer_fk=False
239
233
  )
240
- save(new_features, parents=parents)
234
+ save(new_features)
241
235
  if hasattr(self._host, related_name):
242
236
  for feature_name, labels in labels_by_features.items():
243
237
  if feature_name is not None:
@@ -185,8 +185,6 @@ def anndata_mouse_sc_lymph_node(
185
185
 
186
186
  verbosity = ln.settings.verbosity
187
187
  ln.settings.verbosity = "error"
188
- auto_save_parents = bt.settings.auto_save_parents
189
- bt.settings.auto_save_parents = False
190
188
  # strain
191
189
  bt.ExperimentalFactor.from_public(ontology_id="EFO:0004472").save()
192
190
  # developmental stage
@@ -215,7 +213,6 @@ def anndata_mouse_sc_lymph_node(
215
213
  labels += [ln.ULabel(name=name) for name in adata.obs[col]]
216
214
  ln.save(labels)
217
215
  ln.settings.verbosity = verbosity
218
- bt.settings.auto_save_parents = auto_save_parents
219
216
 
220
217
  return adata
221
218
 
@@ -313,8 +310,6 @@ def anndata_human_immune_cells(
313
310
 
314
311
  verbosity = ln.settings.verbosity
315
312
  ln.settings.verbosity = "error"
316
- auto_save_parents = bt.settings.auto_save_parents
317
- bt.settings.auto_save_parents = False
318
313
  ln.save(
319
314
  bt.Gene.from_values(
320
315
  adata.var.index, field="ensembl_gene_id", organism="human"
@@ -331,7 +326,6 @@ def anndata_human_immune_cells(
331
326
  bt.ExperimentalFactor.from_public(ontology_id="EFO:0008913").save()
332
327
  ln.save([ln.ULabel(name=name) for name in adata.obs.donor.unique()])
333
328
  ln.settings.verbosity = verbosity
334
- bt.settings.auto_save_parents = auto_save_parents
335
329
  return adata
336
330
 
337
331
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lamindb
3
- Version: 0.74.2
3
+ Version: 0.74.3
4
4
  Summary: A data framework for biology.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
6
  Requires-Python: >=3.8
@@ -10,7 +10,7 @@ Classifier: Programming Language :: Python :: 3.9
10
10
  Classifier: Programming Language :: Python :: 3.10
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Requires-Dist: lnschema_core==0.70.5
13
- Requires-Dist: lamindb_setup==0.74.1
13
+ Requires-Dist: lamindb_setup==0.74.2
14
14
  Requires-Dist: lamin_utils==0.13.2
15
15
  Requires-Dist: lamin_cli==0.15.0
16
16
  Requires-Dist: rapidfuzz
@@ -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.44.2 ; extra == "bionty"
27
+ Requires-Dist: bionty==0.44.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"
@@ -37,7 +37,7 @@ Requires-Dist: faker-biology ; extra == "dev"
37
37
  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
- Requires-Dist: nbproject==0.10.3 ; extra == "jupyter"
40
+ Requires-Dist: nbproject==0.10.4 ; extra == "jupyter"
41
41
  Requires-Dist: nbstripout==0.6.1 ; extra == "jupyter"
42
42
  Requires-Dist: nbconvert ; extra == "jupyter"
43
43
  Requires-Dist: zarr>=2.16.0 ; extra == "zarr"
@@ -1,4 +1,4 @@
1
- lamindb/__init__.py,sha256=N8c6LCD-NLi9UTsmkOIvRcPOdu183747G8mdfsLfNJI,2249
1
+ lamindb/__init__.py,sha256=VfwmNQfCefzn3jsRS2l3fnV7jub1RpMj4aVCFh09vxI,2249
2
2
  lamindb/_artifact.py,sha256=pdSMBuZnlr-Jfot8p90x7TEbto-viXyryax5p1FljEs,40133
3
3
  lamindb/_can_validate.py,sha256=CUu-lBY9XnSYGWiazYhLMW5H0LuuR86mVbU7UnIZTVU,15010
4
4
  lamindb/_collection.py,sha256=P4UjZxC2OcViTmqSeW3NIiXU3C0ZF5BF9P6YcchS2Zg,14617
@@ -12,9 +12,9 @@ lamindb/_is_versioned.py,sha256=8pXW2gkLTZsTxRERuWZLidiagNIC8evmCmnbztWkVQ4,1343
12
12
  lamindb/_parents.py,sha256=Zgi9Lmw9td18Y0QJ96rYaBrjSaZ8XGcseWdbJkpJhFU,15061
13
13
  lamindb/_query_manager.py,sha256=6_ZqQr0SKTYsbMtJd5BmaMoyASIVel5v2F1KMgacWlU,4252
14
14
  lamindb/_query_set.py,sha256=LM5NsAWy5FCZZSxX1VbE20RdA5nsyk4_5p4abuMjdcI,11662
15
- lamindb/_record.py,sha256=LPIUvJut4mFqk4231SaA7jpyKcN8K4RU2kpfNIo9I-4,19768
15
+ lamindb/_record.py,sha256=5B0mMvEoZ0gZ6MALy6bsbDOVU47pkVEhRCBVwVJnNwg,19150
16
16
  lamindb/_run.py,sha256=xj3ER4F_yWvuNw1mr0XU-QuIPi5hBO7Ue0ygBgJQ6mc,1887
17
- lamindb/_save.py,sha256=FrtaW8uaw4YLMPixpW1T2o8SmNJqgNdpPF-xUf5tXJ8,11852
17
+ lamindb/_save.py,sha256=xs1ZdTYGd78zA3XqXhiwZ_QKAogLdHCQv1EBVFDWCis,11020
18
18
  lamindb/_storage.py,sha256=GBVChv-DHVMNEBJL5l_JT6B4RDhZ6NnwgzmUICphYKk,413
19
19
  lamindb/_transform.py,sha256=E9C7psuOnsNrUQpWRuGgEUM8_pc7YhDn7n4ieHzB4X0,3169
20
20
  lamindb/_ulabel.py,sha256=XDSdZBXX_ki5s1vOths3MjF2x5DPggBR_PV_KF4SGyg,1611
@@ -22,8 +22,8 @@ lamindb/_utils.py,sha256=LGdiW4k3GClLz65vKAVRkL6Tw-Gkx9DWAdez1jyA5bE,428
22
22
  lamindb/_view.py,sha256=_sAcSD06bC92R_LLDcHMhO0IfOqybBXXRYxOXvm1Juc,2322
23
23
  lamindb/core/__init__.py,sha256=HtyYVFrS6RclSk7gZty9vgXU0k2_oZiqFPfqghBc4Fc,1415
24
24
  lamindb/core/_data.py,sha256=yk2ozTt-mNIA8bWllmcC__WgFukj03fZU41rr_ultlM,16264
25
- lamindb/core/_feature_manager.py,sha256=dWrHtICaJpKdaSKtU9etg3SbUnWJ3fKZWkSM0ZKFJes,32184
26
- lamindb/core/_label_manager.py,sha256=51VzgF_TtdQDmKBjWmZcuE4OHVtsy-HdxdPHhUb5eJg,9659
25
+ lamindb/core/_feature_manager.py,sha256=EvMoY9EAFGdbRkDR44YMJBMWBEt9IbtfZ0RHmiv0D58,31910
26
+ lamindb/core/_label_manager.py,sha256=udG70H1FucAr4lmtFMgAcMJiAcYvoZIyT034NO93YF8,9265
27
27
  lamindb/core/_mapped_collection.py,sha256=SGUsR6RbjNzUOq6A6wTa4M4GkLMuP4Z70WOeF39WPCU,19618
28
28
  lamindb/core/_run_context.py,sha256=w_LdfwYTncCZmh4agNPey37UdKrzSglLfLUNBe5z1mw,18421
29
29
  lamindb/core/_settings.py,sha256=sDfIfq9H7H8nUE51FJF4EO_Zihlxh44S3GbaliHKJY4,6108
@@ -35,7 +35,7 @@ lamindb/core/schema.py,sha256=sNrzWnqeyh9Ppr7yImlSAXiHb_VJdB5DWuO-QERxQGY,1847
35
35
  lamindb/core/types.py,sha256=xeQF2x40p2pR9eIVQrXT74RrS810z2fbjmTRTSQUqPM,230
36
36
  lamindb/core/versioning.py,sha256=lz1JP3K-0npeSTZPY7kMVXqOOcB8IEGmdG0Si3kSdN8,4956
37
37
  lamindb/core/datasets/__init__.py,sha256=zRP98oqUAaXhqWyKMiH0s_ImVIuNeziQQ2kQ_t0f-DI,1353
38
- lamindb/core/datasets/_core.py,sha256=11vsIRREU7TvjwkL2htJWAGoBNCmG2qz8ps4Bd4SNLQ,19873
38
+ lamindb/core/datasets/_core.py,sha256=NhMELgF4aR9HAlU37BF3FkPLobxinRbMJ8s6XwgIqEM,19549
39
39
  lamindb/core/datasets/_fake.py,sha256=BZF9R_1iF0HDnvtZNqL2FtsjSMuqDIfuFxnw_LJYIh4,953
40
40
  lamindb/core/storage/__init__.py,sha256=5LUFQKRr2BX24d-yWBezhTXBV83sShcOvPj5Y5u6qIg,441
41
41
  lamindb/core/storage/_anndata_sizes.py,sha256=aXO3OB--tF5MChenSsigW6Q-RuE8YJJOUTVukkLrv9A,1029
@@ -51,7 +51,7 @@ lamindb/integrations/__init__.py,sha256=aH2PmO2m4-vwIifMYTB0Fyyr_gZWtVnV71jT0tVW
51
51
  lamindb/integrations/_vitessce.py,sha256=VC80NKuzZ0FdjFxaLvyD78kAUNwvwBnGblSPDqT_mGQ,2737
52
52
  lamindb/setup/__init__.py,sha256=OwZpZzPDv5lPPGXZP7-zK6UdO4FHvvuBh439yZvIp3A,410
53
53
  lamindb/setup/core/__init__.py,sha256=SevlVrc2AZWL3uALbE5sopxBnIZPWZ1IB0NBDudiAL8,167
54
- lamindb-0.74.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
55
- lamindb-0.74.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
56
- lamindb-0.74.2.dist-info/METADATA,sha256=PjbRqnIXHyjshCFH9JlZR32KTSw_1i85gT3FWNj4MkI,2669
57
- lamindb-0.74.2.dist-info/RECORD,,
54
+ lamindb-0.74.3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
55
+ lamindb-0.74.3.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
56
+ lamindb-0.74.3.dist-info/METADATA,sha256=v0qwjHuybQfWzw2juEC3T31Ot74DQtbjlUR2Rhzg4Yg,2669
57
+ lamindb-0.74.3.dist-info/RECORD,,