##// END OF EJS Templates
Work around issue in py2.6 where trailing whitespace confuses compile()....
Fernando Perez -
Show More
@@ -1,172 +1,175 b''
1 1 # coding: utf-8
2 2 """Compatibility tricks for Python 3. Mainly to do with unicode."""
3 3 import __builtin__
4 4 import functools
5 5 import sys
6 6 import re
7 7 import types
8 8
9 9 orig_open = open
10 10
11 11 def no_code(x, encoding=None):
12 12 return x
13 13
14 14 def decode(s, encoding=None):
15 15 encoding = encoding or sys.stdin.encoding or sys.getdefaultencoding()
16 16 return s.decode(encoding, "replace")
17 17
18 18 def encode(u, encoding=None):
19 19 encoding = encoding or sys.stdin.encoding or sys.getdefaultencoding()
20 20 return u.encode(encoding, "replace")
21 21
22 22 def cast_unicode(s, encoding=None):
23 23 if isinstance(s, bytes):
24 24 return decode(s, encoding)
25 25 return s
26 26
27 27 def cast_bytes(s, encoding=None):
28 28 if not isinstance(s, bytes):
29 29 return encode(s, encoding)
30 30 return s
31 31
32 32 def _modify_str_or_docstring(str_change_func):
33 33 @functools.wraps(str_change_func)
34 34 def wrapper(func_or_str):
35 35 if isinstance(func_or_str, str):
36 36 func = None
37 37 doc = func_or_str
38 38 else:
39 39 func = func_or_str
40 40 doc = func.__doc__
41 41
42 42 doc = str_change_func(doc)
43 43
44 44 if func:
45 45 func.__doc__ = doc
46 46 return func
47 47 return doc
48 48 return wrapper
49 49
50 50 if sys.version_info[0] >= 3:
51 51 PY3 = True
52 52
53 53 input = input
54 54 builtin_mod_name = "builtins"
55 55
56 56 str_to_unicode = no_code
57 57 unicode_to_str = no_code
58 58 str_to_bytes = encode
59 59 bytes_to_str = decode
60 60 cast_bytes_py2 = no_code
61 61
62 62 def isidentifier(s, dotted=False):
63 63 if dotted:
64 64 return all(isidentifier(a) for a in s.split("."))
65 65 return s.isidentifier()
66 66
67 67 open = orig_open
68 68
69 69 MethodType = types.MethodType
70 70
71 71 def execfile(fname, glob, loc=None):
72 72 loc = loc if (loc is not None) else glob
73 73 exec compile(open(fname).read(), fname, 'exec') in glob, loc
74 74
75 75 # Refactor print statements in doctests.
76 76 _print_statement_re = re.compile(r"\bprint (?P<expr>.*)$", re.MULTILINE)
77 77 def _print_statement_sub(match):
78 78 expr = match.groups('expr')
79 79 return "print(%s)" % expr
80 80
81 81 @_modify_str_or_docstring
82 82 def doctest_refactor_print(doc):
83 83 """Refactor 'print x' statements in a doctest to print(x) style. 2to3
84 84 unfortunately doesn't pick up on our doctests.
85 85
86 86 Can accept a string or a function, so it can be used as a decorator."""
87 87 return _print_statement_re.sub(_print_statement_sub, doc)
88 88
89 89 # Abstract u'abc' syntax:
90 90 @_modify_str_or_docstring
91 91 def u_format(s):
92 92 """"{u}'abc'" --> "'abc'" (Python 3)
93 93
94 94 Accepts a string or a function, so it can be used as a decorator."""
95 95 return s.format(u='')
96 96
97 97 else:
98 98 PY3 = False
99 99
100 100 input = raw_input
101 101 builtin_mod_name = "__builtin__"
102 102
103 103 str_to_unicode = decode
104 104 unicode_to_str = encode
105 105 str_to_bytes = no_code
106 106 bytes_to_str = no_code
107 107 cast_bytes_py2 = cast_bytes
108 108
109 109 import re
110 110 _name_re = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*$")
111 111 def isidentifier(s, dotted=False):
112 112 if dotted:
113 113 return all(isidentifier(a) for a in s.split("."))
114 114 return bool(_name_re.match(s))
115 115
116 116 class open(object):
117 117 """Wrapper providing key part of Python 3 open() interface."""
118 118 def __init__(self, fname, mode="r", encoding="utf-8"):
119 119 self.f = orig_open(fname, mode)
120 120 self.enc = encoding
121 121
122 122 def write(self, s):
123 123 return self.f.write(s.encode(self.enc))
124 124
125 125 def read(self, size=-1):
126 126 return self.f.read(size).decode(self.enc)
127 127
128 128 def close(self):
129 129 return self.f.close()
130 130
131 131 def __enter__(self):
132 132 return self
133 133
134 134 def __exit__(self, etype, value, traceback):
135 135 self.f.close()
136 136
137 137 def MethodType(func, instance):
138 138 return types.MethodType(func, instance, type(instance))
139 139
140 140 # don't override system execfile on 2.x:
141 141 execfile = execfile
142 142
143 143 def doctest_refactor_print(func_or_str):
144 144 return func_or_str
145 145
146 146
147 147 # Abstract u'abc' syntax:
148 148 @_modify_str_or_docstring
149 149 def u_format(s):
150 150 """"{u}'abc'" --> "u'abc'" (Python 2)
151 151
152 152 Accepts a string or a function, so it can be used as a decorator."""
153 153 return s.format(u='u')
154 154
155 155 if sys.platform == 'win32':
156 156 def execfile(fname, glob=None, loc=None):
157 157 loc = loc if (loc is not None) else glob
158 scripttext = __builtin__.open(fname).read()
158 # The rstrip() is necessary b/c trailing whitespace in files will
159 # cause an IndentationError in Python 2.6 (this was fixed in 2.7,
160 # but we still support 2.6). See issue 1027.
161 scripttext = __builtin__.open(fname).read().rstrip()
159 162 # compile converts unicode filename to str assuming
160 163 # ascii. Let's do the conversion before calling compile
161 164 if isinstance(fname, unicode):
162 165 filename = unicode_to_str(fname)
163 166 else:
164 167 filename = fname
165 168 exec compile(scripttext, filename, 'exec') in glob, loc
166 169 else:
167 170 def execfile(fname, *where):
168 171 if isinstance(fname, unicode):
169 172 filename = fname.encode(sys.getfilesystemencoding())
170 173 else:
171 174 filename = fname
172 175 __builtin__.execfile(filename, *where)
General Comments 0
You need to be logged in to leave comments. Login now