lamindb_setup 1.10.0__py3-none-any.whl → 1.10.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_setup/__init__.py CHANGED
@@ -35,7 +35,7 @@ Modules & settings:
35
35
 
36
36
  """
37
37
 
38
- __version__ = "1.10.0" # denote a release candidate for 0.1.0 with 0.1rc1
38
+ __version__ = "1.10.2" # denote a release candidate for 0.1.0 with 0.1rc1
39
39
 
40
40
  import os
41
41
 
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import importlib
4
4
  import os
5
5
  import sys
6
+ import types
6
7
  from typing import TYPE_CHECKING, Any
7
8
  from uuid import UUID
8
9
 
@@ -24,6 +25,7 @@ from .core._settings_load import load_instance_settings
24
25
  from .core._settings_storage import StorageSettings
25
26
  from .core._settings_store import instance_settings_file, settings_dir
26
27
  from .core.cloud_sqlite_locker import unlock_cloud_sqlite_upon_exception
28
+ from .core.django import reset_django
27
29
  from .errors import CannotSwitchDefaultInstance
28
30
 
29
31
  if TYPE_CHECKING:
@@ -101,6 +103,7 @@ def _connect_instance(
101
103
  *,
102
104
  db: str | None = None,
103
105
  raise_permission_error: bool = True,
106
+ use_root_db_user: bool = False,
104
107
  access_token: str | None = None,
105
108
  ) -> InstanceSettings:
106
109
  settings_file = instance_settings_file(name, owner)
@@ -120,7 +123,10 @@ def _connect_instance(
120
123
  # do not call hub if the user is anonymous
121
124
  if owner != "anonymous":
122
125
  hub_result = connect_instance_hub(
123
- owner=owner, name=name, access_token=access_token
126
+ owner=owner,
127
+ name=name,
128
+ access_token=access_token,
129
+ use_root_db_user=use_root_db_user,
124
130
  )
125
131
  else:
126
132
  hub_result = "anonymous-user"
@@ -155,7 +161,9 @@ def _connect_instance(
155
161
  schema_id=None
156
162
  if (schema_id := instance_result["schema_id"]) is None
157
163
  else UUID(schema_id),
158
- fine_grained_access=instance_result.get("fine_grained_access", False),
164
+ fine_grained_access=bool(
165
+ instance_result["fine_grained_access"]
166
+ ), # can be None
159
167
  db_permissions=instance_result.get("db_permissions", None),
160
168
  )
161
169
  else:
@@ -177,22 +185,26 @@ def _connect_instance(
177
185
  def reset_django_module_variables():
178
186
  # This function updates all module-level references to Django classes
179
187
  # But it will fail to update function level references
188
+ # This is not a problem unless for the function that calls ln.connect() itself
180
189
  # So, if a user has
190
+ #
181
191
  # def my_function():
182
192
  # import lamindb as ln
183
- # ...
193
+ # ln.connect(...)
184
194
  #
185
- # Then it will **not** work and the `ln` variable will become stale and hold a reference
195
+ # Then it will **not** work and the `ln` variable becomes stale and hold a reference
186
196
  # to the old classes
187
- # There doesn't seem to be an easy way to fix this problem
188
-
189
- import types
197
+ # Other functions that dynamically import are no problem because the variables
198
+ # are automatically refreshed when the function runs the next time after ln.connect() was called
199
+ logger.important_hint("resetting django module variables")
190
200
 
201
+ # django.apps needs to be a local import to refresh variables
191
202
  from django.apps import apps
192
203
 
193
204
  app_names = {app.name for app in apps.get_app_configs()}
194
-
195
- for name, module in sys.modules.items():
205
+ # always copy before iterations over sys.modules
206
+ # see https://docs.python.org/3/library/sys.html#sys.modules
207
+ for name, module in sys.modules.copy().items():
196
208
  if (
197
209
  module is not None
198
210
  and (not name.startswith("__") or name == "__main__")
@@ -230,12 +242,11 @@ def reset_django_module_variables():
230
242
  continue
231
243
 
232
244
 
233
- def _connect_cli(instance: str) -> None:
245
+ def _connect_cli(instance: str, use_root_db_user: bool = False) -> None:
234
246
  from lamindb_setup import settings as settings_
235
247
 
236
- settings_.auto_connect = True
237
248
  owner, name = get_owner_name_from_identifier(instance)
238
- isettings = _connect_instance(owner, name)
249
+ isettings = _connect_instance(owner, name, use_root_db_user=use_root_db_user)
239
250
  isettings._persist(write_to_disk=True)
240
251
  if not isettings.is_on_hub or isettings._is_cloud_sqlite:
241
252
  # there are two reasons to call the full-blown connect
@@ -262,6 +273,7 @@ def connect(instance: str | None = None, **kwargs: Any) -> str | tuple | None:
262
273
  """
