rclone-api 1.4.3__tar.gz → 1.4.4__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.3 → rclone_api-1.4.4}/PKG-INFO +1 -1
  2. {rclone_api-1.4.3 → rclone_api-1.4.4}/pyproject.toml +1 -1
  3. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/detail/copy_file_parts.py +56 -48
  4. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api.egg-info/PKG-INFO +1 -1
  5. {rclone_api-1.4.3 → rclone_api-1.4.4}/.aiderignore +0 -0
  6. {rclone_api-1.4.3 → rclone_api-1.4.4}/.github/workflows/lint.yml +0 -0
  7. {rclone_api-1.4.3 → rclone_api-1.4.4}/.github/workflows/push_macos.yml +0 -0
  8. {rclone_api-1.4.3 → rclone_api-1.4.4}/.github/workflows/push_ubuntu.yml +0 -0
  9. {rclone_api-1.4.3 → rclone_api-1.4.4}/.github/workflows/push_win.yml +0 -0
  10. {rclone_api-1.4.3 → rclone_api-1.4.4}/.gitignore +0 -0
  11. {rclone_api-1.4.3 → rclone_api-1.4.4}/.pylintrc +0 -0
  12. {rclone_api-1.4.3 → rclone_api-1.4.4}/.vscode/launch.json +0 -0
  13. {rclone_api-1.4.3 → rclone_api-1.4.4}/.vscode/settings.json +0 -0
  14. {rclone_api-1.4.3 → rclone_api-1.4.4}/.vscode/tasks.json +0 -0
  15. {rclone_api-1.4.3 → rclone_api-1.4.4}/LICENSE +0 -0
  16. {rclone_api-1.4.3 → rclone_api-1.4.4}/MANIFEST.in +0 -0
  17. {rclone_api-1.4.3 → rclone_api-1.4.4}/README.md +0 -0
  18. {rclone_api-1.4.3 → rclone_api-1.4.4}/clean +0 -0
  19. {rclone_api-1.4.3 → rclone_api-1.4.4}/install +0 -0
  20. {rclone_api-1.4.3 → rclone_api-1.4.4}/lint +0 -0
  21. {rclone_api-1.4.3 → rclone_api-1.4.4}/requirements.testing.txt +0 -0
  22. {rclone_api-1.4.3 → rclone_api-1.4.4}/setup.cfg +0 -0
  23. {rclone_api-1.4.3 → rclone_api-1.4.4}/setup.py +0 -0
  24. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/__init__.py +0 -0
  25. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/assets/example.txt +0 -0
  26. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/cli.py +0 -0
  27. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/cmd/analyze.py +0 -0
  28. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/cmd/copy_large_s3.py +0 -0
  29. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/cmd/list_files.py +0 -0
  30. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/cmd/save_to_db.py +0 -0
  31. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/completed_process.py +0 -0
  32. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/config.py +0 -0
  33. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/convert.py +0 -0
  34. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/db/__init__.py +0 -0
  35. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/db/db.py +0 -0
  36. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/db/models.py +0 -0
  37. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/deprecated.py +0 -0
  38. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/detail/walk.py +0 -0
  39. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/diff.py +0 -0
  40. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/dir.py +0 -0
  41. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/dir_listing.py +0 -0
  42. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/exec.py +0 -0
  43. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/experimental/flags.py +0 -0
  44. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/experimental/flags_base.py +0 -0
  45. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/file.py +0 -0
  46. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/file_item.py +0 -0
  47. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/file_part.py +0 -0
  48. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/file_stream.py +0 -0
  49. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/filelist.py +0 -0
  50. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/group_files.py +0 -0
  51. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/http_server.py +0 -0
  52. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/log.py +0 -0
  53. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/mount.py +0 -0
  54. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/process.py +0 -0
  55. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/rclone_impl.py +0 -0
  56. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/remote.py +0 -0
  57. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/rpath.py +0 -0
  58. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/api.py +0 -0
  59. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/basic_ops.py +0 -0
  60. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/chunk_task.py +0 -0
  61. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/create.py +0 -0
  62. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/multipart/file_info.py +0 -0
  63. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/multipart/finished_piece.py +0 -0
  64. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/multipart/upload_info.py +0 -0
  65. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/multipart/upload_state.py +0 -0
  66. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/s3_multipart_uploader.py +0 -0
  67. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/types.py +0 -0
  68. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/s3/upload_file_multipart.py +0 -0
  69. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/scan_missing_folders.py +0 -0
  70. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/types.py +0 -0
  71. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api/util.py +0 -0
  72. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api.egg-info/SOURCES.txt +0 -0
  73. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api.egg-info/dependency_links.txt +0 -0
  74. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api.egg-info/entry_points.txt +0 -0
  75. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api.egg-info/requires.txt +0 -0
  76. {rclone_api-1.4.3 → rclone_api-1.4.4}/src/rclone_api.egg-info/top_level.txt +0 -0
  77. {rclone_api-1.4.3 → rclone_api-1.4.4}/test +0 -0
  78. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/archive/test_paramiko.py.disabled +0 -0
  79. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_cmd_list_files.py +0 -0
  80. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_copy.py +0 -0
  81. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_copy_bytes.py +0 -0
  82. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_copy_file_resumable_s3.py +0 -0
  83. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_copy_files.py +0 -0
  84. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_db.py +0 -0
  85. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_diff.py +0 -0
  86. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_file_item.py +0 -0
  87. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_group_files.py +0 -0
  88. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_is_synced.py +0 -0
  89. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_ls.py +0 -0
  90. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_ls_stream_files.py +0 -0
  91. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_mount.py +0 -0
  92. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_mount_s3.py +0 -0
  93. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_obscure.py +0 -0
  94. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_rclone_config.py +0 -0
  95. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_read_write_text.py +0 -0
  96. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_remote_control.py +0 -0
  97. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_remotes.py +0 -0
  98. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_s3.py +0 -0
  99. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_scan_missing_folders.py +0 -0
  100. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_serve_http.py +0 -0
  101. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_size_files.py +0 -0
  102. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_size_suffix.py +0 -0
  103. {rclone_api-1.4.3 → rclone_api-1.4.4}/tests/test_walk.py +0 -0
  104. {rclone_api-1.4.3 → rclone_api-1.4.4}/tox.ini +0 -0
  105. {rclone_api-1.4.3 → rclone_api-1.4.4}/upload_package.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.4.3
