1# Copyright 2013 Google, Inc. All Rights Reserved. 2# 3# Google Author(s): Behdad Esfahbod, Roozbeh Pournader 4 5 6class Options(object): 7 8 class UnknownOptionError(Exception): 9 pass 10 11 def __init__(self, **kwargs): 12 13 self.verbose = False 14 self.timing = False 15 self.drop_tables = [] 16 17 self.set(**kwargs) 18 19 def set(self, **kwargs): 20 for k,v in kwargs.items(): 21 if not hasattr(self, k): 22 raise self.UnknownOptionError("Unknown option '%s'" % k) 23 setattr(self, k, v) 24 25 def parse_opts(self, argv, ignore_unknown=[]): 26 ret = [] 27 opts = {} 28 for a in argv: 29 orig_a = a 30 if not a.startswith('--'): 31 ret.append(a) 32 continue 33 a = a[2:] 34 i = a.find('=') 35 op = '=' 36 if i == -1: 37 if a.startswith("no-"): 38 k = a[3:] 39 v = False 40 else: 41 k = a 42 v = True 43 else: 44 k = a[:i] 45 if k[-1] in "-+": 46 op = k[-1]+'=' # Ops is '-=' or '+=' now. 47 k = k[:-1] 48 v = a[i+1:] 49 ok = k 50 k = k.replace('-', '_') 51 if not hasattr(self, k): 52 if ignore_unknown is True or ok in ignore_unknown: 53 ret.append(orig_a) 54 continue 55 else: 56 raise self.UnknownOptionError("Unknown option '%s'" % a) 57 58 ov = getattr(self, k) 59 if isinstance(ov, bool): 60 v = bool(v) 61 elif isinstance(ov, int): 62 v = int(v) 63 elif isinstance(ov, list): 64 vv = v.split(',') 65 if vv == ['']: 66 vv = [] 67 vv = [int(x, 0) if len(x) and x[0] in "0123456789" else x for x in vv] 68 if op == '=': 69 v = vv 70 elif op == '+=': 71 v = ov 72 v.extend(vv) 73 elif op == '-=': 74 v = ov 75 for x in vv: 76 if x in v: 77 v.remove(x) 78 else: 79 assert 0 80 81 opts[k] = v 82 self.set(**opts) 83 84 return ret 85 86