Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/future/backports/email/parser.py @ 0:d30785e31577 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
| author | guerler |
|---|---|
| date | Fri, 31 Jul 2020 00:18:57 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d30785e31577 |
|---|---|
| 1 # Copyright (C) 2001-2007 Python Software Foundation | |
| 2 # Author: Barry Warsaw, Thomas Wouters, Anthony Baxter | |
| 3 # Contact: email-sig@python.org | |
| 4 | |
| 5 """A parser of RFC 2822 and MIME email messages.""" | |
| 6 from __future__ import unicode_literals | |
| 7 from __future__ import division | |
| 8 from __future__ import absolute_import | |
| 9 | |
| 10 __all__ = ['Parser', 'HeaderParser', 'BytesParser', 'BytesHeaderParser'] | |
| 11 | |
| 12 import warnings | |
| 13 from io import StringIO, TextIOWrapper | |
| 14 | |
| 15 from future.backports.email.feedparser import FeedParser, BytesFeedParser | |
| 16 from future.backports.email.message import Message | |
| 17 from future.backports.email._policybase import compat32 | |
| 18 | |
| 19 | |
| 20 class Parser(object): | |
| 21 def __init__(self, _class=Message, **_3to2kwargs): | |
| 22 """Parser of RFC 2822 and MIME email messages. | |
| 23 | |
| 24 Creates an in-memory object tree representing the email message, which | |
| 25 can then be manipulated and turned over to a Generator to return the | |
| 26 textual representation of the message. | |
| 27 | |
| 28 The string must be formatted as a block of RFC 2822 headers and header | |
| 29 continuation lines, optionally preceeded by a `Unix-from' header. The | |
| 30 header block is terminated either by the end of the string or by a | |
| 31 blank line. | |
| 32 | |
| 33 _class is the class to instantiate for new message objects when they | |
| 34 must be created. This class must have a constructor that can take | |
| 35 zero arguments. Default is Message.Message. | |
| 36 | |
| 37 The policy keyword specifies a policy object that controls a number of | |
| 38 aspects of the parser's operation. The default policy maintains | |
| 39 backward compatibility. | |
| 40 | |
| 41 """ | |
| 42 if 'policy' in _3to2kwargs: policy = _3to2kwargs['policy']; del _3to2kwargs['policy'] | |
| 43 else: policy = compat32 | |
| 44 self._class = _class | |
| 45 self.policy = policy | |
| 46 | |
| 47 def parse(self, fp, headersonly=False): | |
| 48 """Create a message structure from the data in a file. | |
| 49 | |
| 50 Reads all the data from the file and returns the root of the message | |
| 51 structure. Optional headersonly is a flag specifying whether to stop | |
| 52 parsing after reading the headers or not. The default is False, | |
| 53 meaning it parses the entire contents of the file. | |
| 54 """ | |
| 55 feedparser = FeedParser(self._class, policy=self.policy) | |
| 56 if headersonly: | |
| 57 feedparser._set_headersonly() | |
| 58 while True: | |
| 59 data = fp.read(8192) | |
| 60 if not data: | |
| 61 break | |
| 62 feedparser.feed(data) | |
| 63 return feedparser.close() | |
| 64 | |
| 65 def parsestr(self, text, headersonly=False): | |
| 66 """Create a message structure from a string. | |
| 67 | |
| 68 Returns the root of the message structure. Optional headersonly is a | |
| 69 flag specifying whether to stop parsing after reading the headers or | |
| 70 not. The default is False, meaning it parses the entire contents of | |
| 71 the file. | |
| 72 """ | |
| 73 return self.parse(StringIO(text), headersonly=headersonly) | |
| 74 | |
| 75 | |
| 76 | |
| 77 class HeaderParser(Parser): | |
| 78 def parse(self, fp, headersonly=True): | |
| 79 return Parser.parse(self, fp, True) | |
| 80 | |
| 81 def parsestr(self, text, headersonly=True): | |
| 82 return Parser.parsestr(self, text, True) | |
| 83 | |
| 84 | |
| 85 class BytesParser(object): | |
| 86 | |
| 87 def __init__(self, *args, **kw): | |
| 88 """Parser of binary RFC 2822 and MIME email messages. | |
| 89 | |
| 90 Creates an in-memory object tree representing the email message, which | |
| 91 can then be manipulated and turned over to a Generator to return the | |
| 92 textual representation of the message. | |
| 93 | |
| 94 The input must be formatted as a block of RFC 2822 headers and header | |
| 95 continuation lines, optionally preceeded by a `Unix-from' header. The | |
| 96 header block is terminated either by the end of the input or by a | |
| 97 blank line. | |
| 98 | |
| 99 _class is the class to instantiate for new message objects when they | |
| 100 must be created. This class must have a constructor that can take | |
| 101 zero arguments. Default is Message.Message. | |
| 102 """ | |
| 103 self.parser = Parser(*args, **kw) | |
| 104 | |
| 105 def parse(self, fp, headersonly=False): | |
| 106 """Create a message structure from the data in a binary file. | |
| 107 | |
| 108 Reads all the data from the file and returns the root of the message | |
| 109 structure. Optional headersonly is a flag specifying whether to stop | |
| 110 parsing after reading the headers or not. The default is False, | |
| 111 meaning it parses the entire contents of the file. | |
| 112 """ | |
| 113 fp = TextIOWrapper(fp, encoding='ascii', errors='surrogateescape') | |
| 114 with fp: | |
| 115 return self.parser.parse(fp, headersonly) | |
| 116 | |
| 117 | |
| 118 def parsebytes(self, text, headersonly=False): | |
| 119 """Create a message structure from a byte string. | |
| 120 | |
| 121 Returns the root of the message structure. Optional headersonly is a | |
| 122 flag specifying whether to stop parsing after reading the headers or | |
| 123 not. The default is False, meaning it parses the entire contents of | |
| 124 the file. | |
| 125 """ | |
| 126 text = text.decode('ASCII', errors='surrogateescape') | |
| 127 return self.parser.parsestr(text, headersonly) | |
| 128 | |
| 129 | |
| 130 class BytesHeaderParser(BytesParser): | |
| 131 def parse(self, fp, headersonly=True): | |
| 132 return BytesParser.parse(self, fp, headersonly=True) | |
| 133 | |
| 134 def parsebytes(self, text, headersonly=True): | |
| 135 return BytesParser.parsebytes(self, text, headersonly=True) |
