| # Copyright 2013 Google, Inc. All Rights Reserved. |
| # |
| # Google Author(s): Behdad Esfahbod, Roozbeh Pournader |
| |
| |
| class Options(object): |
| class UnknownOptionError(Exception): |
| pass |
| |
| def __init__(self, **kwargs): |
| self.verbose = False |
| self.timing = False |
| self.drop_tables = [] |
| |
| self.set(**kwargs) |
| |
| def set(self, **kwargs): |
| for k, v in kwargs.items(): |
| if not hasattr(self, k): |
| raise self.UnknownOptionError("Unknown option '%s'" % k) |
| setattr(self, k, v) |
| |
| def parse_opts(self, argv, ignore_unknown=[]): |
| ret = [] |
| opts = {} |
| for a in argv: |
| orig_a = a |
| if not a.startswith("--"): |
| ret.append(a) |
| continue |
| a = a[2:] |
| i = a.find("=") |
| op = "=" |
| if i == -1: |
| if a.startswith("no-"): |
| k = a[3:] |
| v = False |
| else: |
| k = a |
| v = True |
| else: |
| k = a[:i] |
| if k[-1] in "-+": |
| op = k[-1] + "=" # Ops is '-=' or '+=' now. |
| k = k[:-1] |
| v = a[i + 1 :] |
| ok = k |
| k = k.replace("-", "_") |
| if not hasattr(self, k): |
| if ignore_unknown is True or ok in ignore_unknown: |
| ret.append(orig_a) |
| continue |
| else: |
| raise self.UnknownOptionError("Unknown option '%s'" % a) |
| |
| ov = getattr(self, k) |
| if isinstance(ov, bool): |
| v = bool(v) |
| elif isinstance(ov, int): |
| v = int(v) |
| elif isinstance(ov, list): |
| vv = v.split(",") |
| if vv == [""]: |
| vv = [] |
| vv = [int(x, 0) if len(x) and x[0] in "0123456789" else x for x in vv] |
| if op == "=": |
| v = vv |
| elif op == "+=": |
| v = ov |
| v.extend(vv) |
| elif op == "-=": |
| v = ov |
| for x in vv: |
| if x in v: |
| v.remove(x) |
| else: |
| assert 0 |
| |
| opts[k] = v |
| self.set(**opts) |
| |
| return ret |