rclone-api 1.1.12__py2.py3-none-any.whl → 1.1.14__py2.py3-none-any.whl

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/mount.py CHANGED
@@ -18,6 +18,7 @@ class Mount:
18
18
 
19
19
  mount_path: Path
20
20
  process: Process
21
+ read_only: bool
21
22
  _closed: bool = False
22
23
 
23
24
  def __post_init__(self):
rclone_api/rclone.py CHANGED
@@ -710,6 +710,7 @@ class Rclone:
710
710
  "--vfs-disk-space-total-size",
711
711
  vfs_disk_space_total_size.as_str(),
712
712
  ]
713
+ other_args += ["--read-only"]
713
714
  mount_path = mount_path or Path("tmp_mnts") / random_str(12)
714
715
  src_path = Path(src)
715
716
  name = src_path.name
@@ -876,8 +877,8 @@ class Rclone:
876
877
  if other_args:
877
878
  cmd_list += other_args
878
879
  proc = self._launch_process(cmd_list)
879
-
880
- mount: Mount = Mount(mount_path=outdir, process=proc)
880
+ mount_read_only = "--read-only" in cmd_list # hint to allow fast teardown
881
+ mount: Mount = Mount(mount_path=outdir, process=proc, read_only=mount_read_only)
881
882
  return mount
882
883
 
883
884
  @contextmanager
@@ -184,6 +184,9 @@ class UploadState:
184
184
  def is_done(self) -> bool:
185
185
  return self.remaining() == 0
186
186
 
187
+ def fingerprint(self) -> str:
188
+ return self.upload_info.fingerprint()
189
+
187
190
  def count(self) -> tuple[int, int]: # count, num_chunks
188
191
  num_chunks = self.upload_info.total_chunks()
189
192
  count = 0
@@ -218,8 +221,31 @@ class UploadState:
218
221
 
219
222
  def save(self) -> None:
220
223
  with _SAVE_STATE_LOCK:
224
+
225
+ self._check_fingerprint_no_lock()
226
+
221
227
  self._save_no_lock()
222
228
 
229
+ def _check_fingerprint_no_lock(self) -> None:
230
+ if self.peristant is None:
231
+ raise ValueError("No path to save to")
232
+ s3_client = self.upload_info.s3_client
233
+ path = self.peristant
234
+ last_upload_state: UploadState | None = None
235
+ if path.exists():
236
+ try:
237
+ last_upload_state = UploadState.from_json(s3_client, path)
238
+ except Exception as e:
239
+ locked_print(f"Error loading state: {e}")
240
+ last_upload_state = None
241
+ # now check that the fingerprint is the same
242
+ if last_upload_state is not None:
243
+ curr_fingerprint = self.fingerprint()
244
+ if curr_fingerprint != last_upload_state.fingerprint():
245
+ raise ValueError(
246
+ f"Cannot save state, fingerprint changed from {curr_fingerprint} to {self.upload_info.fingerprint()}"
247
+ )
248
+
223
249
  def _save_no_lock(self) -> None:
224
250
  assert self.peristant is not None, "No path to save to"
225
251
  self.peristant.write_text(self.to_json_str(), encoding="utf-8")
@@ -241,13 +267,15 @@ class UploadState:
241
267
  if p is not None:
242
268
  count_non_none += 1
243
269
 
244
- # self.count()
270
+ file_size_bytes = self.upload_info.file_size
245
271
  finished_count, total = self.count()
246
- total_finished: SizeSuffix = SizeSuffix(
247
- finished_count * self.upload_info.chunk_size
248
- )
272
+
273
+ total_finished_size_bytes = finished_count * self.upload_info.chunk_size
274
+ if finished_count == total:
275
+ total_finished_size_bytes = file_size_bytes
276
+ total_finished: SizeSuffix = SizeSuffix(total_finished_size_bytes)
249
277
  total_remaining: SizeSuffix = SizeSuffix(
250
- self.remaining() * self.upload_info.chunk_size
278
+ file_size_bytes - total_finished_size_bytes
251
279
  )
252
280
 
253
281
  # parts.sort(key=lambda x: x.part_number) # Some backends need this.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.1.12
3
+ Version: 1.1.14
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  License: BSD 3-Clause License
@@ -11,9 +11,9 @@ rclone_api/exec.py,sha256=1ovvaMXDEfLiT7BrYZyE85u_yFhEUwUNW3jPOzqknR8,1023
11
11
  rclone_api/file.py,sha256=EP5yT2dZ0H2p7CY5n0y5k5pHhIliV25pm8KOwBklUTk,1863
