datetime compatibility option for callbacks
This commit is contained in:
parent
658953af54
commit
842754c2d3
2 changed files with 65 additions and 1 deletions
46
koji/util.py
46
koji/util.py
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
from __future__ import absolute_import
|
||||
import calendar
|
||||
import datetime
|
||||
from fnmatch import fnmatch
|
||||
import koji
|
||||
import logging
|
||||
|
|
@ -151,6 +152,51 @@ def dslice_ex(dict, keys, strict=True):
|
|||
del ret[key]
|
||||
return ret
|
||||
|
||||
|
||||
class DataWalker(object):
|
||||
|
||||
def __init__(self, data, callback, kwargs=None):
|
||||
self.data = data
|
||||
self.callback = callback
|
||||
if kwargs is None:
|
||||
kwargs = {}
|
||||
self.kwargs = kwargs
|
||||
|
||||
def walk(self):
|
||||
return self._walk(self.data)
|
||||
|
||||
def _walk(self, value):
|
||||
# first let callback filter the value
|
||||
value = self.callback(value, **self.kwargs)
|
||||
# then recurse if needed
|
||||
if isinstance(value, tuple):
|
||||
return tuple([self._walk(x) for x in value])
|
||||
elif isinstance(value, list):
|
||||
return list([self._walk(x) for x in value])
|
||||
elif isinstance(value, dict):
|
||||
ret = {}
|
||||
for k in value:
|
||||
k = self._walk(k)
|
||||
v = self._walk(value[k])
|
||||
ret[k] = v
|
||||
return ret
|
||||
else:
|
||||
return value
|
||||
|
||||
|
||||
def encode_datetime(value):
|
||||
"""Convert datetime objects to strings"""
|
||||
if isinstance(value, datetime.datetime):
|
||||
return value.isoformat(' ')
|
||||
else:
|
||||
return value
|
||||
|
||||
|
||||
def encode_datetime_recurse(value):
|
||||
walker = DataWalker(value, encode_datetime)
|
||||
return walker.walk()
|
||||
|
||||
|
||||
def call_with_argcheck(func, args, kwargs=None):
|
||||
"""Call function, raising ParameterError if args do not match"""
|
||||
if kwargs is None:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue