diff --git a/eventlet/api.py b/eventlet/api.py index 4c24fca..3ee73cb 100644 --- a/eventlet/api.py +++ b/eventlet/api.py @@ -6,8 +6,7 @@ import linecache import inspect import warnings -from eventlet.common import BaseException -from eventlet.support import greenlets as greenlet +from eventlet.support import greenlets as greenlet, BaseException from eventlet import hubs from eventlet import greenthread from eventlet import debug diff --git a/eventlet/backdoor.py b/eventlet/backdoor.py index f27059b..1c492fb 100644 --- a/eventlet/backdoor.py +++ b/eventlet/backdoor.py @@ -5,8 +5,7 @@ from code import InteractiveConsole import eventlet from eventlet import hubs -from eventlet.common import get_errno -from eventlet.support import greenlets +from eventlet.support import greenlets, get_errno #FIXME no testcases for bckdor module try: diff --git a/eventlet/common.py b/eventlet/common.py deleted file mode 100644 index 55a5288..0000000 --- a/eventlet/common.py +++ /dev/null @@ -1,36 +0,0 @@ -import sys -def get_errno(exc): - """ Get the error code out of socket.error objects. - socket.error in <2.5 does not have errno attribute - socket.error in 3.x does not allow indexing access - e.args[0] works for all. - There are cases when args[0] is not errno. - i.e. http://bugs.python.org/issue6471 - Maybe there are cases when errno is set, but it is not the first argument? - """ - - try: - if exc.errno is not None: return exc.errno - except AttributeError: - pass - try: - return exc.args[0] - except IndexError: - return None - -if sys.version_info[0]<3: - from sys import exc_clear as clear_sys_exc_info -else: - def clear_sys_exc_info(): - """No-op In py3k. - Exception information is not visible outside of except statements. - sys.exc_clear became obsolete and removed.""" - pass - -if sys.version_info[0]==2 and sys.version_info[1]<5: - class BaseException: # pylint: disable-msg=W0622 - # not subclassing from object() intentionally, because in - # that case "raise Timeout" fails with TypeError. - pass -else: - from __builtin__ import BaseException diff --git a/eventlet/green/OpenSSL/SSL.py b/eventlet/green/OpenSSL/SSL.py index 3d7fc4a..5c7115c 100644 --- a/eventlet/green/OpenSSL/SSL.py +++ b/eventlet/green/OpenSSL/SSL.py @@ -1,6 +1,6 @@ from OpenSSL import SSL as orig_SSL from OpenSSL.SSL import * -from eventlet.common import get_errno +from eventlet.support import get_errno from eventlet import greenio from eventlet.hubs import trampoline import socket diff --git a/eventlet/green/os.py b/eventlet/green/os.py index 01a1015..5577a07 100644 --- a/eventlet/green/os.py +++ b/eventlet/green/os.py @@ -3,7 +3,7 @@ import errno socket = __import__("socket") from eventlet import greenio -from eventlet.common import get_errno +from eventlet.support import get_errno from eventlet import greenthread from eventlet import hubs diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py index 71e2fb6..810fbe1 100644 --- a/eventlet/green/ssl.py +++ b/eventlet/green/ssl.py @@ -6,7 +6,7 @@ for attr in dir(__ssl): import errno time = __import__('time') -from eventlet.common import get_errno +from eventlet.support import get_errno from eventlet.hubs import trampoline from eventlet.greenio import set_nonblocking, GreenSocket, SOCKET_CLOSED, CONNECT_ERR, CONNECT_SUCCESS orig_socket = __import__('socket') diff --git a/eventlet/greenio.py b/eventlet/greenio.py index 6478d22..f79c67f 100644 --- a/eventlet/greenio.py +++ b/eventlet/greenio.py @@ -1,4 +1,4 @@ -from eventlet.common import get_errno +from eventlet.support import get_errno from eventlet.hubs import trampoline BUFFER_SIZE = 4096 diff --git a/eventlet/hubs/hub.py b/eventlet/hubs/hub.py index c0d2d41..0b95cc1 100644 --- a/eventlet/hubs/hub.py +++ b/eventlet/hubs/hub.py @@ -2,8 +2,7 @@ import heapq import sys import traceback -from eventlet.common import clear_sys_exc_info -from eventlet.support import greenlets as greenlet +from eventlet.support import greenlets as greenlet, clear_sys_exc_info from eventlet.hubs import timer from eventlet import patcher time = patcher.original('time') diff --git a/eventlet/hubs/poll.py b/eventlet/hubs/poll.py index d6c62ca..aec4a5f 100644 --- a/eventlet/hubs/poll.py +++ b/eventlet/hubs/poll.py @@ -5,7 +5,7 @@ select = patcher.original('select') time = patcher.original('time') sleep = time.sleep -from eventlet.common import get_errno, clear_sys_exc_info +from eventlet.support import get_errno, clear_sys_exc_info from eventlet.hubs.hub import BaseHub, READ, WRITE EXC_MASK = select.POLLERR | select.POLLHUP diff --git a/eventlet/hubs/selects.py b/eventlet/hubs/selects.py index bbd84b7..4838b68 100644 --- a/eventlet/hubs/selects.py +++ b/eventlet/hubs/selects.py @@ -1,7 +1,7 @@ import sys import errno from eventlet import patcher -from eventlet.common import get_errno, clear_sys_exc_info +from eventlet.support import get_errno, clear_sys_exc_info select = patcher.original('select') time = patcher.original('time') diff --git a/eventlet/saranwrap.py b/eventlet/saranwrap.py index 3587935..5455e50 100644 --- a/eventlet/saranwrap.py +++ b/eventlet/saranwrap.py @@ -117,7 +117,7 @@ def _read_response(id, attribute, input, cp): """local helper method to read respones from the rpc server.""" try: str = _read_lp_hunk(input) - _prnt(`str`) + _prnt(repr(str)) response = Pickle.loads(str) except (AttributeError, DeadProcess, Pickle.UnpicklingError), e: raise UnrecoverableError(e) @@ -577,7 +577,7 @@ class Server(object): _log("responding with: %s" % body) #_log("objects: %s" % self._objects) s = Pickle.dumps(body) - _log(`s`) + _log(repr(s)) _write_lp_hunk(self._out, s) def write_exception(self, e): diff --git a/eventlet/support/__init__.py b/eventlet/support/__init__.py index e69de29..55a5288 100644 --- a/eventlet/support/__init__.py +++ b/eventlet/support/__init__.py @@ -0,0 +1,36 @@ +import sys +def get_errno(exc): + """ Get the error code out of socket.error objects. + socket.error in <2.5 does not have errno attribute + socket.error in 3.x does not allow indexing access + e.args[0] works for all. + There are cases when args[0] is not errno. + i.e. http://bugs.python.org/issue6471 + Maybe there are cases when errno is set, but it is not the first argument? + """ + + try: + if exc.errno is not None: return exc.errno + except AttributeError: + pass + try: + return exc.args[0] + except IndexError: + return None + +if sys.version_info[0]<3: + from sys import exc_clear as clear_sys_exc_info +else: + def clear_sys_exc_info(): + """No-op In py3k. + Exception information is not visible outside of except statements. + sys.exc_clear became obsolete and removed.""" + pass + +if sys.version_info[0]==2 and sys.version_info[1]<5: + class BaseException: # pylint: disable-msg=W0622 + # not subclassing from object() intentionally, because in + # that case "raise Timeout" fails with TypeError. + pass +else: + from __builtin__ import BaseException diff --git a/eventlet/timeout.py b/eventlet/timeout.py index 64f72e2..e50c868 100644 --- a/eventlet/timeout.py +++ b/eventlet/timeout.py @@ -20,8 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE.from eventlet.support import greenlets as greenlet -from eventlet.common import BaseException -from eventlet.support import greenlets as greenlet +from eventlet.support import greenlets as greenlet, BaseException from eventlet.hubs import get_hub __all__ = ['Timeout', diff --git a/eventlet/tpool.py b/eventlet/tpool.py index 0b95e45..b9b2e11 100644 --- a/eventlet/tpool.py +++ b/eventlet/tpool.py @@ -169,7 +169,7 @@ class Proxy(object): def __getattr__(self,attr_name): f = getattr(self._obj,attr_name) - if not callable(f): + if not hasattr(f, '__call__'): if (isinstance(f, self._autowrap) or attr_name in self._autowrap_names): return Proxy(f, self._autowrap) @@ -199,6 +199,8 @@ class Proxy(object): # wrapped object in such a way that they would block def __eq__(self, rhs): return self._obj.__eq__(rhs) + def __hash__(self): + return self._obj.__hash__() def __repr__(self): return self._obj.__repr__() def __str__(self): diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index 1638bed..c3d2430 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -10,7 +10,7 @@ from eventlet.green import socket from eventlet.green import BaseHTTPServer from eventlet import greenpool from eventlet import greenio -from eventlet.common import get_errno +from eventlet.support import get_errno DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024 DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1' diff --git a/tests/convenience_test.py b/tests/convenience_test.py index a3be65f..64aba0a 100644 --- a/tests/convenience_test.py +++ b/tests/convenience_test.py @@ -30,7 +30,7 @@ class TestServe(LimitedTestCase): # tests that the server closes the client sock on handle() exception def crasher(sock,addr): sock.recv(1024) - 0/0 + 0//0 l = eventlet.listen(('localhost', 0)) gt = eventlet.spawn(eventlet.serve, l, crasher) @@ -44,7 +44,7 @@ class TestServe(LimitedTestCase): def crasher(sock,addr): sock.recv(1024) sock.close() - 0/0 + 0//0 l = eventlet.listen(('localhost', 0)) gt = eventlet.spawn(eventlet.serve, l, crasher) diff --git a/tests/greenio_test.py b/tests/greenio_test.py index 8a654a7..663eaba 100644 --- a/tests/greenio_test.py +++ b/tests/greenio_test.py @@ -3,7 +3,7 @@ from tests import LimitedTestCase, skip_with_pyevent, main, skipped, s2b from eventlet import event from eventlet import greenio from eventlet import debug -from eventlet.common import get_errno +from eventlet.support import get_errno from eventlet.green import socket from eventlet.green import time from eventlet.green.socket import GreenSSLObject diff --git a/tests/hub_test.py b/tests/hub_test.py index 7629be6..ccfc5c4 100644 --- a/tests/hub_test.py +++ b/tests/hub_test.py @@ -51,7 +51,7 @@ class TestExceptionInMainloop(LimitedTestCase): assert delay >= DELAY*0.9, 'sleep returned after %s seconds (was scheduled for %s)' % (delay, DELAY) def fail(): - 1/0 + 1//0 hubs.get_hub().schedule_call_global(0, fail) diff --git a/tests/parse_results.py b/tests/parse_results.py index 62feac5..44bd786 100644 --- a/tests/parse_results.py +++ b/tests/parse_results.py @@ -46,7 +46,7 @@ def parse_unittest_output(s): fail = int(fail or '0') error = int(error or '0') else: - assert ok_match, `s` + assert ok_match, repr(s) timeout_match = re.search('^===disabled because of timeout: (\d+)$', s, re.M) if timeout_match: timeout = int(timeout_match.group(1)) diff --git a/tests/saranwrap_test.py b/tests/saranwrap_test.py index b96a08b..ba71c20 100644 --- a/tests/saranwrap_test.py +++ b/tests/saranwrap_test.py @@ -82,7 +82,6 @@ class TestSaranwrap(LimitedTestCase): self.assertEqual(1, prox['a']) self.assertEqual(str(my_object), str(prox)) self.assertEqual('saran:' + repr(my_object), repr(prox)) - self.assertEqual('saran:' + `my_object`, `prox`) @skip_on_windows @skip_with_pyevent diff --git a/tests/test__greenness.py b/tests/test__greenness.py index 65ef8b4..27f507d 100644 --- a/tests/test__greenness.py +++ b/tests/test__greenness.py @@ -40,7 +40,7 @@ class TestGreenness(unittest.TestCase): urllib2.urlopen('http://127.0.0.1:%s' % self.port) assert False, 'should not get there' except urllib2.HTTPError, ex: - assert ex.code == 501, `ex` + assert ex.code == 501, repr(ex) self.assertEqual(self.server.request_count, 1) if __name__ == '__main__': diff --git a/tests/test__refcount.py b/tests/test__refcount.py index 553971a..3418265 100644 --- a/tests/test__refcount.py +++ b/tests/test__refcount.py @@ -4,7 +4,7 @@ are not leaked by the hub. import sys import unittest from pprint import pformat -from eventlet.common import clear_sys_exc_info +from eventlet.support import clear_sys_exc_info from eventlet.green import socket from eventlet.green.thread import start_new_thread from eventlet.green.time import sleep @@ -31,7 +31,7 @@ def handle_request(s, raise_on_timeout): return #print 'handle_request - accepted' res = conn.recv(100) - assert res == 'hello', `res` + assert res == 'hello', repr(res) #print 'handle_request - recvd %r' % res res = conn.send('bye') #print 'handle_request - sent %r' % res @@ -46,7 +46,7 @@ def make_request(port): res = s.send('hello') #print 'make_request - sent %s' % res res = s.recv(100) - assert res == 'bye', `res` + assert res == 'bye', repr(res) #print 'make_request - recvd %r' % res #s.close() diff --git a/tests/test__twistedutil.py b/tests/test__twistedutil.py index e7c56fc..afa9ee5 100644 --- a/tests/test__twistedutil.py +++ b/tests/test__twistedutil.py @@ -29,7 +29,7 @@ class Test(unittest.TestCase): def test_block_on_already_succeed(self): d = defer.succeed('hey corotwine') res = block_on(d) - assert res == 'hey corotwine', `res` + assert res == 'hey corotwine', repr(res) @requires_twisted def test_block_on_already_failed(self): diff --git a/tests/test__twistedutil_protocol.py b/tests/test__twistedutil_protocol.py index f533d89..53381f4 100644 --- a/tests/test__twistedutil_protocol.py +++ b/tests/test__twistedutil_protocol.py @@ -160,7 +160,7 @@ class TestGreenTransport_bufsize1(TestGreenTransport): # self.conn.write('hello\r\n') # sleep(DELAY*1.5) # make sure the rest of data arrives # try: -# 1/0 +# 1//0 # except: # #self.conn.loseConnection(failure.Failure()) # does not work, why? # spawn(self.conn._queue.send_exception, *sys.exc_info()) @@ -176,7 +176,7 @@ class TestGreenTransport_bufsize1(TestGreenTransport): # self.assertEqual('you said hello. ', self.conn.recv()) # sleep(DELAY*1.5) # make sure the rest of data arrives # try: -# 1/0 +# 1//0 # except: # #self.conn.loseConnection(failure.Failure()) # does not work, why? # spawn(self.conn._queue.send_exception, *sys.exc_info()) diff --git a/tests/timeout_test_with_statement.py b/tests/timeout_test_with_statement.py index 7ce29b7..48fe0b5 100644 --- a/tests/timeout_test_with_statement.py +++ b/tests/timeout_test_with_statement.py @@ -51,7 +51,7 @@ class Test(LimitedTestCase): pass try: - 1/0 + 1//0 except: try: with Timeout(DELAY, sys.exc_info()[0]): diff --git a/tests/tpool_test.py b/tests/tpool_test.py index bd61e79..bb954a7 100644 --- a/tests/tpool_test.py +++ b/tests/tpool_test.py @@ -74,7 +74,6 @@ class TestTpool(LimitedTestCase): self.assertEqual(1, prox['a']) self.assertEqual(str(my_object), str(prox)) self.assertEqual(repr(my_object), repr(prox)) - self.assertEqual(`my_object`, `prox`) @skip_with_pyevent def test_wrap_module_class(self): @@ -93,6 +92,17 @@ class TestTpool(LimitedTestCase): exp3 = prox.compile('/') self.assert_(exp1 != exp3) + @skip_with_pyevent + def test_wrap_hash(self): + prox1 = tpool.Proxy(''+'A') + prox2 = tpool.Proxy('A'+'') + self.assert_(prox1=='A') + self.assert_('A'==prox2) + #self.assert_(prox1==prox2) FIXME - could __eq__ unwrap rhs if it is other proxy? + self.assertEqual(hash(prox1), hash(prox2)) + proxList = tpool.Proxy([]) + self.assertRaises(TypeError, hash, proxList) + @skip_with_pyevent def test_wrap_nonzero(self): prox = tpool.Proxy(re) diff --git a/tests/wsgi_test.py b/tests/wsgi_test.py index aff6b25..6bd9362 100644 --- a/tests/wsgi_test.py +++ b/tests/wsgi_test.py @@ -14,7 +14,7 @@ from eventlet import greenio from eventlet.green import socket as greensocket from eventlet import wsgi from eventlet import processes -from eventlet.common import get_errno +from eventlet.support import get_errno from tests import find_command @@ -137,9 +137,9 @@ class TestHttpd(LimitedTestCase): self.spawn_server() def tearDown(self): - super(TestHttpd, self).tearDown() greenthread.kill(self.killer) eventlet.sleep(0) + super(TestHttpd, self).tearDown() def spawn_server(self, **kwargs): """Spawns a new wsgi server with the given arguments. @@ -147,8 +147,10 @@ class TestHttpd(LimitedTestCase): running it. Kills any previously-running server.""" + eventlet.sleep(0) # give previous server a chance to start if self.killer: greenthread.kill(self.killer) + eventlet.sleep(0) # give killer a chance to kill new_kwargs = dict(max_size=128, log=self.logfile, @@ -252,6 +254,7 @@ class TestHttpd(LimitedTestCase): a = cgi.parse_qs(body).get('a', [1])[0] start_response('200 OK', [('Content-type', 'text/plain')]) return ['a is %s, body is %s' % (a, body)] + self.site.application = new_app sock = eventlet.connect( ('localhost', self.port)) @@ -559,7 +562,7 @@ class TestHttpd(LimitedTestCase): # shut down the server and verify the server_socket fd is still open, # but the actual socketobject passed in to wsgi.server is closed greenthread.kill(self.killer) - api.sleep(0.001) # make the kill go through + eventlet.sleep(0) # make the kill go through try: server_sock_2.accept() # shouldn't be able to use this one anymore @@ -676,7 +679,7 @@ class TestHttpd(LimitedTestCase): old_stderr = sys.stderr try: sys.stderr = self.logfile - api.sleep(0) # need to enter server loop + eventlet.sleep(0) # need to enter server loop try: eventlet.connect(('localhost', self.port)) self.fail("Didn't expect to connect") @@ -758,7 +761,7 @@ class TestHttpd(LimitedTestCase): client.sendall(data) else: # close sock prematurely client.close() - api.sleep(0) # let context switch back to server + eventlet.sleep(0) # let context switch back to server self.assert_(not errored[0], errored[0]) # make another request to ensure the server's still alive try: