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