rclone-api 1.0.79__tar.gz → 1.0.81__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. {rclone_api-1.0.79 → rclone_api-1.0.81}/PKG-INFO +1 -1
  2. {rclone_api-1.0.79 → rclone_api-1.0.81}/pyproject.toml +1 -1
  3. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/group_files.py +56 -18
  4. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/rclone.py +2 -4
  5. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api.egg-info/PKG-INFO +1 -1
  6. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_group_files.py +17 -0
  7. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_size_files.py +0 -7
  8. {rclone_api-1.0.79 → rclone_api-1.0.81}/.aiderignore +0 -0
  9. {rclone_api-1.0.79 → rclone_api-1.0.81}/.github/workflows/lint.yml +0 -0
  10. {rclone_api-1.0.79 → rclone_api-1.0.81}/.github/workflows/push_macos.yml +0 -0
  11. {rclone_api-1.0.79 → rclone_api-1.0.81}/.github/workflows/push_ubuntu.yml +0 -0
  12. {rclone_api-1.0.79 → rclone_api-1.0.81}/.github/workflows/push_win.yml +0 -0
  13. {rclone_api-1.0.79 → rclone_api-1.0.81}/.gitignore +0 -0
  14. {rclone_api-1.0.79 → rclone_api-1.0.81}/.pylintrc +0 -0
  15. {rclone_api-1.0.79 → rclone_api-1.0.81}/.vscode/launch.json +0 -0
  16. {rclone_api-1.0.79 → rclone_api-1.0.81}/.vscode/settings.json +0 -0
  17. {rclone_api-1.0.79 → rclone_api-1.0.81}/.vscode/tasks.json +0 -0
  18. {rclone_api-1.0.79 → rclone_api-1.0.81}/LICENSE +0 -0
  19. {rclone_api-1.0.79 → rclone_api-1.0.81}/MANIFEST.in +0 -0
  20. {rclone_api-1.0.79 → rclone_api-1.0.81}/README.md +0 -0
  21. {rclone_api-1.0.79 → rclone_api-1.0.81}/clean +0 -0
  22. {rclone_api-1.0.79 → rclone_api-1.0.81}/install +0 -0
  23. {rclone_api-1.0.79 → rclone_api-1.0.81}/lint +0 -0
  24. {rclone_api-1.0.79 → rclone_api-1.0.81}/requirements.testing.txt +0 -0
  25. {rclone_api-1.0.79 → rclone_api-1.0.81}/setup.cfg +0 -0
  26. {rclone_api-1.0.79 → rclone_api-1.0.81}/setup.py +0 -0
  27. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/__init__.py +0 -0
  28. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/assets/example.txt +0 -0
  29. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/cli.py +0 -0
  30. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/cmd/list_files.py +0 -0
  31. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/completed_process.py +0 -0
  32. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/config.py +0 -0
  33. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/convert.py +0 -0
  34. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/deprecated.py +0 -0
  35. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/diff.py +0 -0
  36. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/dir.py +0 -0
  37. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/dir_listing.py +0 -0
  38. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/exec.py +0 -0
  39. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/file.py +0 -0
  40. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/filelist.py +0 -0
  41. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/process.py +0 -0
  42. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/remote.py +0 -0
  43. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/rpath.py +0 -0
  44. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/scan_missing_folders.py +0 -0
  45. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/types.py +0 -0
  46. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/util.py +0 -0
  47. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api/walk.py +0 -0
  48. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api.egg-info/SOURCES.txt +0 -0
  49. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api.egg-info/dependency_links.txt +0 -0
  50. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api.egg-info/entry_points.txt +0 -0
  51. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api.egg-info/requires.txt +0 -0
  52. {rclone_api-1.0.79 → rclone_api-1.0.81}/src/rclone_api.egg-info/top_level.txt +0 -0
  53. {rclone_api-1.0.79 → rclone_api-1.0.81}/test +0 -0
  54. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_cmd_list_files.py +0 -0
  55. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_copy.py +0 -0
  56. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_copy_files.py +0 -0
  57. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_diff.py +0 -0
  58. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_is_synced.py +0 -0
  59. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_ls.py +0 -0
  60. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_mount.py +0 -0
  61. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_mount_s3.py +0 -0
  62. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_mount_webdav.py +0 -0
  63. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_obscure.py +0 -0
  64. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_remote_control.py +0 -0
  65. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_remotes.py +0 -0
  66. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_scan_missing_folders.py +0 -0
  67. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_serve_webdav.py +0 -0
  68. {rclone_api-1.0.79 → rclone_api-1.0.81}/tests/test_walk.py +0 -0
  69. {rclone_api-1.0.79 → rclone_api-1.0.81}/tox.ini +0 -0
  70. {rclone_api-1.0.79 → rclone_api-1.0.81}/upload_package.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.0.79
3
+ Version: 1.0.81
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  Maintainer: Zachary Vorhies
@@ -15,7 +15,7 @@ dependencies = [
15
15
  "python-dotenv>=1.0.0",
16
16
  ]
17
17
  # Change this with the version number bump.
18
- version = "1.0.79"
18
+ version = "1.0.81"
19
19
 
20
20
  [tool.setuptools]
21
21
  package-dir = {"" = "src"}
@@ -1,4 +1,11 @@
1
1
  from dataclasses import dataclass
2
+ from pathlib import Path
3
+
4
+
5
+ @dataclass
6
+ class PrefixResult:
7
+ prefix: str
8
+ files: list[str]
2
9
 
3
10
 
4
11
  @dataclass
@@ -178,23 +185,6 @@ def group_files(files: list[str], fully_qualified: bool = True) -> dict[str, lis
178
185
  return out
179
186
 
180
187
 
181
- def group_under_remote(
182
- files: list[str], fully_qualified: bool = True
183
- ) -> dict[str, list[str]]:
184
- """split between filename and remote"""
185
-
186
- #### DOE STHIS NEED TO BE REMOVEDD????? #####
187
-
188
- assert fully_qualified is True, "Not implemented for fully_qualified=False"
189
- out: dict[str, list[str]] = {}
190
- for file in files:
191
- parsed = parse_file(file)
192
- remote = f"{parsed.remote}:"
193
- file_list = out.setdefault(remote, [])
194
- file_list.append(parsed.to_string(include_remote=False, include_bucket=True))
195
- return out
196
-
197
-
198
188
  def group_under_remote_bucket(
199
189
  files: list[str], fully_qualified: bool = True
200
190
  ) -> dict[str, list[str]]:
@@ -212,4 +202,52 @@ def group_under_remote_bucket(
212
202
  return out
213
203
 
214
204
 
215
- __all__ = ["group_files", "group_under_remote", "group_under_remote_bucket"]
205
+ def _get_prefix(path: str) -> tuple[str, str] | None:
206
+ path_path: Path = Path(path)
207
+ parts = path_path.parts
208
+ if len(parts) == 1:
209
+ return None
210
+ return parts[0], "/".join(parts[1:])
211
+
212
+
213
+ def _common_prefix(prefix: str, files: list[str]) -> PrefixResult:
214
+ if not files:
215
+ return PrefixResult(prefix=prefix, files=[])
216
+ prefix = prefix
217
+ tmp: list[str] = list(files)
218
+ while True:
219
+ if not tmp:
220
+ break
221
+ prefix_set: set[str | None] = set()
222
+ for file in tmp:
223
+ pair = _get_prefix(file)
224
+ if pair is None:
225
+ break
226
+ _prefix, _ = pair
227
+ prefix_set.add(_prefix)
228
+ if len(prefix_set) > 1 or len(prefix_set) == 0:
229
+ break
230
+ next_prefix: str | None = prefix_set.pop()
231
+ if next_prefix is None:
232
+ break
233
+ prefix += f"/{next_prefix}"
234
+ new_tmp: list[str] = []
235
+ for file in tmp:
236
+ pair = _get_prefix(file)
237
+ assert pair is not None
238
+ _, path = pair
239
+ new_tmp.append(path)
240
+ tmp = new_tmp
241
+ return PrefixResult(prefix=prefix, files=tmp)
242
+
243
+
244
+ def group_under_one_prefix(prefix: str, files: list[str]) -> tuple[str, list[str]]:
245
+ """Group files under one prefix."""
246
+ if not files:
247
+ return prefix, []
248
+ prefix = prefix
249
+ result = _common_prefix(prefix, files)
250
+ return result.prefix.replace(":/", ":"), result.files
251
+
252
+
253
+ __all__ = ["group_files", "group_under_remote_bucket", "group_under_one_prefix"]
@@ -22,9 +22,7 @@ from rclone_api.diff import DiffItem, DiffOption, diff_stream_from_running_proce
22
22
  from rclone_api.dir_listing import DirListing
23
23
  from rclone_api.exec import RcloneExec
24
24
  from rclone_api.file import File
25
- from rclone_api.group_files import (
26
- group_files,
27
- )
25
+ from rclone_api.group_files import group_files, group_under_one_prefix
28
26
  from rclone_api.process import Process
29
27
  from rclone_api.remote import Remote
30
28
  from rclone_api.rpath import RPath
@@ -849,7 +847,7 @@ class Rclone:
849
847
  check = get_check(check)
850
848
  files = list(files)
851
849
  all_files: list[File] = []
852
-
850
+ src, files = group_under_one_prefix(src, files)
853
851
  cmd = ["lsjson", src, "--files-only", "-R"]
854
852
  with TemporaryDirectory() as tmpdir:
855
853
  # print("files: " + ",".join(files))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.0.79
3
+ Version: 1.0.81
4
4
  Summary: rclone api in python
5
5
  Home-page: https://github.com/zackees/rclone-api
6
6
  Maintainer: Zachary Vorhies
@@ -5,6 +5,7 @@ Unit test file.
5
5
  import unittest
6
6
 
7
7
  from rclone_api.group_files import group_files as _group_files
8
+ from rclone_api.group_files import group_under_one_prefix
8
9
 
9
10
 
10
11
  def group_files(
@@ -139,6 +140,22 @@ class GroupFilestest(unittest.TestCase):
139
140
  expected_files[0], groups["dst:TorrentBooks/libgenrs_nonfiction/204000"]
140
141
  )
141
142
 
143
+ def test_group_under_one_prefix(self) -> None:
144
+ files = [
145
+ "Bucket/subdir/file1.txt",
146
+ "Bucket/subdir/file2.txt",
147
+ ]
148
+ prefix, grouped_files = group_under_one_prefix("src:", files)
149
+ self.assertEqual(prefix, "src:Bucket/subdir")
150
+ self.assertEqual(len(grouped_files), 2)
151
+ expected_files = [
152
+ "file1.txt",
153
+ "file2.txt",
154
+ ]
155
+ self.assertIn(expected_files[0], grouped_files)
156
+ self.assertIn(expected_files[1], grouped_files)
157
+ print("done")
158
+
142
159
 
143
160
  if __name__ == "__main__":
144
161
  unittest.main()
@@ -64,18 +64,11 @@ class RcloneSizeFilesTester(unittest.TestCase):
64
64
  src = f"dst:{BUCKET_NAME}"
65
65
  for dirlisting in rclone.walk(src, max_depth=1):
66
66
  if is_first:
67
- # assert just one file
68
- # assert len(dirlisting.files) == 1
69
67
  self.assertEqual(len(dirlisting.files), 1)
70
- # assert it's first.txt
71
68
  self.assertEqual(dirlisting.files[0].name, "first.txt")
72
69
  is_first = False
73
- # print(dirlisting)
74
70
  for file in dirlisting.files_relative(src):
75
71
  files.append(file)
76
-
77
- # print(files)
78
-
79
72
  size_map: SizeResult = rclone.size_files(src=src, files=files, check=True)
80
73
  print(size_map)
81
74
  print("done")
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