[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