Index: infra_libs/time_functions/parser.py |
diff --git a/infra_libs/time_functions/parser.py b/infra_libs/time_functions/parser.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dacc7c335f1b7d82853cefcfcaab19d21053d8cb |
--- /dev/null |
+++ b/infra_libs/time_functions/parser.py |
@@ -0,0 +1,59 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Utility functions to parse time/duration arguments.""" |
+ |
+ |
+import argparse |
+import datetime |
+import re |
+ |
+ |
+_TIMEDELTA_CONV = { |
+ 'us': datetime.timedelta(microseconds=1), |
+ 'ms': datetime.timedelta(milliseconds=1), |
+ 's': datetime.timedelta(seconds=1), |
+ 'm': datetime.timedelta(minutes=1), |
+ 'h': datetime.timedelta(hours=1), |
+ 'd': datetime.timedelta(days=1), |
+} |
+_TIMEDELTA_RE = re.compile(r'(\d+)(\w+)') |
+ |
+ |
+def parse_timedelta(v): |
+ """Returns (datetime.timedelta) The parsed timedelta. |
+ |
+ Args: |
+ v (str): The time delta string, a comma-delimited set of <count><unit> |
+ tokens comprising the timedelta (e.g., 10d,2h is 10 days, 2 hours). |
+ |
+ Raises: |
+ ValueError: If parsing failed. |
+ """ |
+ result = datetime.timedelta() |
+ for comp in v.split(','): |
+ match = _TIMEDELTA_RE.match(comp) |
+ if match is None: |
+ raise ValueError('Invalid timedelta token (%s)' % (comp,)) |
+ count, unit = int(match.group(1)), match.group(2) |
+ unit_value = _TIMEDELTA_CONV.get(unit) |
+ if unit_value is None: |
+ raise ValueError('Invalid timedelta token unit (%s)' % (unit,)) |
+ result += (unit_value * count) |
+ return result |
+ |
+ |
+def argparse_timedelta_type(v): |
+ """Returns (datetime.timedelta) The parsed timedelta. |
+ |
+ This is an argparse-compatible version of `parse_timedelta` that raises an |
+ argparse.ArgumentTypeError on failure instead of a ValueError. |
+ |
+ Raises: |
+ argparse.ArgumentTypeError: If parsing failed. |
+ """ |
+ try: |
+ return parse_timedelta(v) |
+ except ValueError as e: |
+ raise argparse.ArgumentTypeError(e.message) |