rclone-api 1.4.12__tar.gz → 1.4.13__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.13}/PKG-INFO +1 -1
  2. {rclone_api-1.4.12 → rclone_api-1.4.13}/pyproject.toml +1 -1
  3. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/__init__.py +4 -0
  4. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/cmd/copy_large_s3_finish.py +27 -3
  5. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/api.py +4 -2
  6. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/create.py +41 -11
  7. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api.egg-info/PKG-INFO +1 -1
  8. {rclone_api-1.4.12 → rclone_api-1.4.13}/.aiderignore +0 -0
  9. {rclone_api-1.4.12 → rclone_api-1.4.13}/.github/workflows/lint.yml +0 -0
  10. {rclone_api-1.4.12 → rclone_api-1.4.13}/.github/workflows/push_macos.yml +0 -0
  11. {rclone_api-1.4.12 → rclone_api-1.4.13}/.github/workflows/push_ubuntu.yml +0 -0
  12. {rclone_api-1.4.12 → rclone_api-1.4.13}/.github/workflows/push_win.yml +0 -0
  13. {rclone_api-1.4.12 → rclone_api-1.4.13}/.gitignore +0 -0
  14. {rclone_api-1.4.12 → rclone_api-1.4.13}/.pylintrc +0 -0
  15. {rclone_api-1.4.12 → rclone_api-1.4.13}/.vscode/launch.json +0 -0
  16. {rclone_api-1.4.12 → rclone_api-1.4.13}/.vscode/settings.json +0 -0
  17. {rclone_api-1.4.12 → rclone_api-1.4.13}/.vscode/tasks.json +0 -0
  18. {rclone_api-1.4.12 → rclone_api-1.4.13}/LICENSE +0 -0
  19. {rclone_api-1.4.12 → rclone_api-1.4.13}/MANIFEST.in +0 -0
  20. {rclone_api-1.4.12 → rclone_api-1.4.13}/README.md +0 -0
  21. {rclone_api-1.4.12 → rclone_api-1.4.13}/clean +0 -0
  22. {rclone_api-1.4.12 → rclone_api-1.4.13}/install +0 -0
  23. {rclone_api-1.4.12 → rclone_api-1.4.13}/lint +0 -0
  24. {rclone_api-1.4.12 → rclone_api-1.4.13}/requirements.testing.txt +0 -0
  25. {rclone_api-1.4.12 → rclone_api-1.4.13}/setup.cfg +0 -0
  26. {rclone_api-1.4.12 → rclone_api-1.4.13}/setup.py +0 -0
  27. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/assets/example.txt +0 -0
  28. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/cli.py +0 -0
  29. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/cmd/analyze.py +0 -0
  30. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/cmd/copy_large_s3.py +0 -0
  31. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/cmd/list_files.py +0 -0
  32. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/cmd/save_to_db.py +0 -0
  33. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/completed_process.py +0 -0
  34. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/config.py +0 -0
  35. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/convert.py +0 -0
  36. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/db/__init__.py +0 -0
  37. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/db/db.py +0 -0
  38. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/db/models.py +0 -0
  39. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/deprecated.py +0 -0
  40. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/detail/copy_file_parts.py +0 -0
  41. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/detail/walk.py +0 -0
  42. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/diff.py +0 -0
  43. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/dir.py +0 -0
  44. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/dir_listing.py +0 -0
  45. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/exec.py +0 -0
  46. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/experimental/flags.py +0 -0
  47. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/experimental/flags_base.py +0 -0
  48. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/file.py +0 -0
  49. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/file_item.py +0 -0
  50. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/file_part.py +0 -0
  51. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/file_stream.py +0 -0
  52. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/filelist.py +0 -0
  53. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/group_files.py +0 -0
  54. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/http_server.py +0 -0
  55. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/log.py +0 -0
  56. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/mount.py +0 -0
  57. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/process.py +0 -0
  58. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/rclone_impl.py +0 -0
  59. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/remote.py +0 -0
  60. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/rpath.py +0 -0
  61. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/basic_ops.py +0 -0
  62. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/chunk_task.py +0 -0
  63. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/multipart/file_info.py +0 -0
  64. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/multipart/finished_piece.py +0 -0
  65. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/multipart/upload_info.py +0 -0
  66. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/multipart/upload_state.py +0 -0
  67. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/s3_multipart_uploader_by_copy.py +0 -0
  68. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/types.py +0 -0
  69. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/s3/upload_file_multipart.py +0 -0
  70. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/scan_missing_folders.py +0 -0
  71. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/types.py +0 -0
  72. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api/util.py +0 -0
  73. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api.egg-info/SOURCES.txt +0 -0
  74. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api.egg-info/dependency_links.txt +0 -0
  75. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api.egg-info/entry_points.txt +0 -0
  76. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api.egg-info/requires.txt +0 -0
  77. {rclone_api-1.4.12 → rclone_api-1.4.13}/src/rclone_api.egg-info/top_level.txt +0 -0
  78. {rclone_api-1.4.12 → rclone_api-1.4.13}/test +0 -0
  79. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/archive/test_paramiko.py.disabled +0 -0
  80. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_cmd_list_files.py +0 -0
  81. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_copy.py +0 -0
  82. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_copy_bytes.py +0 -0
  83. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_copy_file_resumable_s3.py +0 -0
  84. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_copy_files.py +0 -0
  85. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_db.py +0 -0
  86. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_diff.py +0 -0
  87. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_file_item.py +0 -0
  88. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_group_files.py +0 -0
  89. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_is_synced.py +0 -0
  90. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_ls.py +0 -0
  91. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_ls_stream_files.py +0 -0
  92. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_mount.py +0 -0
  93. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_mount_s3.py +0 -0
  94. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_obscure.py +0 -0
  95. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_rclone_config.py +0 -0
  96. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_read_write_text.py +0 -0
  97. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_remote_control.py +0 -0
  98. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_remotes.py +0 -0
  99. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_s3.py +0 -0
  100. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_scan_missing_folders.py +0 -0
  101. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_serve_http.py +0 -0
  102. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_size_files.py +0 -0
  103. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_size_suffix.py +0 -0
  104. {rclone_api-1.4.12 → rclone_api-1.4.13}/tests/test_walk.py +0 -0
  105. {rclone_api-1.4.12 → rclone_api-1.4.13}/tox.ini +0 -0
  106. {rclone_api-1.4.12 → rclone_api-1.4.13}/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.13
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.13"
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,40 @@ 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
+ max_connections: int | None = None
20
+ timeout_connection: int | None = None
21
+ timeout_read: int | None = None
22
+ verbose: bool | None = None
23
+
24
+ def resolve_defaults(self) -> None:
25
+ if self.max_pool_connections is None:
26
+ self.max_pool_connections = _MAX_CONNECTIONS
27
+ if self.timeout_connection is None:
28
+ self.timeout_connection = _TIMEOUT_CONNECT
29
+ if self.timeout_read is None:
30
+ self.timeout_read = _TIMEOUT_READ
31
+ if self.verbose is None:
32
+ self.verbose = False
11
33
 
12
34
 
13
35
  # Create a Boto3 session and S3 client, this is back blaze specific.
14
36
  # Add a function if you want to use a different S3 provider.
15
37
  # 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:
38
+ def _create_backblaze_s3_client(creds: S3Credentials, config: S3Config) -> BaseClient:
17
39
  """Create and return an S3 client."""
18
40
  region_name = creds.region_name
19
41
  access_key = creds.access_key_id
20
42
  secret_key = creds.secret_access_key
21
43
  endpoint_url = creds.endpoint_url
22
44
  endpoint_url = endpoint_url or _DEFAULT_BACKBLAZE_ENDPOINT
45
+ config.resolve_defaults()
23
46
  session = boto3.session.Session() # type: ignore
24
47
  return session.client(
25
48
  service_name="s3",
@@ -30,7 +53,9 @@ def _create_backblaze_s3_client(creds: S3Credentials, verbose: bool) -> BaseClie
30
53
  config=Config(
31
54
  signature_version="s3v4",
32
55
  region_name=region_name,
33
- max_pool_connections=_MAX_CONNECTIONS,
56
+ max_pool_connections=config.max_connections,
57
+ read_timeout=config.timeout_read,
58
+ connect_timeout=config.timeout_connection,
34
59
  # Note that BackBlase has a boko3 bug where it doesn't support the new
35
60
  # checksum header, the following line was an attempt of fix it on the newest
36
61
  # version of boto3, but it didn't work.
@@ -39,18 +64,18 @@ def _create_backblaze_s3_client(creds: S3Credentials, verbose: bool) -> BaseClie
39
64
  )
40
65
 
41
66
 
42
- def _create_unknown_s3_client(creds: S3Credentials, verbose: bool) -> BaseClient:
67
+ def _create_unknown_s3_client(creds: S3Credentials, config: S3Config) -> BaseClient:
43
68
  """Create and return an S3 client."""
44
69
  access_key = creds.access_key_id
45
70
  secret_key = creds.secret_access_key
46
71
  endpoint_url = creds.endpoint_url
47
72
  if (endpoint_url is not None) and not (endpoint_url.startswith("http")):
48
- if verbose:
73
+ if config.verbose:
49
74
  warnings.warn(
50
75
  f"Endpoint URL is schema naive: {endpoint_url}, assuming HTTPS"
51
76
  )
52
77
  endpoint_url = f"https://{endpoint_url}"
53
-
78
+ config.resolve_defaults()
54
79
  session = boto3.session.Session() # type: ignore
55
80
  return session.client(
56
81
  service_name="s3",
@@ -60,19 +85,24 @@ def _create_unknown_s3_client(creds: S3Credentials, verbose: bool) -> BaseClient
60
85
  config=Config(
61
86
  signature_version="s3v4",
62
87
  region_name=creds.region_name,
63
- max_pool_connections=_MAX_CONNECTIONS,
88
+ max_pool_connections=config.max_connections,
89
+ read_timeout=config.timeout_read,
90
+ connect_timeout=config.timeout_connection,
64
91
  ),
65
92
  )
66
93
 
67
94
 
68
- def create_s3_client(credentials: S3Credentials, verbose=False) -> BaseClient:
95
+ def create_s3_client(
96
+ credentials: S3Credentials, config: S3Config | None = None
97
+ ) -> BaseClient:
69
98
  """Create and return an S3 client."""
99
+ config = config or S3Config()
70
100
  provider = credentials.provider
71
101
  if provider == S3Provider.BACKBLAZE:
72
- if verbose:
102
+ if config.verbose:
73
103
  print("Creating BackBlaze S3 client")
74
- return _create_backblaze_s3_client(creds=credentials, verbose=verbose)
104
+ return _create_backblaze_s3_client(creds=credentials, config=config)
75
105
  else:
76
- if verbose:
106
+ if config.verbose:
77
107
  print("Creating generic/unknown S3 client")
78
- return _create_unknown_s3_client(creds=credentials, verbose=verbose)
108
+ 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.13
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