rclone-api 1.3.5__tar.gz → 1.3.7__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 (89) hide show
  1. {rclone_api-1.3.5 → rclone_api-1.3.7}/PKG-INFO +1 -1
  2. {rclone_api-1.3.5 → rclone_api-1.3.7}/pyproject.toml +1 -1
  3. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/__init__.py +2 -1
  4. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/cmd/copy_large_s3.py +1 -3
  5. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/exec.py +1 -1
  6. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/file.py +37 -0
  7. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/mount_read_chunker.py +8 -2
  8. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/process.py +6 -0
  9. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/profile/mount_copy_bytes.py +3 -1
  10. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/rclone.py +1343 -1276
  11. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/s3/upload_file_multipart.py +6 -3
  12. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/util.py +183 -162
  13. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api.egg-info/PKG-INFO +1 -1
  14. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api.egg-info/SOURCES.txt +1 -0
  15. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_copy_bytes.py +20 -2
  16. rclone_api-1.3.7/tests/test_ls_stream_files.py +87 -0
  17. {rclone_api-1.3.5 → rclone_api-1.3.7}/.aiderignore +0 -0
  18. {rclone_api-1.3.5 → rclone_api-1.3.7}/.github/workflows/lint.yml +0 -0
  19. {rclone_api-1.3.5 → rclone_api-1.3.7}/.github/workflows/push_macos.yml +0 -0
  20. {rclone_api-1.3.5 → rclone_api-1.3.7}/.github/workflows/push_ubuntu.yml +0 -0
  21. {rclone_api-1.3.5 → rclone_api-1.3.7}/.github/workflows/push_win.yml +0 -0
  22. {rclone_api-1.3.5 → rclone_api-1.3.7}/.gitignore +0 -0
  23. {rclone_api-1.3.5 → rclone_api-1.3.7}/.pylintrc +0 -0
  24. {rclone_api-1.3.5 → rclone_api-1.3.7}/.vscode/launch.json +0 -0
  25. {rclone_api-1.3.5 → rclone_api-1.3.7}/.vscode/settings.json +0 -0
  26. {rclone_api-1.3.5 → rclone_api-1.3.7}/.vscode/tasks.json +0 -0
  27. {rclone_api-1.3.5 → rclone_api-1.3.7}/LICENSE +0 -0
  28. {rclone_api-1.3.5 → rclone_api-1.3.7}/MANIFEST.in +0 -0
  29. {rclone_api-1.3.5 → rclone_api-1.3.7}/README.md +0 -0
  30. {rclone_api-1.3.5 → rclone_api-1.3.7}/clean +0 -0
  31. {rclone_api-1.3.5 → rclone_api-1.3.7}/install +0 -0
  32. {rclone_api-1.3.5 → rclone_api-1.3.7}/lint +0 -0
  33. {rclone_api-1.3.5 → rclone_api-1.3.7}/requirements.testing.txt +0 -0
  34. {rclone_api-1.3.5 → rclone_api-1.3.7}/setup.cfg +0 -0
  35. {rclone_api-1.3.5 → rclone_api-1.3.7}/setup.py +0 -0
  36. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/assets/example.txt +0 -0
  37. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/cli.py +0 -0
  38. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/cmd/list_files.py +0 -0
  39. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/completed_process.py +0 -0
  40. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/config.py +0 -0
  41. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/convert.py +0 -0
  42. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/deprecated.py +0 -0
  43. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/diff.py +0 -0
  44. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/dir.py +0 -0
  45. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/dir_listing.py +0 -0
  46. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/experimental/flags.py +0 -0
  47. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/experimental/flags_base.py +0 -0
  48. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/filelist.py +0 -0
  49. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/group_files.py +0 -0
  50. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/log.py +0 -0
  51. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/mount.py +0 -0
  52. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/remote.py +0 -0
  53. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/rpath.py +0 -0
  54. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/s3/api.py +0 -0
  55. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/s3/basic_ops.py +0 -0
  56. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/s3/chunk_task.py +0 -0
  57. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/s3/chunk_types.py +0 -0
  58. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/s3/create.py +0 -0
  59. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/s3/types.py +0 -0
  60. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/scan_missing_folders.py +0 -0
  61. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/types.py +0 -0
  62. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api/walk.py +0 -0
  63. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api.egg-info/dependency_links.txt +0 -0
  64. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api.egg-info/entry_points.txt +0 -0
  65. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api.egg-info/requires.txt +0 -0
  66. {rclone_api-1.3.5 → rclone_api-1.3.7}/src/rclone_api.egg-info/top_level.txt +0 -0
  67. {rclone_api-1.3.5 → rclone_api-1.3.7}/test +0 -0
  68. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/archive/test_paramiko.py.disabled +0 -0
  69. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_cmd_list_files.py +0 -0
  70. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_copy.py +0 -0
  71. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_copy_file_resumable_s3.py +0 -0
  72. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_copy_files.py +0 -0
  73. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_diff.py +0 -0
  74. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_group_files.py +0 -0
  75. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_is_synced.py +0 -0
  76. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_ls.py +0 -0
  77. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_mount.py +0 -0
  78. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_mount_s3.py +0 -0
  79. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_obscure.py +0 -0
  80. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_rclone_config.py +0 -0
  81. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_remote_control.py +0 -0
  82. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_remotes.py +0 -0
  83. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_s3.py +0 -0
  84. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_scan_missing_folders.py +0 -0
  85. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_size_files.py +0 -0
  86. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_size_suffix.py +0 -0
  87. {rclone_api-1.3.5 → rclone_api-1.3.7}/tests/test_walk.py +0 -0
  88. {rclone_api-1.3.5 → rclone_api-1.3.7}/tox.ini +0 -0
  89. {rclone_api-1.3.5 → rclone_api-1.3.7}/upload_package.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.3.5