263
274
  # validate kwargs
264
275
  valid_kwargs = {
276
+ "use_root_db_user",
265
277
  "_db",
266
278
  "_write_settings",
267
279
  "_raise_not_found_error",
@@ -274,6 +286,7 @@ def connect(instance: str | None = None, **kwargs: Any) -> str | tuple | None:
274
286
  raise TypeError(f"connect() got unexpected keyword argument '{kwarg}'")
275
287
  isettings: InstanceSettings = None # type: ignore
276
288
  # _db is still needed because it is called in init
289
+ use_root_db_user: bool = kwargs.get("use_root_db_user", False)
277
290
  _db: str | None = kwargs.get("_db", None)
278
291
  _write_settings: bool = kwargs.get("_write_settings", False)
279
292
  _raise_not_found_error: bool = kwargs.get("_raise_not_found_error", True)
@@ -289,12 +302,18 @@ def connect(instance: str | None = None, **kwargs: Any) -> str | tuple | None:
289
302
 
290
303
  try:
291
304
  if instance is None:
292
- isettings_or_none = _get_current_instance_settings()
293
- if isettings_or_none is None:
294
- raise ValueError(
295
- "No instance was connected through the CLI, pass a value to `instance` or connect via the CLI."
296
- )
297
- isettings = isettings_or_none
305
+ if settings._instance_exists:
306
+ isettings = settings.instance
307
+ else:
308
+ isettings_or_none = _get_current_instance_settings()
309
+ if isettings_or_none is None:
310
+ raise ValueError(
311
+ "No instance was connected through the CLI, pass a value to `instance` or connect via the CLI."
312
+ )
313
+ isettings = isettings_or_none
314
+ if use_root_db_user:
315
+ reset_django()
316
+ owner, name = isettings.owner, isettings.name
298
317
  if _db is not None and isettings.dialect == "postgresql":
299
318
  isettings._db = _db
300
319
  else:
@@ -310,14 +329,13 @@ def connect(instance: str | None = None, **kwargs: Any) -> str | tuple | None:
310
329
  # could be made more specific by checking whether the django
311
330
  # configured database is the same as the one in settings
312
331
  and connection.settings_dict["NAME"] != ":memory:"
332
+ and not use_root_db_user # always re-connect for root db user
313
333
  ):
314
334
  logger.important(
315
335
  f"doing nothing, already connected lamindb: {settings.instance.slug}"
316
336
  )
317
337
  return None
318
338
  else:
