mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-08-22 14:13:40 -07:00
Update importlib-resources==6.0.1
This commit is contained in:
parent
2878cfcf66
commit
9bd05f0c11
5 changed files with 54 additions and 160 deletions
|
@ -6,31 +6,12 @@ from ._common import (
|
||||||
Package,
|
Package,
|
||||||
)
|
)
|
||||||
|
|
||||||
from ._legacy import (
|
|
||||||
contents,
|
|
||||||
open_binary,
|
|
||||||
read_binary,
|
|
||||||
open_text,
|
|
||||||
read_text,
|
|
||||||
is_resource,
|
|
||||||
path,
|
|
||||||
Resource,
|
|
||||||
)
|
|
||||||
|
|
||||||
from .abc import ResourceReader
|
from .abc import ResourceReader
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'Package',
|
'Package',
|
||||||
'Resource',
|
|
||||||
'ResourceReader',
|
'ResourceReader',
|
||||||
'as_file',
|
'as_file',
|
||||||
'contents',
|
|
||||||
'files',
|
'files',
|
||||||
'is_resource',
|
|
||||||
'open_binary',
|
|
||||||
'open_text',
|
|
||||||
'path',
|
|
||||||
'read_binary',
|
|
||||||
'read_text',
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,120 +0,0 @@
|
||||||
import functools
|
|
||||||
import os
|
|
||||||
import pathlib
|
|
||||||
import types
|
|
||||||
import warnings
|
|
||||||
|
|
||||||
from typing import Union, Iterable, ContextManager, BinaryIO, TextIO, Any
|
|
||||||
|
|
||||||
from . import _common
|
|
||||||
|
|
||||||
Package = Union[types.ModuleType, str]
|
|
||||||
Resource = str
|
|
||||||
|
|
||||||
|
|
||||||
def deprecated(func):
|
|
||||||
@functools.wraps(func)
|
|
||||||
def wrapper(*args, **kwargs):
|
|
||||||
warnings.warn(
|
|
||||||
f"{func.__name__} is deprecated. Use files() instead. "
|
|
||||||
"Refer to https://importlib-resources.readthedocs.io"
|
|
||||||
"/en/latest/using.html#migrating-from-legacy for migration advice.",
|
|
||||||
DeprecationWarning,
|
|
||||||
stacklevel=2,
|
|
||||||
)
|
|
||||||
return func(*args, **kwargs)
|
|
||||||
|
|
||||||
return wrapper
|
|
||||||
|
|
||||||
|
|
||||||
def normalize_path(path: Any) -> str:
|
|
||||||
"""Normalize a path by ensuring it is a string.
|
|
||||||
|
|
||||||
If the resulting string contains path separators, an exception is raised.
|
|
||||||
"""
|
|
||||||
str_path = str(path)
|
|
||||||
parent, file_name = os.path.split(str_path)
|
|
||||||
if parent:
|
|
||||||
raise ValueError(f'{path!r} must be only a file name')
|
|
||||||
return file_name
|
|
||||||
|
|
||||||
|
|
||||||
@deprecated
|
|
||||||
def open_binary(package: Package, resource: Resource) -> BinaryIO:
|
|
||||||
"""Return a file-like object opened for binary reading of the resource."""
|
|
||||||
return (_common.files(package) / normalize_path(resource)).open('rb')
|
|
||||||
|
|
||||||
|
|
||||||
@deprecated
|
|
||||||
def read_binary(package: Package, resource: Resource) -> bytes:
|
|
||||||
"""Return the binary contents of the resource."""
|
|
||||||
return (_common.files(package) / normalize_path(resource)).read_bytes()
|
|
||||||
|
|
||||||
|
|
||||||
@deprecated
|
|
||||||
def open_text(
|
|
||||||
package: Package,
|
|
||||||
resource: Resource,
|
|
||||||
encoding: str = 'utf-8',
|
|
||||||
errors: str = 'strict',
|
|
||||||
) -> TextIO:
|
|
||||||
"""Return a file-like object opened for text reading of the resource."""
|
|
||||||
return (_common.files(package) / normalize_path(resource)).open(
|
|
||||||
'r', encoding=encoding, errors=errors
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@deprecated
|
|
||||||
def read_text(
|
|
||||||
package: Package,
|
|
||||||
resource: Resource,
|
|
||||||
encoding: str = 'utf-8',
|
|
||||||
errors: str = 'strict',
|
|
||||||
) -> str:
|
|
||||||
"""Return the decoded string of the resource.
|
|
||||||
|
|
||||||
The decoding-related arguments have the same semantics as those of
|
|
||||||
bytes.decode().
|
|
||||||
"""
|
|
||||||
with open_text(package, resource, encoding, errors) as fp:
|
|
||||||
return fp.read()
|
|
||||||
|
|
||||||
|
|
||||||
@deprecated
|
|
||||||
def contents(package: Package) -> Iterable[str]:
|
|
||||||
"""Return an iterable of entries in `package`.
|
|
||||||
|
|
||||||
Note that not all entries are resources. Specifically, directories are
|
|
||||||
not considered resources. Use `is_resource()` on each entry returned here
|
|
||||||
to check if it is a resource or not.
|
|
||||||
"""
|
|
||||||
return [path.name for path in _common.files(package).iterdir()]
|
|
||||||
|
|
||||||
|
|
||||||
@deprecated
|
|
||||||
def is_resource(package: Package, name: str) -> bool:
|
|
||||||
"""True if `name` is a resource inside `package`.
|
|
||||||
|
|
||||||
Directories are *not* resources.
|
|
||||||
"""
|
|
||||||
resource = normalize_path(name)
|
|
||||||
return any(
|
|
||||||
traversable.name == resource and traversable.is_file()
|
|
||||||
for traversable in _common.files(package).iterdir()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@deprecated
|
|
||||||
def path(
|
|
||||||
package: Package,
|
|
||||||
resource: Resource,
|
|
||||||
) -> ContextManager[pathlib.Path]:
|
|
||||||
"""A context manager providing a file path object to the resource.
|
|
||||||
|
|
||||||
If the resource does not already exist on its own on the file system,
|
|
||||||
a temporary file will be created. If the file was created, the file
|
|
||||||
will be deleted upon exiting the context manager (no exception is
|
|
||||||
raised if the file was deleted prior to the context manager
|
|
||||||
exiting).
|
|
||||||
"""
|
|
||||||
return _common.as_file(_common.files(package) / normalize_path(resource))
|
|
|
@ -5,9 +5,9 @@ import itertools
|
||||||
import contextlib
|
import contextlib
|
||||||
import pathlib
|
import pathlib
|
||||||
import re
|
import re
|
||||||
import fnmatch
|
|
||||||
|
|
||||||
from .py310compat import text_encoding
|
from .py310compat import text_encoding
|
||||||
|
from .glob import translate
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['Path']
|
__all__ = ['Path']
|
||||||
|
@ -298,21 +298,24 @@ class Path:
|
||||||
encoding, args, kwargs = _extract_text_encoding(*args, **kwargs)
|
encoding, args, kwargs = _extract_text_encoding(*args, **kwargs)
|
||||||
return io.TextIOWrapper(stream, encoding, *args, **kwargs)
|
return io.TextIOWrapper(stream, encoding, *args, **kwargs)
|
||||||
|
|
||||||
|
def _base(self):
|
||||||
|
return pathlib.PurePosixPath(self.at or self.root.filename)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
return pathlib.Path(self.at).name or self.filename.name
|
return self._base().name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def suffix(self):
|
def suffix(self):
|
||||||
return pathlib.Path(self.at).suffix or self.filename.suffix
|
return self._base().suffix
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def suffixes(self):
|
def suffixes(self):
|
||||||
return pathlib.Path(self.at).suffixes or self.filename.suffixes
|
return self._base().suffixes
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def stem(self):
|
def stem(self):
|
||||||
return pathlib.Path(self.at).stem or self.filename.stem
|
return self._base().stem
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def filename(self):
|
def filename(self):
|
||||||
|
@ -349,7 +352,7 @@ class Path:
|
||||||
return filter(self._is_child, subs)
|
return filter(self._is_child, subs)
|
||||||
|
|
||||||
def match(self, path_pattern):
|
def match(self, path_pattern):
|
||||||
return pathlib.Path(self.at).match(path_pattern)
|
return pathlib.PurePosixPath(self.at).match(path_pattern)
|
||||||
|
|
||||||
def is_symlink(self):
|
def is_symlink(self):
|
||||||
"""
|
"""
|
||||||
|
@ -357,22 +360,13 @@ class Path:
|
||||||
"""
|
"""
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _descendants(self):
|
|
||||||
for child in self.iterdir():
|
|
||||||
yield child
|
|
||||||
if child.is_dir():
|
|
||||||
yield from child._descendants()
|
|
||||||
|
|
||||||
def glob(self, pattern):
|
def glob(self, pattern):
|
||||||
if not pattern:
|
if not pattern:
|
||||||
raise ValueError(f"Unacceptable pattern: {pattern!r}")
|
raise ValueError(f"Unacceptable pattern: {pattern!r}")
|
||||||
|
|
||||||
matches = re.compile(fnmatch.translate(pattern)).fullmatch
|
prefix = re.escape(self.at)
|
||||||
return (
|
matches = re.compile(prefix + translate(pattern)).fullmatch
|
||||||
child
|
return map(self._next, filter(matches, self.root.namelist()))
|
||||||
for child in self._descendants()
|
|
||||||
if matches(str(child.relative_to(self)))
|
|
||||||
)
|
|
||||||
|
|
||||||
def rglob(self, pattern):
|
def rglob(self, pattern):
|
||||||
return self.glob(f'**/{pattern}')
|
return self.glob(f'**/{pattern}')
|
||||||
|
|
40
lib/zipp/glob.py
Normal file
40
lib/zipp/glob.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def translate(pattern):
|
||||||
|
r"""
|
||||||
|
Given a glob pattern, produce a regex that matches it.
|
||||||
|
|
||||||
|
>>> translate('*.txt')
|
||||||
|
'[^/]*\\.txt'
|
||||||
|
>>> translate('a?txt')
|
||||||
|
'a.txt'
|
||||||
|
>>> translate('**/*')
|
||||||
|
'.*/[^/]*'
|
||||||
|
"""
|
||||||
|
return ''.join(map(replace, separate(pattern)))
|
||||||
|
|
||||||
|
|
||||||
|
def separate(pattern):
|
||||||
|
"""
|
||||||
|
Separate out character sets to avoid translating their contents.
|
||||||
|
|
||||||
|
>>> [m.group(0) for m in separate('*.txt')]
|
||||||
|
['*.txt']
|
||||||
|
>>> [m.group(0) for m in separate('a[?]txt')]
|
||||||
|
['a', '[?]', 'txt']
|
||||||
|
"""
|
||||||
|
return re.finditer(r'([^\[]+)|(?P<set>[\[].*?[\]])|([\[][^\]]*$)', pattern)
|
||||||
|
|
||||||
|
|
||||||
|
def replace(match):
|
||||||
|
"""
|
||||||
|
Perform the replacements for a match from :func:`separate`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return match.group('set') or (
|
||||||
|
re.escape(match.group(0))
|
||||||
|
.replace('\\*\\*', r'.*')
|
||||||
|
.replace('\\*', r'[^/]*')
|
||||||
|
.replace('\\?', r'.')
|
||||||
|
)
|
|
@ -2,9 +2,8 @@ import sys
|
||||||
import io
|
import io
|
||||||
|
|
||||||
|
|
||||||
te_impl = 'lambda encoding, stacklevel=2, /: encoding'
|
def _text_encoding(encoding, stacklevel=2, /): # pragma: no cover
|
||||||
te_impl_37 = te_impl.replace(', /', '')
|
return encoding
|
||||||
_text_encoding = eval(te_impl) if sys.version_info > (3, 8) else eval(te_impl_37)
|
|
||||||
|
|
||||||
|
|
||||||
text_encoding = (
|
text_encoding = (
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue