1b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# -*- coding: ascii -*-
2b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang#
3b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# Copyright 2007, 2008, 2009, 2010, 2011
4b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# Andr\xe9 Malo or his licensors, as applicable
5b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang#
6b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# Licensed under the Apache License, Version 2.0 (the "License");
7b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# you may not use this file except in compliance with the License.
8b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# You may obtain a copy of the License at
9b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang#
10b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang#     http://www.apache.org/licenses/LICENSE-2.0
11b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang#
12b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# Unless required by applicable law or agreed to in writing, software
13b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# distributed under the License is distributed on an "AS IS" BASIS,
14b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# See the License for the specific language governing permissions and
16b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang# limitations under the License.
17b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang"""
18b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang=================
19b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang Setup utilities
20b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang=================
21b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
22b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei WangSetup utilities.
23b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang"""
24b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang__author__ = u"Andr\xe9 Malo"
25b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang__docformat__ = "restructuredtext en"
26b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
27b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wangtry:
28b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    from distutils import log
29b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wangexcept ImportError:
30b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    class log(object):
31b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang        def info(self, value):
32b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang            print value
33b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang        def debug(self, value):
34b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang            pass
35b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    log = log()
36b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
37b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wangfrom distutils import util as _util
38b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wangtry:
39b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    from ConfigParser import SafeConfigParser
40b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wangexcept ImportError:
41b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    import ConfigParser as _config_parser
42b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    class SafeConfigParser(_config_parser.ConfigParser):
43b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang        """ Safe config parser """
44b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang        def _interpolate(self, section, option, rawval, vars):
45b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang            return rawval
46b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
47b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang        def items(self, section):
48b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang            return [(key, self.get(section, key))
49b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang                for key in self.options(section)
50b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang            ]
51b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
52b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
53b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wangdef humanbool(name, value):
54b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    """
55b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    Determine human boolean value
56b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
57b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    :Parameters:
58b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang      `name` : ``str``
59b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang        The config key (used for error message)
60b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
61b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang      `value` : ``str``
62b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang        The config value
63b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
64b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    :Return: The boolean value
65b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    :Rtype: ``bool``
66b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang
67b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    :Exceptions:
68b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang      - `ValueError` : The value could not be recognized
69b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    """
70b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    try:
71b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang        return _util.strtobool(str(value).strip().lower() or 'no')
72b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang    except ValueError:
73b2cf025c7d5cebd43084f38c6c7ff9cc17da428aWei Wang        raise ValueError("Unrecognized config value: %s = %s" % (name, value))
74