[Buildbot] #3505: Cases of Interpolate failing to render properly in cases of replacements (-, ~)
Buildbot trac
trac at buildbot.net
Fri Mar 25 18:09:29 UTC 2016
#3505: Cases of Interpolate failing to render properly in cases of replacements
(-, ~)
----------------------+-----------------------
Reporter: gracinet | Owner:
Type: undecided | Status: new
Priority: major | Milestone: undecided
Version: 0.8.12 | Keywords:
----------------------+-----------------------
Sometimes, instead of doing its interpolation with replacements,
``Interpolate('abc_%(prop:myprop-default)'`` can output ``abc_`` instead
of ``abc_propvalue`` or ``abc_default``. I've seen this even with the
property having a non empty value.
This is because the ``_Lookup`` class (used internally) takes an optional
``hasKey`` parameter, does some special actions if is not passed. This
parameter is not passed in case of ``-`` and ``~`` replacement directives:
{{{
def _parseColon_minus(self, d, kw, repl):
return _Lookup(d, kw,
default=Interpolate(repl, **self.kwargs),
defaultWhenFalse=False,
elideNoneAs='')
def _parseColon_tilde(self, d, kw, repl):
return _Lookup(d, kw,
default=Interpolate(repl, **self.kwargs),
defaultWhenFalse=True,
elideNoneAs='')
def _parseColon_plus(self, d, kw, repl):
return _Lookup(d, kw,
hasKey=Interpolate(repl, **self.kwargs),
default='',
defaultWhenFalse=False,
elideNoneAs='')
}}}
To detect that ``hasKey`` is not passed, ``_Lookup`` uses the classical
constant-that-is-not-None pattern:
{{{
_notHasKey = object() # Marker object for _Lookup(..., hasKey=...)
default
class _Lookup(util.ComparableMixin, object):
implements(IRenderable)
compare_attrs = ('value', 'index', 'default', 'defaultWhenFalse',
'hasKey', 'elideNoneAs')
def __init__(self, value, index, default=None,
defaultWhenFalse=True, hasKey=_notHasKey,
elideNoneAs=None):
(...)
if self.defaultWhenFalse:
rv = yield build.render(value[index])
if not rv:
rv = yield build.render(self.default)
elif self.hasKey is not _notHasKey:
rv = yield build.render(self.hasKey)
elif self.hasKey is not _notHasKey:
rv = yield build.render(self.hasKey)
else:
rv = yield build.render(value[index])
}}}
But sometimes that fails because the constant can change (notably after a
if ``reload``)
Seen on 0.8.12 (took me an awful lot of time to grasp it), forgot about it
then.
Got it again today on current master (post 0.9.0b7).
--
Ticket URL: <http://trac.buildbot.net/ticket/3505>
Buildbot <http://buildbot.net/>
Buildbot: build/test automation
More information about the bugs
mailing list