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) |