##// END OF EJS Templates
Use io.BytesIO instead of StringIO
Use io.BytesIO instead of StringIO

File last commit:

r7787:28b538a9
r8239:0cd1e6db
Show More
frontendbase.py
343 lines | 10.1 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
pep8 compliance, first pass
r1291 # -*- test-case-name: IPython.frontend.tests.test_frontendbase -*-
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """
Bernardo B. Marques
remove all trailling spaces
r4872 frontendbase provides an interface and base class for GUI frontends for
Barry Wark
pep8 compliance, first pass
r1291 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
Bernardo B. Marques
remove all trailling spaces
r4872 Frontend implementations will likely want to subclass FrontEndBase.
Barry Wark
for code review
r1277
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"
#-------------------------------------------------------------------------------
Matthias BUSSONNIER
update copyright to 2011/20xx-2011...
r5390 # Copyright (C) 2008-2011 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
Gael Varoquaux
Replace all use of the ast module with the codeop module, and all use of...
r1710 import codeop
Thomas Spura
Delete all references to old IPython.external.guid...
r5807 import uuid
Fernando Perez
Partial fixes for 2.4 compatibility. Unfinished....
r1706
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Brian Granger
Fixed another bug related to missing dependencies in tests.
r1558 from IPython.frontend.zopeinterface import (
Bernardo B. Marques
remove all trailling spaces
r4872 Interface,
Attribute,
Brian Granger
Fixed another bug related to missing dependencies in tests.
r1558 )
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
##############################################################################
# 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]: '
##############################################################################
gvaroquaux
Clean up code, names, and docstrings.
r1455 # Interface definitions
##############################################################################
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
stubbed zope.interface and Twisted
r1313 class IFrontEndFactory(Interface):
Barry Wark
for code review
r1277 """Factory interface for frontends."""
Bernardo B. Marques
remove all trailling spaces
r4872
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
"""
Bernardo B. Marques
remove all trailling spaces
r4872
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
Barry Wark
stubbed zope.interface and Twisted
r1313 class IFrontEnd(Interface):
Barry Wark
for code review
r1277 """Interface for frontends. All methods return t.i.d.Deferred"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
stubbed zope.interface and Twisted
r1313 Attribute("input_prompt_template", "string.Template instance\
Barry Wark
pep8 compliance, first pass
r1291 substituteable with execute result.")
Barry Wark
stubbed zope.interface and Twisted
r1313 Attribute("output_prompt_template", "string.Template instance\
Barry Wark
pep8 compliance, first pass
r1291 substituteable with execute result.")
Barry Wark
stubbed zope.interface and Twisted
r1313 Attribute("continuation_prompt_template", "string.Template instance\
Barry Wark
pep8 compliance, first pass
r1291 substituteable with execute result.")
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 def update_cell_prompt(result, blockID=None):
Bernardo B. Marques
remove all trailling spaces
r4872 """Subclass may override to update the input prompt for a block.
gvaroquaux
Clean up code, names, and docstrings.
r1455
In asynchronous frontends, this method will be called as a
twisted.internet.defer.Deferred's callback/errback.
Implementations should thus return result when finished.
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 Result is a result dict in case of success, and a
twisted.python.util.failure.Failure in case of an error
Barry Wark
pep8, third pass
r1293 """
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
for code review
r1277 pass
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 def render_result(result):
Barry Wark
pep8 compliance, first pass
r1291 """Render the result of an execute call. Implementors may choose the
method of rendering.
Bernardo B. Marques
remove all trailling spaces
r4872 For example, a notebook-style frontend might render a Chaco plot
Barry Wark
pep8 compliance, first pass
r1291 inline.
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 Parameters:
result : dict (result of IEngineBase.execute )
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 blockID = result['blockID']
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 Result:
Output of frontend rendering
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
for code review
r1277 pass
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 def render_error(failure):
Bernardo B. Marques
remove all trailling spaces
r4872 """Subclasses must override to render the failure.
gvaroquaux
Clean up code, names, and docstrings.
r1455 In asynchronous frontend, since this method will be called as a
twisted.internet.defer.Deferred's callback. Implementations
should thus return result when finished.
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 blockID = failure.blockID
Barry Wark
pep8 compliance, first pass
r1291 """
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
for code review
r1277 pass
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
improved error rendering for cocoa_frontend
r1304 def input_prompt(number=''):
Bernardo B. Marques
remove all trailling spaces
r4872 """Returns the input prompt by subsituting into
Barry Wark
pep8 compliance, first pass
r1291 self.input_prompt_template
"""
Barry Wark
for code review
r1277 pass
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
improved error rendering for cocoa_frontend
r1304 def output_prompt(number=''):
Bernardo B. Marques
remove all trailling spaces
r4872 """Returns the output prompt by subsituting into
Barry Wark
pep8 compliance, first pass
r1291 self.output_prompt_template
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
for code review
r1277 pass
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
CammelCase fixed
r1282 def continuation_prompt():
Bernardo B. Marques
remove all trailling spaces
r4872 """Returns the continuation prompt by subsituting into
Barry Wark
pep8 compliance, first pass
r1291 self.continuation_prompt_template
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
for code review
r1277 pass
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
for code review
r1277 def is_complete(block):
"""Returns True if block is complete, False otherwise."""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
for code review
r1277 pass
Bernardo B. Marques
remove all trailling spaces
r4872
Gael Varoquaux
History is now working. + misc keybindings.
r1358 def get_history_previous(current_block):
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
Bernardo B. Marques
remove all trailling spaces
r4872
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."""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
for code review
r1277 pass
Bernardo B. Marques
remove all trailling spaces
r4872
gvaroquaux
Clean up code, names, and docstrings.
r1455 def complete(self, line):
"""Returns the list of possible completions, and the completed
line.
The input argument is the full line to be completed. This method
returns both the line completed as much as possible, and the list
of further possible completions (full words).
"""
pass
##############################################################################
Bernardo B. Marques
remove all trailling spaces
r4872 # Base class for all the frontends.
gvaroquaux
Clean up code, names, and docstrings.
r1455 ##############################################################################
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
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 Some issues (due to possibly unavailable engine):
- How do we get the current cell number for the engine?
- How do we handle completions?
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 history_cursor = 0
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 input_prompt_template = string.Template(rc.prompt_in1)
output_prompt_template = string.Template(rc.prompt_out)
continuation_prompt_template = string.Template(rc.prompt_in2)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
FrontEndBase is now synchronous.
r1306 def __init__(self, shell=None, history=None):
self.shell = shell
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 if history is None:
self.history = FrontEndHistory(input_cache=[''])
else:
self.history = history
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
improved error rendering for cocoa_frontend
r1304 def input_prompt(self, number=''):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """Returns the current input prompt
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 It would be great to use ipython1.core.prompts.Prompt1 here
"""
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 return self.input_prompt_template.safe_substitute({'number':number})
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
CammelCase fixed
r1282 def continuation_prompt(self):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """Returns the current continuation prompt"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return self.continuation_prompt_template.safe_substitute()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
improved error rendering for cocoa_frontend
r1304 def output_prompt(self, number=''):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """Returns the output prompt for result"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 return self.output_prompt_template.safe_substitute({'number':number})
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def is_complete(self, block):
"""Determine if block is complete.
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 Parameters
block : string
Bernardo B. Marques
remove all trailling spaces
r4872
Result
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 True if block can be sent to the engine without compile errors.
False otherwise.
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 try:
Gael Varoquaux
Replace all use of the ast module with the codeop module, and all use of...
r1710 is_complete = codeop.compile_command(block.rstrip() + '\n\n',
Bernardo B. Marques
remove all trailling spaces
r4872 "<string>", "exec")
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 except:
return False
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
fixed frontendbase.FrontEndBase.is_complete
r1278 lines = block.split('\n')
Bernardo B. Marques
remove all trailling spaces
r4872 return ((is_complete is not None)
Gael Varoquaux
Replace all use of the ast module with the codeop module, and all use of...
r1710 and (len(lines)==1 or str(lines[-1])==''))
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def execute(self, block, blockID=None):
Barry Wark
FrontEndBase is now synchronous.
r1306 """Execute the block and return the result.
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 Parameters:
block : {str, AST}
blockID : any
Bernardo B. Marques
remove all trailling spaces
r4872 Caller may provide an ID to identify this block.
Barry Wark
pep8 compliance, first pass
r1291 result['blockID'] := blockID
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 Result:
Deferred result of self.interpreter.execute
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
FrontEndBase is now synchronous.
r1306 if(not self.is_complete(block)):
raise Exception("Block is not compilable")
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
FrontEndBase is now synchronous.
r1306 if(blockID == None):
Thomas Spura
Delete all references to old IPython.external.guid...
r5807 blockID = uuid.uuid4()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
FrontEndBase is now synchronous.
r1306 try:
result = self.shell.execute(block)
Matthias BUSSONNIER
conform to pep 3110...
r7787 except Exception as e:
Barry Wark
FrontEndBase is now synchronous.
r1306 e = self._add_block_id_for_failure(e, blockID=blockID)
e = self.update_cell_prompt(e, blockID=blockID)
e = self.render_error(e)
else:
result = self._add_block_id_for_result(result, blockID=blockID)
result = self.update_cell_prompt(result, blockID=blockID)
result = self.render_result(result)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
FrontEndBase is now synchronous.
r1306 return result
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 def _add_block_id_for_result(self, result, blockID):
Bernardo B. Marques
remove all trailling spaces
r4872 """Add the blockID to result or failure. Unfortunatley, we have to
Barry Wark
pep8 compliance, first pass
r1291 treat failures differently than result dicts.
Barry Wark
added blockID for failures (special case)
r1283 """
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 result['blockID'] = blockID
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return result
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 def _add_block_id_for_failure(self, failure, blockID):
"""_add_block_id_for_failure"""
failure.blockID = blockID
return failure
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 def _add_history(self, result, block=None):
"""Add block to the history"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 assert(block != None)
self.history.add_items([block])
self.history_cursor += 1
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 return result
Bernardo B. Marques
remove all trailling spaces
r4872
Gael Varoquaux
History is now working. + misc keybindings.
r1358 def get_history_previous(self, current_block):
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)
Bernardo B. Marques
remove all trailling spaces
r4872
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:
Gael Varoquaux
History is now working. + misc keybindings.
r1358 if(self.history_cursor+1 == len(self.history.input_cache)):
self.history.input_cache[self.history_cursor] = current_block
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
Bernardo B. Marques
remove all trailling spaces
r4872
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)
Bernardo B. Marques
remove all trailling spaces
r4872
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
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 ###
# Subclasses probably want to override these methods...
###
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 def update_cell_prompt(self, result, blockID=None):
Bernardo B. Marques
remove all trailling spaces
r4872 """Subclass may override to update the input prompt for a block.
gvaroquaux
Clean up code, names, and docstrings.
r1455
This method only really makes sens in asyncrhonous frontend.
Bernardo B. Marques
remove all trailling spaces
r4872 Since this method will be called as a
twisted.internet.defer.Deferred's callback, implementations should
Barry Wark
pep8 compliance, first pass
r1291 return result when finished.
Barry Wark
added blockID for failures (special case)
r1283 """
Bernardo B. Marques
remove all trailling spaces
r4872
Gael Varoquaux
More tests of the frontend. Improve the ease of testing.
r1458 raise NotImplementedError
Bernardo B. Marques
remove all trailling spaces
r4872
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):
Bernardo B. Marques
remove all trailling spaces
r4872 """Subclasses must override to render result.
gvaroquaux
Clean up code, names, and docstrings.
r1455 In asynchronous frontends, this method will be called as a
twisted.internet.defer.Deferred's callback. Implementations
should thus return result when finished.
Barry Wark
pep8 compliance, first pass
r1291 """
Bernardo B. Marques
remove all trailling spaces
r4872
Gael Varoquaux
More tests of the frontend. Improve the ease of testing.
r1458 raise NotImplementedError
Bernardo B. Marques
remove all trailling spaces
r4872
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):
Bernardo B. Marques
remove all trailling spaces
r4872 """Subclasses must override to render the failure.
gvaroquaux
Clean up code, names, and docstrings.
r1455 In asynchronous frontends, this method will be called as a
twisted.internet.defer.Deferred's callback. Implementations
should thus return result when finished.
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 """
Bernardo B. Marques
remove all trailling spaces
r4872
Gael Varoquaux
More tests of the frontend. Improve the ease of testing.
r1458 raise NotImplementedError
Barry Wark
refactored FrontEndBase to base and AsynchronousFrontEndBase
r1305