lamindb_setup 1.3.0__py3-none-any.whl → 1.3.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_setup/__init__.py CHANGED
@@ -33,7 +33,7 @@ Modules & settings:
33
33
 
34
34
  """
35
35
 
36
- __version__ = "1.3.0" # denote a release candidate for 0.1.0 with 0.1rc1
36
+ __version__ = "1.3.1" # denote a release candidate for 0.1.0 with 0.1rc1
37
37
 
38
38
  import os
39
39
 
@@ -168,6 +168,7 @@ def _connect_instance(
168
168
  schema_id=None
169
169
  if (schema_id := instance_result["schema_id"]) is None
170
170
  else UUID(schema_id),
171
+ fine_grained_access=instance_result.get("fine_grained_access", False),
171
172
  )
172
173
  else:
173
174
  if hub_result != "anonymous-user":
@@ -205,7 +206,6 @@ def connect(instance: str | None = None, **kwargs) -> str | tuple | None:
205
206
  for kwarg in kwargs:
206
207
  if kwarg not in valid_kwargs:
207
208
  raise TypeError(f"connect() got unexpected keyword argument '{kwarg}'")
208
-
209
209
  isettings: InstanceSettings = None # type: ignore
210
210
  # _db is still needed because it is called in init
211
211
  _db: str | None = kwargs.get("_db", None)
@@ -6,6 +6,7 @@ import uuid
6
6
  from typing import TYPE_CHECKING, Literal
7
7
  from uuid import UUID
8
8
 
9
+ import click
9
10
  from django.core.exceptions import FieldError
10
11
  from django.db.utils import OperationalError, ProgrammingError
11
12
  from lamin_utils import logger
@@ -25,6 +26,11 @@ if TYPE_CHECKING:
25
26
  from .core.types import UPathStr
26
27
 
27
28
 
29
+ class InstanceNotCreated(click.ClickException):
30
+ def show(self, file=None):
31
+ pass
32
+
33
+
28
34
  def get_schema_module_name(module_name, raise_import_error: bool = True) -> str | None:
29
35
  import importlib.util
30
36
 
@@ -242,7 +248,7 @@ def init(
242
248
  raise CannotSwitchDefaultInstance(MESSAGE_CANNOT_SWITCH_DEFAULT_INSTANCE)
243
249
  elif _write_settings:
244
250
  close_instance(mute=True)
245
- from .core._hub_core import init_instance as init_instance_hub
251
+ from .core._hub_core import init_instance_hub
246
252
 
247
253
  name_str, instance_id, instance_state, _ = validate_init_args(
248
254
  storage=storage,
@@ -284,6 +290,13 @@ def init(
284
290
  isettings.is_remote and instance_state != "instance-corrupted-or-deleted"
285
291
  )
286
292
  if register_on_hub:
293
+ # can't register the instance in the hub
294
+ # if storage is not in the hub
295
+ # raise the exception and initiate cleanups
296
+ if not isettings.storage.is_on_hub:
297
+ raise InstanceNotCreated(
298
+ "Unable to create the instance because failed to register the storage."
299
+ )
287
300
  init_instance_hub(
288
301
  isettings, account_id=user__uuid, access_token=access_token
289
302
  )
lamindb_setup/_migrate.py CHANGED
@@ -23,25 +23,36 @@ def check_whether_migrations_in_sync(db_version_str: str):
23
23
  return None
24
24
  installed_version = version.parse(installed_version_str)
25
25
  db_version = version.parse(db_version_str)
26
- if installed_version.major < db_version.major or (
26
+ if installed_version.major < db_version.major:
27
+ logger.warning(
28
+ f"the database ({db_version_str}) is far ahead of your installed lamindb package ({installed_version_str})"
29
+ )
30
+ logger.important(
31
+ f"please update lamindb: pip install lamindb>={db_version.major}"
32
+ )
33
+ elif (
27
34
  installed_version.major == db_version.major
28
35
  and installed_version.minor < db_version.minor
29
36
  ):
30
37
  db_version_lower = f"{db_version.major}.{db_version.minor}"
31
- db_version_upper = f"{db_version.major}.{db_version.minor + 1}"
32
- logger.warning(
38
+ logger.important(
33
39
  f"the database ({db_version_str}) is ahead of your installed lamindb"
34
40
  f" package ({installed_version_str})"
35
41
  )
36
42
  logger.important(
37
- "please update lamindb: pip install"
38
- f' "lamindb>={db_version_lower},<{db_version_upper}"'
43
+ f"consider updating lamindb: pip install lamindb>={db_version_lower}"
39
44
  )
40
- elif installed_version.major > db_version.major or (
45
+ elif installed_version.major > db_version.major:
46
+ logger.warning(
47
+ f"the database ({db_version_str}) is far behind your installed lamindb package"
48
+ f" ({installed_version_str})"
49
+ )
50
+ logger.important("migrate your database: lamin migrate deploy")
51
+ elif (
41
52
  installed_version.major == db_version.major
42
53
  and installed_version.minor > db_version.minor
43
54
  ):
44
- logger.warning(
55
+ logger.important(
45
56
  f"the database ({db_version_str}) is behind your installed lamindb package"
46
57
  f" ({installed_version_str})"
47
58
  )
@@ -10,8 +10,7 @@ from .core.django import setup_django
10
10
  def register(_test: bool = False):
11
11
  """Register an instance on the hub."""
12
12
  from ._check_setup import _check_instance_setup
13
- from .core._hub_core import init_instance as init_instance_hub
14
- from .core._hub_core import init_storage as init_storage_hub
13
+ from .core._hub_core import init_instance_hub, init_storage_hub
15
14
 
16
15
  logger.warning("""lamin register will be removed soon""")
17
16
 
@@ -180,3 +180,37 @@ def call_with_fallback(
180
180
  except NameError:
181
181
  pass
182
182
  return result
183
+
184
+
185
+ def requests_client():
186
+ # local is used in tests
187
+ if os.environ.get("LAMIN_ENV", "prod") == "local":
188
+ from fastapi.testclient import TestClient
189
+ from laminhub_rest.main import app
190
+
191
+ return TestClient(app)
192
+
193
+ import requests # type: ignore
194
+
195
+ return requests
196
+
197
+
198
+ def request_get_auth(url: str, access_token: str, renew_token: bool = True):
199
+ requests = requests_client()
200
+
201
+ response = requests.get(url, headers={"Authorization": f"Bearer {access_token}"})
202
+ # upate access_token and try again if failed
203
+ if response.status_code != 200 and renew_token:
204
+ from lamindb_setup import settings
205
+
206
+ access_token = get_access_token(
207
+ settings.user.email, settings.user.password, settings.user.api_key
208
+ )
209
+
210
+ settings.user.access_token = access_token
211
+ save_user_settings(settings.user)
212
+
213
+ response = requests.get(
214
+ url, headers={"Authorization": f"Bearer {access_token}"}
215
+ )
216
+ return response
@@ -16,6 +16,7 @@ from ._hub_client import (
16
16
  call_with_fallback,
17
17
  call_with_fallback_auth,
18
18
  connect_hub,
19
+ request_get_auth,
19
20
  )
20
21
  from ._hub_crud import (
21
22
  _delete_instance_record,
@@ -115,7 +116,7 @@ def _select_storage(
115
116
  return True
116
117
 
117
118
 
118
- def init_storage(
119
+ def init_storage_hub(
119
120
  ssettings: StorageSettings,
120
121
  auto_populate_instance: bool = True,
121
122
  created_by: UUID | None = None,
@@ -123,7 +124,7 @@ def init_storage(
123
124
  ) -> Literal["hub-record-retireved", "hub-record-created"]:
124
125
  if settings.user.handle != "anonymous" or access_token is not None:
125
126
  return call_with_fallback_auth(
126
- _init_storage,
127
+ _init_storage_hub,
127
128
  ssettings=ssettings,
128
129
  auto_populate_instance=auto_populate_instance,
129
130
  created_by=created_by,
@@ -139,7 +140,7 @@ def init_storage(
139
140
  raise ValueError("Log in to create a storage location on the hub.")
140
141
 
141
142
 
142
- def _init_storage(
143
+ def _init_storage_hub(
143
144
  client: Client,
144
145
  ssettings: StorageSettings,
145
146
  auto_populate_instance: bool,
@@ -269,20 +270,20 @@ def delete_instance_record(instance_id: UUID, access_token: str | None = None) -
269
270
  )
270
271
 
271
272
 
272
- def init_instance(
273
+ def init_instance_hub(
273
274
  isettings: InstanceSettings,
274
275
  account_id: UUID | None = None,
275
276
  access_token: str | None = None,
276
277
  ) -> None:
277
278
  return call_with_fallback_auth(
278
- _init_instance,
279
+ _init_instance_hub,
279
280
  isettings=isettings,
280
281
  account_id=account_id,
281
282
  access_token=access_token,
282
283
  )
283
284
 
284
285
 
285
- def _init_instance(
286
+ def _init_instance_hub(
286
287
  client: Client, isettings: InstanceSettings, account_id: UUID | None = None
287
288
  ) -> None:
288
289
  from ._settings import settings
@@ -437,6 +438,38 @@ def _access_aws(*, storage_root: str, client: Client) -> dict[str, dict]:
437
438
  return storage_root_info
438
439
 
439
440
 
441
+ def access_db(isettings: InstanceSettings, access_token: str | None = None) -> str:
442
+ if access_token is None:
443
+ if settings.user.handle == "anonymous":
444
+ raise RuntimeError(
445
+ f"Can only get fine-grained access to {isettings.slug} if authenticated."
446
+ )
447
+ else:
448
+ access_token = settings.user.access_token
449
+ renew_token = True
450
+ else:
451
+ renew_token = False
452
+ # local is used in tests
453
+ url = f"/access_v2/instances/{isettings._id}/db_token"
454
+ if os.environ.get("LAMIN_ENV", "prod") != "local":
455
+ api_url = isettings._api_url
456
+ if api_url is None:
457
+ raise RuntimeError(
458
+ f"Can only get fine-grained access to {isettings.slug} if api_url is present."
459
+ )
460
+ url = api_url + url
461
+
462
+ response = request_get_auth(url, access_token, renew_token) # type: ignore
463
+ response_json = response.json()
464
+ if response.status_code != 200:
465
+ raise PermissionError(
466
+ f"Fine-grained access to {isettings.slug} failed: {response_json}"
467
+ )
468
+ if "token" not in response_json:
469
+ raise RuntimeError("The response of access_db does not contain a db token.")
470
+ return response_json["token"]
471
+
472
+
440
473
  def get_lamin_site_base_url():
441
474
  if "LAMIN_ENV" in os.environ:
442
475
  if os.environ["LAMIN_ENV"] == "local":
@@ -59,6 +59,7 @@ class InstanceSettings:
59
59
  is_on_hub: bool | None = None, # initialized from hub
60
60
  api_url: str | None = None,
61
61
  schema_id: UUID | None = None,
62
+ fine_grained_access: bool = False,
62
63
  _locker_user: UserSettings | None = None, # user to lock for if cloud sqlite
63
64
  ):
64
65
  from ._hub_utils import validate_db_arg
@@ -76,9 +77,12 @@ class InstanceSettings:
76
77
  self._keep_artifacts_local = keep_artifacts_local
77
78
  self._storage_local: StorageSettings | None = None
78
79
  self._is_on_hub = is_on_hub
79
- # private, needed for writing instance settings
80
+ # private, needed for api requests
80
81
  self._api_url = api_url
81
82
  self._schema_id = schema_id
83
+ # private, whether fine grained access is used
84
+ # needed to be set to request jwt etc
85
+ self._fine_grained_access = fine_grained_access
82
86
  # if None then settings.user is used
83
87
  self._locker_user = _locker_user
84
88
 
@@ -101,6 +101,9 @@ def setup_instance_from_store(store: InstanceSettingsStore) -> InstanceSettings:
101
101
  modules=_null_to_value(store.schema_str),
102
102
  git_repo=_null_to_value(store.git_repo),
103
103
  keep_artifacts_local=store.keep_artifacts_local, # type: ignore
104
+ api_url=_null_to_value(store.api_url),
105
+ schema_id=None if store.schema_id == "null" else UUID(store.schema_id),
106
+ fine_grained_access=store.fine_grained_access,
104
107
  )
105
108
 
106
109
 
@@ -60,6 +60,7 @@ def save_settings(
60
60
  "id",
61
61
  "api_url",
62
62
  "schema_id",
63
+ "fine_grained_access",
63
64
  }:
64
65
  settings_key = f"_{store_key.rstrip('_')}"
65
66
  else:
@@ -150,8 +150,7 @@ def init_storage(
150
150
  # the below might update the uid with one that's already taken on the hub
151
151
  if not prevent_register_hub:
152
152
  if ssettings.type_is_cloud or register_hub:
153
- from ._hub_core import delete_storage_record
154
- from ._hub_core import init_storage as init_storage_hub
153
+ from ._hub_core import delete_storage_record, init_storage_hub
155
154
 
156
155
  hub_record_status = init_storage_hub(
157
156
  ssettings,
@@ -175,6 +174,7 @@ def init_storage(
175
174
  # only newly created
176
175
  if hub_record_status == "hub-record-created" and ssettings._uuid is not None:
177
176
  delete_storage_record(ssettings._uuid, access_token=access_token) # type: ignore
177
+ ssettings._uuid_ = None
178
178
  hub_record_status = "hub-record-not-created"
179
179
  ssettings._instance_id = None
180
180
  return ssettings, hub_record_status
@@ -57,6 +57,7 @@ class InstanceSettingsStore(BaseSettings):
57
57
  db: Optional[str] # doesn't like new types on 3.9 even with future annotations
58
58
  schema_str: Optional[str]
59
59
  schema_id: Optional[str] = None
60
+ fine_grained_access: bool = False
60
61
  id: str
61
62
  git_repo: Optional[str]
62
63
  keep_artifacts_local: Optional[bool]
@@ -14,7 +14,7 @@ IS_MIGRATING = False
14
14
  CONN_MAX_AGE = 299
15
15
 
16
16
 
17
- def set_token(token: str | None, connection_name: str = "default"):
17
+ def set_db_token(token: str | None, connection_name: str = "default"):
18
18
  # None to reset
19
19
  from django.db import connections
20
20
  from django.db.backends.base.base import BaseDatabaseWrapper
@@ -125,6 +125,11 @@ def setup_django(
125
125
 
126
126
  BaseDatabaseWrapper.close_if_health_check_failed = close_if_health_check_failed
127
127
 
128
+ if isettings._fine_grained_access:
129
+ from ._hub_core import access_db
130
+
131
+ set_db_token(access_db(isettings))
132
+
128
133
  if configure_only:
129
134
  return None
130
135
 
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lamindb_setup
3
- Version: 1.3.0
3
+ Version: 1.3.1
4
4
  Summary: Setup & configure LaminDB.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
6
  Requires-Python: >=3.10
7
7
  Description-Content-Type: text/markdown
8
8
  Requires-Dist: lamin_utils>=0.3.3
9
- Requires-Dist: django>=5,<5.2
9
+ Requires-Dist: django>=5.1,<5.2
10
10
  Requires-Dist: dj_database_url>=1.3.0,<3.0.0
11
11
  Requires-Dist: pydantic-settings
12
12
  Requires-Dist: appdirs<2.0.0
@@ -1,17 +1,17 @@
1
- lamindb_setup/__init__.py,sha256=B7IVjz1M1qrpfYuPg4mQ66YiIyfAcYtmSfjLULXKpII,2692
1
+ lamindb_setup/__init__.py,sha256=ufOB1lSTRTPp-RZONLCcBSPomaQdlpnxW9U__2ODvcQ,2692
2
2
  lamindb_setup/_cache.py,sha256=aszT-zk3S5dTLKp5g1W-S_FPh2E5YVCALwWSGPJLWBM,1493
3
3
  lamindb_setup/_check.py,sha256=28PcG8Kp6OpjSLSi1r2boL2Ryeh6xkaCL87HFbjs6GA,129
4
4
  lamindb_setup/_check_setup.py,sha256=d1GS1Csy2G9AysfjoyVcNVY0lhHiWSwSLpfgdIQf35s,5477
5
5
  lamindb_setup/_close.py,sha256=pf8PHrtRBC6TycBtVAXzD9EZSGufoyp5M82o6zLHmt4,1240
6
- lamindb_setup/_connect_instance.py,sha256=eMiAjuMDuZ_x8N5LLHwz5O4VXv0nH6AzYW0tnnjUSug,18190
6
+ lamindb_setup/_connect_instance.py,sha256=IXpU43DO-DWm9twDeuQJeBbKj-oB4SzEqsCjIX4AZMo,18276
7
7
  lamindb_setup/_delete.py,sha256=4NqJkEA812VWRxTBW1o1h1YX0fF7sQwn08hj1BmvCPs,5673
8
8
  lamindb_setup/_django.py,sha256=uIQflpkp8l3axyPaKURlk3kacgpElVP5KOKmFxYSMGk,1454
9
9
  lamindb_setup/_entry_points.py,sha256=sKwXPX9xjOotoAjvgkU5LBwjjHLWVkh0ZGdiSsrch9k,522
10
10
  lamindb_setup/_exportdb.py,sha256=QLjoH4dEwqa01A12naKaDPglCCzl2_VLKWFfJRE_uSg,2113
11
11
  lamindb_setup/_importdb.py,sha256=fKv9ev5OOj_-bmzC8XZ1GxOcjIjI486yrHSHDWQrJeI,1874
12
- lamindb_setup/_init_instance.py,sha256=nZkqGqJQ_sF1-oQmnbpIjP1ExWUow5I5N7lsyX9m-io,13811
13
- lamindb_setup/_migrate.py,sha256=drf7Lsa8oDXBPBWMWMge0n5VyNPvsrCFAhcXlN91OxM,9165
14
- lamindb_setup/_register_instance.py,sha256=alQuYp2f8Ct8xvRC1gt8p_HZ0tqCd3gZD3kiPBLPpsI,1269
12
+ lamindb_setup/_init_instance.py,sha256=wZ1yEnbogduQOXkEbcip9Jm8mys1NtJy2W5RRWJy1lQ,14253
13
+ lamindb_setup/_migrate.py,sha256=gqWfXgixiD4dpQOq1ePVPfCj88iMCQSx4vxg_QKvFGc,9586
14
+ lamindb_setup/_register_instance.py,sha256=X7ZGlCVOZKq4zTpi3bxML4jzo6hgN9UYmdTxxf6JLmc,1205
15
15
  lamindb_setup/_schema.py,sha256=b3uzhhWpV5mQtDwhMINc2MabGCnGLESy51ito3yl6Wc,679
16
16
  lamindb_setup/_schema_metadata.py,sha256=cDkNHyFTFZq879UGY6i-rJEXfeBN59AN3Wz86caKnYI,14358
17
17
  lamindb_setup/_set_managed_storage.py,sha256=4tDxXQMt8Gw028uY3vIQxZQ7qBNXhQMc8saarNK_Z-s,2043
@@ -22,26 +22,26 @@ lamindb_setup/core/_aws_options.py,sha256=Umxu_1AYd-0LJUElZxowvE9vNA7Z8kh_63g3pp
22
22
  lamindb_setup/core/_aws_storage.py,sha256=nEjeUv4xUVpoV0Lx-zjjmyb9w804bDyaeiM-OqbfwM0,1799
23
23
  lamindb_setup/core/_deprecated.py,sha256=HN7iUBdEgahw5e4NHCd1VJooUfieNb6GRzS5x8jU-q8,2549
24
24
  lamindb_setup/core/_docs.py,sha256=3k-YY-oVaJd_9UIY-LfBg_u8raKOCNfkZQPA73KsUhs,276
25
- lamindb_setup/core/_hub_client.py,sha256=ywJ_HpGqwui6t_vsj-my80gYgSSgAiSFyZoRj03sBWk,6464
26
- lamindb_setup/core/_hub_core.py,sha256=OPByE76h6MQaCToT7AzbeH9Tr5-BbpIAh__oIiEl1VE,20021
25
+ lamindb_setup/core/_hub_client.py,sha256=Wy3QRJ1mySSu7xHjLZkcQvZpBX03g8oKbxiqxRIpPgo,7456
26
+ lamindb_setup/core/_hub_core.py,sha256=8ZdekUtJMPdWLUqiHeT2nZ_F7FV0GJkQ7ixaIOSaAr4,21309
27
27
  lamindb_setup/core/_hub_crud.py,sha256=IAuPZes1am8OFwtcf5jSRQPGG1eKwVTEsp9Li-uq0cQ,5377
28
28
  lamindb_setup/core/_hub_utils.py,sha256=6dyDGyzYFgVfR_lE3VN3CP1jGp98gxPtr-T91PAP05U,2687
29
29
  lamindb_setup/core/_private_django_api.py,sha256=By63l3vIEtK1pq246FhHq3tslxsaTJGKm5VakYluWp4,2656
30
30
  lamindb_setup/core/_settings.py,sha256=eslFO84vb5uRRfJ3r_uu4O8677l8lU5BbpZJMSAYw6A,8244
31
- lamindb_setup/core/_settings_instance.py,sha256=prEAS0MrSzPdxQTSjFoTzvGz6915GIL9v9RYhzPeoQ4,19362
32
- lamindb_setup/core/_settings_load.py,sha256=boeNntqIZ_DjelRBUAGp0ujc5akmbrrsk-LY28exa7E,4099
33
- lamindb_setup/core/_settings_save.py,sha256=rxGxgaK5i9exKqSJERQQyY1WZio20meoQJoYXlVW-1w,3138
34
- lamindb_setup/core/_settings_storage.py,sha256=a3rRqntAX-dKZn6-TkY9pTPT8UPNUlwdni1tDNTJW84,13117
35
- lamindb_setup/core/_settings_store.py,sha256=WcsgOmgnu9gztcrhp-N4OONNZyxICHV8M0HdJllTaEo,2219
31
+ lamindb_setup/core/_settings_instance.py,sha256=OLpwUp4a0SvVQ_r48C7Se2O5rckOE5MC0afAUGRAYMY,19549
32
+ lamindb_setup/core/_settings_load.py,sha256=5wzhfCqt5mA9rpgAs9EWgxifrpL7Xwjw2YWaoL4VNeU,4281
33
+ lamindb_setup/core/_settings_save.py,sha256=P7TPIi0T7VPdyQX9Z5w9y0Uzq4Y5QHbFCuzWdN2nkfk,3185
34
+ lamindb_setup/core/_settings_storage.py,sha256=1-Wso38WN0Pcl3QdkdZc-B01D9Jpl-bjNMmu_FRLPFU,13103
35
+ lamindb_setup/core/_settings_store.py,sha256=NhKi7GsC4q5V280Ex7sjiSR2j6VXt1-01xPgBPtS_58,2257
36
36
  lamindb_setup/core/_settings_user.py,sha256=lWqV3HmZCsEq2UsU_iVNW0p9ddsNg7-B6xOaMNH1aw0,1475
37
37
  lamindb_setup/core/_setup_bionty_sources.py,sha256=qTPMV5TEbNiTB81QqG2rSs6W8j8kQ7kVQMLOXRzAxBI,4004
38
38
  lamindb_setup/core/cloud_sqlite_locker.py,sha256=i6TrT7HG0lqliPvZTlsZ_uplPaqhPBbabyfeR32SkA8,7107
39
- lamindb_setup/core/django.py,sha256=vmrGDiqX2FSmMII_YLcQtwO8SRzm6zKayjeNJLGhuiU,4697
39
+ lamindb_setup/core/django.py,sha256=2-btFL9YglV90qNy3bzV6rYBer7GftGINsDbc6u4mD4,4837
40
40
  lamindb_setup/core/exceptions.py,sha256=4NpLUNUIfXYVTFX2FvLZF8RW34exk2Vn2X3G4YhnTRg,276
41
41
  lamindb_setup/core/hashing.py,sha256=M3Q1-ywnqh4Uy5zojbQfLju19HU0ySp8Oi7FGIJXfFI,3667
42
42
  lamindb_setup/core/types.py,sha256=zJii2le38BJUmsNVvzDrbzGYr0yaeb-9Rw9IKmsBr3k,523
43
43
  lamindb_setup/core/upath.py,sha256=AvRmICPBxQx-2iQYsXDFsrJS-AAUNuw6IymLcVmkWvo,33550
44
- lamindb_setup-1.3.0.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
45
- lamindb_setup-1.3.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
46
- lamindb_setup-1.3.0.dist-info/METADATA,sha256=jGAuIu11oaJ-YYGXR4iXnh99vurdfu1vaJuEPL756gc,1777
47
- lamindb_setup-1.3.0.dist-info/RECORD,,
44
+ lamindb_setup-1.3.1.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
45
+ lamindb_setup-1.3.1.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
46
+ lamindb_setup-1.3.1.dist-info/METADATA,sha256=8SPEZKzLf1XSP8kM23EpttkZe7r4mXBI-SLl_26Ewmg,1779
47
+ lamindb_setup-1.3.1.dist-info/RECORD,,