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.
- lamindb_setup/__init__.py +31 -2
- lamindb_setup/_check_setup.py +32 -16
- lamindb_setup/_close.py +1 -1
- lamindb_setup/_connect_instance.py +36 -34
- lamindb_setup/_delete.py +2 -2
- lamindb_setup/_django.py +6 -6
- lamindb_setup/_exportdb.py +4 -4
- lamindb_setup/_importdb.py +2 -2
- lamindb_setup/_init_instance.py +34 -53
- lamindb_setup/_migrate.py +6 -1
- lamindb_setup/_schema_metadata.py +15 -11
- lamindb_setup/core/_aws_credentials.py +10 -2
- lamindb_setup/core/_deprecated.py +12 -5
- lamindb_setup/core/_hub_core.py +6 -3
- lamindb_setup/core/_hub_crud.py +32 -30
- lamindb_setup/core/_hub_utils.py +0 -9
- lamindb_setup/core/_settings.py +10 -5
- lamindb_setup/core/_settings_instance.py +32 -9
- lamindb_setup/core/_settings_load.py +1 -1
- lamindb_setup/core/_settings_storage.py +16 -15
- lamindb_setup/core/_settings_user.py +1 -1
- lamindb_setup/core/_setup_bionty_sources.py +3 -3
- lamindb_setup/core/django.py +6 -7
- lamindb_setup/core/hashing.py +16 -5
- lamindb_setup/core/upath.py +108 -64
- {lamindb_setup-0.81.3.dist-info → lamindb_setup-1.0.0.dist-info}/METADATA +4 -5
- lamindb_setup-1.0.0.dist-info/RECORD +47 -0
- {lamindb_setup-0.81.3.dist-info → lamindb_setup-1.0.0.dist-info}/WHEEL +1 -1
- lamindb_setup-0.81.3.dist-info/RECORD +0 -47
- {lamindb_setup-0.81.3.dist-info → lamindb_setup-1.0.0.dist-info}/LICENSE +0 -0
lamindb_setup/core/upath.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
194
|
-
|
|
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
|
-
|
|
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
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
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
|
-
|
|
455
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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" {
|
|
586
|
+
f" {n_files} files{suffix_message}\n{path.resolve()}{folder_tree}"
|
|
566
587
|
)
|
|
567
|
-
return message,
|
|
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:
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
if
|
|
725
|
-
|
|
726
|
-
|
|
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
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
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
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
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
|
-
|
|
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,
|
|
826
|
+
return size, hash, hash_type, n_files
|
|
784
827
|
|
|
785
828
|
|
|
786
|
-
class InstanceNotEmpty(
|
|
787
|
-
|
|
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/
|
|
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
|
-
|
|
814
|
-
n_diff =
|
|
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 {
|
|
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
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: lamindb_setup
|
|
3
|
-
Version: 0.
|
|
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
|
|
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.
|
|
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,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,,
|
|
File without changes
|