lamindb 0.65.0__py3-none-any.whl → 0.65.1__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/_collection.py +11 -1
- lamindb/_parents.py +10 -7
- lamindb/_registry.py +5 -1
- lamindb/dev/__init__.py +9 -1
- lamindb/dev/_data.py +5 -6
- lamindb/dev/_label_manager.py +2 -1
- lamindb/dev/_mapped_collection.py +101 -29
- lamindb/dev/_run_context.py +7 -5
- lamindb/dev/_track_environment.py +7 -3
- {lamindb-0.65.0.dist-info → lamindb-0.65.1.dist-info}/METADATA +2 -2
- {lamindb-0.65.0.dist-info → lamindb-0.65.1.dist-info}/RECORD +14 -14
- {lamindb-0.65.0.dist-info → lamindb-0.65.1.dist-info}/LICENSE +0 -0
- {lamindb-0.65.0.dist-info → lamindb-0.65.1.dist-info}/WHEEL +0 -0
lamindb/__init__.py
CHANGED
lamindb/_collection.py
CHANGED
@@ -314,7 +314,9 @@ def mapped(
|
|
314
314
|
label_keys: Optional[Union[str, List[str]]] = None,
|
315
315
|
join_vars: Optional[Literal["auto", "inner"]] = "auto",
|
316
316
|
encode_labels: bool = True,
|
317
|
+
cache_categories: bool = True,
|
317
318
|
parallel: bool = False,
|
319
|
+
dtype: Optional[str] = None,
|
318
320
|
stream: bool = False,
|
319
321
|
is_run_input: Optional[bool] = None,
|
320
322
|
) -> "MappedCollection":
|
@@ -328,7 +330,15 @@ def mapped(
|
|
328
330
|
path_list.append(artifact.stage())
|
329
331
|
else:
|
330
332
|
path_list.append(artifact.path)
|
331
|
-
return MappedCollection(
|
333
|
+
return MappedCollection(
|
334
|
+
path_list,
|
335
|
+
label_keys,
|
336
|
+
join_vars,
|
337
|
+
encode_labels,
|
338
|
+
cache_categories,
|
339
|
+
parallel,
|
340
|
+
dtype,
|
341
|
+
)
|
332
342
|
|
333
343
|
|
334
344
|
# docstring handled through attach_func_to_class_method
|
lamindb/_parents.py
CHANGED
@@ -317,13 +317,13 @@ def _get_all_parent_runs(data: Union[Artifact, Collection]) -> List:
|
|
317
317
|
inputs_run = (
|
318
318
|
r.__getattribute__(f"input_{name}s").all().filter(visibility=1).list()
|
319
319
|
)
|
320
|
-
if name == "
|
320
|
+
if name == "artifact":
|
321
321
|
inputs_run += r.input_collections.all().filter(visibility=1).list()
|
322
322
|
run_inputs_outputs += [(inputs_run, r)]
|
323
323
|
outputs_run = (
|
324
324
|
r.__getattribute__(f"output_{name}s").all().filter(visibility=1).list()
|
325
325
|
)
|
326
|
-
if name == "
|
326
|
+
if name == "artifact":
|
327
327
|
outputs_run += r.output_collections.all().filter(visibility=1).list()
|
328
328
|
run_inputs_outputs += [(r, outputs_run)]
|
329
329
|
inputs += inputs_run
|
@@ -337,8 +337,11 @@ def _get_all_child_runs(data: Union[Artifact, Collection]) -> List:
|
|
337
337
|
all_runs: Set[Run] = set()
|
338
338
|
run_inputs_outputs = []
|
339
339
|
|
340
|
-
|
341
|
-
|
340
|
+
if data.run is not None:
|
341
|
+
runs = {f.run for f in data.run.__getattribute__(f"output_{name}s").all()}
|
342
|
+
else:
|
343
|
+
runs = set()
|
344
|
+
if name == "artifact" and data.run is not None:
|
342
345
|
runs.update(
|
343
346
|
{
|
344
347
|
f.run
|
@@ -352,13 +355,13 @@ def _get_all_child_runs(data: Union[Artifact, Collection]) -> List:
|
|
352
355
|
inputs_run = (
|
353
356
|
r.__getattribute__(f"input_{name}s").all().filter(visibility=1).list()
|
354
357
|
)
|
355
|
-
if name == "
|
358
|
+
if name == "artifact":
|
356
359
|
inputs_run += r.input_collections.all().filter(visibility=1).list()
|
357
360
|
run_inputs_outputs += [(inputs_run, r)]
|
358
361
|
outputs_run = (
|
359
362
|
r.__getattribute__(f"output_{name}s").all().filter(visibility=1).list()
|
360
363
|
)
|
361
|
-
if name == "
|
364
|
+
if name == "artifact":
|
362
365
|
outputs_run += r.output_collections.all().filter(visibility=1).list()
|
363
366
|
run_inputs_outputs += [(r, outputs_run)]
|
364
367
|
child_runs.update(
|
@@ -366,7 +369,7 @@ def _get_all_child_runs(data: Union[Artifact, Collection]) -> List:
|
|
366
369
|
**{f"input_{name}s__id__in": [i.id for i in outputs_run]}
|
367
370
|
).list()
|
368
371
|
)
|
369
|
-
if name == "
|
372
|
+
if name == "artifact":
|
370
373
|
child_runs.update(
|
371
374
|
Run.filter(
|
372
375
|
input_collections__id__in=[i.id for i in outputs_run]
|
lamindb/_registry.py
CHANGED
@@ -469,7 +469,11 @@ def save(self, *args, **kwargs) -> None:
|
|
469
469
|
if result is not None:
|
470
470
|
init_self_from_db(self, result)
|
471
471
|
else:
|
472
|
-
|
472
|
+
# here, we can't use the parents argument
|
473
|
+
save_kwargs = kwargs.copy()
|
474
|
+
if "parents" in save_kwargs:
|
475
|
+
save_kwargs.pop("parents")
|
476
|
+
super(Registry, self).save(*args, **save_kwargs)
|
473
477
|
if db is not None and db != "default":
|
474
478
|
if hasattr(self, "labels"):
|
475
479
|
from copy import copy
|
lamindb/dev/__init__.py
CHANGED
@@ -24,6 +24,7 @@ Functionality of data registries:
|
|
24
24
|
FeatureManager
|
25
25
|
LabelManager
|
26
26
|
IsTree
|
27
|
+
IsVersioned
|
27
28
|
|
28
29
|
Functionality of metadata registries:
|
29
30
|
|
@@ -51,7 +52,14 @@ Auxiliary tools:
|
|
51
52
|
"""
|
52
53
|
|
53
54
|
from lamin_utils._inspect import InspectResult
|
54
|
-
from lnschema_core.models import
|
55
|
+
from lnschema_core.models import (
|
56
|
+
CanValidate,
|
57
|
+
Data,
|
58
|
+
HasParents,
|
59
|
+
IsTree,
|
60
|
+
IsVersioned,
|
61
|
+
Registry,
|
62
|
+
)
|
55
63
|
|
56
64
|
from lamindb._query_manager import QueryManager
|
57
65
|
from lamindb._query_set import QuerySet
|
lamindb/dev/_data.py
CHANGED
@@ -113,8 +113,7 @@ def describe(self: Data):
|
|
113
113
|
"created_by": "👤",
|
114
114
|
"transform": _transform_emoji(self.transform),
|
115
115
|
"run": "👣",
|
116
|
-
"
|
117
|
-
"file": "📄",
|
116
|
+
"artifact": "📄",
|
118
117
|
}
|
119
118
|
if len(foreign_key_fields) > 0: # always True for Artifact and Collection
|
120
119
|
record_msg = f"{colors.green(model_name)}{__repr__(self, include_foreign_keys=False).lstrip(model_name)}"
|
@@ -209,7 +208,7 @@ def add_labels(
|
|
209
208
|
) -> None:
|
210
209
|
"""{}."""
|
211
210
|
if self._state.adding:
|
212
|
-
raise ValueError("Please save the
|
211
|
+
raise ValueError("Please save the artifact/collection before adding a label!")
|
213
212
|
|
214
213
|
if isinstance(records, (QuerySet, QuerySet.__base__)): # need to have both
|
215
214
|
records = records.list()
|
@@ -331,7 +330,7 @@ def add_labels(
|
|
331
330
|
id=old_feature_set_link.feature_set_id
|
332
331
|
).one()
|
333
332
|
logger.info(
|
334
|
-
"
|
333
|
+
"nothing links to it anymore, deleting feature set"
|
335
334
|
f" {old_feature_set}"
|
336
335
|
)
|
337
336
|
old_feature_set.delete()
|
@@ -368,7 +367,7 @@ def _track_run_input(
|
|
368
367
|
if run is None:
|
369
368
|
if settings.track_run_inputs:
|
370
369
|
logger.hint(
|
371
|
-
"you can auto-track
|
370
|
+
"you can auto-track these data as a run input by calling"
|
372
371
|
" `ln.track()`"
|
373
372
|
)
|
374
373
|
# assume we have a run record
|
@@ -390,7 +389,7 @@ def _track_run_input(
|
|
390
389
|
track_run_input = True
|
391
390
|
else:
|
392
391
|
logger.hint(
|
393
|
-
"track
|
392
|
+
"track these data as a run input by passing `is_run_input=True`"
|
394
393
|
)
|
395
394
|
else:
|
396
395
|
track_run_input = is_run_input
|
lamindb/dev/_label_manager.py
CHANGED
@@ -23,11 +23,12 @@ def get_labels_as_dict(self: Data):
|
|
23
23
|
).items():
|
24
24
|
if related_name in {
|
25
25
|
"feature_sets",
|
26
|
-
"
|
26
|
+
"artifacts",
|
27
27
|
"input_of",
|
28
28
|
"collections",
|
29
29
|
"source_of",
|
30
30
|
"report_of",
|
31
|
+
"environment_of",
|
31
32
|
}:
|
32
33
|
continue
|
33
34
|
if self.id is not None:
|
@@ -57,10 +57,14 @@ class MappedCollection:
|
|
57
57
|
self,
|
58
58
|
path_list: List[Union[str, PathLike]],
|
59
59
|
label_keys: Optional[Union[str, List[str]]] = None,
|
60
|
-
join_vars: Optional[Literal["auto", "inner"]] = "auto",
|
60
|
+
join_vars: Optional[Literal["auto", "inner", "outer"]] = "auto",
|
61
61
|
encode_labels: bool = True,
|
62
|
+
cache_categories: bool = True,
|
62
63
|
parallel: bool = False,
|
64
|
+
dtype: Optional[str] = None,
|
63
65
|
):
|
66
|
+
assert join_vars in {None, "auto", "inner", "outer"}
|
67
|
+
|
64
68
|
self.storages = [] # type: ignore
|
65
69
|
self.conns = [] # type: ignore
|
66
70
|
self.parallel = parallel
|
@@ -86,8 +90,15 @@ class MappedCollection:
|
|
86
90
|
|
87
91
|
self.encode_labels = encode_labels
|
88
92
|
self.label_keys = [label_keys] if isinstance(label_keys, str) else label_keys
|
89
|
-
if self.label_keys is not None
|
90
|
-
|
93
|
+
if self.label_keys is not None:
|
94
|
+
if cache_categories:
|
95
|
+
self._cache_categories(self.label_keys)
|
96
|
+
else:
|
97
|
+
self._cache_cats: dict = {}
|
98
|
+
if self.encode_labels:
|
99
|
+
self._make_encoders(self.label_keys)
|
100
|
+
|
101
|
+
self._dtype = dtype
|
91
102
|
|
92
103
|
self._closed = False
|
93
104
|
|
@@ -104,6 +115,18 @@ class MappedCollection:
|
|
104
115
|
self.conns.append(conn)
|
105
116
|
self.storages.append(storage)
|
106
117
|
|
118
|
+
def _cache_categories(self, label_keys: list):
|
119
|
+
self._cache_cats = {}
|
120
|
+
decode = np.frompyfunc(lambda x: x.decode("utf-8"), 1, 1)
|
121
|
+
for label in label_keys:
|
122
|
+
self._cache_cats[label] = []
|
123
|
+
for storage in self.storages:
|
124
|
+
with _Connect(storage) as store:
|
125
|
+
cats = self.get_categories(store, label)
|
126
|
+
if cats is not None:
|
127
|
+
cats = decode(cats) if isinstance(cats[0], bytes) else cats[...]
|
128
|
+
self._cache_cats[label].append(cats)
|
129
|
+
|
107
130
|
def _make_encoders(self, label_keys: list):
|
108
131
|
self.encoders = []
|
109
132
|
for label in label_keys:
|
@@ -115,20 +138,31 @@ class MappedCollection:
|
|
115
138
|
for storage in self.storages:
|
116
139
|
with _Connect(storage) as store:
|
117
140
|
var_list.append(_safer_read_index(store["var"]))
|
141
|
+
|
142
|
+
self.var_joint = None
|
118
143
|
if self.join_vars == "auto":
|
119
144
|
vars_eq = all(var_list[0].equals(vrs) for vrs in var_list[1:])
|
120
145
|
if vars_eq:
|
121
146
|
self.join_vars = None
|
122
147
|
return
|
123
148
|
else:
|
124
|
-
self.
|
149
|
+
self.var_joint = reduce(pd.Index.intersection, var_list)
|
150
|
+
if len(self.var_joint) > 0:
|
151
|
+
self.join_vars = "inner"
|
152
|
+
else:
|
153
|
+
self.join_vars = "outer"
|
154
|
+
|
125
155
|
if self.join_vars == "inner":
|
126
|
-
self.var_joint
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
156
|
+
if self.var_joint is None:
|
157
|
+
self.var_joint = reduce(pd.Index.intersection, var_list)
|
158
|
+
if len(self.var_joint) == 0:
|
159
|
+
raise ValueError(
|
160
|
+
"The provided AnnData objects don't have shared varibales."
|
161
|
+
)
|
131
162
|
self.var_indices = [vrs.get_indexer(self.var_joint) for vrs in var_list]
|
163
|
+
elif self.join_vars == "outer":
|
164
|
+
self.var_joint = reduce(pd.Index.union, var_list)
|
165
|
+
self.var_indices = [self.var_joint.get_indexer(vrs) for vrs in var_list]
|
132
166
|
|
133
167
|
def __len__(self):
|
134
168
|
return self.n_obs
|
@@ -137,15 +171,21 @@ class MappedCollection:
|
|
137
171
|
obs_idx = self.indices[idx]
|
138
172
|
storage_idx = self.storage_idx[idx]
|
139
173
|
if self.var_indices is not None:
|
140
|
-
|
174
|
+
var_idxs_join = self.var_indices[storage_idx]
|
141
175
|
else:
|
142
|
-
|
176
|
+
var_idxs_join = None
|
143
177
|
|
144
178
|
with _Connect(self.storages[storage_idx]) as store:
|
145
|
-
out = [self.get_data_idx(store, obs_idx,
|
179
|
+
out = [self.get_data_idx(store, obs_idx, var_idxs_join)]
|
146
180
|
if self.label_keys is not None:
|
147
181
|
for i, label in enumerate(self.label_keys):
|
148
|
-
|
182
|
+
if label in self._cache_cats:
|
183
|
+
cats = self._cache_cats[label][storage_idx]
|
184
|
+
if cats is None:
|
185
|
+
cats = []
|
186
|
+
else:
|
187
|
+
cats = None
|
188
|
+
label_idx = self.get_label_idx(store, obs_idx, label, cats)
|
149
189
|
if self.encode_labels:
|
150
190
|
label_idx = self.encoders[i][label_idx]
|
151
191
|
out.append(label_idx)
|
@@ -155,26 +195,50 @@ class MappedCollection:
|
|
155
195
|
self,
|
156
196
|
storage: StorageType, # type: ignore
|
157
197
|
idx: int,
|
158
|
-
|
198
|
+
var_idxs_join: Optional[list] = None,
|
159
199
|
layer_key: Optional[str] = None,
|
160
200
|
):
|
161
201
|
"""Get the index for the data."""
|
162
202
|
layer = storage["X"] if layer_key is None else storage["layers"][layer_key] # type: ignore
|
163
203
|
if isinstance(layer, ArrayTypes): # type: ignore
|
164
|
-
|
165
|
-
|
204
|
+
layer_idx = layer[idx]
|
205
|
+
if self.join_vars is None:
|
206
|
+
result = layer_idx
|
207
|
+
if self._dtype is not None:
|
208
|
+
result = result.astype(self._dtype, copy=False)
|
209
|
+
elif self.join_vars == "outer":
|
210
|
+
dtype = layer_idx.dtype if self._dtype is None else self._dtype
|
211
|
+
result = np.zeros(len(self.var_joint), dtype=dtype)
|
212
|
+
result[var_idxs_join] = layer_idx
|
213
|
+
else: # inner join
|
214
|
+
result = layer_idx[var_idxs_join]
|
215
|
+
if self._dtype is not None:
|
216
|
+
result = result.astype(self._dtype, copy=False)
|
217
|
+
return result
|
166
218
|
else: # assume csr_matrix here
|
167
219
|
data = layer["data"]
|
168
220
|
indices = layer["indices"]
|
169
221
|
indptr = layer["indptr"]
|
170
222
|
s = slice(*(indptr[idx : idx + 2]))
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
223
|
+
data_s = data[s]
|
224
|
+
dtype = data_s.dtype if self._dtype is None else self._dtype
|
225
|
+
if self.join_vars == "outer":
|
226
|
+
layer_idx = np.zeros(len(self.var_joint), dtype=dtype)
|
227
|
+
layer_idx[var_idxs_join[indices[s]]] = data_s
|
228
|
+
else:
|
229
|
+
layer_idx = np.zeros(layer.attrs["shape"][1], dtype=dtype)
|
230
|
+
layer_idx[indices[s]] = data_s
|
231
|
+
if self.join_vars == "inner":
|
232
|
+
layer_idx = layer_idx[var_idxs_join]
|
233
|
+
return layer_idx
|
176
234
|
|
177
|
-
def get_label_idx(
|
235
|
+
def get_label_idx(
|
236
|
+
self,
|
237
|
+
storage: StorageType,
|
238
|
+
idx: int,
|
239
|
+
label_key: str,
|
240
|
+
categories: Optional[list] = None,
|
241
|
+
):
|
178
242
|
"""Get the index for the label by key."""
|
179
243
|
obs = storage["obs"] # type: ignore
|
180
244
|
# how backwards compatible do we want to be here actually?
|
@@ -186,9 +250,11 @@ class MappedCollection:
|
|
186
250
|
label = labels[idx]
|
187
251
|
else:
|
188
252
|
label = labels["codes"][idx]
|
189
|
-
|
190
|
-
|
191
|
-
|
253
|
+
if categories is not None:
|
254
|
+
cats = categories
|
255
|
+
else:
|
256
|
+
cats = self.get_categories(storage, label_key)
|
257
|
+
if cats is not None and len(cats) > 0:
|
192
258
|
label = cats[label]
|
193
259
|
if isinstance(label, bytes):
|
194
260
|
label = label.decode("utf-8")
|
@@ -215,11 +281,14 @@ class MappedCollection:
|
|
215
281
|
"""Get merged labels."""
|
216
282
|
labels_merge = []
|
217
283
|
decode = np.frompyfunc(lambda x: x.decode("utf-8"), 1, 1)
|
218
|
-
for storage in self.storages:
|
284
|
+
for i, storage in enumerate(self.storages):
|
219
285
|
with _Connect(storage) as store:
|
220
286
|
codes = self.get_codes(store, label_key)
|
221
287
|
labels = decode(codes) if isinstance(codes[0], bytes) else codes
|
222
|
-
|
288
|
+
if label_key in self._cache_cats:
|
289
|
+
cats = self._cache_cats[label_key][i]
|
290
|
+
else:
|
291
|
+
cats = self.get_categories(store, label_key)
|
223
292
|
if cats is not None:
|
224
293
|
cats = decode(cats) if isinstance(cats[0], bytes) else cats
|
225
294
|
labels = cats[labels]
|
@@ -230,9 +299,12 @@ class MappedCollection:
|
|
230
299
|
"""Get merged categories."""
|
231
300
|
cats_merge = set()
|
232
301
|
decode = np.frompyfunc(lambda x: x.decode("utf-8"), 1, 1)
|
233
|
-
for storage in self.storages:
|
302
|
+
for i, storage in enumerate(self.storages):
|
234
303
|
with _Connect(storage) as store:
|
235
|
-
|
304
|
+
if label_key in self._cache_cats:
|
305
|
+
cats = self._cache_cats[label_key][i]
|
306
|
+
else:
|
307
|
+
cats = self.get_categories(store, label_key)
|
236
308
|
if cats is not None:
|
237
309
|
cats = decode(cats) if isinstance(cats[0], bytes) else cats
|
238
310
|
cats_merge.update(cats)
|
lamindb/dev/_run_context.py
CHANGED
@@ -33,7 +33,9 @@ msg_manual_init = (
|
|
33
33
|
)
|
34
34
|
|
35
35
|
|
36
|
-
|
36
|
+
# we don't want a real error here, as this is so frequent
|
37
|
+
# in VSCode
|
38
|
+
class UpdateNbWithNonInteractiveEditor(SystemExit):
|
37
39
|
pass
|
38
40
|
|
39
41
|
|
@@ -230,7 +232,7 @@ class run_context:
|
|
230
232
|
"it looks like you are running ln.track() from a "
|
231
233
|
"notebook!\nplease install nbproject: pip install nbproject"
|
232
234
|
)
|
233
|
-
elif isinstance(e,
|
235
|
+
elif isinstance(e, UpdateNbWithNonInteractiveEditor):
|
234
236
|
raise e
|
235
237
|
elif isinstance(e, (NotebookNotSavedError, NoTitleError)):
|
236
238
|
raise e
|
@@ -435,7 +437,7 @@ class run_context:
|
|
435
437
|
cls._notebook_meta = metadata # type: ignore
|
436
438
|
else:
|
437
439
|
msg = msg_manual_init.format(notebook_path=notebook_path_str)
|
438
|
-
raise
|
440
|
+
raise UpdateNbWithNonInteractiveEditor(msg)
|
439
441
|
|
440
442
|
if _env in ("lab", "notebook"):
|
441
443
|
# save the notebook in case that title was updated
|
@@ -450,7 +452,7 @@ class run_context:
|
|
450
452
|
is_interactive = _seconds_modified(_filepath) < 1.5 # should be ~1 sec
|
451
453
|
if not is_interactive and needs_init:
|
452
454
|
msg = msg_manual_init.format(notebook_path=_filepath)
|
453
|
-
raise
|
455
|
+
raise UpdateNbWithNonInteractiveEditor(msg)
|
454
456
|
|
455
457
|
nbproject_id = metadata["id"]
|
456
458
|
nbproject_version = metadata["version"]
|
@@ -509,7 +511,7 @@ class run_context:
|
|
509
511
|
cls._notebook_meta = metadata # type: ignore
|
510
512
|
else:
|
511
513
|
msg = msg_manual_init.format(notebook_path=filepath)
|
512
|
-
raise
|
514
|
+
raise UpdateNbWithNonInteractiveEditor(msg)
|
513
515
|
else:
|
514
516
|
from lamin_cli._transform import update_transform_source_metadata
|
515
517
|
|
@@ -6,9 +6,13 @@ from lnschema_core.models import Run
|
|
6
6
|
|
7
7
|
|
8
8
|
def track_environment(run: Run) -> None:
|
9
|
-
filepath = ln_setup.settings.storage.cache_dir / f"run_env_pip_{run.uid}"
|
9
|
+
filepath = ln_setup.settings.storage.cache_dir / f"run_env_pip_{run.uid}.txt"
|
10
10
|
# create a requirements.txt
|
11
11
|
# we don't create a conda environment.yml mostly for its slowness
|
12
|
-
|
13
|
-
|
12
|
+
try:
|
13
|
+
result = subprocess.run(f"pip freeze > {str(filepath)}", shell=True)
|
14
|
+
except OSError as e:
|
15
|
+
result = None
|
16
|
+
logger.warning(f"could not run pip freeze with error {e}")
|
17
|
+
if result is not None and result.returncode == 0:
|
14
18
|
logger.info(f"tracked pip freeze > {str(filepath)}")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: lamindb
|
3
|
-
Version: 0.65.
|
3
|
+
Version: 0.65.1
|
4
4
|
Summary: A data framework for biology.
|
5
5
|
Author-email: Lamin Labs <open-source@lamin.ai>
|
6
6
|
Requires-Python: >=3.8
|
@@ -10,7 +10,7 @@ Classifier: Programming Language :: Python :: 3.9
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.10
|
11
11
|
Classifier: Programming Language :: Python :: 3.11
|
12
12
|
Requires-Dist: lnschema_core==0.60.0
|
13
|
-
Requires-Dist: lamindb_setup==0.63.
|
13
|
+
Requires-Dist: lamindb_setup==0.63.1
|
14
14
|
Requires-Dist: lamin_utils==0.13.0
|
15
15
|
Requires-Dist: lamin_cli==0.5.0
|
16
16
|
Requires-Dist: rapidfuzz
|
@@ -1,15 +1,15 @@
|
|
1
|
-
lamindb/__init__.py,sha256
|
1
|
+
lamindb/__init__.py,sha256=wu6XUzgFXCaSVeiVPAHKArxslewM8S2OY7-Lwk2w8EM,2691
|
2
2
|
lamindb/_artifact.py,sha256=eWsLj8x6Cqy8MR7LxKyScxozM52MaqOTCK8gplloP2c,38087
|
3
|
-
lamindb/_collection.py,sha256=
|
3
|
+
lamindb/_collection.py,sha256=0gitrRx4K1p9dWp3VSPnEczeuZcRUJPeu9_crTCthZQ,16968
|
4
4
|
lamindb/_delete.py,sha256=jO6kcIoxY6EFgqiVF2vlbXaCaqlI25AvBo7nre3JXkQ,1968
|
5
5
|
lamindb/_feature.py,sha256=AqQZTOL38aElT3-e7WCj8Fm2Xcso0uJO0oE72fQCScU,5989
|
6
6
|
lamindb/_feature_set.py,sha256=KYgdmMdXb21pfpir1J1O21in3nJvUeznECOB38qfTvk,8654
|
7
7
|
lamindb/_filter.py,sha256=YwWqviJ34kHTMJ8NYlrEw-vsrXkKrVIPsEZSBVvMcrI,1163
|
8
8
|
lamindb/_from_values.py,sha256=dKz4cTUBRkXOOzFX2Ix2cKhK2Lw9PyTgi7d0PI-kh3c,11869
|
9
|
-
lamindb/_parents.py,sha256=
|
9
|
+
lamindb/_parents.py,sha256=KU_xH5mWBEQzBi7VSemDOOfB7H1PpReh0U6268v-8Q0,14020
|
10
10
|
lamindb/_query_manager.py,sha256=m4WUScviuNlMHeNEPZ8H8y0YsMXSbwWyfIgS4L00wBY,4332
|
11
11
|
lamindb/_query_set.py,sha256=nacnkFaVYDmuFkpXr0fb3uNcWP6XahbMeIvJic0YCSk,9967
|
12
|
-
lamindb/_registry.py,sha256=
|
12
|
+
lamindb/_registry.py,sha256=MxYpJUKD6Qu5eO2jO6JOcQBBGxfQpiEGPJrFaXau_jw,17421
|
13
13
|
lamindb/_run.py,sha256=659lqY32GW7F41rFUUo37OftUa38-p8yaV9Z0oF32CE,1120
|
14
14
|
lamindb/_save.py,sha256=UlRHJGUiHGOXv90wmawZVsOqhJIqk8f1wj8MW3Rlq_c,10535
|
15
15
|
lamindb/_storage.py,sha256=mz2Cy0CTaeJGA03A1FPQmmH0Vt2ib_KlXklaLqtN1mU,394
|
@@ -18,14 +18,14 @@ lamindb/_ulabel.py,sha256=HALoy6HerRnehR-u8zPH-qmiFQHWxeAwkZ31jxjrfgI,1893
|
|
18
18
|
lamindb/_utils.py,sha256=LGdiW4k3GClLz65vKAVRkL6Tw-Gkx9DWAdez1jyA5bE,428
|
19
19
|
lamindb/_validate.py,sha256=fS2685MYX9h6iAWymEorJJmDYA2CGNOSmJpesbG6faU,14400
|
20
20
|
lamindb/_view.py,sha256=yFMu4vnt0YqvN1q11boAkwigxCH1gdliDUSbzh3IuDw,2175
|
21
|
-
lamindb/dev/__init__.py,sha256=
|
22
|
-
lamindb/dev/_data.py,sha256=
|
21
|
+
lamindb/dev/__init__.py,sha256=8EwMNFJ45Ws5ApoYjaXOuca4uvyR6WtjAvnfbq7M11g,1146
|
22
|
+
lamindb/dev/_data.py,sha256=YPZ664qGKMl34LbZCMCEFIxQ-E81iAt_b3lvMiTe-oc,17066
|
23
23
|
lamindb/dev/_feature_manager.py,sha256=jn8x_JbrtLFelmaFh4noOXqGSCfqVuVX0quoa7gTJtM,9366
|
24
|
-
lamindb/dev/_label_manager.py,sha256=
|
25
|
-
lamindb/dev/_mapped_collection.py,sha256=
|
26
|
-
lamindb/dev/_run_context.py,sha256=
|
24
|
+
lamindb/dev/_label_manager.py,sha256=6E_pSQicqfTWDGEGe4WPn_3GZl_CCIMTZ6xJDh4EkC0,8740
|
25
|
+
lamindb/dev/_mapped_collection.py,sha256=BiiVeFPs0g7TavYHtPh098cCN_8oFCo1nWguASKAAsI,14062
|
26
|
+
lamindb/dev/_run_context.py,sha256=4eBZsbfcFpW5nqmRLbRZxuA5oeRW17XVHMzVtMH0bKA,22965
|
27
27
|
lamindb/dev/_settings.py,sha256=nixk8lVijCbq_fRlUpkX5gvO9AdgUFjbXzFThAJhGBA,3824
|
28
|
-
lamindb/dev/_track_environment.py,sha256=
|
28
|
+
lamindb/dev/_track_environment.py,sha256=QjHWbyl2u8J4hbJG8Q_ToFaZIgS-H15Ej6syJgk-dvY,662
|
29
29
|
lamindb/dev/_view_tree.py,sha256=K-C1BsOiEupwgkhyrsGxLFxHU45SAkiKsQbeOV9PbaY,3421
|
30
30
|
lamindb/dev/exceptions.py,sha256=PHk5lyBdJPrrEQcid3ItfdNzz3fgiQsUmsEDdz063F0,197
|
31
31
|
lamindb/dev/fields.py,sha256=0f0wai2aCjQYAQgI04UlCOAHo2MQknp4AsOKFDmE9iU,163
|
@@ -43,7 +43,7 @@ lamindb/dev/storage/file.py,sha256=jalzFQ8q110UUu_GGQBkU-g3M04h5g4LJ3nLjCzJ4pU,5
|
|
43
43
|
lamindb/dev/storage/object.py,sha256=KGuOwwYuN2yCJxTXn9v0LanC0fjKwy_62P-WksHcf40,1140
|
44
44
|
lamindb/setup/__init__.py,sha256=WaWKO-2XT67S65lSbS80hUojL-Mr_Wms9UxH6U54TsY,289
|
45
45
|
lamindb/setup/dev/__init__.py,sha256=tBty426VGF2PGqqt2XuNU-WgvOrbOp1aZBDowjLuzgA,242
|
46
|
-
lamindb-0.65.
|
47
|
-
lamindb-0.65.
|
48
|
-
lamindb-0.65.
|
49
|
-
lamindb-0.65.
|
46
|
+
lamindb-0.65.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
47
|
+
lamindb-0.65.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
48
|
+
lamindb-0.65.1.dist-info/METADATA,sha256=yGClOnYmbvX5RHc6bWW3Jldrji95UB-TLcoaXR98BMo,3165
|
49
|
+
lamindb-0.65.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|