annotate configuration/config.py @ 7:6e3cf8f05464

note TODO: reading JSON
author Jeff Hammel <jhammel@mozilla.com>
date Sat, 24 Mar 2012 23:15:21 -0700
parents dce954a3831f
children 975fbc45cfcd
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
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
23 __all__ = ['Configuration', 'configuration_providers']
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
24
5
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
25 configuration_providers = []
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
26 if json:
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
27 class JSON(object):
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
28 extensions = ['json']
7
6e3cf8f05464 note TODO: reading JSON
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
29 def read(self, filename):
6e3cf8f05464 note TODO: reading JSON
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
30 raise NotImplementedError("TODO")
5
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
31 configuration_providers.append(JSON)
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
32
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
33 if yaml:
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
34 class YAML(object):
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
35 extensions = ['yml']
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
36 def read(self, filename):
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
37 f = file(filename)
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
38 config = yaml.load(f)
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
39 f.close()
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
40 return config
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
41
5
7910b0ef0bab stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
42 configuration_providers.append(YAML)
4
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
43
92e1b2dd60c8 more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
44
1
1dbdb4a57e0c stub configuration class
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
45 class Configuration(object):
1dbdb4a57e0c stub configuration class
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
46 options = {}
1dbdb4a57e0c stub configuration class
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
47
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
48 def __init__(self, configuration_providers=configuration_providers):
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
49 self.config = {}
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
50 self.configuration_providers = configuration_providers
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
51
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
52 def check(self, config):
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
53 """check validity of configuration"""
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
54
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
55 # TODO: ensure options in configuration are in self.options
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
56 unknown_options = []
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
57
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
58 #
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
59
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
60 def __call__(self, *args):
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
61 """add items to configuration and check it"""
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
62
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
63 def add(self, config):
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
64 """update configuration: not undoable"""
6
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
65
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
66 self.check(config)
dce954a3831f more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
67
2
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
68 self.config.update(config)
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
69 # TODO: option to extend; augment lists/dicts
35f57b21885f no stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
70
0
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 def main(args=sys.argv[:]):
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73 # parse command line options
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
74 usage = '%prog [options]'
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75 class PlainDescriptionFormatter(optparse.IndentedHelpFormatter):
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
76 """description formatter for console script entry point"""
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
77 def format_description(self, description):
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78 if description:
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
79 return description.strip() + '\n'
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
80 else:
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81 return ''
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
82 parser = optparse.OptionParser(usage=usage, description=__doc__, formatter=PlainDescriptionFormatter())
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
83 options, args = parser.parse_args(args)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
84
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
85 if __name__ == '__main__':
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
86 main()
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
87