rclone-api 1.4.12__tar.gz → 1.4.14__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 (106) hide show
  1. {rclone_api-1.4.12 → rclone_api-1.4.14}/PKG-INFO +1 -1
  2. {rclone_api-1.4.12 → rclone_api-1.4.14}/pyproject.toml +1 -1
  3. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/__init__.py +4 -0
  4. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/cmd/copy_large_s3_finish.py +27 -3
  5. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/api.py +4 -2
  6. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/create.py +36 -11
  7. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api.egg-info/PKG-INFO +1 -1
  8. {rclone_api-1.4.12 → rclone_api-1.4.14}/.aiderignore +0 -0
  9. {rclone_api-1.4.12 → rclone_api-1.4.14}/.github/workflows/lint.yml +0 -0
  10. {rclone_api-1.4.12 → rclone_api-1.4.14}/.github/workflows/push_macos.yml +0 -0
  11. {rclone_api-1.4.12 → rclone_api-1.4.14}/.github/workflows/push_ubuntu.yml +0 -0
  12. {rclone_api-1.4.12 → rclone_api-1.4.14}/.github/workflows/push_win.yml +0 -0
  13. {rclone_api-1.4.12 → rclone_api-1.4.14}/.gitignore +0 -0
  14. {rclone_api-1.4.12 → rclone_api-1.4.14}/.pylintrc +0 -0
  15. {rclone_api-1.4.12 → rclone_api-1.4.14}/.vscode/launch.json +0 -0
  16. {rclone_api-1.4.12 → rclone_api-1.4.14}/.vscode/settings.json +0 -0
  17. {rclone_api-1.4.12 → rclone_api-1.4.14}/.vscode/tasks.json +0 -0
  18. {rclone_api-1.4.12 → rclone_api-1.4.14}/LICENSE +0 -0
  19. {rclone_api-1.4.12 → rclone_api-1.4.14}/MANIFEST.in +0 -0
  20. {rclone_api-1.4.12 → rclone_api-1.4.14}/README.md +0 -0
  21. {rclone_api-1.4.12 → rclone_api-1.4.14}/clean +0 -0
  22. {rclone_api-1.4.12 → rclone_api-1.4.14}/install +0 -0
  23. {rclone_api-1.4.12 → rclone_api-1.4.14}/lint +0 -0
  24. {rclone_api-1.4.12 → rclone_api-1.4.14}/requirements.testing.txt +0 -0
  25. {rclone_api-1.4.12 → rclone_api-1.4.14}/setup.cfg +0 -0
  26. {rclone_api-1.4.12 → rclone_api-1.4.14}/setup.py +0 -0
  27. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/assets/example.txt +0 -0
  28. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/cli.py +0 -0
  29. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/cmd/analyze.py +0 -0
  30. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/cmd/copy_large_s3.py +0 -0
  31. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/cmd/list_files.py +0 -0
  32. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/cmd/save_to_db.py +0 -0
  33. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/completed_process.py +0 -0
  34. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/config.py +0 -0
  35. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/convert.py +0 -0
  36. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/db/__init__.py +0 -0
  37. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/db/db.py +0 -0
  38. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/db/models.py +0 -0
  39. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/deprecated.py +0 -0
  40. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/detail/copy_file_parts.py +0 -0
  41. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/detail/walk.py +0 -0
  42. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/diff.py +0 -0
  43. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/dir.py +0 -0
  44. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/dir_listing.py +0 -0
  45. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/exec.py +0 -0
  46. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/experimental/flags.py +0 -0
  47. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/experimental/flags_base.py +0 -0
  48. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/file.py +0 -0
  49. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/file_item.py +0 -0
  50. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/file_part.py +0 -0
  51. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/file_stream.py +0 -0
  52. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/filelist.py +0 -0
  53. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/group_files.py +0 -0
  54. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/http_server.py +0 -0
  55. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/log.py +0 -0
  56. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/mount.py +0 -0
  57. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/process.py +0 -0
  58. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/rclone_impl.py +0 -0
  59. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/remote.py +0 -0
  60. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/rpath.py +0 -0
  61. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/basic_ops.py +0 -0
  62. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/chunk_task.py +0 -0
  63. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/multipart/file_info.py +0 -0
  64. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/multipart/finished_piece.py +0 -0
  65. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/multipart/upload_info.py +0 -0
  66. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/multipart/upload_state.py +0 -0
  67. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/s3_multipart_uploader_by_copy.py +0 -0
  68. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/types.py +0 -0
  69. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/s3/upload_file_multipart.py +0 -0
  70. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/scan_missing_folders.py +0 -0
  71. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/types.py +0 -0
  72. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api/util.py +0 -0
  73. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api.egg-info/SOURCES.txt +0 -0
  74. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api.egg-info/dependency_links.txt +0 -0
  75. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api.egg-info/entry_points.txt +0 -0
  76. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api.egg-info/requires.txt +0 -0
  77. {rclone_api-1.4.12 → rclone_api-1.4.14}/src/rclone_api.egg-info/top_level.txt +0 -0
  78. {rclone_api-1.4.12 → rclone_api-1.4.14}/test +0 -0
  79. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/archive/test_paramiko.py.disabled +0 -0
  80. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_cmd_list_files.py +0 -0
  81. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_copy.py +0 -0
  82. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_copy_bytes.py +0 -0
  83. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_copy_file_resumable_s3.py +0 -0
  84. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_copy_files.py +0 -0
  85. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_db.py +0 -0
  86. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_diff.py +0 -0
  87. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_file_item.py +0 -0
  88. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_group_files.py +0 -0
  89. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_is_synced.py +0 -0
  90. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_ls.py +0 -0
  91. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_ls_stream_files.py +0 -0
  92. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_mount.py +0 -0
  93. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_mount_s3.py +0 -0
  94. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_obscure.py +0 -0
  95. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_rclone_config.py +0 -0
  96. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_read_write_text.py +0 -0
  97. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_remote_control.py +0 -0
  98. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_remotes.py +0 -0
  99. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_s3.py +0 -0
  100. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_scan_missing_folders.py +0 -0
  101. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_serve_http.py +0 -0
  102. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_size_files.py +0 -0
  103. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_size_suffix.py +0 -0
  104. {rclone_api-1.4.12 → rclone_api-1.4.14}/tests/test_walk.py +0 -0
  105. {rclone_api-1.4.12 → rclone_api-1.4.14}/tox.ini +0 -0
  106. {rclone_api-1.4.12 → rclone_api-1.4.14}/upload_package.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.4.12
