1# Copyright (C) 2001-2006 Python Software Foundation
2# Author: Barry Warsaw
3# Contact: email-sig@python.org
4
5"""A package for parsing, handling, and generating email messages."""
6
7__version__ = '4.0.3'
8
9__all__ = [
10    # Old names
11    'base64MIME',
12    'Charset',
13    'Encoders',
14    'Errors',
15    'Generator',
16    'Header',
17    'Iterators',
18    'Message',
19    'MIMEAudio',
20    'MIMEBase',
21    'MIMEImage',
22    'MIMEMessage',
23    'MIMEMultipart',
24    'MIMENonMultipart',
25    'MIMEText',
26    'Parser',
27    'quopriMIME',
28    'Utils',
29    'message_from_string',
30    'message_from_file',
31    # new names
32    'base64mime',
33    'charset',
34    'encoders',
35    'errors',
36    'generator',
37    'header',
38    'iterators',
39    'message',
40    'mime',
41    'parser',
42    'quoprimime',
43    'utils',
44    ]
45
46
47
48# Some convenience routines.  Don't import Parser and Message as side-effects
49# of importing email since those cascadingly import most of the rest of the
50# email package.
51def message_from_string(s, *args, **kws):
52    """Parse a string into a Message object model.
53
54    Optional _class and strict are passed to the Parser constructor.
55    """
56    from email.parser import Parser
57    return Parser(*args, **kws).parsestr(s)
58
59
60def message_from_file(fp, *args, **kws):
61    """Read a file and parse its contents into a Message object model.
62
63    Optional _class and strict are passed to the Parser constructor.
64    """
65    from email.parser import Parser
66    return Parser(*args, **kws).parse(fp)
67
68
69
70# Lazy loading to provide name mapping from new-style names (PEP 8 compatible
71# email 4.0 module names), to old-style names (email 3.0 module names).
72import sys
73
74class LazyImporter(object):
75    def __init__(self, module_name):
76        self.__name__ = 'email.' + module_name
77
78    def __getattr__(self, name):
79        __import__(self.__name__)
80        mod = sys.modules[self.__name__]
81        self.__dict__.update(mod.__dict__)
82        return getattr(mod, name)
83
84
85_LOWERNAMES = [
86    # email.<old name> -> email.<new name is lowercased old name>
87    'Charset',
88    'Encoders',
89    'Errors',
90    'FeedParser',
91    'Generator',
92    'Header',
93    'Iterators',
94    'Message',
95    'Parser',
96    'Utils',
97    'base64MIME',
98    'quopriMIME',
99    ]
100
101_MIMENAMES = [
102    # email.MIME<old name> -> email.mime.<new name is lowercased old name>
103    'Audio',
104    'Base',
105    'Image',
106    'Message',
107    'Multipart',
108    'NonMultipart',
109    'Text',
110    ]
111
112for _name in _LOWERNAMES:
113    importer = LazyImporter(_name.lower())
114    sys.modules['email.' + _name] = importer
115    setattr(sys.modules['email'], _name, importer)
116
117
118import email.mime
119for _name in _MIMENAMES:
120    importer = LazyImporter('mime.' + _name.lower())
121    sys.modules['email.MIME' + _name] = importer
122    setattr(sys.modules['email'], 'MIME' + _name, importer)
123    setattr(sys.modules['email.mime'], _name, importer)
124