1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#!/usr/bin/env python3
# --------------------( LICENSE )--------------------
# Copyright (c) 2014-2025 Beartype authors.
# See "LICENSE" for further details.
'''
**Hear beartype tests roar** as it handles errors and warnings.
This submodule defines hierarchies of :mod:`beartype_test`-specific exceptions
and warnings emitted by unit and functional tests and fixtures.
'''
# ....................{ IMPORTS }....................
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# WARNING: To avoid polluting the public module namespace, external attributes
# should be locally imported at module scope *ONLY* under alternate private
# names (e.g., "from argparse import ArgumentParser as _ArgumentParser" rather
# than merely "from argparse import ArgumentParser").
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
from abc import ABCMeta as _ABCMeta
from beartype.roar import BeartypeException
from beartype._data.hint.datahinttyping import TypeException
from contextlib import contextmanager
from pytest import raises
# ....................{ CONTEXTS }....................
@contextmanager
def raises_uncached(exception_cls: TypeException) -> 'ExceptionInfo':
'''
Context manager validating that the block exercised by this manager raises
an **unmemoized exception** (i.e., whose message previously containing one
or more instances of the magic
:data:`beartype._data.error.dataerrmagic.EXCEPTION_PLACEHOLDER` substring
since replaced by the
:func:`beartype._util.error.utilerrraise.reraise_exception_placeholder`
function) of the passed type.
Parameters
----------
exception_cls : str
Type of cached exception expected to be raised by this block.
Returns
-------
:class:`pytest.nodes.ExceptionInfo`
:mod:`pytest`-specific object collecting metadata on the cached
exception of this type raised by this block.
See Also
--------
https://docs.pytest.org/en/stable/reference.html#pytest._code.ExceptionInfo
Official :class:`pytest.nodes.ExceptionInfo` documentation.
'''
# Defer test-specific imports.
from beartype._data.error.dataerrmagic import EXCEPTION_PLACEHOLDER
# Within a "pytest"-specific context manager validating this contextual
# block to raise an exception of this type, perform the body of that block.
with raises(exception_cls) as exception_info:
yield exception_info
# Exception message raised by the body of that block.
exception_message = str(exception_info.value)
# Assert this exception message does *NOT* contain this magic substring.
assert EXCEPTION_PLACEHOLDER not in exception_message
#FIXME: Inadvisable in the general case, but preserved for posterity.
# Assert this exception message does *NOT* contain two concurrent spaces,
# implying an upstream failure in substring concatenation.
# assert ' ' not in exception_message
# ....................{ SUPERCLASS }....................
class BeartypeTestException(BeartypeException, metaclass=_ABCMeta):
'''
Abstract base class of all **beartype test exceptions.**
Instances of subclasses of this exception are raised at test time from
:mod:`beartype_test`-specific unit and functional tests and fixtures.
'''
pass
class BeartypeTestPathException(BeartypeTestException):
'''
**Beartype test path exception.**
This exception is raised at test time from callables and classes defined by
the :mod:`beartype_test._util.path` subpackage.
'''
pass
class BeartypeTestMarkException(BeartypeTestException):
'''
**Beartype test mark exception.**
This exception is raised at test time from decorators defined by the
:mod:`beartype_test._util.mark` subpackage.
'''
pass
|