rclone-api 1.1.24__tar.gz → 1.1.26__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.1.24 → rclone_api-1.1.26}/PKG-INFO +1 -1
- {rclone_api-1.1.24 → rclone_api-1.1.26}/pyproject.toml +1 -1
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/cmd/copy_large_s3.py +9 -12
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/types.py +20 -11
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_size_suffix.py +4 -1
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.aiderignore +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.gitignore +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.pylintrc +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.vscode/launch.json +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.vscode/settings.json +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/.vscode/tasks.json +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/LICENSE +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/MANIFEST.in +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/README.md +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/clean +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/install +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/lint +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/requirements.testing.txt +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/setup.cfg +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/setup.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/config.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/experimental/flags.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/experimental/flags_base.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/file.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/mount.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/process.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/rclone.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/s3/api.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/s3/chunk_file.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/s3/chunk_types.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/s3/chunk_uploader.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/s3/create.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/util.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api/walk.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api.egg-info/SOURCES.txt +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/test +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_copy.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_copy_file_resumable_s3.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_copy_files.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_diff.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_group_files.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_is_synced.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_ls.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_mount.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_obscure.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_remote_control.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_remotes.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_s3.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_size_files.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tests/test_walk.py +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/tox.ini +0 -0
- {rclone_api-1.1.24 → rclone_api-1.1.26}/upload_package.sh +0 -0
|
@@ -13,7 +13,7 @@ class Args:
|
|
|
13
13
|
src: str
|
|
14
14
|
dst: str
|
|
15
15
|
chunk_size: SizeSuffix
|
|
16
|
-
|
|
16
|
+
read_threads: int
|
|
17
17
|
write_threads: int
|
|
18
18
|
retries: int
|
|
19
19
|
save_state_json: Path
|
|
@@ -37,19 +37,19 @@ def _parse_args() -> Args:
|
|
|
37
37
|
)
|
|
38
38
|
parser.add_argument(
|
|
39
39
|
"--chunk-size",
|
|
40
|
-
help="Chunk size that will be read and uploaded in
|
|
40
|
+
help="Chunk size that will be read and uploaded in SizeSuffix form, too low or too high will cause issues",
|
|
41
41
|
type=str,
|
|
42
|
-
default="64MB",
|
|
42
|
+
default="64MB", # if this is too low or too high an s3 service
|
|
43
43
|
)
|
|
44
44
|
parser.add_argument(
|
|
45
|
-
"--threads",
|
|
46
|
-
help="Number of
|
|
45
|
+
"--read-threads",
|
|
46
|
+
help="Number of concurrent read threads per chunk, only one chunk will be read at a time",
|
|
47
47
|
type=int,
|
|
48
|
-
default=
|
|
48
|
+
default=32,
|
|
49
49
|
)
|
|
50
50
|
parser.add_argument(
|
|
51
51
|
"--write-threads",
|
|
52
|
-
help="Max number of chunks to upload in parallel to the destination",
|
|
52
|
+
help="Max number of chunks to upload in parallel to the destination, each chunk is uploaded in a separate thread",
|
|
53
53
|
type=int,
|
|
54
54
|
default=64,
|
|
55
55
|
)
|
|
@@ -67,7 +67,7 @@ def _parse_args() -> Args:
|
|
|
67
67
|
src=args.src,
|
|
68
68
|
dst=args.dst,
|
|
69
69
|
chunk_size=SizeSuffix(args.chunk_size),
|
|
70
|
-
|
|
70
|
+
read_threads=args.read_threads,
|
|
71
71
|
write_threads=args.write_threads,
|
|
72
72
|
retries=args.retries,
|
|
73
73
|
save_state_json=args.resume_json,
|
|
@@ -85,11 +85,8 @@ def main() -> int:
|
|
|
85
85
|
src=args.src,
|
|
86
86
|
dst=args.dst,
|
|
87
87
|
chunk_size=args.chunk_size,
|
|
88
|
-
read_threads=args.
|
|
88
|
+
read_threads=args.read_threads,
|
|
89
89
|
write_threads=args.write_threads,
|
|
90
|
-
# vfs_read_chunk_size=unit_chunk,
|
|
91
|
-
# vfs_read_chunk_size_limit=args.chunk_size,
|
|
92
|
-
# vfs_read_chunk_streams=args.threads,
|
|
93
90
|
retries=args.retries,
|
|
94
91
|
save_state_json=args.save_state_json,
|
|
95
92
|
verbose=args.verbose,
|
|
@@ -39,17 +39,26 @@ class SizeResult:
|
|
|
39
39
|
def _to_size_suffix(size: int) -> str:
|
|
40
40
|
if size < 1024:
|
|
41
41
|
return f"{size}B"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
42
|
+
elif size < 1024**2:
|
|
43
|
+
val = size / 1024
|
|
44
|
+
unit = "K"
|
|
45
|
+
elif size < 1024**3:
|
|
46
|
+
val = size / (1024**2)
|
|
47
|
+
unit = "M"
|
|
48
|
+
elif size < 1024**4:
|
|
49
|
+
val = size / (1024**3)
|
|
50
|
+
unit = "G"
|
|
51
|
+
elif size < 1024**5:
|
|
52
|
+
val = size / (1024**4)
|
|
53
|
+
unit = "T"
|
|
54
|
+
elif size < 1024**6:
|
|
55
|
+
val = size / (1024**5)
|
|
56
|
+
unit = "P"
|
|
57
|
+
else:
|
|
58
|
+
raise ValueError(f"Invalid size: {size}")
|
|
59
|
+
|
|
60
|
+
# If the float is an integer, drop the decimal, otherwise format with one decimal.
|
|
61
|
+
return f"{int(val) if val.is_integer() else f'{val:.1f}'}{unit}"
|
|
53
62
|
|
|
54
63
|
|
|
55
64
|
# Update regex to allow decimals (e.g., 16.5MB)
|
|
@@ -17,9 +17,12 @@ class RcloneSuffixSize(unittest.TestCase):
|
|
|
17
17
|
self.assertEqual(size_int, 16 * 1024 * 1024)
|
|
18
18
|
|
|
19
19
|
def test_float_suffix(self) -> None:
|
|
20
|
-
size_suffix = SizeSuffix("16.
|
|
20
|
+
size_suffix = SizeSuffix("16.5M")
|
|
21
21
|
size_int = size_suffix.as_int()
|
|
22
22
|
self.assertEqual(size_int, int(16.5 * 1024 * 1024))
|
|
23
|
+
# now assert that the string value is the same as the input
|
|
24
|
+
out_str = str(size_suffix)
|
|
25
|
+
self.assertEqual(out_str, "16.5M")
|
|
23
26
|
|
|
24
27
|
|
|
25
28
|
if __name__ == "__main__":
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|