Mercurial > hg > pyloader
annotate pyloader/factory.py @ 83:58eed691dca7
debugging
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Mon, 11 Nov 2013 19:18:58 -0800 |
parents | 9203ca3a5182 |
children | dd8ad435cb26 |
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 |
69
b9d9a94bfa19
override section now works
Jeff Hammel <jhammel@mozilla.com>
parents:
68
diff
changeset
|
11 from copy import deepcopy |
23
9b2ca32e7a36
wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
12 from optparse import OptionParser |
26 | 13 from ConfigParser import InterpolationDepthError |
19
8987867698ee
a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
14 from ConfigParser import InterpolationMissingOptionError |
8987867698ee
a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
15 from ConfigParser import InterpolationSyntaxError |
16
edecb6fbd5a7
further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
16 from ConfigParser import SafeConfigParser as ConfigParser |
15
0bea5297c156
introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
17 |
0bea5297c156
introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
18 __all__ = ['CircularReferenceError', 'PyFactory', 'IniFactory'] |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
19 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
20 class CircularReferenceError(Exception): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
21 """factory has detected a circular reference""" |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
22 |
83 | 23 |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
24 class PyFactory(object): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
25 |
83 | 26 # to evaluate arguments as objects |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
27 delimeters = ('%(', ')s') |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
28 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
29 def __init__(self, config=None, main=''): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
30 self.main = main # main section |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
31 self.configure(config or {}) |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
32 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
33 def configure(self, config): |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
34 """load a new configuration""" |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
35 # 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
|
36 # 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
|
37 # you should be able to update only relevent apps |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
38 self.config = config |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
39 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
|
40 self.parsed = {} # instantiated apps |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
41 |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
42 def load(self, name=None): |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
43 """load an object""" |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
44 |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
45 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
|
46 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
|
47 if name in self.parsed: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
48 return self.parsed[name] |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
49 if name in self.seen: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
50 raise CircularReferenceError('Circular reference! : %s' % name) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
51 self.seen.add(name) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
52 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
53 # get section |
11 | 54 section = self.config[name] |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
55 assert 'path' in section |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
56 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
57 # load object |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
58 obj = loader.load(section['path']) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
59 |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
60 # get the object's arguments (if any) |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
61 args = section.get('args', None) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
62 kwargs = section.get('kwargs', None) |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
63 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
64 # 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
|
65 if args is None and kwargs is None: |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
66 self.parsed[name] = obj |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
67 return obj |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
68 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
69 # interpolate arguments |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
70 if args: |
11 | 71 args = [self.interpolate(arg) for arg in args] |
72 else: | |
73 args = [] | |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
74 if kwargs: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
75 kwargs = dict([(key, self.interpolate(value)) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
76 for key, value in kwargs.items()]) |
11 | 77 else: |
78 kwargs = {} | |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
79 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
80 # invoke |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
81 self.parsed[name] = obj(*args, **kwargs) |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
82 return self.parsed[name] |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
83 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
84 def interpolate(self, value): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
85 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
86 # only interpolate strings |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
87 if not isinstance(value, basestring): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
88 return value |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
89 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
90 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
|
91 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
|
92 if value in self.config: |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
93 return self.load(value) |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
94 return value |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
95 |
15
0bea5297c156
introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
96 class IniFactory(PyFactory): |
27 | 97 """load a python object from an .ini file""" |
15
0bea5297c156
introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
98 |
0bea5297c156
introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
99 def __init__(self, inifile, main=''): |
0bea5297c156
introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
100 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
|
101 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
|
102 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
|
103 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
|
104 |
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
105 @classmethod |
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
106 def configuration(cls, iniconfig, **defaults): |
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
107 """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
|
108 config = {} |
43
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
109 interpolated = set() |
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
110 seen = set() |
50
12de7b1bf303
stub interpolation of wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
49
diff
changeset
|
111 object_string = '%(object)s' |
43
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
112 |
44 | 113 # create a hash of section names |
114 names = {} | |
115 for section in iniconfig: | |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
116 |
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
117 # sanity check |
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
118 assert ':' in section, "No : in section: %s" % section |
45 | 119 |
120 name = section.split(':',1)[0] | |
121 names[name] = section | |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
122 |
44 | 123 def create_section(section, options): |
124 | |
125 # split up the section identifier | |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
126 name, path = section.split(':', 1) |
43
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
127 |
68
65609d7ba63d
move around when we create the (local) section dict so that we can override it as desired
Jeff Hammel <jhammel@mozilla.com>
parents:
67
diff
changeset
|
128 # make a dict for the section |
65609d7ba63d
move around when we create the (local) section dict so that we can override it as desired
Jeff Hammel <jhammel@mozilla.com>
parents:
67
diff
changeset
|
129 sect = {} |
65609d7ba63d
move around when we create the (local) section dict so that we can override it as desired
Jeff Hammel <jhammel@mozilla.com>
parents:
67
diff
changeset
|
130 |
43
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
131 # interpret decorators |
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
132 if ':' in path: |
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
133 wrapper, _path = path.split(':', 1) |
47 | 134 # TODO: could interpolate wrapper |
46
f7d1238d1bd1
stub using the names....we are only beginning
Jeff Hammel <jhammel@mozilla.com>
parents:
45
diff
changeset
|
135 if wrapper in names: |
50
12de7b1bf303
stub interpolation of wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
49
diff
changeset
|
136 |
74
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
137 # inline wrapper arguments: |
60
cc361ad8a692
stub out future directions for decorators and their testing a bit
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
138 # [extended-fibonacci:@:four=4,five=5:fibonacci] |
74
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
139 _wrapper_args = None |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
140 _wrapper_kwargs = None |
70
7ec0ca0134ff
stub getting wrapper options: [foo:@:bar=fleem:baz]
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
141 if ':' in _path: |
75
20bdb8125817
inline wrapper arguments now seem to work....thats....uncanny
Jeff Hammel <jhammel@mozilla.com>
parents:
74
diff
changeset
|
142 _wrapper_options, __path = _path.split(':', 1) |
70
7ec0ca0134ff
stub getting wrapper options: [foo:@:bar=fleem:baz]
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
143 if ',' in _wrapper_options or '=' in _wrapper_options: |
7ec0ca0134ff
stub getting wrapper options: [foo:@:bar=fleem:baz]
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
144 # ,= : tokens to ensure these are wrapper options |
7ec0ca0134ff
stub getting wrapper options: [foo:@:bar=fleem:baz]
Jeff Hammel <jhammel@mozilla.com>
parents:
69
diff
changeset
|
145 # as these shouldn't be found in a real path (dotted path or file path) |
75
20bdb8125817
inline wrapper arguments now seem to work....thats....uncanny
Jeff Hammel <jhammel@mozilla.com>
parents:
74
diff
changeset
|
146 _wrapper_args, _wrapper_kwargs = cast.str2args(_wrapper_options) |
73 | 147 _path = __path |
60
cc361ad8a692
stub out future directions for decorators and their testing a bit
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
148 |
cc361ad8a692
stub out future directions for decorators and their testing a bit
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
149 if _path in names: |
72
6f384c989a29
modernize comment; this morning is SOOO out of date
Jeff Hammel <jhammel@mozilla.com>
parents:
71
diff
changeset
|
150 # [foo:bar:fleem] |
60
cc361ad8a692
stub out future directions for decorators and their testing a bit
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
151 wrapped_name = _path |
cc361ad8a692
stub out future directions for decorators and their testing a bit
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
152 else: |
72
6f384c989a29
modernize comment; this morning is SOOO out of date
Jeff Hammel <jhammel@mozilla.com>
parents:
71
diff
changeset
|
153 # stub value for "anonymous" name |
6f384c989a29
modernize comment; this morning is SOOO out of date
Jeff Hammel <jhammel@mozilla.com>
parents:
71
diff
changeset
|
154 # [foo:bar:%(here)s/objects.py:MyClass] |
60
cc361ad8a692
stub out future directions for decorators and their testing a bit
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
155 wrapped_name = section |
63
995b831041be
stub: override section: [foo:bar]
Jeff Hammel <jhammel@mozilla.com>
parents:
62
diff
changeset
|
156 |
995b831041be
stub: override section: [foo:bar]
Jeff Hammel <jhammel@mozilla.com>
parents:
62
diff
changeset
|
157 # get wrapper options |
48
03e03668f546
start recursively fetching the wrapper; tests fail
Jeff Hammel <jhammel@mozilla.com>
parents:
47
diff
changeset
|
158 if wrapper not in config: |
63
995b831041be
stub: override section: [foo:bar]
Jeff Hammel <jhammel@mozilla.com>
parents:
62
diff
changeset
|
159 # load wrapper configuration |
48
03e03668f546
start recursively fetching the wrapper; tests fail
Jeff Hammel <jhammel@mozilla.com>
parents:
47
diff
changeset
|
160 wrapper_section = names[wrapper] |
03e03668f546
start recursively fetching the wrapper; tests fail
Jeff Hammel <jhammel@mozilla.com>
parents:
47
diff
changeset
|
161 if wrapper_section in seen: |
03e03668f546
start recursively fetching the wrapper; tests fail
Jeff Hammel <jhammel@mozilla.com>
parents:
47
diff
changeset
|
162 pass # TODO |
03e03668f546
start recursively fetching the wrapper; tests fail
Jeff Hammel <jhammel@mozilla.com>
parents:
47
diff
changeset
|
163 create_section(wrapper_section, iniconfig[wrapper_section]) |
74
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
164 wrapper_options = deepcopy(config[wrapper]) |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
165 |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
166 # add inline wrapper args, kwargs |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
167 if _wrapper_args is not None: |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
168 if 'args' in wrapper_options: |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
169 wrapper_options['args'].extend(_wrapper_args) |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
170 else: |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
171 wrapper_options['args'] = _wrapper_args |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
172 if _wrapper_kwargs is not None: |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
173 if 'kwargs' in wrapper_options: |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
174 wrapper_options['kwargs'].update(_wrapper_kwargs) |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
175 else: |
1f76705df520
interpolate inline wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
73
diff
changeset
|
176 wrapper_options['kwargs'] = _wrapper_kwargs |
50
12de7b1bf303
stub interpolation of wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
49
diff
changeset
|
177 |
63
995b831041be
stub: override section: [foo:bar]
Jeff Hammel <jhammel@mozilla.com>
parents:
62
diff
changeset
|
178 # interpolate wrapper_options |
51 | 179 def interpolate(option): |
54
f724db086125
houston, we have a pyloader
Jeff Hammel <jhammel@mozilla.com>
parents:
53
diff
changeset
|
180 if option == object_string: |
f724db086125
houston, we have a pyloader
Jeff Hammel <jhammel@mozilla.com>
parents:
53
diff
changeset
|
181 return '%(' + wrapped_name + ')s' |
f724db086125
houston, we have a pyloader
Jeff Hammel <jhammel@mozilla.com>
parents:
53
diff
changeset
|
182 return option |
50
12de7b1bf303
stub interpolation of wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
49
diff
changeset
|
183 if 'args' in wrapper_options: |
12de7b1bf303
stub interpolation of wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
49
diff
changeset
|
184 args = wrapper_options['args'][:] |
51 | 185 args = [interpolate(i) for i in args] |
50
12de7b1bf303
stub interpolation of wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
49
diff
changeset
|
186 wrapper_options['args'] = args |
12de7b1bf303
stub interpolation of wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
49
diff
changeset
|
187 if 'kwargs' in wrapper_options: |
12de7b1bf303
stub interpolation of wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
49
diff
changeset
|
188 kwargs = wrapper_options['kwargs'].copy() |
51 | 189 kwargs = dict([(i,interpolate(j)) for i, j in kwargs.items()]) |
50
12de7b1bf303
stub interpolation of wrapper options
Jeff Hammel <jhammel@mozilla.com>
parents:
49
diff
changeset
|
190 wrapper_options['kwargs'] = kwargs |
53
e4a1d7eecd3b
maybe the wrapper works now; to write a test
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
191 |
e4a1d7eecd3b
maybe the wrapper works now; to write a test
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
192 # create wrapper |
e4a1d7eecd3b
maybe the wrapper works now; to write a test
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
193 config[name] = wrapper_options |
62
97800b02f636
shouldnt need to go through the whole sequence when youre wrapping a known section
Jeff Hammel <jhammel@mozilla.com>
parents:
60
diff
changeset
|
194 if _path == wrapped_name: |
97800b02f636
shouldnt need to go through the whole sequence when youre wrapping a known section
Jeff Hammel <jhammel@mozilla.com>
parents:
60
diff
changeset
|
195 return |
53
e4a1d7eecd3b
maybe the wrapper works now; to write a test
Jeff Hammel <jhammel@mozilla.com>
parents:
52
diff
changeset
|
196 name = wrapped_name |
43
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
197 path = _path |
44 | 198 |
63
995b831041be
stub: override section: [foo:bar]
Jeff Hammel <jhammel@mozilla.com>
parents:
62
diff
changeset
|
199 elif path in names: |
995b831041be
stub: override section: [foo:bar]
Jeff Hammel <jhammel@mozilla.com>
parents:
62
diff
changeset
|
200 # override section: [foo:bar] |
65
6bb431e41e0b
stub getting the override options
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
201 if path not in config: |
6bb431e41e0b
stub getting the override options
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
202 # load overridden section |
6bb431e41e0b
stub getting the override options
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
203 overridden_section = names[path] |
6bb431e41e0b
stub getting the override options
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
204 if overridden_section in seen: |
6bb431e41e0b
stub getting the override options
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
205 pass # TODO |
6bb431e41e0b
stub getting the override options
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
206 create_section(overridden_section, iniconfig[overridden_section]) |
69
b9d9a94bfa19
override section now works
Jeff Hammel <jhammel@mozilla.com>
parents:
68
diff
changeset
|
207 sect = deepcopy(config[path]) |
60
cc361ad8a692
stub out future directions for decorators and their testing a bit
Jeff Hammel <jhammel@mozilla.com>
parents:
54
diff
changeset
|
208 |
68
65609d7ba63d
move around when we create the (local) section dict so that we can override it as desired
Jeff Hammel <jhammel@mozilla.com>
parents:
67
diff
changeset
|
209 if 'path' not in sect: |
65609d7ba63d
move around when we create the (local) section dict so that we can override it as desired
Jeff Hammel <jhammel@mozilla.com>
parents:
67
diff
changeset
|
210 # add the path to section dict |
65609d7ba63d
move around when we create the (local) section dict so that we can override it as desired
Jeff Hammel <jhammel@mozilla.com>
parents:
67
diff
changeset
|
211 path = path % defaults |
65609d7ba63d
move around when we create the (local) section dict so that we can override it as desired
Jeff Hammel <jhammel@mozilla.com>
parents:
67
diff
changeset
|
212 sect['path'] = path |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
213 |
44 | 214 # get arguments from .ini options |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
215 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
|
216 if option == '.': # positional arguments |
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
217 sect['args'] = cast.str2list(value) |
66 | 218 else: # keyword arguments |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
219 sect.setdefault('kwargs', {})[option] = value |
43
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
220 |
67
236af713bbc0
move setting the configuration to later so that we can easily move around sect
Jeff Hammel <jhammel@mozilla.com>
parents:
66
diff
changeset
|
221 # set the configuration |
236af713bbc0
move setting the configuration to later so that we can easily move around sect
Jeff Hammel <jhammel@mozilla.com>
parents:
66
diff
changeset
|
222 config[name] = sect |
236af713bbc0
move setting the configuration to later so that we can easily move around sect
Jeff Hammel <jhammel@mozilla.com>
parents:
66
diff
changeset
|
223 |
65
6bb431e41e0b
stub getting the override options
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
224 # get the object definitions |
43
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
225 for section, options in iniconfig.items(): |
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
226 seen.add(section) |
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
227 if section not in interpolated: |
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
228 create_section(section, options) |
a45743b31c6f
set ourselves up to detect circular reference errors
Jeff Hammel <jhammel@mozilla.com>
parents:
41
diff
changeset
|
229 interpolated.add(section) |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
230 |
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
231 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
|
232 |
4f7c05630f36
tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents:
20
diff
changeset
|
233 @classmethod |
4f7c05630f36
tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents:
20
diff
changeset
|
234 def read(cls, inifile): |
15
0bea5297c156
introduce a more betterer test
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
235 """reads configuration from an .ini file""" |
16
edecb6fbd5a7
further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
236 |
21
4f7c05630f36
tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents:
20
diff
changeset
|
237 here = os.path.dirname(os.path.abspath(inifile)) |
16
edecb6fbd5a7
further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
238 |
edecb6fbd5a7
further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
239 # read configuration |
edecb6fbd5a7
further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
240 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
|
241 'this': os.path.abspath(inifile)} |
16
edecb6fbd5a7
further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
242 parser = ConfigParser(defaults=defaults) |
edecb6fbd5a7
further stubbing of ini factory
Jeff Hammel <jhammel@mozilla.com>
parents:
15
diff
changeset
|
243 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
|
244 parser.read(inifile) |
18 | 245 |
246 # parse configuration | |
247 config = {} | |
248 for section in parser.sections(): | |
249 | |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
250 config[section] = {} |
20
057ccfe310b2
finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
251 |
057ccfe310b2
finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
252 # read the options |
18 | 253 for option in parser.options(section): |
19
8987867698ee
a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
254 |
8987867698ee
a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
255 if option in parser.defaults(): |
8987867698ee
a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
256 # don't include the defaults |
8987867698ee
a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
257 continue |
20
057ccfe310b2
finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
258 |
057ccfe310b2
finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
259 # try to interpolate the option |
057ccfe310b2
finish basic form of .ini factory - that was easy
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
260 # otherwise, use the raw value |
19
8987867698ee
a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
261 try: |
8987867698ee
a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
262 value = parser.get(section, option) |
26 | 263 except (InterpolationMissingOptionError, InterpolationSyntaxError, InterpolationDepthError): |
19
8987867698ee
a bit more stubbing of .ini parsing
Jeff Hammel <jhammel@mozilla.com>
parents:
18
diff
changeset
|
264 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
|
265 |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
266 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
|
267 |
41
2c228e3cd6d8
split reading and interpreting the .ini into different functions
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
268 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
|
269 |
22
b16d6a204ac1
stub a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
21
diff
changeset
|
270 def main(args=sys.argv[1:]): |
b16d6a204ac1
stub a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
21
diff
changeset
|
271 """command line entry point""" |
26 | 272 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
|
273 parser = OptionParser(usage=usage, description=IniFactory.__doc__) |
23
9b2ca32e7a36
wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
274 options, args = parser.parse_args(args) |
9b2ca32e7a36
wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
275 |
9b2ca32e7a36
wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
276 if len(args) != 1: |
9b2ca32e7a36
wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
277 parser.print_usage() |
9b2ca32e7a36
wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
278 parser.exit() |
9b2ca32e7a36
wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
279 |
9b2ca32e7a36
wire up command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
22
diff
changeset
|
280 factory = IniFactory(args[0]) |
26 | 281 obj = factory.load() |
282 print obj | |
22
b16d6a204ac1
stub a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
21
diff
changeset
|
283 |
21
4f7c05630f36
tie up some factory loose ends and sweeten the API with syntactic sugar
Jeff Hammel <jhammel@mozilla.com>
parents:
20
diff
changeset
|
284 if __name__ == '__main__': |
22
b16d6a204ac1
stub a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
21
diff
changeset
|
285 main() |