summaryrefslogtreecommitdiff
path: root/repoze
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-02 18:40:52 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-02 18:40:52 +0000
commitf0fd9d62c991afe0b125beb6d7f583be9500de84 (patch)
treeba0ac4df571b3a3448b73edc0b5ed7651d161577 /repoze
parentdb0467ca526c07ab719de7e74c84882d3297ce83 (diff)
downloadpyramid-f0fd9d62c991afe0b125beb6d7f583be9500de84.tar.gz
pyramid-f0fd9d62c991afe0b125beb6d7f583be9500de84.tar.bz2
pyramid-f0fd9d62c991afe0b125beb6d7f583be9500de84.zip
- Add API named ``repoze.bfg.settings.get_settings`` which retrieves a
derivation of values passed as the ``options`` value of ``repoze.bfg.router.make_app``. This API should be preferred instead of using getUtility(ISettings). I added a new ``repoze.bfg.settings`` API document as well.
Diffstat (limited to 'repoze')
-rw-r--r--repoze/bfg/router.py3
-rw-r--r--repoze/bfg/settings.py24
-rw-r--r--repoze/bfg/tests/test_router.py11
-rw-r--r--repoze/bfg/tests/test_settings.py38
4 files changed, 62 insertions, 14 deletions
diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py
index 51094229a..0c00b239c 100644
--- a/repoze/bfg/router.py
+++ b/repoze/bfg/router.py
@@ -46,6 +46,7 @@ from repoze.bfg.secpols import registerBBBAuthn
from repoze.bfg.security import Allowed
from repoze.bfg.settings import Settings
+from repoze.bfg.settings import get_options
from repoze.bfg.threadlocal import manager
@@ -350,7 +351,7 @@ def make_app(root_factory, package=None, filename='configure.zcml',
if debug_logger is None:
debug_logger = make_stream_logger('repoze.bfg.debug', sys.stderr)
registry.registerUtility(debug_logger, ILogger, 'repoze.bfg.debug')
- settings = Settings(options)
+ settings = Settings(get_options(options))
registry.registerUtility(settings, ISettings)
if authentication_policy:
diff --git a/repoze/bfg/settings.py b/repoze/bfg/settings.py
index 795b5932a..df2a5e99e 100644
--- a/repoze/bfg/settings.py
+++ b/repoze/bfg/settings.py
@@ -1,14 +1,30 @@
import os
+from zope.component import queryUtility
from zope.interface import implements
from repoze.bfg.interfaces import ISettings
-class Settings(object):
+class Settings(dict):
implements(ISettings)
- def __init__(self, options):
- options = get_options(options)
- self.__dict__.update(options)
+ def __getattr__(self, name):
+ # backwards compatibility
+ try:
+ return self[name]
+ except KeyError:
+ raise AttributeError(name)
+
+def get_settings():
+ """
+ Return a 'settings' object for the current application. A
+ 'settings' object is a dictionary-like object that contains
+ key/value pairs based on the dictionary passed as the ``options``
+ argument to the ``repoze.bfg.router.make_app`` API.
+
+ For backwards compatibility, dictionary keys can also be looked up
+ as attributes of the settings object.
+ """
+ return queryUtility(ISettings)
def asbool(s):
s = str(s).strip()
diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py
index d07efcc69..6e18f6089 100644
--- a/repoze/bfg/tests/test_router.py
+++ b/repoze/bfg/tests/test_router.py
@@ -798,6 +798,17 @@ class MakeAppTests(unittest.TestCase):
app = self._callFUT(rootpolicy, fixtureapp)
assert app.created is True
+ def test_custom_settings(self):
+ options= {'mysetting':True}
+ from repoze.bfg.tests import fixtureapp
+ rootpolicy = make_rootfactory(None)
+ app = self._callFUT(rootpolicy, fixtureapp, options=options)
+ from repoze.bfg.interfaces import ISettings
+ settings = app.registry.getUtility(ISettings)
+ self.assertEqual(settings.reload_templates, False)
+ self.assertEqual(settings.debug_authorization, False)
+ self.assertEqual(settings.mysetting, True)
+
def test_registrations(self):
options= {'reload_templates':True,
'debug_authorization':True}
diff --git a/repoze/bfg/tests/test_settings.py b/repoze/bfg/tests/test_settings.py
index 97fe9d026..903a23f5d 100644
--- a/repoze/bfg/tests/test_settings.py
+++ b/repoze/bfg/tests/test_settings.py
@@ -1,4 +1,5 @@
import unittest
+from repoze.bfg.testing import cleanUp
class TestSettings(unittest.TestCase):
def _getTargetClass(self):
@@ -9,17 +10,36 @@ class TestSettings(unittest.TestCase):
klass = self._getTargetClass()
return klass(options)
- def test_no_options(self):
- settings = self._makeOne()
+ def test_getattr(self):
+ settings = self._makeOne(reload_templates=False)
self.assertEqual(settings.reload_templates, False)
- self.assertEqual(settings.debug_notfound, False)
- self.assertEqual(settings.debug_authorization, False)
- def test_with_option(self):
- settings = self._makeOne(reload_templates=True)
- self.assertEqual(settings.reload_templates, True)
- self.assertEqual(settings.debug_notfound, False)
- self.assertEqual(settings.debug_authorization, False)
+ def test_getattr_raises_attribute_error(self):
+ settings = self._makeOne()
+ self.assertRaises(AttributeError, settings.__getattr__,
+ 'reload_templates'
+ )
+
+class TestGetSettings(unittest.TestCase):
+ def setUp(self):
+ cleanUp()
+
+ def tearDown(self):
+ cleanUp()
+
+ def _callFUT(self):
+ from repoze.bfg.settings import get_settings
+ return get_settings()
+
+ def test_it_nosettings(self):
+ self.assertEqual(self._callFUT(), None)
+
+ def test_it_withsettings(self):
+ from repoze.bfg.interfaces import ISettings
+ from zope.component import provideUtility
+ settings = {'a':1}
+ provideUtility(settings, ISettings)
+ self.assertEqual(self._callFUT(), settings)
class TestGetOptions(unittest.TestCase):
def _callFUT(self, *arg, **kw):