Merge pull request #11915 from bluetech/compat-string-types
compat: a couple of minor cleanups
This commit is contained in:
commit
e28f35c296
|
@ -177,25 +177,13 @@ _non_printable_ascii_translate_table.update(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _translate_non_printable(s: str) -> str:
|
|
||||||
return s.translate(_non_printable_ascii_translate_table)
|
|
||||||
|
|
||||||
|
|
||||||
STRING_TYPES = bytes, str
|
|
||||||
|
|
||||||
|
|
||||||
def _bytes_to_ascii(val: bytes) -> str:
|
|
||||||
return val.decode("ascii", "backslashreplace")
|
|
||||||
|
|
||||||
|
|
||||||
def ascii_escaped(val: bytes | str) -> str:
|
def ascii_escaped(val: bytes | str) -> str:
|
||||||
r"""If val is pure ASCII, return it as an str, otherwise, escape
|
r"""If val is pure ASCII, return it as an str, otherwise, escape
|
||||||
bytes objects into a sequence of escaped bytes:
|
bytes objects into a sequence of escaped bytes:
|
||||||
|
|
||||||
b'\xc3\xb4\xc5\xd6' -> r'\xc3\xb4\xc5\xd6'
|
b'\xc3\xb4\xc5\xd6' -> r'\xc3\xb4\xc5\xd6'
|
||||||
|
|
||||||
and escapes unicode objects into a sequence of escaped unicode
|
and escapes strings into a sequence of escaped unicode ids, e.g.:
|
||||||
ids, e.g.:
|
|
||||||
|
|
||||||
r'4\nV\U00043efa\x0eMXWB\x1e\u3028\u15fd\xcd\U0007d944'
|
r'4\nV\U00043efa\x0eMXWB\x1e\u3028\u15fd\xcd\U0007d944'
|
||||||
|
|
||||||
|
@ -206,10 +194,10 @@ def ascii_escaped(val: bytes | str) -> str:
|
||||||
a UTF-8 string.
|
a UTF-8 string.
|
||||||
"""
|
"""
|
||||||
if isinstance(val, bytes):
|
if isinstance(val, bytes):
|
||||||
ret = _bytes_to_ascii(val)
|
ret = val.decode("ascii", "backslashreplace")
|
||||||
else:
|
else:
|
||||||
ret = val.encode("unicode_escape").decode("ascii")
|
ret = val.encode("unicode_escape").decode("ascii")
|
||||||
return _translate_non_printable(ret)
|
return ret.translate(_non_printable_ascii_translate_table)
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
|
|
|
@ -50,7 +50,6 @@ from _pytest.compat import is_generator
|
||||||
from _pytest.compat import NOTSET
|
from _pytest.compat import NOTSET
|
||||||
from _pytest.compat import safe_getattr
|
from _pytest.compat import safe_getattr
|
||||||
from _pytest.compat import safe_isclass
|
from _pytest.compat import safe_isclass
|
||||||
from _pytest.compat import STRING_TYPES
|
|
||||||
from _pytest.config import Config
|
from _pytest.config import Config
|
||||||
from _pytest.config import ExitCode
|
from _pytest.config import ExitCode
|
||||||
from _pytest.config import hookimpl
|
from _pytest.config import hookimpl
|
||||||
|
@ -998,7 +997,7 @@ class IdMaker:
|
||||||
def _idval_from_value(self, val: object) -> Optional[str]:
|
def _idval_from_value(self, val: object) -> Optional[str]:
|
||||||
"""Try to make an ID for a parameter in a ParameterSet from its value,
|
"""Try to make an ID for a parameter in a ParameterSet from its value,
|
||||||
if the value type is supported."""
|
if the value type is supported."""
|
||||||
if isinstance(val, STRING_TYPES):
|
if isinstance(val, (str, bytes)):
|
||||||
return _ascii_escaped_by_config(val, self.config)
|
return _ascii_escaped_by_config(val, self.config)
|
||||||
elif val is None or isinstance(val, (float, int, bool, complex)):
|
elif val is None or isinstance(val, (float, int, bool, complex)):
|
||||||
return str(val)
|
return str(val)
|
||||||
|
|
|
@ -24,7 +24,6 @@ from typing import TypeVar
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
import _pytest._code
|
import _pytest._code
|
||||||
from _pytest.compat import STRING_TYPES
|
|
||||||
from _pytest.outcomes import fail
|
from _pytest.outcomes import fail
|
||||||
|
|
||||||
|
|
||||||
|
@ -721,15 +720,10 @@ def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> ApproxBase:
|
||||||
elif (
|
elif (
|
||||||
hasattr(expected, "__getitem__")
|
hasattr(expected, "__getitem__")
|
||||||
and isinstance(expected, Sized)
|
and isinstance(expected, Sized)
|
||||||
# Type ignored because the error is wrong -- not unreachable.
|
and not isinstance(expected, (str, bytes))
|
||||||
and not isinstance(expected, STRING_TYPES) # type: ignore[unreachable]
|
|
||||||
):
|
):
|
||||||
cls = ApproxSequenceLike
|
cls = ApproxSequenceLike
|
||||||
elif (
|
elif isinstance(expected, Collection) and not isinstance(expected, (str, bytes)):
|
||||||
isinstance(expected, Collection)
|
|
||||||
# Type ignored because the error is wrong -- not unreachable.
|
|
||||||
and not isinstance(expected, STRING_TYPES) # type: ignore[unreachable]
|
|
||||||
):
|
|
||||||
msg = f"pytest.approx() only supports ordered sequences, but got: {expected!r}"
|
msg = f"pytest.approx() only supports ordered sequences, but got: {expected!r}"
|
||||||
raise TypeError(msg)
|
raise TypeError(msg)
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue