python3 compatibility

- dict.items().pop() in proc
- str/bytes in backdoor, api_test, ssl_test, test__refcount
- import httplib from six
- PEP-8 fixes
This commit is contained in:
Sergey Shepelev
2014-04-23 16:52:43 +04:00
parent 2da62a16c3
commit 49773bb12b
11 changed files with 131 additions and 109 deletions

View File

@@ -1,13 +1,13 @@
from __future__ import print_function
from code import InteractiveConsole
import errno
import socket
import sys
import errno
from code import InteractiveConsole
import eventlet
from eventlet import hubs
from eventlet.support import greenlets, get_errno
from eventlet.support import greenlets, get_errno, six
try:
sys.ps1
@@ -29,12 +29,14 @@ class FileProxy(object):
def flush(self):
pass
def write(self, *a, **kw):
self.f.write(*a, **kw)
def write(self, data, *a, **kw):
data = six.b(data)
self.f.write(data, *a, **kw)
self.f.flush()
def readline(self, *a):
return self.f.readline(*a).replace('\r\n', '\n')
line = self.f.readline(*a).replace(b'\r\n', b'\n')
return six.u(line)
def __getattr__(self, attr):
return getattr(self.f, attr)

View File

@@ -1,5 +1,6 @@
from eventlet import patcher
from eventlet.green import socket
from eventlet.support import six
to_patch = [('socket', socket)]
@@ -9,9 +10,10 @@ try:
except ImportError:
pass
patcher.inject('httplib',
globals(),
*to_patch)
if six.PY2:
patcher.inject('httplib', globals(), *to_patch)
if six.PY3:
patcher.inject('http.client', globals(), *to_patch)
if __name__ == '__main__':
test()

View File

