Source code for milla.util

# Copyright 2011 Dustin C. Hatch
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
'''Convenience utility functions

:Created: Mar 30, 2011
:Author: dustin
'''

from wsgiref.handlers import format_date_time
import datetime
import time
try:
    import configparser
except ImportError:
    import ConfigParser as configparser

[docs]def asbool(val): '''Test a value for truth Returns ``False`` values evaluating as false, such as the integer ``0`` or ``None``, and for the following strings, irrespective of letter case: * false * no * f * n * off * 0 Returns ``True`` for all other values. ''' if not val: return False try: val = val.lower() except AttributeError: pass if val in ('false', 'no', 'f', 'n', 'off', '0'): return False return True
[docs]def http_date(date): '''Format a datetime object as a string in RFC 1123 format This function returns a string representing the date according to RFC 1123. The string returned will always be in English, as required by the specification. :param date: A :py:class:`datetime.datetime` object :return: RFC 1123-formatted string ''' stamp = time.mktime(date.timetuple()) return format_date_time(stamp)
[docs]def read_config(filename, defaults=None): '''Parse an ini file into a nested dictionary :param string filename: Path to the ini file to read :param dict defaults: (Optional) A mapping of default values that can be used for interpolation when reading the configuration file :returns: A dictionary whose keys correspond to the section and option, joined with a dot character (.) For example, consider the following ini file:: [xmen] storm = Ororo Monroe cyclops = Scott Summers [avengers] hulk = Bruce Banner iron_man = Tony Stark The resulting dictionary would look like this:: { 'xmen.storm': 'Ororo Monroe', 'xmen.cyclops': 'Scott Summers', 'avengers.hulk': 'Bruce Banner', 'avengers.iron_man': 'Tony Stark', } Thus, the option values for any section can be obtained as follows:: config['xmen.storm'] This dictionary can be used to configure an :py:class:`~milla.Application` instance by using the ``update`` method:: config = milla.util.read_config('superheros.ini') app = milla.Application(router) app.config.update(config) ''' with open(filename) as f: # ConfigParser API changed in Python 3.2 if hasattr(configparser.ConfigParser, 'read_file'): cparser = configparser.ConfigParser(defaults) cparser.read_file(f) else: cparser = configparser.SafeConfigParser(defaults) cparser.readfp(f) config = {} for section in cparser.sections(): for option in cparser.options(section): config['.'.join((section, option))] = cparser.get(section, option) return config