Mercurial > hg > pyloader
annotate pyloader/factory.py @ 14:30979d82c95d
remove silly self-reference code for now
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Fri, 27 May 2011 18:43:14 -0700 |
parents | ff272dcd5cd8 |
children | 0bea5297c156 |
rev | line source |
---|---|
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
1 """ |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
2 abstract factories |
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 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
5 import loader |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
6 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
7 class CircularReferenceError(Exception): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
8 """factory has detected a circular reference""" |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
9 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
10 class PyFactory(object): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
11 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
12 delimeters = ('%(', ')s') |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
13 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
14 def __init__(self, config=None, main=''): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
15 self.main = main # main section |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
16 self.configure(config or {}) |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
17 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
18 def configure(self, config): |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
19 """load a new configuration""" |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
20 # 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
|
21 # 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
|
22 # you should be able to update only relevent apps |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
23 self.config = config |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
24 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
|
25 self.parsed = {} # instantiated apps |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
26 |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
27 def load(self, name=None): |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
28 """load an object""" |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
29 |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
30 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
|
31 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
|
32 if name in self.parsed: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
33 return self.parsed[name] |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
34 if name in self.seen: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
35 raise CircularReferenceError('Circular reference! : %s' % name) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
36 self.seen.add(name) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
37 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
38 # get section |
11 | 39 section = self.config[name] |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
40 assert 'path' in section |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
41 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
42 # load object |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
43 obj = loader.load(section['path']) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
44 |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
45 # get the object's arguments (if any) |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
46 args = section.get('args', None) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
47 kwargs = section.get('kwargs', None) |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
48 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
49 # 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
|
50 if args is None and kwargs is None: |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
51 self.parsed[name] = obj |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
52 return obj |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
53 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
54 # interpolate arguments |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
55 if args: |
11 | 56 args = [self.interpolate(arg) for arg in args] |
57 else: | |
58 args = [] | |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
59 if kwargs: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
60 kwargs = dict([(key, self.interpolate(value)) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
61 for key, value in kwargs.items()]) |
11 | 62 else: |
63 kwargs = {} | |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
64 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
65 # invoke |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
66 self.parsed[name] = obj(*args, **kwargs) |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
67 return self.parsed[name] |
9
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
68 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
69 def interpolate(self, value): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
70 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
71 # only interpolate strings |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
72 if not isinstance(value, basestring): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
73 return value |
10
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
74 |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
75 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
|
76 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
|
77 if value in self.config: |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
78 return self.load(value) |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
79 return value |
ba2355d57998
finish baseline abstract factory implementation
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
80 |