Show More
@@ -1,15 +1,15 b'' | |||||
1 | # encoding: utf-8 |
|
1 | # encoding: utf-8 | |
2 | """ |
|
2 | """ | |
3 | FrontEndBase: Base classes for frontends. |
|
3 | frontendbase provides an interface and base class for GUI frontends for IPython.kernel/IPython.kernel.core. | |
4 |
|
4 | |||
5 | Todo: |
|
5 | Frontend implementations will likely want to subclass FrontEndBase. | |
6 | - synchronous and asynchronous interfaces |
|
6 | ||
7 | - adapter to add async to FrontEndBase |
|
7 | Author: Barry Wark | |
8 | """ |
|
8 | """ | |
9 | __docformat__ = "restructuredtext en" |
|
9 | __docformat__ = "restructuredtext en" | |
10 |
|
10 | |||
11 | #------------------------------------------------------------------------------- |
|
11 | #------------------------------------------------------------------------------- | |
12 | # Copyright (C) 2008 Barry Wark <barrywark at gmail _dot_ com> |
|
12 | # Copyright (C) 2008 The IPython Development Team | |
13 | # |
|
13 | # | |
14 | # Distributed under the terms of the BSD License. The full license is in |
|
14 | # Distributed under the terms of the BSD License. The full license is in | |
15 | # the file COPYING, distributed as part of this software. |
|
15 | # the file COPYING, distributed as part of this software. | |
@@ -42,26 +42,32 b" rc.prompt_out = r'Out [$number]: '" | |||||
42 |
|
42 | |||
43 | ############################################################################## |
|
43 | ############################################################################## | |
44 |
|
44 | |||
45 | class IFrontEnd(zi.Interface): |
|
45 | class IFrontEndFactory(zi.Interface): | |
46 |
""" |
|
46 | """Factory interface for frontends.""" | |
47 |
|
47 | |||
48 | zi.Attribute("input_prompt_template", "string.Template instance substituteable with execute result.") |
|
48 | def __call__(engine=None, history=None): | |
49 | zi.Attribute("output_prompt_template", "string.Template instance substituteable with execute result.") |
|
|||
50 | zi.Attribute("continuation_prompt_template", "string.Template instance substituteable with execute result.") |
|
|||
51 |
|
||||
52 | def __init__(engine=None, history=None): |
|
|||
53 | """ |
|
49 | """ | |
54 | Parameters: |
|
50 | Parameters: | |
55 | interpreter : IPython.kernel.engineservice.IEngineCore |
|
51 | interpreter : IPython.kernel.engineservice.IEngineCore | |
56 | """ |
|
52 | """ | |
|
53 | ||||
57 | pass |
|
54 | pass | |
58 |
|
55 | |||
|
56 | ||||
|
57 | ||||
|
58 | class IFrontEnd(zi.Interface): | |||
|
59 | """Interface for frontends. All methods return t.i.d.Deferred""" | |||
|
60 | ||||
|
61 | zi.Attribute("input_prompt_template", "string.Template instance substituteable with execute result.") | |||
|
62 | zi.Attribute("output_prompt_template", "string.Template instance substituteable with execute result.") | |||
|
63 | zi.Attribute("continuation_prompt_template", "string.Template instance substituteable with execute result.") | |||
|
64 | ||||
59 | def update_cell_prompt(self, result): |
|
65 | def update_cell_prompt(self, result): | |
60 | """Subclass may override to update the input prompt for a block. |
|
66 | """Subclass may override to update the input prompt for a block. | |
61 | Since this method will be called as a twisted.internet.defer.Deferred's callback, |
|
67 | Since this method will be called as a twisted.internet.defer.Deferred's callback, | |
62 | implementations should return result when finished.""" |
|
68 | implementations should return result when finished.""" | |
63 |
|
69 | |||
64 | return result |
|
70 | pass | |
65 |
|
71 | |||
66 | def render_result(self, result): |
|
72 | def render_result(self, result): | |
67 | """Render the result of an execute call. Implementors may choose the method of rendering. |
|
73 | """Render the result of an execute call. Implementors may choose the method of rendering. | |
@@ -74,16 +80,50 b' class IFrontEnd(zi.Interface):' | |||||
74 | Output of frontend rendering |
|
80 | Output of frontend rendering | |
75 | """ |
|
81 | """ | |
76 |
|
82 | |||
77 | return result |
|
83 | pass | |
78 |
|
84 | |||
79 | def render_error(self, failure): |
|
85 | def render_error(self, failure): | |
80 | """Subclasses must override to render the failure. Since this method will be called as a |
|
86 | """Subclasses must override to render the failure. Since this method will be called as a | |
81 | twisted.internet.defer.Deferred's callback, implementations should return result |
|
87 | twisted.internet.defer.Deferred's callback, implementations should return result | |
82 | when finished.""" |
|
88 | when finished.""" | |
83 |
|
89 | |||
84 | return failure |
|
90 | pass | |
|
91 | ||||
|
92 | ||||
|
93 | def inputPrompt(result={}): | |||
|
94 | """Returns the input prompt by subsituting into self.input_prompt_template""" | |||
|
95 | pass | |||
|
96 | ||||
|
97 | def outputPrompt(result): | |||
|
98 | """Returns the output prompt by subsituting into self.output_prompt_template""" | |||
|
99 | ||||
|
100 | pass | |||
|
101 | ||||
|
102 | def continuationPrompt(): | |||
|
103 | """Returns the continuation prompt by subsituting into self.continuation_prompt_template""" | |||
|
104 | ||||
|
105 | pass | |||
|
106 | ||||
|
107 | def is_complete(block): | |||
|
108 | """Returns True if block is complete, False otherwise.""" | |||
|
109 | ||||
|
110 | pass | |||
|
111 | ||||
|
112 | def compile_ast(block): | |||
|
113 | """Compiles block to an _ast.AST""" | |||
|
114 | ||||
|
115 | pass | |||
|
116 | ||||
|
117 | ||||
|
118 | def get_history_item_previous(currentBlock): | |||
|
119 | """Returns the block previous in the history.""" | |||
|
120 | pass | |||
|
121 | ||||
|
122 | def get_history_item_next(currentBlock): | |||
|
123 | """Returns the next block in the history.""" | |||
|
124 | ||||
|
125 | pass | |||
85 |
|
126 | |||
86 | # TODO: finish interface |
|
|||
87 |
|
127 | |||
88 | class FrontEndBase(object): |
|
128 | class FrontEndBase(object): | |
89 | """ |
|
129 | """ | |
@@ -97,6 +137,7 b' class FrontEndBase(object):' | |||||
97 | """ |
|
137 | """ | |
98 |
|
138 | |||
99 | zi.implements(IFrontEnd) |
|
139 | zi.implements(IFrontEnd) | |
|
140 | zi.classProvides(IFrontEndFactory) | |||
100 |
|
141 | |||
101 | history_cursor = 0 |
|
142 | history_cursor = 0 | |
102 |
|
143 | |||
@@ -204,22 +245,22 b' class FrontEndBase(object):' | |||||
204 | return result |
|
245 | return result | |
205 |
|
246 | |||
206 |
|
247 | |||
207 |
def get_history_item_previous(self, current |
|
248 | def get_history_item_previous(self, currentBlock): | |
208 | """ Returns previous history string and decrement history cursor. |
|
249 | """ Returns previous history string and decrement history cursor. | |
209 | """ |
|
250 | """ | |
210 | command = self.history.get_history_item(self.history_cursor - 1) |
|
251 | command = self.history.get_history_item(self.history_cursor - 1) | |
211 | if command is not None: |
|
252 | if command is not None: | |
212 |
self.history.input_cache[self.history_cursor] = current |
|
253 | self.history.input_cache[self.history_cursor] = currentBlock | |
213 | self.history_cursor -= 1 |
|
254 | self.history_cursor -= 1 | |
214 | return command |
|
255 | return command | |
215 |
|
256 | |||
216 |
|
257 | |||
217 |
def get_history_item_next(self, current |
|
258 | def get_history_item_next(self, currentBlock): | |
218 | """ Returns next history string and increment history cursor. |
|
259 | """ Returns next history string and increment history cursor. | |
219 | """ |
|
260 | """ | |
220 | command = self.history.get_history_item(self.history_cursor + 1) |
|
261 | command = self.history.get_history_item(self.history_cursor + 1) | |
221 | if command is not None: |
|
262 | if command is not None: | |
222 |
self.history.input_cache[self.history_cursor] = current |
|
263 | self.history.input_cache[self.history_cursor] = currentBlock | |
223 | self.history_cursor += 1 |
|
264 | self.history_cursor += 1 | |
224 | return command |
|
265 | return command | |
225 |
|
266 |
General Comments 0
You need to be logged in to leave comments.
Login now