def unwindGenerator(*args, **kwargs): try: gen = f(*args, **kwargs) except defer._DefGen_Return as e: return Chainable(defer.succeed(e.value)) if not isinstance(gen, types.GeneratorType): return Chainable(defer.succeed(gen)) d = defer._inlineCallbacks(None, gen, defer.Deferred()) return Chainable(d)
def unwindGenerator(*args, **kwargs): try: gen = f(*args, **kwargs) except _DefGen_Return: raise TypeError( "webMethod requires %r to produce a generator; instead" "caught returnValue being used in a non-generator" % (f, )) if not isinstance(gen, types.GeneratorType): raise TypeError("webMethod requires %r to produce a generator; " "instead got %r" % (f, gen)) return _inlineCallbacks(None, Generator(gen), Deferred()) f._without_request = True
def unwindGenerator(*args, **kwargs): try: gen = f(*args, **kwargs) except _DefGen_Return: raise TypeError( "webMethod requires %r to produce a generator; instead" "caught returnValue being used in a non-generator" % (f,)) if not isinstance(gen, types.GeneratorType): raise TypeError( "webMethod requires %r to produce a generator; " "instead got %r" % (f, gen)) return _inlineCallbacks(None, Generator(gen), Deferred()) f._without_request = True
def _(*args, **kwargs): res = callable(*args, **kwargs) if isinstance(res, types.GeneratorType): res = _inlineCallbacks(None, res, Deferred()) if isinstance(res, Deferred): future = Future() res.addCallbacks( future.set_result, lambda failure: future.set_exception(failure.value)) future._deferred = res return future else: raise TypeError( "Callable %r should return a generator or a twisted Deferred" % callable)
def execute(self, request, signed_claims): if not signed_claims: return_value( APIResult(error='Remote procedure was called without claims')) from mdstudio.component.impl.common import CommonSession claims = yield super(CommonSession, self.instance).call( u'mdstudio.auth.endpoint.verify', signed_claims) claim_errors = self.validate_claims(claims, request) if claim_errors: return_value(claim_errors) request_errors = self.validate_request(request) if request_errors: return_value(request_errors) result = self.call_wrapped(request, claims['claims']) if isinstance(result, GeneratorType): result = _inlineCallbacks(None, result, Deferred()) result = yield result result = result if isinstance(result, APIResult) else APIResult(result) convert_obj_to_json(result) if 'error' in result: return_value(result) result_errors = self.validate_result(result.data) if result_errors: return_value(result_errors) if 'error' in result: return_value(result) result_errors = self.validate_result(result.data) if result_errors: return_value(result_errors) return_value(result)
def inlineCallbacks(f): from twisted.internet import defer from twisted.python.util import mergeFunctionMetadata def unwindGenerator(*args, **kwargs): deferred = defer.Deferred() try: result = f(*args, **kwargs) except Exception, e: deferred.errback(e) return deferred if isinstance(result, types.GeneratorType): return defer._inlineCallbacks(None, result, deferred) deferred.callback(result) return deferred
def unwindGenerator(*args, **kwargs): gen = f(*args, **kwargs) rt, rettype = gen.send(None) defr = _inlineCallbacks(None, pc_wrapper(rt, gen), Deferred()) defr.addCallback(lambda v: reconcile(rettype, v)) return ncopy(rettype)