Ausgabe der neuen DB Einträge

This commit is contained in:
hubobel 2022-01-02 21:50:48 +01:00
parent bad48e1627
commit cfbbb9ee3d
2399 changed files with 843193 additions and 43 deletions

View file

@ -0,0 +1,6 @@
from hamcrest.core.assert_that import assert_that
from hamcrest.core.core import *
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"

View file

@ -0,0 +1,80 @@
import warnings
from typing import Optional, TypeVar, cast, overload
from hamcrest.core.matcher import Matcher
from hamcrest.core.string_description import StringDescription
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
# unittest integration; hide these frames from tracebacks
__unittest = True
# py.test integration; hide these frames from tracebacks
__tracebackhide__ = True
T = TypeVar("T")
@overload
def assert_that(actual: T, matcher: Matcher[T], reason: str = "") -> None:
...
@overload
def assert_that(assertion: bool, reason: str = "") -> None:
...
def assert_that(actual, matcher=None, reason=""):
"""Asserts that actual value satisfies matcher. (Can also assert plain
boolean condition.)
:param actual: The object to evaluate as the actual value.
:param matcher: The matcher to satisfy as the expected condition.
:param reason: Optional explanation to include in failure description.
``assert_that`` passes the actual value to the matcher for evaluation. If
the matcher is not satisfied, an exception is thrown describing the
mismatch.
``assert_that`` is designed to integrate well with PyUnit and other unit
testing frameworks. The exception raised for an unmet assertion is an
:py:exc:`AssertionError`, which PyUnit reports as a test failure.
With a different set of parameters, ``assert_that`` can also verify a
boolean condition:
.. function:: assert_that(assertion[, reason])
:param assertion: Boolean condition to verify.
:param reason: Optional explanation to include in failure description.
This is equivalent to the :py:meth:`~unittest.TestCase.assertTrue` method
of :py:class:`unittest.TestCase`, but offers greater flexibility in test
writing by being a standalone function.
"""
if isinstance(matcher, Matcher):
_assert_match(actual=actual, matcher=matcher, reason=reason)
else:
if isinstance(actual, Matcher):
warnings.warn("arg1 should be boolean, but was {}".format(type(actual)))
_assert_bool(assertion=cast(bool, actual), reason=cast(str, matcher))
def _assert_match(actual: T, matcher: Matcher[T], reason: str) -> None:
if not matcher.matches(actual):
description = StringDescription()
description.append_text(reason).append_text("\nExpected: ").append_description_of(
matcher
).append_text("\n but: ")
matcher.describe_mismatch(actual, description)
description.append_text("\n")
raise AssertionError(description)
def _assert_bool(assertion: bool, reason: Optional[str] = None) -> None:
if not assertion:
if not reason:
reason = "Assertion failed"
raise AssertionError(reason)

View file

@ -0,0 +1,70 @@
from typing import Any, Iterable
from hamcrest.core.description import Description
from hamcrest.core.helpers.hasmethod import hasmethod
from hamcrest.core.helpers.ismock import ismock
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
class BaseDescription(Description):
"""Base class for all :py:class:`~hamcrest.core.description.Description`
implementations.
"""
def append_text(self, text: str) -> Description:
self.append(text)
return self
def append_description_of(self, value: Any) -> Description:
if not ismock(value) and hasmethod(value, "describe_to"):
value.describe_to(self)
elif isinstance(value, str):
self.append(repr(value))
else:
description = str(value)
if description[:1] == "<" and description[-1:] == ">":
self.append(description)
else:
self.append("<")
self.append(description)
self.append(">")
return self
def append_list(self, start: str, separator: str, end: str, list: Iterable[Any]) -> Description:
separate = False
self.append(start)
for item in list:
if separate:
self.append(separator)
self.append_description_of(item)
separate = True
self.append(end)
return self
def append(self, string: str) -> None:
"""Append the string to the description."""
raise NotImplementedError("append")
def append_string_in_python_syntax(self, string: str) -> None:
self.append("'")
for ch in string:
self.append(character_in_python_syntax(ch))
self.append("'")
def character_in_python_syntax(ch: str) -> str:
if ch == "'":
return "'"
elif ch == "\n":
return "\\n"
elif ch == "\r":
return "\\r"
elif ch == "\t":
return "\\t"
else:
return ch

View file

