lamindb_setup 0.71.0__py2.py3-none-any.whl → 0.71.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 CHANGED
@@ -34,7 +34,7 @@ Modules & settings:
34
34
 
35
35
  """
36
36
 
37
- __version__ = "0.71.0" # denote a release candidate for 0.1.0 with 0.1rc1
37
+ __version__ = "0.71.2" # denote a release candidate for 0.1.0 with 0.1rc1
38
38
 
39
39
  import sys
40
40
  from os import name as _os_name
@@ -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
@@ -106,7 +107,7 @@ def connect(
106
107
  *,
107
108
  db: str | None = None,
108
109
  storage: UPathStr | None = None,
109
- _raise_not_reachable_error: bool = True,
110
+ _raise_not_found_error: bool = True,
110
111
  _test: bool = False,
111
112
  ) -> str | tuple | None:
112
113
  """Connect to instance.
@@ -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"]),
@@ -178,12 +181,12 @@ def connect(
178
181
  if settings_file.exists():
179
182
  isettings = load_instance_settings(settings_file)
180
183
  if isettings.is_remote:
181
- if _raise_not_reachable_error:
184
+ if _raise_not_found_error:
182
185
  raise InstanceNotFoundError(message)
183
186
  return "instance-not-found"
184
187
 
185
188
  else:
186
- if _raise_not_reachable_error:
189
+ if _raise_not_found_error:
187
190
  raise InstanceNotFoundError(message)
188
191
  return "instance-not-found"
189
192
 
@@ -206,7 +209,7 @@ def connect(
206
209
  f" {isettings._sqlite_file_local}\nTo push the file to the cloud,"
207
210
  " call: lamin close"
208
211
  )
209
- elif _raise_not_reachable_error:
212
+ elif _raise_not_found_error:
210
213
  raise SystemExit(msg)
211
214
  else:
212
215
  logger.warning(
@@ -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 INSTANCE_NOT_FOUND_MESSAGE
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
- instance_name (str): The name of the instance to delete.
64
- force (bool): Whether to skip the confirmation prompt.
65
- require_empty (bool): Whether to check if the instance is empty before deleting.
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
- if "/" in instance_name:
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, settings.user.handle)
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=settings.user.handle, name=instance_name
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=settings.user.handle,
81
+ owner=instance_owner,
86
82
  name=instance_name,
87
83
  hub_result=hub_result,
88
84
  )
