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
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
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
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
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
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
56 args = [self.interpolate(arg) for arg in args]
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
57 else:
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
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
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
62 else:
ff272dcd5cd8 we have a passing test
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
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