rclone-api 1.1.49__py2.py3-none-any.whl → 1.1.51__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,11 +15,33 @@ 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:
18
42
  """Mount information."""
19
43
 
44
+ src: str
20
45
  mount_path: Path
21
46
  process: Process
22
47
  read_only: bool
@@ -28,15 +53,18 @@ class Mount:
28
53
  assert isinstance(self.mount_path, Path)
29
54
  assert self.process is not None
30
55
  wait_for_mount(self.mount_path, self.process)
56
+ _add_mount_for_gc(self)
31
57
 
32
58
  def close(self, wait=True) -> None:
33
59
  """Clean up the mount."""
34
60
  if self._closed:
35
61
  return
36
62
  self._closed = True
63
+ self.process.terminate()
37
64
  clean_mount(self, verbose=False, wait=wait)
38
65
  if self.cache_dir and self.cache_dir_delete_on_exit:
39
66
  _cache_dir_delete_on_exit(self.cache_dir)
67
+ _remove_mount_for_gc(self)
40
68
 
41
69
  def __enter__(self) -> "Mount":
42
70
  return self
@@ -47,6 +75,10 @@ class Mount:
47
75
  def __del__(self):
48
76
  self.close(wait=False)
49
77
 
78
+ # make this a hashable object
79
+ def __hash__(self):
80
+ return hash(self.mount_path)
81
+
50
82
 
51
83
  def run_command(cmd: str, verbose: bool) -> int:
52
84
  """Run a shell command and print its output if verbose is True."""
rclone_api/rclone.py CHANGED
@@ -960,6 +960,7 @@ class Rclone:
960
960
  proc = self._launch_process(cmd_list, log=log)
961
961
  mount_read_only = not allow_writes
962
962
  mount: Mount = Mount(
963
+ src=src_str,
963
964
  mount_path=outdir,
964
965
  process=proc,
965
966
  read_only=mount_read_only,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: rclone_api
3
- Version: 1.1.49
3
+ Version: 1.1.51
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,9 +11,9 @@ 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=5XiFwP7tst4h8cGQstZMJ0u5VzqFQ4YehnDl2AFP11A,10057
15
15
  rclone_api/process.py,sha256=rBj_S86jC6nqCYop-jq8r9eMSteKeObxUrJMgH8LZvI,5084
16
- rclone_api/rclone.py,sha256=ODHPq1OKKzOUgi7QPDc1UZHZLSoG9SkxnT1MXpoggx4,43823
16
+ rclone_api/rclone.py,sha256=ye_Qdn9dC-PVXySskjrrtPljDQZz1SnvKmGkAn7rcAI,43848
17
17
  rclone_api/remote.py,sha256=O9WDUFQy9f6oT1HdUbTixK2eg0xtBBm8k4Xl6aa6K00,431
18
18
  rclone_api/rpath.py,sha256=8ZA_1wxWtskwcy0I8V2VbjKDmzPkiWd8Q2JQSvh-sYE,2586
19
19
  rclone_api/scan_missing_folders.py,sha256=Kulca2Q6WZodt00ATFHkmqqInuoPvBkhTcS9703y6po,4740
@@ -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.51.dist-info/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
+ rclone_api-1.1.51.dist-info/METADATA,sha256=4bJ5zwCZ1RpMpTjmkuPrXxgdIU3aXJqyLOuhRvnd_Cg,4537
38
+ rclone_api-1.1.51.dist-info/WHEEL,sha256=rF4EZyR2XVS6irmOHQIJx2SUqXLZKRMUrjsg8UwN-XQ,109
39
+ rclone_api-1.1.51.dist-info/entry_points.txt,sha256=TV8kwP3FRzYwUEr0RLC7aJh0W03SAefIJNXTJ-FdMIQ,200
40
+ rclone_api-1.1.51.dist-info/top_level.txt,sha256=EvZ7uuruUpe9RiUyEp25d1Keq7PWYNT0O_-mr8FCG5g,11
41
+ rclone_api-1.1.51.dist-info/RECORD,,