89
- logger.warning(message)
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=settings.user.handle,
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 {instance_slug}? (y/n) ")
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 {instance_slug}")
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
@@ -184,7 +184,7 @@ def validate_init_args(
184
184
  name_str = infer_instance_name(storage=storage, name=name, db=db)
185
185
  # test whether instance exists by trying to load it
186
186
  instance_slug = f"{settings.user.handle}/{name_str}"
187
- response = connect(instance_slug, _raise_not_reachable_error=False, _test=_test)
187
+ response = connect(instance_slug, db=db, _raise_not_found_error=False, _test=_test)
188
188
  instance_state: Literal[
189
189
  "connected",
190
190
  "instance-corrupted-or-deleted",
@@ -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 ssettings is not None and settings.user.handle != "anonymous":
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 add_managed_storage(root: UPathStr, **fs_kwargs):
16
- """Add a remote default storage location to a local instance.
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.
@@ -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:
@@ -285,7 +290,7 @@ def _init_instance(isettings: InstanceSettings, client: Client) -> None:
285
290
  client.table("storage").update(
286
291
  {"instance_id": isettings._id.hex, "is_default": True}
287
292
  ).eq("id", isettings.storage._uuid.hex).execute() # type: ignore
288
- logger.save(f"browse to: https://lamin.ai/{isettings.owner}/{isettings.name}")
293
+ logger.important(f"go to: https://lamin.ai/{isettings.owner}/{isettings.name}")
289
294
 
290
295
 
291
296
  def connect_instance(
@@ -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 RuntimeError(
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
 
@@ -41,6 +41,8 @@ def save_settings(
41
41
  for store_key, type in type_hints.items():
42
42
  if type == Optional[str]:
43
43
  type = str
44
+ if type == Optional[bool]:
45
+ type = bool
44
46
  if "__" not in store_key:
45
47
  if store_key == "storage_root":
46
48
  value = settings.storage.root_as_str
@@ -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._is_on_hub is None:
324
- from ._hub_client import call_with_fallback_auth
325
- from ._hub_crud import select_storage
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."""
@@ -57,6 +57,7 @@ class InstanceSettingsStore(BaseSettings):
57
57
  schema_str: Optional[str]
58
58
  id: str
59
59
  git_repo: Optional[str]
60
+ keep_artifacts_local: Optional[bool]
60
61
 
61
62
  class Config:
62
63
  env_prefix = "lamindb_instance_"
@@ -46,6 +46,10 @@ class UserSettings:
46
46
  @property
47
47
  def id(self):
48
48
  """Integer id valid in current intance."""
49
- from lnschema_core.users import current_user_id
49
+ # do NOT use the function below because this
50
+ # doesn't error - it needs to be this way to have
51
+ # a user id available in migrations
52
+ # from lnschema_core.users import current_user_id
53
+ from lnschema_core.models import User
50
54
 
51
- return current_user_id()
55
+ return User.objects.get(uid=self.uid).id
@@ -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
@@ -462,7 +471,8 @@ def compute_file_tree(
462
471
  contents = [d for d in contents if d.is_dir()]
463
472
  pointers = [tee] * (len(contents) - 1) + [last]
464
473
  n_files_per_dir_and_type = defaultdict(lambda: 0) # type: ignore
465
- for pointer, child_path in zip(pointers, contents, strict=False): # type: ignore
474
+ # TODO: pass strict=False to zip with python > 3.9
475
+ for pointer, child_path in zip(pointers, contents): # type: ignore
466
476
  if child_path.is_dir():
467
477
  if include_dirs and child_path not in include_dirs:
468
478
  continue
@@ -495,8 +505,8 @@ def compute_file_tree(
495
505
  display_suffixes = ", ".join([f"{suffix!r}" for suffix in suffixes])
496
506
  suffix_message = f" with suffixes {display_suffixes}" if n_objects > 0 else ""
497
507
  message = (
498
- f"{path.name} ({n_directories} sub-{directory_info} &"
499
- f" {n_objects} files{suffix_message}): {folder_tree}"
508
+ f"{n_directories} sub-{directory_info} &"
509
+ f" {n_objects} files{suffix_message}\n{path.resolve()}{folder_tree}"
500
510
  )
501
511
  return message, n_objects
502
512
 
@@ -801,12 +811,12 @@ def check_storage_is_empty(
801
811
  if raise_error
802
812
  else "consider deleting them"
803
813
  )
804
- hint = "'./lamindb/_is_initialized' "
814
+ hint = "'_is_initialized'"
805
815
  if n_offset_objects == 2:
806
- hint += "& SQLite file"
816
+ hint += " & SQLite file"
807
817
  hint += " ignored"
808
818
  message = (
809
- f"Storage {directory_string} contains {n_objects} objects "
819
+ f"Storage {directory_string} contains {n_objects - n_offset_objects} objects "
810
820
  f"({hint}) - {ask_for_deletion}\n{objects}"
811
821
  )
812
822
  if n_diff > 0:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lamindb_setup
3
- Version: 0.71.0
3
+ Version: 0.71.2
4
4
  Summary: Setup & configure LaminDB.
5
5
  Author-email: Lamin Labs <laminlabs@gmail.com>
6
6
  Description-Content-Type: text/markdown
@@ -1,18 +1,18 @@
1
- lamindb_setup/__init__.py,sha256=6a3FROJtySXqU0zXTq1xIniLLPzc7_JufrXPqKJ11eI,1542
2
- lamindb_setup/_add_remote_storage.py,sha256=j-p29pxrr_07Ns5X2tm6yKxa3VESPkjyt35X4Cvr-nk,1325
1
+ lamindb_setup/__init__.py,sha256=Z6OThfuMvv_NukKBoTOjxZV5sex6PgniejgS9LiuODs,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=ElpbjSaAI9vq3OfmPM8TxvsqfrZyytTZSRyYUDfiv3E,11944
8
- lamindb_setup/_delete.py,sha256=tOEb8N7Ga9hrMpup2zBugtl0wN_Xxv0MqqKP2CpHArQ,7267
6
+ lamindb_setup/_connect_instance.py,sha256=6DiKFpw0k_gcWlZxI8ZJoqHungW-el3JbaWcmV9wGIg,12600
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=XLf-xkF_YBwvT_sGyW1wFJFbOWpTFABPRt2oeIICQNI,11825
11
+ lamindb_setup/_init_instance.py,sha256=2NT4ERk0RFrcgpnH5O-sAwkd7E1QLIOaFavyFzdAZbc,11924
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,24 +20,24 @@ 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=88EZA5G2JLlEZP6ol_km3Cv0dEpV2U2Z6X5vQOorGrs,15776
24
- lamindb_setup/core/_hub_crud.py,sha256=m8DgbWIBZBLWB-PV_UNBldUebqnxABfJfrqvzgr3t5s,4662
23
+ lamindb_setup/core/_hub_core.py,sha256=Cp8w0QY3DNOGWOhzzWmElj-pUm6tAkrQCLikbq_ksq8,15971
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=0MkFvZa0fVrMt087GL8Y-mHH44RUDQYybKqqj-c8flU,3849
29
- lamindb_setup/core/_settings_save.py,sha256=sLVNEMsrEO238Px8P8PsQjl4_RxGSKwRqB9Cffg2TrY,2637
30
- lamindb_setup/core/_settings_storage.py,sha256=yN2KNd6lq1RDNYbnkaCIfoYc3uKqkSU70otUr4qALPM,12739
31
- lamindb_setup/core/_settings_store.py,sha256=OMBn396BFkMXGg3came1pToBqnBUwpyqBFv2G8GARiM,2043
32
- lamindb_setup/core/_settings_user.py,sha256=P2lC4WDRAFfT-Xq3MlXJ-wMKIHCoGNhMTQfRGIAyUNQ,1344
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
+ lamindb_setup/core/_settings_user.py,sha256=IOOd3E3YN5xPEYy7fkWQDB6X06OcY4FkBqWT-XGxrjM,1563
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
35
35
  lamindb_setup/core/django.py,sha256=m0AKg2lJ1EYCtEtZ8frFFJbAR9qX0gnFcgqp7aeC2k0,3450
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=TcpBLVtI2aImJWn-FIMMThQt8i_ztJdETQ_Wj4Ow4qY,27965
40
- lamindb_setup-0.71.0.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
41
- lamindb_setup-0.71.0.dist-info/WHEEL,sha256=Sgu64hAMa6g5FdzHxXv9Xdse9yxpGGMeagVtPMWpJQY,99
42
- lamindb_setup-0.71.0.dist-info/METADATA,sha256=yQ8BtbUkb8PMmdgno_coRXNadR3Ib4ikzV6pTW7TSqo,1620
43
- lamindb_setup-0.71.0.dist-info/RECORD,,
39
+ lamindb_setup/core/upath.py,sha256=mou3NdF-tRTLW3E4eNDRFdCZrFZUyt-NPOVyC-DLe24,28342
40
+ lamindb_setup-0.71.2.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
41
+ lamindb_setup-0.71.2.dist-info/WHEEL,sha256=Sgu64hAMa6g5FdzHxXv9Xdse9yxpGGMeagVtPMWpJQY,99
42
+ lamindb_setup-0.71.2.dist-info/METADATA,sha256=E6rBt9sU5aiigEo_sDZXTUPZdlwUwLfo4oGup46A2CQ,1620
43
+ lamindb_setup-0.71.2.dist-info/RECORD,,