Edgewall Software

Ticket #281: refactor-error-reporting-for-extraction-errors-r967.diff

File refactor-error-reporting-for-extraction-errors-r967.diff, 8.7 KB (added by cboos, 15 years ago)

move all the raise IndexError statements in one place

  • genshi/filters/i18n.py

     
    2020
    2121from compiler import ast
    2222from gettext import NullTranslations
     23import logging
    2324import os
    2425import re
    2526from types import FunctionType
     
    156157            assert callable(dgettext), "No domain gettext function passed"
    157158            gettext = lambda msg: dgettext(ctxt.get('_i18n.domain'), msg)
    158159
    159         msgbuf = MessageBuffer(self.params)
     160        msgbuf = MessageBuffer(self.params, MsgDirective)
    160161
    161162        new_stream = []
    162163        stream = iter(_apply_directives(stream, directives, ctxt))
     
    171172                for skind, sdata, spos in _apply_directives(substream,
    172173                                                            subdirectives,
    173174                                                            ctxt):
    174                     try:
    175                         msgbuf.append(*previous)
    176                         previous = skind, sdata, spos
    177                     except IndexError:
    178                         raise IndexError("Not enough parameters passed to '%s' "
    179                                          "on '%s', line number %s: %s" %
    180                                          (type(self).__name__,
    181                                           os.path.basename(spos[0]), spos[1],
    182                                           self.params))
    183             try:
    184                 msgbuf.append(*previous)
    185             except IndexError:
    186                 raise IndexError("Not enough parameters passed to '%s' on '%s',"
    187                                  " line number %s: %s" %
    188                                  (type(self).__name__,
    189                                   os.path.basename(previous[2][0]),
    190                                   previous[2][1], self.params), previous[1])
    191 
     175                    msgbuf.append(*previous)
     176                    previous = skind, sdata, spos
     177            msgbuf.append(*previous)
    192178            previous = kind, data, pos
    193179
    194180        for event in msgbuf.translate(gettext(msgbuf.format())):
     
    199185        return new_stream
    200186
    201187    def extract(self, stream, ctxt):
    202         msgbuf = MessageBuffer(self.params)
     188        msgbuf = MessageBuffer(self.params, MsgDirective)
    203189
    204190        stream = iter(stream)
    205191        stream.next() # the outer start tag
    206192        previous = stream.next()
    207193        for event in stream:
    208             try:
    209                 msgbuf.append(*previous)
    210             except IndexError:
    211                 raise IndexError("Not enough parameters passed to '%s' on '%s',"
    212                                  " line number %s: %s" %
    213                                  (type(self).__name__,
    214                                   os.path.basename(previous[2][0]),
    215                                   previous[2][1], self.params))
     194            msgbuf.append(*previous)
    216195            previous = event
    217196
    218197        yield None, msgbuf.format(), filter(None, [ctxt.get('_i18n.comment')])
     
    222201
    223202    def __call__(self, stream, directives, ctxt, **vars):
    224203
    225         msgbuf = MessageBuffer(ctxt.get('_i18n.choose.params', [])[:])
     204        msgbuf = MessageBuffer(ctxt.get('_i18n.choose.params', [])[:],
     205                               InnerChooseDirective)
    226206
    227207        stream = iter(_apply_directives(stream, directives, ctxt))
    228208        yield stream.next() # the outer start tag
     
    372352                    singular_stream = list(_apply_directives(substream,
    373353                                                             subdirectives,
    374354                                                             ctxt))
    375                     new_stream.append((MSGBUF, (), -1)) # msgbuf place holder
     355                    new_stream.append((MSGBUF, (), ('', -1))) # msgbuf place holder
    376356                    singular_msgbuf = ctxt.get('_i18n.choose.SingularDirective')
    377357                elif isinstance(subdirectives[0],
    378358                                PluralDirective) and not plural_stream:
     
    412392        if previous is START:
    413393            stream.next()
    414394
    415         singular_msgbuf = MessageBuffer(self.params[:])
    416         plural_msgbuf = MessageBuffer(self.params[:])
     395        singular_msgbuf = MessageBuffer(self.params, ChooseDirective)
     396        plural_msgbuf = MessageBuffer(self.params, ChooseDirective)
    417397
    418398        for kind, event, pos in stream:
    419399            if kind is SUB:
     
    426406                        plural_msgbuf = subdirective.extract(substream, ctxt,
    427407                                                             plural_msgbuf)
    428408                    elif not isinstance(subdirective, StripDirective):
    429                         try:
    430                             singular_msgbuf.append(kind, event, pos)
    431                             plural_msgbuf.append(kind, event, pos)
    432                         except IndexError:
    433                             raise IndexError("Not enough parameters passed to "
    434                                              "'%s' on '%s', line number %s: "
    435                                              "%s" % (type(self).__name__,
    436                                                      os.path.basename(pos[0]),
    437                                                      pos[1], self.params))
     409                        singular_msgbuf.append(kind, event, pos)
     410                        plural_msgbuf.append(kind, event, pos)
    438411            else:
    439                 try:
    440                     singular_msgbuf.append(kind, event, pos)
    441                     plural_msgbuf.append(kind, event, pos)
    442                 except IndexError:
    443                     raise IndexError("Not enough parameters passed to '%s' on "
    444                                      "'%s', line number %s: %s" %
    445                                      (type(self).__name__,
    446                                       os.path.basename(pos[0]), pos[1],
    447                                       self.params))
    448 
     412                singular_msgbuf.append(kind, event, pos)
     413                plural_msgbuf.append(kind, event, pos)
    449414        yield 'ngettext', \
    450415            (singular_msgbuf.format(), plural_msgbuf.format()), \
    451416            filter(None, [ctxt.get('_i18n.comment')])
     
    851816
    852817                if msgbuf:
    853818                    msgbuf.append(kind, data, pos)
    854                 # Un-comment bellow to extract messages without adding
     819                # Un-comment below to extract messages without adding
    855820                # directives
    856821#                else:
    857822#                    msg_params = attrs.get(i18n_msg)
     
    859824#                        print kind, data, pos
    860825#                        if type(msg_params) is list: # event tuple
    861826#                            msg_params = msg_params[0][1]
     827#                        # warning: MessageBuffer constructor has changed
    862828#                        msgbuf = MessageBuffer(
    863829#                            msg_params, attrs.get(i18n_comment), pos[1]
    864830#                        )
     
    942908    :since: version 0.5
    943909    """
    944910
    945     def __init__(self, params=u'', comment=None, lineno=-1):
     911    def __init__(self, params=u'', directive=None):
    946912        """Initialize the message buffer.
    947913       
    948914        :param params: comma-separated list of parameter names
     
    952918        """
    953919        if isinstance(params, basestring):
    954920            params = [name.strip() for name in params.split(',')]
     921        self.orig_params = params
    955922        # params list needs to be copied so that directives can be evaluated
    956923        # more than once
    957924        self.params = params[:]
    958         self.comment = comment
    959         self.lineno = lineno
     925        self.directive = directive
    960926        self.string = []
    961927        self.events = {}
    962928        self.values = {}
     
    979945            self.string.append(data)
    980946            self.events.setdefault(self.stack[-1], []).append(None)
    981947        elif kind is EXPR:
    982             param = self.params.pop(0)
     948            if self.params:
     949                param = self.params.pop(0)
     950            else:
     951                raise IndexError("'%s' parameters given to 'i18n:%s' but more "
     952                                 "expressions used in '%s', line %s" % (
     953                                 ', '.join(self.orig_params),
     954                                 self.directive.tagname,
     955                                 os.path.basename(pos[0]), pos[1]))
    983956            self.string.append('%%(%s)s' % param)
    984957            self.events.setdefault(self.stack[-1], []).append(None)
    985958            self.values[param] = (kind, data, pos)
     
    11681141        yield message
    11691142
    11701143def setup_i18n(template, translator):
    1171     """Convinience function to setup both the i18n filter and the i18n
     1144    """Convenience function to setup both the i18n filter and the i18n
    11721145    directives.
    11731146   
    11741147    :param template: an instance of a genshi template