rclone-api 1.1.49__py2.py3-none-any.whl → 1.1.50__py2.py3-none-any.whl

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.
rclone_api/mount.py CHANGED
@@ -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
@@ -11,7 +11,7 @@ rclone_api/exec.py,sha256=Pd7pUBd8ib5MzqvMybG2DQISPRbDRu20VjVRL2mLAVY,1076
11
11
  rclone_api/file.py,sha256=EP5yT2dZ0H2p7CY5n0y5k5pHhIliV25pm8KOwBklUTk,1863
12
12
  rclone_api/filelist.py,sha256=xbiusvNgaB_b_kQOZoHMJJxn6TWGtPrWd2J042BI28o,767
13
13
  rclone_api/group_files.py,sha256=H92xPW9lQnbNw5KbtZCl00bD6iRh9yRbCuxku4j_3dg,8036
14
- rclone_api/mount.py,sha256=2esqcaIm8WvLorq9PfU93FxU88Kc8K4pIDt9YPa68sM,9279
14
+ rclone_api/mount.py,sha256=lVKvOt10xD3w2Bk6ZjnxnviV8IlRkIofH79Uei3ciTs,10044
15
15
  rclone_api/process.py,sha256=rBj_S86jC6nqCYop-jq8r9eMSteKeObxUrJMgH8LZvI,5084
16
16
  rclone_api/rclone.py,sha256=ODHPq1OKKzOUgi7QPDc1UZHZLSoG9SkxnT1MXpoggx4,43823
17
17
  rclone_api/remote.py,sha256=O9WDUFQy9f6oT1HdUbTixK2eg0xtBBm8k4Xl6aa6K00,431
@@ -33,9 +33,9 @@ rclone_api/s3/chunk_types.py,sha256=LbXayXY1KgVU1LkdbASD_BQ7TpVpwVnzMjtz--8LBaE,
33
33
  rclone_api/s3/create.py,sha256=wgfkapv_j904CfKuWyiBIWJVxfAx_ftemFSUV14aT68,3149
34
34
  rclone_api/s3/types.py,sha256=yBnJ38Tjk6RlydJ-sqZ7DSfyFloy8KDYJ0mv3vlOzLE,1388
35
35
  rclone_api/s3/upload_file_multipart.py,sha256=y9azNAU8QH5Ovwz33V2HZwNmJdlFjJg-jrXLZ1gtMds,10364
36
- rclone_api-1.1.49.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
- rclone_api-1.1.49.dist-info/METADATA,sha256=KDYNGUTPBDR-v6lqFNbM5o5Sn-w4IxsJkucFDGAgptk,4537
38
- rclone_api-1.1.49.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
39
- rclone_api-1.1.49.dist-info/entry_points.txt,sha256=TV8kwP3FRzYwUEr0RLC7aJh0W03SAefIJNXTJ-FdMIQ,200
40
- rclone_api-1.1.49.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
41
- rclone_api-1.1.49.dist-info/RECORD,,
36
+ rclone_api-1.1.50.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
+ rclone_api-1.1.50.dist-info/METADATA,sha256=keOMsvXUUQwz3T07ALlyBoA9HSawE1EHbcj2EfCEM00,4537
38
+ rclone_api-1.1.50.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
39
+ rclone_api-1.1.50.dist-info/entry_points.txt,sha256=TV8kwP3FRzYwUEr0RLC7aJh0W03SAefIJNXTJ-FdMIQ,200
40
+ rclone_api-1.1.50.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
41
+ rclone_api-1.1.50.dist-info/RECORD,,