From 5dfd37d208ae548d7711fb53053cb55ee1394c40 Mon Sep 17 00:00:00 2001 From: grabner Date: Sat, 20 May 2017 10:38:07 -0400 Subject: fixed interpolated "%inherit" values for python pre-2.7.12 --- iniherit/parser.py | 40 +++++++++++++++++++++++++++------------- 1 file 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 @@ -47,6 +47,13 @@ class Loader(object): return open(name, encoding=encoding) +#------------------------------------------------------------------------------ +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,19 +100,13 @@ 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() @@ -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: @@ -192,12 +195,23 @@ class IniheritMixin(object): else: _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: -- cgit v1.2.1