@@ -1,16 +1,16 @@
from eventlet.support import get_errno, six
from eventlet.hubs import trampoline
BUFFER_SIZE = 4096
import array
import errno
import os
import socket
from socket import socket as _original_socket
import socket
import sys
import time
import warnings
from eventlet.support import get_errno, six
from eventlet.hubs import trampoline
BUFFER_SIZE = 4096
__all__ = ['GreenSocket', 'GreenPipe', 'shutdown_safe']
CONNECT_ERR = set((errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK))
@@ -256,7 +256,8 @@ class GreenSocket(object):
return ''
else:
raise
trampoline(fd,
trampoline(
fd,
read=True,
timeout=self.gettimeout(),
timeout_exc=socket.timeout("timed out"))
@@ -287,7 +288,6 @@ class GreenSocket(object):
# blocking socket behavior - sends all, blocks if the buffer is full
total_sent = 0
len_data = len(data)
while 1:
try:
total_sent += fd.send(data[total_sent:], flags)
@@ -467,7 +467,8 @@ class GreenPipe(_fileobject):
def close(self):
super(GreenPipe, self).close()
for method in ['fileno', 'flush', 'isatty', 'next', 'read', 'readinto',
for method in [
'fileno', 'flush', 'isatty', 'next', 'read', 'readinto',
'readline', 'readlines', 'seek', 'tell', 'truncate',
'write', 'xreadlines', '__iter__', 'writelines']:
setattr(self, method, _operationOnClosedFile)

View File

@@ -4,10 +4,12 @@ from eventlet import coros, proc, api
from eventlet.semaphore import Semaphore
import warnings
warnings.warn("The pool module is deprecated. Please use the "
warnings.warn(
"The pool module is deprecated. Please use the "
"eventlet.GreenPool and eventlet.GreenPile classes instead.",
DeprecationWarning, stacklevel=2)
class Pool(object):
def __init__(self, min_size=0, max_size=4, track_events=False):
if min_size > max_size:
@@ -315,5 +317,3 @@ class Pool(object):
while finished < index + 1:
yield q.wait()
finished += 1

View File

@@ -1,9 +1,3 @@
import warnings
warnings.warn("The proc module is deprecated! Please use the greenthread "
"module, or any of the many other Eventlet cross-coroutine "
"primitives, instead.",
DeprecationWarning, stacklevel=2)
"""
This module provides means to spawn, kill and link coroutines. Linking means
subscribing to the coroutine's result, either in form of return value or
@@ -63,7 +57,16 @@ coroutines and wait for all them to complete. Such a function is provided by
this module.
"""
import sys
from eventlet import api, coros, hubs
from eventlet.support import six
import warnings
warnings.warn(
"The proc module is deprecated! Please use the greenthread "
"module, or any of the many other Eventlet cross-coroutine "
"primitives, instead.",
DeprecationWarning, stacklevel=2)
__all__ = ['LinkedExited',
'LinkedFailed',
@@ -91,11 +94,13 @@ class LinkedExited(Exception):
msg = self.msg % self.name
Exception.__init__(self, msg)
class LinkedCompleted(LinkedExited):
"""Raised when a linked proc finishes the execution cleanly"""
msg = "%r completed successfully"
class LinkedFailed(LinkedExited):
"""Raised when a linked proc dies because of unhandled exception"""
msg = "%r failed with %s"
@@ -104,12 +109,14 @@ class LinkedFailed(LinkedExited):
msg = self.msg % (name, typ.__name__)
LinkedExited.__init__(self, name, msg)
class LinkedKilled(LinkedFailed):
"""Raised when a linked proc dies because of unhandled GreenletExit
(i.e. it was killed)
"""
msg = """%r was killed with %s"""
def getLinkedFailed(name, typ, value=None, tb=None):
if issubclass(typ, api.GreenletExit):
return LinkedKilled(name, typ, value, tb)
@@ -137,6 +144,7 @@ class Link(object):
def __exit__(self, *args):
self.cancel()
class LinkToEvent(Link):
def __call__(self, source):
@@ -147,6 +155,7 @@ class LinkToEvent(Link):
else:
self.listener.send_exception(*source.exc_info())
class LinkToGreenlet(Link):
def __call__(self, source):
@@ -155,6 +164,7 @@ class LinkToGreenlet(Link):
else:
self.listener.throw(getLinkedFailed(source.name, *source.exc_info()))
class LinkToCallable(Link):
def __call__(self, source):
@@ -401,7 +411,8 @@ class Source(object):
self._start_send()
def _start_send(self):
hubs.get_hub().schedule_call_global(0, self._do_send, self._value_links.items(), self._value_links)
links_items = list(six.iteritems(self._value_links))
hubs.get_hub().schedule_call_global(0, self._do_send, links_items, self._value_links)
def send_exception(self, *throw_args):
assert not self.ready(), "%s has been fired already" % self
@@ -410,7 +421,8 @@ class Source(object):
self._start_send_exception()
def _start_send_exception(self):
hubs.get_hub().schedule_call_global(0, self._do_send, self._exception_links.items(), self._exception_links)
links_items = list(six.iteritems(self._exception_links))
hubs.get_hub().schedule_call_global(0, self._do_send, links_items, self._exception_links)
def _do_send(self, links, consult):
while links:
@@ -603,23 +615,25 @@ class Proc(Source):
spawn = Proc.spawn
def spawn_link(function, *args, **kwargs):
p = spawn(function, *args, **kwargs)
p.link()
return p
def spawn_link_value(function, *args, **kwargs):
p = spawn(function, *args, **kwargs)
p.link_value()
return p
def spawn_link_exception(function, *args, **kwargs):
p = spawn(function, *args, **kwargs)
p.link_exception()
return p
class wrap_errors(object):
"""Helper to make function return an exception, rather than raise it.

View File

@@ -1,5 +1,4 @@
import os
import os.path
import socket
from unittest import TestCase, main
import warnings
@@ -45,7 +44,7 @@ class TestApi(TestCase):
conn, addr = listenfd.accept()
fd = conn.makefile(mode='w')
conn.close()
fd.write('hello\n')
fd.write(b'hello\n')
fd.close()
finally:
listenfd.close()
@@ -56,7 +55,7 @@ class TestApi(TestCase):
client = eventlet.connect(('127.0.0.1', server.getsockname()[1]))
fd = client.makefile()
client.close()
assert fd.readline() == 'hello\n'
assert fd.readline() == b'hello\n'
assert fd.read() == ''
fd.close()
@@ -68,7 +67,7 @@ class TestApi(TestCase):
def accept_once(listenfd):
try:
conn, addr = listenfd.accept()
conn.write('hello\r\n')
conn.write(b'hello\r\n')
greenio.shutdown_safe(conn)
conn.close()
finally:
@@ -84,7 +83,7 @@ class TestApi(TestCase):
client = util.wrap_ssl(raw_client)
fd = socket._fileobject(client, 'rb', 8192)
assert fd.readline() == 'hello\r\n'
assert fd.readline() == b'hello\r\n'
try:
self.assertEquals('', fd.read(10))
except greenio.SSL.ZeroReturnError:
@@ -96,9 +95,9 @@ class TestApi(TestCase):
check_hub()
def test_001_trampoline_timeout(self):
from eventlet import coros
server_sock = eventlet.listen(('127.0.0.1', 0))
bound_port = server_sock.getsockname()[1]
def server(sock):
client, addr = sock.accept()
api.sleep(0.1)
@@ -120,6 +119,7 @@ class TestApi(TestCase):
bound_port = server.getsockname()[1]
done = [False]
def client_closer(sock):
while True:
(conn, addr) = sock.accept()
@@ -155,10 +155,10 @@ class TestApi(TestCase):
self.assertRaises(
ImportError, api.named, 'this_name_should_hopefully_not_exist.Foo')
def test_killing_dormant(self):
DELAY = 0.1
state = []
def test():
try:
state.append('start')
@@ -192,4 +192,3 @@ class Foo(object):
if __name__ == '__main__':
main()

View File

@@ -14,15 +14,15 @@ class BackdoorTest(LimitedTestCase):
client = socket.socket()
client.connect(('localhost', listener.getsockname()[1]))
f = client.makefile('rw')
self.assert_('Python' in f.readline())
self.assert_(b'Python' in f.readline())
f.readline() # build info
f.readline() # help info
self.assert_('InteractiveConsole' in f.readline())
self.assertEquals('>>> ', f.read(4))
f.write('print("hi")\n')
self.assert_(b'InteractiveConsole' in f.readline())
self.assertEquals(b'>>> ', f.read(4))
f.write(b'print("hi")\n')
f.flush()
self.assertEquals('hi\n', f.readline())
self.assertEquals('>>> ', f.read(4))
self.assertEquals(b'hi\n', f.readline())
self.assertEquals(b'>>> ', f.read(4))
f.close()
client.close()
serv.kill()

View File

@@ -37,25 +37,25 @@ class SSLTest(LimitedTestCase):
def test_duplex_response(self):
def serve(listener):
sock, addr = listener.accept()
stuff = sock.read(8192)
sock.write('response')
sock.read(8192)
sock.write(b'response')
sock = listen_ssl_socket()
server_coro = eventlet.spawn(serve, sock)
client = util.wrap_ssl(eventlet.connect(('127.0.0.1', sock.getsockname()[1])))
client.write('line 1\r\nline 2\r\n\r\n')
self.assertEquals(client.read(8192), 'response')
client.write(b'line 1\r\nline 2\r\n\r\n')
self.assertEquals(client.read(8192), b'response')
server_coro.wait()
@skip_if_no_ssl
def test_ssl_close(self):
def serve(listener):
sock, addr = listener.accept()
stuff = sock.read(8192)
sock.read(8192)
try:
self.assertEquals("", sock.read(8192))
self.assertEquals(b"", sock.read(8192))
except greenio.SSL.ZeroReturnError:
pass
@@ -65,7 +65,7 @@ class SSLTest(LimitedTestCase):
raw_client = eventlet.connect(('127.0.0.1', sock.getsockname()[1]))
client = util.wrap_ssl(raw_client)
client.write('X')
client.write(b'X')
greenio.shutdown_safe(client)
client.close()
server_coro.wait()
@@ -74,14 +74,14 @@ class SSLTest(LimitedTestCase):
def test_ssl_connect(self):
def serve(listener):
sock, addr = listener.accept()
stuff = sock.read(8192)
sock.read(8192)
sock = listen_ssl_socket()
server_coro = eventlet.spawn(serve, sock)
raw_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_client = util.wrap_ssl(raw_client)
ssl_client.connect(('127.0.0.1', sock.getsockname()[1]))
ssl_client.write('abc')
ssl_client.write(b'abc')
greenio.shutdown_safe(ssl_client)
ssl_client.close()
server_coro.wait()
@@ -90,24 +90,24 @@ class SSLTest(LimitedTestCase):
def test_ssl_unwrap(self):
def serve():
sock, addr = listener.accept()
self.assertEquals(sock.recv(6), 'before')
self.assertEquals(sock.recv(6), b'before')
sock_ssl = util.wrap_ssl(sock, certificate_file, private_key_file,
server_side=True)
sock_ssl.do_handshake()
self.assertEquals(sock_ssl.read(6), 'during')
self.assertEquals(sock_ssl.read(6), b'during')
sock2 = sock_ssl.unwrap()
self.assertEquals(sock2.recv(5), 'after')
self.assertEquals(sock2.recv(5), b'after')
sock2.close()
listener = eventlet.listen(('127.0.0.1', 0))
server_coro = eventlet.spawn(serve)
client = eventlet.connect((listener.getsockname()))
client.send('before')
client.send(b'before')
client_ssl = util.wrap_ssl(client)
client_ssl.do_handshake()
client_ssl.write('during')
client_ssl.write(b'during')
client2 = client_ssl.unwrap()
client2.send('after')
client2.send(b'after')
server_coro.wait()
@skip_if_no_ssl
@@ -131,11 +131,11 @@ class SSLTest(LimitedTestCase):
def serve(listener):
conn, _ = listener.accept()
conn.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, BUFFER_SIZE)
self.assertEqual(conn.read(8), 'request')
conn.write('response')
self.assertEqual(conn.read(8), b'request')
conn.write(b'response')
stage_1.wait()
conn.sendall('x' * SENDALL_SIZE)
conn.sendall(b'x' * SENDALL_SIZE)
server_sock = listen_ssl_socket()
server_coro = eventlet.spawn(serve, server_sock)
@@ -143,8 +143,8 @@ class SSLTest(LimitedTestCase):
client_sock = eventlet.connect(server_sock.getsockname())
client_sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFFER_SIZE)
client = util.wrap_ssl(client_sock)
client.write('request')
self.assertEqual(client.read(8), 'response')
client.write(b'request')
self.assertEqual(client.read(8), b'response')
stage_1.send()
check_idle_cpu_usage(0.2, 0.1)
@@ -154,14 +154,14 @@ class SSLTest(LimitedTestCase):
def test_greensslobject(self):
def serve(listener):
sock, addr = listener.accept()
sock.write('content')
sock.write(b'content')
greenio.shutdown_safe(sock)
sock.close()
listener = listen_ssl_socket(('', 0))
killer = eventlet.spawn(serve, listener)
eventlet.spawn(serve, listener)
client = ssl(eventlet.connect(('localhost', listener.getsockname()[1])))
self.assertEquals(client.read(1024), 'content')
self.assertEquals(client.read(1024), '')
self.assertEquals(client.read(1024), b'content')
self.assertEquals(client.read(1024), b'')
@skip_if_no_ssl
def test_regression_gh_17(self):
@@ -170,13 +170,13 @@ class SSLTest(LimitedTestCase):
# to simulate condition mentioned in GH-17
sock._sslobj = None
sock.sendall('some data')
sock.sendall(b'some data')
greenio.shutdown_safe(sock)
sock.close()
listener = listen_ssl_socket(('', 0))
killer = eventlet.spawn(serve, listener)
client = ssl(eventlet.connect(('localhost', listener.getsockname()[1])))
eventlet.spawn(serve, listener)
ssl(eventlet.connect(('localhost', listener.getsockname()[1])))
if __name__ == '__main__':
main()

View File

@@ -33,9 +33,9 @@ def handle_request(s, raise_on_timeout):
return
#print('handle_request - accepted')
res = conn.recv(100)
assert res == 'hello', repr(res)
assert res == b'hello', repr(res)
#print('handle_request - recvd %r' % res)
res = conn.send('bye')
res = conn.send(b'bye')
#print('handle_request - sent %r' % res)
#print('handle_request - conn refcount: %s' % sys.getrefcount(conn))
#conn.close()
@@ -46,10 +46,10 @@ def make_request(port):
s = socket.socket()
s.connect(('localhost', port))
#print('make_request - connected')
res = s.send('hello')
res = s.send(b'hello')
#print('make_request - sent %s' % res)
res = s.recv(100)
assert res == 'bye', repr(res)
assert res == b'bye', repr(res)
#print('make_request - recvd %r' % res)
#s.close()
@@ -74,7 +74,7 @@ def run_and_check(run_client):
for x in gc.get_referrers(w()):
print(pformat(x))
for y in gc.get_referrers(x):
print('-', pformat(y))
print('- {0}'.format(pformat(y)))
raise AssertionError('server should be dead by now')
@@ -82,10 +82,11 @@ def test_clean_exit():
run_and_check(True)
run_and_check(True)
def test_timeout_exit():
run_and_check(False)
run_and_check(False)
if __name__=='__main__':
unittest.main()

View File

@@ -38,11 +38,14 @@ commands =
eventlet/green/__init__.py \
eventlet/green/_socket_nodns.py \
eventlet/green/ftplib.py \
eventlet/green/httplib.py \
eventlet/green/OpenSSL/__init__.py \
eventlet/green/subprocess.py \
eventlet/green/time.py \
eventlet/green/urllib.py \
eventlet/hubs/__init__.py \
eventlet/hubs/timer.py \
eventlet/pool.py \
eventlet/semaphore.py \
eventlet/support/__init__.py \
tests/__init__.py \