@ -0,0 +1,41 @@
from typing import Optional, TypeVar
from hamcrest.core.description import Description
from hamcrest.core.matcher import Matcher
from hamcrest.core.string_description import tostring
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
T = TypeVar("T")
class BaseMatcher(Matcher[T]):
"""Base class for all :py:class:`~hamcrest.core.matcher.Matcher`
implementations.
Most implementations can just implement :py:obj:`_matches`, leaving the
handling of any mismatch description to the ``matches`` method. But if it
makes more sense to generate the mismatch description during the matching,
override :py:meth:`~hamcrest.core.matcher.Matcher.matches` instead.
"""
def __str__(self) -> str:
return tostring(self)
def _matches(self, item: T) -> bool:
raise NotImplementedError("_matches")
def matches(self, item: T, mismatch_description: Optional[Description] = None) -> bool:
match_result = self._matches(item)
if not match_result and mismatch_description:
self.describe_mismatch(item, mismatch_description)
return match_result
def describe_mismatch(self, item: T, mismatch_description: Description) -> None:
mismatch_description.append_text("was ").append_description_of(item)
def describe_match(self, item: T, match_description: Description) -> None:
match_description.append_text("was ").append_description_of(item)

View file

@ -0,0 +1,19 @@
__author__ = "Per Fagrell"
__copyright__ = "Copyright 2013 hamcrest.org"
__license__ = "BSD, see License.txt"
__all__ = ['is_callable']
import sys
# callable was not part of py3k until 3.2, so we create this
# generic is_callable to use callable if possible, otherwise
# we use generic homebrew.
if sys.version_info[0] == 3 and sys.version_info[1] < 2:
def is_callable(function):
"""Return whether the object is callable (i.e., some kind of function)."""
if function is None:
return False
return any("__call__" in klass.__dict__ for klass in type(function).__mro__)
else:
is_callable = callable

View file

@ -0,0 +1,17 @@
"""Fundamental matchers of objects and values, and composite matchers."""
from hamcrest.core.core.allof import all_of
from hamcrest.core.core.anyof import any_of
from hamcrest.core.core.described_as import described_as
from hamcrest.core.core.is_ import is_
from hamcrest.core.core.isanything import anything
from hamcrest.core.core.isequal import equal_to
from hamcrest.core.core.isinstanceof import instance_of
from hamcrest.core.core.isnone import none, not_none
from hamcrest.core.core.isnot import is_not, not_
from hamcrest.core.core.issame import same_instance
from hamcrest.core.core.raises import calling, raises
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"

View file

@ -0,0 +1,58 @@
from typing import Optional, TypeVar, Union
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.helpers.wrap_matcher import wrap_matcher
from hamcrest.core.matcher import Matcher
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
T = TypeVar("T")
class AllOf(BaseMatcher[T]):
def __init__(self, *matchers: Matcher[T], **kwargs):
self.matchers = matchers
self.describe_matcher_in_mismatch = kwargs.pop(
"describe_matcher_in_mismatch", True
) # No keyword-only args in 2.7 :-(
self.describe_all_mismatches = kwargs.pop("describe_all_mismatches", False)
def matches(self, item: T, mismatch_description: Optional[Description] = None) -> bool:
found_mismatch = False
for i, matcher in enumerate(self.matchers):
if not matcher.matches(item):
if mismatch_description:
if self.describe_matcher_in_mismatch:
mismatch_description.append_description_of(matcher).append_text(" ")
matcher.describe_mismatch(item, mismatch_description)
found_mismatch = True
if not self.describe_all_mismatches:
break
elif i < len(self.matchers) - 1 and mismatch_description:
mismatch_description.append_text(" and ")
return not found_mismatch
def describe_mismatch(self, item: T, mismatch_description: Description) -> None:
self.matches(item, mismatch_description)
def describe_to(self, description: Description) -> None:
description.append_list("(", " and ", ")", self.matchers)
def all_of(*items: Union[Matcher[T], T]) -> Matcher[T]:
"""Matches if all of the given matchers evaluate to ``True``.
:param matcher1,...: A comma-separated list of matchers.
The matchers are evaluated from left to right using short-circuit
evaluation, so evaluation stops as soon as a matcher returns ``False``.
Any argument that is not a matcher is implicitly wrapped in an
:py:func:`~hamcrest.core.core.isequal.equal_to` matcher to check for
equality.
"""
return AllOf(*[wrap_matcher(item) for item in items])

View file

