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, 3 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