• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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