319
- from lamindb_setup.core.django import reset_django
320
-
321
339
  if (
322
340
  settings._instance_exists
323
341
  and settings.instance.slug != "none/none"
@@ -328,11 +346,6 @@ def connect(instance: str | None = None, **kwargs: Any) -> str | tuple | None:
328
346
  raise CannotSwitchDefaultInstance(
329
347
  "Cannot switch default instance while `ln.track()` is live: call `ln.finish()`"
330
348
  )
331
- else:
332
- logger.important_hint(
333
- "switching the default lamindb instance might produce unexpected side effects with function-scoped imports: "
334
- "please import lamindb at the module level instead of inside functions"
335
- )
336
349
  reset_django()
337
350
  elif (
338
351
  _write_settings
@@ -341,9 +354,14 @@ def connect(instance: str | None = None, **kwargs: Any) -> str | tuple | None:
341
354
  ):
342
355
  disconnect(mute=True)
343
356
 
357
+ if instance is not None or use_root_db_user:
344
358
  try:
345
359
  isettings = _connect_instance(
346
- owner, name, db=_db, access_token=access_token
360
+ owner,
361
+ name,
362
+ db=_db,
363
+ access_token=access_token,
364
+ use_root_db_user=use_root_db_user,
347
365
  )
348
366
  except InstanceNotFoundError as e:
349
367
  if _raise_not_found_error:
lamindb_setup/_migrate.py CHANGED
@@ -93,17 +93,13 @@ class migrate:
93
93
  @disable_auto_connect
94
94
  def create(cls) -> None:
95
95
  """Create a migration."""
96
- if _check_instance_setup():
97
- raise RuntimeError("Restart Python session to create migration or use CLI!")
98
96
  setup_django(settings.instance, create_migrations=True)
99
97
 
100
98
  @classmethod
101
99
  def deploy(cls, package_name: str | None = None, number: int | None = None) -> None:
102
100
  """Deploy a migration."""
103
- from ._schema_metadata import update_schema_in_hub
104
-
105
- if _check_instance_setup():
106
- raise RuntimeError("Restart Python session to migrate or use CLI!")
101
+ from lamindb_setup._connect_instance import connect
102
+ from lamindb_setup._schema_metadata import update_schema_in_hub
107
103
  from lamindb_setup.core._hub_client import call_with_fallback_auth
108
104
  from lamindb_setup.core._hub_crud import (
109
105
  select_collaborator,
@@ -117,12 +113,17 @@ class migrate:
117
113
  select_collaborator,
118
114
  instance_id=settings.instance._id,
119
115
  account_id=settings.user._uuid,
116
+ fine_grained_access=settings.instance._fine_grained_access,
120
117
  )
121
118
  if collaborator is None or collaborator["role"] != "admin":
122
119
  raise SystemExit(
123
120
  "❌ Only admins can deploy migrations, please ensure that you're an"
124
121
  f" admin: https://lamin.ai/{settings.instance.slug}/settings"
125
122
  )
123
+ # ensure we connect with the root user
124
+ if "root" not in settings.instance.db:
125
+ connect(use_root_db_user=True)
126
+ assert "root" in (instance_db := settings.instance.db), instance_db
126
127
  # we need lamindb to be installed, otherwise we can't populate the version
127
128
  # information in the hub
128
129
  import lamindb
@@ -139,7 +140,6 @@ class migrate:
139
140
  # this populates the hub
140
141
  if settings.instance.is_on_hub:
141
142
  logger.important(f"updating lamindb version in hub: {lamindb.__version__}")
142
- # TODO: integrate update of instance table within update_schema_in_hub & below
143
143
  if settings.instance.dialect != "sqlite":
144
144
  update_schema_in_hub()
145
145
  call_with_fallback_auth(
@@ -51,7 +51,7 @@ def deprecated(new_name: str):
51
51
  warnings.warn(
52
52
  f"Use {new_name} instead of {func.__name__}, "
53
53
  f"{func.__name__} will be removed in the future.",
54
- category=FutureWarning,
54
+ category=DeprecationWarning,
55
55
  stacklevel=2,
56
56
  )
57
57
  return func(*args, **kwargs)
@@ -424,6 +424,7 @@ def _init_instance_hub(
424
424
  def _connect_instance_hub(
425
425
  owner: str, # account_handle
426
426
  name: str, # instance_name
427
+ use_root_db_user: bool,
427
428
  client: Client,
428
429
  ) -> tuple[dict, dict] | str:
429
430
  response = client.functions.invoke(
@@ -475,17 +476,29 @@ def _connect_instance_hub(
475
476
 
476
477
  if instance["db_scheme"] is not None:
477
478
  db_user_name, db_user_password = None, None
478
- if "db_user_name" in instance and "db_user_password" in instance:
479
+ if (
480
+ "db_user_name" in instance
481
+ and "db_user_password" in instance
482
+ and not use_root_db_user
483
+ ):
479
484
  db_user_name, db_user_password = (
480
485
  instance["db_user_name"],
481
486
  instance["db_user_password"],
482
487
  )
483
488
  else:
484
- db_user = select_db_user_by_instance(instance["id"], client)
489
+ if use_root_db_user:
490
+ fine_grained_access = False
491
+ else:
492
+ fine_grained_access = bool(
493
+ instance["fine_grained_access"]
494
+ ) # can be None
495
+ db_user = select_db_user_by_instance(
496
+ instance["id"], fine_grained_access, client
497
+ )
485
498
  if db_user is not None:
486
499
  db_user_name, db_user_password = (
487
- db_user["db_user_name"],
488
- db_user["db_user_password"],
500
+ db_user["name" if fine_grained_access else "db_user_name"],
501
+ db_user["password" if fine_grained_access else "db_user_password"],
489
502
  )
490
503
  db_dsn = LaminDsn.build(
491
504
  scheme=instance["db_scheme"],
@@ -505,15 +518,25 @@ def connect_instance_hub(
505
518
  owner: str, # account_handle
506
519
  name: str, # instance_name
507
520
  access_token: str | None = None,
521
+ use_root_db_user: bool = False,
508
522
  ) -> tuple[dict, dict] | str:
509
523
  from ._settings import settings
510
524
 
511
525
  if settings.user.handle != "anonymous" or access_token is not None:
512
526
  return call_with_fallback_auth(
513
- _connect_instance_hub, owner=owner, name=name, access_token=access_token
527
+ _connect_instance_hub,
528
+ owner=owner,
529
+ name=name,
530
+ use_root_db_user=use_root_db_user,
531
+ access_token=access_token,
514
532
  )
515
533
  else:
516
- return call_with_fallback(_connect_instance_hub, owner=owner, name=name)
534
+ return call_with_fallback(
535
+ _connect_instance_hub,
536
+ owner=owner,
537
+ name=name,
538
+ use_root_db_user=use_root_db_user,
539
+ )
517
540
 
518
541
 
519
542
  def access_aws(storage_root: str, access_token: str | None = None) -> dict[str, dict]:
@@ -570,7 +593,7 @@ def access_db(
570
593
  if isinstance(instance, InstanceSettings):
571
594
  instance_id = instance._id
572
595
  instance_slug = instance.slug
573
- instance_api_url = instance._api_url
596
+ instance_api_url = instance.api_url
574
597
  else:
575
598
  instance_id = UUID(instance["id"])
576
599
  instance_slug = instance["owner"] + "/" + instance["name"]
@@ -137,10 +137,12 @@ def update_instance(instance_id: str, instance_fields: dict, client: Client):
137
137
  def select_collaborator(
138
138
  instance_id: str,
139
139
  account_id: str,
140
+ fine_grained_access: bool,
140
141
  client: Client,
141
142
  ):
143
+ table = "access_instance" if fine_grained_access else "account_instance"
142
144
  data = (
143
- client.table("account_instance")
145
+ client.table(table)
144
146
  .select("*")
145
147
  .eq("instance_id", instance_id)
146
148
  .eq("account_id", account_id)
@@ -180,35 +182,53 @@ def insert_db_user(
180
182
  db_user_name: str,
181
183
  db_user_password: str,
182
184
  instance_id: UUID,
185
+ fine_grained_access: bool,
183
186
  client: Client,
184
187
  ) -> None:
185
- fields = (
186
- {
187
- "id": uuid4().hex,
188
- "instance_id": instance_id.hex,
189
- "name": name,
190
- "db_user_name": db_user_name,
191
- "db_user_password": db_user_password,
192
- },
193
- )
194
- data = client.table("db_user").insert(fields).execute().data
188
+ fields = {"instance_id": instance_id.hex}
189
+ if fine_grained_access:
190
+ table = "access_db_user"
191
+ fields.update(
192
+ {
193
+ "name": db_user_name,
194
+ "password": db_user_password,
195
+ "type": name,
196
+ }
197
+ )
198
+ else:
199
+ table = "db_user"
200
+ fields.update(
201
+ {
202
+ "id": uuid4().hex,
203
+ "name": name,
204
+ "db_user_name": db_user_name,
205
+ "db_user_password": db_user_password,
206
+ }
207
+ )
208
+
209
+ data = client.table(table).insert(fields).execute().data
195
210
  return data[0]
196
211
 
197
212
 
198
- def select_db_user_by_instance(instance_id: str, client: Client):
213
+ def select_db_user_by_instance(
214
+ instance_id: str, fine_grained_access: bool, client: Client
215
+ ):
199
216
  """Get db_user for which client has permission."""
200
- data = (
201
- client.table("db_user")
202
- .select("*")
203
- .eq("instance_id", instance_id)
204
- .execute()
205
- .data
206
- )
217
+ if fine_grained_access:
218
+ table = "access_db_user"
219
+ type_name = "type"
220
+ type_priority = "jwt"
221
+ else:
222
+ table = "db_user"
223
+ type_name = "name"
224
+ type_priority = "write"
225
+
226
+ data = client.table(table).select("*").eq("instance_id", instance_id).execute().data
207
227
  if len(data) == 0:
208
228
  return None
209
229
  elif len(data) > 1:
210
230
  for item in data:
211
- if item["name"] == "write":
231
+ if item[type_name] == type_priority:
212
232
  return item
213
233
  logger.warning("found multiple db credentials, using the first one")
214
234
  return data[0]
@@ -79,24 +79,15 @@ class SetupSettings:
79
79
  def auto_connect(self) -> bool:
80
80
  """Auto-connect to current instance upon `import lamindb`.
81
81
 
82
- Upon installing `lamindb`, this setting is `False`.
83
-
84
- Upon calling `lamin init` or `lamin connect` on the CLI, this setting is switched to `True`.
85
-
86
- `ln.connect()` doesn't change the value of this setting.
87
-
88
- You can manually change this setting
89
-
90
- - in Python: `ln.setup.settings.auto_connect = True/False`
91
- - via the CLI: `lamin settings set auto-connect true/false`
82
+ This setting is always `True` and will be removed in a future version.
92
83
  """
93
84
  return True
94
85
 
95
86
  @auto_connect.setter
96
87
  def auto_connect(self, value: bool) -> None:
97
- # logger.warning(
98
- # "setting auto_connect to `False` no longer has an effect and the setting will likely be removed in the future; since lamindb 1.7, auto_connect `True` no longer clashes with connecting in a Python session",
99
- # )
88
+ logger.warning(
89
+ "setting auto_connect to `False` no longer has an effect and the setting will likely be removed in the future",
90
+ )
100
91
  if value:
101
92
  self._auto_connect_path.touch()
102
93
  else:
@@ -324,7 +315,6 @@ class SetupSettings:
324
315
  else:
325
316
  repr += "Current instance: None"
326
317
  repr += "\nConfig:\n"
327
- repr += f" - auto-connect in Python: {self.auto_connect}\n"
328
318
  repr += f" - private Django API: {self.private_django_api}\n"
329
319
  repr += "Local directories:\n"
330
320
  repr += f" - cache: {self.cache_dir.as_posix()}\n"
@@ -5,6 +5,7 @@ import shutil
5
5
  from pathlib import Path
6
6
  from typing import TYPE_CHECKING, Literal
7
7
 
8
+ from django.db import connection
8
9
  from django.db.utils import ProgrammingError
9
10
  from lamin_utils import logger
10
11
 
@@ -343,6 +344,37 @@ class InstanceSettings:
343
344
  """
344
345
  return self._git_repo
345
346
 
347
+ @property
348
+ def api_url(self) -> str | None:
349
+ """URL for REST API.
350
+
351
+ Use this URL for API calls related to this instance.
352
+ """
353
+ return self._api_url
354
+
355
+ @property
356
+ def available_spaces(self) -> dict | None:
357
+ """Available spaces with roles for instances fine-grained permissions.
358
+
359
+ Returns a dictionary with roles as keys and lists of available spaces
360
+ as values if this instance has fine-grained permissions and the current user
361
+ is a collaborator, `None` otherwise.
362
+ """
363
+ if self._db_permissions != "jwt":
364
+ return None
365
+
366
+ from lamindb.models import Space
367
+
368
+ spaces: dict = {"admin": [], "write": [], "read": []}
369
+ with connection.cursor() as cur:
370
+ cur.execute("SELECT * FROM check_access() WHERE type = 'space'")
371
+ rows = cur.fetchall()
372
+ for row in rows:
373
+ spaces[row[1]].append(row[0])
374
+ return {
375
+ k: Space.filter(id__in=v).to_list() if v else [] for k, v in spaces.items()
376
+ }
377
+
346
378
  @property
347
379
  def _id(self) -> UUID:
348
380
  """The internal instance id."""
@@ -273,13 +273,9 @@ def setup_django(
273
273
  isettings._local_storage = isettings._search_local_root()
274
274
 
275
275
 
276
- # THIS IS NOT SAFE
277
- # especially if lamindb is imported already
278
- # django.setup fails if called for the second time
279
- # reset_django() allows to call setup again,
280
- # needed to connect to a different instance in the same process if connected already
281
- # there could be problems if models are already imported from lamindb or other modules
282
- # these 'old' models can have any number of problems
276
+ # these needs to be followed by
277
+ # setup_django()
278
+ # reset_django_module_variables()
283
279
  def reset_django():
284
280
  from django.conf import settings
285
281
  from django.apps import apps
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lamindb_setup
3
- Version: 1.10.0
3
+ Version: 1.10.2
4
4
  Summary: Setup & configure LaminDB.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
6
  Requires-Python: >=3.10
@@ -27,7 +27,7 @@ Requires-Dist: psycopg2-binary ; extra == "dev"
27
27
  Requires-Dist: python-dotenv ; extra == "dev"
28
28
  Requires-Dist: nox ; extra == "dev"
29
29
  Requires-Dist: pytest>=6.0 ; extra == "dev"
30
- Requires-Dist: pytest-cov ; extra == "dev"
30
+ Requires-Dist: pytest-cov<7.0.0 ; extra == "dev"
31
31
  Requires-Dist: pytest-xdist ; extra == "dev"
32
32
  Requires-Dist: nbproject-test>=0.4.3 ; extra == "dev"
33
33
  Requires-Dist: pandas ; extra == "dev"
@@ -1,8 +1,8 @@
1
- lamindb_setup/__init__.py,sha256=3mcObwaFgQm5wWQp4KSOie5bNf-F8wcGjWh6v6hFYWw,2783
1
+ lamindb_setup/__init__.py,sha256=X3c4WiIMGBIUrnNgq0NYa6vEZbdSPENtF4bbr2kHuwc,2783
2
2
  lamindb_setup/_cache.py,sha256=pGvDNVHGx4HWr_6w5ajqEJOdysmaGc6F221qFnXkT-k,2747
3
3
  lamindb_setup/_check.py,sha256=28PcG8Kp6OpjSLSi1r2boL2Ryeh6xkaCL87HFbjs6GA,129
4
4
  lamindb_setup/_check_setup.py,sha256=ToKMxsUq8dQBQh8baOrNVlSb1iC8h4zTg5dV8wMu0W4,6760
5
- lamindb_setup/_connect_instance.py,sha256=wC66-SrdQx4Qeei_-zzEJPYL2RFZGihd8ErfOfEzt1c,16666
5
+ lamindb_setup/_connect_instance.py,sha256=6pgE_8Kv8ZVytXzN6Qp5ZlOtMtqE93cIdSkdA3Ey8ko,17545
6
6
  lamindb_setup/_delete.py,sha256=4kS-_nQrV5xMvZE3BGCNEEGCboyGmqqDMXlckF0GxSk,5780
7
7
  lamindb_setup/_disconnect.py,sha256=FT8EpCm5XXDdhDH7QtAnkO3KPatq2HqT9VXGNjgJDbk,1232
8
8
  lamindb_setup/_django.py,sha256=uIQflpkp8l3axyPaKURlk3kacgpElVP5KOKmFxYSMGk,1454
@@ -10,7 +10,7 @@ lamindb_setup/_entry_points.py,sha256=sKwXPX9xjOotoAjvgkU5LBwjjHLWVkh0ZGdiSsrch9
10
10
  lamindb_setup/_exportdb.py,sha256=QLjoH4dEwqa01A12naKaDPglCCzl2_VLKWFfJRE_uSg,2113
11
11
  lamindb_setup/_importdb.py,sha256=fKv9ev5OOj_-bmzC8XZ1GxOcjIjI486yrHSHDWQrJeI,1874
12
12
  lamindb_setup/_init_instance.py,sha256=0DhUGJ6FERxVg30F4XhCfsXaIy3AP1UecQzyjEm-FLw,14965
13
- lamindb_setup/_migrate.py,sha256=W-F5vSSs4pB68TdX6k97vMV-VOPgqcf6VOejHjbrQA8,10326
13
+ lamindb_setup/_migrate.py,sha256=oaqFcONqclTBXjxr4OWCJkSIH08nmC69xgVzdRq0N8U,10375
14
14
  lamindb_setup/_register_instance.py,sha256=RdUZxZWHLdbvdNZWpF8e0UWROb_T0cStWbzc5yUw34I,1047
15
15
  lamindb_setup/_schema.py,sha256=b3uzhhWpV5mQtDwhMINc2MabGCnGLESy51ito3yl6Wc,679
16
16
  lamindb_setup/_schema_metadata.py,sha256=yMSuLZc-7iWUV7tETNuKmcDeMW0wtUr5ypKxsKC-m7k,14898
@@ -23,15 +23,15 @@ lamindb_setup/types.py,sha256=XlXLb4nmbc68uBj5Hp3xpDRezYGJIBZv6jAAqqN0p10,614
23
23
  lamindb_setup/core/__init__.py,sha256=5M4A6CVHBO_T5Rr9MeLaPW3WTk4-y00cgRYEgUJVU5U,410
24
24
  lamindb_setup/core/_aws_options.py,sha256=UbwnaEX2KcZBDOa2W2NbH62cNrKJQ78Hrn7zcszhQvU,8092
25
25
  lamindb_setup/core/_aws_storage.py,sha256=ofPTHXvF97I9eUCHxj5RPpUUqAcNV0VsPWpyKMcshOI,2030
26
- lamindb_setup/core/_deprecated.py,sha256=HN7iUBdEgahw5e4NHCd1VJooUfieNb6GRzS5x8jU-q8,2549
26
+ lamindb_setup/core/_deprecated.py,sha256=M3vpM4fZPOncxY2qsXQAPeaEph28xWdv7tYaueaUyAA,2554
27
27
  lamindb_setup/core/_docs.py,sha256=3k-YY-oVaJd_9UIY-LfBg_u8raKOCNfkZQPA73KsUhs,276
28
28
  lamindb_setup/core/_hub_client.py,sha256=Pl3sEG2rasdJp4Rh5HNY0VsPVls-nfY0OxD5QzrYF9A,8678
29
- lamindb_setup/core/_hub_core.py,sha256=hYjtUaBEcUA5Etn4aPVDX3oSksdwr-8UL7gplIFriVc,25814
30
- lamindb_setup/core/_hub_crud.py,sha256=Jz0d8wFKM1Pv9B9byyUJPlCIMkIzk56Jd-c3Awpm9Xw,5730
29
+ lamindb_setup/core/_hub_core.py,sha256=r1tpfDjzgv7phESjq_dqYk23fyvm1M4KaVI-snP3NLA,26477
30
+ lamindb_setup/core/_hub_crud.py,sha256=j6516H82kLjFUNPqFGUINbDw9YbofMgjxadGzYb0OS4,6362
31
31
  lamindb_setup/core/_hub_utils.py,sha256=6dyDGyzYFgVfR_lE3VN3CP1jGp98gxPtr-T91PAP05U,2687
32
32
  lamindb_setup/core/_private_django_api.py,sha256=By63l3vIEtK1pq246FhHq3tslxsaTJGKm5VakYluWp4,2656
33
- lamindb_setup/core/_settings.py,sha256=CzOdAABbNHR5sWfPG90SZCpiDaHJw1NI3_JurQUtwV8,13811
34
- lamindb_setup/core/_settings_instance.py,sha256=_zIfY-6lOBPu6ttE-MgOE5ebHhn1JE47dBUt0A73BUE,22241
33
+ lamindb_setup/core/_settings.py,sha256=Xsn4Z-Z-gGM6q89f0SiWMaSDhIbTurwEwJLRsz6vspM,13312
34
+ lamindb_setup/core/_settings_instance.py,sha256=P2O2RWOSx2OUuU2nJBaD8FV6EIZYvUGGqTeVabIBKsA,23325
35
35
  lamindb_setup/core/_settings_load.py,sha256=j20cy3J56ZBHLDfB2A8oKjekNetMNsy0_W3eWD36pWI,5161
36
36
  lamindb_setup/core/_settings_save.py,sha256=XZx-vow7BT6y3JpRBB2UOJp2vwc7jOGea4wSgOPqjPU,3262
37
37
  lamindb_setup/core/_settings_storage.py,sha256=pyU25hP5rQYjVe0tFPR8P6TzAYzu1NpT-PIbXoxfV18,15348
@@ -39,12 +39,12 @@ lamindb_setup/core/_settings_store.py,sha256=QmeWIGdIyq7UmjfHiEB_0xRD8hY-8-ZR2Wn
39
39
  lamindb_setup/core/_settings_user.py,sha256=gFfyMf-738onbh1Mf4wsmLlenQJPtjQfpUgKnOlqc2o,1453
40
40
  lamindb_setup/core/_setup_bionty_sources.py,sha256=ox3X-SHiHa2lNPSWjwZhINypbLacX6kGwH6hVVrSFZc,1505
41
41
  lamindb_setup/core/cloud_sqlite_locker.py,sha256=H_CTUCjURFXwD1cCtV_Jn0_60iztZTkaesLLXIBgIxc,7204
42
- lamindb_setup/core/django.py,sha256=Pi2HkvH0F9edziov8gmq4bEES9vYi9e0cHd-R19ocmA,10771
42
+ lamindb_setup/core/django.py,sha256=Er0ikZmWHx5rPkzbuWLNkq2XTL9yTcEL16iX1yz9R60,10470
43
43
  lamindb_setup/core/exceptions.py,sha256=qjMzqy_uzPA7mCOdnoWnS_fdA6OWbdZGftz-YYplrY0,84
44
44
  lamindb_setup/core/hashing.py,sha256=Y8Uc5uSGTfU6L2R_gb5w8DdHhGRog7RnkK-e9FEMjPY,3680
45
45
  lamindb_setup/core/types.py,sha256=T7NwspfRHgIIpYsXDcApks8jkOlGeGRW-YbVLB7jNIo,67
46
46
  lamindb_setup/core/upath.py,sha256=-Wxct7lYOLVzUGv3ynqq0zLcRSAGWbvs-NqrZL0Aqy4,35579
47
- lamindb_setup-1.10.0.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
48
- lamindb_setup-1.10.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
49
- lamindb_setup-1.10.0.dist-info/METADATA,sha256=jvFAWDjQWtaIldISegSqxJcgy87atWPfbgVMTMC_JXg,1798
50
- lamindb_setup-1.10.0.dist-info/RECORD,,
47
+ lamindb_setup-1.10.2.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
48
+ lamindb_setup-1.10.2.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
49
+ lamindb_setup-1.10.2.dist-info/METADATA,sha256=B90EP2olTts5waIXLN5nLvIBqWnhY_FxeoMX9yLOnwk,1804
50
+ lamindb_setup-1.10.2.dist-info/RECORD,,