rclone-api 1.1.49__tar.gz → 1.1.50__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 (86) hide show
  1. {rclone_api-1.1.49 → rclone_api-1.1.50}/PKG-INFO +1 -1
  2. {rclone_api-1.1.49 → rclone_api-1.1.50}/pyproject.toml +1 -1
  3. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/mount.py +31 -0
  4. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api.egg-info/PKG-INFO +1 -1
  5. {rclone_api-1.1.49 → rclone_api-1.1.50}/.aiderignore +0 -0
  6. {rclone_api-1.1.49 → rclone_api-1.1.50}/.github/workflows/lint.yml +0 -0
  7. {rclone_api-1.1.49 → rclone_api-1.1.50}/.github/workflows/push_macos.yml +0 -0
  8. {rclone_api-1.1.49 → rclone_api-1.1.50}/.github/workflows/push_ubuntu.yml +0 -0
  9. {rclone_api-1.1.49 → rclone_api-1.1.50}/.github/workflows/push_win.yml +0 -0
  10. {rclone_api-1.1.49 → rclone_api-1.1.50}/.gitignore +0 -0
  11. {rclone_api-1.1.49 → rclone_api-1.1.50}/.pylintrc +0 -0
  12. {rclone_api-1.1.49 → rclone_api-1.1.50}/.vscode/launch.json +0 -0
  13. {rclone_api-1.1.49 → rclone_api-1.1.50}/.vscode/settings.json +0 -0
  14. {rclone_api-1.1.49 → rclone_api-1.1.50}/.vscode/tasks.json +0 -0
  15. {rclone_api-1.1.49 → rclone_api-1.1.50}/LICENSE +0 -0
  16. {rclone_api-1.1.49 → rclone_api-1.1.50}/MANIFEST.in +0 -0
  17. {rclone_api-1.1.49 → rclone_api-1.1.50}/README.md +0 -0
  18. {rclone_api-1.1.49 → rclone_api-1.1.50}/clean +0 -0
  19. {rclone_api-1.1.49 → rclone_api-1.1.50}/install +0 -0
  20. {rclone_api-1.1.49 → rclone_api-1.1.50}/lint +0 -0
  21. {rclone_api-1.1.49 → rclone_api-1.1.50}/requirements.testing.txt +0 -0
  22. {rclone_api-1.1.49 → rclone_api-1.1.50}/setup.cfg +0 -0
  23. {rclone_api-1.1.49 → rclone_api-1.1.50}/setup.py +0 -0
  24. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/__init__.py +0 -0
  25. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/assets/example.txt +0 -0
  26. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/cli.py +0 -0
  27. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/cmd/copy_large_s3.py +0 -0
  28. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/cmd/list_files.py +0 -0
  29. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/completed_process.py +0 -0
  30. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/config.py +0 -0
  31. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/convert.py +0 -0
  32. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/deprecated.py +0 -0
  33. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/diff.py +0 -0
  34. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/dir.py +0 -0
  35. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/dir_listing.py +0 -0
  36. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/exec.py +0 -0
  37. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/experimental/flags.py +0 -0
  38. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/experimental/flags_base.py +0 -0
  39. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/file.py +0 -0
  40. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/filelist.py +0 -0
  41. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/group_files.py +0 -0
  42. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/process.py +0 -0
  43. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/profile/mount_copy_bytes.py +0 -0
  44. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/rclone.py +0 -0
  45. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/remote.py +0 -0
  46. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/rpath.py +0 -0
  47. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/s3/api.py +0 -0
  48. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/s3/basic_ops.py +0 -0
  49. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/s3/chunk_file.py +0 -0
  50. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/s3/chunk_types.py +0 -0
  51. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/s3/create.py +0 -0
  52. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/s3/types.py +0 -0
  53. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/s3/upload_file_multipart.py +0 -0
  54. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/scan_missing_folders.py +0 -0
  55. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/types.py +0 -0
  56. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/util.py +0 -0
  57. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api/walk.py +0 -0
  58. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api.egg-info/SOURCES.txt +0 -0
  59. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api.egg-info/dependency_links.txt +0 -0
  60. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api.egg-info/entry_points.txt +0 -0
  61. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api.egg-info/requires.txt +0 -0
  62. {rclone_api-1.1.49 → rclone_api-1.1.50}/src/rclone_api.egg-info/top_level.txt +0 -0
  63. {rclone_api-1.1.49 → rclone_api-1.1.50}/test +0 -0
  64. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/archive/test_paramiko.py.disabled +0 -0
  65. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_cmd_list_files.py +0 -0
  66. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_copy.py +0 -0
  67. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_copy_bytes.py +0 -0
  68. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_copy_file_resumable_s3.py +0 -0
  69. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_copy_files.py +0 -0
  70. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_diff.py +0 -0
  71. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_group_files.py +0 -0
  72. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_is_synced.py +0 -0
  73. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_ls.py +0 -0
  74. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_mount.py +0 -0
  75. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_mount_s3.py +0 -0
  76. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_obscure.py +0 -0
  77. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_rclone_config.py +0 -0
  78. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_remote_control.py +0 -0
  79. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_remotes.py +0 -0
  80. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_s3.py +0 -0
  81. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_scan_missing_folders.py +0 -0
  82. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_size_files.py +0 -0
  83. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_size_suffix.py +0 -0
  84. {rclone_api-1.1.49 → rclone_api-1.1.50}/tests/test_walk.py +0 -0
  85. {rclone_api-1.1.49 → rclone_api-1.1.50}/tox.ini +0 -0
  86. {rclone_api-1.1.49 → rclone_api-1.1.50}/upload_package.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.1.49
