lamindb_setup 0.71.0__py2.py3-none-any.whl → 0.71.1__py2.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_setup/__init__.py +1 -1
- lamindb_setup/_connect_instance.py +14 -0
- lamindb_setup/_delete.py +23 -24
- lamindb_setup/_init_instance.py +6 -2
- lamindb_setup/{_add_remote_storage.py → _set_managed_storage.py} +2 -4
- lamindb_setup/core/_hub_core.py +5 -0
- lamindb_setup/core/_hub_crud.py +6 -1
- lamindb_setup/core/_settings_load.py +1 -0
- lamindb_setup/core/_settings_save.py +2 -0
- lamindb_setup/core/_settings_storage.py +4 -11
- lamindb_setup/core/_settings_store.py +1 -0
- lamindb_setup/core/upath.py +10 -1
- {lamindb_setup-0.71.0.dist-info → lamindb_setup-0.71.1.dist-info}/METADATA +1 -1
- {lamindb_setup-0.71.0.dist-info → lamindb_setup-0.71.1.dist-info}/RECORD +16 -16
- {lamindb_setup-0.71.0.dist-info → lamindb_setup-0.71.1.dist-info}/LICENSE +0 -0
- {lamindb_setup-0.71.0.dist-info → lamindb_setup-0.71.1.dist-info}/WHEEL +0 -0
lamindb_setup/__init__.py
CHANGED
|
@@ -4,6 +4,7 @@ import os
|
|
|
4
4
|
from typing import TYPE_CHECKING
|
|
5
5
|
from uuid import UUID
|
|
6
6
|
|
|
7
|
+
from django.db import ProgrammingError
|
|
7
8
|
from lamin_utils import logger
|
|
8
9
|
|
|
9
10
|
from ._check_setup import _check_instance_setup
|
|
@@ -158,6 +159,8 @@ def connect(
|
|
|
158
159
|
root=storage_result["root"],
|
|
159
160
|
region=storage_result["region"],
|
|
160
161
|
uid=storage_result["lnid"],
|
|
162
|
+
uuid=UUID(storage_result["id"]),
|
|
163
|
+
instance_id=UUID(instance_result["id"]),
|
|
161
164
|
)
|
|
162
165
|
isettings = InstanceSettings(
|
|
163
166
|
id=UUID(instance_result["id"]),
|
|
@@ -220,6 +223,17 @@ def connect(
|
|
|
220
223
|
|
|
221
224
|
if storage is not None and isettings.dialect == "sqlite":
|
|
222
225
|
update_root_field_in_default_storage(isettings)
|
|
226
|
+
# below is for backfilling the instance_uid value
|
|
227
|
+
# we'll enable it once more people migrated to 0.71.0
|
|
228
|
+
# ssettings_record = isettings.storage.record
|
|
229
|
+
# if ssettings_record.instance_uid is None:
|
|
230
|
+
# ssettings_record.instance_uid = isettings.uid
|
|
231
|
+
# # try saving if not read-only access
|
|
232
|
+
# try:
|
|
233
|
+
# ssettings_record.save()
|
|
234
|
+
# # raised by django when the access is denied
|
|
235
|
+
# except ProgrammingError:
|
|
236
|
+
# pass
|
|
223
237
|
load_from_isettings(isettings)
|
|
224
238
|
except Exception as e:
|
|
225
239
|
if isettings is not None:
|
lamindb_setup/_delete.py
CHANGED
|
@@ -6,7 +6,11 @@ from uuid import UUID
|
|
|
6
6
|
|
|
7
7
|
from lamin_utils import logger
|
|
8
8
|
|
|
9
|
-
from ._connect_instance import
|
|
9
|
+
from ._connect_instance import (
|
|
10
|
+
INSTANCE_NOT_FOUND_MESSAGE,
|
|
11
|
+
InstanceNotFoundError,
|
|
12
|
+
get_owner_name_from_identifier,
|
|
13
|
+
)
|
|
10
14
|
from .core._hub_core import connect_instance as load_instance_from_hub
|
|
11
15
|
from .core._hub_core import delete_instance as delete_instance_on_hub
|
|
12
16
|
from .core._hub_core import get_storage_records_for_instance
|
|
@@ -54,55 +58,48 @@ def delete_by_isettings(isettings: InstanceSettings) -> None:
|
|
|
54
58
|
settings._instance_settings = None
|
|
55
59
|
|
|
56
60
|
|
|
57
|
-
def delete(
|
|
58
|
-
instance_name: str, force: bool = False, require_empty: bool = True
|
|
59
|
-
) -> int | None:
|
|
61
|
+
def delete(slug: str, force: bool = False, require_empty: bool = True) -> int | None:
|
|
60
62
|
"""Delete a LaminDB instance.
|
|
61
63
|
|
|
62
64
|
Args:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
slug: The instance slug `account_handle/instance_name` or URL.
|
|
66
|
+
If the instance is owned by you, it suffices to pass the instance name.
|
|
67
|
+
force: Whether to skip the confirmation prompt.
|
|
68
|
+
require_empty: Whether to check if the instance is empty before deleting.
|
|
66
69
|
"""
|
|
67
|
-
|
|
68
|
-
logger.warning(
|
|
69
|
-
"Deleting the instance of another user is currently not supported with the"
|
|
70
|
-
" CLI. Please provide only the instance name when deleting an instance ('/'"
|
|
71
|
-
" delimiter not allowed)."
|
|
72
|
-
)
|
|
73
|
-
raise ValueError("Invalid instance name: '/' delimiter not allowed.")
|
|
74
|
-
instance_slug = f"{settings.user.handle}/{instance_name}"
|
|
70
|
+
instance_owner, instance_name = get_owner_name_from_identifier(slug)
|
|
75
71
|
if settings._instance_exists and settings.instance.name == instance_name:
|
|
76
72
|
isettings = settings.instance
|
|
77
73
|
else:
|
|
78
|
-
settings_file = instance_settings_file(instance_name,
|
|
74
|
+
settings_file = instance_settings_file(instance_name, instance_owner)
|
|
79
75
|
if not settings_file.exists():
|
|
80
76
|
hub_result = load_instance_from_hub(
|
|
81
|
-
owner=
|
|
77
|
+
owner=instance_owner, name=instance_name
|
|
82
78
|
)
|
|
83
79
|
if isinstance(hub_result, str):
|
|
84
80
|
message = INSTANCE_NOT_FOUND_MESSAGE.format(
|
|
85
|
-
owner=
|
|
81
|
+
owner=instance_owner,
|
|
86
82
|
name=instance_name,
|
|
87
83
|
hub_result=hub_result,
|
|
88
84
|
)
|
|
89
|
-
|
|
90
|
-
return None
|
|
85
|
+
raise InstanceNotFoundError(message)
|
|
91
86
|
instance_result, storage_result = hub_result
|
|
92
87
|
ssettings = StorageSettings(
|
|
93
88
|
root=storage_result["root"],
|
|
94
89
|
region=storage_result["region"],
|
|
95
90
|
uid=storage_result["lnid"],
|
|
91
|
+
uuid=UUID(storage_result["id"]),
|
|
96
92
|
)
|
|
97
93
|
isettings = InstanceSettings(
|
|
98
94
|
id=UUID(instance_result["id"]),
|
|
99
|
-
owner=
|
|
95
|
+
owner=instance_owner,
|
|
100
96
|
name=instance_name,
|
|
101
97
|
storage=ssettings,
|
|
102
98
|
keep_artifacts_local=bool(instance_result["keep_artifacts_local"]),
|
|
103
99
|
db=instance_result["db"] if "db" in instance_result else None,
|
|
104
100
|
schema=instance_result["schema_str"],
|
|
105
101
|
git_repo=instance_result["git_repo"],
|
|
102
|
+
is_on_hub=True,
|
|
106
103
|
)
|
|
107
104
|
else:
|
|
108
105
|
isettings = load_instance_settings(settings_file)
|
|
@@ -117,7 +114,7 @@ def delete(
|
|
|
117
114
|
if not force:
|
|
118
115
|
valid_responses = ["y", "yes"]
|
|
119
116
|
user_input = (
|
|
120
|
-
input(f"Are you sure you want to delete instance {
|
|
117
|
+
input(f"Are you sure you want to delete instance {isettings.slug}? (y/n) ")
|
|
121
118
|
.strip()
|
|
122
119
|
.lower()
|
|
123
120
|
)
|
|
@@ -161,10 +158,12 @@ def delete(
|
|
|
161
158
|
ssettings._mark_storage_root.unlink(
|
|
162
159
|
missing_ok=True # this is totally weird, but needed on Py3.11
|
|
163
160
|
)
|
|
164
|
-
logger.info(f"deleting instance {
|
|
161
|
+
logger.info(f"deleting instance {isettings.slug}")
|
|
165
162
|
# below we can skip check_storage_is_empty() because we already called
|
|
166
163
|
# it above
|
|
167
|
-
if settings.user.handle != "anonymous":
|
|
164
|
+
if settings.user.handle != "anonymous" and isettings.is_on_hub:
|
|
165
|
+
# start with deleting things on the hub
|
|
166
|
+
# this will error if the user doesn't have permission
|
|
168
167
|
delete_instance_on_hub(isettings._id, require_empty=False)
|
|
169
168
|
delete_by_isettings(isettings)
|
|
170
169
|
# if .lndb file was delete, then we might count -1
|
lamindb_setup/_init_instance.py
CHANGED
|
@@ -277,10 +277,14 @@ def init(
|
|
|
277
277
|
|
|
278
278
|
if isettings is not None:
|
|
279
279
|
delete_by_isettings(isettings)
|
|
280
|
-
if settings.user.handle != "anonymous":
|
|
280
|
+
if settings.user.handle != "anonymous" and isettings.is_on_hub:
|
|
281
281
|
delete_instance_record(isettings._id)
|
|
282
282
|
isettings._get_settings_file().unlink(missing_ok=True) # type: ignore
|
|
283
|
-
if
|
|
283
|
+
if (
|
|
284
|
+
ssettings is not None
|
|
285
|
+
and settings.user.handle != "anonymous"
|
|
286
|
+
and ssettings.is_on_hub
|
|
287
|
+
):
|
|
284
288
|
delete_storage_record(ssettings._uuid) # type: ignore
|
|
285
289
|
raise e
|
|
286
290
|
return None
|
|
@@ -12,10 +12,8 @@ if TYPE_CHECKING:
|
|
|
12
12
|
from lamindb_setup.core.types import UPathStr
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
def
|
|
16
|
-
"""Add
|
|
17
|
-
|
|
18
|
-
This can be used to selectively share data.
|
|
15
|
+
def set_managed_storage(root: UPathStr, **fs_kwargs):
|
|
16
|
+
"""Add or switch to another managed storage location.
|
|
19
17
|
|
|
20
18
|
Args:
|
|
21
19
|
root: `UPathStr` - The new storage root, e.g., an S3 bucket.
|
lamindb_setup/core/_hub_core.py
CHANGED
|
@@ -53,6 +53,11 @@ def _delete_storage_record(storage_uuid: UUID, client: Client) -> None:
|
|
|
53
53
|
response = client.table("storage").delete().eq("id", storage_uuid.hex).execute()
|
|
54
54
|
if response.data:
|
|
55
55
|
logger.important(f"deleted storage record on hub {storage_uuid.hex}")
|
|
56
|
+
else:
|
|
57
|
+
raise PermissionError(
|
|
58
|
+
f"Deleting of storage with {storage_uuid.hex} was not successful. Probably, you"
|
|
59
|
+
" don't have sufficient permissions."
|
|
60
|
+
)
|
|
56
61
|
|
|
57
62
|
|
|
58
63
|
def update_instance_record(instance_uuid: UUID, fields: dict) -> None:
|
lamindb_setup/core/_hub_crud.py
CHANGED
|
@@ -100,7 +100,7 @@ def update_instance(instance_id: str, instance_fields: dict, client: Client):
|
|
|
100
100
|
client.table("instance").update(instance_fields).eq("id", instance_id).execute()
|
|
101
101
|
)
|
|
102
102
|
if len(response.data) == 0:
|
|
103
|
-
raise
|
|
103
|
+
raise PermissionError(
|
|
104
104
|
f"Update of instance with {instance_id} was not successful. Probably, you"
|
|
105
105
|
" don't have sufficient permissions."
|
|
106
106
|
)
|
|
@@ -187,3 +187,8 @@ def _delete_instance_record(instance_id: UUID, client: Client) -> None:
|
|
|
187
187
|
response = client.table("instance").delete().eq("id", instance_id.hex).execute()
|
|
188
188
|
if response.data:
|
|
189
189
|
logger.important(f"deleted instance record on hub {instance_id.hex}")
|
|
190
|
+
else:
|
|
191
|
+
raise PermissionError(
|
|
192
|
+
f"Deleting of instance with {instance_id.hex} was not successful. Probably, you"
|
|
193
|
+
" don't have sufficient permissions."
|
|
194
|
+
)
|
|
@@ -89,6 +89,7 @@ def setup_instance_from_store(store: InstanceSettingsStore) -> InstanceSettings:
|
|
|
89
89
|
db=store.db if store.db != "null" else None, # type: ignore
|
|
90
90
|
schema=store.schema_str if store.schema_str != "null" else None,
|
|
91
91
|
git_repo=store.git_repo if store.git_repo != "null" else None,
|
|
92
|
+
keep_artifacts_local=store.keep_artifacts_local, # type: ignore
|
|
92
93
|
)
|
|
93
94
|
|
|
94
95
|
|
|
@@ -177,7 +177,6 @@ class StorageSettings:
|
|
|
177
177
|
# local storage
|
|
178
178
|
self._has_local = False
|
|
179
179
|
self._local = None
|
|
180
|
-
self._is_on_hub: bool | None = None
|
|
181
180
|
|
|
182
181
|
@property
|
|
183
182
|
def id(self) -> int:
|
|
@@ -320,16 +319,10 @@ class StorageSettings:
|
|
|
320
319
|
|
|
321
320
|
Only works if user has access to the instance.
|
|
322
321
|
"""
|
|
323
|
-
if self.
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
response = call_with_fallback_auth(select_storage, id=self._uuid.hex) # type: ignore
|
|
328
|
-
if response is None:
|
|
329
|
-
self._is_on_hub = False
|
|
330
|
-
else:
|
|
331
|
-
self._is_on_hub = True
|
|
332
|
-
return self._is_on_hub
|
|
322
|
+
if self._uuid is None:
|
|
323
|
+
return False
|
|
324
|
+
else:
|
|
325
|
+
return True
|
|
333
326
|
|
|
334
327
|
def key_to_filepath(self, filekey: Path | UPath | str) -> UPath:
|
|
335
328
|
"""Cloud or local filepath from filekey."""
|
lamindb_setup/core/upath.py
CHANGED
|
@@ -56,7 +56,10 @@ VALID_SUFFIXES = {
|
|
|
56
56
|
".zarr",
|
|
57
57
|
".json",
|
|
58
58
|
}
|
|
59
|
-
|
|
59
|
+
VALID_COMPOSITE_SUFFIXES = {
|
|
60
|
+
".anndata.zarr",
|
|
61
|
+
".spatialdata.zarr",
|
|
62
|
+
}
|
|
60
63
|
|
|
61
64
|
TRAILING_SEP = (os.sep, os.altsep) if os.altsep is not None else os.sep
|
|
62
65
|
|
|
@@ -74,6 +77,12 @@ def extract_suffix_from_path(path: Path, arg_name: str | None = None) -> str:
|
|
|
74
77
|
total_suffix = "".join(path.suffixes)
|
|
75
78
|
if total_suffix in VALID_SUFFIXES:
|
|
76
79
|
return total_suffix
|
|
80
|
+
elif total_suffix.endswith(tuple(VALID_COMPOSITE_SUFFIXES)):
|
|
81
|
+
# below seems slow but OK for now
|
|
82
|
+
for suffix in VALID_COMPOSITE_SUFFIXES:
|
|
83
|
+
if total_suffix.endswith(suffix):
|
|
84
|
+
break
|
|
85
|
+
return suffix
|
|
77
86
|
else:
|
|
78
87
|
print_hint = True
|
|
79
88
|
arg_name = "file" if arg_name is None else arg_name # for the warning
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
lamindb_setup/__init__.py,sha256=
|
|
2
|
-
lamindb_setup/_add_remote_storage.py,sha256=j-p29pxrr_07Ns5X2tm6yKxa3VESPkjyt35X4Cvr-nk,1325
|
|
1
|
+
lamindb_setup/__init__.py,sha256=EIyvRHHlYOX7WsAFGdKp63ho-ceFW05z_n_GV1oJkaU,1542
|
|
3
2
|
lamindb_setup/_cache.py,sha256=wA7mbysANwe8hPNbjDo9bOmXJ0xIyaS5iyxIpxSWji4,846
|
|
4
3
|
lamindb_setup/_check.py,sha256=28PcG8Kp6OpjSLSi1r2boL2Ryeh6xkaCL87HFbjs6GA,129
|
|
5
4
|
lamindb_setup/_check_setup.py,sha256=cNEL9Q4yPpmEkGKHH8JgullWl1VUZwALJ4RHn9wZypY,2613
|
|
6
5
|
lamindb_setup/_close.py,sha256=1QS9p2SCacgovYn6xqWU4zFvwHN1RgIccvzwJgFvKgU,1186
|
|
7
|
-
lamindb_setup/_connect_instance.py,sha256=
|
|
8
|
-
lamindb_setup/_delete.py,sha256=
|
|
6
|
+
lamindb_setup/_connect_instance.py,sha256=c0qO0dn4hnEc-toRh6pxFaAxkhzM9LVN-72XK11JtAU,12616
|
|
7
|
+
lamindb_setup/_delete.py,sha256=hf8zfVJfW74QR7eK4xJNQ6HbkkZBsl5eTqj-Ni5jPo0,7232
|
|
9
8
|
lamindb_setup/_django.py,sha256=EoyWvFzH0i9wxjy4JZhcoXCTckztP_Mrl6FbYQnMmLE,1534
|
|
10
9
|
lamindb_setup/_exportdb.py,sha256=uTIZjKKTB7arzEr1j0O6lONiT2pRBKeOFdLvOV8ZwzE,2120
|
|
11
10
|
lamindb_setup/_importdb.py,sha256=yYYShzUajTsR-cTW4CZ-UNDWZY2uE5PAgNbp-wn8Ogc,1874
|
|
12
|
-
lamindb_setup/_init_instance.py,sha256=
|
|
11
|
+
lamindb_setup/_init_instance.py,sha256=Hy4PsPpXCdl5ik3Q0ODltVbbvYjAqnLnfFza2ai8nX8,11921
|
|
13
12
|
lamindb_setup/_migrate.py,sha256=4nBTFg5-BK4A2gH-D3_tcFf8EtvMnIo5Mq0e_C6_9-U,8815
|
|
14
13
|
lamindb_setup/_register_instance.py,sha256=Jeu0wyvJVSVQ_n-A_7yn7xOZIP0ncJD92DRABqzPIjA,940
|
|
15
14
|
lamindb_setup/_schema.py,sha256=b3uzhhWpV5mQtDwhMINc2MabGCnGLESy51ito3yl6Wc,679
|
|
15
|
+
lamindb_setup/_set_managed_storage.py,sha256=BUUJzKNWNEA5KnKnFZsas0ANU6w-LBZL-CKRu-sNLPE,1268
|
|
16
16
|
lamindb_setup/_setup_user.py,sha256=6Oc7Rke-yRQSZbuntdUAz8QbJ6UuPzYHI9FnYlf_q-A,3670
|
|
17
17
|
lamindb_setup/_silence_loggers.py,sha256=AKF_YcHvX32eGXdsYK8MJlxEaZ-Uo2f6QDRzjKFCtws,1568
|
|
18
18
|
lamindb_setup/core/__init__.py,sha256=dV9S-rQpNK9JcBn4hiEmiLnmNqfpPFJD9pqagMCaIew,416
|
|
@@ -20,15 +20,15 @@ lamindb_setup/core/_aws_storage.py,sha256=nEjeUv4xUVpoV0Lx-zjjmyb9w804bDyaeiM-Oq
|
|
|
20
20
|
lamindb_setup/core/_deprecated.py,sha256=3qxUI1dnDlSeR0BYrv7ucjqRBEojbqotPgpShXs4KF8,2520
|
|
21
21
|
lamindb_setup/core/_docs.py,sha256=3k-YY-oVaJd_9UIY-LfBg_u8raKOCNfkZQPA73KsUhs,276
|
|
22
22
|
lamindb_setup/core/_hub_client.py,sha256=V0qKDsCdRn-tQy2YIk4VgXcpJFmuum6N3gcavAC7gBQ,5504
|
|
23
|
-
lamindb_setup/core/_hub_core.py,sha256=
|
|
24
|
-
lamindb_setup/core/_hub_crud.py,sha256=
|
|
23
|
+
lamindb_setup/core/_hub_core.py,sha256=FpEXPqSHXAgYegyQmsma54S3bv_mtceXrrpHXa7UeKE,15970
|
|
24
|
+
lamindb_setup/core/_hub_crud.py,sha256=b1XF7AJpM9Q-ttm9nPG-r3OTRWHQaGzAGIyvmb83NTo,4859
|
|
25
25
|
lamindb_setup/core/_hub_utils.py,sha256=b_M1LkdCjiMWm1EOlSb9GuPdLijwVgQDtATTpeZuXI0,1875
|
|
26
26
|
lamindb_setup/core/_settings.py,sha256=jjZ_AxRXB3Y3UP6m04BAw_dhFbJbdg2-nZWmEv2LNZ8,3141
|
|
27
27
|
lamindb_setup/core/_settings_instance.py,sha256=RFUcnBBUp303dbVEHcAaIm_q7lzlWg56OrKLwdam8Pg,16588
|
|
28
|
-
lamindb_setup/core/_settings_load.py,sha256=
|
|
29
|
-
lamindb_setup/core/_settings_save.py,sha256=
|
|
30
|
-
lamindb_setup/core/_settings_storage.py,sha256=
|
|
31
|
-
lamindb_setup/core/_settings_store.py,sha256=
|
|
28
|
+
lamindb_setup/core/_settings_load.py,sha256=NGgCDpN85j1EqoKlrYFIlZBMlBJm33gx2-wc96CP_ZQ,3922
|
|
29
|
+
lamindb_setup/core/_settings_save.py,sha256=d1A-Ex-7H08mb8l7I0Oe0j0GilrfaDuprh_NMxhQAsQ,2704
|
|
30
|
+
lamindb_setup/core/_settings_storage.py,sha256=VgsqdIImQRfOZ6FGNY6DLVohaSxerj_F-sWtjD9hzcs,12382
|
|
31
|
+
lamindb_setup/core/_settings_store.py,sha256=dagS5c7wAMRnuZTRfCU4sKaIOyF_HwAP5Fnnn8vphno,2084
|
|
32
32
|
lamindb_setup/core/_settings_user.py,sha256=P2lC4WDRAFfT-Xq3MlXJ-wMKIHCoGNhMTQfRGIAyUNQ,1344
|
|
33
33
|
lamindb_setup/core/_setup_bionty_sources.py,sha256=OgPpZxN2_Wffy-ogEBz_97c_k8d2bD-DDVt89-u9GLY,3002
|
|
34
34
|
lamindb_setup/core/cloud_sqlite_locker.py,sha256=NIBNAGq7TTRrip9OzMdiQKj8QOuwhL9esyM0aehUqBA,6893
|
|
@@ -36,8 +36,8 @@ lamindb_setup/core/django.py,sha256=m0AKg2lJ1EYCtEtZ8frFFJbAR9qX0gnFcgqp7aeC2k0,
|
|
|
36
36
|
lamindb_setup/core/exceptions.py,sha256=eoI7AXgATgDVzgArtN7CUvpaMUC067vsBg5LHCsWzDM,305
|
|
37
37
|
lamindb_setup/core/hashing.py,sha256=mv9UCvAsSrdHYQAv3Kz7UOvjd5tIjvDTIYv_ettBuVY,2218
|
|
38
38
|
lamindb_setup/core/types.py,sha256=bcYnZ0uM_2NXKJCl94Mmc-uYrQlRUUVKG3sK2N-F-N4,532
|
|
39
|
-
lamindb_setup/core/upath.py,sha256=
|
|
40
|
-
lamindb_setup-0.71.
|
|
41
|
-
lamindb_setup-0.71.
|
|
42
|
-
lamindb_setup-0.71.
|
|
43
|
-
lamindb_setup-0.71.
|
|
39
|
+
lamindb_setup/core/upath.py,sha256=XBiHm-gxtfDIHnQmH5WjjmZzmAg5S421fjAfRrEg710,28286
|
|
40
|
+
lamindb_setup-0.71.1.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
|
|
41
|
+
lamindb_setup-0.71.1.dist-info/WHEEL,sha256=Sgu64hAMa6g5FdzHxXv9Xdse9yxpGGMeagVtPMWpJQY,99
|
|
42
|
+
lamindb_setup-0.71.1.dist-info/METADATA,sha256=fijK20hR12pIxHzmECdbyguUSsHvVjIYTmfumfuLReQ,1620
|
|
43
|
+
lamindb_setup-0.71.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|