Browse Source

dump_conf now repr's unknown types

Ask Solem 11 years ago
parent
commit
54e974bfe3
2 changed files with 17 additions and 7 deletions
  1. 12 6
      celery/utils/__init__.py
  2. 5 1
      celery/worker/control.py

+ 12 - 6
celery/utils/__init__.py

@@ -202,9 +202,13 @@ def strtobool(term, table={'false': False, 'no': False, '0': False,
 
 def jsonify(obj,
             builtin_types=(int, float, string_t), key=None,
-            keyfilter=None):
+            keyfilter=None,
+            unknown_type_filter=None):
     """Transforms object making it suitable for json serialization"""
     from kombu.abstract import Object as KombuDictType
+    _jsonify = partial(jsonify, builtin_types=builtin_types, key=key,
+                       keyfilter=keyfilter,
+                       unknown_type_filter=unknown_type_filter)
 
     if isinstance(obj, KombuDictType):
         obj = obj.as_dict(recurse=True)
@@ -212,9 +216,9 @@ def jsonify(obj,
     if obj is None or isinstance(obj, builtin_types):
         return obj
     elif isinstance(obj, (tuple, list)):
-        return [jsonify(v) for v in obj]
+        return [_jsonify(v) for v in obj]
     elif isinstance(obj, dict):
-        return dict((k, jsonify(v, key=k))
+        return dict((k, _jsonify(v, key=k))
                     for k, v in items(obj)
                     if (keyfilter(k) if keyfilter else 1))
     elif isinstance(obj, datetime.datetime):
@@ -235,9 +239,11 @@ def jsonify(obj,
     elif isinstance(obj, datetime.timedelta):
         return str(obj)
     else:
-        raise ValueError(
-            'Unsupported type: {0!r} {1!r} (parent: {2})'.format(
-                type(obj), obj, key))
+        if unknown_type_filter is None:
+            raise ValueError(
+                'Unsupported type: {0!r} {1!r} (parent: {2})'.format(
+                    type(obj), obj, key))
+        return unknown_type_filter(obj)
 
 
 def gen_task_name(app, name, module_name):

+ 5 - 1
celery/worker/control.py

@@ -10,6 +10,8 @@ from __future__ import absolute_import
 
 import tempfile
 
+from kombu.utils.encoding import safe_repr
+
 from celery.five import UserDict, items, StringIO
 from celery.platforms import signals as _signals
 from celery.utils import timeutils
@@ -309,7 +311,9 @@ def _wanted_config_key(key):
 
 @Panel.register
 def dump_conf(state, **kwargs):
-    return jsonify(dict(state.app.conf), keyfilter=_wanted_config_key)
+    return jsonify(dict(state.app.conf),
+                   keyfilter=_wanted_config_key,
+                   unknown_type_filter=safe_repr)
 
 
 @Panel.register