3
+ Version: 1.1.50
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.1.49"
26
+ version = "1.1.50"
27
27
 
28
28
  [tool.setuptools]
29
29
  package-dir = {"" = "src"}
@@ -1,9 +1,12 @@
1
+ import atexit
1
2
  import os
2
3
  import platform
3
4
  import shutil
4
5
  import subprocess
5
6
  import time
6
7
  import warnings
8
+ import weakref
9
+ from concurrent.futures import ThreadPoolExecutor
7
10
  from dataclasses import dataclass
8
11
  from pathlib import Path
9
12
  from typing import Any
@@ -12,6 +15,27 @@ from rclone_api.process import Process
12
15
 
13
16
  _SYSTEM = platform.system() # "Linux", "Darwin", "Windows", etc.
14
17
 
18
+ _MOUNTS_FOR_GC: weakref.WeakSet = weakref.WeakSet()
19
+
20
+
21
+ def _add_mount_for_gc(mount: "Mount") -> None:
22
+ # weak reference to avoid circular references
23
+ _MOUNTS_FOR_GC.add(mount)
24
+
25
+
26
+ def _remove_mount_for_gc(mount: "Mount") -> None:
27
+ _MOUNTS_FOR_GC.discard(mount)
28
+
29
+
30
+ def _cleanup_mounts() -> None:
31
+ with ThreadPoolExecutor() as executor:
32
+ mount: Mount
33
+ for mount in _MOUNTS_FOR_GC:
34
+ executor.submit(mount.close, wait=False)
35
+
36
+
37
+ atexit.register(_cleanup_mounts)
38
+
15
39
 
16
40
  @dataclass
17
41
  class Mount:
@@ -28,15 +52,18 @@ class Mount:
28
52
  assert isinstance(self.mount_path, Path)
29
53
  assert self.process is not None
30
54
  wait_for_mount(self.mount_path, self.process)
55
+ _add_mount_for_gc(self)
31
56
 
32
57
  def close(self, wait=True) -> None:
33
58
  """Clean up the mount."""
34
59
  if self._closed:
35
60
  return
36
61
  self._closed = True
62
+ self.process.terminate()
37
63
  clean_mount(self, verbose=False, wait=wait)
38
64
  if self.cache_dir and self.cache_dir_delete_on_exit:
39
65
  _cache_dir_delete_on_exit(self.cache_dir)
66
+ _remove_mount_for_gc(self)
40
67
 
41
68
  def __enter__(self) -> "Mount":
42
69
  return self
@@ -47,6 +74,10 @@ class Mount:
47
74
  def __del__(self):
48
75
  self.close(wait=False)
49
76
 
77
+ # make this a hashable object
78
+ def __hash__(self):
79
+ return hash(self.mount_path)
80
+
50
81
 
51
82
  def run_command(cmd: str, verbose: bool) -> int:
52
83
  """Run a shell command and print its output if verbose is True."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.1.49
3
+ Version: 1.1.50
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