Source code for voyeur

# coding=utf-8
"""
Copyright 2013, Gilles Devaux

All rights reserved.

"""


[docs]def get_value(obj, key): """ Get a value from different type of objects :param obj: The object to get a value from :param key: The key :return: The value you want from the object """ try: return obj[key] except (KeyError, TypeError): return getattr(obj, key)
from voyeur.types import Type
[docs]def view(data, definition, **kwargs): """ Main entry point to create a view of some data :param data: The original data :param definition: The definition for creating the view :param kwargs: User defined arguments that can be passed to the callables :return: The view of the data """ if isinstance(data, (list, tuple)): return [view(d, definition) for d in data] result = {} for key, value in definition.items(): if isinstance(value, dict): result[key] = view(get_value(data, key), value, **kwargs) else: if isinstance(value, Type): result[key] = value(data, key, **kwargs) else: try: result[key] = value(get_value(data, key), **kwargs) except TypeError: # if the callable does not accept the kwargs result[key] = value(get_value(data, key)) return result