Show More
@@ -0,0 +1,256 b'' | |||
|
1 | // !$*UTF8*$! | |
|
2 | { | |
|
3 | archiveVersion = 1; | |
|
4 | classes = { | |
|
5 | }; | |
|
6 | objectVersion = 42; | |
|
7 | objects = { | |
|
8 | ||
|
9 | /* Begin PBXContainerItemProxy section */ | |
|
10 | 4C5B7ADB0E1A0BCD006CB905 /* PBXContainerItemProxy */ = { | |
|
11 | isa = PBXContainerItemProxy; | |
|
12 | containerPortal = 4C96F4FE0E199AB500B03430 /* Project object */; | |
|
13 | proxyType = 1; | |
|
14 | remoteGlobalIDString = 4C96F50C0E199AF100B03430 /* Cocoa Frontend Plugin */; | |
|
15 | remoteInfo = "Cocoa Frontend Plugin"; | |
|
16 | }; | |
|
17 | /* End PBXContainerItemProxy section */ | |
|
18 | ||
|
19 | /* Begin PBXFileReference section */ | |
|
20 | 4C5B7A8D0E1A0B4C006CB905 /* Plugin-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Plugin-Info.plist"; sourceTree = "<group>"; }; | |
|
21 | 4C5B7AD30E1A0BC8006CB905 /* Placeholder (Do Not Use).bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Placeholder (Do Not Use).bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; | |
|
22 | 4C5B7AD40E1A0BC8006CB905 /* Placeholder (Do Not Use)-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Placeholder (Do Not Use)-Info.plist"; sourceTree = "<group>"; }; | |
|
23 | /* End PBXFileReference section */ | |
|
24 | ||
|
25 | /* Begin PBXFrameworksBuildPhase section */ | |
|
26 | 4C5B7AD10E1A0BC8006CB905 /* Frameworks */ = { | |
|
27 | isa = PBXFrameworksBuildPhase; | |
|
28 | buildActionMask = 2147483647; | |
|
29 | files = ( | |
|
30 | ); | |
|
31 | runOnlyForDeploymentPostprocessing = 0; | |
|
32 | }; | |
|
33 | /* End PBXFrameworksBuildPhase section */ | |
|
34 | ||
|
35 | /* Begin PBXGroup section */ | |
|
36 | 4C5B7A8C0E1A0B4C006CB905 /* Products */ = { | |
|
37 | isa = PBXGroup; | |
|
38 | children = ( | |
|
39 | 4C5B7AD30E1A0BC8006CB905 /* Placeholder (Do Not Use).bundle */, | |
|
40 | ); | |
|
41 | name = Products; | |
|
42 | sourceTree = "<group>"; | |
|
43 | }; | |
|
44 | 4C96F4FC0E199AB500B03430 = { | |
|
45 | isa = PBXGroup; | |
|
46 | children = ( | |
|
47 | 4C5B7A8C0E1A0B4C006CB905 /* Products */, | |
|
48 | 4C5B7A8D0E1A0B4C006CB905 /* Plugin-Info.plist */, | |
|
49 | 4C5B7AD40E1A0BC8006CB905 /* Placeholder (Do Not Use)-Info.plist */, | |
|
50 | ); | |
|
51 | sourceTree = "<group>"; | |
|
52 | }; | |
|
53 | /* End PBXGroup section */ | |
|
54 | ||
|
55 | /* Begin PBXLegacyTarget section */ | |
|
56 | 4C96F50C0E199AF100B03430 /* Cocoa Frontend Plugin */ = { | |
|
57 | isa = PBXLegacyTarget; | |
|
58 | buildArgumentsString = "$(ACTION)"; | |
|
59 | buildConfigurationList = 4C96F5110E199B3300B03430 /* Build configuration list for PBXLegacyTarget "Cocoa Frontend Plugin" */; | |
|
60 | buildPhases = ( | |
|
61 | ); | |
|
62 | buildToolPath = /usr/bin/make; | |
|
63 | buildWorkingDirectory = ""; | |
|
64 | dependencies = ( | |
|
65 | ); | |
|
66 | name = "Cocoa Frontend Plugin"; | |
|
67 | passBuildSettingsInEnvironment = 1; | |
|
68 | productName = "Cocoa Frontend Plugin"; | |
|
69 | }; | |
|
70 | /* End PBXLegacyTarget section */ | |
|
71 | ||
|
72 | /* Begin PBXNativeTarget section */ | |
|
73 | 4C5B7AD20E1A0BC8006CB905 /* Placeholder (Do Not Use) */ = { | |
|
74 | isa = PBXNativeTarget; | |
|
75 | buildConfigurationList = 4C5B7ADA0E1A0BC9006CB905 /* Build configuration list for PBXNativeTarget "Placeholder (Do Not Use)" */; | |
|
76 | buildPhases = ( | |
|
77 | 4C5B7ACF0E1A0BC8006CB905 /* Resources */, | |
|
78 | 4C5B7AD00E1A0BC8006CB905 /* Sources */, | |
|
79 | 4C5B7AD10E1A0BC8006CB905 /* Frameworks */, | |
|
80 | ); | |
|
81 | buildRules = ( | |
|
82 | ); | |
|
83 | dependencies = ( | |
|
84 | 4C5B7ADC0E1A0BCD006CB905 /* PBXTargetDependency */, | |
|
85 | ); | |
|
86 | name = "Placeholder (Do Not Use)"; | |
|
87 | productName = "Placeholder (Do Not Use)"; | |
|
88 | productReference = 4C5B7AD30E1A0BC8006CB905 /* Placeholder (Do Not Use).bundle */; | |
|
89 | productType = "com.apple.product-type.bundle"; | |
|
90 | }; | |
|
91 | /* End PBXNativeTarget section */ | |
|
92 | ||
|
93 | /* Begin PBXProject section */ | |
|
94 | 4C96F4FE0E199AB500B03430 /* Project object */ = { | |
|
95 | isa = PBXProject; | |
|
96 | buildConfigurationList = 4C96F5010E199AB500B03430 /* Build configuration list for PBXProject "CocoaFrontendPlugin" */; | |
|
97 | compatibilityVersion = "Xcode 2.4"; | |
|
98 | hasScannedForEncodings = 0; | |
|
99 | mainGroup = 4C96F4FC0E199AB500B03430; | |
|
100 | productRefGroup = 4C5B7A8C0E1A0B4C006CB905 /* Products */; | |
|
101 | projectDirPath = ""; | |
|
102 | projectRoot = ""; | |
|
103 | targets = ( | |
|
104 | 4C96F50C0E199AF100B03430 /* Cocoa Frontend Plugin */, | |
|
105 | 4C5B7AD20E1A0BC8006CB905 /* Placeholder (Do Not Use) */, | |
|
106 | ); | |
|
107 | }; | |
|
108 | /* End PBXProject section */ | |
|
109 | ||
|
110 | /* Begin PBXResourcesBuildPhase section */ | |
|
111 | 4C5B7ACF0E1A0BC8006CB905 /* Resources */ = { | |
|
112 | isa = PBXResourcesBuildPhase; | |
|
113 | buildActionMask = 2147483647; | |
|
114 | files = ( | |
|
115 | ); | |
|
116 | runOnlyForDeploymentPostprocessing = 0; | |
|
117 | }; | |
|
118 | /* End PBXResourcesBuildPhase section */ | |
|
119 | ||
|
120 | /* Begin PBXSourcesBuildPhase section */ | |
|
121 | 4C5B7AD00E1A0BC8006CB905 /* Sources */ = { | |
|
122 | isa = PBXSourcesBuildPhase; | |
|
123 | buildActionMask = 2147483647; | |
|
124 | files = ( | |
|
125 | ); | |
|
126 | runOnlyForDeploymentPostprocessing = 0; | |
|
127 | }; | |
|
128 | /* End PBXSourcesBuildPhase section */ | |
|
129 | ||
|
130 | /* Begin PBXTargetDependency section */ | |
|
131 | 4C5B7ADC0E1A0BCD006CB905 /* PBXTargetDependency */ = { | |
|
132 | isa = PBXTargetDependency; | |
|
133 | target = 4C96F50C0E199AF100B03430 /* Cocoa Frontend Plugin */; | |
|
134 | targetProxy = 4C5B7ADB0E1A0BCD006CB905 /* PBXContainerItemProxy */; | |
|
135 | }; | |
|
136 | /* End PBXTargetDependency section */ | |
|
137 | ||
|
138 | /* Begin XCBuildConfiguration section */ | |
|
139 | 4C5B7AD50E1A0BC9006CB905 /* Debug */ = { | |
|
140 | isa = XCBuildConfiguration; | |
|
141 | buildSettings = { | |
|
142 | COPY_PHASE_STRIP = NO; | |
|
143 | GCC_DYNAMIC_NO_PIC = NO; | |
|
144 | GCC_ENABLE_FIX_AND_CONTINUE = YES; | |
|
145 | GCC_MODEL_TUNING = G5; | |
|
146 | GCC_OPTIMIZATION_LEVEL = 0; | |
|
147 | GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
|
148 | GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; | |
|
149 | INFOPLIST_FILE = "Placeholder (Do Not Use)-Info.plist"; | |
|
150 | INSTALL_PATH = "$(HOME)/Library/Bundles"; | |
|
151 | OTHER_LDFLAGS = ( | |
|
152 | "-framework", | |
|
153 | Foundation, | |
|
154 | "-framework", | |
|
155 | AppKit, | |
|
156 | ); | |
|
157 | PREBINDING = NO; | |
|
158 | PRODUCT_NAME = "Placeholder (Do Not Use)"; | |
|
159 | WRAPPER_EXTENSION = bundle; | |
|
160 | ZERO_LINK = YES; | |
|
161 | }; | |
|
162 | name = Debug; | |
|
163 | }; | |
|
164 | 4C5B7AD60E1A0BC9006CB905 /* Release */ = { | |
|
165 | isa = XCBuildConfiguration; | |
|
166 | buildSettings = { | |
|
167 | COPY_PHASE_STRIP = YES; | |
|
168 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | |
|
169 | GCC_ENABLE_FIX_AND_CONTINUE = NO; | |
|
170 | GCC_MODEL_TUNING = G5; | |
|
171 | GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
|
172 | GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; | |
|
173 | INFOPLIST_FILE = "Placeholder (Do Not Use)-Info.plist"; | |
|
174 | INSTALL_PATH = "$(HOME)/Library/Bundles"; | |
|
175 | OTHER_LDFLAGS = ( | |
|
176 | "-framework", | |
|
177 | Foundation, | |
|
178 | "-framework", | |
|
179 | AppKit, | |
|
180 | ); | |
|
181 | PREBINDING = NO; | |
|
182 | PRODUCT_NAME = "Placeholder (Do Not Use)"; | |
|
183 | WRAPPER_EXTENSION = bundle; | |
|
184 | ZERO_LINK = NO; | |
|
185 | }; | |
|
186 | name = Release; | |
|
187 | }; | |
|
188 | 4C96F4FF0E199AB500B03430 /* Debug */ = { | |
|
189 | isa = XCBuildConfiguration; | |
|
190 | buildSettings = { | |
|
191 | COPY_PHASE_STRIP = NO; | |
|
192 | }; | |
|
193 | name = Debug; | |
|
194 | }; | |
|
195 | 4C96F5000E199AB500B03430 /* Release */ = { | |
|
196 | isa = XCBuildConfiguration; | |
|
197 | buildSettings = { | |
|
198 | COPY_PHASE_STRIP = YES; | |
|
199 | }; | |
|
200 | name = Release; | |
|
201 | }; | |
|
202 | 4C96F50D0E199AF100B03430 /* Debug */ = { | |
|
203 | isa = XCBuildConfiguration; | |
|
204 | buildSettings = { | |
|
205 | COPY_PHASE_STRIP = NO; | |
|
206 | GCC_DYNAMIC_NO_PIC = NO; | |
|
207 | GCC_OPTIMIZATION_LEVEL = 0; | |
|
208 | PRODUCT_NAME = "Cocoa Frontend Plugin"; | |
|
209 | }; | |
|
210 | name = Debug; | |
|
211 | }; | |
|
212 | 4C96F50E0E199AF100B03430 /* Release */ = { | |
|
213 | isa = XCBuildConfiguration; | |
|
214 | buildSettings = { | |
|
215 | COPY_PHASE_STRIP = YES; | |
|
216 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | |
|
217 | GCC_ENABLE_FIX_AND_CONTINUE = NO; | |
|
218 | PRODUCT_NAME = "Cocoa Frontend Plugin"; | |
|
219 | ZERO_LINK = NO; | |
|
220 | }; | |
|
221 | name = Release; | |
|
222 | }; | |
|
223 | /* End XCBuildConfiguration section */ | |
|
224 | ||
|
225 | /* Begin XCConfigurationList section */ | |
|
226 | 4C5B7ADA0E1A0BC9006CB905 /* Build configuration list for PBXNativeTarget "Placeholder (Do Not Use)" */ = { | |
|
227 | isa = XCConfigurationList; | |
|
228 | buildConfigurations = ( | |
|
229 | 4C5B7AD50E1A0BC9006CB905 /* Debug */, | |
|
230 | 4C5B7AD60E1A0BC9006CB905 /* Release */, | |
|
231 | ); | |
|
232 | defaultConfigurationIsVisible = 0; | |
|
233 | defaultConfigurationName = Release; | |
|
234 | }; | |
|
235 | 4C96F5010E199AB500B03430 /* Build configuration list for PBXProject "CocoaFrontendPlugin" */ = { | |
|
236 | isa = XCConfigurationList; | |
|
237 | buildConfigurations = ( | |
|
238 | 4C96F4FF0E199AB500B03430 /* Debug */, | |
|
239 | 4C96F5000E199AB500B03430 /* Release */, | |
|
240 | ); | |
|
241 | defaultConfigurationIsVisible = 0; | |
|
242 | defaultConfigurationName = Release; | |
|
243 | }; | |
|
244 | 4C96F5110E199B3300B03430 /* Build configuration list for PBXLegacyTarget "Cocoa Frontend Plugin" */ = { | |
|
245 | isa = XCConfigurationList; | |
|
246 | buildConfigurations = ( | |
|
247 | 4C96F50D0E199AF100B03430 /* Debug */, | |
|
248 | 4C96F50E0E199AF100B03430 /* Release */, | |
|
249 | ); | |
|
250 | defaultConfigurationIsVisible = 0; | |
|
251 | defaultConfigurationName = Release; | |
|
252 | }; | |
|
253 | /* End XCConfigurationList section */ | |
|
254 | }; | |
|
255 | rootObject = 4C96F4FE0E199AB500B03430 /* Project object */; | |
|
256 | } |
@@ -0,0 +1,25 b'' | |||
|
1 | # encoding: utf-8 | |
|
2 | """ | |
|
3 | Provides a namespace for loading the Cocoa frontend via a Cocoa plugin. | |
|
4 | ||
|
5 | Author: Barry Wark | |
|
6 | """ | |
|
7 | __docformat__ = "restructuredtext en" | |
|
8 | ||
|
9 | #----------------------------------------------------------------------------- | |
|
10 | # Copyright (C) 2008 The IPython Development Team | |
|
11 | # | |
|
12 | # Distributed under the terms of the BSD License. The full license is in | |
|
13 | # the file COPYING, distributed as part of this software. | |
|
14 | #----------------------------------------------------------------------------- | |
|
15 | ||
|
16 | from PyObjCTools import AppHelper | |
|
17 | from twisted.internet import _threadedselect | |
|
18 | ||
|
19 | #make sure _threadedselect is installed first | |
|
20 | reactor = _threadedselect.install() | |
|
21 | ||
|
22 | # load the Cocoa frontend controller | |
|
23 | from IPython.frontend.cocoa.cocoa_frontend import IPythonCocoaController | |
|
24 | reactor.interleave(AppHelper.callAfter) | |
|
25 | assert(reactor.running) |
@@ -0,0 +1,20 b'' | |||
|
1 | <?xml version="1.0" encoding="UTF-8"?> | |
|
2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
|
3 | <plist version="1.0"> | |
|
4 | <dict> | |
|
5 | <key>CFBundleDevelopmentRegion</key> | |
|
6 | <string>English</string> | |
|
7 | <key>CFBundleExecutable</key> | |
|
8 | <string>${EXECUTABLE_NAME}</string> | |
|
9 | <key>CFBundleIdentifier</key> | |
|
10 | <string>com.yourcompany.Placeholder (Do Not Use)</string> | |
|
11 | <key>CFBundleInfoDictionaryVersion</key> | |
|
12 | <string>6.0</string> | |
|
13 | <key>CFBundlePackageType</key> | |
|
14 | <string>BNDL</string> | |
|
15 | <key>CFBundleSignature</key> | |
|
16 | <string>????</string> | |
|
17 | <key>CFBundleVersion</key> | |
|
18 | <string>1.0</string> | |
|
19 | </dict> | |
|
20 | </plist> |
@@ -40,7 +40,7 b' from pprint import saferepr' | |||
|
40 | 40 | |
|
41 | 41 | import IPython |
|
42 | 42 | from IPython.kernel.engineservice import ThreadedEngineService |
|
43 | from IPython.frontend.frontendbase import FrontEndBase | |
|
43 | from IPython.frontend.frontendbase import AsynchronousFrontEndBase | |
|
44 | 44 | |
|
45 | 45 | from twisted.internet.threads import blockingCallFromThread |
|
46 | 46 | from twisted.python.failure import Failure |
@@ -96,14 +96,14 b' class AutoreleasePoolWrappedThreadedEngineService(ThreadedEngineService):' | |||
|
96 | 96 | return d |
|
97 | 97 | |
|
98 | 98 | |
|
99 | class IPythonCocoaController(NSObject, FrontEndBase): | |
|
99 | class IPythonCocoaController(NSObject, AsynchronousFrontEndBase): | |
|
100 | 100 | userNS = objc.ivar() #mirror of engine.user_ns (key=>str(value)) |
|
101 | 101 | waitingForEngine = objc.ivar().bool() |
|
102 | 102 | textView = objc.IBOutlet() |
|
103 | 103 | |
|
104 | 104 | def init(self): |
|
105 | 105 | self = super(IPythonCocoaController, self).init() |
|
106 | FrontEndBase.__init__(self, | |
|
106 | AsynchronousFrontEndBase.__init__(self, | |
|
107 | 107 | engine=AutoreleasePoolWrappedThreadedEngineService()) |
|
108 | 108 | if(self != None): |
|
109 | 109 | self._common_init() |
@@ -29,6 +29,7 b' setup(' | |||
|
29 | 29 | setup_requires=['py2app'], |
|
30 | 30 | options=dict(py2app=dict( |
|
31 | 31 | plist=infoPlist, |
|
32 | excludes=['IPython','twisted'] | |
|
32 | site_packages=True, | |
|
33 | excludes=['IPython','twisted','PyObjCTools'] | |
|
33 | 34 | )), |
|
34 | 35 | ) No newline at end of file |
@@ -159,9 +159,6 b' class FrontEndBase(object):' | |||
|
159 | 159 | - How do we handle completions? |
|
160 | 160 | """ |
|
161 | 161 | |
|
162 | zi.implements(IFrontEnd) | |
|
163 | zi.classProvides(IFrontEndFactory) | |
|
164 | ||
|
165 | 162 | history_cursor = 0 |
|
166 | 163 | |
|
167 | 164 | current_indent_level = 0 |
@@ -171,9 +168,8 b' class FrontEndBase(object):' | |||
|
171 | 168 | output_prompt_template = string.Template(rc.prompt_out) |
|
172 | 169 | continuation_prompt_template = string.Template(rc.prompt_in2) |
|
173 | 170 | |
|
174 |
def __init__(self, |
|
|
175 | assert(engine==None or IEngineCore.providedBy(engine)) | |
|
176 | self.engine = IEngineCore(engine) | |
|
171 | def __init__(self, shell=None, history=None): | |
|
172 | self.shell = shell | |
|
177 | 173 | if history is None: |
|
178 | 174 | self.history = FrontEndHistory(input_cache=['']) |
|
179 | 175 | else: |
@@ -236,7 +232,7 b' class FrontEndBase(object):' | |||
|
236 | 232 | |
|
237 | 233 | |
|
238 | 234 | def execute(self, block, blockID=None): |
|
239 | """Execute the block and return result. | |
|
235 | """Execute the block and return the result. | |
|
240 | 236 | |
|
241 | 237 | Parameters: |
|
242 | 238 | block : {str, AST} |
@@ -249,22 +245,23 b' class FrontEndBase(object):' | |||
|
249 | 245 | """ |
|
250 | 246 | |
|
251 | 247 | if(not self.is_complete(block)): |
|
252 |
re |
|
|
248 | raise Exception("Block is not compilable") | |
|
253 | 249 | |
|
254 | 250 | if(blockID == None): |
|
255 | 251 | blockID = uuid.uuid4() #random UUID |
|
256 | 252 | |
|
257 | d = self.engine.execute(block) | |
|
258 | d.addCallback(self._add_history, block=block) | |
|
259 | d.addCallbacks(self._add_block_id_for_result, | |
|
260 |
|
|
|
261 | callbackArgs=(blockID,), | |
|
262 | errbackArgs=(blockID,)) | |
|
263 | d.addBoth(self.update_cell_prompt, blockID=blockID) | |
|
264 | d.addCallbacks(self.render_result, | |
|
265 | errback=self.render_error) | |
|
253 | try: | |
|
254 | result = self.shell.execute(block) | |
|
255 | except Exception,e: | |
|
256 | e = self._add_block_id_for_failure(e, blockID=blockID) | |
|
257 | e = self.update_cell_prompt(e, blockID=blockID) | |
|
258 | e = self.render_error(e) | |
|
259 | else: | |
|
260 | result = self._add_block_id_for_result(result, blockID=blockID) | |
|
261 | result = self.update_cell_prompt(result, blockID=blockID) | |
|
262 | result = self.render_result(result) | |
|
266 | 263 | |
|
267 |
return |
|
|
264 | return result | |
|
268 | 265 | |
|
269 | 266 | |
|
270 | 267 | def _add_block_id_for_result(self, result, blockID): |
@@ -347,3 +344,53 b' class FrontEndBase(object):' | |||
|
347 | 344 | |
|
348 | 345 | |
|
349 | 346 | |
|
347 | class AsynchronousFrontEndBase(FrontEndBase): | |
|
348 | """ | |
|
349 | Overrides FrontEndBase to wrap execute in a deferred result. | |
|
350 | All callbacks are made as callbacks on the deferred result. | |
|
351 | """ | |
|
352 | ||
|
353 | zi.implements(IFrontEnd) | |
|
354 | zi.classProvides(IFrontEndFactory) | |
|
355 | ||
|
356 | def __init__(self, engine=None, history=None): | |
|
357 | assert(engine==None or IEngineCore.providedBy(engine)) | |
|
358 | self.engine = IEngineCore(engine) | |
|
359 | if history is None: | |
|
360 | self.history = FrontEndHistory(input_cache=['']) | |
|
361 | else: | |
|
362 | self.history = history | |
|
363 | ||
|
364 | ||
|
365 | def execute(self, block, blockID=None): | |
|
366 | """Execute the block and return the deferred result. | |
|
367 | ||
|
368 | Parameters: | |
|
369 | block : {str, AST} | |
|
370 | blockID : any | |
|
371 | Caller may provide an ID to identify this block. | |
|
372 | result['blockID'] := blockID | |
|
373 | ||
|
374 | Result: | |
|
375 | Deferred result of self.interpreter.execute | |
|
376 | """ | |
|
377 | ||
|
378 | if(not self.is_complete(block)): | |
|
379 | return Failure(Exception("Block is not compilable")) | |
|
380 | ||
|
381 | if(blockID == None): | |
|
382 | blockID = uuid.uuid4() #random UUID | |
|
383 | ||
|
384 | d = self.engine.execute(block) | |
|
385 | d.addCallback(self._add_history, block=block) | |
|
386 | d.addCallbacks(self._add_block_id_for_result, | |
|
387 | errback=self._add_block_id_for_failure, | |
|
388 | callbackArgs=(blockID,), | |
|
389 | errbackArgs=(blockID,)) | |
|
390 | d.addBoth(self.update_cell_prompt, blockID=blockID) | |
|
391 | d.addCallbacks(self.render_result, | |
|
392 | errback=self.render_error) | |
|
393 | ||
|
394 | return d | |
|
395 | ||
|
396 |
@@ -19,7 +19,7 b' import unittest' | |||
|
19 | 19 | from IPython.frontend import frontendbase |
|
20 | 20 | from IPython.kernel.engineservice import EngineService |
|
21 | 21 | |
|
22 | class FrontEndCallbackChecker(frontendbase.FrontEndBase): | |
|
22 | class FrontEndCallbackChecker(frontendbase.AsynchronousFrontEndBase): | |
|
23 | 23 | """FrontEndBase subclass for checking callbacks""" |
|
24 | 24 | def __init__(self, engine=None, history=None): |
|
25 | 25 | super(FrontEndCallbackChecker, self).__init__(engine=engine, |
@@ -44,7 +44,7 b' class FrontEndCallbackChecker(frontendbase.FrontEndBase):' | |||
|
44 | 44 | |
|
45 | 45 | |
|
46 | 46 | |
|
47 | class TestFrontendBase(unittest.TestCase): | |
|
47 | class TestAsynchronousFrontendBase(unittest.TestCase): | |
|
48 | 48 | def setUp(self): |
|
49 | 49 | """Setup the EngineService and FrontEndBase""" |
|
50 | 50 | |
@@ -53,7 +53,7 b' class TestFrontendBase(unittest.TestCase):' | |||
|
53 | 53 | |
|
54 | 54 | def test_implements_IFrontEnd(self): |
|
55 | 55 | assert(frontendbase.IFrontEnd.implementedBy( |
|
56 |
|
|
|
56 | frontendbase.AsynchronousFrontEndBase)) | |
|
57 | 57 | |
|
58 | 58 | |
|
59 | 59 | def test_is_complete_returns_False_for_incomplete_block(self): |
General Comments 0
You need to be logged in to leave comments.
Login now