mirror of
https://github.com/python/cpython.git
synced 2024-11-25 01:20:47 +01:00
bfe1824d08
Fixed ambigious reverse mappings. Added many new mappings. Import mapping is no longer applied to modules already mapped with full name mapping. Added tests for compatible pickling and unpickling and for consistency of _compat_pickle mappings.
231 lines
8.0 KiB
Python
231 lines
8.0 KiB
Python
# This module is used to map the old Python 2 names to the new names used in
|
|
# Python 3 for the pickle module. This needed to make pickle streams
|
|
# generated with Python 2 loadable by Python 3.
|
|
|
|
# This is a copy of lib2to3.fixes.fix_imports.MAPPING. We cannot import
|
|
# lib2to3 and use the mapping defined there, because lib2to3 uses pickle.
|
|
# Thus, this could cause the module to be imported recursively.
|
|
IMPORT_MAPPING = {
|
|
'__builtin__' : 'builtins',
|
|
'copy_reg': 'copyreg',
|
|
'Queue': 'queue',
|
|
'SocketServer': 'socketserver',
|
|
'ConfigParser': 'configparser',
|
|
'repr': 'reprlib',
|
|
'tkFileDialog': 'tkinter.filedialog',
|
|
'tkSimpleDialog': 'tkinter.simpledialog',
|
|
'tkColorChooser': 'tkinter.colorchooser',
|
|
'tkCommonDialog': 'tkinter.commondialog',
|
|
'Dialog': 'tkinter.dialog',
|
|
'Tkdnd': 'tkinter.dnd',
|
|
'tkFont': 'tkinter.font',
|
|
'tkMessageBox': 'tkinter.messagebox',
|
|
'ScrolledText': 'tkinter.scrolledtext',
|
|
'Tkconstants': 'tkinter.constants',
|
|
'Tix': 'tkinter.tix',
|
|
'ttk': 'tkinter.ttk',
|
|
'Tkinter': 'tkinter',
|
|
'markupbase': '_markupbase',
|
|
'_winreg': 'winreg',
|
|
'thread': '_thread',
|
|
'dummy_thread': '_dummy_thread',
|
|
'dbhash': 'dbm.bsd',
|
|
'dumbdbm': 'dbm.dumb',
|
|
'dbm': 'dbm.ndbm',
|
|
'gdbm': 'dbm.gnu',
|
|
'xmlrpclib': 'xmlrpc.client',
|
|
'SimpleXMLRPCServer': 'xmlrpc.server',
|
|
'httplib': 'http.client',
|
|
'htmlentitydefs' : 'html.entities',
|
|
'HTMLParser' : 'html.parser',
|
|
'Cookie': 'http.cookies',
|
|
'cookielib': 'http.cookiejar',
|
|
'BaseHTTPServer': 'http.server',
|
|
'test.test_support': 'test.support',
|
|
'commands': 'subprocess',
|
|
'urlparse' : 'urllib.parse',
|
|
'robotparser' : 'urllib.robotparser',
|
|
'urllib2': 'urllib.request',
|
|
'anydbm': 'dbm',
|
|
'_abcoll' : 'collections.abc',
|
|
}
|
|
|
|
|
|
# This contains rename rules that are easy to handle. We ignore the more
|
|
# complex stuff (e.g. mapping the names in the urllib and types modules).
|
|
# These rules should be run before import names are fixed.
|
|
NAME_MAPPING = {
|
|
('__builtin__', 'xrange'): ('builtins', 'range'),
|
|
('__builtin__', 'reduce'): ('functools', 'reduce'),
|
|
('__builtin__', 'intern'): ('sys', 'intern'),
|
|
('__builtin__', 'unichr'): ('builtins', 'chr'),
|
|
('__builtin__', 'unicode'): ('builtins', 'str'),
|
|
('__builtin__', 'long'): ('builtins', 'int'),
|
|
('itertools', 'izip'): ('builtins', 'zip'),
|
|
('itertools', 'imap'): ('builtins', 'map'),
|
|
('itertools', 'ifilter'): ('builtins', 'filter'),
|
|
('itertools', 'ifilterfalse'): ('itertools', 'filterfalse'),
|
|
('itertools', 'izip_longest'): ('itertools', 'zip_longest'),
|
|
('UserDict', 'IterableUserDict'): ('collections', 'UserDict'),
|
|
('UserList', 'UserList'): ('collections', 'UserList'),
|
|
('UserString', 'UserString'): ('collections', 'UserString'),
|
|
('whichdb', 'whichdb'): ('dbm', 'whichdb'),
|
|
('_socket', 'fromfd'): ('socket', 'fromfd'),
|
|
('_multiprocessing', 'Connection'): ('multiprocessing.connection', 'Connection'),
|
|
('multiprocessing.process', 'Process'): ('multiprocessing.context', 'Process'),
|
|
('multiprocessing.forking', 'Popen'): ('multiprocessing.popen_fork', 'Popen'),
|
|
('urllib', 'ContentTooShortError'): ('urllib.error', 'ContentTooShortError'),
|
|
('urllib', 'getproxies'): ('urllib.request', 'getproxies'),
|
|
('urllib', 'pathname2url'): ('urllib.request', 'pathname2url'),
|
|
('urllib', 'quote_plus'): ('urllib.parse', 'quote_plus'),
|
|
('urllib', 'quote'): ('urllib.parse', 'quote'),
|
|
('urllib', 'unquote_plus'): ('urllib.parse', 'unquote_plus'),
|
|
('urllib', 'unquote'): ('urllib.parse', 'unquote'),
|
|
('urllib', 'url2pathname'): ('urllib.request', 'url2pathname'),
|
|
('urllib', 'urlcleanup'): ('urllib.request', 'urlcleanup'),
|
|
('urllib', 'urlencode'): ('urllib.parse', 'urlencode'),
|
|
('urllib', 'urlopen'): ('urllib.request', 'urlopen'),
|
|
('urllib', 'urlretrieve'): ('urllib.request', 'urlretrieve'),
|
|
('urllib2', 'HTTPError'): ('urllib.error', 'HTTPError'),
|
|
('urllib2', 'URLError'): ('urllib.error', 'URLError'),
|
|
}
|
|
|
|
PYTHON2_EXCEPTIONS = (
|
|
"ArithmeticError",
|
|
"AssertionError",
|
|
"AttributeError",
|
|
"BaseException",
|
|
"BufferError",
|
|
"BytesWarning",
|
|
"DeprecationWarning",
|
|
"EOFError",
|
|
"EnvironmentError",
|
|
"Exception",
|
|
"FloatingPointError",
|
|
"FutureWarning",
|
|
"GeneratorExit",
|
|
"IOError",
|
|
"ImportError",
|
|
"ImportWarning",
|
|
"IndentationError",
|
|
"IndexError",
|
|
"KeyError",
|
|
"KeyboardInterrupt",
|
|
"LookupError",
|
|
"MemoryError",
|
|
"NameError",
|
|
"NotImplementedError",
|
|
"OSError",
|
|
"OverflowError",
|
|
"PendingDeprecationWarning",
|
|
"ReferenceError",
|
|
"RuntimeError",
|
|
"RuntimeWarning",
|
|
# StandardError is gone in Python 3, so we map it to Exception
|
|
"StopIteration",
|
|
"SyntaxError",
|
|
"SyntaxWarning",
|
|
"SystemError",
|
|
"SystemExit",
|
|
"TabError",
|
|
"TypeError",
|
|
"UnboundLocalError",
|
|
"UnicodeDecodeError",
|
|
"UnicodeEncodeError",
|
|
"UnicodeError",
|
|
"UnicodeTranslateError",
|
|
"UnicodeWarning",
|
|
"UserWarning",
|
|
"ValueError",
|
|
"Warning",
|
|
"ZeroDivisionError",
|
|
)
|
|
|
|
for excname in PYTHON2_EXCEPTIONS:
|
|
NAME_MAPPING[("exceptions", excname)] = ("builtins", excname)
|
|
|
|
MULTIPROCESSING_EXCEPTIONS = (
|
|
'AuthenticationError',
|
|
'BufferTooShort',
|
|
'ProcessError',
|
|
'TimeoutError',
|
|
)
|
|
|
|
for excname in MULTIPROCESSING_EXCEPTIONS:
|
|
NAME_MAPPING[("multiprocessing", excname)] = ("multiprocessing.context", excname)
|
|
|
|
# Same, but for 3.x to 2.x
|
|
REVERSE_IMPORT_MAPPING = dict((v, k) for (k, v) in IMPORT_MAPPING.items())
|
|
assert len(REVERSE_IMPORT_MAPPING) == len(IMPORT_MAPPING)
|
|
REVERSE_NAME_MAPPING = dict((v, k) for (k, v) in NAME_MAPPING.items())
|
|
assert len(REVERSE_NAME_MAPPING) == len(NAME_MAPPING)
|
|
|
|
# Non-mutual mappings.
|
|
|
|
IMPORT_MAPPING.update({
|
|
'cPickle': 'pickle',
|
|
'_elementtree': 'xml.etree.ElementTree',
|
|
'FileDialog': 'tkinter.filedialog',
|
|
'SimpleDialog': 'tkinter.simpledialog',
|
|
'DocXMLRPCServer': 'xmlrpc.server',
|
|
'SimpleHTTPServer': 'http.server',
|
|
'CGIHTTPServer': 'http.server',
|
|
})
|
|
|
|
REVERSE_IMPORT_MAPPING.update({
|
|
'_bz2': 'bz2',
|
|
'_dbm': 'dbm',
|
|
'_functools': 'functools',
|
|
'_gdbm': 'gdbm',
|
|
'_pickle': 'pickle',
|
|
})
|
|
|
|
NAME_MAPPING.update({
|
|
('__builtin__', 'basestring'): ('builtins', 'str'),
|
|
('exceptions', 'StandardError'): ('builtins', 'Exception'),
|
|
('UserDict', 'UserDict'): ('collections', 'UserDict'),
|
|
('socket', '_socketobject'): ('socket', 'SocketType'),
|
|
})
|
|
|
|
REVERSE_NAME_MAPPING.update({
|
|
('_functools', 'reduce'): ('__builtin__', 'reduce'),
|
|
('tkinter.filedialog', 'FileDialog'): ('FileDialog', 'FileDialog'),
|
|
('tkinter.filedialog', 'LoadFileDialog'): ('FileDialog', 'LoadFileDialog'),
|
|
('tkinter.filedialog', 'SaveFileDialog'): ('FileDialog', 'SaveFileDialog'),
|
|
('tkinter.simpledialog', 'SimpleDialog'): ('SimpleDialog', 'SimpleDialog'),
|
|
('xmlrpc.server', 'ServerHTMLDoc'): ('DocXMLRPCServer', 'ServerHTMLDoc'),
|
|
('xmlrpc.server', 'XMLRPCDocGenerator'):
|
|
('DocXMLRPCServer', 'XMLRPCDocGenerator'),
|
|
('xmlrpc.server', 'DocXMLRPCRequestHandler'):
|
|
('DocXMLRPCServer', 'DocXMLRPCRequestHandler'),
|
|
('xmlrpc.server', 'DocXMLRPCServer'):
|
|
('DocXMLRPCServer', 'DocXMLRPCServer'),
|
|
('xmlrpc.server', 'DocCGIXMLRPCRequestHandler'):
|
|
('DocXMLRPCServer', 'DocCGIXMLRPCRequestHandler'),
|
|
('http.server', 'SimpleHTTPRequestHandler'):
|
|
('SimpleHTTPServer', 'SimpleHTTPRequestHandler'),
|
|
('http.server', 'CGIHTTPRequestHandler'):
|
|
('CGIHTTPServer', 'CGIHTTPRequestHandler'),
|
|
('_socket', 'socket'): ('socket', '_socketobject'),
|
|
})
|
|
|
|
PYTHON3_OSERROR_EXCEPTIONS = (
|
|
'BrokenPipeError',
|
|
'ChildProcessError',
|
|
'ConnectionAbortedError',
|
|
'ConnectionError',
|
|
'ConnectionRefusedError',
|
|
'ConnectionResetError',
|
|
'FileExistsError',
|
|
'FileNotFoundError',
|
|
'InterruptedError',
|
|
'IsADirectoryError',
|
|
'NotADirectoryError',
|
|
'PermissionError',
|
|
'ProcessLookupError',
|
|
'TimeoutError',
|
|
)
|
|
|
|
for excname in PYTHON3_OSERROR_EXCEPTIONS:
|
|
REVERSE_NAME_MAPPING[('builtins', excname)] = ('exceptions', 'OSError')
|