annotate pyloader/factory.py @ 41:2c228e3cd6d8

split reading and interpreting the .ini into different functions
author Jeff Hammel <jhammel@mozilla.com>
date Wed, 08 Jun 2011 17:50:05 -0700
parents 850d31be0fb8
children a45743b31c6f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
1 #!/usr/bin/env python
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
2
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 """
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4 abstract factories
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5 """
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6
20
057ccfe310b2 finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents: 19
diff changeset
7 import cast
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 import loader
15
0bea5297c156 introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents: 14
diff changeset
9 import os
22
b16d6a204ac1 stub a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
10 import sys
23
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
11 from optparse import OptionParser
26
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
12 from ConfigParser import InterpolationDepthError
19
8987867698ee a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
13 from ConfigParser import InterpolationMissingOptionError
8987867698ee a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
14 from ConfigParser import InterpolationSyntaxError
16
edecb6fbd5a7 further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
15 from ConfigParser import SafeConfigParser as ConfigParser
15
0bea5297c156 introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents: 14
diff changeset
16
0bea5297c156 introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents: 14
diff changeset
17 __all__ = ['CircularReferenceError', 'PyFactory', 'IniFactory']
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19 class CircularReferenceError(Exception):
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 """factory has detected a circular reference"""
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
22 class PyFactory(object):
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
23
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
24 delimeters = ('%(', ')s')
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
25
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
26 def __init__(self, config=None, main=''):
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
27 self.main = main # main section
10
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
28 self.configure(config or {})
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
29
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
30 def configure(self, config):
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
31 """load a new configuration"""
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
32 # TODO: this should really be a configuration update. If you keep
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
33 # track of all "apps" and their parents (i.e. as a ADG)
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
34 # you should be able to update only relevent apps
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
35 self.config = config
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
36 self.seen = set() # already seen apps to note cyclic dependencies
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
37 self.parsed = {} # instantiated apps
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38
10
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
39 def load(self, name=None):
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
40 """load an object"""
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
41
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
42 name = name or self.main # load main section by default
10
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
43 assert name in self.config, "'%s' not found in configuration"
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
44 if name in self.parsed:
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
45 return self.parsed[name]
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
46 if name in self.seen:
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
47 raise CircularReferenceError('Circular reference! : %s' % name)
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
48 self.seen.add(name)
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
49
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50 # get section
11
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
51 section = self.config[name]
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
52 assert 'path' in section
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
53
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
54 # load object
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
55 obj = loader.load(section['path'])
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56
10
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
57 # get the object's arguments (if any)
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
58 args = section.get('args', None)
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59 kwargs = section.get('kwargs', None)
10
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
60
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
61 # if args and kwargs aren't there, you're done!
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
62 if args is None and kwargs is None:
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
63 self.parsed[name] = obj
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
64 return obj
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
65
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
66 # interpolate arguments
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67 if args:
11
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
68 args = [self.interpolate(arg) for arg in args]
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
69 else:
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
70 args = []
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 if kwargs:
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 kwargs = dict([(key, self.interpolate(value))
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73 for key, value in kwargs.items()])
11
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
74 else:
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
75 kwargs = {}
10
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
76
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
77 # invoke
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
78 self.parsed[name] = obj(*args, **kwargs)
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
79 return self.parsed[name]
9
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
80
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81 def interpolate(self, value):
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
82
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
83 # only interpolate strings
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
84 if not isinstance(value, basestring):
ff634cc2e62b unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
85 return value
10
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
86
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
87 if value.startswith(self.delimeters[0]) and value.endswith(self.delimeters[1]):
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
88 value = value[len(self.delimeters[0]):-len(self.delimeters[1])]
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
89 if value in self.config:
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
90 return self.load(value)
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
91 return value
ba2355d57998 finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
92
15
0bea5297c156 introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents: 14
diff changeset
93 class IniFactory(PyFactory):
27
4b757f73e8ca give IniFactory
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
94 """load a python object from an .ini file"""
15
0bea5297c156 introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents: 14
diff changeset
95
0bea5297c156 introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents: 14
diff changeset
96 def __init__(self, inifile, main=''):
0bea5297c156 introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents: 14
diff changeset
97 assert os.path.exists(inifile), "File not found: %s" % inifile
21
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
98 self.inifile = inifile
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
99 config = self.read(inifile)
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
100 PyFactory.__init__(self, config, main)
41
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
101
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
102 @classmethod
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
103 def configuration(cls, iniconfig, **defaults):
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
104 """interpret configuration from raw .ini syntax"""
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
105 config = {}
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
106 for section, options in iniconfig.items():
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
107
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
108 # sanity check
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
109 assert ':' in section, "No : in section: %s" % section
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
110
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
111 # make a dict for the section
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
112 name, path = section.split(':', 1)
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
113 path = path % defaults
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
114 sect = config[name] = dict(path=path)
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
115
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
116 for option, value in options.items():
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
117
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
118 if option == '.': # positional arguments
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
119 sect['args'] = cast.str2list(value)
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
120 else:
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
121 sect.setdefault('kwargs', {})[option] = value
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
122
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
123 return config
21
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
124
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
125 @classmethod
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
126 def read(cls, inifile):
15
0bea5297c156 introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents: 14
diff changeset
127 """reads configuration from an .ini file"""
16
edecb6fbd5a7 further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
128
21
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
129 here = os.path.dirname(os.path.abspath(inifile))
16
edecb6fbd5a7 further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
130
edecb6fbd5a7 further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
131 # read configuration
edecb6fbd5a7 further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
132 defaults={'here': here,
21
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
133 'this': os.path.abspath(inifile)}
16
edecb6fbd5a7 further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
134 parser = ConfigParser(defaults=defaults)
edecb6fbd5a7 further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
135 parser.optionxform = str # use whole case
21
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
136 parser.read(inifile)
18
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
137
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
138 # parse configuration
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
139 config = {}
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
140 for section in parser.sections():
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
141
41
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
142 config[section] = {}
20
057ccfe310b2 finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents: 19
diff changeset
143
057ccfe310b2 finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents: 19
diff changeset
144 # read the options
18
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
145 for option in parser.options(section):
19
8987867698ee a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
146
8987867698ee a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
147 if option in parser.defaults():
8987867698ee a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
148 # don't include the defaults
8987867698ee a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
149 continue
20
057ccfe310b2 finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents: 19
diff changeset
150
057ccfe310b2 finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents: 19
diff changeset
151 # try to interpolate the option
057ccfe310b2 finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents: 19
diff changeset
152 # otherwise, use the raw value
19
8987867698ee a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
153 try:
8987867698ee a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
154 value = parser.get(section, option)
26
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
155 except (InterpolationMissingOptionError, InterpolationSyntaxError, InterpolationDepthError):
19
8987867698ee a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
156 value = parser.get(section, option, raw=True)
20
057ccfe310b2 finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents: 19
diff changeset
157
41
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
158 config[section][option] = value
21
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
159
41
2c228e3cd6d8 split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents: 35
diff changeset
160 return cls.configuration(config, **parser.defaults())
21
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
161
22
b16d6a204ac1 stub a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
162 def main(args=sys.argv[1:]):
b16d6a204ac1 stub a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
163 """command line entry point"""
26
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
164 usage = '%prog file1.ini -arg1 -arg2 --key1=value1 --key2=value2'
29
000e175169c2 use IniFactory.__doc__ as parser description
Jeff Hammel <jhammel@mozilla.com>
parents: 27
diff changeset
165 parser = OptionParser(usage=usage, description=IniFactory.__doc__)
23
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
166 options, args = parser.parse_args(args)
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
167
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
168 if len(args) != 1:
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
169 parser.print_usage()
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
170 parser.exit()
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
171
9b2ca32e7a36 wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 22
diff changeset
172 factory = IniFactory(args[0])
26
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
173 obj = factory.load()
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
174 print obj
22
b16d6a204ac1 stub a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
175
21
4f7c05630f36 tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
176 if __name__ == '__main__':
22
b16d6a204ac1 stub a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
177 main()