[Python-3000-checkins] r57800 - in python/branches/py3k/Lib/email: header.py test/test_email.py

barry.warsaw python-3000-checkins at python.org
Fri Aug 31 04:35:00 CEST 2007


Author: barry.warsaw
Date: Fri Aug 31 04:35:00 2007
New Revision: 57800

Modified:
   python/branches/py3k/Lib/email/header.py
   python/branches/py3k/Lib/email/test/test_email.py
Log:
More email package fixes.

This repairs the linear whitespace insertion between RFC 2047 encoded words
without leaving bogus trailing spaces at the end lines that end in encoded
words.

Current status: 7F/9E


Modified: python/branches/py3k/Lib/email/header.py
==============================================================================
--- python/branches/py3k/Lib/email/header.py	(original)
+++ python/branches/py3k/Lib/email/header.py	Fri Aug 31 04:35:00 2007
@@ -29,7 +29,6 @@
 
 USASCII = Charset('us-ascii')
 UTF8 = Charset('utf-8')
-TRANSITIONAL_SPACE = object()
 
 # Match encoded-word strings in the form =?charset?q?Hello_World?=
 ecre = re.compile(r'''
@@ -309,6 +308,7 @@
                 formatter.feed(line, charset)
                 if len(lines) > 1:
                     formatter.newline()
+            formatter.add_transition()
         return str(formatter)
 
     def _normalize(self):
@@ -341,19 +341,20 @@
         self._current_line = _Accumulator(headerlen)
 
     def __str__(self):
-        # Remove any trailing TRANSITIONAL_SPACE
-        if len(self._current_line) > 0:
-            last_line = self._current_line.pop()
-            if last_line is not TRANSITIONAL_SPACE:
-                self._current_line.push(last_line)
         self.newline()
         return NL.join(self._lines)
 
     def newline(self):
+        end_of_line = self._current_line.pop()
+        if end_of_line is not None:
+            self._current_line.push(end_of_line)
         if len(self._current_line) > 0:
             self._lines.append(str(self._current_line))
         self._current_line.reset()
 
+    def add_transition(self):
+        self._current_line.push(None)
+
     def feed(self, string, charset):
         # If the string itself fits on the current line in its encoded format,
         # then add it now and be done with it.
@@ -408,7 +409,6 @@
             # There was only one line.
             return
         self._current_line.push(last_line)
-        self._current_line.push(TRANSITIONAL_SPACE)
         # Everything else are full lines in themselves.
         for line in encoded_lines:
             self._lines.append(self._continuation_ws + line)
@@ -554,18 +554,20 @@
         self._current.append(string)
 
     def pop(self):
+        if not self._current:
+            return None
         return self._current.pop()
 
     def __len__(self):
-        return sum((len(string)
-                    for string in self._current
-                    if string is not TRANSITIONAL_SPACE),
+        return sum(((1 if string is None else len(string))
+                    for string in self._current),
                    self._initial_size)
 
     def __str__(self):
-        return EMPTYSTRING.join(
-            (' ' if string is TRANSITIONAL_SPACE else string)
-            for string in self._current)
+        if self._current and self._current[-1] is None:
+            self._current.pop()
+        return EMPTYSTRING.join((' ' if string is None else string)
+                                for string in self._current)
 
     def reset(self, string=None):
         self._current = []

Modified: python/branches/py3k/Lib/email/test/test_email.py
==============================================================================
--- python/branches/py3k/Lib/email/test/test_email.py	(original)
+++ python/branches/py3k/Lib/email/test/test_email.py	Fri Aug 31 04:35:00 2007
@@ -1556,7 +1556,7 @@
         header = make_header(dh)
         eq(str(header),
            'Re: r\xe4ksm\xf6rg\xe5s baz foo bar r\xe4ksm\xf6rg\xe5s')
-        self.ndiffAssertEqual(header.encode(), """\
+        self.ndiffAssertEqual(header.encode(maxlinelen=76), """\
 Re: =?mac-iceland?q?r=8Aksm=9Arg=8Cs?= baz foo bar =?mac-iceland?q?r=8Aksm?=
  =?mac-iceland?q?=9Arg=8Cs?=""")
 


More information about the Python-3000-checkins mailing list