def relativize_datestamps(task_def): """ Given a task definition as received from the queue, convert all datestamps to {relative_datestamp: ..} format, with the task creation time as "now". The result is useful for handing to ``create_task``. """ base = parse_time(task_def['created']) # borrowed from https://github.com/epoberezkin/ajv/blob/master/lib/compile/formats.js ts_pattern = re.compile( r'^\d\d\d\d-[0-1]\d-[0-3]\d[t\s]' r'(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?' r'(?:z|[+-]\d\d:\d\d)$', re.I) def recurse(value): if isinstance(value, text_type): if ts_pattern.match(value): value = parse_time(value) diff = value - base return { 'relative-datestamp': '{} seconds'.format(int(diff.total_seconds())) } if isinstance(value, list): return [recurse(e) for e in value] if isinstance(value, dict): return {k: recurse(v) for k, v in value.items()} return value return recurse(task_def)
def recurse(value): if isinstance(value, basestring): if ts_pattern.match(value): value = parse_time(value) diff = value - base return {'relative-datestamp': '{} seconds'.format(int(diff.total_seconds()))} if isinstance(value, list): return [recurse(e) for e in value] if isinstance(value, dict): return {k: recurse(v) for k, v in value.items()} return value
def recurse(value): if isinstance(value, str): if ts_pattern.match(value): value = parse_time(value) diff = value - base return {"relative-datestamp": f"{int(diff.total_seconds())} seconds"} if isinstance(value, list): return [recurse(e) for e in value] if isinstance(value, dict): return {k: recurse(v) for k, v in value.items()} return value
def test_parse_time(self): exp = datetime.datetime(2018, 10, 10, 18, 33, 3, 463000) assert parse_time('2018-10-10T18:33:03.463Z') == exp