| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| import os | ||
| import pathlib | ||
| import zipfile | ||
| import tempfile | ||
| import functools | ||
| import contextlib | ||
|
|
||
|
|
||
| def from_package(package): | ||
| """ | ||
| Return a Traversable object for the given package. | ||
|
|
||
| """ | ||
| spec = package.__spec__ | ||
| return from_traversable_resources(spec) or fallback_resources(spec) | ||
|
|
||
|
|
||
| def from_traversable_resources(spec): | ||
| """ | ||
| If the spec.loader implements TraversableResources, | ||
| directly or implicitly, it will have a ``files()`` method. | ||
| """ | ||
| with contextlib.suppress(AttributeError): | ||
| return spec.loader.files() | ||
|
|
||
|
|
||
| def fallback_resources(spec): | ||
| package_directory = pathlib.Path(spec.origin).parent | ||
| try: | ||
| archive_path = spec.loader.archive | ||
| rel_path = package_directory.relative_to(archive_path) | ||
| return zipfile.Path(archive_path, str(rel_path) + '/') | ||
| except Exception: | ||
| pass | ||
| return package_directory | ||
|
Comment thread
jaraco marked this conversation as resolved.
|
||
|
|
||
|
|
||
| @contextlib.contextmanager | ||
| def _tempfile(reader, suffix=''): | ||
| # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' | ||
| # blocks due to the need to close the temporary file to work on Windows | ||
| # properly. | ||
| fd, raw_path = tempfile.mkstemp(suffix=suffix) | ||
| try: | ||
| os.write(fd, reader()) | ||
| os.close(fd) | ||
| yield pathlib.Path(raw_path) | ||
| finally: | ||
| try: | ||
| os.remove(raw_path) | ||
| except FileNotFoundError: | ||
| pass | ||
|
|
||
|
|
||
| @functools.singledispatch | ||
| @contextlib.contextmanager | ||
| def as_file(path): | ||
| """ | ||
| Given a Traversable object, return that object as a | ||
| path on the local file system in a context manager. | ||
| """ | ||
| with _tempfile(path.read_bytes, suffix=path.name) as local: | ||
| yield local | ||
|
|
||
|
|
||
| @as_file.register(pathlib.Path) | ||
| @contextlib.contextmanager | ||
| def _(path): | ||
| """ | ||
| Degenerate behavior for pathlib.Path objects. | ||
| """ | ||
| yield path | ||
| Back | FazBrowse Home | New Git URL |
Uh oh!
There was an error while loading. Please reload this page.