| 
									
										
										
										
											2024-04-05 13:55:59 +02:00
										 |  |  | """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, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2024-08-15 21:57:07 +02:00
										 |  |  |     return (resource.name for resource in _get_resource(anchor, path_names).iterdir()) | 
					
						
							| 
									
										
										
										
											2024-04-05 13:55:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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) |