From f0fd9d62c991afe0b125beb6d7f583be9500de84 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Tue, 2 Jun 2009 18:40:52 +0000 Subject: - 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. --- CHANGES.txt | 9 +++++++++ docs/api/settings.rst | 9 +++++++++ docs/index.rst | 1 + repoze/bfg/router.py | 3 ++- repoze/bfg/settings.py | 24 ++++++++++++++++++++---- repoze/bfg/tests/test_router.py | 11 +++++++++++ repoze/bfg/tests/test_settings.py | 38 +++++++++++++++++++++++++++++--------- 7 files changed, 81 insertions(+), 14 deletions(-) create mode 100644 docs/api/settings.rst 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): -- cgit v1.2.3