Add python-eventlet 0.16.1
[packages/trusty/python-eventlet.git] / eventlet / eventlet / support / __init__.py
1 import sys
2 from contextlib import contextmanager
3
4 from eventlet.support import greenlets, six
5
6
7 def get_errno(exc):
8     """ Get the error code out of socket.error objects.
9     socket.error in <2.5 does not have errno attribute
10     socket.error in 3.x does not allow indexing access
11     e.args[0] works for all.
12     There are cases when args[0] is not errno.
13     i.e. http://bugs.python.org/issue6471
14     Maybe there are cases when errno is set, but it is not the first argument?
15     """
16
17     try:
18         if exc.errno is not None:
19             return exc.errno
20     except AttributeError:
21         pass
22     try:
23         return exc.args[0]
24     except IndexError:
25         return None
26
27
28 if sys.version_info[0] < 3 and not greenlets.preserves_excinfo:
29     from sys import exc_clear as clear_sys_exc_info
30 else:
31     def clear_sys_exc_info():
32         """No-op In py3k.
33         Exception information is not visible outside of except statements.
34         sys.exc_clear became obsolete and removed."""
35         pass
36
37 if sys.version_info[0] < 3:
38     def bytes_to_str(b, encoding='ascii'):
39         return b
40 else:
41     def bytes_to_str(b, encoding='ascii'):
42         return b.decode(encoding)
43
44 PY33 = sys.version_info[:2] == (3, 3)
45
46 @contextmanager
47 def capture_stderr():
48     stream = six.StringIO()
49     original = sys.stderr
50     try:
51         sys.stderr = stream
52         yield stream
53     finally:
54         sys.stderr = original
55         stream.seek(0)