lamindb_setup 0.74.1__py2.py3-none-any.whl → 0.74.2__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 +3 -2
- lamindb_setup/_init_instance.py +4 -1
- lamindb_setup/core/_hub_client.py +4 -2
- lamindb_setup/core/_hub_core.py +20 -16
- lamindb_setup/core/_hub_utils.py +67 -34
- lamindb_setup/core/_settings_load.py +1 -1
- lamindb_setup/core/_settings_save.py +2 -0
- lamindb_setup/core/_settings_store.py +3 -9
- {lamindb_setup-0.74.1.dist-info → lamindb_setup-0.74.2.dist-info}/METADATA +3 -3
- {lamindb_setup-0.74.1.dist-info → lamindb_setup-0.74.2.dist-info}/RECORD +13 -13
- {lamindb_setup-0.74.1.dist-info → lamindb_setup-0.74.2.dist-info}/LICENSE +0 -0
- {lamindb_setup-0.74.1.dist-info → lamindb_setup-0.74.2.dist-info}/WHEEL +0 -0
lamindb_setup/__init__.py
CHANGED
|
@@ -74,7 +74,8 @@ def update_db_using_local(
|
|
|
74
74
|
# read from a cached settings file in case the hub result is only
|
|
75
75
|
# read level or inexistent
|
|
76
76
|
elif settings_file.exists() and (
|
|
77
|
-
|
|
77
|
+
db_dsn_hub.db.user is None
|
|
78
|
+
or (db_dsn_hub.db.user is not None and "read" in db_dsn_hub.db.user)
|
|
78
79
|
):
|
|
79
80
|
isettings = load_instance_settings(settings_file)
|
|
80
81
|
db_dsn_local = LaminDsnModel(db=isettings.db)
|
|
@@ -101,7 +102,7 @@ def update_db_using_local(
|
|
|
101
102
|
scheme=db_dsn_hub.db.scheme,
|
|
102
103
|
user=db_dsn_local.db.user,
|
|
103
104
|
password=db_dsn_local.db.password,
|
|
104
|
-
host=db_dsn_hub.db.host,
|
|
105
|
+
host=db_dsn_hub.db.host, # type: ignore
|
|
105
106
|
port=db_dsn_hub.db.port,
|
|
106
107
|
database=db_dsn_hub.db.database,
|
|
107
108
|
)
|
lamindb_setup/_init_instance.py
CHANGED
|
@@ -245,7 +245,10 @@ def init(
|
|
|
245
245
|
if instance_state == "connected":
|
|
246
246
|
settings.auto_connect = True # we can also debate this switch here
|
|
247
247
|
return None
|
|
248
|
-
|
|
248
|
+
# cannot past instance_id here because instance does not yet exist!
|
|
249
|
+
# the instance_id field of the storage table is populated at the end of
|
|
250
|
+
# init_instance_hub
|
|
251
|
+
ssettings = init_storage(storage)
|
|
249
252
|
isettings = InstanceSettings(
|
|
250
253
|
id=instance_id, # type: ignore
|
|
251
254
|
owner=settings.user.handle,
|
|
@@ -5,7 +5,7 @@ from urllib.request import urlretrieve
|
|
|
5
5
|
|
|
6
6
|
from gotrue.errors import AuthUnknownError
|
|
7
7
|
from lamin_utils import logger
|
|
8
|
-
from
|
|
8
|
+
from pydantic_settings import BaseSettings
|
|
9
9
|
from supabase import Client, create_client # type: ignore
|
|
10
10
|
from supabase.lib.client_options import ClientOptions
|
|
11
11
|
|
|
@@ -59,9 +59,11 @@ class Environment:
|
|
|
59
59
|
|
|
60
60
|
# runs ~0.5s
|
|
61
61
|
def connect_hub(
|
|
62
|
-
fallback_env: bool = False, client_options: ClientOptions =
|
|
62
|
+
fallback_env: bool = False, client_options: ClientOptions | None = None
|
|
63
63
|
) -> Client:
|
|
64
64
|
env = Environment(fallback=fallback_env)
|
|
65
|
+
if client_options is None:
|
|
66
|
+
client_options = ClientOptions(auto_refresh_token=False)
|
|
65
67
|
return create_client(env.supabase_api_url, env.supabase_anon_key, client_options)
|
|
66
68
|
|
|
67
69
|
|
lamindb_setup/core/_hub_core.py
CHANGED
|
@@ -93,20 +93,21 @@ def _select_storage(
|
|
|
93
93
|
return False
|
|
94
94
|
else:
|
|
95
95
|
existing_storage = response.data[0]
|
|
96
|
-
if
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
96
|
+
if existing_storage["instance_id"] is not None:
|
|
97
|
+
if ssettings._instance_id is not None:
|
|
98
|
+
# consider storage settings that are meant to be managed by an instance
|
|
99
|
+
if UUID(existing_storage["instance_id"]) != ssettings._instance_id:
|
|
100
|
+
# everything is alright if the instance_id matches
|
|
101
|
+
# we're probably just switching storage locations
|
|
102
|
+
# below can be turned into a warning and then delegate the error
|
|
103
|
+
# to a unique constraint violation below
|
|
104
|
+
raise ValueError(
|
|
105
|
+
f"Storage root {root} is already managed by instance {existing_storage['instance_id']}."
|
|
106
|
+
)
|
|
107
|
+
else:
|
|
108
|
+
# if the request is agnostic of the instance, that's alright,
|
|
109
|
+
# we'll update the instance_id with what's stored in the hub
|
|
110
|
+
ssettings._instance_id = UUID(existing_storage["instance_id"])
|
|
110
111
|
ssettings._uuid_ = UUID(existing_storage["id"])
|
|
111
112
|
if update_uid:
|
|
112
113
|
ssettings._uid = existing_storage["lnid"]
|
|
@@ -145,11 +146,14 @@ def _init_storage(ssettings: StorageSettings, client: Client) -> None:
|
|
|
145
146
|
id = uuid.uuid5(uuid.NAMESPACE_URL, root)
|
|
146
147
|
else:
|
|
147
148
|
id = uuid.uuid4()
|
|
148
|
-
if ssettings._instance_id is None:
|
|
149
|
+
if ssettings._instance_id is None and settings._instance_exists:
|
|
149
150
|
logger.warning(
|
|
150
151
|
f"will manage storage location {ssettings.root_as_str} with instance {settings.instance.slug}"
|
|
151
152
|
)
|
|
152
153
|
ssettings._instance_id = settings.instance._id
|
|
154
|
+
instance_id_hex = (
|
|
155
|
+
None if ssettings._instance_id is None else ssettings._instance_id.hex
|
|
156
|
+
)
|
|
153
157
|
fields = {
|
|
154
158
|
"id": id.hex,
|
|
155
159
|
"lnid": ssettings.uid,
|
|
@@ -157,7 +161,7 @@ def _init_storage(ssettings: StorageSettings, client: Client) -> None:
|
|
|
157
161
|
"root": root,
|
|
158
162
|
"region": ssettings.region,
|
|
159
163
|
"type": ssettings.type,
|
|
160
|
-
"instance_id":
|
|
164
|
+
"instance_id": instance_id_hex,
|
|
161
165
|
# the empty string is important as we want the user flow to be through LaminHub
|
|
162
166
|
# if this errors with unique constraint error, the user has to update
|
|
163
167
|
# the description in LaminHub
|
lamindb_setup/core/_hub_utils.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
3
|
+
from typing import Any, ClassVar, Optional
|
|
4
|
+
from urllib.parse import urlparse, urlunparse
|
|
4
5
|
|
|
5
|
-
from pydantic import BaseModel,
|
|
6
|
-
from
|
|
6
|
+
from pydantic import BaseModel, Field, GetCoreSchemaHandler
|
|
7
|
+
from pydantic_core import CoreSchema, core_schema
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
def validate_schema_arg(schema: str | None = None) -> str:
|
|
@@ -20,26 +21,59 @@ def validate_db_arg(db: str | None) -> None:
|
|
|
20
21
|
LaminDsnModel(db=db)
|
|
21
22
|
|
|
22
23
|
|
|
23
|
-
class LaminDsn(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
This class allows us to customize the allowed schemes for databases
|
|
27
|
-
and also handles the parsing and building of DSN strings with the
|
|
28
|
-
database name instead of URL path.
|
|
29
|
-
"""
|
|
30
|
-
|
|
31
|
-
allowed_schemes = {
|
|
24
|
+
class LaminDsn(str):
|
|
25
|
+
allowed_schemes: ClassVar[set[str]] = {
|
|
32
26
|
"postgresql",
|
|
33
27
|
# future enabled schemes
|
|
34
28
|
# "snowflake",
|
|
35
29
|
# "bigquery"
|
|
36
30
|
}
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def __get_pydantic_core_schema__(
|
|
34
|
+
cls, source_type: Any, handler: GetCoreSchemaHandler
|
|
35
|
+
) -> CoreSchema:
|
|
36
|
+
return core_schema.no_info_after_validator_function(
|
|
37
|
+
cls.validate,
|
|
38
|
+
core_schema.str_schema(),
|
|
39
|
+
serialization=core_schema.plain_serializer_function_ser_schema(str),
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
@classmethod
|
|
43
|
+
def validate(cls, v: Any) -> LaminDsn:
|
|
44
|
+
if isinstance(v, str):
|
|
45
|
+
parsed = urlparse(v)
|
|
46
|
+
if parsed.scheme not in cls.allowed_schemes:
|
|
47
|
+
raise ValueError(f"Invalid scheme: {parsed.scheme}")
|
|
48
|
+
return cls(v)
|
|
49
|
+
elif isinstance(v, cls):
|
|
50
|
+
return v
|
|
51
|
+
else:
|
|
52
|
+
raise ValueError(f"Invalid value for LaminDsn: {v}")
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def user(self) -> str | None:
|
|
56
|
+
return urlparse(self).username
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def password(self) -> str | None:
|
|
60
|
+
return urlparse(self).password
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def host(self) -> str | None:
|
|
64
|
+
return urlparse(self).hostname
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def port(self) -> int | None:
|
|
68
|
+
return urlparse(self).port
|
|
39
69
|
|
|
40
70
|
@property
|
|
41
|
-
def database(self):
|
|
42
|
-
return self.path
|
|
71
|
+
def database(self) -> str:
|
|
72
|
+
return urlparse(self).path.lstrip("/")
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def scheme(self) -> str:
|
|
76
|
+
return urlparse(self).scheme
|
|
43
77
|
|
|
44
78
|
@classmethod
|
|
45
79
|
def build(
|
|
@@ -49,28 +83,27 @@ class LaminDsn(MultiHostDsn):
|
|
|
49
83
|
user: str | None = None,
|
|
50
84
|
password: str | None = None,
|
|
51
85
|
host: str,
|
|
52
|
-
port:
|
|
86
|
+
port: int | None = None,
|
|
53
87
|
database: str | None = None,
|
|
54
88
|
query: str | None = None,
|
|
55
89
|
fragment: str | None = None,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
90
|
+
) -> LaminDsn:
|
|
91
|
+
netloc = host
|
|
92
|
+
if port is not None:
|
|
93
|
+
netloc = f"{netloc}:{port}"
|
|
94
|
+
if user is not None:
|
|
95
|
+
auth = user
|
|
96
|
+
if password is not None:
|
|
97
|
+
auth = f"{auth}:{password}"
|
|
98
|
+
netloc = f"{auth}@{netloc}"
|
|
99
|
+
|
|
100
|
+
path = f"/{database}" if database else ""
|
|
101
|
+
|
|
102
|
+
url = urlunparse((scheme, netloc, path, "", query or "", fragment or ""))
|
|
103
|
+
return cls(url)
|
|
68
104
|
|
|
69
105
|
|
|
70
106
|
class LaminDsnModel(BaseModel):
|
|
71
|
-
db: LaminDsn
|
|
107
|
+
db: LaminDsn = Field(..., description="The database DSN")
|
|
72
108
|
|
|
73
|
-
|
|
74
|
-
def check_db_name(cls, v):
|
|
75
|
-
assert v.path and len(v.path) > 1, "database must be provided"
|
|
76
|
-
return v
|
|
109
|
+
model_config = {"arbitrary_types_allowed": True}
|
|
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Optional
|
|
|
4
4
|
from uuid import UUID, uuid4
|
|
5
5
|
|
|
6
6
|
from lamin_utils import logger
|
|
7
|
-
from pydantic
|
|
7
|
+
from pydantic import ValidationError
|
|
8
8
|
|
|
9
9
|
from ._settings_instance import InstanceSettings
|
|
10
10
|
from ._settings_storage import StorageSettings
|
|
@@ -2,7 +2,7 @@ import os
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
from typing import Optional
|
|
4
4
|
|
|
5
|
-
from
|
|
5
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
6
6
|
|
|
7
7
|
if "LAMIN_SETTINGS_DIR" in os.environ:
|
|
8
8
|
# Needed when running with AWS Lambda, as only tmp/ directory has a write access
|
|
@@ -58,10 +58,7 @@ class InstanceSettingsStore(BaseSettings):
|
|
|
58
58
|
id: str
|
|
59
59
|
git_repo: Optional[str]
|
|
60
60
|
keep_artifacts_local: Optional[bool]
|
|
61
|
-
|
|
62
|
-
class Config:
|
|
63
|
-
env_prefix = "lamindb_instance_"
|
|
64
|
-
env_file = ".env"
|
|
61
|
+
model_config = SettingsConfigDict(env_prefix="lamindb_instance_", env_file=".env")
|
|
65
62
|
|
|
66
63
|
|
|
67
64
|
class UserSettingsStore(BaseSettings):
|
|
@@ -72,7 +69,4 @@ class UserSettingsStore(BaseSettings):
|
|
|
72
69
|
uuid: str
|
|
73
70
|
handle: str
|
|
74
71
|
name: str
|
|
75
|
-
|
|
76
|
-
class Config:
|
|
77
|
-
env_prefix = "lamin_user_"
|
|
78
|
-
env_file = ".env"
|
|
72
|
+
model_config = SettingsConfigDict(env_prefix="lamin_user_", env_file=".env")
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: lamindb_setup
|
|
3
|
-
Version: 0.74.
|
|
3
|
+
Version: 0.74.2
|
|
4
4
|
Summary: Setup & configure LaminDB.
|
|
5
|
-
Author-email: Lamin Labs <
|
|
5
|
+
Author-email: Lamin Labs <open-source@lamin.ai>
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
7
|
Requires-Dist: lnschema_core>=0.51.0
|
|
8
8
|
Requires-Dist: lamin_utils>=0.3.3
|
|
9
9
|
Requires-Dist: django>4.2,<5.3.0
|
|
10
10
|
Requires-Dist: dj_database_url>=1.3.0,<3.0.0
|
|
11
|
-
Requires-Dist: pydantic
|
|
11
|
+
Requires-Dist: pydantic-settings
|
|
12
12
|
Requires-Dist: appdirs<2.0.0
|
|
13
13
|
Requires-Dist: requests
|
|
14
14
|
Requires-Dist: universal_pathlib==0.2.2
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
lamindb_setup/__init__.py,sha256=
|
|
1
|
+
lamindb_setup/__init__.py,sha256=uZ5-AbjJbOWBYvG9QbuADUZdJM1pp0IM2p7E75AoVnU,1542
|
|
2
2
|
lamindb_setup/_cache.py,sha256=wA7mbysANwe8hPNbjDo9bOmXJ0xIyaS5iyxIpxSWji4,846
|
|
3
3
|
lamindb_setup/_check.py,sha256=28PcG8Kp6OpjSLSi1r2boL2Ryeh6xkaCL87HFbjs6GA,129
|
|
4
4
|
lamindb_setup/_check_setup.py,sha256=cNEL9Q4yPpmEkGKHH8JgullWl1VUZwALJ4RHn9wZypY,2613
|
|
5
5
|
lamindb_setup/_close.py,sha256=1QS9p2SCacgovYn6xqWU4zFvwHN1RgIccvzwJgFvKgU,1186
|
|
6
|
-
lamindb_setup/_connect_instance.py,sha256=
|
|
6
|
+
lamindb_setup/_connect_instance.py,sha256=dWqvNBBxqCG6xOiY_fI-P5ccyzno_ePGP3Rp1rgNq3g,12512
|
|
7
7
|
lamindb_setup/_delete.py,sha256=Y8KSFYgY0UHAvjd7cCL6hZ_XiLeJwx50BguVATcj_Xo,5524
|
|
8
8
|
lamindb_setup/_django.py,sha256=EoyWvFzH0i9wxjy4JZhcoXCTckztP_Mrl6FbYQnMmLE,1534
|
|
9
9
|
lamindb_setup/_exportdb.py,sha256=uTIZjKKTB7arzEr1j0O6lONiT2pRBKeOFdLvOV8ZwzE,2120
|
|
10
10
|
lamindb_setup/_importdb.py,sha256=yYYShzUajTsR-cTW4CZ-UNDWZY2uE5PAgNbp-wn8Ogc,1874
|
|
11
|
-
lamindb_setup/_init_instance.py,sha256=
|
|
11
|
+
lamindb_setup/_init_instance.py,sha256=jcKtXLOwkoq7bC-0j0xnNU4_up9nPl0iKQPNoJbBts8,12078
|
|
12
12
|
lamindb_setup/_migrate.py,sha256=P4n3x0SYzO9szjF2-JMa7z4mQadtWjHv5ow4HbCDZLI,8864
|
|
13
13
|
lamindb_setup/_register_instance.py,sha256=LlD2n44Gmh8OXrAkL9iL9NiML8QDKnk4d869MhXoOWI,1083
|
|
14
14
|
lamindb_setup/_schema.py,sha256=b3uzhhWpV5mQtDwhMINc2MabGCnGLESy51ito3yl6Wc,679
|
|
@@ -21,17 +21,17 @@ lamindb_setup/core/_aws_credentials.py,sha256=uKMQO9q42Hnepz8aj3RxwLKDWUJx8pNOYr
|
|
|
21
21
|
lamindb_setup/core/_aws_storage.py,sha256=nEjeUv4xUVpoV0Lx-zjjmyb9w804bDyaeiM-OqbfwM0,1799
|
|
22
22
|
lamindb_setup/core/_deprecated.py,sha256=3qxUI1dnDlSeR0BYrv7ucjqRBEojbqotPgpShXs4KF8,2520
|
|
23
23
|
lamindb_setup/core/_docs.py,sha256=3k-YY-oVaJd_9UIY-LfBg_u8raKOCNfkZQPA73KsUhs,276
|
|
24
|
-
lamindb_setup/core/_hub_client.py,sha256=
|
|
25
|
-
lamindb_setup/core/_hub_core.py,sha256=
|
|
24
|
+
lamindb_setup/core/_hub_client.py,sha256=Gpt3TmxWQMVenKugCu1agUb-xGN9YFsQOKmrHuFiiDs,5605
|
|
25
|
+
lamindb_setup/core/_hub_core.py,sha256=VToaY2uUHpP5ETkNeuMO4gUeuAfj6ap8uFSndCN1fGk,16592
|
|
26
26
|
lamindb_setup/core/_hub_crud.py,sha256=b1XF7AJpM9Q-ttm9nPG-r3OTRWHQaGzAGIyvmb83NTo,4859
|
|
27
|
-
lamindb_setup/core/_hub_utils.py,sha256=
|
|
27
|
+
lamindb_setup/core/_hub_utils.py,sha256=w5IRtrxZcvxmGSJslzuZF89ewkzXV4cCUmZUVrqmAfo,3026
|
|
28
28
|
lamindb_setup/core/_private_django_api.py,sha256=KIn43HOhiRjkbTbddyJqv-WNTTa1bAizbM1tWXoXPBg,2869
|
|
29
29
|
lamindb_setup/core/_settings.py,sha256=46axQ5HPvI0X9YuotgdpuSOfSo7qYU1DudIx3vxpFk0,4471
|
|
30
30
|
lamindb_setup/core/_settings_instance.py,sha256=OMN6ZROF7iV9Juh0bgE9fOmedE7EJI_YniztwJ5-acI,17623
|
|
31
|
-
lamindb_setup/core/_settings_load.py,sha256=
|
|
32
|
-
lamindb_setup/core/_settings_save.py,sha256=
|
|
31
|
+
lamindb_setup/core/_settings_load.py,sha256=63PTIVLk3oH1XUmznswygcOk_8VADrJLMB6O9AOppYg,3907
|
|
32
|
+
lamindb_setup/core/_settings_save.py,sha256=n_tYfb9EBSxwm4LHyPRHJptE5uB8lmHhcRkz1JkAmhg,2781
|
|
33
33
|
lamindb_setup/core/_settings_storage.py,sha256=65aobewYX6VfOeYZjZQOOI7ZD_3b4QA9TDmrduU0m4c,13262
|
|
34
|
-
lamindb_setup/core/_settings_store.py,sha256=
|
|
34
|
+
lamindb_setup/core/_settings_store.py,sha256=VEE8Ff2A7y4j8ksOaa7g48jNaOqe1PBnBjb1PKKGUKU,2115
|
|
35
35
|
lamindb_setup/core/_settings_user.py,sha256=P2lC4WDRAFfT-Xq3MlXJ-wMKIHCoGNhMTQfRGIAyUNQ,1344
|
|
36
36
|
lamindb_setup/core/_setup_bionty_sources.py,sha256=h_pBANsSGK6ujAFsG21mtADHVJoMLKDR4eGgRP4Fgls,3072
|
|
37
37
|
lamindb_setup/core/cloud_sqlite_locker.py,sha256=reu02M4aE2BT_A5AFqwhv48l91mOMyQ4zTd-hh-wtuU,6922
|
|
@@ -40,7 +40,7 @@ lamindb_setup/core/exceptions.py,sha256=eoI7AXgATgDVzgArtN7CUvpaMUC067vsBg5LHCsW
|
|
|
40
40
|
lamindb_setup/core/hashing.py,sha256=_JliYeCcjT_foOUJ5ck1rvcCo9q7r4b4SaSclQ_w4Qo,3071
|
|
41
41
|
lamindb_setup/core/types.py,sha256=bcYnZ0uM_2NXKJCl94Mmc-uYrQlRUUVKG3sK2N-F-N4,532
|
|
42
42
|
lamindb_setup/core/upath.py,sha256=dwudkTVsXuyjS-2xR16WomcWtXJAEfRZ0ZzFq8_EDhE,27157
|
|
43
|
-
lamindb_setup-0.74.
|
|
44
|
-
lamindb_setup-0.74.
|
|
45
|
-
lamindb_setup-0.74.
|
|
46
|
-
lamindb_setup-0.74.
|
|
43
|
+
lamindb_setup-0.74.2.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
|
|
44
|
+
lamindb_setup-0.74.2.dist-info/WHEEL,sha256=Sgu64hAMa6g5FdzHxXv9Xdse9yxpGGMeagVtPMWpJQY,99
|
|
45
|
+
lamindb_setup-0.74.2.dist-info/METADATA,sha256=_3FEUyj8OTeA3negmlHl0mXYPprbhDrgq8jU-1DKtUk,1638
|
|
46
|
+
lamindb_setup-0.74.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|