rclone-api 1.1.2__tar.gz → 1.1.3__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.
Files changed (81) hide show
  1. {rclone_api-1.1.2 → rclone_api-1.1.3}/PKG-INFO +1 -1
  2. {rclone_api-1.1.2 → rclone_api-1.1.3}/pyproject.toml +1 -1
  3. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/chunk_uploader.py +27 -1
  4. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/PKG-INFO +1 -1
  5. {rclone_api-1.1.2 → rclone_api-1.1.3}/.aiderignore +0 -0
  6. {rclone_api-1.1.2 → rclone_api-1.1.3}/.github/workflows/lint.yml +0 -0
  7. {rclone_api-1.1.2 → rclone_api-1.1.3}/.github/workflows/push_macos.yml +0 -0
  8. {rclone_api-1.1.2 → rclone_api-1.1.3}/.github/workflows/push_ubuntu.yml +0 -0
  9. {rclone_api-1.1.2 → rclone_api-1.1.3}/.github/workflows/push_win.yml +0 -0
  10. {rclone_api-1.1.2 → rclone_api-1.1.3}/.gitignore +0 -0
  11. {rclone_api-1.1.2 → rclone_api-1.1.3}/.pylintrc +0 -0
  12. {rclone_api-1.1.2 → rclone_api-1.1.3}/.vscode/launch.json +0 -0
  13. {rclone_api-1.1.2 → rclone_api-1.1.3}/.vscode/settings.json +0 -0
  14. {rclone_api-1.1.2 → rclone_api-1.1.3}/.vscode/tasks.json +0 -0
  15. {rclone_api-1.1.2 → rclone_api-1.1.3}/LICENSE +0 -0
  16. {rclone_api-1.1.2 → rclone_api-1.1.3}/MANIFEST.in +0 -0
  17. {rclone_api-1.1.2 → rclone_api-1.1.3}/README.md +0 -0
  18. {rclone_api-1.1.2 → rclone_api-1.1.3}/clean +0 -0
  19. {rclone_api-1.1.2 → rclone_api-1.1.3}/install +0 -0
  20. {rclone_api-1.1.2 → rclone_api-1.1.3}/lint +0 -0
  21. {rclone_api-1.1.2 → rclone_api-1.1.3}/requirements.testing.txt +0 -0
  22. {rclone_api-1.1.2 → rclone_api-1.1.3}/setup.cfg +0 -0
  23. {rclone_api-1.1.2 → rclone_api-1.1.3}/setup.py +0 -0
  24. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/__init__.py +0 -0
  25. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/assets/example.txt +0 -0
  26. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/cli.py +0 -0
  27. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/cmd/copy_large_s3.py +0 -0
  28. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/cmd/list_files.py +0 -0
  29. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/completed_process.py +0 -0
  30. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/config.py +0 -0
  31. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/convert.py +0 -0
  32. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/deprecated.py +0 -0
  33. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/diff.py +0 -0
  34. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/dir.py +0 -0
  35. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/dir_listing.py +0 -0
  36. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/exec.py +0 -0
  37. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/experimental/flags.py +0 -0
  38. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/experimental/flags_base.py +0 -0
  39. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/file.py +0 -0
  40. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/filelist.py +0 -0
  41. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/group_files.py +0 -0
  42. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/process.py +0 -0
  43. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/rclone.py +0 -0
  44. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/remote.py +0 -0
  45. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/rpath.py +0 -0
  46. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/api.py +0 -0
  47. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/basic_ops.py +0 -0
  48. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/create.py +0 -0
  49. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/s3/types.py +0 -0
  50. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/scan_missing_folders.py +0 -0
  51. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/types.py +0 -0
  52. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/util.py +0 -0
  53. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api/walk.py +0 -0
  54. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/SOURCES.txt +0 -0
  55. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/dependency_links.txt +0 -0
  56. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/entry_points.txt +0 -0
  57. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/requires.txt +0 -0
  58. {rclone_api-1.1.2 → rclone_api-1.1.3}/src/rclone_api.egg-info/top_level.txt +0 -0
  59. {rclone_api-1.1.2 → rclone_api-1.1.3}/test +0 -0
  60. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/archive/test_paramiko.py.disabled +0 -0
  61. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_cmd_list_files.py +0 -0
  62. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_copy.py +0 -0
  63. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_copy_files.py +0 -0
  64. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_diff.py +0 -0
  65. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_group_files.py +0 -0
  66. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_is_synced.py +0 -0
  67. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_ls.py +0 -0
  68. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_mount.py +0 -0
  69. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_mount_s3.py +0 -0
  70. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_mount_webdav.py +0 -0
  71. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_mounted_ranged_download.py +0 -0
  72. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_obscure.py +0 -0
  73. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_rclone_config.py +0 -0
  74. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_remote_control.py +0 -0
  75. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_remotes.py +0 -0
  76. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_s3.py +0 -0
  77. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_scan_missing_folders.py +0 -0
  78. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_size_files.py +0 -0
  79. {rclone_api-1.1.2 → rclone_api-1.1.3}/tests/test_walk.py +0 -0
  80. {rclone_api-1.1.2 → rclone_api-1.1.3}/tox.ini +0 -0
  81. {rclone_api-1.1.2 → rclone_api-1.1.3}/upload_package.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.1.2
