lamindb_setup 0.81.3__py3-none-any.whl → 1.0.0__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
@@ -190,8 +191,17 @@ class ProgressCallback(fsspec.callbacks.Callback):
190
191
  pass
191
192
 
192
193
  def update_relative_value(self, inc=1):
193
- self.value += inc
194
- self.call()
194
+ if inc != 0:
195
+ self.value += inc
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()
195
205
 
196
206
  def branch(self, path_1, path_2, kwargs):
197
207
  if self.adjust_size:
@@ -258,7 +268,17 @@ def download_to(self, local_path: UPathStr, print_progress: bool = True, **kwarg
258
268
  )
259
269
  kwargs["callback"] = callback
260
270
 
261
- 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)
262
282
 
263
283
 
264
284
  def upload_from(
@@ -306,8 +326,7 @@ def upload_from(
306
326
  destination = self.as_posix()
307
327
 
308
328
  # the below lines are to avoid s3fs triggering create_bucket in upload if
309
- # dirs are present it allows to avoid permission error
310
- # would be easier to just
329
+ # dirs are present, it allows to avoid the permission error
311
330
  if self.protocol == "s3" and local_path_is_dir and create_folder:
312
331
  bucket = self.drive
313
332
  if bucket not in self.fs.dircache:
@@ -350,27 +369,19 @@ def synchronize(
350
369
  exists = True
351
370
  cloud_mts = timestamp
352
371
  else:
353
- # hf requires special treatment
354
- if protocol == "hf":
355
- try:
356
- stat_hf = self.stat().as_info()
357
- is_dir = stat_hf["type"] == "directory"
358
- exists = True
359
- if not is_dir:
360
- cloud_mts = stat_hf["last_commit"].date.timestamp()
361
- except FileNotFoundError:
362
- exists = False
363
- else:
364
- # perform only one network request to check existence, type and timestamp
365
- try:
366
- cloud_mts = self.modified.timestamp()
367
- is_dir = False
368
- exists = True
369
- except FileNotFoundError:
370
- exists = False
371
- except IsADirectoryError:
372
- is_dir = True
373
- exists = True
372
+ try:
373
+ cloud_stat = self.stat()
374
+ cloud_info = cloud_stat.as_info()
375
+ exists = True
376
+ is_dir = cloud_info["type"] == "directory"
377
+ if not is_dir:
378
+ # hf requires special treatment
379
+ if protocol == "hf":
380
+ cloud_mts = cloud_info["last_commit"].date.timestamp()
381
+ else:
382
+ cloud_mts = cloud_stat.st_mtime
383
+ except FileNotFoundError:
384
+ exists = False
374
385
 
375
386
  if not exists:
376
387
  warn_or_error = f"The original path {self} does not exist anymore."
@@ -386,6 +397,7 @@ def synchronize(
386
397
  return None
387
398
 
388
399
  # synchronization logic for directories
400
+ # to synchronize directories, it should be possible to get modification times
389
401
  if is_dir:
390
402
  files = self.fs.find(str(self), detail=True)
391
403
  if protocol == "s3":
@@ -451,8 +463,16 @@ def synchronize(
451
463
  callback, print_progress, objectpath.name, "synchronizing"
452
464
  )
453
465
  if objectpath.exists():
454
- local_mts_obj = objectpath.stat().st_mtime # type: ignore
455
- need_synchronize = cloud_mts > local_mts_obj
466
+ if cloud_mts != 0:
467
+ local_mts_obj = objectpath.stat().st_mtime
468
+ need_synchronize = cloud_mts > local_mts_obj
469
+ else:
470
+ # this is true for http for example
471
+ # where size is present but st_mtime is not
472
+ # we assume that any change without the change in size is unlikely
473
+ cloud_size = cloud_stat.st_size
474
+ local_size_obj = objectpath.stat().st_size
475
+ need_synchronize = cloud_size != local_size_obj
456
476
  else:
457
477
  objectpath.parent.mkdir(parents=True, exist_ok=True)
458
478
  need_synchronize = True
@@ -464,7 +484,8 @@ def synchronize(
464
484
  self.download_to(
465
485
  objectpath, recursive=False, print_progress=False, callback=callback
466
486
  )
467
- os.utime(objectpath, times=(cloud_mts, cloud_mts))
487
+ if cloud_mts != 0:
488
+ os.utime(objectpath, times=(cloud_mts, cloud_mts))
468
489
  else:
469
490
  # nothing happens if parent_update is not defined
470
491
  # because of Callback.no_op
@@ -497,7 +518,7 @@ def compute_file_tree(
497
518
  skip_suffixes_tuple = ()
498
519
  else:
499
520
  skip_suffixes_tuple = tuple(skip_suffixes) # type: ignore
500
- n_objects = 0
521
+ n_files = 0
501
522
  n_directories = 0
502
523
 
503
524
  # by default only including registered files
@@ -510,7 +531,7 @@ def compute_file_tree(
510
531
  include_paths = set()
511
532
 
512
533
  def inner(dir_path: Path, prefix: str = "", level: int = -1):
513
- nonlocal n_objects, n_directories, suffixes
534
+ nonlocal n_files, n_directories, suffixes
514
535
  if level == 0:
515
536
  return
516
537
  stripped_dir_path = dir_path.as_posix().rstrip("/")
@@ -543,7 +564,7 @@ def compute_file_tree(
543
564
  suffix = extract_suffix_from_path(child_path)
544
565
  suffixes.add(suffix)
545
566
  n_files_per_dir_and_type[suffix] += 1
546
- n_objects += 1
567
+ n_files += 1
547
568
  if n_files_per_dir_and_type[suffix] == n_max_files_per_dir_and_type:
548
569
  yield prefix + "..."
549
570
  elif n_files_per_dir_and_type[suffix] > n_max_files_per_dir_and_type:
@@ -556,15 +577,15 @@ def compute_file_tree(
556
577
  for line in islice(iterator, n_max_files):
557
578
  folder_tree += f"\n{line}"
558
579
  if next(iterator, None):
559
- 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"
560
581
  directory_info = "directory" if n_directories == 1 else "directories"
561
582
  display_suffixes = ", ".join([f"{suffix!r}" for suffix in suffixes])
562
- 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 ""
563
584
  message = (
564
585
  f"{n_directories} sub-{directory_info} &"
565
- f" {n_objects} files{suffix_message}\n{path.resolve()}{folder_tree}"
586
+ f" {n_files} files{suffix_message}\n{path.resolve()}{folder_tree}"
566
587
  )
567
- return message, n_objects
588
+ return message, n_files
568
589
 
569
590
 
570
591
  # adapted from: https://stackoverflow.com/questions/9727673
@@ -718,12 +739,26 @@ warnings.filterwarnings(
718
739
  )
719
740
 
720
741
 
721
- def create_path(path: UPath, access_token: str | None = None) -> UPath:
722
- path = UPath(path)
723
- # test whether we have an AWS S3 path
724
- if not isinstance(path, S3Path):
725
- return path
726
- 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
727
762
 
728
763
 
729
764
  def get_stat_file_cloud(stat: dict) -> tuple[int, str | None, str | None]:
@@ -739,20 +774,28 @@ def get_stat_file_cloud(stat: dict) -> tuple[int, str | None, str | None]:
739
774
  hash = b16_to_b64(stat["blob_id"])
740
775
  hash_type = "sha1"
741
776
  # s3
777
+ # StorageClass is checked to be sure that it is indeed s3
778
+ # because http also has ETag
742
779
  elif "ETag" in stat:
743
780
  etag = stat["ETag"]
744
- # small files
745
- if "-" not in etag:
746
- # only store hash for non-multipart uploads
747
- # we can't rapidly validate multi-part uploaded files client-side
748
- # we can add more logic later down-the-road
749
- hash = b16_to_b64(etag)
750
- hash_type = "md5"
781
+ if "mimetype" in stat:
782
+ # http
783
+ hash = hash_string(etag.strip('"'))
784
+ hash_type = "md5-etag"
751
785
  else:
752
- stripped_etag, suffix = etag.split("-")
753
- suffix = suffix.strip('"')
754
- hash = b16_to_b64(stripped_etag)
755
- 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
756
799
  if hash is not None:
757
800
  hash = hash[:HASH_LENGTH]
758
801
  return size, hash, hash_type
@@ -777,17 +820,18 @@ def get_stat_dir_cloud(path: UPath) -> tuple[int, str | None, str | None, int]:
777
820
  if compute_list_hash:
778
821
  hashes.append(object[accessor].strip('"='))
779
822
  size = sum(sizes)
780
- n_objects = len(sizes)
823
+ n_files = len(sizes)
781
824
  if compute_list_hash:
782
825
  hash, hash_type = hash_from_hashes_list(hashes), "md5-d"
783
- return size, hash, hash_type, n_objects
826
+ return size, hash, hash_type, n_files
784
827
 
785
828
 
786
- class InstanceNotEmpty(Exception):
787
- pass
829
+ class InstanceNotEmpty(click.ClickException):
830
+ def show(self, file=None):
831
+ pass
788
832
 
789
833
 
790
- # 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
791
835
  def check_storage_is_empty(
792
836
  root: UPathStr, *, raise_error: bool = True, account_for_sqlite_file: bool = False
793
837
  ) -> int:
@@ -810,20 +854,20 @@ def check_storage_is_empty(
810
854
  root_string += "/"
811
855
  directory_string = root_string + ".lamindb"
812
856
  objects = root_upath.fs.find(directory_string)
813
- n_objects = len(objects)
814
- n_diff = n_objects - n_offset_objects
857
+ n_files = len(objects)
858
+ n_diff = n_files - n_offset_objects
815
859
  ask_for_deletion = (
816
860
  "delete them prior to deleting the instance"
817
861
  if raise_error
818
862
  else "consider deleting them"
819
863
  )
820
864
  message = (
821
- f"Storage '{directory_string}' contains {n_objects - n_offset_objects} objects"
865
+ f"Storage '{directory_string}' contains {n_files - n_offset_objects} objects"
822
866
  f" - {ask_for_deletion}"
823
867
  )
824
868
  if n_diff > 0:
825
869
  if raise_error:
826
- raise InstanceNotEmpty(message)
870
+ raise InstanceNotEmpty(message) from None
827
871
  else:
828
872
  logger.warning(message)
829
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.3
3
+ Version: 1.0.0
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=dZS2wAvosUu5ohrewEzLf0RhpnMQOr6PMw7hPBPxeng,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=DJ4lZp4N9Dcri8H7PEOl-YDoi4qqfQnXvwBuL4venAw,3425
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=jmapRWceXFCALTIfVz6IYKP0afJY2F04sOOy4whaDrM,8997
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=jSbckc_R39BhnANGhO5YFzKA8BHNANJDDgS5rwkDWmU,3828
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.0.0.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
45
+ lamindb_setup-1.0.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
46
+ lamindb_setup-1.0.0.dist-info/METADATA,sha256=d-m3YDWkYyQlU4qym2osn4UZZAH_lHVBr9t_Tb5xf4g,1689
47
+ lamindb_setup-1.0.0.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=xPpghv8_6NLAzTOyEbqSg4UsrBIVXl-wFpemsz9p40o,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=eUxRz9iJj6RA5-MWgQqqZYAU-di5LQDamRZn6t-VOiM,19838
27
- lamindb_setup/core/_hub_crud.py,sha256=eZErpq9t1Cp2ULBSi457ekrcqfesw4Y6IJgaqyrINMY,5276
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=RostEkf87oC8E4D8LMxb5NcnFKu9I8YFDMehLbwlwhE,7988
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=CYwGZm0fKYN7eLLsU-sOtOKG7HzswQVjTWb0ooHKcNg,11990
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=a0yxP9dmujTn_hkDC0E2UuVsX-Img4i0kVNB-OV5K1s,29038
44
- lamindb_setup-0.81.3.dist-info/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
45
- lamindb_setup-0.81.3.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
46
- lamindb_setup-0.81.3.dist-info/METADATA,sha256=VPKC024x5sheF1oT-iZRMb4k77WARFy2Y2PwA4Z_S9E,1730
47
- lamindb_setup-0.81.3.dist-info/RECORD,,