Mercurial > hg > configuration
annotate configuration/config.py @ 10:c782d750fd6d
comment
| author | Jeff Hammel <jhammel@mozilla.com> |
|---|---|
| date | Mon, 26 Mar 2012 09:14:04 -0700 |
| parents | b28ec204df23 |
| children | e00afe2c83bf |
| rev | line source |
|---|---|
| 0 | 1 #!/usr/bin/env python |
| 2 | |
| 3 """ | |
| 4 multi-level unified configuration | |
| 5 """ | |
| 6 | |
| 7 import sys | |
| 8 import optparse | |
| 9 | |
|
5
7910b0ef0bab
stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents:
4
diff
changeset
|
10 # imports for contigent configuration providers |
| 4 | 11 try: |
| 12 import json | |
| 13 except ImportError: | |
| 14 try: | |
| 15 import simplejson as json | |
| 16 except ImportError: | |
| 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 | 23 __all__ = ['Configuration', 'configuration_providers'] |
| 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 | 29 def read(self, filename): |
| 9 | 30 return json.loads(file(filename).read()) |
|
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 | 37 f = file(filename) |
| 38 config = yaml.load(f) | |
| 39 f.close() | |
| 40 return config | |
| 41 | |
|
5
7910b0ef0bab
stub configuration providers
Jeff Hammel <jhammel@mozilla.com>
parents:
4
diff
changeset
|
42 configuration_providers.append(YAML) |
| 4 | 43 |
| 44 | |
| 1 | 45 class Configuration(object): |
| 46 options = {} | |
| 47 | |
| 6 | 48 def __init__(self, configuration_providers=configuration_providers): |
| 2 | 49 self.config = {} |
| 6 | 50 self.configuration_providers = configuration_providers |
| 2 | 51 |
| 6 | 52 def check(self, config): |
| 2 | 53 """check validity of configuration""" |
| 54 | |
| 6 | 55 # TODO: ensure options in configuration are in self.options |
| 56 unknown_options = [] | |
| 57 | |
| 10 | 58 # TODO: ensure options are of the right type (if specified) |
| 6 | 59 |
| 2 | 60 def __call__(self, *args): |
| 61 """add items to configuration and check it""" | |
| 62 | |
| 63 def add(self, config): | |
| 64 """update configuration: not undoable""" | |
| 6 | 65 |
| 66 self.check(config) | |
| 67 | |
| 2 | 68 self.config.update(config) |
| 69 # TODO: option to extend; augment lists/dicts | |
| 70 | |
|
8
975fbc45cfcd
note TODO: returning OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
71 def parser(self): |
|
975fbc45cfcd
note TODO: returning OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
72 """return OptionParser""" |
|
975fbc45cfcd
note TODO: returning OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
73 raise NotImplementedError("TODO") |
|
975fbc45cfcd
note TODO: returning OptionParser
Jeff Hammel <jhammel@mozilla.com>
parents:
7
diff
changeset
|
74 |
| 0 | 75 def main(args=sys.argv[:]): |
| 76 | |
| 77 # parse command line options | |
| 78 usage = '%prog [options]' | |
| 79 class PlainDescriptionFormatter(optparse.IndentedHelpFormatter): | |
| 80 """description formatter for console script entry point""" | |
| 81 def format_description(self, description): | |
| 82 if description: | |
| 83 return description.strip() + '\n' | |
| 84 else: | |
| 85 return '' | |
| 86 parser = optparse.OptionParser(usage=usage, description=__doc__, formatter=PlainDescriptionFormatter()) | |
| 87 options, args = parser.parse_args(args) | |
| 88 | |
| 89 if __name__ == '__main__': | |
| 90 main() | |
| 91 |
