Show More
@@ -40,6 +40,7 b' from IPython.kernel.engineservice import EngineService, ThreadedEngineService' | |||
|
40 | 40 | from IPython.frontend.frontendbase import FrontEndBase |
|
41 | 41 | |
|
42 | 42 | from twisted.internet.threads import blockingCallFromThread |
|
43 | from twisted.python.failure import Failure | |
|
43 | 44 | |
|
44 | 45 | #------------------------------------------------------------------------------- |
|
45 | 46 | # Classes to implement the Cocoa frontend |
@@ -305,7 +306,12 b' class IPythonCocoaController(NSObject, FrontEndBase):' | |||
|
305 | 306 | return block[-1] |
|
306 | 307 | |
|
307 | 308 | def update_cell_prompt(self, result): |
|
308 | blockID = result['blockID'] | |
|
309 | if(isinstance(result, Failure)): | |
|
310 | blockID = result.blockID | |
|
311 | else: | |
|
312 | blockID = result['blockID'] | |
|
313 | ||
|
314 | ||
|
309 | 315 | self.insert_text(self.input_prompt(result=result), |
|
310 | 316 | textRange=NSMakeRange(self.blockRanges[blockID].location,0), |
|
311 | 317 | scrollToVisible=False |
@@ -234,18 +234,23 b' class FrontEndBase(object):' | |||
|
234 | 234 | blockID = uuid.uuid4() #random UUID |
|
235 | 235 | |
|
236 | 236 | d = self.engine.execute(block) |
|
237 | d.addCallback(self._add_block_id, blockID) | |
|
238 | 237 | d.addCallback(self._add_history, block=block) |
|
239 | d.addCallback(self.update_cell_prompt) | |
|
238 | d.addBoth(self._add_block_id, blockID) | |
|
239 | d.addBoth(self.update_cell_prompt) | |
|
240 | 240 | d.addCallbacks(self.render_result, errback=self.render_error) |
|
241 | 241 | |
|
242 | 242 | return d |
|
243 | 243 | |
|
244 | 244 | |
|
245 | 245 | def _add_block_id(self, result, blockID): |
|
246 | """Add the blockID to result""" | |
|
246 | """Add the blockID to result or failure. Unfortunatley, we have to treat failures | |
|
247 | differently than result dicts | |
|
248 | """ | |
|
247 | 249 | |
|
248 | result['blockID'] = blockID | |
|
250 | if(isinstance(result, Failure)): | |
|
251 | result.blockID = blockID | |
|
252 | else: | |
|
253 | result['blockID'] = blockID | |
|
249 | 254 | |
|
250 | 255 | return result |
|
251 | 256 | |
@@ -287,7 +292,17 b' class FrontEndBase(object):' | |||
|
287 | 292 | def update_cell_prompt(self, result): |
|
288 | 293 | """Subclass may override to update the input prompt for a block. |
|
289 | 294 | Since this method will be called as a twisted.internet.defer.Deferred's callback, |
|
290 |
implementations should return result when finished. |
|
|
295 | implementations should return result when finished. | |
|
296 | ||
|
297 | NP: result is a failure if the execute returned a failre. To get the blockID, you should | |
|
298 | do something like:: | |
|
299 | if(isinstance(result, twisted.python.failure.Failure)): | |
|
300 | blockID = result.blockID | |
|
301 | else: | |
|
302 | blockID = result['blockID'] | |
|
303 | ||
|
304 | ||
|
305 | """ | |
|
291 | 306 | |
|
292 | 307 | return result |
|
293 | 308 |
@@ -80,10 +80,20 b' class TestFrontendBase(unittest.TestCase):' | |||
|
80 | 80 | |
|
81 | 81 | d.addCallback(self.checkBlockID, expected='TEST_ID') |
|
82 | 82 | |
|
83 | def test_blockID_added_to_failure(self): | |
|
84 | block = "raise Exception()" | |
|
85 | ||
|
86 | d = self.fb.execute(block,blockID='TEST_ID') | |
|
87 | d.addErrback(self.checkFailureID, expected='TEST_ID') | |
|
88 | ||
|
83 | 89 | def checkBlockID(self, result, expected=""): |
|
84 | 90 | assert(result['blockID'] == expected) |
|
85 | 91 | |
|
86 | 92 | |
|
93 | def checkFailureID(self, failure, expected=""): | |
|
94 | assert(failure.blockID == expected) | |
|
95 | ||
|
96 | ||
|
87 | 97 | def test_callbacks_added_to_execute(self): |
|
88 | 98 | """test that |
|
89 | 99 | update_cell_prompt |
General Comments 0
You need to be logged in to leave comments.
Login now