rclone-api 1.0.94__tar.gz → 1.0.98__tar.gz
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.
- {rclone_api-1.0.94 → rclone_api-1.0.98}/PKG-INFO +1 -1
- {rclone_api-1.0.94 → rclone_api-1.0.98}/pyproject.toml +1 -1
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/cmd/copy_large_s3.py +4 -0
- rclone_api-1.0.98/src/rclone_api/experimental/flags.py +93 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/rclone.py +42 -12
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/s3/api.py +4 -2
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/s3/create.py +17 -8
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api.egg-info/SOURCES.txt +1 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.aiderignore +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.gitignore +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.pylintrc +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.vscode/launch.json +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.vscode/settings.json +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/.vscode/tasks.json +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/LICENSE +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/MANIFEST.in +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/README.md +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/clean +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/install +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/lint +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/requirements.testing.txt +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/setup.cfg +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/setup.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/config.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/file.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/process.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/s3/chunk_uploader.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/types.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/util.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api/walk.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/test +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_copy.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_copy_files.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_diff.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_group_files.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_is_synced.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_ls.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_mount.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_mount_webdav.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_mounted_ranged_download.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_obscure.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_remote_control.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_remotes.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_s3.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_size_files.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tests/test_walk.py +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/tox.ini +0 -0
- {rclone_api-1.0.94 → rclone_api-1.0.98}/upload_package.sh +0 -0
|
@@ -16,6 +16,7 @@ class Args:
|
|
|
16
16
|
read_concurrent_chunks: int
|
|
17
17
|
retries: int
|
|
18
18
|
save_state_json: Path
|
|
19
|
+
verbose: bool
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
def list_files(rclone: Rclone, path: str):
|
|
@@ -29,6 +30,7 @@ def _parse_args() -> Args:
|
|
|
29
30
|
parser = argparse.ArgumentParser(description="List files in a remote path.")
|
|
30
31
|
parser.add_argument("src", help="File to copy")
|
|
31
32
|
parser.add_argument("dst", help="Destination file")
|
|
33
|
+
parser.add_argument("-v", "--verbose", help="Verbose output", action="store_true")
|
|
32
34
|
parser.add_argument(
|
|
33
35
|
"--config", help="Path to rclone config file", type=Path, required=True
|
|
34
36
|
)
|
|
@@ -58,6 +60,7 @@ def _parse_args() -> Args:
|
|
|
58
60
|
read_concurrent_chunks=args.read_concurrent_chunks,
|
|
59
61
|
retries=args.retries,
|
|
60
62
|
save_state_json=args.resumable_json,
|
|
63
|
+
verbose=args.verbose,
|
|
61
64
|
)
|
|
62
65
|
return out
|
|
63
66
|
|
|
@@ -73,6 +76,7 @@ def main() -> int:
|
|
|
73
76
|
concurrent_chunks=args.read_concurrent_chunks,
|
|
74
77
|
retries=args.retries,
|
|
75
78
|
save_state_json=args.save_state_json,
|
|
79
|
+
verbose=args.verbose,
|
|
76
80
|
)
|
|
77
81
|
print(rslt)
|
|
78
82
|
return 0
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
@dataclass
|
|
5
|
+
class CopyFlags:
|
|
6
|
+
check_first: bool = False
|
|
7
|
+
checksum: bool = False
|
|
8
|
+
ignore_existing: bool = False
|
|
9
|
+
ignore_times: bool = False
|
|
10
|
+
immutable: bool = False
|
|
11
|
+
inplace: bool = False
|
|
12
|
+
links: bool = False
|
|
13
|
+
metadata: bool = False
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class SyncFlags:
|
|
18
|
+
backup_dir: str | None = None
|
|
19
|
+
delete_after: bool = False
|
|
20
|
+
delete_before: bool = False
|
|
21
|
+
delete_during: bool = False
|
|
22
|
+
ignore_errors: bool = False
|
|
23
|
+
track_renames: bool = False
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class ImportantFlags:
|
|
28
|
+
dry_run: bool = False
|
|
29
|
+
interactive: bool = False
|
|
30
|
+
verbose: int = 0 # 0 = default, 1 = -v, 2 = -vv, etc.
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class NetworkingFlags:
|
|
35
|
+
bwlimit: str | None = None
|
|
36
|
+
timeout: str | None = "5m0s"
|
|
37
|
+
tpslimit: float | None = None
|
|
38
|
+
user_agent: str | None = "rclone/v1.69.1"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass
|
|
42
|
+
class PerformanceFlags:
|
|
43
|
+
buffer_size: str | None = "16MiB"
|
|
44
|
+
checkers: int = 8
|
|
45
|
+
transfers: int = 4
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass
|
|
49
|
+
class ConfigFlags:
|
|
50
|
+
config: str | None = None
|
|
51
|
+
ask_password: bool = True
|
|
52
|
+
auto_confirm: bool = False
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass
|
|
56
|
+
class DebuggingFlags:
|
|
57
|
+
cpuprofile: str | None = None
|
|
58
|
+
memprofile: str | None = None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@dataclass
|
|
62
|
+
class FilterFlags:
|
|
63
|
+
exclude: list[str] = field(default_factory=list)
|
|
64
|
+
include: list[str] = field(default_factory=list)
|
|
65
|
+
max_age: str | None = None
|
|
66
|
+
min_size: str | None = None
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass
|
|
70
|
+
class ListingFlags:
|
|
71
|
+
fast_list: bool = False
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@dataclass
|
|
75
|
+
class LoggingFlags:
|
|
76
|
+
log_file: str | None = None
|
|
77
|
+
log_level: str = "NOTICE" # Options: DEBUG, INFO, NOTICE, ERROR
|
|
78
|
+
stats: str | None = "1m0s"
|
|
79
|
+
progress: bool = False
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@dataclass
|
|
83
|
+
class Flags:
|
|
84
|
+
copy: CopyFlags | None = None
|
|
85
|
+
sync: SyncFlags | None = None
|
|
86
|
+
important: ImportantFlags | None = None
|
|
87
|
+
networking: NetworkingFlags | None = None
|
|
88
|
+
performance: PerformanceFlags | None = None
|
|
89
|
+
config: ConfigFlags | None = None
|
|
90
|
+
debugging: DebuggingFlags | None = None
|
|
91
|
+
filter: FilterFlags | None = None
|
|
92
|
+
listing: ListingFlags | None = None
|
|
93
|
+
logging: LoggingFlags | None = None
|
|
@@ -678,6 +678,7 @@ class Rclone:
|
|
|
678
678
|
* 1024, # This setting will scale the performance of the upload
|
|
679
679
|
concurrent_chunks: int = 4, # This setting will scale the performance of the upload
|
|
680
680
|
retries: int = 3,
|
|
681
|
+
verbose: bool | None = None,
|
|
681
682
|
max_chunks_before_suspension: int | None = None,
|
|
682
683
|
mount_path: Path | None = None,
|
|
683
684
|
) -> MultiUploadResult:
|
|
@@ -710,6 +711,7 @@ class Rclone:
|
|
|
710
711
|
mount_path,
|
|
711
712
|
use_links=True,
|
|
712
713
|
vfs_cache_mode="minimal",
|
|
714
|
+
verbose=verbose,
|
|
713
715
|
other_args=other_args,
|
|
714
716
|
):
|
|
715
717
|
# raise NotImplementedError("Not implemented yet")
|
|
@@ -743,7 +745,15 @@ class Rclone:
|
|
|
743
745
|
raise ValueError(f"Remote {remote} is not an S3 remote")
|
|
744
746
|
return S3Provider.S3.value
|
|
745
747
|
|
|
746
|
-
provider: str
|
|
748
|
+
provider: str
|
|
749
|
+
if provided_provider_str := get_provider_str():
|
|
750
|
+
if verbose:
|
|
751
|
+
print(f"Using provided provider: {provided_provider_str}")
|
|
752
|
+
provider = provided_provider_str
|
|
753
|
+
else:
|
|
754
|
+
if verbose:
|
|
755
|
+
print(f"Using default provider: {S3Provider.S3.value}")
|
|
756
|
+
provider = S3Provider.S3.value
|
|
747
757
|
provider_enum = S3Provider.from_str(provider)
|
|
748
758
|
|
|
749
759
|
s3_creds: S3Credentials = S3Credentials(
|
|
@@ -820,6 +830,7 @@ class Rclone:
|
|
|
820
830
|
allow_writes: bool | None = False,
|
|
821
831
|
use_links: bool | None = None,
|
|
822
832
|
vfs_cache_mode: str | None = None,
|
|
833
|
+
verbose: bool | None = None,
|
|
823
834
|
other_args: list[str] | None = None,
|
|
824
835
|
) -> Process:
|
|
825
836
|
"""Mount a remote or directory to a local path.
|
|
@@ -836,6 +847,7 @@ class Rclone:
|
|
|
836
847
|
"""
|
|
837
848
|
allow_writes = allow_writes or False
|
|
838
849
|
use_links = use_links or True
|
|
850
|
+
verbose = get_verbose(verbose)
|
|
839
851
|
vfs_cache_mode = vfs_cache_mode or "full"
|
|
840
852
|
if outdir.exists():
|
|
841
853
|
is_empty = not list(outdir.iterdir())
|
|
@@ -860,6 +872,8 @@ class Rclone:
|
|
|
860
872
|
if vfs_cache_mode:
|
|
861
873
|
cmd_list.append("--vfs-cache-mode")
|
|
862
874
|
cmd_list.append(vfs_cache_mode)
|
|
875
|
+
if verbose:
|
|
876
|
+
cmd_list.append("-vvvv")
|
|
863
877
|
if other_args:
|
|
864
878
|
cmd_list += other_args
|
|
865
879
|
proc = self._launch_process(cmd_list)
|
|
@@ -874,16 +888,19 @@ class Rclone:
|
|
|
874
888
|
allow_writes: bool | None = None,
|
|
875
889
|
use_links: bool | None = None,
|
|
876
890
|
vfs_cache_mode: str | None = None,
|
|
891
|
+
verbose: bool | None = None,
|
|
877
892
|
other_args: list[str] | None = None,
|
|
878
893
|
) -> Generator[Process, None, None]:
|
|
879
894
|
"""Like mount, but can be used in a context manager."""
|
|
880
895
|
error_happened = False
|
|
896
|
+
verbose = get_verbose(verbose)
|
|
881
897
|
proc = self.mount(
|
|
882
898
|
src,
|
|
883
899
|
outdir,
|
|
884
900
|
allow_writes=allow_writes,
|
|
885
901
|
use_links=use_links,
|
|
886
902
|
vfs_cache_mode=vfs_cache_mode,
|
|
903
|
+
verbose=verbose,
|
|
887
904
|
other_args=other_args,
|
|
888
905
|
)
|
|
889
906
|
try:
|
|
@@ -902,19 +919,32 @@ class Rclone:
|
|
|
902
919
|
if outdir.exists():
|
|
903
920
|
print(f"{outdir} mount still exists, attempting to remove")
|
|
904
921
|
if not _IS_WINDOWS:
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
922
|
+
def exec(cmd: str) -> int:
|
|
923
|
+
if verbose:
|
|
924
|
+
print(f"Executing: {cmd}")
|
|
925
|
+
rtn = os.system(cmd)
|
|
926
|
+
if rtn != 0 and verbose:
|
|
927
|
+
print(f"Failed to execute: {cmd}")
|
|
928
|
+
return rtn
|
|
929
|
+
|
|
930
|
+
exec(f"fusermount -u {outdir}")
|
|
931
|
+
exec(f"umount {outdir}")
|
|
908
932
|
time.sleep(2)
|
|
909
933
|
if outdir.exists():
|
|
910
|
-
is_empty =
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
934
|
+
is_empty = True
|
|
935
|
+
try:
|
|
936
|
+
is_empty = not list(outdir.iterdir())
|
|
937
|
+
if not is_empty:
|
|
938
|
+
warnings.warn(f"Failed to unmount {outdir}")
|
|
939
|
+
else:
|
|
940
|
+
try:
|
|
941
|
+
outdir.rmdir()
|
|
942
|
+
except Exception as e:
|
|
943
|
+
warnings.warn(f"Failed to remove {outdir}: {e}")
|
|
944
|
+
except Exception as e:
|
|
945
|
+
warnings.warn(
|
|
946
|
+
f"Failed during mount cleanup of {outdir}: because {e}"
|
|
947
|
+
)
|
|
918
948
|
|
|
919
949
|
@deprecated("mount")
|
|
920
950
|
def mount_webdav(
|
|
@@ -17,9 +17,10 @@ _MIN_THRESHOLD_FOR_CHUNKING = 5 * 1024 * 1024
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class S3Client:
|
|
20
|
-
def __init__(self, credentials: S3Credentials):
|
|
20
|
+
def __init__(self, credentials: S3Credentials, verbose: bool = False) -> None:
|
|
21
|
+
self.verbose = verbose
|
|
21
22
|
self.credentials: S3Credentials = credentials
|
|
22
|
-
self.client: BaseClient = create_s3_client(credentials)
|
|
23
|
+
self.client: BaseClient = create_s3_client(credentials, verbose=verbose)
|
|
23
24
|
|
|
24
25
|
def list_bucket_contents(self, bucket_name: str) -> None:
|
|
25
26
|
list_bucket_contents(self.client, bucket_name)
|
|
@@ -83,6 +84,7 @@ class S3Client:
|
|
|
83
84
|
provider = self.credentials.provider.value
|
|
84
85
|
region_name = self.credentials.region_name
|
|
85
86
|
info_json = {
|
|
87
|
+
"bucket": bucket_name,
|
|
86
88
|
"key": key,
|
|
87
89
|
"access_key_id": access_key_id[:4] + "...",
|
|
88
90
|
"secret": secret[:4] + "...",
|
|
@@ -6,18 +6,19 @@ from botocore.config import Config
|
|
|
6
6
|
|
|
7
7
|
from rclone_api.s3.types import S3Credentials, S3Provider
|
|
8
8
|
|
|
9
|
+
_DEFAULT_BACKBLAZE_ENDPOINT = "https://s3.us-west-002.backblazeb2.com"
|
|
10
|
+
|
|
9
11
|
|
|
10
12
|
# Create a Boto3 session and S3 client, this is back blaze specific.
|
|
11
13
|
# Add a function if you want to use a different S3 provider.
|
|
12
14
|
# If AWS support is added in a fork then please merge it back here.
|
|
13
|
-
def _create_backblaze_s3_client(creds: S3Credentials) -> BaseClient:
|
|
15
|
+
def _create_backblaze_s3_client(creds: S3Credentials, verbose: bool) -> BaseClient:
|
|
14
16
|
"""Create and return an S3 client."""
|
|
15
17
|
region_name = creds.region_name
|
|
16
18
|
access_key = creds.access_key_id
|
|
17
19
|
secret_key = creds.secret_access_key
|
|
18
20
|
endpoint_url = creds.endpoint_url
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
endpoint_url = endpoint_url or _DEFAULT_BACKBLAZE_ENDPOINT
|
|
21
22
|
session = boto3.session.Session() # type: ignore
|
|
22
23
|
return session.client(
|
|
23
24
|
service_name="s3",
|
|
@@ -26,6 +27,7 @@ def _create_backblaze_s3_client(creds: S3Credentials) -> BaseClient:
|
|
|
26
27
|
endpoint_url=endpoint_url,
|
|
27
28
|
config=Config(
|
|
28
29
|
signature_version="s3v4",
|
|
30
|
+
region_name=region_name,
|
|
29
31
|
# Note that BackBlase has a boko3 bug where it doesn't support the new
|
|
30
32
|
# checksum header, the following line was an attempt of fix it on the newest
|
|
31
33
|
# version of boto3, but it didn't work.
|
|
@@ -34,13 +36,16 @@ def _create_backblaze_s3_client(creds: S3Credentials) -> BaseClient:
|
|
|
34
36
|
)
|
|
35
37
|
|
|
36
38
|
|
|
37
|
-
def _create_unknown_s3_client(creds: S3Credentials) -> BaseClient:
|
|
39
|
+
def _create_unknown_s3_client(creds: S3Credentials, verbose: bool) -> BaseClient:
|
|
38
40
|
"""Create and return an S3 client."""
|
|
39
41
|
access_key = creds.access_key_id
|
|
40
42
|
secret_key = creds.secret_access_key
|
|
41
43
|
endpoint_url = creds.endpoint_url
|
|
42
44
|
if (endpoint_url is not None) and not (endpoint_url.startswith("http")):
|
|
43
|
-
|
|
45
|
+
if verbose:
|
|
46
|
+
warnings.warn(
|
|
47
|
+
f"Endpoint URL is schema naive: {endpoint_url}, assuming HTTPS"
|
|
48
|
+
)
|
|
44
49
|
endpoint_url = f"https://{endpoint_url}"
|
|
45
50
|
|
|
46
51
|
session = boto3.session.Session() # type: ignore
|
|
@@ -60,10 +65,14 @@ def _create_unknown_s3_client(creds: S3Credentials) -> BaseClient:
|
|
|
60
65
|
)
|
|
61
66
|
|
|
62
67
|
|
|
63
|
-
def create_s3_client(credentials: S3Credentials) -> BaseClient:
|
|
68
|
+
def create_s3_client(credentials: S3Credentials, verbose=False) -> BaseClient:
|
|
64
69
|
"""Create and return an S3 client."""
|
|
65
70
|
provider = credentials.provider
|
|
66
71
|
if provider == S3Provider.BACKBLAZE:
|
|
67
|
-
|
|
72
|
+
if verbose:
|
|
73
|
+
print("Creating BackBlaze S3 client")
|
|
74
|
+
return _create_backblaze_s3_client(creds=credentials, verbose=verbose)
|
|
68
75
|
else:
|
|
69
|
-
|
|
76
|
+
if verbose:
|
|
77
|
+
print("Creating generic/unknown S3 client")
|
|
78
|
+
return _create_unknown_s3_client(creds=credentials, verbose=verbose)
|
|
@@ -50,6 +50,7 @@ src/rclone_api.egg-info/top_level.txt
|
|
|
50
50
|
src/rclone_api/assets/example.txt
|
|
51
51
|
src/rclone_api/cmd/copy_large_s3.py
|
|
52
52
|
src/rclone_api/cmd/list_files.py
|
|
53
|
+
src/rclone_api/experimental/flags.py
|
|
53
54
|
src/rclone_api/s3/api.py
|
|
54
55
|
src/rclone_api/s3/basic_ops.py
|
|
55
56
|
src/rclone_api/s3/chunk_uploader.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|