lamindb_setup 0.81.4__py3-none-any.whl → 1.0a5__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.
@@ -12,14 +12,15 @@ from itertools import islice
12
12
  from pathlib import Path, PosixPath, PurePosixPath, WindowsPath
13
13
  from typing import TYPE_CHECKING, Any, Literal
14
14
 
15
+ import click
15
16
  import fsspec
16
17
  from lamin_utils import logger
17
18
  from upath import UPath
18
- from upath.implementations.cloud import CloudPath, S3Path # keep CloudPath!
19
+ from upath.implementations.cloud import CloudPath # keep CloudPath!
19
20
  from upath.implementations.local import LocalPath
20
21
 
21
22
  from ._aws_credentials import HOSTED_BUCKETS, get_aws_credentials_manager
22
- from .hashing import HASH_LENGTH, b16_to_b64, hash_from_hashes_list
23
+ from .hashing import HASH_LENGTH, b16_to_b64, hash_from_hashes_list, hash_string
23
24
 
24
25
  if TYPE_CHECKING:
25
26
  from .types import UPathStr
@@ -192,12 +193,15 @@ class ProgressCallback(fsspec.callbacks.Callback):
192
193
  def update_relative_value(self, inc=1):
193
194
  if inc != 0:
194
195
  self.value += inc
195
- # this is specific to http filesystem
196
- # for some reason the last update is 0 always
197
- # here 100% is forced manually in this case
198
- elif self.value >= 0.999:
199
- self.value = self.size
200
- self.call()
196
+ self.call()
197
+ else:
198
+ # this is specific to http filesystem
199
+ # for some reason the last update is 0 always
200
+ # sometimes the reported result is less that 100%
201
+ # here 100% is forced manually in this case
202
+ if self.value < 1.0 and self.value >= 0.999:
203
+ self.value = self.size
204
+ self.call()
201
205
 
202
206
  def branch(self, path_1, path_2, kwargs):
203
207
  if self.adjust_size:
@@ -264,7 +268,17 @@ def download_to(self, local_path: UPathStr, print_progress: bool = True, **kwarg
264
268
  )
265
269
  kwargs["callback"] = callback
266
270
 
267
- self.fs.download(str(self), str(local_path), **kwargs)
271
+ cloud_path_str = str(self)
272
+ local_path_str = str(local_path)
273
+ # needed due to https://github.com/fsspec/filesystem_spec/issues/1766
274
+ # otherwise fsspec calls fs._ls_real where it reads the body and parses links
275
+ # so the file is downloaded 2 times
276
+ # upath doesn't call fs.ls to infer type, so it is safe to call
277
+ if self.protocol in {"http", "https"} and self.stat().as_info()["type"] == "file":
278
+ self.fs.use_listings_cache = True
279
+ self.fs.dircache[cloud_path_str] = []
280
+
281
+ self.fs.download(cloud_path_str, local_path_str, **kwargs)
268
282
 
269
283
 
