2012-02-05 11:38:07 +01:00
|
|
|
# Copyright (C) 2003-2012 John Goerzen & contributors
|
2003-01-04 05:57:46 +01:00
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
2003-04-16 21:23:45 +02:00
|
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
|
|
# (at your option) any later version.
|
2003-01-04 05:57:46 +01:00
|
|
|
#
|
|
|
|
# This program 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 General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software
|
2006-08-12 06:15:55 +02:00
|
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
2003-01-04 05:57:46 +01:00
|
|
|
|
2012-02-05 11:38:07 +01:00
|
|
|
try:
|
2015-01-01 22:18:45 +01:00
|
|
|
from ConfigParser import SafeConfigParser, Error
|
2012-02-05 11:38:07 +01:00
|
|
|
except ImportError: #python3
|
2015-01-01 22:18:45 +01:00
|
|
|
from configparser import SafeConfigParser, Error
|
2003-01-04 05:57:46 +01:00
|
|
|
from offlineimap.localeval import LocalEval
|
|
|
|
import os
|
2013-08-07 13:43:51 +02:00
|
|
|
import re
|
2003-01-04 05:57:46 +01:00
|
|
|
|
2011-08-29 12:03:26 +02:00
|
|
|
class CustomConfigParser(SafeConfigParser):
|
2003-01-04 05:57:46 +01:00
|
|
|
def getdefault(self, section, option, default, *args, **kwargs):
|
2014-10-05 09:49:08 +02:00
|
|
|
"""
|
|
|
|
Same as config.get, but returns the value of `default`
|
|
|
|
if there is no such option specified.
|
|
|
|
|
|
|
|
"""
|
2003-01-04 05:57:46 +01:00
|
|
|
if self.has_option(section, option):
|
2011-09-27 12:58:23 +02:00
|
|
|
return self.get(*(section, option) + args, **kwargs)
|
2003-01-04 05:57:46 +01:00
|
|
|
else:
|
|
|
|
return default
|
2013-07-21 21:00:23 +02:00
|
|
|
|
2014-10-05 09:49:08 +02:00
|
|
|
|
2003-01-07 04:15:22 +01:00
|
|
|
def getdefaultint(self, section, option, default, *args, **kwargs):
|
2014-10-05 09:49:08 +02:00
|
|
|
"""
|
|
|
|
Same as config.getint, but returns the value of `default`
|
|
|
|
if there is no such option specified.
|
|
|
|
|
|
|
|
"""
|
2003-01-07 04:15:22 +01:00
|
|
|
if self.has_option(section, option):
|
2011-09-27 12:58:23 +02:00
|
|
|
return self.getint (*(section, option) + args, **kwargs)
|
2003-01-07 04:15:22 +01:00
|
|
|
else:
|
|
|
|
return default
|
|
|
|
|
2014-10-05 09:49:08 +02:00
|
|
|
|
2003-04-29 04:25:42 +02:00
|
|
|
def getdefaultfloat(self, section, option, default, *args, **kwargs):
|
2014-10-05 09:49:08 +02:00
|
|
|
"""
|
|
|
|
Same as config.getfloat, but returns the value of `default`
|
|
|
|
if there is no such option specified.
|
|
|
|
|
|
|
|
"""
|
2003-04-29 04:25:42 +02:00
|
|
|
if self.has_option(section, option):
|
2011-09-27 12:58:23 +02:00
|
|
|
return self.getfloat(*(section, option) + args, **kwargs)
|
2003-04-29 04:25:42 +02:00
|
|
|
else:
|
|
|
|
return default
|
|
|
|
|
2003-01-07 04:15:22 +01:00
|
|
|
def getdefaultboolean(self, section, option, default, *args, **kwargs):
|
2014-10-05 09:49:08 +02:00
|
|
|
"""
|
|
|
|
Same as config.getboolean, but returns the value of `default`
|
|
|
|
if there is no such option specified.
|
|
|
|
|
|
|
|
"""
|
2003-01-07 04:15:22 +01:00
|
|
|
if self.has_option(section, option):
|
2011-09-27 12:58:23 +02:00
|
|
|
return self.getboolean(*(section, option) + args, **kwargs)
|
2003-01-07 04:15:22 +01:00
|
|
|
else:
|
|
|
|
return default
|
|
|
|
|
2013-08-07 13:43:51 +02:00
|
|
|
def getlist(self, section, option, separator_re):
|
|
|
|
"""
|
|
|
|
Parses option as the list of values separated
|
|
|
|
by the given regexp.
|
|
|
|
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
val = self.get(section, option).strip()
|
|
|
|
return re.split(separator_re, val)
|
|
|
|
except re.error as e:
|
|
|
|
raise Error("Bad split regexp '%s': %s" % \
|
|
|
|
(separator_re, e))
|
|
|
|
|
|
|
|
def getdefaultlist(self, section, option, default, separator_re):
|
2014-10-05 09:49:08 +02:00
|
|
|
"""
|
|
|
|
Same as getlist, but returns the value of `default`
|
|
|
|
if there is no such option specified.
|
|
|
|
|
|
|
|
"""
|
2013-08-07 13:43:51 +02:00
|
|
|
if self.has_option(section, option):
|
|
|
|
return self.getlist(*(section, option, separator_re))
|
|
|
|
else:
|
|
|
|
return default
|
|
|
|
|
2003-01-04 05:57:46 +01:00
|
|
|
def getmetadatadir(self):
|
2014-11-02 09:49:26 +01:00
|
|
|
xforms = [os.path.expanduser, os.path.expandvars]
|
2014-11-02 09:14:42 +01:00
|
|
|
d = self.getdefault("general", "metadata", "~/.offlineimap")
|
|
|
|
metadatadir = self.apply_xforms(d, xforms)
|
2003-01-04 05:57:46 +01:00
|
|
|
if not os.path.exists(metadatadir):
|
2012-02-05 11:31:54 +01:00
|
|
|
os.mkdir(metadatadir, 0o700)
|
2003-01-04 05:57:46 +01:00
|
|
|
return metadatadir
|
|
|
|
|
|
|
|
def getlocaleval(self):
|
2014-11-02 09:49:26 +01:00
|
|
|
xforms = [os.path.expanduser, os.path.expandvars]
|
2003-01-04 05:57:46 +01:00
|
|
|
if self.has_option("general", "pythonfile"):
|
2014-11-02 09:14:42 +01:00
|
|
|
path = self.apply_xforms(self.get("general", "pythonfile"), xforms)
|
2003-01-04 05:57:46 +01:00
|
|
|
else:
|
|
|
|
path = None
|
|
|
|
return LocalEval(path)
|
|
|
|
|
2003-04-18 04:18:34 +02:00
|
|
|
def getsectionlist(self, key):
|
2014-10-05 09:49:08 +02:00
|
|
|
"""
|
|
|
|
Returns a list of sections that start with key + " ".
|
|
|
|
|
|
|
|
That is, if key is "Account", returns all section names that
|
|
|
|
start with "Account ", but strips off the "Account ".
|
|
|
|
|
|
|
|
For instance, for "Account Test", returns "Test".
|
|
|
|
|
|
|
|
"""
|
2003-04-18 04:18:34 +02:00
|
|
|
key = key + ' '
|
|
|
|
return [x[len(key):] for x in self.sections() \
|
|
|
|
if x.startswith(key)]
|
|
|
|
|
2011-09-15 13:08:04 +02:00
|
|
|
def set_if_not_exists(self, section, option, value):
|
2014-10-05 09:49:08 +02:00
|
|
|
"""
|
|
|
|
Set a value if it does not exist yet
|
2011-09-15 13:08:04 +02:00
|
|
|
|
|
|
|
This allows to set default if the user has not explicitly
|
2014-10-05 09:49:08 +02:00
|
|
|
configured anything.
|
|
|
|
|
|
|
|
"""
|
2011-09-15 13:08:04 +02:00
|
|
|
if not self.has_option(section, option):
|
|
|
|
self.set(section, option, value)
|
|
|
|
|
2014-10-05 09:49:08 +02:00
|
|
|
|
2014-11-02 09:14:42 +01:00
|
|
|
def apply_xforms(self, string, transforms):
|
|
|
|
"""
|
|
|
|
Applies set of transformations to a string.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
- string: source string; if None, then no processing will
|
|
|
|
take place.
|
|
|
|
- transforms: iterable that returns transformation function
|
|
|
|
on each turn.
|
|
|
|
|
|
|
|
Returns transformed string.
|
|
|
|
|
|
|
|
"""
|
|
|
|
if string == None:
|
|
|
|
return None
|
|
|
|
for f in transforms:
|
|
|
|
string = f(string)
|
|
|
|
return string
|
|
|
|
|
|
|
|
|
2014-10-05 09:49:08 +02:00
|
|
|
|
2003-04-18 04:18:34 +02:00
|
|
|
def CustomConfigDefault():
|
2014-10-05 09:49:08 +02:00
|
|
|
"""
|
|
|
|
Just a constant that won't occur anywhere else.
|
2011-01-20 15:09:49 +01:00
|
|
|
|
|
|
|
This allows us to differentiate if the user has passed in any
|
|
|
|
default value to the getconf* functions in ConfigHelperMixin
|
2014-10-05 09:49:08 +02:00
|
|
|
derived classes.
|
|
|
|
|
|
|
|
"""
|
2003-04-18 04:18:34 +02:00
|
|
|
pass
|
|
|
|
|
2011-01-20 15:09:49 +01:00
|
|
|
|
2014-10-05 09:49:08 +02:00
|
|
|
|
|
|
|
class ConfigHelperMixin:
|
|
|
|
"""
|
|
|
|
Allow comfortable retrieving of config values pertaining
|
|
|
|
to a section.
|
|
|
|
|
|
|
|
If a class inherits from cls:`ConfigHelperMixin`, it needs
|
|
|
|
to provide 2 functions:
|
|
|
|
- meth:`getconfig` (returning a CustomConfigParser object)
|
|
|
|
- and meth:`getsection` (returning a string which represents
|
|
|
|
the section to look up).
|
|
|
|
All calls to getconf* will then return the configuration values
|
|
|
|
for the CustomConfigParser object in the specific section.
|
|
|
|
|
|
|
|
"""
|
2011-01-20 15:09:49 +01:00
|
|
|
|
2014-11-02 09:14:42 +01:00
|
|
|
|
2013-08-07 13:43:51 +02:00
|
|
|
def _confighelper_runner(self, option, default, defaultfunc, mainfunc, *args):
|
2014-10-05 09:49:08 +02:00
|
|
|
"""
|
2014-11-02 09:14:42 +01:00
|
|
|
Returns configuration or default value for option
|
2014-10-05 09:49:08 +02:00
|
|
|
that contains in section identified by getsection().
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
- option: name of the option to retrieve;
|
|
|
|
- default: governs which function we will call.
|
|
|
|
* When CustomConfigDefault is passed, we will call
|
|
|
|
the mainfunc.
|
|
|
|
* When any other value is passed, we will call
|
|
|
|
the defaultfunc and the value of `default` will
|
|
|
|
be passed as the third argument to this function.
|
|
|
|
- defaultfunc and mainfunc: processing helpers.
|
|
|
|
- args: additional trailing arguments that will be passed
|
|
|
|
to all processing helpers.
|
|
|
|
|
|
|
|
"""
|
2013-08-07 13:43:51 +02:00
|
|
|
lst = [self.getsection(), option]
|
2011-01-20 15:09:49 +01:00
|
|
|
if default == CustomConfigDefault:
|
2013-08-07 13:43:51 +02:00
|
|
|
return mainfunc(*(lst + list(args)))
|
2011-01-20 15:09:49 +01:00
|
|
|
else:
|
2013-08-07 13:43:51 +02:00
|
|
|
lst.append(default)
|
|
|
|
return defaultfunc(*(lst + list(args)))
|
2003-04-18 04:18:34 +02:00
|
|
|
|
2011-01-20 15:09:49 +01:00
|
|
|
|
2014-10-05 09:49:08 +02:00
|
|
|
def getconfig(self):
|
|
|
|
"""
|
|
|
|
Returns CustomConfigParser object that we will use
|
|
|
|
for all our actions.
|
|
|
|
|
|
|
|
Must be overriden in all classes that use this mix-in.
|
|
|
|
|
|
|
|
"""
|
|
|
|
raise NotImplementedError("ConfigHelperMixin.getconfig() "
|
|
|
|
"is to be overriden")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def getsection(self):
|
|
|
|
"""
|
|
|
|
Returns name of configuration section in which our
|
|
|
|
class keeps its configuration.
|
|
|
|
|
|
|
|
Must be overriden in all classes that use this mix-in.
|
|
|
|
|
|
|
|
"""
|
|
|
|
raise NotImplementedError("ConfigHelperMixin.getsection() "
|
|
|
|
"is to be overriden")
|
|
|
|
|
|
|
|
|
|
|
|
def getconf(self, option, default = CustomConfigDefault):
|
2014-11-02 09:14:42 +01:00
|
|
|
"""
|
|
|
|
Retrieves string from the configuration.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
- option: option name whose value is to be retrieved;
|
|
|
|
- default: default return value if no such option
|
|
|
|
exists.
|
|
|
|
|
|
|
|
"""
|
2003-04-18 04:18:34 +02:00
|
|
|
return self._confighelper_runner(option, default,
|
|
|
|
self.getconfig().getdefault,
|
|
|
|
self.getconfig().get)
|
|
|
|
|
2014-11-02 09:14:42 +01:00
|
|
|
|
|
|
|
def getconf_xform(self, option, xforms, default = CustomConfigDefault):
|
|
|
|
"""
|
|
|
|
Retrieves string from the configuration transforming the result.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
- option: option name whose value is to be retrieved;
|
|
|
|
- xforms: iterable that returns transform functions
|
|
|
|
to be applied to the value of the option,
|
|
|
|
both retrieved and default one;
|
|
|
|
- default: default value for string if no such option
|
|
|
|
exists.
|
|
|
|
|
|
|
|
"""
|
|
|
|
value = self.getconf(option, default)
|
|
|
|
return self.getconfig().apply_xforms(value, xforms)
|
|
|
|
|
|
|
|
|
2003-04-18 04:18:34 +02:00
|
|
|
def getconfboolean(self, option, default = CustomConfigDefault):
|
2014-11-02 09:14:42 +01:00
|
|
|
"""
|
|
|
|
Retrieves boolean value from the configuration.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
- option: option name whose value is to be retrieved;
|
|
|
|
- default: default return value if no such option
|
|
|
|
exists.
|
|
|
|
|
|
|
|
"""
|
2003-04-18 04:18:34 +02:00
|
|
|
return self._confighelper_runner(option, default,
|
|
|
|
self.getconfig().getdefaultboolean,
|
|
|
|
self.getconfig().getboolean)
|
|
|
|
|
2014-11-02 09:14:42 +01:00
|
|
|
|
2003-04-18 04:18:34 +02:00
|
|
|
def getconfint(self, option, default = CustomConfigDefault):
|
2014-11-02 09:14:42 +01:00
|
|
|
"""
|
|
|
|
Retrieves integer value from the configuration.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
- option: option name whose value is to be retrieved;
|
|
|
|
- default: default return value if no such option
|
|
|
|
exists.
|
|
|
|
|
|
|
|
"""
|
2003-04-18 04:18:34 +02:00
|
|
|
return self._confighelper_runner(option, default,
|
|
|
|
self.getconfig().getdefaultint,
|
|
|
|
self.getconfig().getint)
|
2013-07-21 21:00:23 +02:00
|
|
|
|
2014-11-02 09:14:42 +01:00
|
|
|
|
2003-04-29 04:25:42 +02:00
|
|
|
def getconffloat(self, option, default = CustomConfigDefault):
|
2014-11-02 09:14:42 +01:00
|
|
|
"""
|
|
|
|
Retrieves floating-point value from the configuration.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
- option: option name whose value is to be retrieved;
|
|
|
|
- default: default return value if no such option
|
|
|
|
exists.
|
|
|
|
|
|
|
|
"""
|
2003-04-29 04:25:42 +02:00
|
|
|
return self._confighelper_runner(option, default,
|
|
|
|
self.getconfig().getdefaultfloat,
|
|
|
|
self.getconfig().getfloat)
|
2013-08-07 13:43:51 +02:00
|
|
|
|
2014-11-02 09:14:42 +01:00
|
|
|
|
2013-08-07 13:43:51 +02:00
|
|
|
def getconflist(self, option, separator_re,
|
2014-10-05 09:49:08 +02:00
|
|
|
default = CustomConfigDefault):
|
2014-11-02 09:14:42 +01:00
|
|
|
"""
|
|
|
|
Retrieves strings from the configuration and splits it
|
|
|
|
into the list of strings.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
- option: option name whose value is to be retrieved;
|
|
|
|
- separator_re: regular expression for separator
|
|
|
|
to be used for split operation;
|
|
|
|
- default: default return value if no such option
|
|
|
|
exists.
|
|
|
|
|
|
|
|
"""
|
2013-08-07 13:43:51 +02:00
|
|
|
return self._confighelper_runner(option, default,
|
|
|
|
self.getconfig().getdefaultlist,
|
|
|
|
self.getconfig().getlist, separator_re)
|