From 16eb657584c3930df3069237b2dfb7698661cbc8 Mon Sep 17 00:00:00 2001 From: Maxim Kamenkov Date: Wed, 14 Mar 2012 19:02:13 +0300 Subject: [PATCH] Added "validate_class" option validator. Now you able to use existed type instance or factory method to create and customize class during in-code configuration. E.g.: >>> settings.set('worker_class', MyWorkerClass) >>> settings.set('worker_class', lambda: MyWorkerClass) All other formats still valid. --- gunicorn/config.py | 11 +++++++++-- gunicorn/util.py | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gunicorn/config.py b/gunicorn/config.py index 14a1e855..a91dfbb8 100644 --- a/gunicorn/config.py +++ b/gunicorn/config.py @@ -212,6 +212,13 @@ def validate_string(val): raise TypeError("Not a string: %s" % val) return val.strip() +def validate_class(val): + if inspect.isfunction(val) or inspect.ismethod(val): + val = val() + if inspect.isclass(val): + return val + return validate_string(val) + def validate_callable(arity): def _validate_callable(val): if not callable(val): @@ -338,7 +345,7 @@ class WorkerClass(Setting): section = "Worker Processes" cli = ["-k", "--worker-class"] meta = "STRING" - validator = validate_string + validator = validate_class default = "sync" desc = """\ The type of workers to use. @@ -740,7 +747,7 @@ class LoggerClass(Setting): section = "Logging" cli = ["--logger-class"] meta = "STRING" - validator = validate_string + validator = validate_class default = "simple" desc = """\ The logger you want to use to log events in gunicorn. diff --git a/gunicorn/util.py b/gunicorn/util.py index b2496bab..d967e5d1 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -23,6 +23,7 @@ import socket import sys import textwrap import time +import inspect MAXFD = 1024 @@ -103,6 +104,8 @@ relative import to an absolute import. return sys.modules[name] def load_class(uri, default="sync", section="gunicorn.workers"): + if inspect.isclass(uri): + return uri if uri.startswith("egg:"): # uses entry points entry_str = uri.split("egg:")[1]