12
12
  rclone_api/filelist.py,sha256=xbiusvNgaB_b_kQOZoHMJJxn6TWGtPrWd2J042BI28o,767
13
13
  rclone_api/group_files.py,sha256=H92xPW9lQnbNw5KbtZCl00bD6iRh9yRbCuxku4j_3dg,8036
14
- rclone_api/mount.py,sha256=Xj3BMVSDEwUbtMi8ycn5mUom-fAf-F9lJOjR_BzVllw,6073
14
+ rclone_api/mount.py,sha256=g9YkKCGJbWvGF7gzSKtWa8pEgphuW0-e0SySxtOirH4,6093
15
15
  rclone_api/process.py,sha256=xYUgU17txkZfZdr4vtRfvD8YjvSfdrbjM7PYW1npAMI,4264
16
- rclone_api/rclone.py,sha256=MelTVgBhV-JQdDUMLYusEuNSOq-RyrZCcKkkkSpsRfA,39955
16
+ rclone_api/rclone.py,sha256=lCqHJ_IznQxVQTsmAyF4cym-rkc088or-EIs4NYhbO8,40102
17
17
  rclone_api/remote.py,sha256=O9WDUFQy9f6oT1HdUbTixK2eg0xtBBm8k4Xl6aa6K00,431
18
18
  rclone_api/rpath.py,sha256=8ZA_1wxWtskwcy0I8V2VbjKDmzPkiWd8Q2JQSvh-sYE,2586
19
19
  rclone_api/scan_missing_folders.py,sha256=Kulca2Q6WZodt00ATFHkmqqInuoPvBkhTcS9703y6po,4740
@@ -28,13 +28,13 @@ rclone_api/experimental/flags_base.py,sha256=ajU_czkTcAxXYU-SlmiCfHY7aCQGHvpCLqJ
28
28
  rclone_api/s3/api.py,sha256=VstlaEnBjO2JDQuCRLdTfUGvQLbfshlXXhAzimFv4Vc,3763
29
29
  rclone_api/s3/basic_ops.py,sha256=hK3366xhVEzEcjz9Gk_8lFx6MRceAk72cax6mUrr6ko,2104
30
30
  rclone_api/s3/chunk_file.py,sha256=XPoDl7DJMJIGBMRoPO2wqwqCMT7ZrIsEkDqlbMH8jzs,3506
31
- rclone_api/s3/chunk_types.py,sha256=pZUKc3L418XTwET1rLm4eRo_2swKQckSqlc4XjYmhDo,9147
31
+ rclone_api/s3/chunk_types.py,sha256=vUmaTl3hGPodriM9DW1nAsYm0kHGfNT8nPWv6ur22Jo,10370
32
32
  rclone_api/s3/chunk_uploader.py,sha256=7Qumc2emQ-SpbnTL8PBN4ElpghnFWJfozVHPhm6LrQ4,9683
33
33
  rclone_api/s3/create.py,sha256=SK3IGHZwsSkoG4Zb4NCphcVg9_f7VifDKng-tExMS2s,3088
34
34
  rclone_api/s3/types.py,sha256=yBnJ38Tjk6RlydJ-sqZ7DSfyFloy8KDYJ0mv3vlOzLE,1388
35
- rclone_api-1.1.12.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
36
- rclone_api-1.1.12.dist-info/METADATA,sha256=Gs7HUdcg-9dw534zO3eyi5hCNyMXBD0Js5P1fe94mnM,4479
37
- rclone_api-1.1.12.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
38
- rclone_api-1.1.12.dist-info/entry_points.txt,sha256=6eNqTRXKhVf8CpWNjXiOa_0Du9tHiW_HD2iQSXRsUg8,132
39
- rclone_api-1.1.12.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
40
- rclone_api-1.1.12.dist-info/RECORD,,
35
+ rclone_api-1.1.14.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
36
+ rclone_api-1.1.14.dist-info/METADATA,sha256=oc-3Ju-_0eikBf6sP_EOVwgcWTMwxaY1zRvbCVaz5q0,4479
37
+ rclone_api-1.1.14.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
38
+ rclone_api-1.1.14.dist-info/entry_points.txt,sha256=6eNqTRXKhVf8CpWNjXiOa_0Du9tHiW_HD2iQSXRsUg8,132
39
+ rclone_api-1.1.14.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
40
+ rclone_api-1.1.14.dist-info/RECORD,,