3
+ Version: 1.4.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
@@ -25,7 +25,7 @@ dependencies = [
25
25
  ]
26
26
 
27
27
  # Change this with the version number bump.
28
- version = "1.4.12"
28
+ version = "1.4.14"
29
29
 
30
30
  [tool.setuptools]
31
31
  package-dir = {"" = "src"}
@@ -507,6 +507,10 @@ class Rclone:
507
507
  verbose=verbose,
508
508
  )
509
509
 
510
+ def size_file(self, src: str) -> SizeSuffix | Exception:
511
+ """Get the size of a file."""
512
+ return self.impl.size_file(src=src)
513
+
510
514
 
511
515
  __all__ = [
512
516
  "Rclone",
@@ -51,10 +51,17 @@ def _parse_args() -> Args:
51
51
 
52
52
 
53
53
  def do_finish_part(rclone: Rclone, info: InfoJson, dst: str) -> None:
54
- from rclone_api.s3.create import BaseClient, S3Credentials, create_s3_client
54
+ from rclone_api.s3.create import (
55
+ BaseClient,
56
+ S3Config,
57
+ S3Credentials,
58
+ create_s3_client,
59
+ )
55
60
 
56
61
  s3_creds: S3Credentials = rclone.impl.get_s3_credentials(remote=dst)
57
- s3_client: BaseClient = create_s3_client(s3_creds)
62
+ s3_client: BaseClient = create_s3_client(
63
+ s3_creds, S3Config(verbose=False, timeout_read=5 * 60)
64
+ )
58
65
  s3_bucket = s3_creds.bucket_name
59
66
  is_done = info.fetch_is_done()
60
67
  assert is_done, f"Upload is not done: {info}"
@@ -112,6 +119,20 @@ def do_finish_part(rclone: Rclone, info: InfoJson, dst: str) -> None:
112
119
  retries=3,
113
120
  )
