rclone-api 1.4.4__tar.gz → 1.4.5__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.4.4 → rclone_api-1.4.5}/PKG-INFO +1 -1
- {rclone_api-1.4.4 → rclone_api-1.4.5}/pyproject.toml +1 -1
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/detail/copy_file_parts.py +8 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/http_server.py +41 -27
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.aiderignore +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.gitignore +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.pylintrc +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.vscode/launch.json +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.vscode/settings.json +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/.vscode/tasks.json +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/LICENSE +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/MANIFEST.in +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/README.md +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/clean +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/install +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/lint +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/requirements.testing.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/setup.cfg +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/setup.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/cmd/analyze.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/cmd/copy_large_s3.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/cmd/save_to_db.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/config.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/db/__init__.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/db/db.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/db/models.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/detail/walk.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/experimental/flags.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/experimental/flags_base.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/file.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/file_item.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/file_part.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/file_stream.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/log.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/mount.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/process.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/rclone_impl.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/api.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/chunk_task.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/create.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/multipart/file_info.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/multipart/finished_piece.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/multipart/upload_info.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/multipart/upload_state.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/s3_multipart_uploader.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/s3/upload_file_multipart.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/types.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api/util.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api.egg-info/SOURCES.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/test +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_copy.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_copy_bytes.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_copy_file_resumable_s3.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_copy_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_db.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_diff.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_file_item.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_group_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_is_synced.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_ls.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_ls_stream_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_mount.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_obscure.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_read_write_text.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_remote_control.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_remotes.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_s3.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_serve_http.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_size_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_size_suffix.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tests/test_walk.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/tox.ini +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.5}/upload_package.sh +0 -0
@@ -9,6 +9,7 @@ from dataclasses import dataclass
|
|
9
9
|
from datetime import datetime
|
10
10
|
from pathlib import Path
|
11
11
|
|
12
|
+
from rclone_api import rclone_verbose
|
12
13
|
from rclone_api.dir_listing import DirListing
|
13
14
|
from rclone_api.http_server import HttpServer
|
14
15
|
from rclone_api.rclone_impl import RcloneImpl
|
@@ -18,6 +19,8 @@ from rclone_api.types import (
|
|
18
19
|
SizeSuffix,
|
19
20
|
)
|
20
21
|
|
22
|
+
rclone_verbose(True)
|
23
|
+
|
21
24
|
|
22
25
|
@dataclass
|
23
26
|
class UploadPart:
|
@@ -46,6 +49,11 @@ def upload_task(self: RcloneImpl, upload_part: UploadPart) -> UploadPart:
|
|
46
49
|
try:
|
47
50
|
if upload_part.exception is not None:
|
48
51
|
return upload_part
|
52
|
+
# print(f"Uploading {upload_part.chunk} to {upload_part.dst_part}")
|
53
|
+
msg = "\n#########################################\n"
|
54
|
+
msg += f"# Uploading {upload_part.chunk} to {upload_part.dst_part}\n"
|
55
|
+
msg += "#########################################\n"
|
56
|
+
print
|
49
57
|
self.copy_to(upload_part.chunk.as_posix(), upload_part.dst_part)
|
50
58
|
return upload_part
|
51
59
|
except Exception as e:
|
@@ -3,6 +3,7 @@ Unit test file for testing rclone mount functionality.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
import tempfile
|
6
|
+
import time
|
6
7
|
import warnings
|
7
8
|
from concurrent.futures import Future, ThreadPoolExecutor
|
8
9
|
from pathlib import Path
|
@@ -63,33 +64,46 @@ class HttpServer:
|
|
63
64
|
self, path: str, dst: Path, range: Range | None = None
|
64
65
|
) -> Path | Exception:
|
65
66
|
"""Get bytes from the server."""
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
67
|
+
|
68
|
+
def task() -> Path | Exception:
|
69
|
+
|
70
|
+
if not dst.parent.exists():
|
71
|
+
dst.parent.mkdir(parents=True, exist_ok=True)
|
72
|
+
headers: dict[str, str] = {}
|
73
|
+
if range:
|
74
|
+
headers.update(range.to_header())
|
75
|
+
url = self._get_file_url(path)
|
76
|
+
try:
|
77
|
+
with httpx.stream(
|
78
|
+
"GET", url, headers=headers, timeout=_TIMEOUT
|
79
|
+
) as response:
|
80
|
+
response.raise_for_status()
|
81
|
+
with open(dst, "wb") as file:
|
82
|
+
for chunk in response.iter_bytes(chunk_size=8192):
|
83
|
+
if chunk:
|
84
|
+
file.write(chunk)
|
85
|
+
else:
|
86
|
+
assert response.is_closed
|
87
|
+
# print(f"Downloaded bytes {start}-{end} to {dst}")
|
88
|
+
if range:
|
89
|
+
print(f"Downloaded bytes {range.start}-{range.end} to {dst}")
|
90
|
+
else:
|
91
|
+
size = dst.stat().st_size
|
92
|
+
print(f"Downloaded {size} bytes to {dst}")
|
93
|
+
return dst
|
94
|
+
except Exception as e:
|
95
|
+
warnings.warn(f"Failed to download {url} to {dst}: {e}")
|
96
|
+
return e
|
97
|
+
|
98
|
+
retries = 3
|
99
|
+
for i in _range(retries):
|
100
|
+
out = task()
|
101
|
+
if not isinstance(out, Exception):
|
102
|
+
return out
|
103
|
+
warnings.warn(f"Failed to download {path} to {dst}: {out}, retrying ({i})")
|
104
|
+
time.sleep(10)
|
105
|
+
else:
|
106
|
+
return Exception(f"Failed to download {path} to {dst}")
|
93
107
|
|
94
108
|
def download_multi_threaded(
|
95
109
|
self,
|
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
|
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
|