from array import array from collections import OrderedDict from collections import deque from collections import namedtuple from decimal import Decimal from socket import _socket from socket import socket import py import six from hunter.util import safe_repr try: from inspect import getattr_static except ImportError: from hunter.backports.inspect import getattr_static MyTuple = namedtuple("MyTuple", "a b") class Dict(dict): pass class List(list): pass class Set(set): pass Stuff = namedtuple('Stuff', 'a b') class Foobar(object): __slots__ = () __repr__ = lambda _: "Foo-bar" class Bad1: def __repr__(self): raise Exception("Bad!") def method(self): pass class Bad2(object): def __repr__(self): raise Exception("Bad!") def method(self): pass def test_safe_repr(): data = { 'a': [set('b')], ('c',): deque(['d']), 'e': _socket.socket(), 1: array('d', [1, 2]), frozenset('f'): socket(), 'g': Dict({ 'a': List('123'), 'b': Set([Decimal('1.0')]), 'c': Stuff(1, 2), 'd': Exception(1, 2, { 'a': safe_repr, 'b': Foobar, 'c': Bad2(), 'ct': Bad2, }) }), 'od': OrderedDict({'a': 'b'}), 'nt': MyTuple(1, 2), 'bad1': Bad1().method, 'bad2': Bad2().method } print(safe_repr(data)) print(safe_repr([data])) print(safe_repr([[data]])) print(safe_repr([[[data]]])) print(safe_repr([[[[data]]]])) print(safe_repr([[[[[data]]]]])) assert safe_repr(py.io).startswith('