3
+ Version: 1.3.7
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  License: BSD 3-Clause License
@@ -23,7 +23,7 @@ dependencies = [
23
23
  ]
24
24
 
25
25
  # Change this with the version number bump.
26
- version = "1.3.5"
26
+ version = "1.3.7"
27
27
 
28
28
  [tool.setuptools]
29
29
  package-dir = {"" = "src"}
@@ -7,7 +7,7 @@ from .config import Config, Parsed, Section
7
7
  from .diff import DiffItem, DiffOption, DiffType
8
8
  from .dir import Dir
9
9
  from .dir_listing import DirListing
10
- from .file import File
10
+ from .file import File, FileItem
11
11
  from .filelist import FileList
12
12
 
13
13
  # Import the configure_logging function to make it available at package level
@@ -28,6 +28,7 @@ __all__ = [
28
28
  "RPath",
29
29
  "DirListing",
30
30
  "FileList",
31
+ "FileItem",
31
32
  "Process",
32
33
  "DiffItem",
33
34
  "DiffType",
@@ -4,8 +4,6 @@ from pathlib import Path
4
4
 
5
5
  from rclone_api import MultiUploadResult, Rclone, SizeSuffix
6
6
 
7
- _1MB = 1024 * 1024
8
-
9
7
 
10
8
  @dataclass
11
9
  class Args:
@@ -39,7 +37,7 @@ def _parse_args() -> Args:
39
37
  "--chunk-size",
40
38
  help="Chunk size that will be read and uploaded in SizeSuffix form, too low or too high will cause issues",
41
39
  type=str,
42
- default="64MB", # if this is too low or too high an s3 service
40
+ default="128MB", # if this is too low or too high an s3 service
43
41
  )
