# HG changeset patch # User pjenvey # Date 1187326964 0 # Node ID f353197f0fd2b45279d588626270d19089283f2f # Parent 043201653d5668c4efcf3fd694cdf606c2d2dec8 skip messages that have less arguments than the keyword spec calls for avoids potential IndexErrors during extraction diff --git a/babel/messages/extract.py b/babel/messages/extract.py --- a/babel/messages/extract.py +++ b/babel/messages/extract.py @@ -247,11 +247,19 @@ spec = (1,) if not isinstance(messages, (list, tuple)): messages = [messages] + if not messages: + continue + # Validate the messages against the keyword's specification msgs = [] - # Validate the messages against the keyword's specification invalid = False + # last_index is 1 based like the keyword spec + last_index = len(messages) for index in spec: + if last_index < index: + # Not enough arguments + invalid = True + break message = messages[index - 1] if message is None: invalid = True diff --git a/babel/messages/tests/extract.py b/babel/messages/tests/extract.py --- a/babel/messages/tests/extract.py +++ b/babel/messages/tests/extract.py @@ -255,12 +255,16 @@ n = ngettext('hello', 'there', n=3) n = ngettext(n=3, 'hello', 'there') n = ngettext(n=3, *messages) +n = ngettext() +n = ngettext('foo') """) messages = list(extract.extract_python(buf, ('_', 'ngettext'), [], {})) self.assertEqual((u'foo', u'bar'), messages[0][2]) self.assertEqual((u'hello', u'there', None), messages[1][2]) self.assertEqual((None, u'hello', u'there'), messages[2][2]) self.assertEqual((None, None), messages[3][2]) + self.assertEqual(None, messages[4][2]) + self.assertEqual(('foo'), messages[5][2]) def test_utf8_message(self): buf = StringIO(""" @@ -327,6 +331,8 @@ n = ngettext('hello', 'there', n=3) n = ngettext(n=3, 'hello', 'there') n = ngettext(n=3, *messages) +n = ngettext() +n = ngettext('foo') """) messages = \ list(extract.extract('python', buf, extract.DEFAULT_KEYWORDS, [],