"""Simplified function-based API for importlib.resources""" import warnings from ._common import files, as_file _MISSING = object() def open_binary(anchor, *path_names): """Open for binary reading the *resource* within *package*.""" return _get_resource(anchor, path_names).open('rb') def open_text(anchor, *path_names, encoding=_MISSING, errors='strict'): """Open for text reading the *resource* within *package*.""" encoding = _get_encoding_arg(path_names, encoding) resource = _get_resource(anchor, path_names) return resource.open('r', encoding=encoding, errors=errors) def read_binary(anchor, *path_names): """Read and return contents of *resource* within *package* as bytes.""" return _get_resource(anchor, path_names).read_bytes() def read_text(anchor, *path_names, encoding=_MISSING, errors='strict'): """Read and return contents of *resource* within *package* as str.""" encoding = _get_encoding_arg(path_names, encoding) resource = _get_resource(anchor, path_names) return resource.read_text(encoding=encoding, errors=errors) def path(anchor, *path_names): """Return the path to the *resource* as an actual file system path.""" return as_file(_get_resource(anchor, path_names)) def is_resource(anchor, *path_names): """Return ``True`` if there is a resource named *name* in the package, Otherwise returns ``False``. """ return _get_resource(anchor, path_names).is_file() def contents(anchor, *path_names): """Return an iterable over the named resources within the package. The iterable returns :class:`str` resources (e.g. files). The iterable does not recurse into subdirectories. """ warnings.warn( "importlib.resources.contents is deprecated. " "Use files(anchor).iterdir() instead.", DeprecationWarning, stacklevel=1, ) return (resource.name for resource in _get_resource(anchor, path_names).iterdir()) def _get_encoding_arg(path_names, encoding): # For compatibility with versions where *encoding* was a positional # argument, it needs to be given explicitly when there are multiple # *path_names*. # This limitation can be removed in Python 3.15. if encoding is _MISSING: if len(path_names) > 1: raise TypeError( "'encoding' argument required with multiple path names", ) else: return 'utf-8' return encoding def _get_resource(anchor, path_names): if anchor is None: raise TypeError("anchor must be module or string, got None") return files(anchor).joinpath(*path_names)