__init__.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.utils
  4. ~~~~~~~~~~~~
  5. Utility functions.
  6. """
  7. from __future__ import absolute_import, print_function, unicode_literals
  8. import numbers
  9. import sys
  10. import datetime
  11. from functools import partial
  12. from celery.five import items, reraise, string_t
  13. from .functional import memoize # noqa
  14. from .nodenames import worker_direct, nodename, nodesplit
  15. __all__ = ['worker_direct',
  16. 'is_iterable', 'maybe_reraise', 'strtobool',
  17. 'jsonify', 'gen_task_name', 'nodename', 'nodesplit',
  18. 'cached_property']
  19. PY3 = sys.version_info[0] == 3
  20. def is_iterable(obj):
  21. try:
  22. iter(obj)
  23. except TypeError:
  24. return False
  25. return True
  26. def maybe_reraise():
  27. """Re-raise if an exception is currently being handled, or return
  28. otherwise."""
  29. exc_info = sys.exc_info()
  30. try:
  31. if exc_info[2]:
  32. reraise(exc_info[0], exc_info[1], exc_info[2])
  33. finally:
  34. # see http://docs.python.org/library/sys.html#sys.exc_info
  35. del(exc_info)
  36. def strtobool(term, table={'false': False, 'no': False, '0': False,
  37. 'true': True, 'yes': True, '1': True,
  38. 'on': True, 'off': False}):
  39. """Convert common terms for true/false to bool
  40. (true/false/yes/no/on/off/1/0)."""
  41. if isinstance(term, string_t):
  42. try:
  43. return table[term.lower()]
  44. except KeyError:
  45. raise TypeError('Cannot coerce {0!r} to type bool'.format(term))
  46. return term
  47. def jsonify(obj,
  48. builtin_types=(numbers.Real, string_t), key=None,
  49. keyfilter=None,
  50. unknown_type_filter=None):
  51. """Transforms object making it suitable for json serialization"""
  52. from kombu.abstract import Object as KombuDictType
  53. _jsonify = partial(jsonify, builtin_types=builtin_types, key=key,
  54. keyfilter=keyfilter,
  55. unknown_type_filter=unknown_type_filter)
  56. if isinstance(obj, KombuDictType):
  57. obj = obj.as_dict(recurse=True)
  58. if obj is None or isinstance(obj, builtin_types):
  59. return obj
  60. elif isinstance(obj, (tuple, list)):
  61. return [_jsonify(v) for v in obj]
  62. elif isinstance(obj, dict):
  63. return {
  64. k: _jsonify(v, key=k) for k, v in items(obj)
  65. if (keyfilter(k) if keyfilter else 1)
  66. }
  67. elif isinstance(obj, datetime.datetime):
  68. # See "Date Time String Format" in the ECMA-262 specification.
  69. r = obj.isoformat()
  70. if obj.microsecond:
  71. r = r[:23] + r[26:]
  72. if r.endswith('+00:00'):
  73. r = r[:-6] + 'Z'
  74. return r
  75. elif isinstance(obj, datetime.date):
  76. return obj.isoformat()
  77. elif isinstance(obj, datetime.time):
  78. r = obj.isoformat()
  79. if obj.microsecond:
  80. r = r[:12]
  81. return r
  82. elif isinstance(obj, datetime.timedelta):
  83. return str(obj)
  84. else:
  85. if unknown_type_filter is None:
  86. raise ValueError(
  87. 'Unsupported type: {0!r} {1!r} (parent: {2})'.format(
  88. type(obj), obj, key))
  89. return unknown_type_filter(obj)
  90. # ------------------------------------------------------------------------ #
  91. # > XXX Compat
  92. from .log import LOG_LEVELS # noqa
  93. from .imports import ( # noqa
  94. qualname as get_full_cls_name, symbol_by_name as get_cls_by_name,
  95. instantiate, import_from_cwd, gen_task_name,
  96. )
  97. from .functional import chunks, noop # noqa
  98. from kombu.utils import cached_property, uuid # noqa
  99. gen_unique_id = uuid