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
This commit is contained in:
benoitc 2013-12-26 11:30:57 +01:00
parent 9dc5d685c3
commit a397d90774
5 changed files with 41 additions and 24 deletions

View File

@ -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.

View File

@ -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:

View File

@ -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"}

View File

@ -1,2 +1,4 @@
pytest
pytest-cov
py==1.4.19
pytest==2.5.1
pytest-cov==1.6
wsgiref==0.1.2

View File

@ -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
"""