# HG changeset patch # User pjenvey # Date 1187326964 0 # Node ID 5ca5fbd477663a9e75295572b22f899735f40733 # Parent 79c72d3a35f659938e490fd29f643b9422d9c6bc 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, [],