##// END OF EJS Templates
Adding test for safe_execfile call with non-ascii path
Adding test for safe_execfile call with non-ascii path

File last commit:

r5094:9403023f
r5094:9403023f
Show More
py3compat.py
172 lines | 5.0 KiB | text/x-python | PythonLexer
Thomas Kluyver
Python 3 compatibility for identifiers.
r4740 # coding: utf-8
"""Compatibility tricks for Python 3. Mainly to do with unicode."""
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 import __builtin__
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 import functools
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 import sys
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890 import re
Thomas Kluyver
Fix various problems highlighted by the test suite.
r4759 import types
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
Thomas Kluyver
Add simple implementation of Python 3 style open()
r4743 orig_open = open
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 def no_code(x, encoding=None):
return x
def decode(s, encoding=None):
encoding = encoding or sys.stdin.encoding or sys.getdefaultencoding()
return s.decode(encoding, "replace")
def encode(u, encoding=None):
encoding = encoding or sys.stdin.encoding or sys.getdefaultencoding()
return u.encode(encoding, "replace")
Thomas Kluyver
Start using py3compat module.
r4731
def cast_unicode(s, encoding=None):
if isinstance(s, bytes):
return decode(s, encoding)
return s
def cast_bytes(s, encoding=None):
if not isinstance(s, bytes):
return encode(s, encoding)
return s
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 def _modify_str_or_docstring(str_change_func):
@functools.wraps(str_change_func)
def wrapper(func_or_str):
if isinstance(func_or_str, str):
func = None
doc = func_or_str
else:
func = func_or_str
doc = func.__doc__
doc = str_change_func(doc)
if func:
func.__doc__ = doc
return func
return doc
return wrapper
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 if sys.version_info[0] >= 3:
PY3 = True
input = input
builtin_mod_name = "builtins"
str_to_unicode = no_code
unicode_to_str = no_code
str_to_bytes = encode
bytes_to_str = decode
Thomas Kluyver
Fixes for UltraTB and PyColorize with Python 3
r4758 cast_bytes_py2 = no_code
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
Thomas Kluyver
Python 3 compatibility for identifiers.
r4740 def isidentifier(s, dotted=False):
if dotted:
return all(isidentifier(a) for a in s.split("."))
return s.isidentifier()
Thomas Kluyver
Add simple implementation of Python 3 style open()
r4743
open = orig_open
Thomas Kluyver
Fix various problems highlighted by the test suite.
r4759
MethodType = types.MethodType
MinRK
don't override execfile on Python 2
r4780
def execfile(fname, glob, loc=None):
loc = loc if (loc is not None) else glob
exec compile(open(fname).read(), fname, 'exec') in glob, loc
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890
# Refactor print statements in doctests.
_print_statement_re = re.compile(r"\bprint (?P<expr>.*)$", re.MULTILINE)
def _print_statement_sub(match):
expr = match.groups('expr')
return "print(%s)" % expr
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894
@_modify_str_or_docstring
def doctest_refactor_print(doc):
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890 """Refactor 'print x' statements in a doctest to print(x) style. 2to3
unfortunately doesn't pick up on our doctests.
Can accept a string or a function, so it can be used as a decorator."""
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 return _print_statement_re.sub(_print_statement_sub, doc)
# Abstract u'abc' syntax:
@_modify_str_or_docstring
def u_format(s):
""""{u}'abc'" --> "'abc'" (Python 3)
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 Accepts a string or a function, so it can be used as a decorator."""
return s.format(u='')
Thomas Kluyver
Python 3 compatibility for identifiers.
r4740
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 else:
PY3 = False
input = raw_input
builtin_mod_name = "__builtin__"
str_to_unicode = decode
unicode_to_str = encode
str_to_bytes = no_code
bytes_to_str = no_code
Thomas Kluyver
Fixes for UltraTB and PyColorize with Python 3
r4758 cast_bytes_py2 = cast_bytes
Thomas Kluyver
Python 3 compatibility for identifiers.
r4740
import re
_name_re = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*$")
def isidentifier(s, dotted=False):
if dotted:
return all(isidentifier(a) for a in s.split("."))
return bool(_name_re.match(s))
Thomas Kluyver
Add simple implementation of Python 3 style open()
r4743
class open(object):
"""Wrapper providing key part of Python 3 open() interface."""
def __init__(self, fname, mode="r", encoding="utf-8"):
self.f = orig_open(fname, mode)
self.enc = encoding
def write(self, s):
return self.f.write(s.encode(self.enc))
def read(self, size=-1):
return self.f.read(size).decode(self.enc)
def close(self):
return self.f.close()
def __enter__(self):
return self
def __exit__(self, etype, value, traceback):
self.f.close()
Thomas Kluyver
Fix various problems highlighted by the test suite.
r4759
def MethodType(func, instance):
return types.MethodType(func, instance, type(instance))
MinRK
don't override execfile on Python 2
r4780
# don't override system execfile on 2.x:
execfile = execfile
Thomas Kluyver
Function to refactor print statements in doctests to print() function calls for Python 3.
r4890
def doctest_refactor_print(func_or_str):
return func_or_str
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730
Jörgen Stenarson
fix for execfile that does not tolerate non-ascii characters in filename.
r5089
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 # Abstract u'abc' syntax:
@_modify_str_or_docstring
def u_format(s):
""""{u}'abc'" --> "u'abc'" (Python 2)
Accepts a string or a function, so it can be used as a decorator."""
return s.format(u='u')
Jörgen Stenarson
fix for execfile that does not tolerate non-ascii characters in filename.
r5089
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 if sys.platform == 'win32':
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 def execfile(fname, glob=None, loc=None):
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 loc = loc if (loc is not None) else glob
Jörgen Stenarson
Switching to builtin open instead of file
r5091 scripttext = __builtin__.open(fname).read()
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 #compile converts unicode filename to str assuming
#ascii. Let's do the conversion before calling compile
if isinstance(fname, unicode):
filename = unicode_to_str(fname)
else:
filename = fname
exec compile(scripttext, filename, 'exec') in glob, loc
else:
Jörgen Stenarson
Adding test for safe_execfile call with non-ascii path
r5094 def execfile(fname, glob=None, loc=None):
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 if isinstance(fname, unicode):
filename = fname.encode(sys.getfilesystemencoding())
else:
filename = fname
__builtin__.execfile(filename, glob, loc)