summaryrefslogtreecommitdiff
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
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.
-rw-r--r--CHANGES.txt9
-rw-r--r--docs/api/settings.rst9
-rw-r--r--docs/index.rst1
-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
7 files changed, 81 insertions, 14 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index db13f4fa6..15954a481 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,15 @@
Next release
============
+Features
+--------
+
+- 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.
+
Bug Fixes
---------
diff --git a/docs/api/settings.rst b/docs/api/settings.rst
new file mode 100644
index 000000000..f314779be
--- /dev/null
+++ b/docs/api/settings.rst
@@ -0,0 +1,9 @@
+.. _settings_module:
+
+:mod:`repoze.bfg.settings`
+--------------------------
+
+.. automodule:: repoze.bfg.settings
+
+ .. autofunction:: get_settings
+
diff --git a/docs/index.rst b/docs/index.rst
index 180996d7c..4a2623b23 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -60,6 +60,7 @@ Per-module :mod:`repoze.bfg` API documentation.
api/router
api/scripting
api/security
+ api/settings
api/template
api/testing
api/traversal
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):