lamindb 0.64.0__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/_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
- setattr(Registry, "__get_schema_name__", __get_schema_name__)
515
- setattr(Registry, "__get_name_with_schema__", __get_name_with_schema__)
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 # noqa
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
- setattr(Storage, "root_as_path", root_as_path)
18
- setattr(Storage, "path", path)
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" # noqa
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 = dict(
287
- field=field,
288
- return_field=return_field,
289
- case_sensitive=case_sensitive,
290
- keep=keep,
291
- synonyms_field=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 = set([synonym])
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(["|" in i for i in syn_new_set]):
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.filter().df().iloc[-n:]
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 # noqa
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.dev._settings import settings
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 .._parents import view_flow
27
- from .._query_set import QuerySet
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 .._parents import _transform_emoji
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)}" # noqa
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 = set(
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 .._registry import get_default_str_field
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, records in records_by_registry.items():
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
- setattr(Data, "features", features)
442
- setattr(Data, "labels", labels)
443
- setattr(Data, "describe", describe)
444
- setattr(Data, "view_flow", view_flow)
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
@@ -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 .._feature_set import FeatureSet
8
- from .._query_set import QuerySet
9
- from .._registry import (
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 .._save import save
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 .._from_values import _print_values
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)
@@ -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 .._feature_set import dict_related_model_to_related_name
8
- from .._from_values import _print_values
9
- from .._query_set import QuerySet
10
- from .._registry import (
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 .._save import save
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" # noqa
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(labels: Union[QuerySet, List, Dict]):
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(
@@ -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([var_list[0].equals(vrs) for vrs in var_list[1:]])
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 # noqa
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 # noqa
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?
@@ -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__, # noqa type: ignore
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 = False if cls.transform.type == TransformType.notebook.value else True # type: ignore # noqa
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)))}" # noqa
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 IOError("You did not update uid prefix or version")
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 = os.path.splitext(part)[1]
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=[0], n_files_per_dir_per_type=None):
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 = os.path.splitext(name)[1]
92
+ suffix = Path(name).suffix
90
93
  n_files_per_dir_per_type[suffix] += 1
91
94
  if (
92
95
  depth > 0