summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/email/Iterators.py62
1 files changed, 52 insertions, 10 deletions
diff --git a/Lib/email/Iterators.py b/Lib/email/Iterators.py
index 3ecd632..2572c20 100644
--- a/Lib/email/Iterators.py
+++ b/Lib/email/Iterators.py
@@ -1,25 +1,67 @@
-# Copyright (C) 2001,2002 Python Software Foundation
-# Author: barry@zope.com (Barry Warsaw)
+# Copyright (C) 2001-2004 Python Software Foundation
+# Author: Barry Warsaw <barry@python.org>
"""Various types of useful iterators and generators.
"""
import sys
+from cStringIO import StringIO
-try:
- from email._compat22 import body_line_iterator, typed_subpart_iterator
-except SyntaxError:
- # Python 2.1 doesn't have generators
- from email._compat21 import body_line_iterator, typed_subpart_iterator
+
+
+# This function will become a method of the Message class
+def walk(self):
+ """Walk over the message tree, yielding each subpart.
+
+ The walk is performed in depth-first order. This method is a
+ generator.
+ """
+ yield self
+ if self.is_multipart():
+ for subpart in self.get_payload():
+ for subsubpart in subpart.walk():
+ yield subsubpart
+
+
+
+# These two functions are imported into the Iterators.py interface module.
+# The Python 2.2 version uses generators for efficiency.
+def body_line_iterator(msg, decode=False):
+ """Iterate over the parts, returning string payloads line-by-line.
+
+ Optional decode (default False) is passed through to .get_payload().
+ """
+ for subpart in msg.walk():
+ payload = subpart.get_payload(decode=decode)
+ if isinstance(payload, basestring):
+ for line in StringIO(payload):
+ yield line
+
+
+def typed_subpart_iterator(msg, maintype='text', subtype=None):
+ """Iterate over the subparts with a given MIME type.
+
+ Use `maintype' as the main MIME type to match against; this defaults to
+ "text". Optional `subtype' is the MIME subtype to match against; if
+ omitted, only the main type is matched.
+ """
+ for subpart in msg.walk():
+ if subpart.get_content_maintype() == maintype:
+ if subtype is None or subpart.get_content_subtype() == subtype:
+ yield subpart
-def _structure(msg, fp=None, level=0):
+def _structure(msg, fp=None, level=0, include_default=False):
"""A handy debugging aid"""
if fp is None:
fp = sys.stdout
tab = ' ' * (level * 4)
- print >> fp, tab + msg.get_content_type()
+ print >> fp, tab + msg.get_content_type(),
+ if include_default:
+ print '[%s]' % msg.get_default_type()
+ else:
+ print
if msg.is_multipart():
for subpart in msg.get_payload():
- _structure(subpart, fp, level+1)
+ _structure(subpart, fp, level+1, include_default)