@ -0,0 +1,42 @@
from typing import TypeVar, Union
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.helpers.wrap_matcher import wrap_matcher
from hamcrest.core.matcher import Matcher
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
T = TypeVar("T")
class AnyOf(BaseMatcher[T]):
def __init__(self, *matchers: Matcher[T]) -> None:
self.matchers = matchers
def _matches(self, item: T) -> bool:
for matcher in self.matchers:
if matcher.matches(item):
return True
return False
def describe_to(self, description: Description) -> None:
description.append_list("(", " or ", ")", self.matchers)
def any_of(*items: Union[Matcher[T], T]) -> Matcher[T]:
"""Matches if any of the given matchers evaluate to ``True``.
:param matcher1,...: A comma-separated list of matchers.
The matchers are evaluated from left to right using short-circuit
evaluation, so evaluation stops as soon as a matcher returns ``True``.
Any argument that is not a matcher is implicitly wrapped in an
:py:func:`~hamcrest.core.core.isequal.equal_to` matcher to check for
equality.
"""
return AnyOf(*[wrap_matcher(item) for item in items])

View file

@ -0,0 +1,52 @@
import re
from typing import Any, Optional, Tuple
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.matcher import Matcher
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
ARG_PATTERN = re.compile("%([0-9]+)")
class DescribedAs(BaseMatcher[Any]):
def __init__(
self, description_template: str, matcher: Matcher[Any], *values: Tuple[Any, ...]
) -> None:
self.template = description_template
self.matcher = matcher
self.values = values
def matches(self, item: Any, mismatch_description: Optional[Description] = None) -> bool:
return self.matcher.matches(item, mismatch_description)
def describe_mismatch(self, item: Any, mismatch_description: Description) -> None:
self.matcher.describe_mismatch(item, mismatch_description)
def describe_to(self, description: Description) -> None:
text_start = 0
for match in re.finditer(ARG_PATTERN, self.template):
description.append_text(self.template[text_start : match.start()])
arg_index = int(match.group()[1:])
description.append_description_of(self.values[arg_index])
text_start = match.end()
if text_start < len(self.template):
description.append_text(self.template[text_start:])
def described_as(description: str, matcher: Matcher[Any], *values) -> Matcher[Any]:
"""Adds custom failure description to a given matcher.
:param description: Overrides the matcher's description.
:param matcher: The matcher to satisfy.
:param value1,...: Optional comma-separated list of substitution values.
The description may contain substitution placeholders %0, %1, etc. These
will be replaced by any values that follow the matcher.
"""
return DescribedAs(description, matcher, *values)

View file

@ -0,0 +1,101 @@
from typing import Optional, Type, TypeVar, Union, overload
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.helpers.wrap_matcher import is_matchable_type, wrap_matcher
from hamcrest.core.matcher import Matcher
from .isinstanceof import instance_of
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
T = TypeVar("T")
class Is(BaseMatcher[T]):
def __init__(self, matcher: Matcher[T]) -> None:
self.matcher = matcher
def matches(self, item: T, mismatch_description: Optional[Description] = None) -> bool:
return self.matcher.matches(item, mismatch_description)
def describe_mismatch(self, item: T, mismatch_description: Description) -> None:
return self.matcher.describe_mismatch(item, mismatch_description)
def describe_to(self, description: Description):
description.append_description_of(self.matcher)
@overload
def _wrap_value_or_type(x: Type) -> Matcher[object]:
...
@overload
def _wrap_value_or_type(x: T) -> Matcher[T]:
...
def _wrap_value_or_type(x):
if is_matchable_type(x):
return instance_of(x)
else:
return wrap_matcher(x)
@overload
def is_(x: Type) -> Matcher[object]:
...
@overload
def is_(x: Union[Matcher[T], T]) -> Matcher[T]:
...
def is_(x):
"""Decorates another matcher, or provides shortcuts to the frequently used
``is(equal_to(x))`` and ``is(instance_of(x))``.
:param x: The matcher to satisfy, or a type for
:py:func:`~hamcrest.core.core.isinstanceof.instance_of` matching, or an
expected value for :py:func:`~hamcrest.core.core.isequal.equal_to`
matching.
This matcher compares the evaluated object to the given matcher.
.. note::
PyHamcrest's ``is_`` matcher is unrelated to Python's ``is`` operator.
The matcher for object identity is
:py:func:`~hamcrest.core.core.issame.same_instance`.
If the ``x`` argument is a matcher, its behavior is retained, but the test
may be more expressive. For example::
assert_that(value, less_than(5))
assert_that(value, is_(less_than(5)))
If the ``x`` argument is a type, it is wrapped in an
:py:func:`~hamcrest.core.core.isinstanceof.instance_of` matcher. This makes
the following statements equivalent::
assert_that(cheese, instance_of(Cheddar))
assert_that(cheese, is_(instance_of(Cheddar)))
assert_that(cheese, is_(Cheddar))
Otherwise, if the ``x`` argument is not a matcher, it is wrapped in an
:py:func:`~hamcrest.core.core.isequal.equal_to` matcher. This makes the
following statements equivalent::
assert_that(cheese, equal_to(smelly))
assert_that(cheese, is_(equal_to(smelly)))
assert_that(cheese, is_(smelly))
Choose the style that makes your expression most readable. This will vary
depending on context.
"""
return Is(_wrap_value_or_type(x))

