Did some initial work for Context plugins

This commit is contained in:
Jason Gerard DeRose
2008-10-30 01:11:33 -06:00
parent e37760a273
commit ddb5449c7f
6 changed files with 82 additions and 15 deletions

View File

@@ -27,6 +27,7 @@ http://docs.python.org/ref/sequence-types.html
import re
import inspect
import threading
import errors
from errors import check_type, check_isinstance
from config import Environment, Env
@@ -705,6 +706,25 @@ class Registrar(DictProxy):
self.__registered.add(klass)
class LazyContext(object):
"""
On-demand creation of thread-local context attributes.
"""
def __init__(self, api):
self.__api = api
self.__context = threading.local()
def __getattr__(self, name):
if name not in self.__context.__dict__:
if name not in self.__api.Context:
raise AttributeError('no Context plugin for %r' % name)
value = self.__api.Context[name].get_value()
self.__context.__dict__[name] = value
return self.__context.__dict__[name]
class API(DictProxy):
"""
Dynamic API object through which `Plugin` instances are accessed.
@@ -715,6 +735,7 @@ class API(DictProxy):
self.__done = set()
self.register = Registrar(*allowed)
self.env = Env()
self.context = LazyContext(self)
super(API, self).__init__(self.__d)
def __doing(self, name):