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.
Files changed (81) hide show
  1. appier/__init__.py +333 -52
  2. appier/amqp.py +29 -30
  3. appier/api.py +214 -212
  4. appier/asgi.py +54 -55
  5. appier/async_neo.py +46 -35
  6. appier/async_old.py +55 -42
  7. appier/asynchronous.py +7 -13
  8. appier/base.py +1762 -1429
  9. appier/bus.py +51 -52
  10. appier/cache.py +99 -84
  11. appier/common.py +9 -11
  12. appier/component.py +17 -19
  13. appier/compress.py +25 -28
  14. appier/config.py +96 -73
  15. appier/controller.py +9 -15
  16. appier/crypt.py +25 -21
  17. appier/data.py +73 -57
  18. appier/defines.py +191 -226
  19. appier/exceptions.py +103 -63
  20. appier/execution.py +94 -88
  21. appier/export.py +90 -88
  22. appier/extra.py +6 -13
  23. appier/extra_neo.py +8 -11
  24. appier/extra_old.py +18 -16
  25. appier/geo.py +57 -47
  26. appier/git.py +101 -90
  27. appier/graph.py +23 -24
  28. appier/http.py +520 -398
  29. appier/legacy.py +373 -180
  30. appier/log.py +90 -97
  31. appier/meta.py +42 -42
  32. appier/mock.py +32 -34
  33. appier/model.py +793 -681
  34. appier/model_a.py +208 -183
  35. appier/mongo.py +183 -107
  36. appier/observer.py +39 -31
  37. appier/part.py +23 -24
  38. appier/preferences.py +44 -47
  39. appier/queuing.py +78 -96
  40. appier/redisdb.py +40 -35
  41. appier/request.py +227 -175
  42. appier/scheduler.py +13 -18
  43. appier/serialize.py +37 -31
  44. appier/session.py +161 -147
  45. appier/settings.py +2 -11
  46. appier/smtp.py +53 -49
  47. appier/storage.py +39 -33
  48. appier/structures.py +50 -45
  49. appier/test/__init__.py +2 -11
  50. appier/test/base.py +111 -108
  51. appier/test/cache.py +28 -35
  52. appier/test/config.py +10 -19
  53. appier/test/crypt.py +3 -12
  54. appier/test/data.py +3 -12
  55. appier/test/exceptions.py +8 -17
  56. appier/test/export.py +16 -33
  57. appier/test/graph.py +27 -60
  58. appier/test/http.py +42 -54
  59. appier/test/legacy.py +20 -30
  60. appier/test/log.py +14 -35
  61. appier/test/mock.py +27 -123
  62. appier/test/model.py +79 -91
  63. appier/test/part.py +5 -14
  64. appier/test/preferences.py +5 -13
  65. appier/test/queuing.py +29 -37
  66. appier/test/request.py +61 -73
  67. appier/test/serialize.py +12 -23
  68. appier/test/session.py +10 -19
  69. appier/test/smtp.py +8 -14
  70. appier/test/structures.py +20 -24
  71. appier/test/typesf.py +14 -28
  72. appier/test/util.py +480 -438
  73. appier/typesf.py +251 -171
  74. appier/util.py +578 -407
  75. appier/validation.py +280 -143
  76. {appier-1.31.4.dist-info → appier-1.32.0.dist-info}/METADATA +6 -1
  77. appier-1.32.0.dist-info/RECORD +86 -0
  78. appier-1.31.4.dist-info/RECORD +0 -86
  79. {appier-1.31.4.dist-info → appier-1.32.0.dist-info}/LICENSE +0 -0
  80. {appier-1.31.4.dist-info → appier-1.32.0.dist-info}/WHEEL +0 -0
  81. {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-2022 Hive Solutions Lda.
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
- __version__ = "1.0.0"
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 #@UnusedImport
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: yield
59
- finally: sys.path.insert(0, root)
47
+ try:
48
+ yield
49
+ finally:
50
+ sys.path.insert(0, root)
51
+
60
52
 
61
53
  with ctx_absolute():
62
- try: import urllib2
63
- except ImportError: urllib2 = None
54
+ try:
55
+ import urllib2
56
+ except ImportError:
57
+ urllib2 = None
64
58
 
65
59
  with ctx_absolute():
66
- try: import httplib
67
- except ImportError: httplib = None
60
+ try:
61
+ import httplib
62
+ except ImportError:
63
+ httplib = None
68
64
 
69
65
  with ctx_absolute():
70
- try: import http
71
- except ImportError: http = None
66
+ try:
67
+ import http
68
+ except ImportError:
69
+ http = None
72
70
 
73
71
  with ctx_absolute():
74
- try: import types
75
- except ImportError: types = None
72
+ try:
73
+ import types
74
+ except ImportError:
75
+ types = None
76
76
 
77
77
  with ctx_absolute():
78
- try: import urllib.error
79
- except ImportError: pass
78
+ try:
79
+ import urllib.error
80
+ except ImportError:
81
+ pass
80
82
 
81
83
  with ctx_absolute():
82
- try: import urllib.request
83
- except ImportError: pass
84
+ try:
85
+ import urllib.request
86
+ except ImportError:
87
+ pass
84
88
 
85
89
  with ctx_absolute():
86
- try: import http.client
87
- except ImportError: pass
90
+ try:
91
+ import http.client
92
+ except ImportError:
93
+ pass
88
94
 
89
95
  with ctx_absolute():
90
- try: import importlib.util
91
- except ImportError: pass
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: import HTMLParser
94
- except ImportError: import html.parser; HTMLParser = html.parser
108
+ try:
109
+ import cPickle
110
+ except ImportError:
111
+ import pickle
95
112
 
96
- try: import cPickle
97
- except ImportError: import pickle; cPickle = pickle
113
+ cPickle = pickle
98
114
 
99
- try: import imp
100
- except ImportError: import importlib; imp = importlib
115
+ try:
116
+ import imp
117
+ except ImportError:
118
+ import importlib
101
119
 
102
- try: import importlib
103
- except ImportError: import imp; importlib = imp
120
+ imp = importlib
104
121
 
105
- try: import cStringIO
106
- except ImportError: import io; cStringIO = io
122
+ try:
123
+ import importlib
124
+ except ImportError:
125
+ import imp
107
126
 
108
- try: import StringIO as _StringIO
109
- except ImportError: import io; _StringIO = io
127
+ importlib = imp
110
128
 
111
- try: import urlparse as _urlparse
112
- except ImportError: import urllib.parse; _urlparse = urllib.parse
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: LONG = int
146
- else: LONG = long #@UndefinedVariable
147
-
148
- if PYTHON_3: BYTES = bytes
149
- else: BYTES = str #@UndefinedVariable
150
-
151
- if PYTHON_3: UNICODE = str
152
- else: UNICODE = unicode #@UndefinedVariable
153
-
154
- if PYTHON_3: OLD_UNICODE = None
155
- else: OLD_UNICODE = unicode #@UndefinedVariable
156
-
157
- if PYTHON_3: STRINGS = (str,)
158
- else: STRINGS = (str, unicode) #@UndefinedVariable
159
-
160
- if PYTHON_3: ALL_STRINGS = (bytes, str)
161
- else: ALL_STRINGS = (bytes, str, unicode) #@UndefinedVariable
162
-
163
- if PYTHON_3: INTEGERS = (int,)
164
- else: INTEGERS = (int, long) #@UndefinedVariable
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: _xrange = xrange #@UndefinedVariable
175
- except Exception: _xrange = None
176
-
177
- if PYTHON_3: Request = urllib.request.Request
178
- else: Request = urllib2.Request
179
-
180
- if PYTHON_3: HTTPHandler = urllib.request.HTTPHandler
181
- else: HTTPHandler = urllib2.HTTPHandler
182
-
183
- if PYTHON_3: HTTPError = urllib.error.HTTPError
184
- else: HTTPError = urllib2.HTTPError
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: return list(iterable)
280
+ if PYTHON_3:
281
+ return list(iterable)
209
282
  return iterable
210
283
 
284
+
211
285
  def iteritems(associative):
212
- if PYTHON_3: return associative.items()
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: return associative.keys()
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: return associative.values()
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: return eager(associative.items())
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: return eager(associative.keys())
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: return eager(associative.values())
316
+ if PYTHON_3:
317
+ return eager(associative.values())
233
318
  return associative.values()
234
319
 
235
- def xrange(start, stop = None, step = 1):
236
- if PYTHON_3: return _range(start, stop, step) if stop else _range(start)
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
- def range(start, stop = None, step = None):
240
- if PYTHON_3: return eager(_range(start, stop, step)) if stop else eager(_range(start))
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: return value
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: return _bytes([value])
249
- if type(value) in INTEGERS: return _chr(value)
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: return value
254
- if type(value) in INTEGERS: return _chr(value)
348
+ if PYTHON_3:
349
+ return value
350
+ if type(value) in INTEGERS:
351
+ return _chr(value)
255
352
  return value
256
353
 
257
- def bytes(value, encoding = "latin-1", errors = "strict", force = False):
258
- if not PYTHON_3 and not force: return value
259
- if value == None: return value
260
- if type(value) == _bytes: return value
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
- def str(value, encoding = "latin-1", errors = "strict", force = False):
264
- if not PYTHON_3 and not force: return value
265
- if value == None: return value
266
- if type(value) in STRINGS: return value
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
- def u(value, encoding = "utf-8", errors = "strict", force = False):
270
- if PYTHON_3 and not force: return value
271
- if value == None: return value
272
- if type(value) == UNICODE: return value
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
- def ascii(value, encoding = "utf-8", errors = "replace"):
276
- if is_bytes(value): value = value.decode(encoding, errors)
277
- else: value = UNICODE(value)
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: return value
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: return type(value) == _str
291
- else: return type(value) == unicode #@UndefinedVariable
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: return type(value) == _bytes
295
- else: return type(value) == _str #@UndefinedVariable
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 = False):
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): return True
303
- if type(value) in (itertools.chain,): return True
304
- if hasattr(value, "_is_generator"): return True
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"): return False
435
+ if not hasattr(inspect, "isasyncgen"):
436
+ return False
309
437
  return inspect.isasyncgen(value)
