Source code for est.resources
import os
import sys
import tempfile
from pathlib import Path
from typing import Optional, Generator
from contextlib import contextmanager
if sys.version_info < (3, 9):
import importlib_resources
else:
import importlib.resources as importlib_resources
from .generate import save_3d_exafs
[docs]
@contextmanager
def resource_path(*args) -> Generator[Path, None, None]:
"""The resource is specified relative to the package "est.resources".
.. code-block:: python
with resource_path("icons", "est.png") a path:
...
"""
source = importlib_resources.files(__name__).joinpath(*args)
with importlib_resources.as_file(source) as path:
yield path
[docs]
def generate_resource(
*args,
cache: bool = True,
overwrite: bool = False,
output_directory: Optional[str] = None,
word="EXAMPLE",
) -> Path:
"""Generate the derived resource from project `resource` when it does not
exist or when `overwrite=True`. The directory in which the resource is
located in either
* the directory specified by argument `output_directory`
* the user's cache directory (`cache=True`, this is the default)
* a temporary directory (`cache=False`)
"""
with resource_path(*args) as infile:
assert infile.parent.name == "exafs"
outname = infile.stem + ".h5"
if output_directory:
outdir = Path(output_directory)
elif cache:
outdir = get_user_resource_dir()
else:
outdir = Path(tempfile.gettempdir())
outfile = outdir / outname
if not outfile.exists() or overwrite:
save_3d_exafs(infile, outfile, word=word)
return outfile
[docs]
def get_user_resource_dir() -> Path:
path = get_user_cache_dir() / "resources"
path.mkdir(parents=True, exist_ok=True)
return path
[docs]
def get_user_cache_dir() -> Path:
home = Path().home()
if sys.platform == "darwin":
path = home / "Library" / "Caches"
elif sys.platform == "win32":
path = home / "AppData" / "Local"
path = os.getenv("APPDATA", path)
elif os.name == "posix":
path = home / ".cache"
path = os.getenv("XDG_CACHE_HOME", path)
else:
path = home / ".cache"
if sys.platform == "win32":
# On Windows cache and data dir are the same.
# Microsoft suggest using a Cache subdirectory
return path / "est" / "Cache"
else:
return path / "est"