| # 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 |
| |