View file

@ -0,0 +1,32 @@
from typing import Any, Optional
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.matcher import Matcher
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
class IsAnything(BaseMatcher[Any]):
def __init__(self, description: Optional[str]) -> None:
self.description = description or "ANYTHING" # type: str
def _matches(self, item: Any) -> bool:
return True
def describe_to(self, description: Description) -> None:
description.append_text(self.description)
def anything(description: Optional[str] = None) -> Matcher[Any]:
"""Matches anything.
:param description: Optional string used to describe this matcher.
This matcher always evaluates to ``True``. Specify this in composite
matchers when the value of a particular element is unimportant.
"""
return IsAnything(description)

View file

@ -0,0 +1,34 @@
from typing import Any
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.matcher import Matcher
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
class IsEqual(BaseMatcher[Any]):
def __init__(self, equals: Any) -> None:
self.object = equals
def _matches(self, item: Any) -> bool:
return item == self.object
def describe_to(self, description: Description) -> None:
nested_matcher = isinstance(self.object, Matcher)
if nested_matcher:
description.append_text("<")
description.append_description_of(self.object)
if nested_matcher:
description.append_text(">")
def equal_to(obj: Any) -> Matcher[Any]:
"""Matches if object is equal to a given object.
:param obj: The object to compare against as the expected value.
This matcher compares the evaluated object to ``obj`` for equality."""
return IsEqual(obj)

View file

@ -0,0 +1,39 @@
from typing import Type
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.helpers.wrap_matcher import is_matchable_type
from hamcrest.core.matcher import Matcher
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
class IsInstanceOf(BaseMatcher[object]):
def __init__(self, expected_type: Type) -> None:
if not is_matchable_type(expected_type):
raise TypeError("IsInstanceOf requires type")
self.expected_type = expected_type
def _matches(self, item: object) -> bool:
return isinstance(item, self.expected_type)
def describe_to(self, description: Description) -> None:
description.append_text("an instance of ").append_text(self.expected_type.__name__)
def instance_of(atype: Type) -> Matcher[object]:
"""Matches if object is an instance of, or inherits from, a given type.
:param atype: The type to compare against as the expected type.
This matcher checks whether the evaluated object is an instance of
``atype`` or an instance of any class that inherits from ``atype``.
Example::
instance_of(str)
"""
return IsInstanceOf(atype)

View file

@ -0,0 +1,29 @@
from typing import Any, Optional
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.matcher import Matcher
from .isnot import is_not
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
class IsNone(BaseMatcher[Optional[Any]]):
def _matches(self, item: Any) -> bool:
return item is None
def describe_to(self, description: Description) -> None:
description.append_text("None")
def none() -> Matcher[Optional[Any]]:
"""Matches if object is ``None``."""
return IsNone()
def not_none() -> Matcher[Optional[Any]]:
"""Matches if object is not ``None``."""
return is_not(none())

View file

