##// END OF EJS Templates
merge functionality in io and openpy relating to encoding...
merge functionality in io and openpy relating to encoding New functions were introduced in openpy to deal with encoding in python files. This commit removes redundant code from io and moves source_to_unicode to openpy.

File last commit:

r7803:b1a8e9db
r8304:9aa74eeb
Show More
py3compat.py
179 lines | 5.2 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
Brandon Parsons
Feedback from pull request #1245
r6655
Brandon Parsons
saner default encoding mechanism
r6716 from .encoding import DEFAULT_ENCODING
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):
Brandon Parsons
saner default encoding mechanism
r6716 encoding = encoding or DEFAULT_ENCODING
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 return s.decode(encoding, "replace")
def encode(u, encoding=None):
Brandon Parsons
saner default encoding mechanism
r6716 encoding = encoding or DEFAULT_ENCODING
Thomas Kluyver
Add module for Python 3 compatibility layer.
r4730 return u.encode(encoding, "replace")
Brandon Parsons
pythonw in py3k sets std{in,out,err} to None...
r6651
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):
MinRK
py3compat._modify_str_or_docstring should check against basestring
r6478 if isinstance(func_or_str, basestring):
Thomas Kluyver
Add function to handle u'abc' (Python 2) vs. 'abc' (Python 3) in doctests and similar.
r4894 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
Bradley M. Froehle
Fix Python 3.2 test failures (ResourceWarnings from unclosed files)....
r7803 with open(fname, 'rb') as f:
exec compile(f.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
Fernando Perez
Work around issue in py2.6 where trailing whitespace confuses compile()....
r5380 # The rstrip() is necessary b/c trailing whitespace in files will
# cause an IndentationError in Python 2.6 (this was fixed in 2.7,
# but we still support 2.6). See issue 1027.
Fernando Perez
Fixes #1027, the previous fix had a problem under windows. ...
r5519 scripttext = __builtin__.open(fname).read().rstrip() + '\n'
Thomas Kluyver
Fix execfile compatibility layer for Python 2 on non-Windows platforms.
r5133 # compile converts unicode filename to str assuming
# ascii. Let's do the conversion before calling compile
Jörgen Stenarson
Fix for 2.x execfile that can not handle non-ascii filenames....
r5090 if isinstance(fname, unicode):
filename = unicode_to_str(fname)
else:
filename = fname
exec compile(scripttext, filename, 'exec') in glob, loc
else:
Thomas Kluyver
Fix execfile compatibility layer for Python 2 on non-Windows platforms.
r5133 def execfile(fname, *where):
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
Thomas Kluyver
Fix execfile compatibility layer for Python 2 on non-Windows platforms.
r5133 __builtin__.execfile(filename, *where)