thirdparty/google_appengine/google/appengine/api/lib_config.py
author Mario Ferraro <fadinlight@gmail.com>
Sun, 15 Nov 2009 22:12:20 +0100
changeset 3093 d1be59b6b627
parent 3031 7678f72140e6
permissions -rwxr-xr-x
GMaps related JS changed to use new google namespace. Google is going to change permanently in the future the way to load its services, so better stay safe. Also this commit shows uses of the new melange.js module. Fixes Issue 634.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3031
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/env python
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     2
#
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     3
# Copyright 2007 Google Inc.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     4
#
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     5
# Licensed under the Apache License, Version 2.0 (the "License");
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     6
# you may not use this file except in compliance with the License.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     7
# You may obtain a copy of the License at
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     8
#
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     9
#     http://www.apache.org/licenses/LICENSE-2.0
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    10
#
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    11
# Unless required by applicable law or agreed to in writing, software
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    12
# distributed under the License is distributed on an "AS IS" BASIS,
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    13
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    14
# See the License for the specific language governing permissions and
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    15
# limitations under the License.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    16
#
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    17
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    18
"""A mechanism for library configuration.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    19
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    20
Whenever App Engine library code has the need for a user-configurable
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    21
value, it should use the following protocol:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    22
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    23
1. Pick a prefix unique to the library module, e.g. 'mylib'.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    24
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    25
2. Call lib_config.register(prefix, mapping) with that prefix as
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    26
   the first argument and a dict mapping suffixes to default functions
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    27
   as the second.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    28
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    29
3. The register() function returns a config handle unique to this
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    30
   prefix.  The config handle object has attributes corresponding to
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    31
   each of the suffixes given in the mapping.  Call these functions
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    32
   (they're not really methods even though they look like methods) to
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    33
   access the user's configuration value.  If the user didn't
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    34
   configure a function, the default function from the mapping is
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    35
   called instead.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    36
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    37
4. Document the function name and its signature and semantics.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    38
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    39
Users wanting to provide configuration values should create a module
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    40
named appengine_config.py in the top-level directory of their
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    41
application, and define functions as documented by various App Engine
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    42
library components in that module.  To change the configuration, edit
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    43
the file and re-deploy the application.  (When using the SDK, no
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    44
redeployment is required: the development server will pick up the
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    45
changes the next time it handles a request.)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    46
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    47
Third party libraries can also use this mechanism.  For casual use,
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    48
just calling the register() method with a unique prefix is okay.  For
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    49
carefull libraries, however, it is recommended to instantiate a new
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    50
LibConfigRegistry instance using a different module name.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    51
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    52
Example appengine_config.py file:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    53
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    54
  from somewhere import MyMiddleWareClass
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    55
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    56
  def mylib_add_middleware(app):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    57
    app = MyMiddleWareClass(app)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    58
    return app
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    59
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    60
Example library use:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    61
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    62
  from google.appengine.api import lib_config
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    63
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    64
  config_handle = lib_config.register(
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    65
      'mylib',
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    66
      {'add_middleware': lambda app: app})
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    67
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    68
  def add_middleware(app):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    69
    return config_handle.add_middleware(app)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    70
"""
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    71
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    72
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    73
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    74
import logging
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    75
import os
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    76
import sys
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    77
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    78
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    79
DEFAULT_MODNAME = 'appengine_config'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    80
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    81
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    82
class LibConfigRegistry(object):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    83
  """A registry for library configuration values."""
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    84
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    85
  def __init__(self, modname):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    86
    """Constructor.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    87
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    88
    Args:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    89
      modname: The module name to be imported.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    90
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    91
    Note: the actual import of this module is deferred until the first
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    92
    time a configuration value is requested through attribute access
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    93
    on a ConfigHandle instance.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    94
    """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    95
    self._modname = modname
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    96
    self._registrations = {}
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    97
    self._module = None
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    98
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    99
  def register(self, prefix, mapping):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   100
    """Register a set of configuration names.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   101
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   102
    Args:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   103
      prefix: A shared prefix for the configuration names being registered.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   104
          If the prefix doesn't end in '_', that character is appended.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   105
      mapping: A dict mapping suffix strings to default values.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   106
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   107
    Returns:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   108
      A ConfigHandle instance.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   109
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   110
    It's okay to re-register the same prefix: the mappings are merged,
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   111
    and for duplicate suffixes the most recent registration wins.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   112
    """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   113
    if not prefix.endswith('_'):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   114
      prefix += '_'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   115
    handle = self._registrations.get(prefix)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   116
    if handle is None:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   117
      handle = ConfigHandle(prefix, self)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   118
      self._registrations[prefix] = handle
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   119
    handle._update_defaults(mapping)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   120
    return handle
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   121
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   122
  def initialize(self):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   123
    """Attempt to import the config module, if not already imported.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   124
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   125
    This function always sets self._module to a value unequal
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   126
    to None: either the imported module (if imported successfully), or
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   127
    a dummy object() instance (if an ImportError was raised).  Other
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   128
    exceptions are *not* caught.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   129
    """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   130
    if self._module is not None:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   131
      return
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   132
    try:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   133
      __import__(self._modname)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   134
    except ImportError, err:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   135
      self._module = object()
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   136
    else:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   137
      self._module = sys.modules[self._modname]
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   138
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   139
  def _pairs(self, prefix):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   140
    """Generate (key, value) pairs from the config module matching prefix.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   141
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   142
    Args:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   143
      prefix: A prefix string ending in '_', e.g. 'mylib_'.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   144
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   145
    Yields:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   146
      (key, value) pairs where key is the configuration name with
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   147
      prefix removed, and value is the corresponding value.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   148
    """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   149
    mapping = getattr(self._module, '__dict__', None)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   150
    if not mapping:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   151
      return
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   152
    nskip = len(prefix)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   153
    for key, value in mapping.iteritems():
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   154
      if key.startswith(prefix):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   155
        yield key[nskip:], value
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   156
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   157
  def _dump(self):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   158
    """Print info about all registrations to stdout."""
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   159
    self.initialize()
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   160
    if not hasattr(self._module, '__dict__'):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   161
      print 'Module %s.py does not exist.' % self._modname
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   162
    elif not self._registrations:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   163
      print 'No registrations for %s.py.' % self._modname
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   164
    else:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   165
      print 'Registrations in %s.py:' % self._modname
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   166
      print '-'*40
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   167
      for prefix in sorted(self._registrations):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   168
        self._registrations[prefix]._dump()
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   169
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   170
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   171
class ConfigHandle(object):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   172
  """A set of configuration for a single library module or package.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   173
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   174
  Public attributes of instances of this class are configuration
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   175
  values.  Attributes are dynamically computed (in __getattr__()) and
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   176
  cached as regular instance attributes.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   177
  """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   178
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   179
  _initialized = False
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   180
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   181
  def __init__(self, prefix, registry):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   182
    """Constructor.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   183
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   184
    Args:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   185
      prefix: A shared prefix for the configuration names being registered.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   186
          It *must* end in '_'.  (This is enforced by LibConfigRegistry.)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   187
      registry: A LibConfigRegistry instance.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   188
    """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   189
    assert prefix.endswith('_')
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   190
    self._prefix = prefix
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   191
    self._defaults = {}
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   192
    self._overrides = {}
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   193
    self._registry = registry
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   194
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   195
  def _update_defaults(self, mapping):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   196
    """Update the default mappings.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   197
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   198
    Args:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   199
      mapping: A dict mapping suffix strings to default values.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   200
    """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   201
    for key, value in mapping.iteritems():
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   202
      if key.startswith('__') and key.endswith('__'):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   203
        continue
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   204
      self._defaults[key] = value
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   205
    if self._initialized:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   206
      self._update_configs()
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   207
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   208
  def _update_configs(self):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   209
    """Update the configuration values.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   210
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   211
    This clears the cached values, initializes the registry, and loads
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   212
    the configuration values from the config module.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   213
    """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   214
    if self._initialized:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   215
      self._clear_cache()
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   216
    self._registry.initialize()
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   217
    for key, value in self._registry._pairs(self._prefix):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   218
      if key not in self._defaults:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   219
        logging.warn('Configuration "%s" not recognized', self._prefix + key)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   220
      else:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   221
        self._overrides[key] = value
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   222
    self._initialized = True
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   223
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   224
  def _clear_cache(self):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   225
    """Clear the cached values."""
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   226
    for key in self._defaults:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   227
      try:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   228
        delattr(self, key)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   229
      except AttributeError:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   230
        pass
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   231
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   232
  def _dump(self):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   233
    """Print info about this set of registrations to stdout."""
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   234
    print 'Prefix %s:' % self._prefix
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   235
    if self._overrides:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   236
      print '  Overrides:'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   237
      for key in sorted(self._overrides):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   238
        print '    %s = %r' % (key, self._overrides[key])
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   239
    else:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   240
      print '  No overrides'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   241
    if self._defaults:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   242
      print '  Defaults:'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   243
      for key in sorted(self._defaults):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   244
        print '    %s = %r' % (key, self._defaults[key])
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   245
    else:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   246
      print '  No defaults'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   247
    print '-'*40
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   248
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   249
  def __getattr__(self, suffix):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   250
    """Dynamic attribute access.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   251
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   252
    Args:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   253
      suffix: The attribute name.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   254
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   255
    Returns:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   256
      A configuration values.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   257
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   258
    Raises:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   259
      AttributeError if the suffix is not a registered suffix.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   260
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   261
    The first time an attribute is referenced, this method is invoked.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   262
    The value returned taken either from the config module or from the
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   263
    registered default.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   264
    """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   265
    if not self._initialized:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   266
      self._update_configs()
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   267
    if suffix in self._overrides:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   268
      value = self._overrides[suffix]
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   269
    elif suffix in self._defaults:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   270
      value = self._defaults[suffix]
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   271
    else:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   272
      raise AttributeError(suffix)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   273
    setattr(self, suffix, value)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   274
    return value
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   275
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   276
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   277
_default_registry = LibConfigRegistry(DEFAULT_MODNAME)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   278
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   279
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   280
def register(prefix, mapping):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   281
  """Register a set of configurations with the default config module.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   282
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   283
  Args:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   284
    prefix: A shared prefix for the configuration names being registered.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   285
        If the prefix doesn't end in '_', that character is appended.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   286
    mapping: A dict mapping suffix strings to default values.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   287
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   288
  Returns:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   289
    A ConfigHandle instance.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   290
  """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   291
  return _default_registry.register(prefix, mapping)
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   292
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   293
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   294
def main():
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   295
  """CGI-style request handler to dump the configuration.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   296
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   297
  Put this in your app.yaml to enable (you can pick any URL):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   298
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   299
  - url: /lib_config
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   300
    script: $PYTHON_LIB/google/appengine/api/lib_config.py
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   301
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   302
  Note: unless you are using the SDK, you must be admin.
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   303
  """
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   304
  if not os.getenv('SERVER_SOFTWARE', '').startswith('Dev'):
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   305
    from google.appengine.api import users
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   306
    if not users.is_current_user_admin():
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   307
      if users.get_current_user() is None:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   308
        print 'Status: 302'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   309
        print 'Location:', users.create_login_url(os.getenv('PATH_INFO', ''))
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   310
      else:
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   311
        print 'Status: 403'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   312
        print
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   313
        print 'Forbidden'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   314
      return
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   315
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   316
  print 'Content-type: text/plain'
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   317
  print
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   318
  _default_registry._dump()
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   319
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   320
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   321
if __name__ == '__main__':
7678f72140e6 Update Google App Engine from 1.2.5 to 1.2.7 in thirdparty folder.
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   322
  main()