##// END OF EJS Templates
Docstrings tweaks.
Docstrings tweaks.

File last commit:

r1281:75ba404c
r1296:3a421f7a
Show More
frontendbase.py
311 lines | 9.3 KiB | text/x-python | PythonLexer
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 # encoding: utf-8
"""
Barry Wark
for code review
r1277 frontendbase provides an interface and base class for GUI frontends for IPython.kernel/IPython.kernel.core.
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
for code review
r1277 Frontend implementations will likely want to subclass FrontEndBase.
Author: Barry Wark
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """
__docformat__ = "restructuredtext en"
#-------------------------------------------------------------------------------
Barry Wark
for code review
r1277 # Copyright (C) 2008 The IPython Development Team
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# Imports
#-------------------------------------------------------------------------------
import string
import uuid
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 import _ast
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 import zope.interface as zi
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
from IPython.kernel.core.history import FrontEndHistory
from IPython.kernel.core.util import Bunch
from IPython.kernel.engineservice import IEngineCore
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 from twisted.python.failure import Failure
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
##############################################################################
# TEMPORARY!!! fake configuration, while we decide whether to use tconfig or
# not
rc = Bunch()
rc.prompt_in1 = r'In [$number]: '
rc.prompt_in2 = r'...'
rc.prompt_out = r'Out [$number]: '
##############################################################################
Barry Wark
for code review
r1277 class IFrontEndFactory(zi.Interface):
"""Factory interface for frontends."""
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
for code review
r1277 def __call__(engine=None, history=None):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """
Parameters:
interpreter : IPython.kernel.engineservice.IEngineCore
"""
Barry Wark
for code review
r1277
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 pass
Barry Wark
for code review
r1277
class IFrontEnd(zi.Interface):
"""Interface for frontends. All methods return t.i.d.Deferred"""
zi.Attribute("input_prompt_template", "string.Template instance substituteable with execute result.")
zi.Attribute("output_prompt_template", "string.Template instance substituteable with execute result.")
zi.Attribute("continuation_prompt_template", "string.Template instance substituteable with execute result.")
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
def update_cell_prompt(self, result):
"""Subclass may override to update the input prompt for a block.
Since this method will be called as a twisted.internet.defer.Deferred's callback,
implementations should return result when finished."""
Barry Wark
for code review
r1277 pass
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
def render_result(self, result):
"""Render the result of an execute call. Implementors may choose the method of rendering.
For example, a notebook-style frontend might render a Chaco plot inline.
Parameters:
result : dict (result of IEngineBase.execute )
Result:
Output of frontend rendering
"""
Barry Wark
for code review
r1277 pass
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
def render_error(self, failure):
"""Subclasses must override to render the failure. Since this method will be called as a
twisted.internet.defer.Deferred's callback, implementations should return result
when finished."""
Barry Wark
for code review
r1277 pass
def inputPrompt(result={}):
"""Returns the input prompt by subsituting into self.input_prompt_template"""
pass
def outputPrompt(result):
"""Returns the output prompt by subsituting into self.output_prompt_template"""
pass
def continuationPrompt():
"""Returns the continuation prompt by subsituting into self.continuation_prompt_template"""
pass
def is_complete(block):
"""Returns True if block is complete, False otherwise."""
pass
def compile_ast(block):
"""Compiles block to an _ast.AST"""
pass
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 def get_history_previous(currentBlock):
Barry Wark
fixes and tests for history
r1281 """Returns the block previous in the history. Saves currentBlock if
the history_cursor is currently at the end of the input history"""
Barry Wark
for code review
r1277 pass
Barry Wark
fixes and tests for history
r1281 def get_history_next():
Barry Wark
for code review
r1277 """Returns the next block in the history."""
pass
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
class FrontEndBase(object):
"""
FrontEndBase manages the state tasks for a CLI frontend:
- Input and output history management
- Input/continuation and output prompt generation
Some issues (due to possibly unavailable engine):
- How do we get the current cell number for the engine?
- How do we handle completions?
"""
zi.implements(IFrontEnd)
Barry Wark
for code review
r1277 zi.classProvides(IFrontEndFactory)
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
history_cursor = 0
current_indent_level = 0
input_prompt_template = string.Template(rc.prompt_in1)
output_prompt_template = string.Template(rc.prompt_out)
continuation_prompt_template = string.Template(rc.prompt_in2)
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
def inputPrompt(self, result={}):
"""Returns the current input prompt
It would be great to use ipython1.core.prompts.Prompt1 here
"""
result.setdefault('number','')
return self.input_prompt_template.safe_substitute(result)
def continuationPrompt(self):
"""Returns the current continuation prompt"""
return self.continuation_prompt_template.safe_substitute()
def outputPrompt(self, result):
"""Returns the output prompt for result"""
return self.output_prompt_template.safe_substitute(result)
def is_complete(self, block):
"""Determine if block is complete.
Parameters
block : string
Result
True if block can be sent to the engine without compile errors.
False otherwise.
"""
try:
Barry Wark
fixed frontendbase.FrontEndBase.is_complete
r1278 ast = self.compile_ast(block)
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 except:
return False
Barry Wark
fixed frontendbase.FrontEndBase.is_complete
r1278
lines = block.split('\n')
return (len(lines)==1 or str(lines[-1])=='')
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
def compile_ast(self, block):
"""Compile block to an AST
Parameters:
block : str
Result:
AST
Throws:
Exception if block cannot be compiled
"""
return compile(block, "<string>", "exec", _ast.PyCF_ONLY_AST)
def execute(self, block, blockID=None):
"""Execute the block and return result.
Parameters:
block : {str, AST}
blockID : any
Caller may provide an ID to identify this block. result['blockID'] := blockID
Result:
Deferred result of self.interpreter.execute
"""
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279
if(not self.is_complete(block)):
return Failure(Exception("Block is not compilable"))
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
if(blockID == None):
blockID = uuid.uuid4() #random UUID
d = self.engine.execute(block)
d.addCallback(self._add_block_id, blockID)
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 d.addCallback(self._add_history, block=block)
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 d.addCallback(self.update_cell_prompt)
d.addCallbacks(self.render_result, errback=self.render_error)
return d
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def _add_block_id(self, result, blockID):
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 """Add the blockID to result"""
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
result['blockID'] = blockID
return result
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 def _add_history(self, result, block=None):
"""Add block to the history"""
assert(block != None)
self.history.add_items([block])
self.history_cursor += 1
return result
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 def get_history_previous(self, currentBlock):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """ Returns previous history string and decrement history cursor.
"""
command = self.history.get_history_item(self.history_cursor - 1)
Barry Wark
fixes and tests for history
r1281
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 if command is not None:
Barry Wark
fixes and tests for history
r1281 if(self.history_cursor == len(self.history.input_cache)):
self.history.input_cache[self.history_cursor] = currentBlock
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self.history_cursor -= 1
return command
Barry Wark
fixes and tests for history
r1281 def get_history_next(self):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """ Returns next history string and increment history cursor.
"""
Barry Wark
fixes and tests for history
r1281 command = self.history.get_history_item(self.history_cursor+1)
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 if command is not None:
self.history_cursor += 1
return command
###
# Subclasses probably want to override these methods...
###
def update_cell_prompt(self, result):
"""Subclass may override to update the input prompt for a block.
Since this method will be called as a twisted.internet.defer.Deferred's callback,
implementations should return result when finished."""
return result
def render_result(self, result):
"""Subclasses must override to render result. Since this method will be called as a
twisted.internet.defer.Deferred's callback, implementations should return result
when finished."""
return result
def render_error(self, failure):
"""Subclasses must override to render the failure. Since this method will be called as a
twisted.internet.defer.Deferred's callback, implementations should return result
when finished."""
return failure