OLD | NEW |
---|---|
(Empty) | |
1 # Copyright 2016 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 """Utility functions to parse time/duration arguments.""" | |
6 | |
7 | |
8 import argparse | |
9 import datetime | |
10 import re | |
11 | |
12 | |
13 _TIMEDELTA_CONV = { | |
14 'us': datetime.timedelta(microseconds=1), | |
15 'ms': datetime.timedelta(milliseconds=1), | |
16 's': datetime.timedelta(seconds=1), | |
17 'm': datetime.timedelta(minutes=1), | |
18 'h': datetime.timedelta(hours=1), | |
19 'd': datetime.timedelta(days=1), | |
20 } | |
21 _TIMEDELTA_RE = re.compile(r'(\d+)(\w+)') | |
22 | |
23 | |
24 def parse_timedelta(v): | |
25 """Returns (datetime.timedelta) The parsed timedelta. | |
26 | |
27 Args: | |
28 v (str): The time delta string, a comma-delimited set of <count><unit> | |
29 tokens comprising the timedelta (e.g., 10d,2h is 10 days, 2 hours). | |
nodir
2016/06/10 17:50:36
yay go duration format
dnj (Google)
2016/06/10 18:00:52
Acknowledged.
| |
30 | |
31 Raises: | |
32 ValueError: If parsing failed. | |
33 """ | |
34 result = datetime.timedelta() | |
35 for comp in v.split(','): | |
36 match = _TIMEDELTA_RE.match(comp) | |
37 if match is None: | |
38 raise ValueError('Invalid timedelta token (%s)' % (comp,)) | |
39 count, unit = int(match.group(1)), match.group(2) | |
40 unit_value = _TIMEDELTA_CONV.get(unit) | |
41 if unit_value is None: | |
42 raise ValueError('Invalid timedelta token unit (%s)' % (unit,)) | |
43 result += (unit_value * count) | |
44 return result | |
45 | |
46 | |
47 def timedelta_type(v): | |
nodir
2016/06/10 17:50:36
consider changing the name so it is obvious that t
dnj (Google)
2016/06/10 18:00:52
Done.
| |
48 """Returns (datetime.timedelta) The parsed timedelta. | |
49 | |
50 This is an argparse-compatible version of `parse_timedelta` that raises an | |
51 argparse.ArgumentTypeError on failure instead of a ValueError. | |
52 | |
53 Raises: | |
54 argparse.ArgumentTypeError: If parsing failed. | |
55 """ | |
56 try: | |
57 return parse_timedelta(v) | |
58 except ValueError as e: | |
59 raise argparse.ArgumentTypeError(e.message) | |
OLD | NEW |