mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	 5ac14eeea6
			
		
	
	
		5ac14eeea6
		
			
		
	
	
	
	
		
			
			gh-116608: Apply style and compatibility changes from importlib_metadata. (GH-123028)
(cherry picked from commit e913d2c87f)
Co-authored-by: Jason R. Coombs <jaraco@jaraco.com>
		
	
			
		
			
				
	
	
		
			81 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """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)
 |