annotate configuration/config.py @ 26:4fd88b1b08d5

ABC-ing configuration providers
author Jeff Hammel <jhammel@mozilla.com>
date Mon, 26 Mar 2012 16:10:15 -0700
parents b39e550402ea
children c6d966431498
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 #!/usr/bin/env python
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 """
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4 multi-level unified configuration
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5 """
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7 import sys
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 import optparse
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9
5
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
10 # imports for contigent configuration providers
4
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
11 try:
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
12 import json
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
13 except ImportError:
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
14 try:
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
15 import simplejson as json
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
16 except ImportError:
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
17 json = None
5
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
18 try:
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
19 import yaml
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
20 except ImportError:
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
21 yaml = None
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
22
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
23 __all__ = ['Configuration', 'configuration_providers', 'types']
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
24
26
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
25 ### configuration providers for serialization/deserialization
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
26
5
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
27 configuration_providers = []
26
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
28
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
29 class ConfigurationProvider(object):
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
30 """
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
31 abstract base class for configuration providers for
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
32 serialization/deserialization
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
33 """
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
34
5
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
35 if json:
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
36 class JSON(object):
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
37 extensions = ['json']
7
6e3cf8f05464 note TODO: reading JSON
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
38 def read(self, filename):
9
b28ec204df23 flush out JSON provider
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
39 return json.loads(file(filename).read())
26
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
40 def write(self, config, filename):
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
41 if isinstance(filename, basestring):
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
42 f = file(filename, 'w')
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
43 newfile = True
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
44 else:
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
45 f = filename
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
46 newfile = False
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
47 try:
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
48 f.write(json.dumps(config))
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
49 finally:
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
50 if newfile:
4fd88b1b08d5 ABC-ing configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 25
diff changeset
51 f.close()
5
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
52 configuration_providers.append(JSON)
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
53
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
54 if yaml:
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
55 class YAML(object):
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
56 extensions = ['yml']
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
57 def read(self, filename):
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
58 f = file(filename)
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
59 config = yaml.load(f)
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
60 f.close()
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
61 return config
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
62
5
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
63 configuration_providers.append(YAML)
4
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
64
21
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
65 ### plugins for option types
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
66 ### TODO: this could use a bit of thought
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
67 def base_cli(name, value):
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
68 # CLI arguments
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
69 args = value.get('flags', ['--%s' % name])
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
70 if not args:
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
71 # No CLI interface
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
72 return (), {}
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
73
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
74 kw = {'dest': name}
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
75 help = value.get('help', name)
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
76 if 'default' in value:
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
77 kw['default'] = value['default']
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
78 # TODO: use default pattern a la
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
79 # - http://hg.mozilla.org/build/talos/file/c6013a2f09ce/talos/PerfConfigurator.py#l358
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
80 # - http://k0s.org/mozilla/hg/bzconsole/file/d5e88dadde69/bzconsole/command.py#l12
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
81
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
82 help += ' [DEFAULT: %s]' % value['default']
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
83 kw['help'] = help
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
84 kw['action'] = 'store'
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
85 return args, kw
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
86
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
87 def bool_cli(name, value):
23
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
88
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
89 # preserve the default values
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
90 help = value.get('help')
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
91 flags = value.get('flags')
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
92
21
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
93 args, kw = base_cli(name, value)
23
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
94 kw['help'] = help # reset
21
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
95 if value.get('default'):
23
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
96 kw['action'] = 'store_false'
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
97 if not flags:
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
98 args = ['--no-%s' % name]
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
99 if not help:
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
100 kw['help'] = 'disable %s' % name
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
101 else:
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
102 kw['action'] = 'store_true'
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
103 if not help:
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
104 kw['help'] = 'enable %s' % name
21
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
105 return args, kw
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
106
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
107 def list_cli(name, value):
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
108 args, kw = base_cli(name, value)
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
109
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
110 # TODO: could use 'extend'
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
111 # - http://hg.mozilla.org/build/mozharness/file/5f44ba08f4be/mozharness/base/config.py#l41
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
112
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
113 # TODO: what about nested types?
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
114 kw['action'] = 'append'
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
115 return args, kw
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
116
23
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
117 def int_cli(name, value):
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
118 args, kw = base_cli(name, value)
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
119 kw['type'] = 'int'
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
120 return args, kw
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
121
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
122 def float_cli(name, value):
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
123 args, kw = base_cli(name, value)
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
124 kw['type'] = 'float'
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
125 return args, kw
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
126
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
127 types = {bool: bool_cli,
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
128 int: int_cli,
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
129 float: float_cli,
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
130 list: list_cli,
73e72a764c3a fix bool parser, i hope
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
131 None: base_cli} # default
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
132 __all__ += [i.__name__ for i in types.values()]
4
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
133
1
1dbdb4a57e0c stub configuration class
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
134 class Configuration(object):
1dbdb4a57e0c stub configuration class
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
135 options = {}
1dbdb4a57e0c stub configuration class
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
136
21
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
137 def __init__(self, configuration_providers=configuration_providers, types=types):
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
138 self.config = {}
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
139 self.configuration_providers = configuration_providers
21
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
140 self.types = types
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
141
11
e00afe2c83bf stubbing configuration parser
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
142 def items(self):
e00afe2c83bf stubbing configuration parser
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
143 # TODO: allow options to be a list of 2-tuples
13
0f8115a41ad6 bug fixes
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
144 return self.options.items()
11
e00afe2c83bf stubbing configuration parser
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
145
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
146 ### methods for validating configuration
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
147
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
148 def check(self, config):
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
149 """
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
150 check validity of configuration to be added
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
151 """
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
152 # TODO: should probably deepcopy config
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
153
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
154 # ensure options in configuration are in self.options
25
b39e550402ea we now update configuration correctly
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
155 unknown_options = [i for i in config if i not in self.options]
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
156 if unknown_options:
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
157 # TODO: more specific error type
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
158 raise Exception("Unknown options: %s" % ', '.join(unknown_options))
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
159
10
c782d750fd6d comment
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
160 # TODO: ensure options are of the right type (if specified)
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
161 for key, value in config.items():
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
162 _type = self.options[key].get('type')
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
163 if _type is not None:
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
164 config[key] = _type(value)
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
165
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
166 return config
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
167
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
168 def validate(self):
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
169 """validate resultant configuration"""
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
170 # TODO: configuration should be locked after this is called
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
171
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
172 ### methods for adding configuration
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
173
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
174 def __call__(self, *args):
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
175 """add items to configuration and check it"""
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
176 for config in args:
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
177 self.add(config)
25
b39e550402ea we now update configuration correctly
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
178 self.validate() # validate total configuration
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
179 # TODO: configuration should be locked after this is called
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
180
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
181 def add(self, config, check=True):
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
182 """update configuration: not undoable"""
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
183
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
184 self.check(config) # check config to be added
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
185 self.config.update(config)
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
186 # TODO: option to extend; augment lists/dicts
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
187
18
d8871956536e remove cruft and start to organize
Jeff Hammel <jhammel@mozilla.com>
parents: 17
diff changeset
188 ### methods for optparse
d8871956536e remove cruft and start to organize
Jeff Hammel <jhammel@mozilla.com>
parents: 17
diff changeset
189 ### XXX could go in a subclass
d8871956536e remove cruft and start to organize
Jeff Hammel <jhammel@mozilla.com>
parents: 17
diff changeset
190
17
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
191 def optparse_options(self, parser):
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
192 """add optparse options to a OptionParser instance"""
11
e00afe2c83bf stubbing configuration parser
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
193 for key, value in self.items():
21
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
194 handler = self.types[value.get('type')]
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
195 args, kw = handler(key, value)
11
e00afe2c83bf stubbing configuration parser
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
196 if not args:
21
0fe74db6a56c a hacky way to do CLI types handlers
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
197 # No CLI interface
11
e00afe2c83bf stubbing configuration parser
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
198 continue
12
db43d30afcf5 note pattern to use
Jeff Hammel <jhammel@mozilla.com>
parents: 11
diff changeset
199 parser.add_option(*args, **kw)
17
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
200
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
201 def parser(self, configuration_provider_option=None, **parser_args):
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
202 """
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
203 return OptionParser for this Configuration instance
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
204 - configuration_provider_options : option for configuration files [TODO]
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
205 (also TODO: a special value that equates to the first file extension value
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
206 for the configuration_providers)
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
207 - parser_args : arguments to the OptionParser constructor
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
208 """
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
209 if 'description' not in parser_args:
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
210 parser_args['description'] = getattr(self, '__doc__', '')
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
211 if 'formatter' not in parser_args:
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
212 class PlainDescriptionFormatter(optparse.IndentedHelpFormatter):
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
213 """description formatter for console script entry point"""
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
214 def format_description(self, description):
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
215 if description:
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
216 return description.strip() + '\n'
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
217 else:
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
218 return ''
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
219 parser_args['formatter'] = PlainDescriptionFormatter()
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
220 parser = optparse.OptionParser(**parser_args)
a78ab14ae376 separate thing to add options to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
221 self.optparse_options(parser)
15
0df4bfdc2c96 make --help work
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
222 return parser
19
cadc9514f60a we have a legitimately failing test!
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
223
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
224 def parse(self, args=sys.argv[1:], parser=None, configuration_provider_option=None):
19
cadc9514f60a we have a legitimately failing test!
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
225 """parse configuration including command line options"""
cadc9514f60a we have a legitimately failing test!
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
226
cadc9514f60a we have a legitimately failing test!
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
227 # parse arguments
cadc9514f60a we have a legitimately failing test!
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
228 if parser is None:
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
229 parser = self.parser(configuration_provider_option=configuration_provider_option)
19
cadc9514f60a we have a legitimately failing test!
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
230 options, args = parser.parse_args(args)
cadc9514f60a we have a legitimately failing test!
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
231
24
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
232 # get CLI configuration options
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
233 cli_config = dict([(key, value) for key, value in options.__dict__.items()
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
234 if key in self.options])
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
235
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
236 # generate configuration
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
237 self(cli_config)
39f2611db9be rename a bunch of things and begin to work on the sanity of validation
Jeff Hammel <jhammel@mozilla.com>
parents: 23
diff changeset
238
19
cadc9514f60a we have a legitimately failing test!
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
239 # return parsed arguments
cadc9514f60a we have a legitimately failing test!
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
240 return options, args