44
42
  parser.add_argument(
45
43
  "--read-threads",
@@ -14,7 +14,7 @@ class RcloneExec:
14
14
  rclone_exe: Path
15
15
 
16
16
  def execute(
17
- self, cmd: list[str], check: bool, capture: bool | None = None
17
+ self, cmd: list[str], check: bool, capture: bool | Path | None = None
18
18
  ) -> subprocess.CompletedProcess:
19
19
  """Execute rclone command."""
20
20
  from rclone_api.util import rclone_execute
@@ -1,9 +1,46 @@
1
1
  import json
2
+ import warnings
3
+ from dataclasses import dataclass
2
4
  from pathlib import Path
3
5
 
4
6
  from rclone_api.rpath import RPath
5
7
 
6
8
 
9
+ # File is too complex, this is a simple dataclass that can be streamed out.
10
+ @dataclass
11
+ class FileItem:
12
+ """Remote file dataclass."""
13
+
14
+ path: str
15
+ name: str
16
+ size: int
17
+ mime_type: str
18
+ mod_time: str
19
+
20
+ @staticmethod
21
+ def from_json(data: dict) -> "FileItem | None":
22
+ try:
23
+ return FileItem(
24
+ data["Path"],
25
+ data["Name"],
26
+ data["Size"],
27
+ data["MimeType"],
28
+ data["ModTime"],
29
+ )
30
+ except KeyError:
31
+ warnings.warn(f"Invalid data: {data}")
32
+ return None
33
+
34
+ @staticmethod
35
+ def from_json_str(data: str) -> "FileItem | None":
36
+ try:
37
+ data_dict = json.loads(data)
38
+ return FileItem.from_json(data_dict)
39
+ except json.JSONDecodeError:
40
+ warnings.warn(f"Invalid JSON data: {data}")
41
+ return None
42
+
43
+
7
44
  class File:
8
45
  """Remote file dataclass."""
9
46
 
@@ -6,7 +6,7 @@ from threading import Lock, Semaphore
6
6
  from typing import Any
7
7
 
8
8
  from rclone_api.mount import Mount
9
- from rclone_api.types import FilePart
9
+ from rclone_api.types import FilePart, SizeSuffix
10
10
 
11
11
  # Create a logger for this module
12
12
  logger = logging.getLogger(__name__)
@@ -86,7 +86,13 @@ class MultiMountFileChunker:
86
86
  self.semaphore.release()
87
87
  logger.debug("Mount released")
88
88
 
89
- def fetch(self, offset: int, size: int, extra: Any) -> Future[FilePart]:
89
+ def fetch(
90
+ self, offset: int | SizeSuffix, size: int | SizeSuffix, extra: Any
91
+ ) -> Future[FilePart]:
92
+ offset = SizeSuffix(offset).as_int()
93
+ size = SizeSuffix(size).as_int()
94
+ if isinstance(size, SizeSuffix):
95
+ size = size.as_int()
90
96
  if self.verbose:
91
97
  logger.debug(f"Fetching data range: offset={offset}, size={size}")
92
98
 
@@ -72,6 +72,12 @@ class Process:
72
72
 
73
73
  atexit.register(exit_cleanup)
74
74
 
75
+ def __enter__(self) -> "Process":
76
+ return self
77
+
78
+ def __exit__(self, exc_type, exc_val, exc_tb) -> None:
79
+ self.cleanup()
80
+
75
81
  def cleanup(self) -> None:
76
82
  if self.tempdir and self.needs_cleanup:
77
83
  try:
@@ -218,7 +218,7 @@ def test_profile_copy_bytes(
218
218
  1024 * 1024 * 16,
219
219
  # 1024 * 1024 * 32,
220
220
  1024 * 1024 * 64,
221
- #1024 * 1024 * 128,
221
+ # 1024 * 1024 * 128,
222
222
  1024 * 1024 * 256,
223
223
  ]
224
224
  # transfer_list = [1, 2, 4, 8, 16]
@@ -253,8 +253,10 @@ def _parse_args() -> Args:
253
253
  args = parser.parse_args()
254
254
  return Args(direct_io=args.direct_io, num=args.num, size=args.size)
255
255
 
256
+
256
257
  _SHOW_CREDS = False
257
258
 
259
+
258
260
  def main() -> None:
259
261
  """Main entry point."""
260
262
  print("Running test_profile_copy_bytes")