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
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
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
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
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
58eed691dca7 debugging
Jeff Hammel <jhammel@mozilla.com>
parents: 81
diff changeset
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
58eed691dca7 debugging
Jeff Hammel <jhammel@mozilla.com>
parents: 81
diff changeset
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
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
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
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
71 args = [self.interpolate(arg) for arg in args]
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
72 else:
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
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
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
77 else:
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
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
4b757f73e8ca give IniFactory
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
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
be4fbf390e36 a bit of restructure
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
113 # create a hash of section names
be4fbf390e36 a bit of restructure
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
114 names = {}
be4fbf390e36 a bit of restructure
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
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
7b145c3d2a16 finish hashing the names
Jeff Hammel <jhammel@mozilla.com>
parents: 44
diff changeset
119
7b145c3d2a16 finish hashing the names
Jeff Hammel <jhammel@mozilla.com>
parents: 44
diff changeset
120 name = section.split(':',1)[0]
7b145c3d2a16 finish hashing the names
Jeff Hammel <jhammel@mozilla.com>
parents: 44
diff changeset
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
be4fbf390e36 a bit of restructure
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
123 def create_section(section, options):
be4fbf390e36 a bit of restructure
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
124
be4fbf390e36 a bit of restructure
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
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
2384ab3999b7 get wrapper section
Jeff Hammel <jhammel@mozilla.com>
parents: 46
diff changeset
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
65c95094dbb3 replace path
Jeff Hammel <jhammel@mozilla.com>
parents: 72
diff changeset
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
d44f3e6dcffa interpolate options
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
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
d44f3e6dcffa interpolate options
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
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
d44f3e6dcffa interpolate options
Jeff Hammel <jhammel@mozilla.com>
parents: 50
diff changeset
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
be4fbf390e36 a bit of restructure
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
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
be4fbf390e36 a bit of restructure
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
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
2a9274608af3 comment + whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 65
diff changeset
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
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
245
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
246 # parse configuration
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
247 config = {}
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
248 for section in parser.sections():
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
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
d303a5883991 even more stubbing
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
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
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
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
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
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
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
281 obj = factory.load()
e547679d4bfd this now works
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
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()