|
1 | 1 | import os
|
2 | 2 | import sys
|
| 3 | +import io |
3 | 4 |
|
4 | 5 | from . import _common
|
5 |
| -from contextlib import contextmanager, suppress |
| 6 | +from contextlib import suppress |
6 | 7 | from importlib.abc import ResourceLoader
|
7 | 8 | from io import BytesIO, TextIOWrapper
|
8 | 9 | from pathlib import Path
|
@@ -94,24 +95,26 @@ def path(
|
94 | 95 | """
|
95 | 96 | reader = _common.get_resource_reader(_common.get_package(package))
|
96 | 97 | return (
|
97 |
| - _path_from_reader(reader, resource) |
| 98 | + _path_from_reader(reader, _common.normalize_path(resource)) |
98 | 99 | if reader else
|
99 | 100 | _common.as_file(
|
100 | 101 | _common.files(package).joinpath(_common.normalize_path(resource)))
|
101 | 102 | )
|
102 | 103 |
|
103 | 104 |
|
104 |
| -@contextmanager |
105 | 105 | def _path_from_reader(reader, resource):
|
106 |
| - norm_resource = _common.normalize_path(resource) |
| 106 | + return _path_from_resource_path(reader, resource) or \ |
| 107 | + _path_from_open_resource(reader, resource) |
| 108 | + |
| 109 | + |
| 110 | +def _path_from_resource_path(reader, resource): |
107 | 111 | with suppress(FileNotFoundError):
|
108 |
| - yield Path(reader.resource_path(norm_resource)) |
109 |
| - return |
110 |
| - opener_reader = reader.open_resource(norm_resource) |
111 |
| - with _common._tempfile(opener_reader.read, suffix=norm_resource) as res: |
112 |
| - del opener_reader |
113 |
| - del reader |
114 |
| - yield res |
| 112 | + return Path(reader.resource_path(resource)) |
| 113 | + |
| 114 | + |
| 115 | +def _path_from_open_resource(reader, resource): |
| 116 | + saved = io.BytesIO(reader.open_resource(resource).read()) |
| 117 | + return _common._tempfile(saved.read, suffix=resource) |
115 | 118 |
|
116 | 119 |
|
117 | 120 | def is_resource(package: Package, name: str) -> bool:
|
|
0 commit comments