diff options
| author | ianb <devnull@localhost> | 2005-05-01 22:53:29 +0000 |
|---|---|---|
| committer | ianb <devnull@localhost> | 2005-05-01 22:53:29 +0000 |
| commit | a2844f306456a6fbc1a6d45552dd8c653f13d726 (patch) | |
| tree | 340f9c919af31c39371ed35990ff67d03c30c06f | |
| parent | b0b87b7cf4a74c9ed9febd4fef27d765517940c1 (diff) | |
| download | paste-a2844f306456a6fbc1a6d45552dd8c653f13d726.tar.gz | |
Added load() and include() commands to configuration
| -rw-r--r-- | paste/pyconfig.py | 67 | ||||
| -rw-r--r-- | paste/tests/pyconfig_data/loader.conf | 5 | ||||
| -rw-r--r-- | paste/tests/pyconfig_data/loader_included.conf | 2 | ||||
| -rw-r--r-- | paste/tests/pyconfig_data/loader_loaded.conf | 2 | ||||
| -rw-r--r-- | paste/tests/test_pyconfig.py | 12 |
5 files changed, 73 insertions, 15 deletions
diff --git a/paste/pyconfig.py b/paste/pyconfig.py index 783461e..070a50a 100644 --- a/paste/pyconfig.py +++ b/paste/pyconfig.py @@ -17,6 +17,7 @@ import types import os from paste.util import thirdparty UserDict = thirdparty.load_new_module('UserDict', (2, 3)) +from paste.reloader import watch_file def load(filename): conf = Config() @@ -57,27 +58,62 @@ class Config(UserDict.DictMixin): new.namespaces = namespaces return new - def load(self, filename, default=False): + def read_file(self, filename, namespace=None, + load_self=True): + special_keys = ('__file__', 'load', 'include') + watch_file(filename) f = open(filename, 'rb') content = f.read() f.close() - namespace = {} - for key in self: - namespace[key] = self[key] + if not namespace: + namespace = {} + old_values = {} + for key in special_keys: + old_values[key] = namespace.get(key) + if load_self: + for key in self: + namespace[key] = self[key] orig = namespace.copy() namespace['__file__'] = os.path.abspath(filename) + namespace['load'] = self.make_loader(filename, namespace) + namespace['include'] = self.make_includer(filename, namespace) exec content in namespace - for name in namespace.keys(): - if (hasattr(__builtins__, name) - or name.startswith('_')): - del namespace[name] - continue - if orig.has_key(name) and namespace[name] is orig[name]: - del namespace[name] - continue - if isinstance(namespace[name], types.ModuleType): - del namespace[name] - continue + if load_self: + for name in namespace.keys(): + if (hasattr(__builtins__, name) + or name.startswith('_')): + del namespace[name] + continue + if orig.has_key(name) and namespace[name] is orig[name]: + del namespace[name] + continue + if isinstance(namespace[name], types.ModuleType): + del namespace[name] + continue + for key, value in old_values.items(): + if value is None and namespace.has_key(key): + del namespace[key] + elif value is not None: + namespace[key] = value + return namespace + + def make_loader(self, relative_to, namespace): + def load(filename): + filename = os.path.join(os.path.dirname(relative_to), + filename) + return self.read_file(filename, namespace=namespace.copy()) + return load + + def make_includer(self, relative_to, namespace): + def include(filename): + filename = os.path.join(os.path.dirname(relative_to), + filename) + self.read_file(filename, namespace=namespace, + load_self=False) + return include + + def load(self, filename, default=False): + namespace = self.read_file(filename) self.load_dict(namespace, default) def load_dict(self, d, default=False): @@ -166,3 +202,4 @@ class Config(UserDict.DictMixin): pass return value + diff --git a/paste/tests/pyconfig_data/loader.conf b/paste/tests/pyconfig_data/loader.conf new file mode 100644 index 0000000..a8b0e55 --- /dev/null +++ b/paste/tests/pyconfig_data/loader.conf @@ -0,0 +1,5 @@ +value1 = 'value' +lst = ['a'] +loaded = load('loader_loaded.conf') + +include('loader_included.conf') diff --git a/paste/tests/pyconfig_data/loader_included.conf b/paste/tests/pyconfig_data/loader_included.conf new file mode 100644 index 0000000..230a3e1 --- /dev/null +++ b/paste/tests/pyconfig_data/loader_included.conf @@ -0,0 +1,2 @@ +new_value = 10 +value1 += 'more' diff --git a/paste/tests/pyconfig_data/loader_loaded.conf b/paste/tests/pyconfig_data/loader_loaded.conf new file mode 100644 index 0000000..fcf44e7 --- /dev/null +++ b/paste/tests/pyconfig_data/loader_loaded.conf @@ -0,0 +1,2 @@ +value1 = value1 + ' a test' +lst.append('b') diff --git a/paste/tests/test_pyconfig.py b/paste/tests/test_pyconfig.py index 66d2e91..9c1af73 100644 --- a/paste/tests/test_pyconfig.py +++ b/paste/tests/test_pyconfig.py @@ -1,6 +1,7 @@ import os from paste import pyconfig from py.test import raises +from paste import reloader def path(name): return os.path.join(os.path.dirname(os.path.abspath(__file__)), @@ -44,3 +45,14 @@ def test_command(): assert conf['config_file'] == 'arg2' raises(KeyError, "conf['h']") raises(KeyError, "conf['f']") + +def test_load(): + conf = pyconfig.load(path('loader.conf')) + print conf + assert conf['value1'] == 'valuemore' + assert conf['new_value'] == 10 + assert conf['lst'] == ['a', 'b'] + assert conf['loaded']['value1'] == 'value a test' + extra = reloader.Monitor.global_extra_files + for fn in 'loader.conf', 'loader_loaded.conf', 'loader_included.conf': + assert path(fn) in extra |
