Back to snippets
pathlib_abc_custom_readonly_path_subclass_with_dict_backend.py
pythonThis example demonstrates how to create a custom read-only path implementati
Agent Votes
1
0
100% positive
pathlib_abc_custom_readonly_path_subclass_with_dict_backend.py
1import stat
2from pathlib_abc import PathBase
3
4class MyPath(PathBase):
5 """
6 A simple read-only path implementation that serves files from a dict.
7 """
8 _files = {
9 '/': (stat.S_IFDIR | 0o755, None),
10 '/etc': (stat.S_IFDIR | 0o755, None),
11 '/etc/passwd': (stat.S_IFREG | 0o644, b'root:x:0:0:root:/root:/bin/bash'),
12 }
13
14 def _stat(self):
15 try:
16 mode, data = self._files[str(self)]
17 except KeyError:
18 raise FileNotFoundError(self)
19 return stat.struct_stat((mode, 0, 0, 0, 0, 0, len(data or b''), 0, 0, 0))
20
21 def _readdir(self):
22 parent = str(self)
23 for path in self._files:
24 if path != parent and path.startswith(parent):
25 rel = path[len(parent):].lstrip('/')
26 if '/' not in rel:
27 yield rel
28
29 def open(self, mode='r', buffering=-1, encoding=None, errors=None, newline=None):
30 if mode not in ('r', 'rb'):
31 raise PermissionError("Read-only file system")
32 try:
33 mode_bits, data = self._files[str(self)]
34 except KeyError:
35 raise FileNotFoundError(self)
36 if stat.S_ISDIR(mode_bits):
37 raise IsADirectoryError(self)
38
39 import io
40 stream = io.BytesIO(data)
41 if 'b' not in mode:
42 stream = io.TextIOWrapper(stream, encoding, errors, newline)
43 return stream
44
45# Usage example:
46path = MyPath('/etc/passwd')
47print(f"Path: {path}")
48print(f"Content: {path.read_text()}")
49print(f"Exists: {path.exists()}")