3
+ Version: 1.4.4
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.3"
28
+ version = "1.4.4"
29
29
 
30
30
  [tool.setuptools]
31
31
  package-dir = {"" = "src"}
@@ -8,7 +8,6 @@ from concurrent.futures import Future, ThreadPoolExecutor
8
8
  from dataclasses import dataclass
9
9
  from datetime import datetime
10
10
  from pathlib import Path
11
- from tempfile import TemporaryDirectory
12
11
 
13
12
  from rclone_api.dir_listing import DirListing
14
13
  from rclone_api.http_server import HttpServer
@@ -249,6 +248,8 @@ def copy_file_parts(
249
248
  threads: int = 1,
250
249
  ) -> Exception | None:
251
250
  """Copy parts of a file from source to destination."""
251
+ from rclone_api.util import random_str
252
+
252
253
  if dst_dir.endswith("/"):
253
254
  dst_dir = dst_dir[:-1]
254
255
  src_size = self.size_file(src)
@@ -311,65 +312,72 @@ def copy_file_parts(
311
312
  print(info_json)
312
313
 
313
314
  finished_tasks: list[UploadPart] = []
315
+ tmp_dir = str(Path("chunks") / random_str(12))
316
+ import atexit
317
+ import shutil
318
+
319
+ atexit.register(lambda: shutil.rmtree(tmp_dir, ignore_errors=True))
314
320
 
315
321
  with self.serve_http(src_dir) as http_server:
316
- with TemporaryDirectory() as tmp_dir:
317
- tmpdir: Path = Path(tmp_dir)
318
- write_semaphore = threading.Semaphore(threads)
319
- with ThreadPoolExecutor(max_workers=threads) as upload_executor:
320
- with ThreadPoolExecutor(max_workers=threads) as read_executor:
321
- for part_info in part_infos:
322
- part_number: int = part_info.part_number
323
- range: Range = part_info.range
324
- offset: SizeSuffix = SizeSuffix(range.start)
325
- length: SizeSuffix = SizeSuffix(range.end - range.start)
326
- end = offset + length
327
- suffix = _gen_name(part_number, offset, end)
328
- part_dst = f"{dst_dir}/{suffix}"
329
-
330
- def _read_task(
322
+ tmpdir: Path = Path(tmp_dir)
323
+ write_semaphore = threading.Semaphore(threads)
324
+ with ThreadPoolExecutor(max_workers=threads) as upload_executor:
325
+ with ThreadPoolExecutor(max_workers=threads) as read_executor:
326
+ for part_info in part_infos:
327
+ part_number: int = part_info.part_number
328
+ range: Range = part_info.range
329
+ offset: SizeSuffix = SizeSuffix(range.start)
330
+ length: SizeSuffix = SizeSuffix(range.end - range.start)
331
+ end = offset + length
332
+ suffix = _gen_name(part_number, offset, end)
333
+ part_dst = f"{dst_dir}/{suffix}"
334
+
335
+ def _read_task(
336
+ src_name=src_name,
337
+ http_server=http_server,
338
+ tmpdir=tmpdir,
339
+ offset=offset,
340
+ length=length,
341
+ part_dst=part_dst,
342
+ ) -> UploadPart:
343
+ return read_task(
331
344
  src_name=src_name,
332
345
  http_server=http_server,
333
346
  tmpdir=tmpdir,
334
347
  offset=offset,
335
348
  length=length,
336
349
  part_dst=part_dst,
337
- ) -> UploadPart:
338
- return read_task(
339
- src_name=src_name,
340
- http_server=http_server,
341
- tmpdir=tmpdir,
342
- offset=offset,
343
- length=length,
344
- part_dst=part_dst,
345
- )
346
-
347
- read_fut: Future[UploadPart] = read_executor.submit(_read_task)
348
-
349
- # Releases the semaphore when the write task is done
350
- def queue_upload_task(
351
- read_fut=read_fut,
352
- ) -> None:
353
- upload_part = read_fut.result()
354
- upload_fut: Future[UploadPart] = upload_executor.submit(
355
- upload_task, self, upload_part
356
- )
357
- # SEMAPHORE RELEASE!!!
358
- upload_fut.add_done_callback(
359
- lambda _: write_semaphore.release()
360
- )
361
- upload_fut.add_done_callback(
362
- lambda fut: finished_tasks.append(fut.result())
363
- )
364
-
365
- read_fut.add_done_callback(queue_upload_task)
366
- # SEMAPHORE ACQUIRE!!!
367
- # If we are back filled on the writers, then we stall.
368
- write_semaphore.acquire()
350
+ )
351
+
352
+ read_fut: Future[UploadPart] = read_executor.submit(_read_task)
353
+
354
+ # Releases the semaphore when the write task is done
355
+ def queue_upload_task(
356
+ read_fut=read_fut,
357
+ ) -> None:
358
+ upload_part = read_fut.result()
359
+ upload_fut: Future[UploadPart] = upload_executor.submit(
360
+ upload_task, self, upload_part
361
+ )
362
+ # SEMAPHORE RELEASE!!!
363
+ upload_fut.add_done_callback(
364
+ lambda _: write_semaphore.release()
365
+ )
366
+ upload_fut.add_done_callback(
367
+ lambda fut: finished_tasks.append(fut.result())
368
+ )
369
+
370
+ read_fut.add_done_callback(queue_upload_task)
371
+ # SEMAPHORE ACQUIRE!!!
372
+ # If we are back filled on the writers, then we stall.
373
+ write_semaphore.acquire()
369
374
 
370
375
  exceptions: list[Exception] = [
371
376
  t.exception for t in finished_tasks if t.exception is not None
372
377
  ]
378
+
379
+ shutil.rmtree(tmp_dir, ignore_errors=True)
380
+
373
381
  if len(exceptions) > 0:
374
382
  return Exception(f"Failed to copy parts: {exceptions}", exceptions)
375
383
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.4.3
3
+ Version: 1.4.4
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