asyncfrontendbase.py
82 lines
| 2.7 KiB
| text/x-python
|
PythonLexer
Gael Varoquaux
|
r1355 | """ | ||
Base front end class for all async frontends. | ||||
""" | ||||
__docformat__ = "restructuredtext en" | ||||
Fernando Perez
|
r2133 | # Tell nose to skip this module | ||
__test__ = {} | ||||
Gael Varoquaux
|
r1355 | #------------------------------------------------------------------------------- | ||
Matthias BUSSONNIER
|
r5390 | # Copyright (C) 2008-2011 The IPython Development Team | ||
Gael Varoquaux
|
r1355 | # | ||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#------------------------------------------------------------------------------- | ||||
#------------------------------------------------------------------------------- | ||||
# Imports | ||||
#------------------------------------------------------------------------------- | ||||
Fernando Perez
|
r2133 | # Third-party | ||
from twisted.python.failure import Failure | ||||
from zope.interface import implements, classProvides | ||||
# From IPython | ||||
Brian Granger
|
r1960 | from IPython.external import guid | ||
Gael Varoquaux
|
r1355 | |||
Fernando Perez
|
r2133 | from IPython.frontend.frontendbase import (FrontEndBase, IFrontEnd, | ||
IFrontEndFactory) | ||||
Gael Varoquaux
|
r1355 | from IPython.kernel.core.history import FrontEndHistory | ||
Brian Granger
|
r1558 | from IPython.kernel.engineservice import IEngineCore | ||
Gael Varoquaux
|
r1355 | |||
Fernando Perez
|
r2133 | #----------------------------------------------------------------------------- | ||
# Classes and functions | ||||
#----------------------------------------------------------------------------- | ||||
Gael Varoquaux
|
r1355 | |||
class AsyncFrontEndBase(FrontEndBase): | ||||
""" | ||||
Overrides FrontEndBase to wrap execute in a deferred result. | ||||
All callbacks are made as callbacks on the deferred result. | ||||
""" | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1355 | implements(IFrontEnd) | ||
classProvides(IFrontEndFactory) | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1355 | def __init__(self, engine=None, history=None): | ||
assert(engine==None or IEngineCore.providedBy(engine)) | ||||
self.engine = IEngineCore(engine) | ||||
if history is None: | ||||
self.history = FrontEndHistory(input_cache=['']) | ||||
else: | ||||
self.history = history | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1355 | def execute(self, block, blockID=None): | ||
"""Execute the block and return the deferred result. | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1355 | Parameters: | ||
block : {str, AST} | ||||
blockID : any | ||||
Bernardo B. Marques
|
r4872 | Caller may provide an ID to identify this block. | ||
Gael Varoquaux
|
r1355 | result['blockID'] := blockID | ||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1355 | Result: | ||
Deferred result of self.interpreter.execute | ||||
""" | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1355 | if(not self.is_complete(block)): | ||
return Failure(Exception("Block is not compilable")) | ||||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1355 | if(blockID == None): | ||
Bernardo B. Marques
|
r4872 | blockID = guid.generate() | ||
Gael Varoquaux
|
r1355 | d = self.engine.execute(block) | ||
d.addCallback(self._add_history, block=block) | ||||
d.addCallbacks(self._add_block_id_for_result, | ||||
errback=self._add_block_id_for_failure, | ||||
callbackArgs=(blockID,), | ||||
errbackArgs=(blockID,)) | ||||
d.addBoth(self.update_cell_prompt, blockID=blockID) | ||||
Bernardo B. Marques
|
r4872 | d.addCallbacks(self.render_result, | ||
Gael Varoquaux
|
r1355 | errback=self.render_error) | ||
Bernardo B. Marques
|
r4872 | |||
Gael Varoquaux
|
r1355 | return d | ||