def test_not_failing_with_safe_variant(): default = object() assert default is deep.get(a, 'x', default=default) assert default is deep.get(a, 'l.2', default=default) assert default is deep.get(a, 'd.x', default=default) assert (default, default) == deep.get(a, 'l.2 d.x', default=default) assert None is deep.get.safe(a, 'x') assert None is deep.get.safe(a, 'l.2') assert None is deep.get.safe(a, 'd.x') assert (None, None) == deep.get.safe(a, 'l.2 d.x')
def test_failing(): with pytest.raises(AttributeError): deep.get(a, 'x') with pytest.raises(IndexError): deep.get(a, 'l.2') with pytest.raises(KeyError): deep.get(a, 'd.x')
def assert_equal_struct(obj, expected_obj, namepaths=None, expected_namepaths=None, msg=None): """ The values on *expected_obj* are equal to those from *obj* If *namepaths* is given, only those attributes are compared. If *namepaths* isn't given, it is assumed as: * *expected_obj*.keys() if *expected_obj* is a dict or * range(len(*expected_obj*) if *expected_obj is a Sequence else * *expected_obj*.__dict__.keys(), filtered by all names that don't start with underscore. If *expected_namepaths* is given, *namepaths* at *obj* are compared with *expected_namepaths* on *expected_obj* in same order. Utilizes nicepy.deep.get, so *namepaths* and *expected_namepaths* can stand for attributes, or keys of a dict, or even indizes as strings for a list. """ is_sequence = isinstance(expected_obj, Sequence) if not namepaths: if isinstance(expected_obj, dict): namepaths = expected_obj.keys() elif is_sequence: namepaths = map(str, range(len(expected_obj))) else: namepaths = filter(lambda a: not a.startswith('_'), expected_obj.__dict__) values = get(obj, namepaths, one_as_tuple=True) if is_sequence and not expected_namepaths: expected_values = expected_obj[:len(namepaths)] else: expected_values = get(expected_obj, expected_namepaths or namepaths, one_as_tuple=True) standard_msg = get_failed_msg(eq, values, expected_values, namepaths, expected_namepaths) if standard_msg: raise AssertionError(msg or standard_msg)
def test_namepaths(): assert a is deep.get(a) assert a is deep.get(a, '') # attributes assert a is deep.get(a.b, 'a') assert a is deep.get(a, 'b.a') # list indices assert a.l == deep.get(a, 'l') assert a.b is deep.get(a.l, '0') assert c.b is deep.get(a.l, '1') assert a.b is deep.get(a, 'l.0') assert c.b is deep.get(a, 'l.1') # dict values assert a.d == deep.get(a, 'd') assert a.b is deep.get(a.d, 'a') assert c.b is deep.get(a.d, 'c') assert a.b is deep.get(a, 'd.a') assert c.b is deep.get(a, 'd.c') # all together assert c.b is deep.get(a, 'l.0.a.d.c') # multiple at once assert (a.b, c.b) == deep.get(a, ('l.0', 'l.1')) assert (a.b, c.b) == deep.get(a, ('l.0 l.1'))