@ -0,0 +1,86 @@
from typing import Type, TypeVar, Union, overload
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.helpers.wrap_matcher import is_matchable_type, wrap_matcher
from hamcrest.core.matcher import Matcher
from .isinstanceof import instance_of
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
T = TypeVar("T")
class IsNot(BaseMatcher[T]):
def __init__(self, matcher: Matcher[T]) -> None:
self.matcher = matcher
def _matches(self, item: T) -> bool:
return not self.matcher.matches(item)
def describe_to(self, description: Description) -> None:
description.append_text("not ").append_description_of(self.matcher)
def describe_mismatch(self, item: T, mismatch_description: Description) -> None:
mismatch_description.append_text("but ")
self.matcher.describe_match(item, mismatch_description)
@overload
def _wrap_value_or_type(x: Type) -> Matcher[object]:
...
@overload
def _wrap_value_or_type(x: T) -> Matcher[T]:
...
def _wrap_value_or_type(x):
if is_matchable_type(x):
return instance_of(x)
else:
return wrap_matcher(x)
@overload
def is_not(match: Type) -> Matcher[object]:
...
@overload
def is_not(match: Union[Matcher[T], T]) -> Matcher[T]:
...
def is_not(match):
"""Inverts the given matcher to its logical negation.
:param match: The matcher to negate.
This matcher compares the evaluated object to the negation of the given
matcher. If the ``match`` argument is not a matcher, it is implicitly
wrapped in an :py:func:`~hamcrest.core.core.isequal.equal_to` matcher to
check for equality, and thus matches for inequality.
Examples::
assert_that(cheese, is_not(equal_to(smelly)))
assert_that(cheese, is_not(smelly))
"""
return IsNot(_wrap_value_or_type(match))
def not_(match: Union[Matcher[T], T]) -> Matcher[T]:
"""Alias of :py:func:`is_not` for better readability of negations.
Examples::
assert_that(alist, not_(has_item(item)))
"""
return is_not(match)

View file

@ -0,0 +1,42 @@
from typing import TypeVar
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.matcher import Matcher
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
T = TypeVar("T")
class IsSame(BaseMatcher[T]):
def __init__(self, obj: T) -> None:
self.object = obj
def _matches(self, item: T) -> bool:
return item is self.object
def describe_to(self, description: Description) -> None:
description.append_text("same instance as ").append_text(hex(id(self.object))).append_text(
" "
).append_description_of(self.object)
def describe_mismatch(self, item: T, mismatch_description: Description) -> None:
mismatch_description.append_text("was ")
if item is not None:
mismatch_description.append_text(hex(id(item))).append_text(" ")
mismatch_description.append_description_of(item)
def same_instance(obj: T) -> Matcher[T]:
"""Matches if evaluated object is the same instance as a given object.
:param obj: The object to compare against as the expected value.
This matcher invokes the ``is`` identity operator to determine if the
evaluated object is the the same object as ``obj``.
"""
return IsSame(obj)

View file

