From 430b05417baba5a8cd6262a4328bffb89e4748d1 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sat, 23 Jul 2011 00:39:55 -0400 Subject: basic helpers --- github3/helpers.py | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) (limited to 'github3/helpers.py') diff --git a/github3/helpers.py b/github3/helpers.py index e69de29..8e78c9b 100644 --- a/github3/helpers.py +++ b/github3/helpers.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- + +""" +github3.helpers +~~~~~~~~~~~~~~~~ + +This module provides various helper functions to the rest of the package. +""" + +import inspect +from datetime import datetime + +from dateutil.parser import parse as parse_datetime + + +def is_collection(obj): + """Tests if an object is a collection.""" + + col = getattr(obj, '__getitem__', False) + val = False if (not col) else True + + if isinstance(obj, basestring): + val = False + + return val + + +# from arc90/python-readability-api +def to_python(obj, in_dict, string_keys=None, date_keys=None, object_map=None, **kwargs): + """Extends a given object for API Consumption. + + :param obj: Object to extend. + :param in_dict: Dict to extract data from. + :param string_keys: List of in_dict keys that will be extracted as strings. + :param date_keys: List of in_dict keys that will be extrad as datetimes. + :param object_map: Dict of {key, obj} map, for nested object results. + """ + + if string_keys: + for in_key in string_keys: + # print in_key + obj.__dict__[in_key] = in_dict.get(in_key) + + if date_keys: + for in_key in date_keys: + in_date = in_dict.get(in_key) + try: + out_date = datetime.strptime(in_date, '%Y-%m-%d %H:%M:%S') + except TypeError: + out_date = None + + obj.__dict__[in_key] = out_date + + if object_map: + + for (k, v) in object_map.items(): + obj.__dict__[k] = v.new_from_dict(in_dict.get(k)) + + obj.__dict__.update(kwargs) + + return obj + + +# from arc90/python-readability-api +def to_api(in_dict, int_keys=None, date_keys=None): + """Extends a given object for API Production.""" + + # Cast all int_keys to int() + if int_keys: + for in_key in int_keys: + if (in_key in in_dict) and (in_dict.get(in_key, None) is not None): + in_dict[in_key] = int(in_dict[in_key]) + + # Cast all date_keys to datetime.isoformat + if date_keys: + for in_key in date_keys: + if (in_key in in_dict) and (in_dict.get(in_key, None) is not None): + + _from = in_dict[in_key] + + if isinstance(_from, basestring): + dtime = parse_datetime(_from) + + elif isinstance(_from, datetime): + dtime = _from + + in_dict[in_key] = dtime.isoformat() + + elif (in_key in in_dict) and in_dict.get(in_key, None) is None: + del in_dict[in_key] + + # Remove all Nones + for k, v in in_dict.items(): + if v is None: + del in_dict[k] + + return in_dict + + + +# from kennethreitz/showme +def get_scope(f, args=None): + """Get scope of given function for Exception scopes.""" + + if args is None: + args=list() + + scope = inspect.getmodule(f).__name__ + # guess that function is a method of it's class + try: + if f.func_name in dir(args[0].__class__): + scope += '.' + args[0].__class__.__name__ + scope += '.' + f.__name__ + else: + scope += '.' + f.__name__ + except IndexError: + scope += '.' + f.__name__ + + # scrub readability.models namespace + scope = scope.replace('readability.api.', '') + + return scope \ No newline at end of file -- cgit v1.2.3-59-g8ed1b