comparison env/lib/python3.7/site-packages/rdflib/py3compat.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:26e78fe6e8c4
1 """
2 Utility functions and objects to ease Python 3 compatibility.
3 """
4 import sys
5 import re
6 import codecs
7 import warnings
8
9 try:
10 from functools import wraps
11 assert wraps
12 except ImportError:
13 # No-op wraps decorator
14 def wraps(f):
15 def dec(newf):
16 return newf
17 return dec
18
19
20 def cast_bytes(s, enc='utf-8'):
21 if isinstance(s, str):
22 return s.encode(enc)
23 return s
24
25 PY3 = (sys.version_info[0] >= 3)
26
27
28 def _modify_str_or_docstring(str_change_func):
29 @wraps(str_change_func)
30 def wrapper(func_or_str):
31 if isinstance(func_or_str, str):
32 func = None
33 doc = func_or_str
34 else:
35 func = func_or_str
36 doc = func.__doc__
37
38 doc = str_change_func(doc)
39
40 if func:
41 func.__doc__ = doc
42 return func
43 return doc
44 return wrapper
45
46
47 if PY3:
48 # Python 3:
49 # ---------
50 def b(s):
51 return s.encode('ascii')
52
53 def ascii(stream):
54 return codecs.getreader('ascii')(stream)
55
56 def bopen(*args, **kwargs):
57 return open(*args, mode = 'rb', **kwargs)
58
59 bytestype = bytes
60
61 # Abstract u'abc' syntax:
62 @_modify_str_or_docstring
63 def format_doctest_out(s):
64 """Python 2 version
65 "%(u)s'abc'" --> "'abc'"
66 "%(b)s'abc'" --> "b'abc'"
67 "55%(L)s" --> "55"
68 "unicode(x)" --> "str(x)"
69
70 Accepts a string or a function, so it can be used as a decorator."""
71 # s may be None if processed by Py2exe
72 if s is None:
73 return ''
74 return s % {'u': '', 'b': 'b', 'L': '', 'unicode': 'str'}
75
76 def type_cmp(a, b):
77 """Python 2 style comparison based on type"""
78 ta, tb = type(a).__name__, type(b).__name__
79 # Ugly hack: some tests rely on tuple sorting before unicode, and I
80 # don't know if that's important. Better retain it for now.
81 if ta == 'str':
82 ta = 'unicode'
83 if tb == 'str':
84 tb = 'unicode'
85 # return 1 if ta > tb else -1 if ta < tb else 0
86 if ta > tb:
87 return 1
88 elif ta < tb:
89 return -1
90 else:
91 return 0
92
93 def sign(n):
94 if n < 0:
95 return -1
96 if n > 0:
97 return 1
98 return 0
99
100 else:
101 # Python 2
102 # --------
103 def b(s):
104 return s
105
106 def ascii(stream):
107 return stream
108
109 bopen = open
110
111 bytestype = str
112
113 # Abstract u'abc' syntax:
114 @_modify_str_or_docstring
115 def format_doctest_out(s):
116 """Python 2 version
117 "%(u)s'abc'" --> "u'abc'"
118 "%(b)s'abc'" --> "'abc'"
119 "55%(L)s" --> "55L"
120
121 Accepts a string or a function, so it can be used as a decorator."""
122 # s may be None if processed by Py2exe
123 if s is None:
124 return ''
125 return s % {'u': 'u', 'b': '', 'L': 'L', 'unicode': 'unicode'}
126
127 def type_cmp(a, b):
128 # return 1 if a > b else -1 if a < b else 0
129 if a > b:
130 return 1
131 elif a < b:
132 return -1
133 else:
134 return 0
135
136 def sign(n):
137 return cmp(n, 0)
138
139 r_unicodeEscape = re.compile(r'(\\u[0-9A-Fa-f]{4}|\\U[0-9A-Fa-f]{8})')
140
141 def _unicodeExpand(s):
142 return r_unicodeEscape.sub(lambda m: chr(int(m.group(0)[2:], 16)), s)
143
144 narrow_build = False
145 try:
146 chr(0x10FFFF)
147 except ValueError:
148 narrow_build = True
149
150 if narrow_build:
151 def _unicodeExpand(s):
152 try:
153 return r_unicodeEscape.sub(
154 lambda m: chr(int(m.group(0)[2:], 16)), s)
155 except ValueError:
156 warnings.warn(
157 'Encountered a unicode char > 0xFFFF in a narrow python build. '
158 'Trying to degrade gracefully, but this can cause problems '
159 'later when working with the string:\n%s' % s)
160 return r_unicodeEscape.sub(
161 lambda m: codecs.decode(m.group(0), 'unicode_escape'), s)
162
163
164 def decodeStringEscape(s):
165
166 """
167 s is byte-string - replace \ escapes in string
168 """
169
170 if not PY3:
171 s = s.decode('string-escape')
172 else:
173 s = s.replace('\\t', '\t')
174 s = s.replace('\\n', '\n')
175 s = s.replace('\\r', '\r')
176 s = s.replace('\\b', '\b')
177 s = s.replace('\\f', '\f')
178 s = s.replace('\\"', '"')
179 s = s.replace("\\'", "'")
180 s = s.replace('\\\\', '\\')
181
182 return s
183 #return _unicodeExpand(s) # hmm - string escape doesn't do unicode escaping
184
185 def decodeUnicodeEscape(s):
186 """
187 s is a unicode string
188 replace \n and \\u00AC unicode escapes
189 """
190 if not PY3:
191 s = s.encode('utf-8').decode('string-escape')
192 s = _unicodeExpand(s)
193 else:
194 s = s.replace('\\t', '\t')
195 s = s.replace('\\n', '\n')
196 s = s.replace('\\r', '\r')
197 s = s.replace('\\b', '\b')
198 s = s.replace('\\f', '\f')
199 s = s.replace('\\"', '"')
200 s = s.replace("\\'", "'")
201 s = s.replace('\\\\', '\\')
202
203 s = _unicodeExpand(s) # hmm - string escape doesn't do unicode escaping
204
205 return s