270
284
  def upload_from(
@@ -312,8 +326,7 @@ def upload_from(
312
326
  destination = self.as_posix()
313
327
 
314
328
  # the below lines are to avoid s3fs triggering create_bucket in upload if
315
- # dirs are present it allows to avoid permission error
316
- # would be easier to just
329
+ # dirs are present, it allows to avoid the permission error
317
330
  if self.protocol == "s3" and local_path_is_dir and create_folder:
318
331
  bucket = self.drive
319
332
  if bucket not in self.fs.dircache:
@@ -505,7 +518,7 @@ def compute_file_tree(
505
518
  skip_suffixes_tuple = ()
506
519
  else:
507
520
  skip_suffixes_tuple = tuple(skip_suffixes) # type: ignore
508
- n_objects = 0
521
+ n_files = 0
509
522
  n_directories = 0
510
523
 
511
524
  # by default only including registered files
@@ -518,7 +531,7 @@ def compute_file_tree(
518
531
  include_paths = set()
519
532
 
520
533
  def inner(dir_path: Path, prefix: str = "", level: int = -1):
521
- nonlocal n_objects, n_directories, suffixes
534
+ nonlocal n_files, n_directories, suffixes
522
535
  if level == 0:
523
536
  return
524
537
  stripped_dir_path = dir_path.as_posix().rstrip("/")
@@ -551,7 +564,7 @@ def compute_file_tree(
551
564
  suffix = extract_suffix_from_path(child_path)
552
565
  suffixes.add(suffix)
553
566
  n_files_per_dir_and_type[suffix] += 1
554
- n_objects += 1
567
+ n_files += 1
555
568
  if n_files_per_dir_and_type[suffix] == n_max_files_per_dir_and_type:
556
569
  yield prefix + "..."
557
570
  elif n_files_per_dir_and_type[suffix] > n_max_files_per_dir_and_type:
@@ -564,15 +577,15 @@ def compute_file_tree(
564
577
  for line in islice(iterator, n_max_files):
565
578
  folder_tree += f"\n{line}"
566
579
  if next(iterator, None):
567
- folder_tree += f"\n... only showing {n_max_files} out of {n_objects} files"
580
+ folder_tree += f"\n... only showing {n_max_files} out of {n_files} files"
568
581
  directory_info = "directory" if n_directories == 1 else "directories"
569
582
  display_suffixes = ", ".join([f"{suffix!r}" for suffix in suffixes])
570
- suffix_message = f" with suffixes {display_suffixes}" if n_objects > 0 else ""
583
+ suffix_message = f" with suffixes {display_suffixes}" if n_files > 0 else ""
571
584
  message = (
572
585
  f"{n_directories} sub-{directory_info} &"
573
- f" {n_objects} files{suffix_message}\n{path.resolve()}{folder_tree}"
586
+ f" {n_files} files{suffix_message}\n{path.resolve()}{folder_tree}"
574
587
  )
575
- return message, n_objects
588
+ return message, n_files
576
589
 
577
590
 
578
591
  # adapted from: https://stackoverflow.com/questions/9727673
@@ -726,12 +739,26 @@ warnings.filterwarnings(
726
739
  )
727
740
 
728
741
 
729
- def create_path(path: UPath, access_token: str | None = None) -> UPath:
730
- path = UPath(path)
731
- # test whether we have an AWS S3 path
732
- if not isinstance(path, S3Path):
733
- return path
734
- return get_aws_credentials_manager().enrich_path(path, access_token)
742
+ def create_path(path: UPathStr, access_token: str | None = None) -> UPath:
743
+ upath = UPath(path)
744
+
745
+ if upath.protocol == "s3":
746
+ # add managed credentials and other options for AWS s3 paths
747
+ return get_aws_credentials_manager().enrich_path(upath, access_token)
748
+
749
+ if upath.protocol in {"http", "https"}:
750
+ # this is needed because by default aiohttp drops a connection after 5 min
751
+ # so it is impossible to download large files
752
+ client_kwargs = upath.storage_options.get("client_kwargs", {})
753
+ if "timeout" not in client_kwargs:
754
+ from aiohttp import ClientTimeout
755
+
756
+ client_kwargs = {
757
+ **client_kwargs,
758
+ "timeout": ClientTimeout(sock_connect=30, sock_read=30),
759
+ }
760
+ return UPath(upath, client_kwargs=client_kwargs)
761
+ return upath
735
762
 
736
763
 
737
764
  def get_stat_file_cloud(stat: dict) -> tuple[int, str | None, str | None]:
@@ -749,20 +776,26 @@ def get_stat_file_cloud(stat: dict) -> tuple[int, str | None, str | None]:
749
776
  # s3
750
777
  # StorageClass is checked to be sure that it is indeed s3
751
778
  # because http also has ETag
752
- elif "ETag" in stat and "StorageClass" in stat:
779
+ elif "ETag" in stat:
753
780
  etag = stat["ETag"]
754
- # small files
755
- if "-" not in etag:
756
- # only store hash for non-multipart uploads
757
- # we can't rapidly validate multi-part uploaded files client-side
758
- # we can add more logic later down-the-road
759
- hash = b16_to_b64(etag)
760
- hash_type = "md5"
781
+ if "mimetype" in stat:
782
+ # http
783
+ hash = hash_string(etag.strip('"'))
784
+ hash_type = "md5-etag"
761
785
  else:
762
- stripped_etag, suffix = etag.split("-")
763
- suffix = suffix.strip('"')
764
- hash = b16_to_b64(stripped_etag)
765
- hash_type = f"md5-{suffix}" # this is the S3 chunk-hashing strategy
786
+ # s3
787
+ # small files
788
+ if "-" not in etag:
789
+ # only store hash for non-multipart uploads
790
+ # we can't rapidly validate multi-part uploaded files client-side
791
+ # we can add more logic later down-the-road
792
+ hash = b16_to_b64(etag)
793
+ hash_type = "md5"
794
+ else:
795
+ stripped_etag, suffix = etag.split("-")
796
+ suffix = suffix.strip('"')
797
+ hash = b16_to_b64(stripped_etag)
798
+ hash_type = f"md5-{suffix}" # this is the S3 chunk-hashing strategy
766
799
  if hash is not None:
767
800
  hash = hash[:HASH_LENGTH]
768
801
  return size, hash, hash_type
@@ -787,17 +820,18 @@ def get_stat_dir_cloud(path: UPath) -> tuple[int, str | None, str | None, int]:
787
820
  if compute_list_hash:
788
821
  hashes.append(object[accessor].strip('"='))
789
822
  size = sum(sizes)
790
- n_objects = len(sizes)
823
+ n_files = len(sizes)
791
824
  if compute_list_hash:
792
825
  hash, hash_type = hash_from_hashes_list(hashes), "md5-d"
793
- return size, hash, hash_type, n_objects
826
+ return size, hash, hash_type, n_files
794
827
 
795
828
 
796
- class InstanceNotEmpty(Exception):
797
- pass
829
+ class InstanceNotEmpty(click.ClickException):
830
+ def show(self, file=None):
831
+ pass
798
832
 
799
833
 
800
- # is as fast as boto3: https://lamin.ai/laminlabs/lamindata/transform/krGp3hT1f78N5zKv
834
+ # is as fast as boto3: https://lamin.ai/laminlabs/lamin-site-assets/transform/krGp3hT1f78N5zKv
801
835
  def check_storage_is_empty(
802
836
  root: UPathStr, *, raise_error: bool = True, account_for_sqlite_file: bool = False
803
837
  ) -> int:
@@ -820,20 +854,20 @@ def check_storage_is_empty(
820
854
  root_string += "/"
821
855
  directory_string = root_string + ".lamindb"
822
856
  objects = root_upath.fs.find(directory_string)
823
- n_objects = len(objects)
824
- n_diff = n_objects - n_offset_objects
857
+ n_files = len(objects)
858
+ n_diff = n_files - n_offset_objects
825
859
  ask_for_deletion = (
826
860
  "delete them prior to deleting the instance"
827
861
  if raise_error
828
862
  else "consider deleting them"
829
863
  )
830
864
  message = (
831
- f"Storage '{directory_string}' contains {n_objects - n_offset_objects} objects"
865
+ f"Storage '{directory_string}' contains {n_files - n_offset_objects} objects"
832
866
  f" - {ask_for_deletion}"
833
867
  )
834
868
  if n_diff > 0:
835
869
  if raise_error:
836
- raise InstanceNotEmpty(message)
870
+ raise InstanceNotEmpty(message) from None
837
871
  else:
838
872
  logger.warning(message)
839
873
  return n_diff
@@ -1,20 +1,19 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: lamindb_setup
3
- Version: 0.81.4
3
+ Version: 1.0a5
4
4
  Summary: Setup & configure LaminDB.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
6
  Requires-Python: >=3.9
7
7
  Description-Content-Type: text/markdown
8
- Requires-Dist: lnschema_core>=0.51.0
9
8
  Requires-Dist: lamin_utils>=0.3.3
10
- Requires-Dist: django>4.2,<5.3.0
9
+ Requires-Dist: django>=5,<5.2
11
10
  Requires-Dist: dj_database_url>=1.3.0,<3.0.0
12
11
  Requires-Dist: pydantic-settings
13
12
  Requires-Dist: appdirs<2.0.0
14
13
  Requires-Dist: requests
15
14
  Requires-Dist: universal_pathlib==0.2.5
16
15
  Requires-Dist: botocore<2.0.0
17
- Requires-Dist: supabase>=2.8.1,<=2.10.0
16
+ Requires-Dist: supabase>=2.8.1,<=2.11.0
18
17
  Requires-Dist: psutil
19
18
  Requires-Dist: urllib3<2 ; extra == "aws"
20
19
  Requires-Dist: aiobotocore[boto3]>=2.5.4,<3.0.0 ; extra == "aws"
@@ -0,0 +1,47 @@
1
+ lamindb_setup/__init__.py,sha256=TBrpOEkh3pBRah-Vg24iYsQHQE_UuEvTjc9t5LOeKEQ,2646
2
+ lamindb_setup/_cache.py,sha256=1XnM-V_KprbjpgPY7Bg3FYn53Iz_2_fEgcMOaSdKKbg,1332
3
+ lamindb_setup/_check.py,sha256=28PcG8Kp6OpjSLSi1r2boL2Ryeh6xkaCL87HFbjs6GA,129
4
+ lamindb_setup/_check_setup.py,sha256=FQA-wrLJgsBMmK5zJv3-2528CWhS-kwe4vOOXJ06yCM,3023
5
+ lamindb_setup/_close.py,sha256=pf8PHrtRBC6TycBtVAXzD9EZSGufoyp5M82o6zLHmt4,1240
6
+ lamindb_setup/_connect_instance.py,sha256=C1cAcTUV0OWnwPoxdlZwZtoMwybLypGY77mIIQLmiBg,16110
7
+ lamindb_setup/_delete.py,sha256=Mip5M9tCxyfsjzdcPCl6x9CQ0TkYTqKNNWDIcJ-KVMo,5677
8
+ lamindb_setup/_django.py,sha256=uIQflpkp8l3axyPaKURlk3kacgpElVP5KOKmFxYSMGk,1454
9
+ lamindb_setup/_entry_points.py,sha256=Hs2oJQOCTaGUdWn-1mufM6qUZr9W_EJ_Oc3f0_Vc0Yw,616
10
+ lamindb_setup/_exportdb.py,sha256=QLjoH4dEwqa01A12naKaDPglCCzl2_VLKWFfJRE_uSg,2113
11
+ lamindb_setup/_importdb.py,sha256=fKv9ev5OOj_-bmzC8XZ1GxOcjIjI486yrHSHDWQrJeI,1874
12
+ lamindb_setup/_init_instance.py,sha256=JV34P4ShinIdeUmHeoOvNE3WtzLbk37HcsWxfaEC_ks,13944
13
+ lamindb_setup/_migrate.py,sha256=bIW6TkgU93rTdnNAKWcyMgjTF0ypc_dzqsJG2lo_4Iw,9001
14
+ lamindb_setup/_register_instance.py,sha256=alQuYp2f8Ct8xvRC1gt8p_HZ0tqCd3gZD3kiPBLPpsI,1269
15
+ lamindb_setup/_schema.py,sha256=b3uzhhWpV5mQtDwhMINc2MabGCnGLESy51ito3yl6Wc,679
16
+ lamindb_setup/_schema_metadata.py,sha256=7ITlzIK32GHdhMq9e0GtPM3QbzJWhUvzPutiHrjjPk0,13986
17
+ lamindb_setup/_set_managed_storage.py,sha256=4tDxXQMt8Gw028uY3vIQxZQ7qBNXhQMc8saarNK_Z-s,2043
18
+ lamindb_setup/_setup_user.py,sha256=-g7Xj6510BDyM8kuqAsVBZFwehlhBa_uWBSV1rPeuM8,4586
19
+ lamindb_setup/_silence_loggers.py,sha256=AKF_YcHvX32eGXdsYK8MJlxEaZ-Uo2f6QDRzjKFCtws,1568
20
+ lamindb_setup/core/__init__.py,sha256=BxIVMX5HQq8oZ1OuY_saUEJz5Tdd7gaCPngxVu5iou4,417
21
+ lamindb_setup/core/_aws_credentials.py,sha256=_wBWC10MGx3PW9UXGhsVNlq7YvCER3RhfRgAdlxEjNM,6120
22
+ lamindb_setup/core/_aws_storage.py,sha256=nEjeUv4xUVpoV0Lx-zjjmyb9w804bDyaeiM-OqbfwM0,1799
23
+ lamindb_setup/core/_deprecated.py,sha256=HN7iUBdEgahw5e4NHCd1VJooUfieNb6GRzS5x8jU-q8,2549
24
+ lamindb_setup/core/_docs.py,sha256=3k-YY-oVaJd_9UIY-LfBg_u8raKOCNfkZQPA73KsUhs,276
25
+ lamindb_setup/core/_hub_client.py,sha256=cN19XbZmvLCxL_GKdOcKbedNRL7kR47vmLmA--NMv-U,6306
26
+ lamindb_setup/core/_hub_core.py,sha256=qVGGsWVfP6GK9UzmEz1kuR_B8wFkgTstMJJoMHeUF0c,20007
27
+ lamindb_setup/core/_hub_crud.py,sha256=IAuPZes1am8OFwtcf5jSRQPGG1eKwVTEsp9Li-uq0cQ,5377
28
+ lamindb_setup/core/_hub_utils.py,sha256=6dyDGyzYFgVfR_lE3VN3CP1jGp98gxPtr-T91PAP05U,2687
29
+ lamindb_setup/core/_private_django_api.py,sha256=KIn43HOhiRjkbTbddyJqv-WNTTa1bAizbM1tWXoXPBg,2869
30
+ lamindb_setup/core/_settings.py,sha256=eslFO84vb5uRRfJ3r_uu4O8677l8lU5BbpZJMSAYw6A,8244
31
+ lamindb_setup/core/_settings_instance.py,sha256=agzlSvKhvLyyNPf-Gw-M3FYn2ARpR1QEoCexhIHX5IU,19437
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=dPIvbA6PkdjM8gsX6zxtH7VNMc4vhkuEO4luVMZY7RQ,12243
35
+ lamindb_setup/core/_settings_store.py,sha256=WcsgOmgnu9gztcrhp-N4OONNZyxICHV8M0HdJllTaEo,2219
36
+ lamindb_setup/core/_settings_user.py,sha256=lWqV3HmZCsEq2UsU_iVNW0p9ddsNg7-B6xOaMNH1aw0,1475
37
+ lamindb_setup/core/_setup_bionty_sources.py,sha256=qTPMV5TEbNiTB81QqG2rSs6W8j8kQ7kVQMLOXRzAxBI,4004
38
+ lamindb_setup/core/cloud_sqlite_locker.py,sha256=i6TrT7HG0lqliPvZTlsZ_uplPaqhPBbabyfeR32SkA8,7107
39
+ lamindb_setup/core/django.py,sha256=hQwW6rYCPdTgU6O_NtH1uOOqut8y9RCHu8FROE_JX9M,3840
40
+ lamindb_setup/core/exceptions.py,sha256=4NpLUNUIfXYVTFX2FvLZF8RW34exk2Vn2X3G4YhnTRg,276
41
+ lamindb_setup/core/hashing.py,sha256=2kZy_7NQB1WoUK8SBrhFX90lBpTkBr1V9tf7FS9Fe2Q,3380
42
+ lamindb_setup/core/types.py,sha256=zJii2le38BJUmsNVvzDrbzGYr0yaeb-9Rw9IKmsBr3k,523
43
+ lamindb_setup/core/upath.py,sha256=UqfZcSIEflje2393osJ0tleizGKip5N1VJtXXVFUH7U,31061
44
+ lamindb_setup-1.0a5.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
45
+ lamindb_setup-1.0a5.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
46
+ lamindb_setup-1.0a5.dist-info/METADATA,sha256=uXCi1sC578RMy8-YVJaY3eFwN8PrZTZhYtoz-s4PEVI,1689
47
+ lamindb_setup-1.0a5.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: flit 3.9.0
2
+ Generator: flit 3.10.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,47 +0,0 @@
1
- lamindb_setup/__init__.py,sha256=41Rm-lDXIF3ir0Xsj-vpB0EZO5SmkipsRc5pmUzBEvk,1714
2
- lamindb_setup/_cache.py,sha256=1XnM-V_KprbjpgPY7Bg3FYn53Iz_2_fEgcMOaSdKKbg,1332
3
- lamindb_setup/_check.py,sha256=28PcG8Kp6OpjSLSi1r2boL2Ryeh6xkaCL87HFbjs6GA,129
4
- lamindb_setup/_check_setup.py,sha256=6cSfpmVOSgU7YiVHfJpBTGTQ7rrnwunt1pJT_jkgNM8,3196
5
- lamindb_setup/_close.py,sha256=cXNwK7QTTyNFt2XTpLnO3KHljJ7ShOcISk95np_dltE,1239
6
- lamindb_setup/_connect_instance.py,sha256=ClSM1zQAqVmNBapmB7H3dzmnWdn1dkpr_y5HAsF74XU,16070
7
- lamindb_setup/_delete.py,sha256=yjLIegM2Lh6sWRSTTybI17wK_kA4_pF_k3iVUkkgEAE,5681
8
- lamindb_setup/_django.py,sha256=DWUTjjVhEViX0S-zIkeqQgKovWqVgWMl4Y0ANwlA3Pw,1505
9
- lamindb_setup/_entry_points.py,sha256=Hs2oJQOCTaGUdWn-1mufM6qUZr9W_EJ_Oc3f0_Vc0Yw,616
10
- lamindb_setup/_exportdb.py,sha256=43g77-tH-vAlTn8ig1mMD9-KXLKvxUeDLaq0gVu3l-c,2114
11
- lamindb_setup/_importdb.py,sha256=yYYShzUajTsR-cTW4CZ-UNDWZY2uE5PAgNbp-wn8Ogc,1874
12
- lamindb_setup/_init_instance.py,sha256=zJbkP22h4Yif_VNooL06FFoHqH1EU45CqiLwF8FUaKs,14368
13
- lamindb_setup/_migrate.py,sha256=x_b4k4XRfLSD-EEFMc324yK6DIK7goW33wUytbIWlNs,8917
14
- lamindb_setup/_register_instance.py,sha256=alQuYp2f8Ct8xvRC1gt8p_HZ0tqCd3gZD3kiPBLPpsI,1269
15
- lamindb_setup/_schema.py,sha256=b3uzhhWpV5mQtDwhMINc2MabGCnGLESy51ito3yl6Wc,679
16
- lamindb_setup/_schema_metadata.py,sha256=49wDLbhRhatDeADjHOPfQURt65lf_OZ7lob1ZiAT_ac,13773
17
- lamindb_setup/_set_managed_storage.py,sha256=4tDxXQMt8Gw028uY3vIQxZQ7qBNXhQMc8saarNK_Z-s,2043
18
- lamindb_setup/_setup_user.py,sha256=-g7Xj6510BDyM8kuqAsVBZFwehlhBa_uWBSV1rPeuM8,4586
19
- lamindb_setup/_silence_loggers.py,sha256=AKF_YcHvX32eGXdsYK8MJlxEaZ-Uo2f6QDRzjKFCtws,1568
20
- lamindb_setup/core/__init__.py,sha256=BxIVMX5HQq8oZ1OuY_saUEJz5Tdd7gaCPngxVu5iou4,417
21
- lamindb_setup/core/_aws_credentials.py,sha256=E8yanKOq-idaIz5y9D9SazHaYJKX69VLK3pn7jl82do,5815
22
- lamindb_setup/core/_aws_storage.py,sha256=nEjeUv4xUVpoV0Lx-zjjmyb9w804bDyaeiM-OqbfwM0,1799
23
- lamindb_setup/core/_deprecated.py,sha256=3qxUI1dnDlSeR0BYrv7ucjqRBEojbqotPgpShXs4KF8,2520
24
- lamindb_setup/core/_docs.py,sha256=3k-YY-oVaJd_9UIY-LfBg_u8raKOCNfkZQPA73KsUhs,276
25
- lamindb_setup/core/_hub_client.py,sha256=cN19XbZmvLCxL_GKdOcKbedNRL7kR47vmLmA--NMv-U,6306
26
- lamindb_setup/core/_hub_core.py,sha256=cZfEDFq2z0cHjyPqwg7K5K3vw9C2nDHnbIHmmAjVbeM,19997
27
- lamindb_setup/core/_hub_crud.py,sha256=ro4dvZ0EaHs7_QwJH6BoKl69Wc9HEPDkIc9BFyO_DMg,5460
28
- lamindb_setup/core/_hub_utils.py,sha256=08NwQsb53-tXa_pr-f0tPTN0FeeVf_i1p3dEbEWD0F4,3016
29
- lamindb_setup/core/_private_django_api.py,sha256=KIn43HOhiRjkbTbddyJqv-WNTTa1bAizbM1tWXoXPBg,2869
30
- lamindb_setup/core/_settings.py,sha256=NYrSGtAw68mlQJgzBnV-DECi-RUBn32eeosyYCBtW3I,8232
31
- lamindb_setup/core/_settings_instance.py,sha256=ajcq9zRNE598tTqyMkMqaEOubVfFeE998DPtbgyzK3A,18801
32
- lamindb_setup/core/_settings_load.py,sha256=5OpghcbkrK9KBM_0Iu-61FTI76UbOpPkkJpUittXS-w,4098
33
- lamindb_setup/core/_settings_save.py,sha256=rxGxgaK5i9exKqSJERQQyY1WZio20meoQJoYXlVW-1w,3138
34
- lamindb_setup/core/_settings_storage.py,sha256=FOTyi89BZ48a8elCQ91C4B6oMO4tBnva4J6Tk40N9Ww,12249
35
- lamindb_setup/core/_settings_store.py,sha256=WcsgOmgnu9gztcrhp-N4OONNZyxICHV8M0HdJllTaEo,2219
36
- lamindb_setup/core/_settings_user.py,sha256=iz0MqFLKXqm8LYx_CHmr02_oNvYWFLIxKkJLdpS5W08,1476
37
- lamindb_setup/core/_setup_bionty_sources.py,sha256=jZOPXpipW_5IjMO-bLMk-_wVwk7-5MLd72K2rnqqy7U,4001
38
- lamindb_setup/core/cloud_sqlite_locker.py,sha256=i6TrT7HG0lqliPvZTlsZ_uplPaqhPBbabyfeR32SkA8,7107
39
- lamindb_setup/core/django.py,sha256=E4U9nUlV2kHd-G5v6iSdFGAAWixlQDxOFwMwOMG9xfw,3864
40
- lamindb_setup/core/exceptions.py,sha256=4NpLUNUIfXYVTFX2FvLZF8RW34exk2Vn2X3G4YhnTRg,276
41
- lamindb_setup/core/hashing.py,sha256=26dtak7XgmrWa_D1zuDyxObRQcriMtnc1yEigkKASmM,3142
42
- lamindb_setup/core/types.py,sha256=zJii2le38BJUmsNVvzDrbzGYr0yaeb-9Rw9IKmsBr3k,523
43
- lamindb_setup/core/upath.py,sha256=X5Jjm50-br1Qq3eRlO6U4ykidptc2QzoQtq-ilaPt4Q,29602
44
- lamindb_setup-0.81.4.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
45
- lamindb_setup-0.81.4.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
46
- lamindb_setup-0.81.4.dist-info/METADATA,sha256=xstSHpwOECuKUylOziRLHFHtafUtglGT1CQA0lUGscs,1730
47
- lamindb_setup-0.81.4.dist-info/RECORD,,