rclone-api 1.1.29__tar.gz → 1.1.30__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.29 → rclone_api-1.1.30}/PKG-INFO +1 -1
- {rclone_api-1.1.29 → rclone_api-1.1.30}/pyproject.toml +1 -1
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/rclone.py +10 -1
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api.egg-info/SOURCES.txt +1 -1
- rclone_api-1.1.29/tests/test_copy_range.py → rclone_api-1.1.30/tests/test_copy_bytes.py +22 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.aiderignore +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.gitignore +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.pylintrc +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.vscode/launch.json +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.vscode/settings.json +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/.vscode/tasks.json +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/LICENSE +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/MANIFEST.in +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/README.md +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/clean +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/install +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/lint +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/requirements.testing.txt +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/setup.cfg +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/setup.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/cmd/copy_large_s3.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/config.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/experimental/flags.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/experimental/flags_base.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/file.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/mount.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/process.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/s3/api.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/s3/chunk_file.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/s3/chunk_types.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/s3/create.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/s3/upload_file_multipart.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/types.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/util.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api/walk.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/test +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_copy.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_copy_file_resumable_s3.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_copy_files.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_diff.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_group_files.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_is_synced.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_ls.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_mount.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_obscure.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_remote_control.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_remotes.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_s3.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_size_files.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_size_suffix.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tests/test_walk.py +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/tox.ini +0 -0
- {rclone_api-1.1.29 → rclone_api-1.1.30}/upload_package.sh +0 -0
|
@@ -817,6 +817,9 @@ class Rclone:
|
|
|
817
817
|
offset: int,
|
|
818
818
|
length: int,
|
|
819
819
|
transfers: int = 16,
|
|
820
|
+
outfile: (
|
|
821
|
+
Path | None
|
|
822
|
+
) = None, # If supplied then bytes are written to this file and success returns bytes(0)
|
|
820
823
|
) -> bytes | Exception:
|
|
821
824
|
"""Copy bytes from a file to another file."""
|
|
822
825
|
from rclone_api.util import random_str
|
|
@@ -851,7 +854,13 @@ class Rclone:
|
|
|
851
854
|
with open(src_file_mnt, "rb") as f:
|
|
852
855
|
f.seek(offset)
|
|
853
856
|
data = f.read(length)
|
|
854
|
-
|
|
857
|
+
if outfile is None:
|
|
858
|
+
return data
|
|
859
|
+
with open(outfile, "wb") as out:
|
|
860
|
+
out.write(data)
|
|
861
|
+
del data
|
|
862
|
+
return bytes(0)
|
|
863
|
+
|
|
855
864
|
except Exception as e:
|
|
856
865
|
return e
|
|
857
866
|
|
|
@@ -62,9 +62,9 @@ src/rclone_api/s3/types.py
|
|
|
62
62
|
src/rclone_api/s3/upload_file_multipart.py
|
|
63
63
|
tests/test_cmd_list_files.py
|
|
64
64
|
tests/test_copy.py
|
|
65
|
+
tests/test_copy_bytes.py
|
|
65
66
|
tests/test_copy_file_resumable_s3.py
|
|
66
67
|
tests/test_copy_files.py
|
|
67
|
-
tests/test_copy_range.py
|
|
68
68
|
tests/test_diff.py
|
|
69
69
|
tests/test_group_files.py
|
|
70
70
|
tests/test_is_synced.py
|
|
@@ -3,7 +3,9 @@ Unit test file.
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
|
+
import tempfile
|
|
6
7
|
import unittest
|
|
8
|
+
from pathlib import Path
|
|
7
9
|
|
|
8
10
|
from dotenv import load_dotenv
|
|
9
11
|
|
|
@@ -70,6 +72,26 @@ class RcloneCopyBytesTester(unittest.TestCase):
|
|
|
70
72
|
len(bytes_or_err), 1024 * 1024
|
|
71
73
|
) # , f"Length: {len(bytes_or_err)}"
|
|
72
74
|
|
|
75
|
+
def test_copy_bytes_to_temp_file(self) -> None:
|
|
76
|
+
|
|
77
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
78
|
+
tmp = Path(tmpdir) / "tmp.mp4"
|
|
79
|
+
rclone = Rclone(_generate_rclone_config())
|
|
80
|
+
bytes_or_err: bytes | Exception = rclone.copy_bytes(
|
|
81
|
+
src="dst:rclone-api-unit-test/zachs_video/breaking_ai_mind.mp4",
|
|
82
|
+
offset=0,
|
|
83
|
+
length=1024 * 1024,
|
|
84
|
+
outfile=tmp,
|
|
85
|
+
)
|
|
86
|
+
if isinstance(bytes_or_err, Exception):
|
|
87
|
+
print(bytes_or_err)
|
|
88
|
+
self.fail(f"Error: {bytes_or_err}")
|
|
89
|
+
assert isinstance(bytes_or_err, bytes)
|
|
90
|
+
self.assertEqual(len(bytes_or_err), 0)
|
|
91
|
+
self.assertTrue(tmp.exists())
|
|
92
|
+
tmp_size = tmp.stat().st_size
|
|
93
|
+
self.assertEqual(tmp_size, 1024 * 1024)
|
|
94
|
+
|
|
73
95
|
|
|
74
96
|
if __name__ == "__main__":
|
|
75
97
|
unittest.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
|
|
File without changes
|