310
438
 
311
- def is_unittest(name = "unittest"):
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: continue
445
+ if is_unittest:
446
+ continue
317
447
  return True
318
448
  return False
319
449
 
320
- def execfile(path, global_vars, local_vars = None, encoding = "utf-8"):
321
- if local_vars == None: local_vars = global_vars
322
- if not PYTHON_3: return _execfile(path, global_vars, local_vars)
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: data = file.read()
325
- finally: file.close()
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) #@UndefinedVariable
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: return ArgSpec(*inspect.getfullargspec(func)[:4])
341
- else: return inspect.getargspec(func)
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: spec = importlib.util.find_spec(name)
346
- except ImportError: return False
347
- if spec == None: return False
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: file, _path, _description = imp.find_module(name)
350
- except ImportError: return False
351
- if file: file.close()
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: return functools.reduce(*args, **kwargs)
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: return importlib.reload(*args, **kwargs)
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: return _chr(*args, **kwargs)
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: return urllib.request.urlopen(*args, **kwargs)
375
- else: return urllib2.urlopen(*args, **kwargs) #@UndefinedVariable
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: return urllib.request.build_opener(*args, **kwargs)
379
- else: return urllib2.build_opener(*args, **kwargs) #@UndefinedVariable
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: return urllib.parse.urlencode(*args, **kwargs)
392
- else: return urllib.urlencode(*args, **kwargs) #@UndefinedVariable
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: return urllib.parse.quote(*args, **kwargs)
396
- else: return urllib.quote(*args, **kwargs) #@UndefinedVariable
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: return urllib.parse.quote_plus(*args, **kwargs)
400
- else: return urllib.quote_plus(*args, **kwargs) #@UndefinedVariable
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: return urllib.parse.unquote(*args, **kwargs)
404
- else: return urllib.unquote(*args, **kwargs) #@UndefinedVariable
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: return urllib.parse.unquote_plus(*args, **kwargs)
408
- else: return urllib.unquote_plus(*args, **kwargs) #@UndefinedVariable
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: return dict(key = functools.cmp_to_key(*args, **kwargs)) #@UndefinedVariable
412
- else: return dict(cmp = args[0])
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: return self.tobytes(*args, **kwargs)
416
- else: return self.tostring(*args, **kwargs)
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: return self.tobytes(*args, **kwargs)
420
- else: return self.tostring(*args, **kwargs)
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: return cStringIO.StringIO(*args, **kwargs)
424
- else: return _StringIO.StringIO(*args, **kwargs)
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: return cStringIO.BytesIO(*args, **kwargs)
428
- else: return cStringIO.StringIO(*args, **kwargs)
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
  """