summaryrefslogtreecommitdiff
path: root/repoze/bfg/settings.py
blob: 9cb2502a1cd6fe7cf5a604a3c9839b3b71fa25e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import os

from zope.interface import implements

from repoze.bfg.interfaces import ISettings

from repoze.bfg.threadlocal import get_current_registry

class Settings(dict):
    """ Deployment settings.  Update application settings (usually
    from PasteDeploy keywords) with framework-specific key/value pairs
    (e.g. find ``BFG_DEBUG_AUTHORIZATION`` in os.environ and jam into
    keyword args)."""
    implements(ISettings)
    # _environ_ is dep inj for testing
    def __init__(self, d=None, _environ_=os.environ, **kw):
        if d is None:
            d = {}
        dict.__init__(self, d, **kw)
        eget = _environ_.get
        config_debug_all = self.get('debug_all', '')
        eff_debug_all = asbool(eget('BFG_DEBUG_ALL', config_debug_all))
        config_reload_all = self.get('reload_all', '')
        eff_reload_all = asbool(eget('BFG_RELOAD_ALL',config_reload_all))
        config_debug_auth = self.get('debug_authorization', '')
        eff_debug_auth = asbool(eget('BFG_DEBUG_AUTHORIZATION',
                                     config_debug_auth))
        config_debug_notfound = self.get('debug_notfound', '')
        eff_debug_notfound = asbool(eget('BFG_DEBUG_NOTFOUND',
                                         config_debug_notfound))
        config_reload_templates = self.get('reload_templates', '')
        eff_reload_templates = asbool(eget('BFG_RELOAD_TEMPLATES',
                                           config_reload_templates))
        config_reload_resources = self.get('reload_resources', '')
        eff_reload_resources = asbool(eget('BFG_RELOAD_RESOURCES',
                                           config_reload_resources))
        configure_zcml = self.get('configure_zcml', '')
        eff_configure_zcml = eget('BFG_CONFIGURE_ZCML', configure_zcml)
        locale_name = self.get('locale_name', 'en')
        eff_locale_name = eget('BFG_DEFAULT_LOCALE_NAME', locale_name)
        
        update = {
            'debug_authorization': eff_debug_all or eff_debug_auth,
            'debug_notfound': eff_debug_all or eff_debug_notfound,
            'reload_templates': eff_reload_all or eff_reload_templates,
            'reload_resources':eff_reload_all or eff_reload_resources,
            'configure_zcml':eff_configure_zcml,
            'default_locale_name':eff_locale_name,
            }

        self.update(update)
        
    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 ``settings``
    argument to the :class:`repoze.bfg.configuration.Configurator`
    constructor or the :func:`repoze.bfg.router.make_app` API.

    .. note:: For backwards compatibility, dictionary keys can also be
       looked up as attributes of the settings object.
    """
    reg = get_current_registry()
    return reg.queryUtility(ISettings)

def asbool(s):
    s = str(s).strip()
    return s.lower() in ('t', 'true', 'y', 'yes', 'on', '1')