Coverage for /pythoncovmergedfiles/medio/medio/usr/lib/python3.9/importlib/_common.py: 62%
37 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-10-20 07:00 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-10-20 07:00 +0000
1import os
2import pathlib
3import zipfile
4import tempfile
5import functools
6import contextlib
9def from_package(package):
10 """
11 Return a Traversable object for the given package.
13 """
14 return fallback_resources(package.__spec__)
17def fallback_resources(spec):
18 package_directory = pathlib.Path(spec.origin).parent
19 try:
20 archive_path = spec.loader.archive
21 rel_path = package_directory.relative_to(archive_path)
22 return zipfile.Path(archive_path, str(rel_path) + '/')
23 except Exception:
24 pass
25 return package_directory
28@contextlib.contextmanager
29def _tempfile(reader, suffix=''):
30 # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try'
31 # blocks due to the need to close the temporary file to work on Windows
32 # properly.
33 fd, raw_path = tempfile.mkstemp(suffix=suffix)
34 try:
35 os.write(fd, reader())
36 os.close(fd)
37 yield pathlib.Path(raw_path)
38 finally:
39 try:
40 os.remove(raw_path)
41 except FileNotFoundError:
42 pass
45@functools.singledispatch
46@contextlib.contextmanager
47def as_file(path):
48 """
49 Given a Traversable object, return that object as a
50 path on the local file system in a context manager.
51 """
52 with _tempfile(path.read_bytes, suffix=path.name) as local:
53 yield local
56@as_file.register(pathlib.Path)
57@contextlib.contextmanager
58def _(path):
59 """
60 Degenerate behavior for pathlib.Path objects.
61 """
62 yield path