@ -0,0 +1,141 @@
import re
import sys
from typing import Any, Callable, Mapping, Optional, Tuple, Type, cast
from weakref import ref
from hamcrest.core.base_matcher import BaseMatcher
from hamcrest.core.description import Description
from hamcrest.core.matcher import Matcher
__author__ = "Per Fagrell"
__copyright__ = "Copyright 2013 hamcrest.org"
__license__ = "BSD, see License.txt"
class Raises(BaseMatcher[Callable[..., Any]]):
def __init__(
self,
expected: Type[Exception],
pattern: Optional[str] = None,
matching: Optional[Matcher] = None,
) -> None:
self.pattern = pattern
self.matcher = matching
self.expected = expected
self.actual = None # type: Optional[BaseException]
self.function = None # type: Optional[Callable[..., Any]]
def _matches(self, function: Callable[..., Any]) -> bool:
if not callable(function):
return False
self.function = cast(Callable[..., Any], ref(function))
return self._call_function(function)
def _call_function(self, function: Callable[..., Any]) -> bool:
self.actual = None
try:
function()
except BaseException:
self.actual = sys.exc_info()[1]
if isinstance(self.actual, self.expected):
if self.pattern is not None:
if re.search(self.pattern, str(self.actual)) is None:
return False
if self.matcher is not None:
if not self.matcher.matches(self.actual):
return False
return True
return False
def describe_to(self, description: Description) -> None:
description.append_text("Expected a callable raising %s" % self.expected)
def describe_mismatch(self, item, description: Description) -> None:
if not callable(item):
description.append_text("%s is not callable" % item)
return
function = None if self.function is None else self.function()
if function is None or function is not item:
self.function = ref(item)
if not self._call_function(item):
return
if self.actual is None:
description.append_text("No exception raised.")
elif isinstance(self.actual, self.expected):
if self.pattern is not None or self.matcher is not None:
description.append_text("Correct assertion type raised, but ")
if self.pattern is not None:
description.append_text('the expected pattern ("%s") ' % self.pattern)
if self.pattern is not None and self.matcher is not None:
description.append_text("and ")
if self.matcher is not None:
description.append_description_of(self.matcher)
description.append_text(" ")
description.append_text('not found. Exception message was: "%s"' % str(self.actual))
else:
description.append_text(
"%r of type %s was raised instead" % (self.actual, type(self.actual))
)
def describe_match(self, item, match_description: Description) -> None:
self._call_function(item)
match_description.append_text(
"%r of type %s was raised." % (self.actual, type(self.actual))
)
def raises(exception: Type[Exception], pattern=None, matching=None) -> Matcher[Callable[..., Any]]:
"""Matches if the called function raised the expected exception.
:param exception: The class of the expected exception
:param pattern: Optional regular expression to match exception message.
:param matching: Optional Hamcrest matchers to apply to the exception.
Expects the actual to be wrapped by using :py:func:`~hamcrest.core.core.raises.calling`,
or a callable taking no arguments.
Optional argument pattern should be a string containing a regular expression. If provided,
the string representation of the actual exception - e.g. `str(actual)` - must match pattern.
Examples::
assert_that(calling(int).with_args('q'), raises(TypeError))
assert_that(calling(parse, broken_input), raises(ValueError))
assert_that(
calling(valid_user, bad_json),
raises(HTTPError, matching=has_properties(status_code=500)
)
"""
return Raises(exception, pattern, matching)
class DeferredCallable(object):
def __init__(self, func: Callable[..., Any]):
self.func = func
self.args = tuple() # type: Tuple[Any, ...]
self.kwargs = {} # type: Mapping[str, Any]
def __call__(self):
self.func(*self.args, **self.kwargs)
def with_args(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
return self
def calling(func: Callable[..., Any]) -> DeferredCallable:
"""Wrapper for function call that delays the actual execution so that
:py:func:`~hamcrest.core.core.raises.raises` matcher can catch any thrown exception.
:param func: The function or method to be called
The arguments can be provided with a call to the `with_args` function on the returned
object::
calling(my_method).with_args(arguments, and_='keywords')
"""
return DeferredCallable(func)

View file

@ -0,0 +1,50 @@
from typing import Any, Iterable, Sequence
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
class Description:
"""A description of a :py:class:`~hamcrest.core.matcher.Matcher`.
A :py:class:`~hamcrest.core.matcher.Matcher` will describe itself to a
description which can later be used for reporting.
"""
def append_text(self, text: str) -> "Description":
"""Appends some plain text to the description.
:returns: ``self``, for chaining
"""
raise NotImplementedError("append_text")
def append_description_of(self, value: Any) -> "Description":
"""Appends description of given value to this description.
If the value implements
:py:meth:`~hamcrest.core.selfdescribing.SelfDescribing.describe_to`,
then it will be used.
:returns: ``self``, for chaining
"""
raise NotImplementedError("append_description_of")
def append_list(
self, start: str, separator: str, end: str, list: Iterable[Any]
) -> "Description":
"""Appends a list of objects to the description.
:param start: String that will begin the list description.
:param separator: String that will separate each object in the
description.
:param end: String that will end the list description.
:param list: List of objects to be described.
:returns: ``self``, for chaining
"""
raise NotImplementedError("append_list")

View file

@ -0,0 +1,5 @@
"""Utilities for writing Matchers."""
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"

View file

@ -0,0 +1,12 @@
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
def hasmethod(obj: object, methodname: str) -> bool:
"""Does ``obj`` have a method named ``methodname``?"""
if not hasattr(obj, methodname):
return False
method = getattr(obj, methodname)
return callable(method)

View file

@ -0,0 +1,19 @@
from typing import Any, List, Type
MOCKTYPES = [] # type: List[Type]
try:
from mock import Mock
MOCKTYPES += [Mock]
except ImportError:
pass
try:
from unittest.mock import Mock
MOCKTYPES += [Mock]
except ImportError:
pass
def ismock(obj: Any) -> bool:
return isinstance(obj, tuple(MOCKTYPES))

View file

@ -0,0 +1,30 @@
from typing import Type, TypeVar, Union
from hamcrest.core.base_matcher import Matcher
from hamcrest.core.core.isequal import equal_to
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
T = TypeVar("T")
def wrap_matcher(x: Union[Matcher[T], T]) -> Matcher[T]:
"""Wraps argument in a matcher, if necessary.
:returns: the argument as-is if it is already a matcher, otherwise wrapped
in an :py:func:`~hamcrest.core.core.isequal.equal_to` matcher.
"""
if isinstance(x, Matcher):
return x
else:
return equal_to(x)
def is_matchable_type(expected_type: Type) -> bool:
if isinstance(expected_type, type):
return True
return False

View file

@ -0,0 +1,74 @@
from typing import Generic, Optional, TypeVar
from hamcrest.core.description import Description
from .selfdescribing import SelfDescribing
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
T = TypeVar("T")
class Matcher(Generic[T], SelfDescribing):
"""A matcher over acceptable values.
A matcher is able to describe itself to give feedback when it fails.
Matcher implementations should *not* directly implement this protocol.
Instead, *extend* the :py:class:`~hamcrest.core.base_matcher.BaseMatcher`
class, which will ensure that the
:py:class:`~hamcrest.core.matcher.Matcher` API can grow to support new
features and remain compatible with all
:py:class:`~hamcrest.core.matcher.Matcher` implementations.
"""
def matches(self, item: T, mismatch_description: Optional[Description] = None) -> bool:
"""Evaluates the matcher for argument item.
If a mismatch is detected and argument ``mismatch_description`` is
provided, it will generate a description of why the matcher has not
accepted the item.
:param item: The object against which the matcher is evaluated.
:param mismatch_description:
:returns: ``True`` if ``item`` matches, otherwise ``False``.
"""
raise NotImplementedError("matches")
def describe_mismatch(self, item: T, mismatch_description: Description) -> None:
"""Generates a description of why the matcher has not accepted the
item.
The description will be part of a larger description of why a matching
failed, so it should be concise.
This method assumes that ``matches(item)`` is ``False``, but will not
check this.
:param item: The item that the
:py:class:`~hamcrest.core.matcher.Matcher` has rejected.
:param mismatch_description: The description to be built or appended
to.
"""
raise NotImplementedError("describe_mismatch")
def describe_match(self, item: T, match_description: Description) -> None:
"""Generates a description of why the matcher has accepted the item.
The description may be part of a larger description of why a matching
failed, so it should be concise.
This method assumes that ``matches(item)`` is ``True``, but will not
check this.
:param item: The item that the
:py:class:`~hamcrest.core.matcher.Matcher` has accepted.
:param match_description: The description to be built or appended to.
"""
raise NotImplementedError("describe_match")

View file

@ -0,0 +1,20 @@
from hamcrest.core.description import Description
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
class SelfDescribing:
"""The ability of an object to describe itself."""
def describe_to(self, description: Description) -> None:
"""Generates a description of the object.
The description may be part of a description of a larger object of
which this is just a component, so it should be worded appropriately.
:param description: The description to be built or appended to.
"""
raise NotImplementedError("describe_to")

View file

@ -0,0 +1,28 @@
import warnings
from typing import Any
from hamcrest.core.description import Description
from hamcrest.core.selfdescribing import SelfDescribing
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
class SelfDescribingValue(SelfDescribing):
"""Wrap any value in a ``SelfDescribingValue`` to satisfy the
:py:class:`~hamcrest.core.selfdescribing.SelfDescribing` interface.
**Deprecated:** No need for this class now that
:py:meth:`~hamcrest.core.description.Description.append_description_of`
handles any type of value.
"""
def __init__(self, value: Any) -> None:
warnings.warn("SelfDescribingValue no longer needed", DeprecationWarning)
self.value = value
def describe_to(self, description: Description) -> None:
"""Generates a description of the value."""
description.append_description_of(self.value)

View file

@ -0,0 +1,35 @@
from hamcrest.core.selfdescribing import SelfDescribing
from .base_description import BaseDescription
__author__ = "Jon Reid"
__copyright__ = "Copyright 2011 hamcrest.org"
__license__ = "BSD, see License.txt"
def tostring(selfdescribing: SelfDescribing) -> str:
"""Returns the description of a
:py:class:`~hamcrest.core.selfdescribing.SelfDescribing` object as a
string.
:param selfdescribing: The object to be described.
:returns: The description of the object.
"""
return str(StringDescription().append_description_of(selfdescribing))
class StringDescription(BaseDescription):
"""A :py:class:`~hamcrest.core.description.Description` that is stored as a
string.
"""
def __init__(self) -> None:
self.out = ""
def __str__(self) -> str:
"""Returns the description."""
return self.out
def append(self, string: str) -> None:
self.out += str(string)