mirror of
https://github.com/python/cpython.git
synced 2024-12-01 11:15:56 +01:00
34d1928766
Completely get rid of StringIO.py and cStringIO.c. I had to fix a few tests and modules beyond what Christian did, and invent a few conventions. E.g. in elementtree, I chose to write/return Unicode strings whe no encoding is given, but bytes when an explicit encoding is given. Also mimetools was made to always assume binary files.
74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
# Copyright (C) 2001-2006 Python Software Foundation
|
||
# Author: Barry Warsaw
|
||
# Contact: email-sig@python.org
|
||
|
||
"""Various types of useful iterators and generators."""
|
||
|
||
__all__ = [
|
||
'body_line_iterator',
|
||
'typed_subpart_iterator',
|
||
'walk',
|
||
# Do not include _structure() since it's part of the debugging API.
|
||
]
|
||
|
||
import sys
|
||
from io import StringIO
|
||
|
||
|
||
|
||
# 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.
|
||
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, include_default=False):
|
||
"""A handy debugging aid"""
|
||
if fp is None:
|
||
fp = sys.stdout
|
||
tab = ' ' * (level * 4)
|
||
print(tab + msg.get_content_type(), end='', file=fp)
|
||
if include_default:
|
||
print(' [%s]' % msg.get_default_type(), file=fp)
|
||
else:
|
||
print(file=fp)
|
||
if msg.is_multipart():
|
||
for subpart in msg.get_payload():
|
||
_structure(subpart, fp, level+1, include_default)
|