changeset 258:5ca5fbd47766 trunk

skip messages that have less arguments than the keyword spec calls for avoids potential IndexErrors during extraction
author pjenvey
date Fri, 17 Aug 2007 05:02:44 +0000
parents 79c72d3a35f6
children 0500630bac0a
files babel/messages/extract.py babel/messages/tests/extract.py
diffstat 2 files changed, 15 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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, [],
Copyright (C) 2012-2017 Edgewall Software