rclone-api 1.2.7__tar.gz → 1.2.8__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.2.7 → rclone_api-1.2.8}/PKG-INFO +1 -1
- {rclone_api-1.2.7 → rclone_api-1.2.8}/pyproject.toml +1 -1
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/mount.py +35 -29
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.aiderignore +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.gitignore +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.pylintrc +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.vscode/launch.json +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.vscode/settings.json +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/.vscode/tasks.json +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/LICENSE +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/MANIFEST.in +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/README.md +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/clean +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/install +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/lint +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/requirements.testing.txt +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/setup.cfg +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/setup.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/cmd/copy_large_s3.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/config.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/experimental/flags.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/experimental/flags_base.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/file.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/process.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/profile/mount_copy_bytes.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/rclone.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/s3/api.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/s3/chunk_file.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/s3/chunk_types.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/s3/create.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/s3/upload_file_multipart.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/types.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/util.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api/walk.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api.egg-info/SOURCES.txt +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/test +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_copy.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_copy_bytes.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_copy_file_resumable_s3.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_copy_files.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_diff.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_group_files.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_is_synced.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_ls.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_mount.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_obscure.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_remote_control.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_remotes.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_s3.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_size_files.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_size_suffix.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tests/test_walk.py +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/tox.ini +0 -0
- {rclone_api-1.2.7 → rclone_api-1.2.8}/upload_package.sh +0 -0
|
@@ -288,6 +288,32 @@ def _cache_dir_delete_on_exit(cache_dir: Path) -> None:
|
|
|
288
288
|
warnings.warn(f"Error removing cache directory {cache_dir}: {e}")
|
|
289
289
|
|
|
290
290
|
|
|
291
|
+
def _read_from_mount_task(
|
|
292
|
+
offset: int, size: int, path: Path, verbose: bool
|
|
293
|
+
) -> bytes | Exception:
|
|
294
|
+
if verbose or True:
|
|
295
|
+
print(f"Fetching chunk: offset={offset}, size={size}, path={path}")
|
|
296
|
+
try:
|
|
297
|
+
with path.open("rb") as f:
|
|
298
|
+
f.seek(offset)
|
|
299
|
+
sz = f.read(size)
|
|
300
|
+
assert len(sz) == size, f"Invalid read size: {len(sz)}"
|
|
301
|
+
return sz
|
|
302
|
+
except KeyboardInterrupt as e:
|
|
303
|
+
import _thread
|
|
304
|
+
|
|
305
|
+
warnings.warn(f"Error fetching file chunk: {e}")
|
|
306
|
+
|
|
307
|
+
_thread.interrupt_main()
|
|
308
|
+
return Exception(e)
|
|
309
|
+
except Exception as e:
|
|
310
|
+
stack_trace = traceback.format_exc()
|
|
311
|
+
warnings.warn(
|
|
312
|
+
f"Error fetching file chunk at offset {offset} + {size}: {e}\n{stack_trace}"
|
|
313
|
+
)
|
|
314
|
+
return e
|
|
315
|
+
|
|
316
|
+
|
|
291
317
|
class MultiMountFileChunker:
|
|
292
318
|
def __init__(
|
|
293
319
|
self,
|
|
@@ -335,36 +361,16 @@ class MultiMountFileChunker:
|
|
|
335
361
|
path = mount.mount_path / self.filename
|
|
336
362
|
|
|
337
363
|
def task(
|
|
338
|
-
offset=offset, size=size, path=path, mount=mount
|
|
364
|
+
offset=offset, size=size, path=path, mount=mount, verbose=self.verbose
|
|
339
365
|
) -> bytes | Exception:
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
assert len(sz) == size, f"Invalid read size: {len(sz)}"
|
|
349
|
-
return sz
|
|
350
|
-
except KeyboardInterrupt as e:
|
|
351
|
-
import _thread
|
|
352
|
-
|
|
353
|
-
warnings.warn(f"Error fetching file chunk: {e}")
|
|
354
|
-
|
|
355
|
-
_thread.interrupt_main()
|
|
356
|
-
return Exception(e)
|
|
357
|
-
except Exception as e:
|
|
358
|
-
stack_trace = traceback.format_exc()
|
|
359
|
-
warnings.warn(
|
|
360
|
-
f"Error fetching file chunk at offset {offset} + {size}: {e}\n{stack_trace}"
|
|
361
|
-
)
|
|
362
|
-
return e
|
|
363
|
-
finally:
|
|
364
|
-
with self.lock:
|
|
365
|
-
self.mounts_processing.remove(mount)
|
|
366
|
-
self.mounts_availabe.append(mount)
|
|
367
|
-
self.semaphore.release()
|
|
366
|
+
out = _read_from_mount_task(
|
|
367
|
+
offset=offset, size=size, path=path, verbose=verbose
|
|
368
|
+
)
|
|
369
|
+
with self.lock:
|
|
370
|
+
self.mounts_processing.remove(mount)
|
|
371
|
+
self.mounts_availabe.append(mount)
|
|
372
|
+
self.semaphore.release()
|
|
373
|
+
return out
|
|
368
374
|
|
|
369
375
|
fut = self.executor.submit(task)
|
|
370
376
|
return fut
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|