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/__init__.py +1 -1
- lamindb/core/_context.py +6 -0
- lamindb/core/datasets/__init__.py +1 -0
- lamindb/core/datasets/_core.py +23 -0
- lamindb/core/datasets/_small.py +16 -2
- lamindb/core/storage/objects.py +1 -2
- lamindb/curators/__init__.py +1269 -1513
- lamindb/curators/_cellxgene_schemas/__init__.py +190 -18
- lamindb/curators/_cellxgene_schemas/schema_versions.csv +43 -0
- lamindb/models/_feature_manager.py +65 -14
- lamindb/models/_from_values.py +113 -78
- lamindb/models/artifact.py +138 -95
- lamindb/models/can_curate.py +185 -216
- lamindb/models/feature.py +32 -2
- lamindb/models/project.py +69 -7
- lamindb/models/record.py +43 -25
- lamindb/models/run.py +18 -1
- lamindb/models/schema.py +0 -8
- {lamindb-1.2.0.dist-info → lamindb-1.3.0.dist-info}/METADATA +6 -5
- {lamindb-1.2.0.dist-info → lamindb-1.3.0.dist-info}/RECORD +22 -22
- lamindb/curators/_cellxgene_schemas/schema_versions.yml +0 -104
- {lamindb-1.2.0.dist-info → lamindb-1.3.0.dist-info}/LICENSE +0 -0
- {lamindb-1.2.0.dist-info → lamindb-1.3.0.dist-info}/WHEEL +0 -0
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(
|
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
|
-
) ->
|
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
|
-
|
492
|
-
|
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
|
998
|
-
params_block =
|
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 =
|
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 =
|
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:
|
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.
|
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.
|
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
|
-
|
12
|
-
Requires-Dist:
|
13
|
-
Requires-Dist:
|
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=
|
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=
|
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=
|
22
|
-
lamindb/core/datasets/_core.py,sha256=
|
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=
|
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=
|
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=
|
38
|
-
lamindb/curators/_cellxgene_schemas/__init__.py,sha256=
|
39
|
-
lamindb/curators/_cellxgene_schemas/schema_versions.
|
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=
|
70
|
-
lamindb/models/_from_values.py,sha256
|
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=
|
75
|
-
lamindb/models/can_curate.py,sha256
|
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
|
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=
|
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=
|
85
|
-
lamindb/models/run.py,sha256=
|
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=
|
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.
|
93
|
-
lamindb-1.
|
94
|
-
lamindb-1.
|
95
|
-
lamindb-1.
|
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"
|
File without changes
|
File without changes
|