From 178dba673b36e36ca4257ecc8f0590b81334775c Mon Sep 17 00:00:00 2001 From: "mouad.benchchaoui@deliveryhero.com" Date: Mon, 11 May 2015 15:28:54 +0200 Subject: [PATCH] Make instance_of work with tuple like isinstance and unittest's assertIsInstance --- hamcrest/core/core/isinstanceof.py | 11 ++++++++--- hamcrest/core/helpers/wrap_matcher.py | 3 +++ tests/hamcrest_unit_test/core/isinstanceof_test.py | 3 +++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/hamcrest/core/core/isinstanceof.py b/hamcrest/core/core/isinstanceof.py index c96fdf31..f8eb4a2f 100644 --- a/hamcrest/core/core/isinstanceof.py +++ b/hamcrest/core/core/isinstanceof.py @@ -11,21 +11,26 @@ class IsInstanceOf(BaseMatcher): def __init__(self, expected_type): if not is_matchable_type(expected_type): - raise TypeError('IsInstanceOf requires type') + raise TypeError('IsInstanceOf requires type or a tuple of classes and types') self.expected_type = expected_type def _matches(self, item): return isinstance(item, self.expected_type) def describe_to(self, description): + try: + type_description = self.expected_type.__name__ + except AttributeError: + type_description = "one of %s" % ",".join(str(e) for e in self.expected_type) description.append_text('an instance of ') \ - .append_text(self.expected_type.__name__) + .append_text(type_description) def instance_of(atype): """Matches if object is an instance of, or inherits from, a given type. - :param atype: The type to compare against as the expected type. + :param atype: The type to compare against as the expected type or a tuple + of types. This matcher checks whether the evaluated object is an instance of ``atype`` or an instance of any class that inherits from ``atype``. diff --git a/hamcrest/core/helpers/wrap_matcher.py b/hamcrest/core/helpers/wrap_matcher.py index 1ec9ab58..587ae4c6 100644 --- a/hamcrest/core/helpers/wrap_matcher.py +++ b/hamcrest/core/helpers/wrap_matcher.py @@ -28,4 +28,7 @@ def is_matchable_type(expected_type): if isinstance(expected_type, six.class_types): return True + if isinstance(expected_type, tuple) and all(map(is_matchable_type, expected_type)): + return True + return False