3
+ Version: 1.1.3
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  License: BSD 3-Clause License
@@ -21,7 +21,7 @@ dependencies = [
21
21
  ]
22
22
 
23
23
  # Change this with the version number bump.
24
- version = "1.1.2"
24
+ version = "1.1.3"
25
25
 
26
26
  [tool.setuptools]
27
27
  package-dir = {"" = "src"}
@@ -127,6 +127,13 @@ class UploadState:
127
127
  lock: Lock = Lock()
128
128
  parts: list[FinishedPiece | None] = field(default_factory=list)
129
129
 
130
+ def update_source_file(self, src_file: Path) -> None:
131
+ new_file_size = os.path.getsize(src_file)
132
+ if new_file_size != self.upload_info.file_size:
133
+ raise ValueError("File size changed, cannot resume")
134
+ self.upload_info.src_file_path = src_file
135
+ self.save()
136
+
130
137
  def is_done(self) -> bool:
131
138
  return self.remaining() == 0
132
139
 
@@ -268,6 +275,7 @@ def _get_file_size(file_path: Path, timeout: int = 60) -> int:
268
275
  while True:
269
276
  expired = time.time() - start > timeout
270
277
  try:
278
+ time.sleep(sleep_time)
271
279
  if not_windows:
272
280
  # Force a refresh of the directory cache
273
281
  os.system(f"ls -l {file_path.parent}")
@@ -279,7 +287,6 @@ def _get_file_size(file_path: Path, timeout: int = 60) -> int:
279
287
  raise
280
288
  if expired:
281
289
  raise TimeoutError(f"File {file_path} not found after {timeout} seconds")
282
- time.sleep(sleep_time)
283
290
 
284
291
 
285
292
  def file_chunker(
@@ -433,6 +440,18 @@ def prepare_upload_file_multipart(
433
440
  return upload_info
434
441
 
435
442
 
443
+ def _abort_previous_upload(upload_state: UploadState) -> None:
444
+ if upload_state.upload_info.upload_id:
445
+ try:
446
+ upload_state.upload_info.s3_client.abort_multipart_upload(
447
+ Bucket=upload_state.upload_info.bucket_name,
448
+ Key=upload_state.upload_info.object_name,
449
+ UploadId=upload_state.upload_info.upload_id,
450
+ )
451
+ except Exception as e:
452
+ locked_print(f"Error aborting previous upload: {e}")
453
+
454
+
436
455
  def upload_file_multipart(
437
456
  s3_client: BaseClient,
438
457
  bucket_name: str,
@@ -488,6 +507,13 @@ def upload_file_multipart(
488
507
 
489
508
  filechunks: Queue[FileChunk | None] = Queue(10)
490
509
  upload_state = get_upload_state() or make_new_state()
510
+ try:
511
+ upload_state.update_source_file(file_path)
512
+ except ValueError as e:
513
+ locked_print(f"Cannot resume upload: {e}, size changed, starting over")
514
+ _abort_previous_upload(upload_state)
515
+ upload_state = make_new_state()
516
+ upload_state.save()
491
517
  if upload_state.is_done():
492
518
  return MultiUploadResult.ALREADY_DONE
493
519
  finished = upload_state.finished()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.1.2
3
+ Version: 1.1.3
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  License: BSD 3-Clause License
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes