diff --git a/CHANGES.txt b/CHANGES.txt index ae592be5..6d5e7c16 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -16,6 +16,10 @@ Next release - Add a ``docs`` section to tox.ini that, when run, ensures docs can be built. +- If an ``application`` value of ``None`` is supplied to the ``create_server`` + constructor function, a ValueError is now raised eagerly instead of an error + occuring during runtime. See https://github.com/Pylons/waitress/pull/60 + 0.8.9 (2014-05-16) ------------------ diff --git a/waitress/server.py b/waitress/server.py index 4d3d91a4..87338c81 100644 --- a/waitress/server.py +++ b/waitress/server.py @@ -36,6 +36,11 @@ def create_server(application, server = create_server(app) server.run() """ + if application is None: + raise ValueError( + 'The "app" passed to ``create_server`` was ``None``. You forgot ' + 'to return a WSGI app within your application.' + ) adj = Adjustments(**kw) if adj.unix_socket and hasattr(socket, 'AF_UNIX'): cls = UnixWSGIServer diff --git a/waitress/tests/test_server.py b/waitress/tests/test_server.py index 8b48e103..0ff88717 100644 --- a/waitress/tests/test_server.py +++ b/waitress/tests/test_server.py @@ -2,9 +2,11 @@ import socket import unittest +dummy_app = object() + class TestWSGIServer(unittest.TestCase): - def _makeOne(self, application, host='127.0.0.1', port=0, + def _makeOne(self, application=dummy_app, host='127.0.0.1', port=0, _dispatcher=None, adj=None, map=None, _start=True, _sock=None, _server=None): from waitress.server import create_server @@ -18,7 +20,7 @@ def _makeOne(self, application, host='127.0.0.1', port=0, _sock=_sock) def _makeOneWithMap(self, adj=None, _start=True, host='127.0.0.1', - port=0, app=None): + port=0, app=dummy_app): sock = DummySock() task_dispatcher = DummyTaskDispatcher() map = {} @@ -32,13 +34,17 @@ def _makeOneWithMap(self, adj=None, _start=True, host='127.0.0.1', _start=_start, ) + def test_ctor_app_is_None(self): + self.assertRaises(ValueError, self._makeOneWithMap, app=None) + + def test_ctor_start_true(self): inst = self._makeOneWithMap(_start=True) self.assertEqual(inst.accepting, True) self.assertEqual(inst.socket.listened, 1024) def test_ctor_makes_dispatcher(self): - inst = self._makeOne(None, _start=False, map={}) + inst = self._makeOne(_start=False, map={}) self.assertEqual(inst.task_dispatcher.__class__.__name__, 'ThreadedTaskDispatcher') @@ -198,7 +204,7 @@ class TestUnixWSGIServer(unittest.TestCase): def _makeOne(self, _start=True, _sock=None): from waitress.server import create_server return create_server( - None, + dummy_app, map={}, _start=_start, _sock=_sock,