PageRenderTime 33ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/python/celery/tests/utils.py

https://github.com/mozilla/affiliates-lib
Python | 229 lines | 163 code | 56 blank | 10 comment | 24 complexity | f89aa4413a43edef72f77136afc02b03 MD5 | raw file
  1. from __future__ import generators
  2. import os
  3. import sys
  4. import __builtin__
  5. from StringIO import StringIO
  6. from nose import SkipTest
  7. from celery.utils.functional import wraps
  8. class GeneratorContextManager(object):
  9. def __init__(self, gen):
  10. self.gen = gen
  11. def __enter__(self):
  12. try:
  13. return self.gen.next()
  14. except StopIteration:
  15. raise RuntimeError("generator didn't yield")
  16. def __exit__(self, type, value, traceback):
  17. if type is None:
  18. try:
  19. self.gen.next()
  20. except StopIteration:
  21. return
  22. else:
  23. raise RuntimeError("generator didn't stop")
  24. else:
  25. try:
  26. self.gen.throw(type, value, traceback)
  27. raise RuntimeError("generator didn't stop after throw()")
  28. except StopIteration:
  29. return True
  30. except AttributeError:
  31. raise value
  32. except:
  33. if sys.exc_info()[1] is not value:
  34. raise
  35. def fallback_contextmanager(fun):
  36. def helper(*args, **kwds):
  37. return GeneratorContextManager(fun(*args, **kwds))
  38. return helper
  39. def execute_context(context, fun):
  40. val = context.__enter__()
  41. exc_info = (None, None, None)
  42. retval = None
  43. try:
  44. retval = fun(val)
  45. except:
  46. exc_info = sys.exc_info()
  47. context.__exit__(*exc_info)
  48. return retval
  49. try:
  50. from contextlib import contextmanager
  51. except ImportError:
  52. contextmanager = fallback_contextmanager
  53. from celery.utils import noop
  54. @contextmanager
  55. def eager_tasks():
  56. from celery import conf
  57. prev = conf.ALWAYS_EAGER
  58. conf.ALWAYS_EAGER = True
  59. yield True
  60. conf.ALWAYS_EAGER = prev
  61. def with_eager_tasks(fun):
  62. @wraps(fun)
  63. def _inner(*args, **kwargs):
  64. from celery import conf
  65. prev = conf.ALWAYS_EAGER
  66. conf.ALWAYS_EAGER = True
  67. try:
  68. return fun(*args, **kwargs)
  69. finally:
  70. conf.ALWAYS_EAGER = prev
  71. def with_environ(env_name, env_value):
  72. def _envpatched(fun):
  73. @wraps(fun)
  74. def _patch_environ(*args, **kwargs):
  75. prev_val = os.environ.get(env_name)
  76. os.environ[env_name] = env_value
  77. try:
  78. return fun(*args, **kwargs)
  79. finally:
  80. if prev_val is not None:
  81. os.environ[env_name] = prev_val
  82. return _patch_environ
  83. return _envpatched
  84. def sleepdeprived(fun):
  85. @wraps(fun)
  86. def _sleepdeprived(*args, **kwargs):
  87. import time
  88. old_sleep = time.sleep
  89. time.sleep = noop
  90. try:
  91. return fun(*args, **kwargs)
  92. finally:
  93. time.sleep = old_sleep
  94. return _sleepdeprived
  95. def skip_if_environ(env_var_name):
  96. def _wrap_test(fun):
  97. @wraps(fun)
  98. def _skips_if_environ(*args, **kwargs):
  99. if os.environ.get(env_var_name):
  100. raise SkipTest("SKIP %s: %s set\n" % (
  101. fun.__name__, env_var_name))
  102. return fun(*args, **kwargs)
  103. return _skips_if_environ
  104. return _wrap_test
  105. def skip_if_quick(fun):
  106. return skip_if_environ("QUICKTEST")(fun)
  107. def _skip_test(reason, sign):
  108. def _wrap_test(fun):
  109. @wraps(fun)
  110. def _skipped_test(*args, **kwargs):
  111. raise SkipTest("%s: %s" % (sign, reason))
  112. return _skipped_test
  113. return _wrap_test
  114. def todo(reason):
  115. """TODO test decorator."""
  116. return _skip_test(reason, "TODO")
  117. def skip(reason):
  118. """Skip test decorator."""
  119. return _skip_test(reason, "SKIP")
  120. def skip_if(predicate, reason):
  121. """Skip test if predicate is ``True``."""
  122. def _inner(fun):
  123. return predicate and skip(reason)(fun) or fun
  124. return _inner
  125. def skip_unless(predicate, reason):
  126. """Skip test if predicate is ``False``."""
  127. return skip_if(not predicate, reason)
  128. # Taken from
  129. # http://bitbucket.org/runeh/snippets/src/tip/missing_modules.py
  130. @contextmanager
  131. def mask_modules(*modnames):
  132. """Ban some modules from being importable inside the context
  133. For example:
  134. >>> with missing_modules("sys"):
  135. ... try:
  136. ... import sys
  137. ... except ImportError:
  138. ... print "sys not found"
  139. sys not found
  140. >>> import sys
  141. >>> sys.version
  142. (2, 5, 2, 'final', 0)
  143. """
  144. realimport = __builtin__.__import__
  145. def myimp(name, *args, **kwargs):
  146. if name in modnames:
  147. raise ImportError("No module named %s" % name)
  148. else:
  149. return realimport(name, *args, **kwargs)
  150. __builtin__.__import__ = myimp
  151. yield True
  152. __builtin__.__import__ = realimport
  153. @contextmanager
  154. def override_stdouts():
  155. """Override ``sys.stdout`` and ``sys.stderr`` with ``StringIO``."""
  156. prev_out, prev_err = sys.stdout, sys.stderr
  157. mystdout, mystderr = StringIO(), StringIO()
  158. sys.stdout = sys.__stdout__ = mystdout
  159. sys.stderr = sys.__stderr__ = mystderr
  160. yield mystdout, mystderr
  161. sys.stdout = sys.__stdout__ = prev_out
  162. sys.stderr = sys.__stderr__ = prev_err