rclone-api 1.4.4__tar.gz → 1.4.6__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 (105) hide show
  1. {rclone_api-1.4.4 → rclone_api-1.4.6}/PKG-INFO +1 -1
  2. {rclone_api-1.4.4 → rclone_api-1.4.6}/pyproject.toml +1 -1
  3. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/detail/copy_file_parts.py +15 -2
  4. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/http_server.py +41 -27
  5. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/PKG-INFO +1 -1
  6. {rclone_api-1.4.4 → rclone_api-1.4.6}/.aiderignore +0 -0
  7. {rclone_api-1.4.4 → rclone_api-1.4.6}/.github/workflows/lint.yml +0 -0
  8. {rclone_api-1.4.4 → rclone_api-1.4.6}/.github/workflows/push_macos.yml +0 -0
  9. {rclone_api-1.4.4 → rclone_api-1.4.6}/.github/workflows/push_ubuntu.yml +0 -0
  10. {rclone_api-1.4.4 → rclone_api-1.4.6}/.github/workflows/push_win.yml +0 -0
  11. {rclone_api-1.4.4 → rclone_api-1.4.6}/.gitignore +0 -0
  12. {rclone_api-1.4.4 → rclone_api-1.4.6}/.pylintrc +0 -0
  13. {rclone_api-1.4.4 → rclone_api-1.4.6}/.vscode/launch.json +0 -0
  14. {rclone_api-1.4.4 → rclone_api-1.4.6}/.vscode/settings.json +0 -0
  15. {rclone_api-1.4.4 → rclone_api-1.4.6}/.vscode/tasks.json +0 -0
  16. {rclone_api-1.4.4 → rclone_api-1.4.6}/LICENSE +0 -0
  17. {rclone_api-1.4.4 → rclone_api-1.4.6}/MANIFEST.in +0 -0
  18. {rclone_api-1.4.4 → rclone_api-1.4.6}/README.md +0 -0
  19. {rclone_api-1.4.4 → rclone_api-1.4.6}/clean +0 -0
  20. {rclone_api-1.4.4 → rclone_api-1.4.6}/install +0 -0
  21. {rclone_api-1.4.4 → rclone_api-1.4.6}/lint +0 -0
  22. {rclone_api-1.4.4 → rclone_api-1.4.6}/requirements.testing.txt +0 -0
  23. {rclone_api-1.4.4 → rclone_api-1.4.6}/setup.cfg +0 -0
  24. {rclone_api-1.4.4 → rclone_api-1.4.6}/setup.py +0 -0
  25. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/__init__.py +0 -0
  26. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/assets/example.txt +0 -0
  27. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cli.py +0 -0
  28. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cmd/analyze.py +0 -0
  29. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cmd/copy_large_s3.py +0 -0
  30. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cmd/list_files.py +0 -0
  31. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cmd/save_to_db.py +0 -0
  32. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/completed_process.py +0 -0
  33. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/config.py +0 -0
  34. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/convert.py +0 -0
  35. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/db/__init__.py +0 -0
  36. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/db/db.py +0 -0
  37. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/db/models.py +0 -0
  38. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/deprecated.py +0 -0
  39. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/detail/walk.py +0 -0
  40. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/diff.py +0 -0
  41. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/dir.py +0 -0
  42. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/dir_listing.py +0 -0
  43. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/exec.py +0 -0
  44. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/experimental/flags.py +0 -0
  45. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/experimental/flags_base.py +0 -0
  46. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/file.py +0 -0
  47. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/file_item.py +0 -0
  48. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/file_part.py +0 -0
  49. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/file_stream.py +0 -0
  50. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/filelist.py +0 -0
  51. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/group_files.py +0 -0
  52. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/log.py +0 -0
  53. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/mount.py +0 -0
  54. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/process.py +0 -0
  55. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/rclone_impl.py +0 -0
  56. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/remote.py +0 -0
  57. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/rpath.py +0 -0
  58. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/api.py +0 -0
  59. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/basic_ops.py +0 -0
  60. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/chunk_task.py +0 -0
  61. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/create.py +0 -0
  62. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/multipart/file_info.py +0 -0
  63. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/multipart/finished_piece.py +0 -0
  64. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/multipart/upload_info.py +0 -0
  65. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/multipart/upload_state.py +0 -0
  66. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/s3_multipart_uploader.py +0 -0
  67. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/types.py +0 -0
  68. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/upload_file_multipart.py +0 -0
  69. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/scan_missing_folders.py +0 -0
  70. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/types.py +0 -0
  71. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/util.py +0 -0
  72. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/SOURCES.txt +0 -0
  73. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/dependency_links.txt +0 -0
  74. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/entry_points.txt +0 -0
  75. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/requires.txt +0 -0
  76. {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/top_level.txt +0 -0
  77. {rclone_api-1.4.4 → rclone_api-1.4.6}/test +0 -0
  78. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/archive/test_paramiko.py.disabled +0 -0
  79. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_cmd_list_files.py +0 -0
  80. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_copy.py +0 -0
  81. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_copy_bytes.py +0 -0
  82. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_copy_file_resumable_s3.py +0 -0
  83. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_copy_files.py +0 -0
  84. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_db.py +0 -0
  85. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_diff.py +0 -0
  86. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_file_item.py +0 -0
  87. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_group_files.py +0 -0
  88. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_is_synced.py +0 -0
  89. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_ls.py +0 -0
  90. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_ls_stream_files.py +0 -0
  91. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_mount.py +0 -0
  92. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_mount_s3.py +0 -0
  93. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_obscure.py +0 -0
  94. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_rclone_config.py +0 -0
  95. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_read_write_text.py +0 -0
  96. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_remote_control.py +0 -0
  97. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_remotes.py +0 -0
  98. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_s3.py +0 -0
  99. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_scan_missing_folders.py +0 -0
  100. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_serve_http.py +0 -0
  101. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_size_files.py +0 -0
  102. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_size_suffix.py +0 -0
  103. {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_walk.py +0 -0
  104. {rclone_api-1.4.4 → rclone_api-1.4.6}/tox.ini +0 -0
  105. {rclone_api-1.4.4 → rclone_api-1.4.6}/upload_package.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.4.4
3
+ Version: 1.4.6
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  License: BSD 3-Clause License
@@ -25,7 +25,7 @@ dependencies = [
25
25
  ]
26
26
 
27
27
  # Change this with the version number bump.
28
- version = "1.4.4"
28
+ version = "1.4.6"
29
29
 
30
30
  [tool.setuptools]
31
31
  package-dir = {"" = "src"}
@@ -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:
@@ -285,6 +293,10 @@ def copy_file_parts(
285
293
  all_numbers_already_done: set[int] = set(
286
294
  info_json.fetch_all_finished_part_numbers()
287
295
  )
296
+
297
+ first_part_number = part_infos[0].part_number
298
+ last_part_number = part_infos[-1].part_number
299
+
288
300
  print(f"all_numbers_already_done: {sorted(list(all_numbers_already_done))}")
289
301
 
290
302
  filtered_part_infos: list[PartInfo] = []
@@ -301,8 +313,9 @@ def copy_file_parts(
301
313
  chunk_size = SizeSuffix(part_infos[0].range.end - part_infos[0].range.start)
302
314
 
303
315
  info_json.chunksize = chunk_size
304
- info_json.first_part = part_infos[0].part_number
305
- info_json.last_part = part_infos[-1].part_number
316
+
317
+ info_json.first_part = first_part_number
318
+ info_json.last_part = last_part_number
306
319
  info_json.save()
307
320
 
308
321
  # We are now validated
@@ -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
- if not dst.parent.exists():
67
- dst.parent.mkdir(parents=True, exist_ok=True)
68
- headers: dict[str, str] = {}
69
- if range:
70
- headers.update(range.to_header())
71
- url = self._get_file_url(path)
72
- try:
73
- with httpx.stream(
74
- "GET", url, headers=headers, timeout=_TIMEOUT
75
- ) as response:
76
- response.raise_for_status()
77
- with open(dst, "wb") as file:
78
- for chunk in response.iter_bytes(chunk_size=8192):
79
- if chunk:
80
- file.write(chunk)
81
- else:
82
- assert response.is_closed
83
- # print(f"Downloaded bytes {start}-{end} to {dst}")
84
- if range:
85
- print(f"Downloaded bytes {range.start}-{range.end} to {dst}")
86
- else:
87
- size = dst.stat().st_size
88
- print(f"Downloaded {size} bytes to {dst}")
89
- return dst
90
- except Exception as e:
91
- warnings.warn(f"Failed to download {url} to {dst}: {e}")
92
- return e
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,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.4.4
3
+ Version: 1.4.6
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
File without changes