lamindb 0.64.1__py3-none-any.whl → 0.64.2__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 +19 -19
- lamindb/_artifact.py +30 -28
- lamindb/_dataset.py +8 -6
- lamindb/_delete.py +1 -1
- lamindb/_feature.py +3 -3
- lamindb/_feature_set.py +16 -11
- lamindb/_filter.py +1 -1
- lamindb/_from_values.py +8 -8
- lamindb/_parents.py +8 -8
- lamindb/_query_manager.py +12 -14
- lamindb/_query_set.py +19 -19
- lamindb/_registry.py +8 -8
- lamindb/_save.py +3 -3
- lamindb/_storage.py +3 -3
- lamindb/_transform.py +4 -2
- lamindb/_ulabel.py +2 -2
- lamindb/_validate.py +16 -16
- lamindb/_view.py +1 -1
- lamindb/dev/__init__.py +1 -1
- lamindb/dev/_data.py +23 -22
- lamindb/dev/_feature_manager.py +6 -6
- lamindb/dev/_label_manager.py +12 -8
- lamindb/dev/_mapped_dataset.py +3 -3
- lamindb/dev/_run_context.py +11 -9
- lamindb/dev/_view_tree.py +7 -4
- lamindb/dev/datasets/_core.py +8 -8
- lamindb/dev/fields.py +1 -1
- lamindb/dev/storage/_backed_access.py +5 -5
- lamindb/dev/storage/file.py +1 -1
- lamindb/dev/types.py +1 -1
- lamindb/dev/versioning.py +3 -3
- lamindb/setup/__init__.py +1 -1
- {lamindb-0.64.1.dist-info → lamindb-0.64.2.dist-info}/METADATA +1 -1
- lamindb-0.64.2.dist-info/RECORD +48 -0
- lamindb-0.64.1.dist-info/RECORD +0 -48
- {lamindb-0.64.1.dist-info → lamindb-0.64.2.dist-info}/LICENSE +0 -0
- {lamindb-0.64.1.dist-info → lamindb-0.64.2.dist-info}/WHEEL +0 -0
lamindb/_registry.py
CHANGED
@@ -125,7 +125,7 @@ def __init__(orm: Registry, *args, **kwargs):
|
|
125
125
|
def from_values(
|
126
126
|
cls, values: ListLike, field: Optional[StrField] = None, **kwargs
|
127
127
|
) -> List["Registry"]:
|
128
|
-
"""{}"""
|
128
|
+
"""{}."""
|
129
129
|
from_bionty = True if cls.__module__.startswith("lnschema_bionty.") else False
|
130
130
|
field_str = get_default_str_field(cls, field=field)
|
131
131
|
return get_or_create_records(
|
@@ -236,7 +236,7 @@ def search(
|
|
236
236
|
case_sensitive: bool = False,
|
237
237
|
synonyms_field: Optional[StrField] = "synonyms",
|
238
238
|
) -> Union["pd.DataFrame", "QuerySet"]:
|
239
|
-
"""{}"""
|
239
|
+
"""{}."""
|
240
240
|
return _search(
|
241
241
|
cls=cls,
|
242
242
|
string=string,
|
@@ -253,7 +253,7 @@ def _lookup(
|
|
253
253
|
field: Optional[StrField] = None,
|
254
254
|
return_field: Optional[StrField] = None,
|
255
255
|
) -> NamedTuple:
|
256
|
-
"""{}"""
|
256
|
+
"""{}."""
|
257
257
|
queryset = _queryset(cls)
|
258
258
|
field = get_default_str_field(orm=queryset.model, field=field)
|
259
259
|
|
@@ -278,7 +278,7 @@ def lookup(
|
|
278
278
|
field: Optional[StrField] = None,
|
279
279
|
return_field: Optional[StrField] = None,
|
280
280
|
) -> NamedTuple:
|
281
|
-
"""{}"""
|
281
|
+
"""{}."""
|
282
282
|
return _lookup(cls=cls, field=field, return_field=return_field)
|
283
283
|
|
284
284
|
|
@@ -323,7 +323,7 @@ def get_default_str_field(
|
|
323
323
|
except AttributeError:
|
324
324
|
raise TypeError(
|
325
325
|
"please pass a Registry string field, e.g., `CellType.name`!"
|
326
|
-
)
|
326
|
+
) from None
|
327
327
|
|
328
328
|
return field
|
329
329
|
|
@@ -349,7 +349,7 @@ def using(
|
|
349
349
|
cls,
|
350
350
|
instance: str,
|
351
351
|
) -> "QuerySet":
|
352
|
-
"""{}"""
|
352
|
+
"""{}."""
|
353
353
|
owner, name = get_owner_name_from_identifier(instance)
|
354
354
|
load_result = load_instance(owner=owner, name=name)
|
355
355
|
if isinstance(load_result, str):
|
@@ -511,5 +511,5 @@ def __get_name_with_schema__(cls) -> str:
|
|
511
511
|
return f"{schema_name}.{cls.__name__}"
|
512
512
|
|
513
513
|
|
514
|
-
|
515
|
-
|
514
|
+
Registry.__get_schema_name__ = __get_schema_name__
|
515
|
+
Registry.__get_name_with_schema__ = __get_name_with_schema__
|
lamindb/_save.py
CHANGED
@@ -4,7 +4,7 @@ import traceback
|
|
4
4
|
from collections import defaultdict
|
5
5
|
from datetime import datetime
|
6
6
|
from functools import partial
|
7
|
-
from typing import Iterable, List, Optional, Tuple, Union, overload
|
7
|
+
from typing import Iterable, List, Optional, Tuple, Union, overload
|
8
8
|
|
9
9
|
import lamindb_setup
|
10
10
|
from django.db import transaction
|
@@ -47,6 +47,7 @@ def save(
|
|
47
47
|
unique or another constraint. However, it won't inplace update the id
|
48
48
|
fields of records. If you need records with ids, you need to query
|
49
49
|
them from the database.
|
50
|
+
**kwargs: Get kwargs related to parents.
|
50
51
|
|
51
52
|
Examples:
|
52
53
|
|
@@ -74,8 +75,7 @@ def save(
|
|
74
75
|
# previously, this was all set based,
|
75
76
|
# but models without primary keys aren't hashable
|
76
77
|
# we distinguish between artifacts and non-artifacts
|
77
|
-
# for artifacts, we want to bulk-upload
|
78
|
-
# rather than upload one-by-one
|
78
|
+
# for artifacts, we want to bulk-upload rather than upload one-by-one
|
79
79
|
non_artifacts, artifacts = partition(lambda r: isinstance(r, Artifact), records)
|
80
80
|
if non_artifacts:
|
81
81
|
# first save all records that do not yet have a primary key without
|
lamindb/_storage.py
CHANGED
@@ -10,9 +10,9 @@ def root_as_path(self) -> UPath:
|
|
10
10
|
@property # type: ignore
|
11
11
|
@doc_args(Storage.path.__doc__)
|
12
12
|
def path(self) -> UPath:
|
13
|
-
"""{}"""
|
13
|
+
"""{}."""
|
14
14
|
return create_path(self.root)
|
15
15
|
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
Storage.root_as_path = root_as_path
|
18
|
+
Storage.path = path
|
lamindb/_transform.py
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
from typing import Optional
|
1
|
+
from typing import TYPE_CHECKING, Optional
|
2
2
|
|
3
3
|
from lnschema_core.models import TRANSFORM_TYPE_DEFAULT, Transform
|
4
|
-
from lnschema_core.types import TransformType
|
5
4
|
|
6
5
|
from .dev.versioning import get_ids_from_old_version, init_uid
|
7
6
|
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from lnschema_core.types import TransformType
|
9
|
+
|
8
10
|
|
9
11
|
def __init__(transform: Transform, *args, **kwargs):
|
10
12
|
if len(args) == len(transform._meta.concrete_fields):
|
lamindb/_ulabel.py
CHANGED
@@ -29,7 +29,7 @@ def __init__(self, *args, **kwargs):
|
|
29
29
|
)
|
30
30
|
if len(kwargs) > 0:
|
31
31
|
raise ValueError(
|
32
|
-
"Only name, description, reference, reference_type are valid keyword arguments"
|
32
|
+
"Only name, description, reference, reference_type are valid keyword arguments"
|
33
33
|
)
|
34
34
|
super(ULabel, self).__init__(
|
35
35
|
name=name,
|
@@ -42,7 +42,7 @@ def __init__(self, *args, **kwargs):
|
|
42
42
|
@classmethod # type:ignore
|
43
43
|
@doc_args(ULabel.from_values.__doc__)
|
44
44
|
def from_values(cls, values: ListLike, **kwargs) -> List["ULabel"]:
|
45
|
-
"""{}"""
|
45
|
+
"""{}."""
|
46
46
|
records = get_or_create_records(
|
47
47
|
iterable=values,
|
48
48
|
field=ULabel.name,
|
lamindb/_validate.py
CHANGED
@@ -27,7 +27,7 @@ def inspect(
|
|
27
27
|
mute: bool = False,
|
28
28
|
**kwargs,
|
29
29
|
) -> InspectResult:
|
30
|
-
"""{}"""
|
30
|
+
"""{}."""
|
31
31
|
return _inspect(
|
32
32
|
cls=cls,
|
33
33
|
values=values,
|
@@ -47,7 +47,7 @@ def validate(
|
|
47
47
|
mute: bool = False,
|
48
48
|
**kwargs,
|
49
49
|
) -> np.ndarray:
|
50
|
-
"""{}"""
|
50
|
+
"""{}."""
|
51
51
|
return _validate(cls=cls, values=values, field=field, mute=mute, **kwargs)
|
52
52
|
|
53
53
|
|
@@ -59,7 +59,7 @@ def _inspect(
|
|
59
59
|
mute: bool = False,
|
60
60
|
**kwargs,
|
61
61
|
) -> Union["pd.DataFrame", Dict[str, List[str]]]:
|
62
|
-
"""{}"""
|
62
|
+
"""{}."""
|
63
63
|
from lamin_utils._inspect import inspect
|
64
64
|
|
65
65
|
if isinstance(values, str):
|
@@ -142,7 +142,7 @@ def _validate(
|
|
142
142
|
mute: bool = False,
|
143
143
|
**kwargs,
|
144
144
|
) -> np.ndarray:
|
145
|
-
"""{}"""
|
145
|
+
"""{}."""
|
146
146
|
from lamin_utils._inspect import validate
|
147
147
|
|
148
148
|
return_str = True if isinstance(values, str) else False
|
@@ -191,7 +191,7 @@ def standardize(
|
|
191
191
|
synonyms_field: str = "synonyms",
|
192
192
|
**kwargs,
|
193
193
|
) -> Union[List[str], Dict[str, str]]:
|
194
|
-
"""{}"""
|
194
|
+
"""{}."""
|
195
195
|
return _standardize(
|
196
196
|
cls=cls,
|
197
197
|
values=values,
|
@@ -253,7 +253,7 @@ def _standardize(
|
|
253
253
|
synonyms_field: str = "synonyms",
|
254
254
|
**kwargs,
|
255
255
|
) -> Union[List[str], Dict[str, str]]:
|
256
|
-
"""{}"""
|
256
|
+
"""{}."""
|
257
257
|
from lamin_utils._standardize import standardize as map_synonyms
|
258
258
|
|
259
259
|
return_str = True if isinstance(values, str) else False
|
@@ -283,13 +283,13 @@ def _standardize(
|
|
283
283
|
except FieldDoesNotExist:
|
284
284
|
df = pd.DataFrame()
|
285
285
|
|
286
|
-
_kwargs =
|
287
|
-
field
|
288
|
-
return_field
|
289
|
-
case_sensitive
|
290
|
-
keep
|
291
|
-
synonyms_field
|
292
|
-
|
286
|
+
_kwargs = {
|
287
|
+
"field": field,
|
288
|
+
"return_field": return_field,
|
289
|
+
"case_sensitive": case_sensitive,
|
290
|
+
"keep": keep,
|
291
|
+
"synonyms_field": synonyms_field,
|
292
|
+
}
|
293
293
|
# standardized names from the DB
|
294
294
|
std_names_db = map_synonyms(
|
295
295
|
df=df,
|
@@ -383,7 +383,7 @@ def _add_or_remove_synonyms(
|
|
383
383
|
if isinstance(synonym, str):
|
384
384
|
if len(synonym) == 0:
|
385
385
|
return
|
386
|
-
syn_new_set =
|
386
|
+
syn_new_set = {synonym}
|
387
387
|
else:
|
388
388
|
if synonym == [""]:
|
389
389
|
return
|
@@ -392,7 +392,7 @@ def _add_or_remove_synonyms(
|
|
392
392
|
if len(syn_new_set) == 0:
|
393
393
|
return
|
394
394
|
# because we use | as the separator
|
395
|
-
if any(
|
395
|
+
if any("|" in i for i in syn_new_set):
|
396
396
|
raise AssertionError("a synonym can't contain '|'!")
|
397
397
|
|
398
398
|
# existing synonyms
|
@@ -429,7 +429,7 @@ def _check_synonyms_field_exist(record: Registry):
|
|
429
429
|
except AttributeError:
|
430
430
|
raise NotImplementedError(
|
431
431
|
f"No synonyms field found in table {record.__class__.__name__}!"
|
432
|
-
)
|
432
|
+
) from None
|
433
433
|
|
434
434
|
|
435
435
|
def _filter_query_based_on_organism(
|
lamindb/_view.py
CHANGED
@@ -56,7 +56,7 @@ def view(
|
|
56
56
|
df = orm.filter().order_by("-updated_at")[:n].df()
|
57
57
|
else:
|
58
58
|
# need to adjust in the future
|
59
|
-
df = orm.
|
59
|
+
df = orm.df().iloc[-n:]
|
60
60
|
if df.shape[0] > 0:
|
61
61
|
logger.print(colors.blue(colors.bold(orm.__name__)))
|
62
62
|
display(df)
|
lamindb/dev/__init__.py
CHANGED
@@ -58,7 +58,7 @@ from lamindb._query_set import QuerySet
|
|
58
58
|
from lamindb.dev._feature_manager import FeatureManager
|
59
59
|
from lamindb.dev._label_manager import LabelManager
|
60
60
|
|
61
|
-
from . import _data, datasets, exceptions, fields, types
|
61
|
+
from . import _data, datasets, exceptions, fields, types
|
62
62
|
from ._mapped_dataset import MappedDataset
|
63
63
|
from ._run_context import run_context
|
64
64
|
from ._settings import Settings
|
lamindb/dev/_data.py
CHANGED
@@ -17,14 +17,14 @@ from lnschema_core.models import (
|
|
17
17
|
)
|
18
18
|
from lnschema_core.types import StrField
|
19
19
|
|
20
|
-
from lamindb.
|
21
|
-
|
22
|
-
from .._feature_set import (
|
20
|
+
from lamindb._feature_set import (
|
23
21
|
dict_related_model_to_related_name,
|
24
22
|
dict_schema_name_to_model_name,
|
25
23
|
)
|
26
|
-
from
|
27
|
-
from
|
24
|
+
from lamindb._parents import view_lineage
|
25
|
+
from lamindb._query_set import QuerySet
|
26
|
+
from lamindb.dev._settings import settings
|
27
|
+
|
28
28
|
from ._feature_manager import (
|
29
29
|
FeatureManager,
|
30
30
|
get_feature_set_links,
|
@@ -91,7 +91,7 @@ def save_feature_set_links(self: Union[Artifact, Dataset]) -> None:
|
|
91
91
|
|
92
92
|
@doc_args(Data.describe.__doc__)
|
93
93
|
def describe(self: Data):
|
94
|
-
"""{}"""
|
94
|
+
"""{}."""
|
95
95
|
model_name = self.__class__.__name__
|
96
96
|
msg = ""
|
97
97
|
|
@@ -106,7 +106,7 @@ def describe(self: Data):
|
|
106
106
|
|
107
107
|
# Display Provenance
|
108
108
|
# display line by line the foreign key fields
|
109
|
-
from
|
109
|
+
from lamindb._parents import _transform_emoji
|
110
110
|
|
111
111
|
emojis = {
|
112
112
|
"storage": "🗃️",
|
@@ -117,7 +117,7 @@ def describe(self: Data):
|
|
117
117
|
"file": "📄",
|
118
118
|
}
|
119
119
|
if len(foreign_key_fields) > 0: # always True for Artifact and Dataset
|
120
|
-
record_msg = f"{colors.green(model_name)}{__repr__(self, include_foreign_keys=False).lstrip(model_name)}"
|
120
|
+
record_msg = f"{colors.green(model_name)}{__repr__(self, include_foreign_keys=False).lstrip(model_name)}"
|
121
121
|
msg += f"{record_msg}\n\n"
|
122
122
|
|
123
123
|
msg += f"{colors.green('Provenance')}:\n "
|
@@ -134,7 +134,7 @@ def describe(self: Data):
|
|
134
134
|
if self.id is not None and self.input_of.exists():
|
135
135
|
values = [format_field_value(i.run_at) for i in self.input_of.all()]
|
136
136
|
msg += f"⬇️ input_of ({colors.italic('core.Run')}): {values}\n "
|
137
|
-
msg = msg.rstrip("
|
137
|
+
msg = msg.rstrip(" ") # do not use removesuffix as we need to remove 2 or 4 spaces
|
138
138
|
msg += print_features(self)
|
139
139
|
msg += print_labels(self)
|
140
140
|
|
@@ -146,9 +146,7 @@ def validate_feature(feature: Feature, records: List[Registry]) -> None:
|
|
146
146
|
if not isinstance(feature, Feature):
|
147
147
|
raise TypeError("feature has to be of type Feature")
|
148
148
|
if feature._state.adding:
|
149
|
-
registries =
|
150
|
-
[record.__class__.__get_name_with_schema__() for record in records]
|
151
|
-
)
|
149
|
+
registries = {record.__class__.__get_name_with_schema__() for record in records}
|
152
150
|
registries_str = "|".join(registries)
|
153
151
|
msg = (
|
154
152
|
f"ln.Feature(name='{feature.name}', type='category',"
|
@@ -163,7 +161,7 @@ def get_labels(
|
|
163
161
|
mute: bool = False,
|
164
162
|
flat_names: bool = False,
|
165
163
|
) -> Union[QuerySet, Dict[str, QuerySet], List]:
|
166
|
-
"""{}"""
|
164
|
+
"""{}."""
|
167
165
|
if not isinstance(feature, Feature):
|
168
166
|
raise TypeError("feature has to be of type Feature")
|
169
167
|
if feature.registries is None:
|
@@ -190,7 +188,7 @@ def get_labels(
|
|
190
188
|
).all()
|
191
189
|
if flat_names:
|
192
190
|
# returns a flat list of names
|
193
|
-
from
|
191
|
+
from lamindb._registry import get_default_str_field
|
194
192
|
|
195
193
|
values = []
|
196
194
|
for v in qs_by_registry.values():
|
@@ -209,7 +207,7 @@ def add_labels(
|
|
209
207
|
*,
|
210
208
|
field: Optional[StrField] = None,
|
211
209
|
) -> None:
|
212
|
-
"""{}"""
|
210
|
+
"""{}."""
|
213
211
|
if self._state.adding:
|
214
212
|
raise ValueError("Please save the file/dataset before adding a label!")
|
215
213
|
|
@@ -220,6 +218,8 @@ def add_labels(
|
|
220
218
|
if not isinstance(records, List): # avoids warning for pd Series
|
221
219
|
records = list(records)
|
222
220
|
# create records from values
|
221
|
+
if len(records) == 0:
|
222
|
+
return None
|
223
223
|
if isinstance(records[0], str): # type: ignore
|
224
224
|
records_validated = []
|
225
225
|
# feature is needed if we want to create records from values
|
@@ -290,7 +290,7 @@ def add_labels(
|
|
290
290
|
for feature_set in feature_sets
|
291
291
|
if "core.Feature" == feature_set.registry
|
292
292
|
}
|
293
|
-
for registry_name,
|
293
|
+
for registry_name, _ in records_by_registry.items():
|
294
294
|
msg = ""
|
295
295
|
if feature.registries is None or registry_name not in feature.registries:
|
296
296
|
if len(msg) > 0:
|
@@ -423,7 +423,7 @@ def _track_run_input(
|
|
423
423
|
@property # type: ignore
|
424
424
|
@doc_args(Data.features.__doc__)
|
425
425
|
def features(self) -> "FeatureManager":
|
426
|
-
"""{}"""
|
426
|
+
"""{}."""
|
427
427
|
from lamindb.dev._feature_manager import FeatureManager
|
428
428
|
|
429
429
|
return FeatureManager(self)
|
@@ -432,13 +432,14 @@ def features(self) -> "FeatureManager":
|
|
432
432
|
@property # type: ignore
|
433
433
|
@doc_args(Data.labels.__doc__)
|
434
434
|
def labels(self) -> "LabelManager":
|
435
|
-
"""{}"""
|
435
|
+
"""{}."""
|
436
436
|
from lamindb.dev._label_manager import LabelManager
|
437
437
|
|
438
438
|
return LabelManager(self)
|
439
439
|
|
440
440
|
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
441
|
+
Data.features = features
|
442
|
+
Data.labels = labels
|
443
|
+
Data.describe = describe
|
444
|
+
Data.view_lineage = view_lineage
|
445
|
+
Data.view_flow = view_lineage # backward compat
|
lamindb/dev/_feature_manager.py
CHANGED
@@ -4,15 +4,15 @@ import numpy as np
|
|
4
4
|
from lamin_utils import colors
|
5
5
|
from lnschema_core.models import Artifact, Data, Dataset, Feature
|
6
6
|
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from
|
7
|
+
from lamindb._feature_set import FeatureSet
|
8
|
+
from lamindb._query_set import QuerySet
|
9
|
+
from lamindb._registry import (
|
10
10
|
REGISTRY_UNIQUE_FIELD,
|
11
11
|
get_default_str_field,
|
12
12
|
transfer_fk_to_default_db_bulk,
|
13
13
|
transfer_to_default_db,
|
14
14
|
)
|
15
|
-
from
|
15
|
+
from lamindb._save import save
|
16
16
|
|
17
17
|
|
18
18
|
def get_host_id_field(host: Union[Artifact, Dataset]) -> str:
|
@@ -76,7 +76,7 @@ def get_feature_set_links(host: Union[Artifact, Dataset]) -> QuerySet:
|
|
76
76
|
|
77
77
|
|
78
78
|
def print_features(self: Data) -> str:
|
79
|
-
from
|
79
|
+
from lamindb._from_values import _print_values
|
80
80
|
|
81
81
|
msg = ""
|
82
82
|
features_lookup = Feature.objects.using(self._state.db).lookup().dict()
|
@@ -102,7 +102,7 @@ def print_features(self: Data) -> str:
|
|
102
102
|
indent = " "
|
103
103
|
else:
|
104
104
|
labels = {row["registries"]: labels}
|
105
|
-
for registry, labels in labels.items():
|
105
|
+
for registry, labels in labels.items(): # noqa: B020
|
106
106
|
count_str = f"{len(labels)}, {colors.italic(f'{registry}')}"
|
107
107
|
field = get_default_str_field(labels)
|
108
108
|
print_values = _print_values(labels.list(field), n=10)
|
lamindb/dev/_label_manager.py
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
from typing import Dict, List, Optional, Union
|
1
|
+
from typing import Dict, List, Optional, Tuple, Union
|
2
2
|
|
3
3
|
import numpy as np
|
4
4
|
from lamin_utils import colors, logger
|
5
5
|
from lnschema_core.models import Artifact, Data, Dataset, Feature, Registry
|
6
6
|
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from
|
10
|
-
from
|
7
|
+
from lamindb._feature_set import dict_related_model_to_related_name
|
8
|
+
from lamindb._from_values import _print_values
|
9
|
+
from lamindb._query_set import QuerySet
|
10
|
+
from lamindb._registry import (
|
11
11
|
REGISTRY_UNIQUE_FIELD,
|
12
12
|
get_default_str_field,
|
13
13
|
transfer_fk_to_default_db_bulk,
|
14
14
|
transfer_to_default_db,
|
15
15
|
)
|
16
|
-
from
|
16
|
+
from lamindb._save import save
|
17
17
|
|
18
18
|
|
19
19
|
def get_labels_as_dict(self: Data):
|
@@ -42,7 +42,7 @@ def print_labels(self: Data):
|
|
42
42
|
n = labels.count()
|
43
43
|
field = get_default_str_field(labels)
|
44
44
|
print_values = _print_values(labels.list(field), n=10)
|
45
|
-
labels_msg += f" 🏷️ {related_name} ({n}, {colors.italic(related_model)}): {print_values}\n"
|
45
|
+
labels_msg += f" 🏷️ {related_name} ({n}, {colors.italic(related_model)}): {print_values}\n"
|
46
46
|
if len(labels_msg) > 0:
|
47
47
|
return f"{colors.green('Labels')}:\n{labels_msg}"
|
48
48
|
else:
|
@@ -73,7 +73,11 @@ def transfer_add_labels(labels, features_lookup_self, self, row):
|
|
73
73
|
|
74
74
|
|
75
75
|
def validate_labels(labels: Union[QuerySet, List, Dict]):
|
76
|
-
def validate_labels_registry(
|
76
|
+
def validate_labels_registry(
|
77
|
+
labels: Union[QuerySet, List, Dict],
|
78
|
+
) -> Tuple[List[str], List[str]]:
|
79
|
+
if len(labels) == 0:
|
80
|
+
return [], []
|
77
81
|
registry = labels[0].__class__
|
78
82
|
field = REGISTRY_UNIQUE_FIELD.get(registry.__name__.lower(), "uid")
|
79
83
|
label_uids = np.array(
|
lamindb/dev/_mapped_dataset.py
CHANGED
@@ -116,7 +116,7 @@ class MappedDataset:
|
|
116
116
|
with _Connect(storage) as store:
|
117
117
|
var_list.append(_safer_read_index(store["var"]))
|
118
118
|
if self.join_vars == "auto":
|
119
|
-
vars_eq = all(
|
119
|
+
vars_eq = all(var_list[0].equals(vrs) for vrs in var_list[1:])
|
120
120
|
if vars_eq:
|
121
121
|
self.join_vars = None
|
122
122
|
return
|
@@ -159,7 +159,7 @@ class MappedDataset:
|
|
159
159
|
layer_key: Optional[str] = None,
|
160
160
|
):
|
161
161
|
"""Get the index for the data."""
|
162
|
-
layer = storage["X"] if layer_key is None else storage["layers"][layer_key] # type: ignore
|
162
|
+
layer = storage["X"] if layer_key is None else storage["layers"][layer_key] # type: ignore
|
163
163
|
if isinstance(layer, ArrayTypes): # type: ignore
|
164
164
|
# todo: better way to select variables
|
165
165
|
return layer[idx] if var_idxs is None else layer[idx][var_idxs]
|
@@ -174,7 +174,7 @@ class MappedDataset:
|
|
174
174
|
layer_idx[indices[s]] = data[s]
|
175
175
|
return layer_idx if var_idxs is None else layer_idx[var_idxs]
|
176
176
|
|
177
|
-
def get_label_idx(self, storage: StorageType, idx: int, label_key: str): # type: ignore
|
177
|
+
def get_label_idx(self, storage: StorageType, idx: int, label_key: str): # type: ignore
|
178
178
|
"""Get the index for the label by key."""
|
179
179
|
obs = storage["obs"] # type: ignore
|
180
180
|
# how backwards compatible do we want to be here actually?
|
lamindb/dev/_run_context.py
CHANGED
@@ -257,7 +257,7 @@ class run_context:
|
|
257
257
|
old_version_of,
|
258
258
|
) = get_transform_kwargs_from_uid_prefix(
|
259
259
|
module.__lamindb_uid_prefix__,
|
260
|
-
module.__version__, #
|
260
|
+
module.__version__, # type: ignore
|
261
261
|
)
|
262
262
|
short_name = Path(module.__file__).name # type: ignore
|
263
263
|
is_tracked = cls._create_or_load_transform(
|
@@ -293,7 +293,9 @@ class run_context:
|
|
293
293
|
cls.transform = transform_exists
|
294
294
|
|
295
295
|
if new_run is None: # for notebooks, default to loading latest runs
|
296
|
-
new_run =
|
296
|
+
new_run = (
|
297
|
+
False if cls.transform.type == TransformType.notebook.value else True
|
298
|
+
) # type: ignore
|
297
299
|
|
298
300
|
run = None
|
299
301
|
if not new_run: # try loading latest run by same user
|
@@ -371,9 +373,9 @@ class run_context:
|
|
371
373
|
try:
|
372
374
|
path_env = get_notebook_path(return_env=True)
|
373
375
|
except Exception:
|
374
|
-
raise RuntimeError(msg_path_failed)
|
376
|
+
raise RuntimeError(msg_path_failed) from None
|
375
377
|
if path_env is None:
|
376
|
-
raise RuntimeError(msg_path_failed)
|
378
|
+
raise RuntimeError(msg_path_failed) from None
|
377
379
|
notebook_path, _env = path_env
|
378
380
|
else:
|
379
381
|
notebook_path, _env = notebook_path, editor
|
@@ -410,7 +412,7 @@ class run_context:
|
|
410
412
|
" notebook'))`\n\nPlease consider pasting error at:"
|
411
413
|
f" https://github.com/laminlabs/nbproject/issues/new\n\n{e}"
|
412
414
|
)
|
413
|
-
raise RuntimeError(nbproject_failed_msg)
|
415
|
+
raise RuntimeError(nbproject_failed_msg) from None
|
414
416
|
try:
|
415
417
|
from nbproject.dev._metadata_display import DisplayMeta
|
416
418
|
from nbproject.dev._pypackage import infer_pypackages
|
@@ -418,7 +420,7 @@ class run_context:
|
|
418
420
|
dm = DisplayMeta(metadata)
|
419
421
|
logger.important(
|
420
422
|
"notebook imports:"
|
421
|
-
f" {' '.join(dm.pypackage(infer_pypackages(nb, pin_versions=True)))}"
|
423
|
+
f" {' '.join(dm.pypackage(infer_pypackages(nb, pin_versions=True)))}"
|
422
424
|
)
|
423
425
|
except Exception:
|
424
426
|
logger.debug("inferring imported packages failed")
|
@@ -455,11 +457,11 @@ class run_context:
|
|
455
457
|
raise NotebookNotSavedError(
|
456
458
|
"The notebook is not saved, please save the notebook and"
|
457
459
|
" rerun `ln.track()`"
|
458
|
-
)
|
460
|
+
) from None
|
459
461
|
if nbproject_title is None:
|
460
462
|
raise NoTitleError(
|
461
463
|
"Please add a title to your notebook in a markdown cell: # Title"
|
462
|
-
)
|
464
|
+
) from None
|
463
465
|
# colab parsing successful
|
464
466
|
if colab_id is not None:
|
465
467
|
uid = colab_id[:14]
|
@@ -521,7 +523,7 @@ class run_context:
|
|
521
523
|
if updated:
|
522
524
|
raise SystemExit("You can now rerun the script.")
|
523
525
|
else:
|
524
|
-
raise
|
526
|
+
raise OSError("You did not update uid prefix or version")
|
525
527
|
|
526
528
|
@classmethod
|
527
529
|
def _create_or_load_transform(
|
lamindb/dev/_view_tree.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import os
|
2
2
|
from collections import defaultdict
|
3
|
+
from pathlib import Path
|
3
4
|
from typing import Iterable
|
4
5
|
|
5
6
|
from lamindb_setup import settings as setup_settings
|
@@ -13,7 +14,7 @@ def view_tree(
|
|
13
14
|
length_limit: int = 1000,
|
14
15
|
max_files_per_dir_per_type: int = 7,
|
15
16
|
) -> None:
|
16
|
-
"""{}"""
|
17
|
+
"""{}."""
|
17
18
|
if cls.__class__.__name__ == "QuerySet":
|
18
19
|
print("queryset")
|
19
20
|
qs = cls
|
@@ -68,14 +69,16 @@ def _view_tree(
|
|
68
69
|
node = node[part]
|
69
70
|
if node == {}:
|
70
71
|
n_files += 1
|
71
|
-
suffix =
|
72
|
+
suffix = Path(part).suffix
|
72
73
|
if suffix:
|
73
74
|
suffixes.add(suffix)
|
74
75
|
else:
|
75
76
|
n_directories += 1
|
76
77
|
|
77
78
|
# Function to print the tree
|
78
|
-
def print_tree(node, prefix="", depth=0, count=
|
79
|
+
def print_tree(node, prefix="", depth=0, count=None, n_files_per_dir_per_type=None):
|
80
|
+
if count is None:
|
81
|
+
count = [0]
|
79
82
|
if n_files_per_dir_per_type is None:
|
80
83
|
n_files_per_dir_per_type = defaultdict(int)
|
81
84
|
|
@@ -86,7 +89,7 @@ def _view_tree(
|
|
86
89
|
return
|
87
90
|
if only_dirs and child == {}:
|
88
91
|
continue
|
89
|
-
suffix =
|
92
|
+
suffix = Path(name).suffix
|
90
93
|
n_files_per_dir_per_type[suffix] += 1
|
91
94
|
if (
|
92
95
|
depth > 0
|