Mercurial > hg > pyloader
annotate pyloader/factory.py @ 9:ff634cc2e62b
unfinished sketch of an abstract factory
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Thu, 26 May 2011 18:14:56 -0700 |
parents | |
children | ba2355d57998 |
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 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
16 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
|
17 self.parsed = {} # instantiated apps |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
18 self.load(config or {}) |
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 def load(self, config, name=None): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
21 name = name or self.main # load main section by default |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
22 assert name in config, "'%s' not found in config" |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
23 if name in self.parsed: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
24 return self.parsed[name] |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
25 if name in self.seen: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
26 raise CircularReferenceError('Circular reference! : %s' % name) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
27 self.seen.add(name) |
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 # get section |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
30 section = config['name'] |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
31 assert 'path' in section |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
32 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
33 # load object |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
34 obj = loader.load(section['path']) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
35 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
36 # interpolate arguments |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
37 args = section.get('args', None) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
38 kwargs = section.get('kwargs', None) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
39 if args: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
40 args = [self.iterpolate(arg) for arg in args] |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
41 if kwargs: |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
42 kwargs = dict([(key, self.interpolate(value)) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
43 for key, value in kwargs.items()]) |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
44 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
45 # if args and kwargs aren't there, you're done! |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
46 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
47 def interpolate(self, value): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
48 |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
49 # only interpolate strings |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
50 if not isinstance(value, basestring): |
ff634cc2e62b
unfinished sketch of an abstract factory
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
51 return value |