lamindb 1.2.0__py3-none-any.whl → 1.3.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/models/feature.py CHANGED
@@ -47,7 +47,8 @@ def parse_dtype_single_cat(
47
47
  dtype_str: str,
48
48
  related_registries: dict[str, Record] | None = None,
49
49
  is_itype: bool = False,
50
- ) -> dict:
50
+ ) -> dict[str, Any]:
51
+ """Parses a categorical data type string into its components (registry, field, subtypes)."""
51
52
  from .artifact import Artifact
52
53
 
53
54
  assert isinstance(dtype_str, str) # noqa: S101
@@ -116,6 +117,7 @@ def parse_dtype_single_cat(
116
117
 
117
118
 
118
119
  def parse_dtype(dtype_str: str, is_param: bool = False) -> list[dict[str, str]]:
120
+ """Parses feature data type string into a structured list of components."""
119
121
  from .artifact import Artifact
120
122
 
121
123
  allowed_dtypes = FEATURE_DTYPES
@@ -140,7 +142,10 @@ def parse_dtype(dtype_str: str, is_param: bool = False) -> list[dict[str, str]]:
140
142
  return result
141
143
 
142
144
 
143
- def get_dtype_str_from_dtype(dtype: Any, is_itype: bool = False) -> str:
145
+ def get_dtype_str_from_dtype(
146
+ dtype: Record | FieldAttr | list[Record], is_itype: bool = False
147
+ ) -> str:
148
+ """Converts a data type object into its string representation."""
144
149
  if (
145
150
  not isinstance(dtype, list)
146
151
  and hasattr(dtype, "__name__")
@@ -255,6 +260,8 @@ class Feature(Record, CanCurate, TracksRun, TracksUpdates):
255
260
  synonyms: `str | None = None` Bar-separated synonyms.
256
261
  nullable: `bool = True` Whether the feature can have null-like values (`None`, `pd.NA`, `NaN`, etc.), see :attr:`~lamindb.Feature.nullable`.
257
262
  default_value: `Any | None = None` Default value for the feature.
263
+ coerce_dtype: `bool = False` When True, attempts to coerce values to the specified dtype
264
+ during validation, see :attr:`~lamindb.Feature.coerce_dtype`.
258
265
  cat_filters: `dict[str, str] | None = None` Subset a registry by additional filters to define valid categories.
259
266
 
260
267
  Note:
@@ -323,6 +330,7 @@ class Feature(Record, CanCurate, TracksRun, TracksUpdates):
323
330
  _aux_fields: dict[str, tuple[str, type]] = {
324
331
  "0": ("default_value", bool),
325
332
  "1": ("nullable", bool),
333
+ "2": ("coerce_dtype", bool),
326
334
  }
327
335
 
328
336
  id: int = models.AutoField(primary_key=True)
@@ -419,6 +427,7 @@ class Feature(Record, CanCurate, TracksRun, TracksUpdates):
419
427
  synonyms: str | None = None,
420
428
  nullable: bool = True,
421
429
  default_value: str | None = None,
430
+ coerce_dtype: bool = False,
422
431
  cat_filters: dict[str, str] | None = None,
423
432
  ): ...
424
433
 
@@ -440,10 +449,12 @@ class Feature(Record, CanCurate, TracksRun, TracksUpdates):
440
449
  default_value = kwargs.pop("default_value", None)
441
450
  nullable = kwargs.pop("nullable", True) # default value of nullable
442
451
  cat_filters = kwargs.pop("cat_filters", None)
452
+ coerce_dtype = kwargs.pop("coerce_dtype", False)
443
453
  kwargs = process_init_feature_param(args, kwargs)
444
454
  super().__init__(*args, **kwargs)
445
455
  self.default_value = default_value
446
456
  self.nullable = nullable
457
+ self.coerce_dtype = coerce_dtype
447
458
  dtype_str = kwargs.pop("dtype", None)
448
459
  if cat_filters:
449
460
  assert "|" not in dtype_str # noqa: S101
@@ -489,6 +500,25 @@ class Feature(Record, CanCurate, TracksRun, TracksUpdates):
489
500
  super().save(*args, **kwargs)
490
501
  return self
491
502
 
503
+ @property
504
+ def coerce_dtype(self) -> bool:
505
+ """Whether dtypes should be coerced during validation.
506
+
507
+ For example, a `objects`-dtyped pandas column can be coerced to `categorical` and would pass validation if this is true.
508
+ """
509
+ if self._aux is not None and "af" in self._aux and "2" in self._aux["af"]: # type: ignore
510
+ return self._aux["af"]["2"] # type: ignore
511
+ else:
512
+ return False
513
+
514
+ @coerce_dtype.setter
515
+ def coerce_dtype(self, value: bool) -> None:
516
+ if self._aux is None: # type: ignore
517
+ self._aux = {} # type: ignore
518
+ if "af" not in self._aux:
519
+ self._aux["af"] = {}
520
+ self._aux["af"]["2"] = value
521
+
492
522
  @property
493
523
  def default_value(self) -> Any:
494
524
  """A default value that overwrites missing values (default `None`).
lamindb/models/project.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING
3
+ from typing import TYPE_CHECKING, overload
4
4
 
5
5
  from django.core.validators import RegexValidator
6
6
  from django.db import models
@@ -66,6 +66,23 @@ class Person(Record, CanCurate, TracksRun, TracksUpdates, ValidateFields):
66
66
  external: bool = BooleanField(default=True, db_index=True)
67
67
  """Whether the person is external to the organization."""
68
68
 
69
+ @overload
70
+ def __init__(
71
+ self,
72
+ name: str,
73
+ email: str | None = None,
74
+ external: bool = True,
75
+ ): ...
76
+
77
+ @overload
78
+ def __init__(
79
+ self,
80
+ *db_args,
81
+ ): ...
82
+
83
+ def __init__(self, *args, **kwargs):
84
+ super().__init__(*args, **kwargs)
85
+
69
86
 
70
87
  class Reference(Record, CanCurate, TracksRun, TracksUpdates, ValidateFields):
71
88
  """References such as internal studies, papers, documents, or URLs.
@@ -94,12 +111,6 @@ class Reference(Record, CanCurate, TracksRun, TracksUpdates, ValidateFields):
94
111
  """Universal id, valid across DB instances."""
95
112
  name: str = CharField(db_index=True)
96
113
  """Title or name of the reference document."""
97
- abbr: str | None = CharField(
98
- max_length=32,
99
- db_index=True,
100
- null=True,
101
- )
102
- """An abbreviation for the reference."""
103
114
  type: Reference | None = ForeignKey(
104
115
  "self", PROTECT, null=True, related_name="records"
105
116
  )
@@ -111,6 +122,12 @@ class Reference(Record, CanCurate, TracksRun, TracksUpdates, ValidateFields):
111
122
  """Records of this type."""
112
123
  is_type: bool = BooleanField(default=False, db_index=True, null=True)
113
124
  """Distinguish types from instances of the type."""
125
+ abbr: str | None = CharField(
126
+ max_length=32,
127
+ db_index=True,
128
+ null=True,
129
+ )
130
+ """An abbreviation for the reference."""
114
131
  url: str | None = URLField(null=True)
115
132
  """URL linking to the reference."""
116
133
  pubmed_id: int | None = BigIntegerField(null=True, db_index=True)
@@ -147,6 +164,30 @@ class Reference(Record, CanCurate, TracksRun, TracksUpdates, ValidateFields):
147
164
  )
