Home | History | Annotate | Download | only in Lib
      1 # This module is used to map the old Python 2 names to the new names used in
      2 # Python 3 for the pickle module.  This needed to make pickle streams
      3 # generated with Python 2 loadable by Python 3.
      4 
      5 # This is a copy of lib2to3.fixes.fix_imports.MAPPING.  We cannot import
      6 # lib2to3 and use the mapping defined there, because lib2to3 uses pickle.
      7 # Thus, this could cause the module to be imported recursively.
      8 IMPORT_MAPPING = {
      9     '__builtin__' : 'builtins',
     10     'copy_reg': 'copyreg',
     11     'Queue': 'queue',
     12     'SocketServer': 'socketserver',
     13     'ConfigParser': 'configparser',
     14     'repr': 'reprlib',
     15     'tkFileDialog': 'tkinter.filedialog',
     16     'tkSimpleDialog': 'tkinter.simpledialog',
     17     'tkColorChooser': 'tkinter.colorchooser',
     18     'tkCommonDialog': 'tkinter.commondialog',
     19     'Dialog': 'tkinter.dialog',
     20     'Tkdnd': 'tkinter.dnd',
     21     'tkFont': 'tkinter.font',
     22     'tkMessageBox': 'tkinter.messagebox',
     23     'ScrolledText': 'tkinter.scrolledtext',
     24     'Tkconstants': 'tkinter.constants',
     25     'Tix': 'tkinter.tix',
     26     'ttk': 'tkinter.ttk',
     27     'Tkinter': 'tkinter',
     28     'markupbase': '_markupbase',
     29     '_winreg': 'winreg',
     30     'thread': '_thread',
     31     'dummy_thread': '_dummy_thread',
     32     'dbhash': 'dbm.bsd',
     33     'dumbdbm': 'dbm.dumb',
     34     'dbm': 'dbm.ndbm',
     35     'gdbm': 'dbm.gnu',
     36     'xmlrpclib': 'xmlrpc.client',
     37     'SimpleXMLRPCServer': 'xmlrpc.server',
     38     'httplib': 'http.client',
     39     'htmlentitydefs' : 'html.entities',
     40     'HTMLParser' : 'html.parser',
     41     'Cookie': 'http.cookies',
     42     'cookielib': 'http.cookiejar',
     43     'BaseHTTPServer': 'http.server',
     44     'test.test_support': 'test.support',
     45     'commands': 'subprocess',
     46     'urlparse' : 'urllib.parse',
     47     'robotparser' : 'urllib.robotparser',
     48     'urllib2': 'urllib.request',
     49     'anydbm': 'dbm',
     50     '_abcoll' : 'collections.abc',
     51 }
     52 
     53 
     54 # This contains rename rules that are easy to handle.  We ignore the more
     55 # complex stuff (e.g. mapping the names in the urllib and types modules).
     56 # These rules should be run before import names are fixed.
     57 NAME_MAPPING = {
     58     ('__builtin__', 'xrange'):     ('builtins', 'range'),
     59     ('__builtin__', 'reduce'):     ('functools', 'reduce'),
     60     ('__builtin__', 'intern'):     ('sys', 'intern'),
     61     ('__builtin__', 'unichr'):     ('builtins', 'chr'),
     62     ('__builtin__', 'unicode'):    ('builtins', 'str'),
     63     ('__builtin__', 'long'):       ('builtins', 'int'),
     64     ('itertools', 'izip'):         ('builtins', 'zip'),
     65     ('itertools', 'imap'):         ('builtins', 'map'),
     66     ('itertools', 'ifilter'):      ('builtins', 'filter'),
     67     ('itertools', 'ifilterfalse'): ('itertools', 'filterfalse'),
     68     ('itertools', 'izip_longest'): ('itertools', 'zip_longest'),
     69     ('UserDict', 'IterableUserDict'): ('collections', 'UserDict'),
     70     ('UserList', 'UserList'): ('collections', 'UserList'),
     71     ('UserString', 'UserString'): ('collections', 'UserString'),
     72     ('whichdb', 'whichdb'): ('dbm', 'whichdb'),
     73     ('_socket', 'fromfd'): ('socket', 'fromfd'),
     74     ('_multiprocessing', 'Connection'): ('multiprocessing.connection', 'Connection'),
     75     ('multiprocessing.process', 'Process'): ('multiprocessing.context', 'Process'),
     76     ('multiprocessing.forking', 'Popen'): ('multiprocessing.popen_fork', 'Popen'),
     77     ('urllib', 'ContentTooShortError'): ('urllib.error', 'ContentTooShortError'),
     78     ('urllib', 'getproxies'): ('urllib.request', 'getproxies'),
     79     ('urllib', 'pathname2url'): ('urllib.request', 'pathname2url'),
     80     ('urllib', 'quote_plus'): ('urllib.parse', 'quote_plus'),
     81     ('urllib', 'quote'): ('urllib.parse', 'quote'),
     82     ('urllib', 'unquote_plus'): ('urllib.parse', 'unquote_plus'),
     83     ('urllib', 'unquote'): ('urllib.parse', 'unquote'),
     84     ('urllib', 'url2pathname'): ('urllib.request', 'url2pathname'),
     85     ('urllib', 'urlcleanup'): ('urllib.request', 'urlcleanup'),
     86     ('urllib', 'urlencode'): ('urllib.parse', 'urlencode'),
     87     ('urllib', 'urlopen'): ('urllib.request', 'urlopen'),
     88     ('urllib', 'urlretrieve'): ('urllib.request', 'urlretrieve'),
     89     ('urllib2', 'HTTPError'): ('urllib.error', 'HTTPError'),
     90     ('urllib2', 'URLError'): ('urllib.error', 'URLError'),
     91 }
     92 
     93 PYTHON2_EXCEPTIONS = (
     94     "ArithmeticError",
     95     "AssertionError",
     96     "AttributeError",
     97     "BaseException",
     98     "BufferError",
     99     "BytesWarning",
    100     "DeprecationWarning",
    101     "EOFError",
    102     "EnvironmentError",
    103     "Exception",
    104     "FloatingPointError",
    105     "FutureWarning",
    106     "GeneratorExit",
    107     "IOError",
    108     "ImportError",
    109     "ImportWarning",
    110     "IndentationError",
    111     "IndexError",
    112     "KeyError",
    113     "KeyboardInterrupt",
    114     "LookupError",
    115     "MemoryError",
    116     "NameError",
    117     "NotImplementedError",
    118     "OSError",
    119     "OverflowError",
    120     "PendingDeprecationWarning",
    121     "ReferenceError",
    122     "RuntimeError",
    123     "RuntimeWarning",
    124     # StandardError is gone in Python 3, so we map it to Exception
    125     "StopIteration",
    126     "SyntaxError",
    127     "SyntaxWarning",
    128     "SystemError",
    129     "SystemExit",
    130     "TabError",
    131     "TypeError",
    132     "UnboundLocalError",
    133     "UnicodeDecodeError",
    134     "UnicodeEncodeError",
    135     "UnicodeError",
    136     "UnicodeTranslateError",
    137     "UnicodeWarning",
    138     "UserWarning",
    139     "ValueError",
    140     "Warning",
    141     "ZeroDivisionError",
    142 )
    143 
    144 try:
    145     WindowsError
    146 except NameError:
    147     pass
    148 else:
    149     PYTHON2_EXCEPTIONS += ("WindowsError",)
    150 
    151 for excname in PYTHON2_EXCEPTIONS:
    152     NAME_MAPPING[("exceptions", excname)] = ("builtins", excname)
    153 
    154 MULTIPROCESSING_EXCEPTIONS = (
    155     'AuthenticationError',
    156     'BufferTooShort',
    157     'ProcessError',
    158     'TimeoutError',
    159 )
    160 
    161 for excname in MULTIPROCESSING_EXCEPTIONS:
    162     NAME_MAPPING[("multiprocessing", excname)] = ("multiprocessing.context", excname)
    163 
    164 # Same, but for 3.x to 2.x
    165 REVERSE_IMPORT_MAPPING = dict((v, k) for (k, v) in IMPORT_MAPPING.items())
    166 assert len(REVERSE_IMPORT_MAPPING) == len(IMPORT_MAPPING)
    167 REVERSE_NAME_MAPPING = dict((v, k) for (k, v) in NAME_MAPPING.items())
    168 assert len(REVERSE_NAME_MAPPING) == len(NAME_MAPPING)
    169 
    170 # Non-mutual mappings.
    171 
    172 IMPORT_MAPPING.update({
    173     'cPickle': 'pickle',
    174     '_elementtree': 'xml.etree.ElementTree',
    175     'FileDialog': 'tkinter.filedialog',
    176     'SimpleDialog': 'tkinter.simpledialog',
    177     'DocXMLRPCServer': 'xmlrpc.server',
    178     'SimpleHTTPServer': 'http.server',
    179     'CGIHTTPServer': 'http.server',
    180     # For compatibility with broken pickles saved in old Python 3 versions
    181     'UserDict': 'collections',
    182     'UserList': 'collections',
    183     'UserString': 'collections',
    184     'whichdb': 'dbm',
    185     'StringIO':  'io',
    186     'cStringIO': 'io',
    187 })
    188 
    189 REVERSE_IMPORT_MAPPING.update({
    190     '_bz2': 'bz2',
    191     '_dbm': 'dbm',
    192     '_functools': 'functools',
    193     '_gdbm': 'gdbm',
    194     '_pickle': 'pickle',
    195 })
    196 
    197 NAME_MAPPING.update({
    198     ('__builtin__', 'basestring'): ('builtins', 'str'),
    199     ('exceptions', 'StandardError'): ('builtins', 'Exception'),
    200     ('UserDict', 'UserDict'): ('collections', 'UserDict'),
    201     ('socket', '_socketobject'): ('socket', 'SocketType'),
    202 })
    203 
    204 REVERSE_NAME_MAPPING.update({
    205     ('_functools', 'reduce'): ('__builtin__', 'reduce'),
    206     ('tkinter.filedialog', 'FileDialog'): ('FileDialog', 'FileDialog'),
    207     ('tkinter.filedialog', 'LoadFileDialog'): ('FileDialog', 'LoadFileDialog'),
    208     ('tkinter.filedialog', 'SaveFileDialog'): ('FileDialog', 'SaveFileDialog'),
    209     ('tkinter.simpledialog', 'SimpleDialog'): ('SimpleDialog', 'SimpleDialog'),
    210     ('xmlrpc.server', 'ServerHTMLDoc'): ('DocXMLRPCServer', 'ServerHTMLDoc'),
    211     ('xmlrpc.server', 'XMLRPCDocGenerator'):
    212         ('DocXMLRPCServer', 'XMLRPCDocGenerator'),
    213     ('xmlrpc.server', 'DocXMLRPCRequestHandler'):
    214         ('DocXMLRPCServer', 'DocXMLRPCRequestHandler'),
    215     ('xmlrpc.server', 'DocXMLRPCServer'):
    216         ('DocXMLRPCServer', 'DocXMLRPCServer'),
    217     ('xmlrpc.server', 'DocCGIXMLRPCRequestHandler'):
    218         ('DocXMLRPCServer', 'DocCGIXMLRPCRequestHandler'),
    219     ('http.server', 'SimpleHTTPRequestHandler'):
    220         ('SimpleHTTPServer', 'SimpleHTTPRequestHandler'),
    221     ('http.server', 'CGIHTTPRequestHandler'):
    222         ('CGIHTTPServer', 'CGIHTTPRequestHandler'),
    223     ('_socket', 'socket'): ('socket', '_socketobject'),
    224 })
    225 
    226 PYTHON3_OSERROR_EXCEPTIONS = (
    227     'BrokenPipeError',
    228     'ChildProcessError',
    229     'ConnectionAbortedError',
    230     'ConnectionError',
    231     'ConnectionRefusedError',
    232     'ConnectionResetError',
    233     'FileExistsError',
    234     'FileNotFoundError',
    235     'InterruptedError',
    236     'IsADirectoryError',
    237     'NotADirectoryError',
    238     'PermissionError',
    239     'ProcessLookupError',
    240     'TimeoutError',
    241 )
    242 
    243 for excname in PYTHON3_OSERROR_EXCEPTIONS:
    244     REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'OSError')
    245 
    246 PYTHON3_IMPORTERROR_EXCEPTIONS = (
    247     'ModuleNotFoundError',
    248 )
    249 
    250 for excname in PYTHON3_IMPORTERROR_EXCEPTIONS:
    251     REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'ImportError')
    252