summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorianb <devnull@localhost>2005-05-01 22:53:29 +0000
committerianb <devnull@localhost>2005-05-01 22:53:29 +0000
commita2844f306456a6fbc1a6d45552dd8c653f13d726 (patch)
tree340f9c919af31c39371ed35990ff67d03c30c06f
parentb0b87b7cf4a74c9ed9febd4fef27d765517940c1 (diff)
downloadpaste-a2844f306456a6fbc1a6d45552dd8c653f13d726.tar.gz
Added load() and include() commands to configuration
-rw-r--r--paste/pyconfig.py67
-rw-r--r--paste/tests/pyconfig_data/loader.conf5
-rw-r--r--paste/tests/pyconfig_data/loader_included.conf2
-rw-r--r--paste/tests/pyconfig_data/loader_loaded.conf2
-rw-r--r--paste/tests/test_pyconfig.py12
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