appier 1.31.4__py2.py3-none-any.whl → 1.32.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- appier/__init__.py +333 -52
- appier/amqp.py +29 -30
- appier/api.py +214 -212
- appier/asgi.py +54 -55
- appier/async_neo.py +46 -35
- appier/async_old.py +55 -42
- appier/asynchronous.py +7 -13
- appier/base.py +1762 -1429
- appier/bus.py +51 -52
- appier/cache.py +99 -84
- appier/common.py +9 -11
- appier/component.py +17 -19
- appier/compress.py +25 -28
- appier/config.py +96 -73
- appier/controller.py +9 -15
- appier/crypt.py +25 -21
- appier/data.py +73 -57
- appier/defines.py +191 -226
- appier/exceptions.py +103 -63
- appier/execution.py +94 -88
- appier/export.py +90 -88
- appier/extra.py +6 -13
- appier/extra_neo.py +8 -11
- appier/extra_old.py +18 -16
- appier/geo.py +57 -47
- appier/git.py +101 -90
- appier/graph.py +23 -24
- appier/http.py +520 -398
- appier/legacy.py +373 -180
- appier/log.py +90 -97
- appier/meta.py +42 -42
- appier/mock.py +32 -34
- appier/model.py +793 -681
- appier/model_a.py +208 -183
- appier/mongo.py +183 -107
- appier/observer.py +39 -31
- appier/part.py +23 -24
- appier/preferences.py +44 -47
- appier/queuing.py +78 -96
- appier/redisdb.py +40 -35
- appier/request.py +227 -175
- appier/scheduler.py +13 -18
- appier/serialize.py +37 -31
- appier/session.py +161 -147
- appier/settings.py +2 -11
- appier/smtp.py +53 -49
- appier/storage.py +39 -33
- appier/structures.py +50 -45
- appier/test/__init__.py +2 -11
- appier/test/base.py +111 -108
- appier/test/cache.py +28 -35
- appier/test/config.py +10 -19
- appier/test/crypt.py +3 -12
- appier/test/data.py +3 -12
- appier/test/exceptions.py +8 -17
- appier/test/export.py +16 -33
- appier/test/graph.py +27 -60
- appier/test/http.py +42 -54
- appier/test/legacy.py +20 -30
- appier/test/log.py +14 -35
- appier/test/mock.py +27 -123
- appier/test/model.py +79 -91
- appier/test/part.py +5 -14
- appier/test/preferences.py +5 -13
- appier/test/queuing.py +29 -37
- appier/test/request.py +61 -73
- appier/test/serialize.py +12 -23
- appier/test/session.py +10 -19
- appier/test/smtp.py +8 -14
- appier/test/structures.py +20 -24
- appier/test/typesf.py +14 -28
- appier/test/util.py +480 -438
- appier/typesf.py +251 -171
- appier/util.py +578 -407
- appier/validation.py +280 -143
- {appier-1.31.4.dist-info → appier-1.32.0.dist-info}/METADATA +6 -1
- appier-1.32.0.dist-info/RECORD +86 -0
- appier-1.31.4.dist-info/RECORD +0 -86
- {appier-1.31.4.dist-info → appier-1.32.0.dist-info}/LICENSE +0 -0
- {appier-1.31.4.dist-info → appier-1.32.0.dist-info}/WHEEL +0 -0
- {appier-1.31.4.dist-info → appier-1.32.0.dist-info}/top_level.txt +0 -0
appier/legacy.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Hive Appier Framework
|
|
5
|
-
# Copyright (c) 2008-
|
|
5
|
+
# Copyright (c) 2008-2024 Hive Solutions Lda.
|
|
6
6
|
#
|
|
7
7
|
# This file is part of Hive Appier Framework.
|
|
8
8
|
#
|
|
@@ -22,16 +22,7 @@
|
|
|
22
22
|
__author__ = "João Magalhães <joamag@hive.pt>"
|
|
23
23
|
""" The author(s) of the module """
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
""" The version of the module """
|
|
27
|
-
|
|
28
|
-
__revision__ = "$LastChangedRevision$"
|
|
29
|
-
""" The revision number of the module """
|
|
30
|
-
|
|
31
|
-
__date__ = "$LastChangedDate$"
|
|
32
|
-
""" The last change date of the module """
|
|
33
|
-
|
|
34
|
-
__copyright__ = "Copyright (c) 2008-2022 Hive Solutions Lda."
|
|
25
|
+
__copyright__ = "Copyright (c) 2008-2024 Hive Solutions Lda."
|
|
35
26
|
""" The copyright for the module """
|
|
36
27
|
|
|
37
28
|
__license__ = "Apache License, Version 2.0"
|
|
@@ -45,71 +36,116 @@ import itertools
|
|
|
45
36
|
import contextlib
|
|
46
37
|
import collections
|
|
47
38
|
|
|
48
|
-
import urllib
|
|
39
|
+
import urllib # @UnusedImport
|
|
40
|
+
|
|
41
|
+
ArgSpec = collections.namedtuple("ArgSpec", ["args", "varargs", "keywords", "defaults"])
|
|
49
42
|
|
|
50
|
-
ArgSpec = collections.namedtuple(
|
|
51
|
-
"ArgSpec",
|
|
52
|
-
["args", "varargs", "keywords", "defaults"]
|
|
53
|
-
)
|
|
54
43
|
|
|
55
44
|
@contextlib.contextmanager
|
|
56
45
|
def ctx_absolute():
|
|
57
46
|
root = sys.path.pop(0)
|
|
58
|
-
try:
|
|
59
|
-
|
|
47
|
+
try:
|
|
48
|
+
yield
|
|
49
|
+
finally:
|
|
50
|
+
sys.path.insert(0, root)
|
|
51
|
+
|
|
60
52
|
|
|
61
53
|
with ctx_absolute():
|
|
62
|
-
try:
|
|
63
|
-
|
|
54
|
+
try:
|
|
55
|
+
import urllib2
|
|
56
|
+
except ImportError:
|
|
57
|
+
urllib2 = None
|
|
64
58
|
|
|
65
59
|
with ctx_absolute():
|
|
66
|
-
try:
|
|
67
|
-
|
|
60
|
+
try:
|
|
61
|
+
import httplib
|
|
62
|
+
except ImportError:
|
|
63
|
+
httplib = None
|
|
68
64
|
|
|
69
65
|
with ctx_absolute():
|
|
70
|
-
try:
|
|
71
|
-
|
|
66
|
+
try:
|
|
67
|
+
import http
|
|
68
|
+
except ImportError:
|
|
69
|
+
http = None
|
|
72
70
|
|
|
73
71
|
with ctx_absolute():
|
|
74
|
-
try:
|
|
75
|
-
|
|
72
|
+
try:
|
|
73
|
+
import types
|
|
74
|
+
except ImportError:
|
|
75
|
+
types = None
|
|
76
76
|
|
|
77
77
|
with ctx_absolute():
|
|
78
|
-
try:
|
|
79
|
-
|
|
78
|
+
try:
|
|
79
|
+
import urllib.error
|
|
80
|
+
except ImportError:
|
|
81
|
+
pass
|
|
80
82
|
|
|
81
83
|
with ctx_absolute():
|
|
82
|
-
try:
|
|
83
|
-
|
|
84
|
+
try:
|
|
85
|
+
import urllib.request
|
|
86
|
+
except ImportError:
|
|
87
|
+
pass
|
|
84
88
|
|
|
85
89
|
with ctx_absolute():
|
|
86
|
-
try:
|
|
87
|
-
|
|
90
|
+
try:
|
|
91
|
+
import http.client
|
|
92
|
+
except ImportError:
|
|
93
|
+
pass
|
|
88
94
|
|
|
89
95
|
with ctx_absolute():
|
|
90
|
-
try:
|
|
91
|
-
|
|
96
|
+
try:
|
|
97
|
+
import importlib.util
|
|
98
|
+
except ImportError:
|
|
99
|
+
pass
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
import HTMLParser
|
|
103
|
+
except ImportError:
|
|
104
|
+
import html.parser
|
|
105
|
+
|
|
106
|
+
HTMLParser = html.parser
|
|
92
107
|
|
|
93
|
-
try:
|
|
94
|
-
|
|
108
|
+
try:
|
|
109
|
+
import cPickle
|
|
110
|
+
except ImportError:
|
|
111
|
+
import pickle
|
|
95
112
|
|
|
96
|
-
|
|
97
|
-
except ImportError: import pickle; cPickle = pickle
|
|
113
|
+
cPickle = pickle
|
|
98
114
|
|
|
99
|
-
try:
|
|
100
|
-
|
|
115
|
+
try:
|
|
116
|
+
import imp
|
|
117
|
+
except ImportError:
|
|
118
|
+
import importlib
|
|
101
119
|
|
|
102
|
-
|
|
103
|
-
except ImportError: import imp; importlib = imp
|
|
120
|
+
imp = importlib
|
|
104
121
|
|
|
105
|
-
try:
|
|
106
|
-
|
|
122
|
+
try:
|
|
123
|
+
import importlib
|
|
124
|
+
except ImportError:
|
|
125
|
+
import imp
|
|
107
126
|
|
|
108
|
-
|
|
109
|
-
except ImportError: import io; _StringIO = io
|
|
127
|
+
importlib = imp
|
|
110
128
|
|
|
111
|
-
try:
|
|
112
|
-
|
|
129
|
+
try:
|
|
130
|
+
import cStringIO
|
|
131
|
+
except ImportError:
|
|
132
|
+
import io
|
|
133
|
+
|
|
134
|
+
cStringIO = io
|
|
135
|
+
|
|
136
|
+
try:
|
|
137
|
+
import StringIO as _StringIO
|
|
138
|
+
except ImportError:
|
|
139
|
+
import io
|
|
140
|
+
|
|
141
|
+
_StringIO = io
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
import urlparse as _urlparse
|
|
145
|
+
except ImportError:
|
|
146
|
+
import urllib.parse
|
|
147
|
+
|
|
148
|
+
_urlparse = urllib.parse
|
|
113
149
|
|
|
114
150
|
PYTHON_3 = sys.version_info[0] >= 3
|
|
115
151
|
""" Global variable that defines if the current Python
|
|
@@ -142,26 +178,40 @@ PYTHON_V = int("".join([str(v) for v in sys.version_info[:3]]))
|
|
|
142
178
|
""" The Python version integer describing the version of
|
|
143
179
|
a the interpreter as a set of three integer digits """
|
|
144
180
|
|
|
145
|
-
if PYTHON_3:
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
else:
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if PYTHON_3:
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
181
|
+
if PYTHON_3:
|
|
182
|
+
LONG = int
|
|
183
|
+
else:
|
|
184
|
+
LONG = long # @UndefinedVariable
|
|
185
|
+
|
|
186
|
+
if PYTHON_3:
|
|
187
|
+
BYTES = bytes
|
|
188
|
+
else:
|
|
189
|
+
BYTES = str # @UndefinedVariable
|
|
190
|
+
|
|
191
|
+
if PYTHON_3:
|
|
192
|
+
UNICODE = str
|
|
193
|
+
else:
|
|
194
|
+
UNICODE = unicode # @UndefinedVariable
|
|
195
|
+
|
|
196
|
+
if PYTHON_3:
|
|
197
|
+
OLD_UNICODE = None
|
|
198
|
+
else:
|
|
199
|
+
OLD_UNICODE = unicode # @UndefinedVariable
|
|
200
|
+
|
|
201
|
+
if PYTHON_3:
|
|
202
|
+
STRINGS = (str,)
|
|
203
|
+
else:
|
|
204
|
+
STRINGS = (str, unicode) # @UndefinedVariable
|
|
205
|
+
|
|
206
|
+
if PYTHON_3:
|
|
207
|
+
ALL_STRINGS = (bytes, str)
|
|
208
|
+
else:
|
|
209
|
+
ALL_STRINGS = (bytes, str, unicode) # @UndefinedVariable
|
|
210
|
+
|
|
211
|
+
if PYTHON_3:
|
|
212
|
+
INTEGERS = (int,)
|
|
213
|
+
else:
|
|
214
|
+
INTEGERS = (int, long) # @UndefinedVariable
|
|
165
215
|
|
|
166
216
|
# saves a series of global symbols that are going to be
|
|
167
217
|
# used latter for some of the legacy operations
|
|
@@ -171,161 +221,247 @@ _str = str
|
|
|
171
221
|
_bytes = bytes
|
|
172
222
|
_range = range
|
|
173
223
|
|
|
174
|
-
try:
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
else:
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
224
|
+
try:
|
|
225
|
+
_xrange = xrange # @UndefinedVariable
|
|
226
|
+
except Exception:
|
|
227
|
+
_xrange = None
|
|
228
|
+
|
|
229
|
+
if PYTHON_3:
|
|
230
|
+
Request = urllib.request.Request
|
|
231
|
+
else:
|
|
232
|
+
Request = urllib2.Request
|
|
233
|
+
|
|
234
|
+
if PYTHON_3:
|
|
235
|
+
HTTPHandler = urllib.request.HTTPHandler
|
|
236
|
+
else:
|
|
237
|
+
HTTPHandler = urllib2.HTTPHandler
|
|
238
|
+
|
|
239
|
+
if PYTHON_3:
|
|
240
|
+
HTTPError = urllib.error.HTTPError
|
|
241
|
+
else:
|
|
242
|
+
HTTPError = urllib2.HTTPError
|
|
243
|
+
|
|
244
|
+
if PYTHON_3:
|
|
245
|
+
HTTPConnection = http.client.HTTPConnection # @UndefinedVariable
|
|
246
|
+
else:
|
|
247
|
+
HTTPConnection = httplib.HTTPConnection
|
|
248
|
+
|
|
249
|
+
if PYTHON_3:
|
|
250
|
+
HTTPSConnection = http.client.HTTPSConnection # @UndefinedVariable
|
|
251
|
+
else:
|
|
252
|
+
HTTPSConnection = httplib.HTTPSConnection
|
|
253
|
+
|
|
254
|
+
try:
|
|
255
|
+
_execfile = execfile # @UndefinedVariable
|
|
256
|
+
except Exception:
|
|
257
|
+
_execfile = None
|
|
258
|
+
|
|
259
|
+
try:
|
|
260
|
+
_reduce = reduce # @UndefinedVariable
|
|
261
|
+
except Exception:
|
|
262
|
+
_reduce = None
|
|
263
|
+
|
|
264
|
+
try:
|
|
265
|
+
_reload = reload # @UndefinedVariable
|
|
266
|
+
except Exception:
|
|
267
|
+
_reload = None
|
|
268
|
+
|
|
269
|
+
try:
|
|
270
|
+
_unichr = unichr # @UndefinedVariable
|
|
271
|
+
except Exception:
|
|
272
|
+
_unichr = None
|
|
185
273
|
|
|
186
|
-
if PYTHON_3: HTTPConnection = http.client.HTTPConnection #@UndefinedVariable
|
|
187
|
-
else: HTTPConnection = httplib.HTTPConnection
|
|
188
|
-
|
|
189
|
-
if PYTHON_3: HTTPSConnection = http.client.HTTPSConnection #@UndefinedVariable
|
|
190
|
-
else: HTTPSConnection = httplib.HTTPSConnection
|
|
191
|
-
|
|
192
|
-
try: _execfile = execfile #@UndefinedVariable
|
|
193
|
-
except Exception: _execfile = None
|
|
194
|
-
|
|
195
|
-
try: _reduce = reduce #@UndefinedVariable
|
|
196
|
-
except Exception: _reduce = None
|
|
197
|
-
|
|
198
|
-
try: _reload = reload #@UndefinedVariable
|
|
199
|
-
except Exception: _reload = None
|
|
200
|
-
|
|
201
|
-
try: _unichr = unichr #@UndefinedVariable
|
|
202
|
-
except Exception: _unichr = None
|
|
203
274
|
|
|
204
275
|
def with_meta(meta, *bases):
|
|
205
276
|
return meta("Class", bases, {})
|
|
206
277
|
|
|
278
|
+
|
|
207
279
|
def eager(iterable):
|
|
208
|
-
if PYTHON_3:
|
|
280
|
+
if PYTHON_3:
|
|
281
|
+
return list(iterable)
|
|
209
282
|
return iterable
|
|
210
283
|
|
|
284
|
+
|
|
211
285
|
def iteritems(associative):
|
|
212
|
-
if PYTHON_3:
|
|
286
|
+
if PYTHON_3:
|
|
287
|
+
return associative.items()
|
|
213
288
|
return associative.iteritems()
|
|
214
289
|
|
|
290
|
+
|
|
215
291
|
def iterkeys(associative):
|
|
216
|
-
if PYTHON_3:
|
|
292
|
+
if PYTHON_3:
|
|
293
|
+
return associative.keys()
|
|
217
294
|
return associative.iterkeys()
|
|
218
295
|
|
|
296
|
+
|
|
219
297
|
def itervalues(associative):
|
|
220
|
-
if PYTHON_3:
|
|
298
|
+
if PYTHON_3:
|
|
299
|
+
return associative.values()
|
|
221
300
|
return associative.itervalues()
|
|
222
301
|
|
|
302
|
+
|
|
223
303
|
def items(associative):
|
|
224
|
-
if PYTHON_3:
|
|
304
|
+
if PYTHON_3:
|
|
305
|
+
return eager(associative.items())
|
|
225
306
|
return associative.items()
|
|
226
307
|
|
|
308
|
+
|
|
227
309
|
def keys(associative):
|
|
228
|
-
if PYTHON_3:
|
|
310
|
+
if PYTHON_3:
|
|
311
|
+
return eager(associative.keys())
|
|
229
312
|
return associative.keys()
|
|
230
313
|
|
|
314
|
+
|
|
231
315
|
def values(associative):
|
|
232
|
-
if PYTHON_3:
|
|
316
|
+
if PYTHON_3:
|
|
317
|
+
return eager(associative.values())
|
|
233
318
|
return associative.values()
|
|
234
319
|
|
|
235
|
-
|
|
236
|
-
|
|
320
|
+
|
|
321
|
+
def xrange(start, stop=None, step=1):
|
|
322
|
+
if PYTHON_3:
|
|
323
|
+
return _range(start, stop, step) if stop else _range(start)
|
|
237
324
|
return _xrange(start, stop, step) if stop else _range(start)
|
|
238
325
|
|
|
239
|
-
|
|
240
|
-
|
|
326
|
+
|
|
327
|
+
def range(start, stop=None, step=None):
|
|
328
|
+
if PYTHON_3:
|
|
329
|
+
return eager(_range(start, stop, step)) if stop else eager(_range(start))
|
|
241
330
|
return _range(start, stop, step) if stop else _range(start)
|
|
242
331
|
|
|
332
|
+
|
|
243
333
|
def ord(value):
|
|
244
|
-
if PYTHON_3 and type(value) == int:
|
|
334
|
+
if PYTHON_3 and type(value) == int:
|
|
335
|
+
return value
|
|
245
336
|
return _ord(value)
|
|
246
337
|
|
|
338
|
+
|
|
247
339
|
def chr(value):
|
|
248
|
-
if PYTHON_3:
|
|
249
|
-
|
|
340
|
+
if PYTHON_3:
|
|
341
|
+
return _bytes([value])
|
|
342
|
+
if type(value) in INTEGERS:
|
|
343
|
+
return _chr(value)
|
|
250
344
|
return value
|
|
251
345
|
|
|
346
|
+
|
|
252
347
|
def chri(value):
|
|
253
|
-
if PYTHON_3:
|
|
254
|
-
|
|
348
|
+
if PYTHON_3:
|
|
349
|
+
return value
|
|
350
|
+
if type(value) in INTEGERS:
|
|
351
|
+
return _chr(value)
|
|
255
352
|
return value
|
|
256
353
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
if
|
|
260
|
-
|
|
354
|
+
|
|
355
|
+
def bytes(value, encoding="latin-1", errors="strict", force=False):
|
|
356
|
+
if not PYTHON_3 and not force:
|
|
357
|
+
return value
|
|
358
|
+
if value == None:
|
|
359
|
+
return value
|
|
360
|
+
if type(value) == _bytes:
|
|
361
|
+
return value
|
|
261
362
|
return value.encode(encoding, errors)
|
|
262
363
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
if
|
|
266
|
-
|
|
364
|
+
|
|
365
|
+
def str(value, encoding="latin-1", errors="strict", force=False):
|
|
366
|
+
if not PYTHON_3 and not force:
|
|
367
|
+
return value
|
|
368
|
+
if value == None:
|
|
369
|
+
return value
|
|
370
|
+
if type(value) in STRINGS:
|
|
371
|
+
return value
|
|
267
372
|
return value.decode(encoding, errors)
|
|
268
373
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
if
|
|
272
|
-
|
|
374
|
+
|
|
375
|
+
def u(value, encoding="utf-8", errors="strict", force=False):
|
|
376
|
+
if PYTHON_3 and not force:
|
|
377
|
+
return value
|
|
378
|
+
if value == None:
|
|
379
|
+
return value
|
|
380
|
+
if type(value) == UNICODE:
|
|
381
|
+
return value
|
|
273
382
|
return value.decode(encoding, errors)
|
|
274
383
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
384
|
+
|
|
385
|
+
def ascii(value, encoding="utf-8", errors="replace"):
|
|
386
|
+
if is_bytes(value):
|
|
387
|
+
value = value.decode(encoding, errors)
|
|
388
|
+
else:
|
|
389
|
+
value = UNICODE(value)
|
|
278
390
|
value = value.encode("ascii", errors)
|
|
279
391
|
value = str(value)
|
|
280
392
|
return value
|
|
281
393
|
|
|
394
|
+
|
|
282
395
|
def orderable(value):
|
|
283
|
-
if not PYTHON_3:
|
|
396
|
+
if not PYTHON_3:
|
|
397
|
+
return value
|
|
284
398
|
return Orderable(value)
|
|
285
399
|
|
|
400
|
+
|
|
286
401
|
def is_str(value):
|
|
287
402
|
return type(value) == _str
|
|
288
403
|
|
|
404
|
+
|
|
289
405
|
def is_unicode(value):
|
|
290
|
-
if PYTHON_3:
|
|
291
|
-
|
|
406
|
+
if PYTHON_3:
|
|
407
|
+
return type(value) == _str
|
|
408
|
+
else:
|
|
409
|
+
return type(value) == unicode # @UndefinedVariable
|
|
410
|
+
|
|
292
411
|
|
|
293
412
|
def is_bytes(value):
|
|
294
|
-
if PYTHON_3:
|
|
295
|
-
|
|
413
|
+
if PYTHON_3:
|
|
414
|
+
return type(value) == _bytes
|
|
415
|
+
else:
|
|
416
|
+
return type(value) == _str # @UndefinedVariable
|
|
417
|
+
|
|
296
418
|
|
|
297
|
-
def is_string(value, all
|
|
419
|
+
def is_string(value, all=False):
|
|
298
420
|
target = ALL_STRINGS if all else STRINGS
|
|
299
421
|
return type(value) in target
|
|
300
422
|
|
|
423
|
+
|
|
301
424
|
def is_generator(value):
|
|
302
|
-
if inspect.isgenerator(value):
|
|
303
|
-
|
|
304
|
-
if
|
|
425
|
+
if inspect.isgenerator(value):
|
|
426
|
+
return True
|
|
427
|
+
if type(value) in (itertools.chain,):
|
|
428
|
+
return True
|
|
429
|
+
if hasattr(value, "_is_generator"):
|
|
430
|
+
return True
|
|
305
431
|
return False
|
|
306
432
|
|
|
433
|
+
|
|
307
434
|
def is_async_generator(value):
|
|
308
|
-
if not hasattr(inspect, "isasyncgen"):
|
|
435
|
+
if not hasattr(inspect, "isasyncgen"):
|
|
436
|
+
return False
|
|
309
437
|
return inspect.isasyncgen(value)
|
|
310
438
|
|
|
311
|
-
|
|
439
|
+
|
|
440
|
+
def is_unittest(name="unittest"):
|
|
312
441
|
current_stack = inspect.stack()
|
|
313
442
|
for stack_frame in current_stack:
|
|
314
443
|
for program_line in stack_frame[4]:
|
|
315
444
|
is_unittest = not name in program_line
|
|
316
|
-
if is_unittest:
|
|
445
|
+
if is_unittest:
|
|
446
|
+
continue
|
|
317
447
|
return True
|
|
318
448
|
return False
|
|
319
449
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
if
|
|
450
|
+
|
|
451
|
+
def execfile(path, global_vars, local_vars=None, encoding="utf-8"):
|
|
452
|
+
if local_vars == None:
|
|
453
|
+
local_vars = global_vars
|
|
454
|
+
if not PYTHON_3:
|
|
455
|
+
return _execfile(path, global_vars, local_vars)
|
|
323
456
|
file = open(path, "rb")
|
|
324
|
-
try:
|
|
325
|
-
|
|
457
|
+
try:
|
|
458
|
+
data = file.read()
|
|
459
|
+
finally:
|
|
460
|
+
file.close()
|
|
326
461
|
data = data.decode(encoding)
|
|
327
462
|
code = compile(data, path, "exec")
|
|
328
|
-
exec(code, global_vars, local_vars)
|
|
463
|
+
exec(code, global_vars, local_vars) # @UndefinedVariable
|
|
464
|
+
|
|
329
465
|
|
|
330
466
|
def walk(path, visit, arg):
|
|
331
467
|
for root, dirs, _files in os.walk(path):
|
|
@@ -335,22 +471,33 @@ def walk(path, visit, arg):
|
|
|
335
471
|
exists = dir in names
|
|
336
472
|
not exists and dirs.remove(dir)
|
|
337
473
|
|
|
474
|
+
|
|
338
475
|
def getargspec(func):
|
|
339
476
|
has_full = hasattr(inspect, "getfullargspec")
|
|
340
|
-
if has_full:
|
|
341
|
-
|
|
477
|
+
if has_full:
|
|
478
|
+
return ArgSpec(*inspect.getfullargspec(func)[:4])
|
|
479
|
+
else:
|
|
480
|
+
return inspect.getargspec(func)
|
|
481
|
+
|
|
342
482
|
|
|
343
483
|
def has_module(name):
|
|
344
484
|
if PYTHON_3:
|
|
345
|
-
try:
|
|
346
|
-
|
|
347
|
-
|
|
485
|
+
try:
|
|
486
|
+
spec = importlib.util.find_spec(name)
|
|
487
|
+
except ImportError:
|
|
488
|
+
return False
|
|
489
|
+
if spec == None:
|
|
490
|
+
return False
|
|
348
491
|
return True
|
|
349
|
-
try:
|
|
350
|
-
|
|
351
|
-
|
|
492
|
+
try:
|
|
493
|
+
file, _path, _description = imp.find_module(name)
|
|
494
|
+
except ImportError:
|
|
495
|
+
return False
|
|
496
|
+
if file:
|
|
497
|
+
file.close()
|
|
352
498
|
return True
|
|
353
499
|
|
|
500
|
+
|
|
354
501
|
def new_module(name):
|
|
355
502
|
if hasattr(types, "ModuleType"):
|
|
356
503
|
return types.ModuleType(name)
|
|
@@ -358,74 +505,120 @@ def new_module(name):
|
|
|
358
505
|
return imp.new_module(name)
|
|
359
506
|
raise ValueError("No module build method available")
|
|
360
507
|
|
|
508
|
+
|
|
361
509
|
def reduce(*args, **kwargs):
|
|
362
|
-
if PYTHON_3:
|
|
510
|
+
if PYTHON_3:
|
|
511
|
+
return functools.reduce(*args, **kwargs)
|
|
363
512
|
return _reduce(*args, **kwargs)
|
|
364
513
|
|
|
514
|
+
|
|
365
515
|
def reload(*args, **kwargs):
|
|
366
|
-
if PYTHON_3:
|
|
516
|
+
if PYTHON_3:
|
|
517
|
+
return importlib.reload(*args, **kwargs)
|
|
367
518
|
return _reload(*args, **kwargs)
|
|
368
519
|
|
|
520
|
+
|
|
369
521
|
def unichr(*args, **kwargs):
|
|
370
|
-
if PYTHON_3:
|
|
522
|
+
if PYTHON_3:
|
|
523
|
+
return _chr(*args, **kwargs)
|
|
371
524
|
return _unichr(*args, **kwargs)
|
|
372
525
|
|
|
526
|
+
|
|
373
527
|
def urlopen(*args, **kwargs):
|
|
374
|
-
if PYTHON_3:
|
|
375
|
-
|
|
528
|
+
if PYTHON_3:
|
|
529
|
+
return urllib.request.urlopen(*args, **kwargs)
|
|
530
|
+
else:
|
|
531
|
+
return urllib2.urlopen(*args, **kwargs) # @UndefinedVariable
|
|
532
|
+
|
|
376
533
|
|
|
377
534
|
def build_opener(*args, **kwargs):
|
|
378
|
-
if PYTHON_3:
|
|
379
|
-
|
|
535
|
+
if PYTHON_3:
|
|
536
|
+
return urllib.request.build_opener(*args, **kwargs)
|
|
537
|
+
else:
|
|
538
|
+
return urllib2.build_opener(*args, **kwargs) # @UndefinedVariable
|
|
539
|
+
|
|
380
540
|
|
|
381
541
|
def urlparse(*args, **kwargs):
|
|
382
542
|
return _urlparse.urlparse(*args, **kwargs)
|
|
383
543
|
|
|
544
|
+
|
|
384
545
|
def urlunparse(*args, **kwargs):
|
|
385
546
|
return _urlparse.urlunparse(*args, **kwargs)
|
|
386
547
|
|
|
548
|
+
|
|
387
549
|
def parse_qs(*args, **kwargs):
|
|
388
550
|
return _urlparse.parse_qs(*args, **kwargs)
|
|
389
551
|
|
|
552
|
+
|
|
390
553
|
def urlencode(*args, **kwargs):
|
|
391
|
-
if PYTHON_3:
|
|
392
|
-
|
|
554
|
+
if PYTHON_3:
|
|
555
|
+
return urllib.parse.urlencode(*args, **kwargs)
|
|
556
|
+
else:
|
|
557
|
+
return urllib.urlencode(*args, **kwargs) # @UndefinedVariable
|
|
558
|
+
|
|
393
559
|
|
|
394
560
|
def quote(*args, **kwargs):
|
|
395
|
-
if PYTHON_3:
|
|
396
|
-
|
|
561
|
+
if PYTHON_3:
|
|
562
|
+
return urllib.parse.quote(*args, **kwargs)
|
|
563
|
+
else:
|
|
564
|
+
return urllib.quote(*args, **kwargs) # @UndefinedVariable
|
|
565
|
+
|
|
397
566
|
|
|
398
567
|
def quote_plus(*args, **kwargs):
|
|
399
|
-
if PYTHON_3:
|
|
400
|
-
|
|
568
|
+
if PYTHON_3:
|
|
569
|
+
return urllib.parse.quote_plus(*args, **kwargs)
|
|
570
|
+
else:
|
|
571
|
+
return urllib.quote_plus(*args, **kwargs) # @UndefinedVariable
|
|
572
|
+
|
|
401
573
|
|
|
402
574
|
def unquote(*args, **kwargs):
|
|
403
|
-
if PYTHON_3:
|
|
404
|
-
|
|
575
|
+
if PYTHON_3:
|
|
576
|
+
return urllib.parse.unquote(*args, **kwargs)
|
|
577
|
+
else:
|
|
578
|
+
return urllib.unquote(*args, **kwargs) # @UndefinedVariable
|
|
579
|
+
|
|
405
580
|
|
|
406
581
|
def unquote_plus(*args, **kwargs):
|
|
407
|
-
if PYTHON_3:
|
|
408
|
-
|
|
582
|
+
if PYTHON_3:
|
|
583
|
+
return urllib.parse.unquote_plus(*args, **kwargs)
|
|
584
|
+
else:
|
|
585
|
+
return urllib.unquote_plus(*args, **kwargs) # @UndefinedVariable
|
|
586
|
+
|
|
409
587
|
|
|
410
588
|
def cmp_to_key(*args, **kwargs):
|
|
411
|
-
if PYTHON_3:
|
|
412
|
-
|
|
589
|
+
if PYTHON_3:
|
|
590
|
+
return dict(key=functools.cmp_to_key(*args, **kwargs)) # @UndefinedVariable
|
|
591
|
+
else:
|
|
592
|
+
return dict(cmp=args[0])
|
|
593
|
+
|
|
413
594
|
|
|
414
595
|
def tobytes(self, *args, **kwargs):
|
|
415
|
-
if PYTHON_3:
|
|
416
|
-
|
|
596
|
+
if PYTHON_3:
|
|
597
|
+
return self.tobytes(*args, **kwargs)
|
|
598
|
+
else:
|
|
599
|
+
return self.tostring(*args, **kwargs)
|
|
600
|
+
|
|
417
601
|
|
|
418
602
|
def tostring(self, *args, **kwargs):
|
|
419
|
-
if PYTHON_3:
|
|
420
|
-
|
|
603
|
+
if PYTHON_3:
|
|
604
|
+
return self.tobytes(*args, **kwargs)
|
|
605
|
+
else:
|
|
606
|
+
return self.tostring(*args, **kwargs)
|
|
607
|
+
|
|
421
608
|
|
|
422
609
|
def StringIO(*args, **kwargs):
|
|
423
|
-
if PYTHON_3:
|
|
424
|
-
|
|
610
|
+
if PYTHON_3:
|
|
611
|
+
return cStringIO.StringIO(*args, **kwargs)
|
|
612
|
+
else:
|
|
613
|
+
return _StringIO.StringIO(*args, **kwargs)
|
|
614
|
+
|
|
425
615
|
|
|
426
616
|
def BytesIO(*args, **kwargs):
|
|
427
|
-
if PYTHON_3:
|
|
428
|
-
|
|
617
|
+
if PYTHON_3:
|
|
618
|
+
return cStringIO.BytesIO(*args, **kwargs)
|
|
619
|
+
else:
|
|
620
|
+
return cStringIO.StringIO(*args, **kwargs)
|
|
621
|
+
|
|
429
622
|
|
|
430
623
|
class Orderable(tuple):
|
|
431
624
|
"""
|