148
165
  """Collections associated with this reference."""
149
166
 
167
+ @overload
168
+ def __init__(
169
+ self,
170
+ name: str,
171
+ type: Reference | None = None,
172
+ is_type: bool = False,
173
+ abbr: str | None = None,
174
+ url: str | None = None,
175
+ pubmed_id: int | None = None,
176
+ doi: str | None = None,
177
+ description: str | None = None,
178
+ text: str | None = None,
179
+ date: DateType | None = None,
180
+ ): ...
181
+
182
+ @overload
183
+ def __init__(
184
+ self,
185
+ *db_args,
186
+ ): ...
187
+
188
+ def __init__(self, *args, **kwargs):
189
+ super().__init__(*args, **kwargs)
190
+
150
191
 
151
192
  class Project(Record, CanCurate, TracksRun, TracksUpdates, ValidateFields):
152
193
  """Projects.
@@ -241,6 +282,27 @@ class Project(Record, CanCurate, TracksRun, TracksUpdates, ValidateFields):
241
282
  _status_code: int = models.SmallIntegerField(default=0, db_index=True)
242
283
  """Status code."""
243
284
 
285
+ @overload
286
+ def __init__(
287
+ self,
288
+ name: str,
289
+ type: Project | None = None,
290
+ is_type: bool = False,
291
+ abbr: str | None = None,
292
+ url: str | None = None,
293
+ start_date: DateType | None = None,
294
+ end_date: DateType | None = None,
295
+ ): ...
296
+
297
+ @overload
298
+ def __init__(
299
+ self,
300
+ *db_args,
301
+ ): ...
302
+
303
+ def __init__(self, *args, **kwargs):
304
+ super().__init__(*args, **kwargs)
305
+
244
306
 
245
307
  class ArtifactProject(BasicRecord, LinkORM, TracksRun):
246
308
  id: int = models.BigAutoField(primary_key=True)
lamindb/models/record.py CHANGED
@@ -13,7 +13,9 @@ from typing import (
13
13
  Any,
14
14
  Literal,
15
15
  NamedTuple,
16
+ TypeVar,
16
17
  Union,
18
+ overload,
17
19
  )
18
20
 
19
21
  import dj_database_url
@@ -88,6 +90,7 @@ if TYPE_CHECKING:
88
90
  from .transform import Transform
89
91
 
90
92
 
93
+ T = TypeVar("T", bound="Record")
91
94
  IPYTHON = getattr(builtins, "__IPYTHON__", False)
92
95
 
93
96
 
@@ -467,19 +470,16 @@ class Registry(ModelBase):
467
470
  return QuerySet(model=cls, using=_using_key).filter(*queries, **expressions)
468
471
 
469
472
  def get(
470
- cls,
473
+ cls: type[T],
471
474
  idlike: int | str | None = None,
472
475
  **expressions,
473
- ) -> Record:
476
+ ) -> T:
474
477
  """Get a single record.
