summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgrabner <pjg.github@ubergrabner.net>2017-05-20 10:38:07 -0400
committergrabner <pjg.github@ubergrabner.net>2017-05-20 10:38:07 -0400
commit5dfd37d208ae548d7711fb53053cb55ee1394c40 (patch)
tree68848e51045237c2387f93257acf8ff6b8660cee
parent33e9944a9211798f15191214e3c0aa604261adb4 (diff)
downloadiniherit-5dfd37d208ae548d7711fb53053cb55ee1394c40.tar.gz
fixed interpolated "%inherit" values for python pre-2.7.12
-rw-r--r--iniherit/parser.py40
1 files changed, 27 insertions, 13 deletions
diff --git a/iniherit/parser.py b/iniherit/parser.py
index 85344a5..74db7df 100644
--- a/iniherit/parser.py
+++ b/iniherit/parser.py
@@ -48,6 +48,13 @@ class Loader(object):
#------------------------------------------------------------------------------
+def _get_real_interpolate(parser):
+ # todo: should this be sensitive to `parser`?...
+ return \
+ getattr(_real_ConfigParser, '_iniherit__interpolate', None) \
+ or getattr(_real_ConfigParser, '_interpolate', None)
+
+#------------------------------------------------------------------------------
# TODO: this would probably be *much* simpler with meta-classes...
#------------------------------------------------------------------------------
@@ -93,20 +100,14 @@ class IniheritMixin(object):
self._iniherit__read(fp, fpname)
#----------------------------------------------------------------------------
- def _makeParser(self):
- ret = _real_RawConfigParser()
+ def _makeParser(self, raw=True):
+ ret = _real_RawConfigParser() if raw else _real_ConfigParser()
ret.inherit = False
## TODO: any other configurations that need to be copied into `ret`??...
ret.optionxform = self.optionxform
return ret
#----------------------------------------------------------------------------
- def _interpolate_inherit(self, parser, section, option, value):
- ## TODO: ugh. this just doesn't feel "right"...
- vars = dict(parser.items(section))
- return self._interpolate(section, option, value, vars)
-
- #----------------------------------------------------------------------------
def _readRecursive(self, fp, fpname, encoding=None):
ret = self._makeParser()
src = self._makeParser()
@@ -115,7 +116,8 @@ class IniheritMixin(object):
if src.has_option(self.IM_DEFAULTSECT, self.IM_INHERITTAG):
inilist = src.get(self.IM_DEFAULTSECT, self.IM_INHERITTAG)
src.remove_option(self.IM_DEFAULTSECT, self.IM_INHERITTAG)
- inilist = self._interpolate_inherit(src, self.IM_DEFAULTSECT, self.IM_INHERITTAG, inilist)
+ inilist = self._interpolate_with_vars(
+ src, self.IM_DEFAULTSECT, self.IM_INHERITTAG, inilist)
for curname in inilist.split():
optional = curname.startswith('?')
if optional:
@@ -133,7 +135,8 @@ class IniheritMixin(object):
continue
inilist = src.get(section, self.IM_INHERITTAG)
src.remove_option(section, self.IM_INHERITTAG)
- inilist = self._interpolate_inherit(src, section, self.IM_INHERITTAG, inilist)
+ inilist = self._interpolate_with_vars(
+ src, section, self.IM_INHERITTAG, inilist)
for curname in inilist.split():
optional = curname.startswith('?')
if optional:
@@ -193,11 +196,22 @@ class IniheritMixin(object):
_real_RawConfigParser.set(parser, section, option, value)
#----------------------------------------------------------------------------
+ def _interpolate_with_vars(self, parser, section, option, rawval):
+ ## TODO: ugh. this just doesn't feel "right"...
+ try:
+ vars = dict(parser.items(section, raw=True))
+ except:
+ vars = dict(parser.items(section))
+ if not isinstance(parser, _real_ConfigParser):
+ parser = self._makeParser(raw=False)
+ base_interpolate = _get_real_interpolate(parser)
+ return interpolation.interpolate(
+ parser, base_interpolate, section, option, rawval, vars)
+
+ #----------------------------------------------------------------------------
# todo: yikes! overriding a private method!...
def _interpolate(self, section, option, rawval, vars):
- base_interpolate = getattr(_real_ConfigParser, '_iniherit__interpolate', None)
- if not base_interpolate:
- base_interpolate = getattr(_real_ConfigParser, '_interpolate', None)
+ base_interpolate = _get_real_interpolate(self)
return interpolation.interpolate(
self, base_interpolate, section, option, rawval, vars)
if not hasattr(_real_ConfigParser, '_interpolate') and not six.PY3: