# -*- coding: ascii -*-
#
# Copyright 2007, 2008, 2009, 2010, 2011
# Andr\xe9 Malo or his licensors, as applicable
#
# 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.
"""
=================
 Setup utilities
=================

Setup utilities.
"""
__author__ = u"Andr\xe9 Malo"
__docformat__ = "restructuredtext en"

try:
    from distutils import log
except ImportError:
    class log(object):
        def info(self, value):
            print value
        def debug(self, value):
            pass
    log = log()

from distutils import util as _util
try:
    from ConfigParser import SafeConfigParser
except ImportError:
    import ConfigParser as _config_parser
    class SafeConfigParser(_config_parser.ConfigParser):
        """ Safe config parser """
        def _interpolate(self, section, option, rawval, vars):
            return rawval

        def items(self, section):
            return [(key, self.get(section, key))
                for key in self.options(section)
            ]


def humanbool(name, value):
    """
    Determine human boolean value

    :Parameters:
      `name` : ``str``
        The config key (used for error message)

      `value` : ``str``
        The config value

    :Return: The boolean value
    :Rtype: ``bool``

    :Exceptions:
      - `ValueError` : The value could not be recognized
    """
    try:
        return _util.strtobool(str(value).strip().lower() or 'no')
    except ValueError:
        raise ValueError("Unrecognized config value: %s = %s" % (name, value))
