Package elisa :: Package core :: Package utils :: Module defer

Source Code for Module elisa.core.utils.defer

  1  # -*- coding: utf-8 -*- 
  2  # Moovida - Home multimedia server 
  3  # Copyright (C) 2006-2009 Fluendo Embedded S.L. (www.fluendo.com). 
  4  # All rights reserved. 
  5  # 
  6  # This file is available under one of two license agreements. 
  7  # 
  8  # This file is licensed under the GPL version 3. 
  9  # See "LICENSE.GPL" in the root of this distribution including a special 
 10  # exception to use Moovida with Fluendo's plugins. 
 11  # 
 12  # The GPL part of Moovida is also available under a commercial licensing 
 13  # agreement from Fluendo. 
 14  # See "LICENSE.Moovida" in the root directory of this distribution package 
 15  # for details on that license. 
 16   
 17   
 18  from twisted.internet import defer 
 19  from twisted.python import failure 
 20  import cancellable_defer 
 21   
 22   
 23  if not hasattr(defer.Deferred(), 'cancel'): 
 24      Deferred = cancellable_defer.CancellableDeferred 
 25      CancelledError = cancellable_defer.CancelledError 
 26  else: 
 27      Deferred = defer.Deferred 
 28      CancelledError = defer.CancelledError 
 29   
 30   
31 -def succeed(result):
32 """ 33 see L{twisted.internet.defer.succeed}. 34 35 @rtype: L{Deferred} 36 """ 37 d = Deferred() 38 d.callback(result) 39 return d
40
41 -def fail(result=None):
42 """ 43 see L{twisted.internet.defer.fail}. The biggest difference is that the 44 twisted API allows you to call this without any parameters, which leads to 45 an error. See http://twistedmatrix.com/trac/ticket/3145. 46 47 @rtype: L{Deferred} 48 """ 49 d = Deferred() 50 d.errback(result) 51 return d
52
53 -def execute(callable, *args, **kw):
54 """ 55 see L{twisted.internet.defer.execute}. 56 57 @rtype: L{Deferred} 58 """ 59 try: 60 result = callable(*args, **kw) 61 except Exception, exc: 62 return fail(exc) 63 else: 64 return succeed(result)
65 66
67 -def timeout(deferred):
68 # old and new API compatible 69 if hasattr(deferred, 'cancel'): 70 deferred.cancel() 71 else: 72 msg = 'Callback timed out' 73 deferred.errback(failure.Failure(defer.TimeoutError(msg)))
74
75 -def deferred_accumulator(invocation_hint, return_accu, handler_return):
76 """ 77 Accumulator to use with gobject signals where callbacks are supposed to 78 return a Deferred. With this, emit() will return a list of all the 79 Deferred returned by the connected callbacks. It ignores callback return 80 values that are not Deferreds. 81 82 @param invocation_hint: (signal_id, detail, run_type) (this parameter is 83 ignored) 84 @type invocation_hint: C{tuple} 85 @param return_accu: a list of Deferred (or possibly None) 86 @type return_accu: C{list} 87 @param handler_return: The return value of the signal handler 88 @type handler_return: C{elisa.core.utils.Deferred} 89 90 @return: a tuple containing True and a list of deferreds. 91 @rtype: C{tuple} 92 """ 93 accu = return_accu 94 if accu == None: 95 accu = [] 96 if not isinstance(handler_return, Deferred): 97 return True, accu 98 return True, accu + [handler_return]
99 100 # for compability with twisted.internet.defer: 101 DeferredList = defer.DeferredList 102 103 FAILURE = defer.FAILURE 104 SUCCESS = defer.SUCCESS 105 TimeoutError = defer.TimeoutError 106 AlreadyCalledError = defer.AlreadyCalledError 107 108 gatherResults = defer.gatherResults 109 maybeDeferred = defer.maybeDeferred 110 waitForDeferred = defer.waitForDeferred 111 deferredGenerator = defer.deferredGenerator 112 inlineCallbacks = defer.inlineCallbacks 113 114 DeferredLock = defer.DeferredLock 115 DeferredSemaphore = defer.DeferredSemaphore 116 DeferredQueue = defer.DeferredQueue 117 118 # these classes are new since 8.1 119 try: 120 DeferredFilesystemLock = defer.DeferredFilesystemLock 121 AlreadyTryingToLockError = defer.AlreadyTryingToLockError 122 except AttributeError: 123 pass 124