Index: third_party/google-endpoints/future/backports/email/iterators.py |
diff --git a/third_party/google-endpoints/future/backports/email/iterators.py b/third_party/google-endpoints/future/backports/email/iterators.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..82d320f8149d5eb798370484a28e591b0e2d501d |
--- /dev/null |
+++ b/third_party/google-endpoints/future/backports/email/iterators.py |
@@ -0,0 +1,74 @@ |
+# Copyright (C) 2001-2006 Python Software Foundation |
+# Author: Barry Warsaw |
+# Contact: email-sig@python.org |
+ |
+"""Various types of useful iterators and generators.""" |
+from __future__ import print_function |
+from __future__ import unicode_literals |
+from __future__ import division |
+from __future__ import absolute_import |
+ |
+__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, str): |
+ 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) |