Skip to content

Commit 5f12865

Browse files
author
Kenneth Reitz
committed
github3 helpers
1 parent 3758e35 commit 5f12865

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

github3/helpers.py

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
github3.helpers
5+
~~~~~~~~~~~~~~~
6+
7+
This module contians the helpers.
8+
"""
9+
10+
from datetime import datetime
11+
12+
from dateutil.parser import parse as parse_datetime
13+
14+
def is_collection(obj):
15+
"""Tests if an object is a collection."""
16+
17+
col = getattr(obj, '__getitem__', False)
18+
val = False if (not col) else True
19+
20+
if isinstance(obj, basestring):
21+
val = False
22+
23+
return val
24+
25+
26+
27+
# from kennethreitz/python-github3
28+
def to_python(obj,
29+
in_dict,
30+
str_keys=None,
31+
date_keys=None,
32+
int_keys=None,
33+
object_map=None,
34+
bool_keys=None,
35+
dict_keys=None,
36+
**kwargs):
37+
"""Extends a given object for API Consumption.
38+
39+
:param obj: Object to extend.
40+
:param in_dict: Dict to extract data from.
41+
:param string_keys: List of in_dict keys that will be extracted as strings.
42+
:param date_keys: List of in_dict keys that will be extrad as datetimes.
43+
:param object_map: Dict of {key, obj} map, for nested object results.
44+
"""
45+
46+
d = dict()
47+
48+
if str_keys:
49+
for in_key in str_keys:
50+
d[in_key] = in_dict.get(in_key)
51+
52+
if date_keys:
53+
for in_key in date_keys:
54+
in_date = in_dict.get(in_key)
55+
try:
56+
out_date = parse_datetime(in_date)
57+
except TypeError, e:
58+
raise e
59+
out_date = None
60+
61+
d[in_key] = out_date
62+
63+
if int_keys:
64+
for in_key in int_keys:
65+
if (in_dict is not None) and (in_dict.get(in_key) is not None):
66+
d[in_key] = int(in_dict.get(in_key))
67+
68+
if bool_keys:
69+
for in_key in bool_keys:
70+
if in_dict.get(in_key) is not None:
71+
d[in_key] = bool(in_dict.get(in_key))
72+
73+
if dict_keys:
74+
for in_key in dict_keys:
75+
if in_dict.get(in_key) is not None:
76+
d[in_key] = dict(in_dict.get(in_key))
77+
78+
if object_map:
79+
for (k, v) in object_map.items():
80+
if in_dict.get(k):
81+
d[k] = v.new_from_dict(in_dict.get(k))
82+
83+
obj.__dict__.update(d)
84+
obj.__dict__.update(kwargs)
85+
86+
# Save the dictionary, for write comparisons.
87+
obj._cache = d
88+
obj.__cache = in_dict
89+
90+
return obj
91+
92+
93+
def to_api(in_dict, int_keys=None, date_keys=None, bool_keys=None):
94+
"""Extends a given object for API Production."""
95+
96+
# Cast all int_keys to int()
97+
if int_keys:
98+
for in_key in int_keys:
99+
if (in_key in in_dict) and (in_dict.get(in_key, None) is not None):
100+
in_dict[in_key] = int(in_dict[in_key])
101+
102+
# Cast all date_keys to datetime.isoformat
103+
if date_keys:
104+
for in_key in date_keys:
105+
if (in_key in in_dict) and (in_dict.get(in_key, None) is not None):
106+
107+
_from = in_dict[in_key]
108+
109+
if isinstance(_from, basestring):
110+
dtime = parse_datetime(_from)
111+
112+
elif isinstance(_from, datetime):
113+
dtime = _from
114+
115+
in_dict[in_key] = dtime.isoformat()
116+
117+
elif (in_key in in_dict) and in_dict.get(in_key, None) is None:
118+
del in_dict[in_key]
119+
120+
# Remove all Nones
121+
for k, v in in_dict.items():
122+
if v is None:
123+
del in_dict[k]
124+
125+
return in_dict

0 commit comments

Comments
 (0)