diff -r 110a10e0733a examples/wsclient.py --- a/examples/wsclient.py Mon Jul 29 10:36:33 2013 -0700 +++ b/examples/wsclient.py Fri Aug 02 19:32:13 2013 +0200 @@ -4,13 +4,13 @@ import base64 import hashlib import os +import select import signal import sys import tulip import tulip.http from tulip.http import websocket -import tulip.selectors WS_KEY = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11" @@ -89,7 +89,7 @@ url = 'http://{}:{}'.format(args.host, args.port) - loop = tulip.SelectorEventLoop(tulip.selectors.SelectSelector()) + loop = tulip.SelectorEventLoop(select.SelectSelector()) tulip.set_event_loop(loop) loop.add_signal_handler(signal.SIGINT, loop.stop) diff -r 110a10e0733a tests/events_test.py --- a/tests/events_test.py Mon Jul 29 10:36:33 2013 -0700 +++ b/tests/events_test.py Fri Aug 02 19:32:13 2013 +0200 @@ -4,6 +4,7 @@ import io import os import re +import select import signal import socket try: @@ -900,33 +901,32 @@ raise unittest.SkipTest( "IocpEventLoop does not have create_datagram_endpoint()") else: - from tulip import selectors from tulip import unix_events - if hasattr(selectors, 'KqueueSelector'): + if hasattr(select, 'KqueueSelector'): class KqueueEventLoopTests(EventLoopTestsMixin, unittest.TestCase): def create_event_loop(self): return unix_events.SelectorEventLoop( - selectors.KqueueSelector()) + select.KqueueSelector()) - if hasattr(selectors, 'EpollSelector'): + if hasattr(select, 'EpollSelector'): class EPollEventLoopTests(EventLoopTestsMixin, unittest.TestCase): def create_event_loop(self): - return unix_events.SelectorEventLoop(selectors.EpollSelector()) + return unix_events.SelectorEventLoop(select.EpollSelector()) - if hasattr(selectors, 'PollSelector'): + if hasattr(select, 'PollSelector'): class PollEventLoopTests(EventLoopTestsMixin, unittest.TestCase): def create_event_loop(self): - return unix_events.SelectorEventLoop(selectors.PollSelector()) + return unix_events.SelectorEventLoop(select.PollSelector()) # Should always exist. class SelectEventLoopTests(EventLoopTestsMixin, unittest.TestCase): def create_event_loop(self): - return unix_events.SelectorEventLoop(selectors.SelectSelector()) + return unix_events.SelectorEventLoop(select.SelectSelector()) class HandleTests(unittest.TestCase): diff -r 110a10e0733a tests/selector_events_test.py --- a/tests/selector_events_test.py Mon Jul 29 10:36:33 2013 -0700 +++ b/tests/selector_events_test.py Fri Aug 02 19:32:13 2013 +0200 @@ -1,6 +1,7 @@ """Tests for selector_events.py""" import errno +import select import socket import unittest import unittest.mock @@ -10,7 +11,6 @@ ssl = None from tulip import futures -from tulip import selectors from tulip.events import AbstractEventLoop from tulip.protocols import DatagramProtocol, Protocol from tulip.selector_events import BaseSelectorEventLoop @@ -399,7 +399,7 @@ self.assertTrue(self.loop._selector.register.called) fd, mask, (r, w) = self.loop._selector.register.call_args[0] self.assertEqual(1, fd) - self.assertEqual(selectors.EVENT_READ, mask) + self.assertEqual(select.EVENT_READ, mask) self.assertEqual(cb, r._callback) self.assertEqual(None, w) @@ -407,7 +407,7 @@ reader = unittest.mock.Mock() writer = unittest.mock.Mock() self.loop._selector.get_info.return_value = ( - selectors.EVENT_WRITE, (reader, writer)) + select.EVENT_WRITE, (reader, writer)) cb = lambda: True self.loop.add_reader(1, cb) @@ -416,14 +416,14 @@ self.assertTrue(self.loop._selector.modify.called) fd, mask, (r, w) = self.loop._selector.modify.call_args[0] self.assertEqual(1, fd) - self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask) + self.assertEqual(select.EVENT_WRITE | select.EVENT_READ, mask) self.assertEqual(cb, r._callback) self.assertEqual(writer, w) def test_add_reader_existing_writer(self): writer = unittest.mock.Mock() self.loop._selector.get_info.return_value = ( - selectors.EVENT_WRITE, (None, writer)) + select.EVENT_WRITE, (None, writer)) cb = lambda: True self.loop.add_reader(1, cb) @@ -431,13 +431,13 @@ self.assertTrue(self.loop._selector.modify.called) fd, mask, (r, w) = self.loop._selector.modify.call_args[0] self.assertEqual(1, fd) - self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask) + self.assertEqual(select.EVENT_WRITE | select.EVENT_READ, mask) self.assertEqual(cb, r._callback) self.assertEqual(writer, w) def test_remove_reader(self): self.loop._selector.get_info.return_value = ( - selectors.EVENT_READ, (None, None)) + select.EVENT_READ, (None, None)) self.assertFalse(self.loop.remove_reader(1)) self.assertTrue(self.loop._selector.unregister.called) @@ -446,13 +446,13 @@ reader = unittest.mock.Mock() writer = unittest.mock.Mock() self.loop._selector.get_info.return_value = ( - selectors.EVENT_READ | selectors.EVENT_WRITE, (reader, writer)) + select.EVENT_READ | select.EVENT_WRITE, (reader, writer)) self.assertTrue( self.loop.remove_reader(1)) self.assertFalse(self.loop._selector.unregister.called) self.assertEqual( - (1, selectors.EVENT_WRITE, (None, writer)), + (1, select.EVENT_WRITE, (None, writer)), self.loop._selector.modify.call_args[0]) def test_remove_reader_unknown(self): @@ -468,7 +468,7 @@ self.assertTrue(self.loop._selector.register.called) fd, mask, (r, w) = self.loop._selector.register.call_args[0] self.assertEqual(1, fd) - self.assertEqual(selectors.EVENT_WRITE, mask) + self.assertEqual(select.EVENT_WRITE, mask) self.assertEqual(None, r) self.assertEqual(cb, w._callback) @@ -476,7 +476,7 @@ reader = unittest.mock.Mock() writer = unittest.mock.Mock() self.loop._selector.get_info.return_value = ( - selectors.EVENT_READ, (reader, writer)) + select.EVENT_READ, (reader, writer)) cb = lambda: True self.loop.add_writer(1, cb) @@ -485,13 +485,13 @@ self.assertTrue(self.loop._selector.modify.called) fd, mask, (r, w) = self.loop._selector.modify.call_args[0] self.assertEqual(1, fd) - self.assertEqual(selectors.EVENT_WRITE | selectors.EVENT_READ, mask) + self.assertEqual(select.EVENT_WRITE | select.EVENT_READ, mask) self.assertEqual(reader, r) self.assertEqual(cb, w._callback) def test_remove_writer(self): self.loop._selector.get_info.return_value = ( - selectors.EVENT_WRITE, (None, None)) + select.EVENT_WRITE, (None, None)) self.assertFalse(self.loop.remove_writer(1)) self.assertTrue(self.loop._selector.unregister.called) @@ -500,13 +500,13 @@ reader = unittest.mock.Mock() writer = unittest.mock.Mock() self.loop._selector.get_info.return_value = ( - selectors.EVENT_READ | selectors.EVENT_WRITE, (reader, writer)) + select.EVENT_READ | select.EVENT_WRITE, (reader, writer)) self.assertTrue( self.loop.remove_writer(1)) self.assertFalse(self.loop._selector.unregister.called) self.assertEqual( - (1, selectors.EVENT_READ, (reader, None)), + (1, select.EVENT_READ, (reader, None)), self.loop._selector.modify.call_args[0]) def test_remove_writer_unknown(self): @@ -520,7 +520,7 @@ self.loop._add_callback = unittest.mock.Mock() self.loop._process_events( - ((1, selectors.EVENT_READ, (reader, None)),)) + ((1, select.EVENT_READ, (reader, None)),)) self.assertTrue(self.loop._add_callback.called) self.loop._add_callback.assert_called_with(reader) @@ -530,7 +530,7 @@ self.loop.remove_reader = unittest.mock.Mock() self.loop._process_events( - ((1, selectors.EVENT_READ, (reader, None)),)) + ((1, select.EVENT_READ, (reader, None)),)) self.loop.remove_reader.assert_called_with(1) def test_process_events_write(self): @@ -539,7 +539,7 @@ self.loop._add_callback = unittest.mock.Mock() self.loop._process_events( - ((1, selectors.EVENT_WRITE, (None, writer)),)) + ((1, select.EVENT_WRITE, (None, writer)),)) self.loop._add_callback.assert_called_with(writer) def test_process_events_write_cancelled(self): @@ -548,7 +548,7 @@ self.loop.remove_writer = unittest.mock.Mock() self.loop._process_events( - ((1, selectors.EVENT_WRITE, (None, writer)),)) + ((1, select.EVENT_WRITE, (None, writer)),)) self.loop.remove_writer.assert_called_with(1) diff -r 110a10e0733a tests/selectors_test.py --- a/tests/selectors_test.py Mon Jul 29 10:36:33 2013 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -"""Tests for selectors.py.""" - -import unittest -import unittest.mock - -from tulip import selectors - - -class BaseSelectorTests(unittest.TestCase): - - def test_fileobj_to_fd(self): - self.assertEqual(10, selectors._fileobj_to_fd(10)) - - f = unittest.mock.Mock() - f.fileno.return_value = 10 - self.assertEqual(10, selectors._fileobj_to_fd(f)) - - f.fileno.side_effect = TypeError - self.assertRaises(ValueError, selectors._fileobj_to_fd, f) - - def test_selector_key_repr(self): - key = selectors.SelectorKey(10, selectors.EVENT_READ) - self.assertEqual( - "SelectorKey", repr(key)) - - def test_register(self): - fobj = unittest.mock.Mock() - fobj.fileno.return_value = 10 - - s = selectors._BaseSelector() - key = s.register(fobj, selectors.EVENT_READ) - self.assertIsInstance(key, selectors.SelectorKey) - self.assertEqual(key.fd, 10) - self.assertIs(key, s._fd_to_key[10]) - - def test_register_unknown_event(self): - s = selectors._BaseSelector() - self.assertRaises(ValueError, s.register, unittest.mock.Mock(), 999999) - - def test_register_already_registered(self): - fobj = unittest.mock.Mock() - fobj.fileno.return_value = 10 - - s = selectors._BaseSelector() - s.register(fobj, selectors.EVENT_READ) - self.assertRaises(ValueError, s.register, fobj, selectors.EVENT_READ) - - def test_unregister(self): - fobj = unittest.mock.Mock() - fobj.fileno.return_value = 10 - - s = selectors._BaseSelector() - s.register(fobj, selectors.EVENT_READ) - s.unregister(fobj) - self.assertFalse(s._fd_to_key) - self.assertFalse(s._fileobj_to_key) - - def test_unregister_unknown(self): - s = selectors._BaseSelector() - self.assertRaises(ValueError, s.unregister, unittest.mock.Mock()) - - def test_modify_unknown(self): - s = selectors._BaseSelector() - self.assertRaises(ValueError, s.modify, unittest.mock.Mock(), 1) - - def test_modify(self): - fobj = unittest.mock.Mock() - fobj.fileno.return_value = 10 - - s = selectors._BaseSelector() - key = s.register(fobj, selectors.EVENT_READ) - key2 = s.modify(fobj, selectors.EVENT_WRITE) - self.assertNotEqual(key.events, key2.events) - self.assertEqual((selectors.EVENT_WRITE, None), s.get_info(fobj)) - - def test_modify_data(self): - fobj = unittest.mock.Mock() - fobj.fileno.return_value = 10 - - d1 = object() - d2 = object() - - s = selectors._BaseSelector() - key = s.register(fobj, selectors.EVENT_READ, d1) - key2 = s.modify(fobj, selectors.EVENT_READ, d2) - self.assertEqual(key.events, key2.events) - self.assertNotEqual(key.data, key2.data) - self.assertEqual((selectors.EVENT_READ, d2), s.get_info(fobj)) - - def test_modify_same(self): - fobj = unittest.mock.Mock() - fobj.fileno.return_value = 10 - - data = object() - - s = selectors._BaseSelector() - key = s.register(fobj, selectors.EVENT_READ, data) - key2 = s.modify(fobj, selectors.EVENT_READ, data) - self.assertIs(key, key2) - - def test_select(self): - s = selectors._BaseSelector() - self.assertRaises(NotImplementedError, s.select) - - def test_close(self): - s = selectors._BaseSelector() - s.register(1, selectors.EVENT_READ) - - s.close() - self.assertFalse(s._fd_to_key) - self.assertFalse(s._fileobj_to_key) - - def test_registered_count(self): - s = selectors._BaseSelector() - self.assertEqual(0, s.registered_count()) - - s.register(1, selectors.EVENT_READ) - self.assertEqual(1, s.registered_count()) - - s.unregister(1) - self.assertEqual(0, s.registered_count()) - - def test_context_manager(self): - s = selectors._BaseSelector() - - with s as sel: - sel.register(1, selectors.EVENT_READ) - - self.assertFalse(s._fd_to_key) - self.assertFalse(s._fileobj_to_key) - - @unittest.mock.patch('tulip.selectors.tulip_log') - def test_key_from_fd(self, m_log): - s = selectors._BaseSelector() - key = s.register(1, selectors.EVENT_READ) - - self.assertIs(key, s._key_from_fd(1)) - self.assertIsNone(s._key_from_fd(10)) - m_log.warning.assert_called_with('No key found for fd %r', 10) - - if hasattr(selectors.DefaultSelector, 'fileno'): - def test_fileno(self): - self.assertIsInstance(selectors.DefaultSelector().fileno(), int) diff -r 110a10e0733a tulip/selector_events.py --- a/tulip/selector_events.py Mon Jul 29 10:36:33 2013 -0700 +++ b/tulip/selector_events.py Fri Aug 02 19:32:13 2013 +0200 @@ -5,6 +5,7 @@ """ import collections +import select import socket try: import ssl @@ -15,7 +16,6 @@ from . import constants from . import events from . import futures -from . import selectors from . import transports from .log import tulip_log @@ -43,7 +43,7 @@ super().__init__() if selector is None: - selector = selectors.DefaultSelector() + selector = select.DefaultSelector() tulip_log.debug('Using selector: %s', selector.__class__.__name__) self._selector = selector self._make_self_pipe() @@ -131,10 +131,10 @@ try: mask, (reader, writer) = self._selector.get_info(fd) except KeyError: - self._selector.register(fd, selectors.EVENT_READ, + self._selector.register(fd, select.EVENT_READ, (handle, None)) else: - self._selector.modify(fd, mask | selectors.EVENT_READ, + self._selector.modify(fd, mask | select.EVENT_READ, (handle, writer)) if reader is not None: reader.cancel() @@ -146,7 +146,7 @@ except KeyError: return False else: - mask &= ~selectors.EVENT_READ + mask &= ~select.EVENT_READ if not mask: self._selector.unregister(fd) else: @@ -164,10 +164,10 @@ try: mask, (reader, writer) = self._selector.get_info(fd) except KeyError: - self._selector.register(fd, selectors.EVENT_WRITE, + self._selector.register(fd, select.EVENT_WRITE, (None, handle)) else: - self._selector.modify(fd, mask | selectors.EVENT_WRITE, + self._selector.modify(fd, mask | select.EVENT_WRITE, (reader, handle)) if writer is not None: writer.cancel() @@ -180,7 +180,7 @@ return False else: # Remove both writer and connector. - mask &= ~selectors.EVENT_WRITE + mask &= ~select.EVENT_WRITE if not mask: self._selector.unregister(fd) else: @@ -309,12 +309,12 @@ def _process_events(self, event_list): for fileobj, mask, (reader, writer) in event_list: - if mask & selectors.EVENT_READ and reader is not None: + if mask & select.EVENT_READ and reader is not None: if reader._cancelled: self.remove_reader(fileobj) else: self._add_callback(reader) - if mask & selectors.EVENT_WRITE and writer is not None: + if mask & select.EVENT_WRITE and writer is not None: if writer._cancelled: self.remove_writer(fileobj) else: