Skip to content

Commit

Permalink
Cleaned up the interface to provide a custom client manager
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelgrinberg committed Sep 16, 2015
1 parent ad12b83 commit 5bb6c9d
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 35 deletions.
2 changes: 1 addition & 1 deletion examples/latency.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import socketio

# set this to 'threading', 'eventlet', or 'gevent'
async_mode = 'eventlet'
async_mode = 'threading'

sio = socketio.Server(async_mode=async_mode)
app = Flask(__name__)
Expand Down
18 changes: 8 additions & 10 deletions socketio/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,10 @@ class Server(object):
This class implements a fully compliant Socket.IO web server with support
for websocket and long-polling transports.
:param engineio_options: A ``dict`` with options for the Engine.IO server.
The values are passed directly to the
``engineio.Server`` constructor.
:param client_manager_class: The class that will manage the client list.
The default value is appropriate for most
cases.
:param client_manager: The client manager instance that will manage the
client list. By default the client list is stored
in an in-memory structure, which prevents the use
of multiple worker processes.
:param logger: To enable logging set to ``True`` or pass a logger object to
use. To disable logging set to ``False``.
:param binary: ``True`` to support binary payloads, ``False`` to treat all
Expand Down Expand Up @@ -62,11 +60,11 @@ class Server(object):
a logger object to use. To disable logging set to
``False``.
"""
def __init__(self, client_manager_class=None, logger=False, binary=False,
def __init__(self, client_manager=None, logger=False, binary=False,
json=None, **kwargs):
if client_manager_class is None:
client_manager_class = base_manager.BaseManager
self.manager = client_manager_class(self)
if client_manager is None:
client_manager = base_manager.BaseManager(self)
self.manager = client_manager
engineio_options = kwargs
engineio_logger = engineio_options.pop('engineio_logger', None)
if engineio_logger is not None:
Expand Down
48 changes: 24 additions & 24 deletions tests/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ def tearDown(self):

def test_create(self, eio):
mgr = mock.MagicMock()
s = server.Server(mgr, binary=True, foo='bar')
mgr.assert_called_once_with(s)
s = server.Server(client_manager=mgr, binary=True, foo='bar')
eio.assert_called_once_with(**{'foo': 'bar'})
self.assertEqual(s.manager, mgr)
self.assertEqual(s.eio.on.call_count, 3)
self.assertEqual(s.binary, True)

Expand All @@ -44,71 +44,71 @@ def bar():

def test_emit(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.emit('my event', {'foo': 'bar'}, 'room', '123', namespace='/foo',
callback='cb')
s.manager.emit.assert_called_once_with('my event', {'foo': 'bar'},
'/foo', 'room', '123', 'cb')

def test_emit_default_namespace(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.emit('my event', {'foo': 'bar'}, 'room', '123', callback='cb')
s.manager.emit.assert_called_once_with('my event', {'foo': 'bar'}, '/',
'room', '123', 'cb')

def test_send(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.send('foo', 'room', '123', namespace='/foo', callback='cb')
s.manager.emit.assert_called_once_with('message', 'foo', '/foo',
'room', '123', 'cb')

def test_enter_room(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.enter_room('123', 'room', namespace='/foo')
s.manager.enter_room.assert_called_once_with('123', '/foo', 'room')

def test_enter_room_default_namespace(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.enter_room('123', 'room')
s.manager.enter_room.assert_called_once_with('123', '/', 'room')

def test_leave_room(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.leave_room('123', 'room', namespace='/foo')
s.manager.leave_room.assert_called_once_with('123', '/foo', 'room')

def test_leave_room_default_namespace(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.leave_room('123', 'room')
s.manager.leave_room.assert_called_once_with('123', '/', 'room')

def test_close_room(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.close_room('room', namespace='/foo')
s.manager.close_room.assert_called_once_with('/foo', 'room')

def test_close_room_default_namespace(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.close_room('room')
s.manager.close_room.assert_called_once_with('/', 'room')

def test_rooms(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.rooms('123', namespace='/foo')
s.manager.get_rooms.assert_called_once_with('123', '/foo')

def test_rooms_default_namespace(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.rooms('123')
s.manager.get_rooms.assert_called_once_with('123', '/')

Expand Down Expand Up @@ -153,7 +153,7 @@ def test_transport(self, eio):

def test_handle_connect(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
handler = mock.MagicMock()
s.on('connect', handler)
s._handle_eio_connect('123', 'environ')
Expand All @@ -163,7 +163,7 @@ def test_handle_connect(self, eio):

def test_handle_connect_namespace(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
handler = mock.MagicMock()
s.on('connect', handler, namespace='/foo')
s._handle_eio_connect('123', 'environ')
Expand All @@ -175,7 +175,7 @@ def test_handle_connect_namespace(self, eio):

def test_handle_connect_rejected(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
handler = mock.MagicMock(return_value=False)
s.on('connect', handler)
s._handle_eio_connect('123', 'environ')
Expand All @@ -186,7 +186,7 @@ def test_handle_connect_rejected(self, eio):

def test_handle_connect_namespace_rejected(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
handler = mock.MagicMock(return_value=False)
s.on('connect', handler, namespace='/foo')
s._handle_eio_connect('123', 'environ')
Expand All @@ -197,7 +197,7 @@ def test_handle_connect_namespace_rejected(self, eio):

def test_handle_disconnect(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
handler = mock.MagicMock()
s.on('disconnect', handler)
s._handle_eio_connect('123', 'environ')
Expand All @@ -208,7 +208,7 @@ def test_handle_disconnect(self, eio):

def test_handle_disconnect_namespace(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.manager.get_namespaces = mock.MagicMock(return_value=['/', '/foo'])
handler = mock.MagicMock()
s.on('disconnect', handler)
Expand All @@ -223,7 +223,7 @@ def test_handle_disconnect_namespace(self, eio):

def test_handle_disconnect_only_namespace(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s.manager.get_namespaces = mock.MagicMock(return_value=['/', '/foo'])
handler = mock.MagicMock()
s.on('disconnect', handler)
Expand All @@ -238,7 +238,7 @@ def test_handle_disconnect_only_namespace(self, eio):

def test_handle_disconnect_unknown_client(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
s._handle_eio_disconnect('123')

def test_handle_event(self, eio):
Expand Down Expand Up @@ -287,7 +287,7 @@ def test_handle_event_with_ack(self, eio):

def test_handle_event_with_ack_tuple(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
handler = mock.MagicMock(return_value=(1, '2', True))
s.on('my message', handler)
s._handle_eio_message('123', '21000["my message","a","b","c"]')
Expand All @@ -297,7 +297,7 @@ def test_handle_event_with_ack_tuple(self, eio):

def test_handle_event_with_ack_list(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr)
s = server.Server(client_manager=mgr)
handler = mock.MagicMock(return_value=[1, '2', True])
s.on('my message', handler)
s._handle_eio_message('123', '21000["my message","a","b","c"]')
Expand All @@ -307,7 +307,7 @@ def test_handle_event_with_ack_list(self, eio):

def test_handle_event_with_ack_binary(self, eio):
mgr = mock.MagicMock()
s = server.Server(client_manager_class=mgr, binary=True)
s = server.Server(client_manager=mgr, binary=True)
handler = mock.MagicMock(return_value=b'foo')
s.on('my message', handler)
s._handle_eio_message('123', '21000["my message","foo"]')
Expand Down

0 comments on commit 5bb6c9d

Please sign in to comment.