Source code for blissoda.resources
import os
import shutil
import sys
import tempfile
from contextlib import contextmanager
from pathlib import Path
from typing import Generator
if sys.version_info < (3, 9):
import importlib_resources
else:
import importlib.resources as importlib_resources
[docs]
@contextmanager
def resource_path(*args) -> Generator[Path, None, None]:
"""The resource is specified relative to `blissoda.resources`.
.. code-block:: python
with resource_path("exafs", "exafs.ows") a path:
...
"""
source = importlib_resources.files(__name__).joinpath(*args)
with importlib_resources.as_file(source) as path:
if not path.is_file():
raise FileNotFoundError(f"Not a blissoda resource file: '{path}'")
yield path
[docs]
def resource_filename(*args) -> str:
"""The resource is specified relative to `blissoda.resources`.
.. code-block:: python
filename = resource_filename("exafs", "exafs.ows")
"""
with resource_path(*args) as path:
pass
if not path.exists():
# resource was extract from zip: copy for persistency
with resource_path(*args) as path:
path_copy = Path(tempfile.mkdtemp()) / path.name
shutil.copyfile(str(path), str(path_copy))
path = path_copy
return str(path)
[docs]
def copy_resource_glob(*args: str, dest_dir: Path = Path(".")) -> None:
r"""
Copy all resource files matching the given glob pattern to the destination directory.
:param args: A glob pattern, e.g. ``('xrpd', '*.json')`` or ``('exafs', '*.ows')``.
:param dest_dir: The directory where the files will be copied (default: current directory).
"""
dest_dir = Path(dest_dir)
dest_dir.mkdir(parents=True, exist_ok=True)
resources_root = importlib_resources.files(__name__)
for resource in resources_root.rglob(os.path.join(*args)):
if resource.is_file():
with importlib_resources.as_file(resource) as src_path:
shutil.copy(src_path, dest_dir / src_path.name)