Source code for elasticai.creator.file_generation.resource_utils
from collections.abc import Iterator
from importlib import resources
from pathlib import Path, PurePath
from typing import ContextManager
PathType = str | PurePath
Package = resources.Package
[docs]
def get_file_from_package(package: Package, file_name: str) -> ContextManager[Path]:
"""
This is a context manager, because the returned file might be extracted from a zip file and the context manager
will take care of removing the resulting temporary files on __exit__
"""
for resource in resources.files(package).iterdir():
if resource.name == file_name:
return resources.as_file(resource)
raise FileNotFoundError(
f"The file '{file_name}' in package '{package}' does not exist."
)
[docs]
def read_text(package: Package, file_name: str) -> Iterator[str]:
with get_file_from_package(package, file_name) as file:
with open(file, "r") as opened_file:
yield from map(lambda line: line.rstrip("\n"), opened_file)
def _read_bytes(package: Package, file_name: str) -> Iterator[bytes]:
with get_file_from_package(package, file_name) as file:
with open(file, "rb") as opened_file:
yield from opened_file
[docs]
def copy_file(package: Package, file_name: str, destination: PathType) -> None:
with open(destination, "wb") as out_file:
for data in _read_bytes(package=package, file_name=file_name):
out_file.write(data)
[docs]
def get_full_path(package: Package, file_name: str) -> str:
with get_file_from_package(package, file_name) as file:
return file.as_posix()
[docs]
def read_text_from_path(path: PathType, encoding: str = "utf-8") -> str:
with open(path, "r", encoding=encoding) as inp_file:
return inp_file.read()
[docs]
def save_text_to_path(text: str, path: PathType, encoding: str = "utf-8") -> None:
with open(path, "w", encoding=encoding) as out_file:
out_file.write(text)