Skip to content

Commit

Permalink
Merge db2b7c9 into e3492db
Browse files Browse the repository at this point in the history
  • Loading branch information
hartwork committed Dec 9, 2019
2 parents e3492db + db2b7c9 commit ab86ad8
Show file tree
Hide file tree
Showing 14 changed files with 72 additions and 129 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/install-deps.sh
Expand Up @@ -10,6 +10,6 @@ sudo apt-get install -y libev-dev
pip install mako jinja2

for name in waitress "cherrypy<9" cheroot paste tornado twisted diesel meinheld\
gunicorn eventlet flup fapws3 rocket bjoern gevent uvloop; do
gunicorn eventlet flup fapws3 bjoern gevent aiohttp-wsgi uvloop; do
pip install $name || echo "Failed to install $name with $(python -V 2>&1)" 1>&2
done
1 change: 0 additions & 1 deletion .travis.yml
Expand Up @@ -5,7 +5,6 @@ sudo: required
python:
# - "2.7.3" # Ubuntu 12.4LTS (precise) and Debian 7 LTS (wheezy)
- "2.7"
- "3.4"
- "3.5"
- "3.6"
- "3.7"
Expand Down
30 changes: 5 additions & 25 deletions bottle.py
Expand Up @@ -3494,15 +3494,6 @@ def run(self, handler):
wsgi.server(listen(address), handler)


class RocketServer(ServerAdapter):
""" Untested. """

def run(self, handler):
from rocket import Rocket
server = Rocket((self.host, self.port), 'wsgi', {'wsgi_app': handler})
server.start()


class BjoernServer(ServerAdapter):
""" Fast server written in C: https://github.com/jonashaag/bjoern """

Expand All @@ -3516,9 +3507,9 @@ def get_event_loop(self):
pass

class AiohttpServer(AsyncioServerAdapter):
""" Untested.
aiohttp
""" Asynchronous HTTP client/server framework for asyncio
https://pypi.python.org/pypi/aiohttp/
https://pypi.org/project/aiohttp-wsgi/
"""

def get_event_loop(self):
Expand All @@ -3527,26 +3518,16 @@ def get_event_loop(self):

def run(self, handler):
import asyncio
from aiohttp.wsgi import WSGIServerHttpProtocol
from aiohttp_wsgi.wsgi import serve
self.loop = self.get_event_loop()
asyncio.set_event_loop(self.loop)

protocol_factory = lambda: WSGIServerHttpProtocol(
handler,
readpayload=True,
debug=(not self.quiet))
self.loop.run_until_complete(self.loop.create_server(protocol_factory,
self.host,
self.port))

if 'BOTTLE_CHILD' in os.environ:
import signal
signal.signal(signal.SIGINT, lambda s, f: self.loop.stop())

try:
self.loop.run_forever()
except KeyboardInterrupt:
self.loop.stop()
serve(handler, host=self.host, port=self.port)


class AiohttpUVLoopServer(AiohttpServer):
"""uvloop
Expand Down Expand Up @@ -3586,7 +3567,6 @@ def run(self, handler):
'gunicorn': GunicornServer,
'eventlet': EventletServer,
'gevent': GeventServer,
'rocket': RocketServer,
'bjoern': BjoernServer,
'aiohttp': AiohttpServer,
'uvloop': AiohttpUVLoopServer,
Expand Down
8 changes: 0 additions & 8 deletions docs/_locale/_pot/deployment.pot
Expand Up @@ -152,14 +152,6 @@ msgstr ""
msgid "Multi-threaded, stable, tried and tested"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket_"
msgstr ""

#: ../../deployment.rst:68
msgid "Multi-threaded"
msgstr ""
Expand Down
8 changes: 0 additions & 8 deletions docs/_locale/de_DE/LC_MESSAGES/deployment.po
Expand Up @@ -191,14 +191,6 @@ msgstr ""
msgid "Multi-threaded, stable, tried and tested"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket_"
msgstr ""

#: ../../deployment.rst:68
msgid "Multi-threaded"
msgstr ""
Expand Down
8 changes: 0 additions & 8 deletions docs/_locale/pt_BR/LC_MESSAGES/_pot/deployment.po
Expand Up @@ -185,14 +185,6 @@ msgstr ""
msgid "Multi-threaded, stable, tried and tested"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket_"
msgstr ""

#: ../../deployment.rst:68
msgid "Multi-threaded"
msgstr ""
Expand Down
8 changes: 0 additions & 8 deletions docs/_locale/pt_BR/LC_MESSAGES/deployment.po
Expand Up @@ -191,14 +191,6 @@ msgstr ""
msgid "Multi-threaded, stable, tried and tested"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket_"
msgstr ""

#: ../../deployment.rst:68
msgid "Multi-threaded"
msgstr ""
Expand Down
8 changes: 0 additions & 8 deletions docs/_locale/ru_RU/LC_MESSAGES/deployment.po
Expand Up @@ -191,14 +191,6 @@ msgstr ""
msgid "Multi-threaded, stable, tried and tested"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket_"
msgstr ""

#: ../../deployment.rst:68
msgid "Multi-threaded"
msgstr ""
Expand Down
8 changes: 0 additions & 8 deletions docs/_locale/zh_CN/LC_MESSAGES/_pot/deployment.po
Expand Up @@ -185,14 +185,6 @@ msgstr ""
msgid "Multi-threaded, stable, tried and tested"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket_"
msgstr ""

#: ../../deployment.rst:68
msgid "Multi-threaded"
msgstr ""
Expand Down
8 changes: 0 additions & 8 deletions docs/_locale/zh_CN/LC_MESSAGES/deployment.po
Expand Up @@ -191,14 +191,6 @@ msgstr ""
msgid "Multi-threaded, stable, tried and tested"
msgstr "多线程,稳定,久经考验,充分测试"

#: ../../deployment.rst:68
msgid "rocket"
msgstr ""

#: ../../deployment.rst:68
msgid "rocket_"
msgstr ""

#: ../../deployment.rst:68
msgid "Multi-threaded"
msgstr "多线程"
Expand Down
2 changes: 0 additions & 2 deletions docs/deployment.rst
Expand Up @@ -3,7 +3,6 @@
.. _wsgiref: http://docs.python.org/library/wsgiref.html
.. _cherrypy: http://www.cherrypy.org/
.. _paste: http://pythonpaste.org/
.. _rocket: http://pypi.python.org/pypi/rocket
.. _gunicorn: http://pypi.python.org/pypi/gunicorn
.. _fapws3: http://www.fapws.org/
.. _tornado: http://www.tornadoweb.org/
Expand Down Expand Up @@ -68,7 +67,6 @@ gae gae_ Helper for Google App Engine deployments
wsgiref wsgiref_ Single-threaded default server
cherrypy cherrypy_ Multi-threaded and very stable
paste paste_ Multi-threaded, stable, tried and tested
rocket rocket_ Multi-threaded
waitress waitress_ Multi-threaded, poweres Pyramid
gunicorn gunicorn_ Pre-forked, partly written in C
eventlet eventlet_ Asynchronous framework with WSGI support.
Expand Down
63 changes: 32 additions & 31 deletions test/servertest.py
@@ -1,38 +1,39 @@
if __name__ != '__main__':
raise ImportError('This is not a module, but a script.')
def main():
import sys, os, socket

import sys, os, socket

test_root = os.path.dirname(os.path.abspath(__file__))
os.chdir(test_root)
sys.path.insert(0, os.path.dirname(test_root))
sys.path.insert(0, test_root)

try:
server = sys.argv[1]
port = int(sys.argv[2])

if server == 'gevent':
from gevent import monkey
monkey.patch_all()
elif server == 'eventlet':
import eventlet
eventlet.monkey_patch()
test_root = os.path.dirname(os.path.abspath(__file__))
os.chdir(test_root)
sys.path.insert(0, os.path.dirname(test_root))
sys.path.insert(0, test_root)

try:
import coverage
coverage.process_startup()
server = sys.argv[1]
port = int(sys.argv[2])

if server == 'gevent':
from gevent import monkey
monkey.patch_all()
elif server == 'eventlet':
import eventlet
eventlet.monkey_patch()

try:
import coverage
coverage.process_startup()
except ImportError:
pass

from bottle import route, run
route('/test', callback=lambda: 'OK')
run(port=port, server=server, quiet=True)

except socket.error:
sys.exit(3)
except ImportError:
sys.exit(128)
except KeyboardInterrupt:
pass

from bottle import route, run
route('/test', callback=lambda: 'OK')
run(port=port, server=server, quiet=True)

except socket.error:
sys.exit(3)
except ImportError:
sys.exit(128)
except KeyboardInterrupt:
pass

if __name__ == '__main__':
main()
25 changes: 21 additions & 4 deletions test/test_server.py
Expand Up @@ -54,9 +54,11 @@ def setUp(self):
if rv is None:
raise AssertionError("Server took too long to start up.")
if rv is 128: # Import error
tools.warn("Skipping %r test (ImportError)." % self.server)
self.skip = True
return
if os.environ.get('CI') != 'true' or \
os.environ.get('TRAVIS_PYTHON_VERSION') not in ('2.7', '3.6'):
tools.warn("Skipping %r test (ImportError)." % self.server)
self.skip = True
return
if rv is 3: # Port in use
continue
raise AssertionError("Server exited with error code %d" % rv)
Expand Down Expand Up @@ -96,7 +98,22 @@ def test_simple(self):
self.assertEqual(tob('OK'), self.fetch('test'))


blacklist = ['cgi', 'flup', 'gae']
blacklist = ['cgi', 'flup', 'gae', 'wsgiref']

if sys.version_info.major == 2:
blacklist += [
'aiohttp',
'uvloop',
]
else:
blacklist += [
'bjoern',
'diesel',
'fapws3',
'flup',
'gevent',
]


for name in set(server_names) - set(blacklist):
classname = 'TestServerAdapter_'+name
Expand Down
22 changes: 13 additions & 9 deletions test/travis_setup.sh
Expand Up @@ -13,15 +13,19 @@ pip install -U coverage
pip install coveralls

# Server back-ends and template engines. Not all back-ends support all python versions and we only want to test for 2.7 and 3.6 to keep things sane
if [[ $TRAVIS_PYTHON_VERSION == 2.7 ]]; then
case ${TRAVIS_PYTHON_VERSION} in
2.7|3.6)
sudo apt-get update -y
sudo apt-get install -y libev-dev
pip install mako jinja2 waitress "cherrypy<9" cheroot paste tornado twisted diesel meinheld gunicorn eventlet
pip install flup fapws3 rocket bjoern gevent
elif [[ $TRAVIS_PYTHON_VERSION == 3.6 ]]; then
sudo apt-get update -y
sudo apt-get install -y libev-dev
pip install mako jinja2 waitress "cherrypy<9" cheroot paste tornado twisted diesel meinheld gunicorn eventlet
pip install uvloop
fi
pip install mako jinja2 waitress "cherrypy<9" cheroot paste tornado twisted meinheld gunicorn eventlet
;;
esac

case ${TRAVIS_PYTHON_VERSION} in
2.7)
pip install flup fapws3 bjoern gevent diesel
;;
3.6)
pip install aiohttp-wsgi uvloop
;;
esac

0 comments on commit ab86ad8

Please sign in to comment.