114
121
 
122
+ # now check if the dst now exists, if so, delete the parts folder.
123
+ # if rclone.exists(dst):
124
+ # rclone.purge(parts_dir)
125
+
126
+ if not rclone.exists(dst):
127
+ raise FileNotFoundError(f"Destination file not found: {dst}")
128
+
129
+ write_size = rclone.size_file(dst)
130
+ if write_size != size:
131
+ raise ValueError(f"Size mismatch: {write_size} != {size}")
132
+
133
+ print(f"Upload complete: {dst}")
134
+ rclone.purge(parts_dir)
135
+
115
136
 
116
137
  def main() -> int:
117
138
  """Main entry point."""
@@ -120,7 +141,10 @@ def main() -> int:
120
141
  info_json = f"{args.src}/info.json".replace("//", "/")
121
142
  info = InfoJson(rclone.impl, src=None, src_info=info_json)
122
143
  loaded = info.load()
123
- assert loaded
144
+ if not loaded:
145
+ raise FileNotFoundError(
146
+ f"Info file not found, has the upload finished? {info_json}"
147
+ )
124
148
  print(info)
125
149
  do_finish_part(rclone=rclone, info=info, dst=args.dst)
126
150
  return 0
@@ -9,7 +9,7 @@ from rclone_api.s3.basic_ops import (
9
9
  list_bucket_contents,
10
10
  upload_file,
11
11
  )
12
- from rclone_api.s3.create import create_s3_client
12
+ from rclone_api.s3.create import S3Config, create_s3_client
13
13
  from rclone_api.s3.types import S3Credentials, S3MutliPartUploadConfig, S3UploadTarget
14
14
  from rclone_api.s3.upload_file_multipart import (
15
15
  MultiUploadResult,
@@ -23,7 +23,9 @@ class S3Client:
23
23
  def __init__(self, credentials: S3Credentials, verbose: bool = False) -> None:
24
24
  self.verbose = verbose
25
25
  self.credentials: S3Credentials = credentials
26
- self.client: BaseClient = create_s3_client(credentials, verbose=verbose)
26
+ self.client: BaseClient = create_s3_client(
27
+ credentials, config=S3Config(verbose=verbose)
28
+ )
27
29
 
28
30
  def list_bucket_contents(self, bucket_name: str) -> None:
29
31
  list_bucket_contents(self.client, bucket_name)
@@ -1,4 +1,5 @@
1
1
  import warnings
2
+ from dataclasses import dataclass
2
3
 
3
4
  import boto3
4
5
  from botocore.client import BaseClient
@@ -8,18 +9,35 @@ from rclone_api.s3.types import S3Credentials, S3Provider
8
9
 
9
10
  _DEFAULT_BACKBLAZE_ENDPOINT = "https://s3.us-west-002.backblazeb2.com"
10
11
  _MAX_CONNECTIONS = 50
12
+ _TIMEOUT_READ = 120
13
+ _TIMEOUT_CONNECT = 60
14
+
15
+
16
+ @dataclass
17
+ class S3Config:
18
+ max_pool_connections: int | None = None
19
+ timeout_connection: int | None = None
20
+ timeout_read: int | None = None
21
+ verbose: bool | None = None
22
+
23
+ def resolve_defaults(self) -> None:
24
+ self.max_pool_connections = self.max_pool_connections or _MAX_CONNECTIONS
25
+ self.timeout_connection = self.timeout_connection or _TIMEOUT_CONNECT
26
+ self.timeout_read = self.timeout_read or _TIMEOUT_READ
27
+ self.verbose = self.verbose or False
11
28
 
12
29
 
13
30
  # Create a Boto3 session and S3 client, this is back blaze specific.
14
31
  # Add a function if you want to use a different S3 provider.
15
32
  # If AWS support is added in a fork then please merge it back here.
16
- def _create_backblaze_s3_client(creds: S3Credentials, verbose: bool) -> BaseClient:
33
+ def _create_backblaze_s3_client(creds: S3Credentials, config: S3Config) -> BaseClient:
17
34
  """Create and return an S3 client."""
18
35
  region_name = creds.region_name
19
36
  access_key = creds.access_key_id
20
37
  secret_key = creds.secret_access_key
21
38
  endpoint_url = creds.endpoint_url
22
39
  endpoint_url = endpoint_url or _DEFAULT_BACKBLAZE_ENDPOINT
40
+ config.resolve_defaults()
23
41
  session = boto3.session.Session() # type: ignore
24
42
  return session.client(
25
43
  service_name="s3",
@@ -30,7 +48,9 @@ def _create_backblaze_s3_client(creds: S3Credentials, verbose: bool) -> BaseClie
30
48
  config=Config(
31
49
  signature_version="s3v4",
32
50
  region_name=region_name,
33
- max_pool_connections=_MAX_CONNECTIONS,
51
+ max_pool_connections=config.max_pool_connections,
52
+ read_timeout=config.timeout_read,
53
+ connect_timeout=config.timeout_connection,
34
54
  # Note that BackBlase has a boko3 bug where it doesn't support the new
35
55
  # checksum header, the following line was an attempt of fix it on the newest
36
56
  # version of boto3, but it didn't work.
@@ -39,18 +59,18 @@ def _create_backblaze_s3_client(creds: S3Credentials, verbose: bool) -> BaseClie
39
59
  )
40
60
 
41
61
 
42
- def _create_unknown_s3_client(creds: S3Credentials, verbose: bool) -> BaseClient:
62
+ def _create_unknown_s3_client(creds: S3Credentials, config: S3Config) -> BaseClient:
43
63
  """Create and return an S3 client."""
44
64
  access_key = creds.access_key_id
45
65
  secret_key = creds.secret_access_key
46
66
  endpoint_url = creds.endpoint_url
47
67
  if (endpoint_url is not None) and not (endpoint_url.startswith("http")):
48
- if verbose:
68
+ if config.verbose:
49
69
  warnings.warn(
50
70
  f"Endpoint URL is schema naive: {endpoint_url}, assuming HTTPS"
51
71
  )
52
72
  endpoint_url = f"https://{endpoint_url}"
53
-
73
+ config.resolve_defaults()
54
74
  session = boto3.session.Session() # type: ignore
55
75
  return session.client(
56
76
  service_name="s3",
@@ -60,19 +80,24 @@ def _create_unknown_s3_client(creds: S3Credentials, verbose: bool) -> BaseClient
60
80
  config=Config(
61
81
  signature_version="s3v4",
62
82
  region_name=creds.region_name,
63
- max_pool_connections=_MAX_CONNECTIONS,
83
+ max_pool_connections=config.max_pool_connections,
84
+ read_timeout=config.timeout_read,
85
+ connect_timeout=config.timeout_connection,
64
86
  ),
65
87
  )
66
88
 
67
89
 
68
- def create_s3_client(credentials: S3Credentials, verbose=False) -> BaseClient:
90
+ def create_s3_client(
91
+ credentials: S3Credentials, config: S3Config | None = None
92
+ ) -> BaseClient:
69
93
  """Create and return an S3 client."""
94
+ config = config or S3Config()
70
95
  provider = credentials.provider
71
96
  if provider == S3Provider.BACKBLAZE:
72
- if verbose:
97
+ if config.verbose:
73
98
  print("Creating BackBlaze S3 client")
74
- return _create_backblaze_s3_client(creds=credentials, verbose=verbose)
99
+ return _create_backblaze_s3_client(creds=credentials, config=config)
75
100
  else:
76
- if verbose:
101
+ if config.verbose:
77
102
  print("Creating generic/unknown S3 client")
78
- return _create_unknown_s3_client(creds=credentials, verbose=verbose)
103
+ return _create_unknown_s3_client(creds=credentials, config=config)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.4.12
3
+ Version: 1.4.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
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