475
478
 
476
479
  Args:
477
480
  idlike: Either a uid stub, uid or an integer id.
478
481
  expressions: Fields and values passed as Django query expressions.
479
482
 
480
- Returns:
481
- A record.
482
-
483
483
  Raises:
484
484
  :exc:`docs:lamindb.errors.DoesNotExist`: In case no matching record is found.
485
485
 
@@ -487,9 +487,10 @@ class Registry(ModelBase):
487
487
  - Guide: :doc:`docs:registries`
488
488
  - Django documentation: `Queries <https://docs.djangoproject.com/en/stable/topics/db/queries/>`__
489
489
 
490
- Examples:
491
- >>> ulabel = ln.ULabel.get("FvtpPJLJ")
492
- >>> ulabel = ln.ULabel.get(name="my-label")
490
+ Examples::
491
+
492
+ ulabel = ln.ULabel.get("FvtpPJLJ")
493
+ ulabel = ln.ULabel.get(name="my-label")
493
494
  """
494
495
  from .query_set import QuerySet
495
496
 
@@ -880,7 +881,13 @@ class BasicRecord(models.Model, metaclass=Registry):
880
881
 
881
882
 
882
883
  class Space(BasicRecord):
883
- """Spaces."""
884
+ """Spaces.
885
+
886
+ You can use spaces to restrict access to records within an instance.
887
+
888
+ All data in this registry is synced from `lamin.ai` to enable re-using spaces across instances.
889
+ There is no need to manually create records.
890
+ """
884
891
 
885
892
  id: int = models.SmallAutoField(primary_key=True)
886
893
  """Internal id, valid only in one DB instance."""
@@ -906,6 +913,26 @@ class Space(BasicRecord):
906
913
  )
907
914
  """Creator of run."""
908
915
 
916
+ @overload
917
+ def __init__(
918
+ self,
919
+ name: str,
920
+ description: str | None = None,
921
+ ): ...
922
+
923
+ @overload
924
+ def __init__(
925
+ self,
926
+ *db_args,
927
+ ): ...
928
+
929
+ def __init__(
930
+ self,
931
+ *args,
932
+ **kwargs,
933
+ ):
934
+ super().__init__(*args, **kwargs)
935
+
909
936
 
910
937
  @doc_args(RECORD_REGISTRY_EXAMPLE)
911
938
  class Record(BasicRecord, metaclass=Registry):
@@ -994,8 +1021,8 @@ def _get_record_kwargs(record_class) -> list[tuple[str, str]]:
994
1021
  pattern = r"@overload\s+def __init__\s*\(([\s\S]*?)\):\s*\.{3}"
995
1022
  overloads = re.finditer(pattern, source)
996
1023
 
997
- for overload in overloads:
998
- params_block = overload.group(1)
1024
+ for single_overload in overloads:
1025
+ params_block = single_overload.group(1)
999
1026
  # This is an additional safety measure if the overloaded signature that we're
1000
1027
  # looking for is not at the top but a "db_args" constructor
1001
1028
  if "*db_args" in params_block:
@@ -1042,13 +1069,14 @@ def _search(
1042
1069
  field: StrField | list[StrField] | None = None,
1043
1070
  limit: int | None = 20,
1044
1071
  case_sensitive: bool = False,
1045
- using_key: str | None = None,
1046
1072
  truncate_string: bool = False,
1047
1073
  ) -> QuerySet:
1048
1074
  if string is None:
1049
1075
  raise ValueError("Cannot search for None value! Please pass a valid string.")
1050
1076
 
1051
- input_queryset = _queryset(cls, using_key=using_key)
1077
+ input_queryset = (
1078
+ cls.all() if isinstance(cls, (QuerySet, Manager)) else cls.objects.all()
1079
+ )
1052
1080
  registry = input_queryset.model
1053
1081
  name_field = getattr(registry, "_name_field", "name")
1054
1082
  if field is None:
@@ -1157,7 +1185,7 @@ def _lookup(
1157
1185
  using_key: str | None = None,
1158
1186
  ) -> NamedTuple:
1159
1187
  """{}""" # noqa: D415
1160
- queryset = _queryset(cls, using_key=using_key)
1188
+ queryset = cls.all() if isinstance(cls, (QuerySet, Manager)) else cls.objects.all()
1161
1189
  field = get_name_field(registry=queryset.model, field=field)
1162
1190
 
1163
1191
  return Lookup(
@@ -1177,7 +1205,7 @@ def _lookup(
1177
1205
  def get_name_field(
1178
1206
  registry: type[Record] | QuerySet | Manager,
1179
1207
  *,
1180
- field: str | StrField | None = None,
1208
+ field: StrField | None = None,
1181
1209
  ) -> str:
1182
1210
  """Get the 1st char or text field from the registry."""
1183
1211
  if isinstance(registry, (QuerySet, Manager)):
@@ -1217,16 +1245,6 @@ def get_name_field(
1217
1245
  return field
1218
1246
 
1219
1247
 
1220
- def _queryset(cls: Record | QuerySet | Manager, using_key: str) -> QuerySet:
1221
- if isinstance(cls, (QuerySet, Manager)):
1222
- return cls.all()
1223
- elif using_key is None or using_key == "default":
1224
- return cls.objects.all()
1225
- else:
1226
- # using must be called on cls, otherwise the connection isn't found
1227
- return cls.using(using_key).all()
1228
-
1229
-
1230
1248
  def add_db_connection(db: str, using: str):
1231
1249
  db_config = dj_database_url.config(
1232
1250
  default=db, conn_max_age=600, conn_health_checks=True
lamindb/models/run.py CHANGED
@@ -23,11 +23,13 @@ from lamindb.errors import ValidationError
23
23
 
24
24
  from ..base.ids import base62_20
25
25
  from .can_curate import CanCurate
26
- from .record import BasicRecord, LinkORM, Record
26
+ from .record import BasicRecord, LinkORM, Record, Registry
27
27
 
28
28
  if TYPE_CHECKING:
29
29
  from datetime import datetime
30
30
 
31
+ from lamindb.base.types import FeatureDtype, FieldAttr
32
+
31
33
  from .artifact import Artifact
32
34
  from .collection import Collection
33
35
  from .project import Project
@@ -235,6 +237,21 @@ class Param(Record, CanCurate, TracksRun, TracksUpdates):
235
237
  values: ParamValue
236
238
  """Values for this parameter."""
237
239
 
240
+ @overload
241
+ def __init__(
242
+ self,
243
+ name: str,
244
+ dtype: FeatureDtype | Registry | list[Registry] | FieldAttr,
245
+ type: Param | None = None,
246
+ is_type: bool = False,
247
+ ): ...
248
+
249
+ @overload
250
+ def __init__(
251
+ self,
252
+ *db_args,
253
+ ): ...
254
+
238
255
  def __init__(self, *args, **kwargs):
239
256
  from .feature import process_init_feature_param
240
257
 
lamindb/models/schema.py CHANGED
@@ -585,14 +585,6 @@ class Schema(Record, CanCurate, TracksRun):
585
585
  self._aux["af"] = {}
586
586
  self._aux["af"]["0"] = value
587
587
 
588
- @coerce_dtype.setter
589
- def coerce_dtype(self, value: bool) -> None:
590
- if self._aux is None:
591
- self._aux = {}
592
- if "af" not in self._aux:
593
- self._aux["af"] = {}
594
- self._aux["af"]["0"] = value
595
-
596
588
  # @property
597
589
  # def index_feature(self) -> None | Feature:
598
590
  # # index_feature: `Record | None = None` A :class:`~lamindb.Feature` to validate the index of a `DataFrame`.
@@ -1,16 +1,17 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lamindb
3
- Version: 1.2.0
3
+ Version: 1.3.0
4
4
  Summary: A data framework for biology.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
- Requires-Python: >=3.10,<3.13
6
+ Requires-Python: >=3.10,<3.14
7
7
  Description-Content-Type: text/markdown
8
8
  Classifier: Programming Language :: Python :: 3.10
9
9
  Classifier: Programming Language :: Python :: 3.11
10
10
  Classifier: Programming Language :: Python :: 3.12
11
- Requires-Dist: lamin_utils==0.13.10
12
- Requires-Dist: lamin_cli==1.1.0
13
- Requires-Dist: lamindb_setup[aws]==1.3.0
11
+ Classifier: Programming Language :: Python :: 3.13
12
+ Requires-Dist: lamin_utils==0.13.11
13
+ Requires-Dist: lamin_cli==1.2.0
14
+ Requires-Dist: lamindb_setup[aws]==1.3.2
14
15
  Requires-Dist: pyyaml
15
16
  Requires-Dist: pyarrow
16
17
  Requires-Dist: pandera
@@ -1,4 +1,4 @@
1
- lamindb/__init__.py,sha256=VIfSurHTzZlbuct1r5lBbJ9K1X5xzcCJ-MBWaEjLXJI,2468
1
+ lamindb/__init__.py,sha256=G2uKSFYRVQni9rx_TyWNVsqG2tdv65RjmDm188hP8Xo,2468
2
2
  lamindb/_finish.py,sha256=UK9XW1qZCd32Nqz0cdKYmpX9ilFU0nGyNb6Urwfx_Nw,19612
3
3
  lamindb/_tracked.py,sha256=JKzYEpqVojklTms0VpP-tU34AHVZG8a13dSl3CfIzwQ,4472
4
4
  lamindb/_view.py,sha256=O9qvwLmgKKsuFMoJ9YjV12cdOUjG6Ez1cQyLGCywm8Y,4964
@@ -10,7 +10,7 @@ lamindb/base/types.py,sha256=JfZk0xmhLsWusU0s4SNjhRnQ52mn-cSiG5Gf4SsACBs,1227
10
10
  lamindb/base/users.py,sha256=8MSmAvCKoUF15YsDE6BGLBXsFWpfoEEg8iDTKZ7kD48,848
11
11
  lamindb/core/__init__.py,sha256=aaBq0UVjNolMynbT1V5hB6UrJm1tK0M6WHu_r6em9_4,604
12
12
  lamindb/core/_compat.py,sha256=NLnKk1qk4xdgMV-QwFDnBnbio02ujjlF86icvhpdv4c,2029
13
- lamindb/core/_context.py,sha256=CiIwU3spy8-bR_zl0pQMBB-CRjQ-oF6UXOAaraeDIp8,30038
13
+ lamindb/core/_context.py,sha256=0JqPGrMsri8XhFwg7ugV-7xBJMF5czR2S610bCpLdZM,30411
14
14
  lamindb/core/_mapped_collection.py,sha256=dxyZ1ZHFn5SBl1xILqN9N6TTUJP0PptVBV-2O0EdZww,25751
15
15
  lamindb/core/_settings.py,sha256=WLjFn9XunEZ9zMy2Qvmc3aJqWMXw2hcG0EBNX9wjkfU,5706
16
16
  lamindb/core/_sync_git.py,sha256=Z7keuyS5X7CAj285sEbZIFExZF9mtjGH8DzKwz3xhHw,5881
@@ -18,10 +18,10 @@ lamindb/core/_track_environment.py,sha256=gKmXiL2meqJT65X-66p_GlonoxzBZXNwNm-G9g
18
18
  lamindb/core/exceptions.py,sha256=FMEoSvT3FvtLkxQAt2oDXPeaPem8V5x5UBbTsPFYU5w,53
19
19
  lamindb/core/loaders.py,sha256=1JHLr4e-gbh8QXiy5duOPsiKo7TKjo74vmvolqhkhgs,5458
20
20
  lamindb/core/types.py,sha256=7QmFnXe7lnr0tyJ0NzzAyvtVZtm9W4Yv0lMmq__CT3E,390
21
- lamindb/core/datasets/__init__.py,sha256=PPraqD4nMr-DvI1_6aDQde2p9MkgJY-ukV0Qb34xnyg,1722
22
- lamindb/core/datasets/_core.py,sha256=9-By-vT7KUbdD8jFQK7KaRcvODj0hiwQMeM2d9mgmss,19661
21
+ lamindb/core/datasets/__init__.py,sha256=g6cSgJmlkLuI6CoxB-Lbg70cpkVZWDuPv-2kcFb0uYs,1745
22
+ lamindb/core/datasets/_core.py,sha256=_PrZSr_rRpfScdzU216YMUR6TxihqA2hffRXmjD5Azw,20344
23
23
  lamindb/core/datasets/_fake.py,sha256=BZF9R_1iF0HDnvtZNqL2FtsjSMuqDIfuFxnw_LJYIh4,953
24
- lamindb/core/datasets/_small.py,sha256=bjjEGXHGLsHNRS9n7xKouyWWVyhdztSqy1R5hjjDUGg,5005
24
+ lamindb/core/datasets/_small.py,sha256=NuovAoA1oMpknQUASErdZgRz4byRQvT4ZgfQRX3GaHY,5597
25
25
  lamindb/core/storage/__init__.py,sha256=JOIMu_7unbyhndtH1j0Q-9AvY8knSuc1IJO9sQnyBAQ,498
26
26
  lamindb/core/storage/_anndata_accessor.py,sha256=oq2e4vlBnGhIeGR5a_8traOV3tKklZJUqcgKt0pEO8c,26187
27
27
  lamindb/core/storage/_anndata_sizes.py,sha256=aXO3OB--tF5MChenSsigW6Q-RuE8YJJOUTVukkLrv9A,1029
@@ -30,13 +30,13 @@ lamindb/core/storage/_pyarrow_dataset.py,sha256=Kvrwuw1-44WpyI7iuKWV5XU3u-wI9-hz
30
30
  lamindb/core/storage/_tiledbsoma.py,sha256=gOcfgMHToI142KqyOYWJMOzmFMLos660k6ZFaAooYPc,10308
31
31
  lamindb/core/storage/_valid_suffixes.py,sha256=vUSeQ4s01rdhD_vSd6wKmFBsgMJAKkBMnL_T9Y1znMg,501
32
32
  lamindb/core/storage/_zarr.py,sha256=cisYXU4_QXMF_ZY2pV52Incus6365mMxRphLaHO76W0,6801
33
- lamindb/core/storage/objects.py,sha256=Ab0Rc-m6XnuYcp-dl39sf1Ori9K_M_stZsoor_1Cvyc,2823
33
+ lamindb/core/storage/objects.py,sha256=l2JTHI7oLMH7JJqxwpyIgMXZJ3gaGv7xl_Jr21wWFAs,2809
34
34
  lamindb/core/storage/paths.py,sha256=wJTD7qza87Xx7ZMo9HFHKgZWaVnst6qc4F2SzqvBMrE,7118
35
35
  lamindb/core/subsettings/__init__.py,sha256=j6G9WAJLK-x9FzPSFw-HJUmOseZKGTbK-oLTKI_X_zs,126
36
36
  lamindb/core/subsettings/_creation_settings.py,sha256=NGHWKqCFSzVNBxAr2VnmdYguiFdW29XUK7T9wRsVshg,906
37
- lamindb/curators/__init__.py,sha256=DFK_8OF0xKFUJ718jywTfJ0FmCVf4R6Fq5WlUfLwapA,142766
38
- lamindb/curators/_cellxgene_schemas/__init__.py,sha256=z-GL_JtFiZhEHUHxQuJBN6SgBCKAMHw9hheDbCje-zk,819
39
- lamindb/curators/_cellxgene_schemas/schema_versions.yml,sha256=nipsuquq-H9n0KNOxctYV6EVshh55FB5AjujLbxsabI,1942
37
+ lamindb/curators/__init__.py,sha256=djRLi1YABJPwKz3wwSGhdRkuy3EC7wJy4pI_Yn6TQRQ,130500
38
+ lamindb/curators/_cellxgene_schemas/__init__.py,sha256=sOlwEBuYrUb8s-_NO0f2tM9cvW6FURLs91FKtTBeKSM,7541
39
+ lamindb/curators/_cellxgene_schemas/schema_versions.csv,sha256=X9rmO88TW1Fht1f5mJs0JdW-VPvyKSajpf8lHNeECj4,1680
40
40
  lamindb/integrations/__init__.py,sha256=RWGMYYIzr8zvmNPyVB4m-p4gMDhxdRbjES2Ed23OItw,215
41
41
  lamindb/integrations/_vitessce.py,sha256=VgO9zAlTSIKDo1wEef_Q4BudTAVtRSZmuzRdCGwBvJk,4016
42
42
  lamindb/migrations/0069_squashed.py,sha256=gMWv65ErtjJZyWWo1b4uFHXWa6MSuBcmqz4ElZ6GPf4,62639
@@ -66,30 +66,30 @@ lamindb/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
66
66
  lamindb/models/__init__.py,sha256=NlnrPiBSv93PttHDrAYnF3RTfiIhgC7QOE_mP0M9Ddc,1934
67
67
  lamindb/models/_describe.py,sha256=B-lmzc8AYaeuKwwRRsF0q8qT6P1i93sEjYkfl0NuyWQ,4926
68
68
  lamindb/models/_django.py,sha256=2LFaTvIPtxIV8_T6Kx0cvquTetj7C3OcnKukUyC9msY,7705
69
- lamindb/models/_feature_manager.py,sha256=rmqCm0GExiBhnamrzwq9aPps-sPMkI-E9sssWC5Mtuw,48538
70
- lamindb/models/_from_values.py,sha256=-yNuFtG6zEvmTjEeCjcGW4mY2gesl6w-1PWYJrnn2us,13625
69
+ lamindb/models/_feature_manager.py,sha256=SoprmJeUGyrEBTWq16gEQoxcaXFKnALdN2IJnnolWCM,50240
70
+ lamindb/models/_from_values.py,sha256=K9iTNJnCo9nKDkulmJ0OgI6_y13By4lOm-NZL8HotN0,14875
71
71
  lamindb/models/_is_versioned.py,sha256=ivtC0t96YI6eaMFqg0ctWY3ert96I_2R-DI5O0Zx7kU,8011
72
72
  lamindb/models/_label_manager.py,sha256=iDmCO6SNJAaskM43wfOoyVweCDuXXXIVhD9fnFdv2Vk,11650
73
73
  lamindb/models/_relations.py,sha256=ONjHPiWIa_Ur7zMNTa_9Uw7K-366GORyPvGoVjf4EQs,3681
74
- lamindb/models/artifact.py,sha256=U2aU9MX-imkznM0XmK2VJHqcKaWHCauUBllkaRsnUac,102007
75
- lamindb/models/can_curate.py,sha256=PCns1oyH-3ZVBRTUmmX6gUftHLm5gSysdwkczgsNloo,30390
74
+ lamindb/models/artifact.py,sha256=TycwzkelBkJYh_282efbDLilNczJac2fRhKh7NyKqfM,102869
75
+ lamindb/models/can_curate.py,sha256=-A1WCO9a8Lf21TsYE58otv-4NVfXV9ajwv6UcM2tCRo,29052
76
76
  lamindb/models/collection.py,sha256=P1E4olaqaPsVYdcQe8AgH_yUUdeQBa6QcyD1Y6Gedjo,26311
77
77
  lamindb/models/core.py,sha256=cjQGk5r0Rzf3zTeC0gn_GB29UfKq34l4hThsNNVhi3o,3965
78
- lamindb/models/feature.py,sha256=vnyGBBh_omOn-7Oj8GeNzMKkrTkw6T8_1aibuQCgfj0,24921
78
+ lamindb/models/feature.py,sha256=-ZoU4Ec6DsGwE1eavUrQC-cPbh2NYB2IunEDCmHCZcM,26274
79
79
  lamindb/models/flextable.py,sha256=ET9j0fTFYQIdXOZfwCnosXOag7nYD1DUV6_wZNqhvOs,5400
80
80
  lamindb/models/has_parents.py,sha256=PEGDiNTK7ikHBHAGsiHK4e6TA9jqUFRom1HSQuyReyE,17942
81
- lamindb/models/project.py,sha256=MZey8OqhW8LfcuOA9lw7Hx5ypBjgsHWKMAj-WJvUZJc,13853
81
+ lamindb/models/project.py,sha256=WSOtM6-hKPeDNOCR6Frq1bJxc27j0HJWhCmFh5L3CiM,15174
82
82
  lamindb/models/query_manager.py,sha256=RqF842cqloAv5z4zLDlWAZfVkLQbhCPry6WQW3CaznI,3713
83
83
  lamindb/models/query_set.py,sha256=buJ-zuua5MTqeEE8WD3lOBZXs19k_r4DuRWPB8Bai5Y,27060
84
- lamindb/models/record.py,sha256=wXYwV1KokvJG5InCKVd09ArdrrMLos_ZK_y-IEmpAMM,64638
85
- lamindb/models/run.py,sha256=fbIjUT9O1zTRod3354twLJFOzeHp0fzvSmrerKosNQo,18519
84
+ lamindb/models/record.py,sha256=Xkr37P60MqmOQgBCgw4H7sLwHi70zLDIJ06ZQt4Q8pk,64893
85
+ lamindb/models/run.py,sha256=VXWzxKZQGKh9UeZTLW3L3zSXn1UvHE5ObT_L9XdjDDU,18877
86
86
  lamindb/models/save.py,sha256=VEq4kmDyDiw9zTQY6meA9c5yT_YU5ldFzRDgKqCX59M,13031
87
- lamindb/models/schema.py,sha256=ZK9Ys_k3aNuXkd7PT9L2oTg_PbgyhesdGRB3GsSOfCE,28971
87
+ lamindb/models/schema.py,sha256=nfS_efk35ULXWM6fkF4GPfBaLwYD4WHPCoPUSpIn7Lw,28735
88
88
  lamindb/models/transform.py,sha256=PbtjakPWmw0iuCG0HPEbysISVX_CoIE2KAPF7L18Vak,13064
89
89
  lamindb/models/ulabel.py,sha256=A8zJcRiGNmq24njLJv7_FuVZJmdtSkN-MSKw5c1QJMo,8605
90
90
  lamindb/setup/__init__.py,sha256=OwZpZzPDv5lPPGXZP7-zK6UdO4FHvvuBh439yZvIp3A,410
91
91
  lamindb/setup/core/__init__.py,sha256=SevlVrc2AZWL3uALbE5sopxBnIZPWZ1IB0NBDudiAL8,167
92
- lamindb-1.2.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
93
- lamindb-1.2.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
94
- lamindb-1.2.0.dist-info/METADATA,sha256=d4d_KZbnr0Pl9aR-k0rchY0kaYJicyD5F0RNFSeegUQ,2675
95
- lamindb-1.2.0.dist-info/RECORD,,
92
+ lamindb-1.3.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
93
+ lamindb-1.3.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
94
+ lamindb-1.3.0.dist-info/METADATA,sha256=CEM_-5XfZuNgGALPTHPZvvdPJQwxDhVjjKbUNTSdsgI,2726
95
+ lamindb-1.3.0.dist-info/RECORD,,
@@ -1,104 +0,0 @@
1
- schema-version:
2
- 4.0.0:
3
- CellType:
4
- cl:
5
- all: "2023-08-24"
6
- ExperimentalFactor:
7
- efo:
8
- all: "3.57.0"
9
- Ethnicity:
10
- hancestro:
11
- human: "3.0"
12
- DevelopmentalStage:
13
- hsapdv:
14
- human: "2020-03-10"
15
- mmusdv:
16
- mouse: "2020-03-10"
17
- Disease:
18
- mondo:
19
- all: "2023-08-02"
20
- Organism:
21
- ncbitaxon:
22
- all: "2023-06-20"
23
- Phenotype:
24
- pato:
25
- all: "2023-05-18"
26
- Tissue:
27
- uberon:
28
- all: "2023-09-05"
29
- Gene:
30
- genecode:
31
- human: "v38"
32
- mouse: "vM27"
33
- 5.0.0:
34
- CellType:
35
- cl:
36
- all: "2024-01-04"
37
- ExperimentalFactor:
38
- efo:
39
- all: "3.62.0"
40
- Ethnicity:
41
- hancestro:
42
- human: "3.0"
43
- DevelopmentalStage:
44
- hsapdv:
45
- human: "2020-03-10"
46
- mmusdv:
47
- mouse: "2020-03-10"
48
- Disease:
49
- mondo:
50
- all: "2024-01-03"
51
- Organism:
52
- ncbitaxon:
53
- all: "2023-06-20"
54
- ensembl:
55
- vertebrates: "release-110"
56
- Phenotype:
57
- pato:
58
- all: "2023-05-18"
59
- Tissue:
60
- uberon:
61
- all: "2024-01-18"
62
- Gene:
63
- genecode:
64
- human: "v44"
65
- mouse: "vM33"
66
- ensembl:
67
- human: "release-110"
68
- mouse: "release-110"
69
- 5.1.0:
70
- CellType:
71
- cl:
72
- all: "2024-04-05"
73
- ExperimentalFactor:
74
- efo:
75
- all: "3.65.0"
76
- Ethnicity:
77
- hancestro:
78
- human: "3.0"
79
- DevelopmentalStage:
80
- hsapdv:
81
- human: "2020-03-10"
82
- mmusdv:
83
- mouse: "2020-03-10"
84
- Disease:
85
- mondo:
86
- all: "2024-05-08"
87
- Organism:
88
- ncbitaxon:
89
- all: "2023-06-20"
90
- ensembl:
91
- vertebrates: "release-110"
92
- Phenotype:
93
- pato:
94
- all: "2023-05-18"
95
- Tissue:
96
- uberon:
97
- all: "2024-03-22"
98
- Gene:
99
- genecode:
100
- human: "v44"
101
- mouse: "vM33"
102
- ensembl:
103
- human: "release-110"
104
- mouse: "release-110"