From a397d90774d3b8975fc0c1120e52529b1de08c97 Mon Sep 17 00:00:00 2001 From: benoitc Date: Thu, 26 Dec 2013 11:30:57 +0100 Subject: [PATCH] don't depend on entry point for internal classes. We don't have to depend on entry points when loading suppoorted workers nad extensions, instead use the absolute path to load the class. fix #259 --- gunicorn/config.py | 11 ++++++++--- gunicorn/util.py | 23 +++++++++++++++-------- gunicorn/workers/__init__.py | 14 ++++++++++++++ requirements_dev.txt | 6 ++++-- setup.py | 11 ----------- 5 files changed, 41 insertions(+), 24 deletions(-) diff --git a/gunicorn/config.py b/gunicorn/config.py index e61bb2c0..47e512d8 100644 --- a/gunicorn/config.py +++ b/gunicorn/config.py @@ -123,8 +123,13 @@ class Config(object): @property def logger_class(self): uri = self.settings['logger_class'].get() - logger_class = util.load_class(uri, default="simple", - section="gunicorn.loggers") + if uri == "simple": + # support the default + uri = "gunicorn.glogging.Logger" + else: + logger_class = util.load_class(uri, + default="gunicorn.glogging.Logger", + section="gunicorn.loggers") if hasattr(logger_class, "install"): logger_class.install() @@ -1005,7 +1010,7 @@ class LoggerClass(Setting): cli = ["--logger-class"] meta = "STRING" validator = validate_class - default = "simple" + default = "gunicorn.glogging.Logger" desc = """\ The logger you want to use to log events in gunicorn. diff --git a/gunicorn/util.py b/gunicorn/util.py index d632b2c4..48ad846e 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -21,6 +21,7 @@ import warnings from gunicorn.errors import AppImportError from gunicorn.six import text_type, string_types +from gunicorn.workers import SUPPORTED_WORKERS MAXFD = 1024 REDIRECT_TO = getattr(os, 'devnull', '/dev/null') @@ -96,7 +97,8 @@ relative import to an absolute import. return sys.modules[name] -def load_class(uri, default="sync", section="gunicorn.workers"): +def load_class(uri, default="gunicorn.workers.sync.SyncWorker", + section="gunicorn.workers"): if inspect.isclass(uri): return uri if uri.startswith("egg:"): @@ -117,16 +119,21 @@ def load_class(uri, default="sync", section="gunicorn.workers"): else: components = uri.split('.') if len(components) == 1: - try: + while True: if uri.startswith("#"): uri = uri[1:] - return pkg_resources.load_entry_point("gunicorn", - section, uri) - except: - exc = traceback.format_exc() - raise RuntimeError("class uri %r invalid or not found: \n\n[%s]" % (uri, - exc)) + if uri in SUPPORTED_WORKERS: + components = SUPPORTED_WORKERS[uri].split(".") + break + + try: + return pkg_resources.load_entry_point("gunicorn", + section, uri) + except: + exc = traceback.format_exc() + raise RuntimeError("class uri %r invalid or not found: \n\n[%s]" % (uri, + exc)) klass = components.pop(-1) try: diff --git a/gunicorn/workers/__init__.py b/gunicorn/workers/__init__.py index e69de29b..6c769f83 100644 --- a/gunicorn/workers/__init__.py +++ b/gunicorn/workers/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 - +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +# supported gunicorn workers. +SUPPORTED_WORKERS={ + "sync": "gunicorn.workers.sync.SyncWorker", + "eventlet": "gunicorn.workers.geventlet.EventletWorker", + "gevent": "gunicorn.workers.ggevent.GeventWorker", + "gevent_wsgi": "gunicorn.workers.ggevent.GeventPyWSGIWorker", + "gevent_pywsgi": "gunicorn.workers.ggevent.GeventPyWSGIWorker", + "tornado": "gunicorn.workers.gtornado.TornadoWorker"} + diff --git a/requirements_dev.txt b/requirements_dev.txt index 9955decc..b7ebf797 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,2 +1,4 @@ -pytest -pytest-cov +py==1.4.19 +pytest==2.5.1 +pytest-cov==1.6 +wsgiref==0.1.2 diff --git a/setup.py b/setup.py index b947fceb..16e20e6c 100644 --- a/setup.py +++ b/setup.py @@ -89,17 +89,6 @@ setup( gunicorn_django=gunicorn.app.djangoapp:run gunicorn_paster=gunicorn.app.pasterapp:run - [gunicorn.workers] - sync=gunicorn.workers.sync:SyncWorker - eventlet=gunicorn.workers.geventlet:EventletWorker - gevent=gunicorn.workers.ggevent:GeventWorker - gevent_wsgi=gunicorn.workers.ggevent:GeventPyWSGIWorker - gevent_pywsgi=gunicorn.workers.ggevent:GeventPyWSGIWorker - tornado=gunicorn.workers.gtornado:TornadoWorker - - [gunicorn.loggers] - simple=gunicorn.glogging:Logger - [paste.server_runner] main=gunicorn.app.pasterapp:paste_server """