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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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