edbob/edbob/initialization.py
Lance Edgar c7e0bfef6a extended commit (see note)
- Slight overhaul of init() system; added ``edbob.init_modules()`` function.

- Added ``read_service()`` method to ``AppConfigParser`` class, for use with
  Windows services.

- Added generic ``Service`` class to ``edbob.win32`` module.  (File monitor now
  inherits from it.)

- Tweaked ``edbob.db`` initialization somewhat.  (``Base.metadata`` no longer
  binds to ``edbob.db.engine``.)

- Fixed guest role bug in ``edbob.db.auth.has_permission()`` function.

- Added "automagical" enumeration support for database extensions.

- Added ``EMAIL_PREFERENCE`` enum to ``contact`` database extension.

- Tweaked ``edbob.pyramid.includeme()``.

- Tweaked ``people`` Pyramid views.
2012-09-17 11:43:13 -07:00

121 lines
4 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
################################################################################
#
# edbob -- Pythonic Software Framework
# Copyright © 2010-2012 Lance Edgar
#
# This file is part of edbob.
#
# edbob is free software: you can redistribute it and/or modify it under the
# terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# edbob is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
# more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with edbob. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
``edbob.initialization`` -- Initialization Framework
"""
import os
import logging
import edbob
from edbob.configuration import (
AppConfigParser,
default_system_paths,
default_user_paths,
)
from edbob.exceptions import InitError
__all__ = ['init', 'init_modules', 'inited']
inited = []
log = logging.getLogger(__name__)
def init(appname='edbob', *args, **kwargs):
"""
Initializes the edbob framework, typically by first reading some config
file(s) to determine which interfaces to engage. This must normally be
called prior to doing anything really useful, as it is responsible for
extending the live API in-place.
The meaning of ``args`` is as follows:
If ``args`` is empty, the ``EDBOB_CONFIG`` environment variable is first
consulted. If it is nonempty, then its value is split according to
``os.pathsep`` and the resulting sequence is passed to
``edbob.config.read()``.
If both ``args`` and ``EDBOB_CONFIG`` are empty, the "standard" locations
are assumed, and the results of calling both
:func:`edbob.configuration.default_system_paths()` and
:func:`edbob.configuration.default_user_paths()` are passed on to
``edbob.config.read()``.
Any other values in ``args`` will be passed directly to
``edbob.config.read()`` and so will be interpreted there. Basically they
are assumed to be either strings, or sequences of strings, which represent
paths to various config files, each being read in the order in which it
appears within ``args``. (Configuration is thereby cascaded such that the
file read last will override those before it.)
"""
config = AppConfigParser(appname)
if args:
config_paths = list(args)
elif os.environ.get('EDBOB_CONFIG'):
config_paths = os.environ['EDBOB_CONFIG'].split(os.pathsep)
else:
config_paths = default_system_paths(appname) + default_user_paths(appname)
service = kwargs.get('service')
if service:
config.read_service(service, config_paths)
else:
shell = kwargs.get('shell', False)
for paths in config_paths:
config.read(paths, recurse=not shell)
config.configure_logging()
default_modules = 'edbob.time'
modules = config.get('edbob', 'init', default=default_modules)
if modules:
modules = modules.split(',')
init_modules(modules, config)
edbob.graft(edbob, locals(), 'config')
inited.append('edbob')
def init_modules(names, config=None):
"""
Initialize the given modules. ``names`` should be a sequence of strings,
each of which should be a dotted module name. If ``config`` is not
specified, :attr:`edbob.config` is assumed.
"""
if config is None:
config = edbob.config
for name in names:
name = name.strip()
if name not in inited:
module = __import__(name, globals(), locals(), fromlist=['init'])
if not hasattr(module, 'init'):
raise InitError(module)
getattr(module, 'init')(config)
inited.append(name)