]> jfr.im git - dlqueue.git/blob - venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py
init: venv aand flask
[dlqueue.git] / venv / lib / python3.11 / site-packages / pkg_resources / _vendor / importlib_resources / _compat.py
1 # flake8: noqa
2
3 import abc
4 import os
5 import sys
6 import pathlib
7 from contextlib import suppress
8 from typing import Union
9
10
11 if sys.version_info >= (3, 10):
12 from zipfile import Path as ZipPath # type: ignore
13 else:
14 from ..zipp import Path as ZipPath # type: ignore
15
16
17 try:
18 from typing import runtime_checkable # type: ignore
19 except ImportError:
20
21 def runtime_checkable(cls): # type: ignore
22 return cls
23
24
25 try:
26 from typing import Protocol # type: ignore
27 except ImportError:
28 Protocol = abc.ABC # type: ignore
29
30
31 class TraversableResourcesLoader:
32 """
33 Adapt loaders to provide TraversableResources and other
34 compatibility.
35
36 Used primarily for Python 3.9 and earlier where the native
37 loaders do not yet implement TraversableResources.
38 """
39
40 def __init__(self, spec):
41 self.spec = spec
42
43 @property
44 def path(self):
45 return self.spec.origin
46
47 def get_resource_reader(self, name):
48 from . import readers, _adapters
49
50 def _zip_reader(spec):
51 with suppress(AttributeError):
52 return readers.ZipReader(spec.loader, spec.name)
53
54 def _namespace_reader(spec):
55 with suppress(AttributeError, ValueError):
56 return readers.NamespaceReader(spec.submodule_search_locations)
57
58 def _available_reader(spec):
59 with suppress(AttributeError):
60 return spec.loader.get_resource_reader(spec.name)
61
62 def _native_reader(spec):
63 reader = _available_reader(spec)
64 return reader if hasattr(reader, 'files') else None
65
66 def _file_reader(spec):
67 try:
68 path = pathlib.Path(self.path)
69 except TypeError:
70 return None
71 if path.exists():
72 return readers.FileReader(self)
73
74 return (
75 # native reader if it supplies 'files'
76 _native_reader(self.spec)
77 or
78 # local ZipReader if a zip module
79 _zip_reader(self.spec)
80 or
81 # local NamespaceReader if a namespace module
82 _namespace_reader(self.spec)
83 or
84 # local FileReader
85 _file_reader(self.spec)
86 # fallback - adapt the spec ResourceReader to TraversableReader
87 or _adapters.CompatibilityFiles(self.spec)
88 )
89
90
91 def wrap_spec(package):
92 """
93 Construct a package spec with traversable compatibility
94 on the spec/loader/reader.
95
96 Supersedes _adapters.wrap_spec to use TraversableResourcesLoader
97 from above for older Python compatibility (<3.10).
98 """
99 from . import _adapters
100
101 return _adapters.SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader)
102
103
104 if sys.version_info >= (3, 9):
105 StrPath = Union[str, os.PathLike[str]]
106 else:
107 # PathLike is only subscriptable at runtime in 3.9+
108 StrPath = Union[str, "os.PathLike[str]"]