@@ -21,12 +21,20 @@ def running(self):
2121 return self .source and self .code_thread
2222
2323 def load_code (self , source ):
24+ """Prep code to be run"""
2425 self .source = source
2526 self .code_thread = None
2627
27- def run_code (self , input = None ):
28+ def _unload_code (self ):
29+ """Called when done running code"""
30+ self .source = None
31+ self .code_thread = None
32+ self .code_is_waiting = False
33+
34+ def run_code (self , for_code = None ):
2835 """Returns Truthy values if code finishes, False otherwise
2936
37+ if for_code is provided, send that value to the code thread
3038 if source code is complete, returns "done"
3139 if source code is incomplete, returns "unfinished"
3240 """
@@ -38,49 +46,51 @@ def run_code(self, input=None):
3846 else :
3947 assert self .code_is_waiting
4048 self .code_is_waiting = False
41- self .responses_for_code_thread .put (input )
49+ self .responses_for_code_thread .put (for_code )
4250
4351 request = self .requests_from_code_thread .get ()
44- if request [0 ] == 'done' :
45- self .source = None
46- self .code_thread = None
47- self .code_is_waiting = False
48- return 'unfinished' if request [1 ] else 'done'
49- else :
50- method , args , kwargs = request
52+ if request in ['wait' , 'refresh' ]:
5153 self .code_is_waiting = True
52- if method :
53- method (* args , ** kwargs )
54+ if request == 'refresh' :
5455 self .stuff_a_refresh_request ()
5556 return False
57+ elif request in ['done' , 'unfinished' ]:
58+ self ._unload_code ()
59+ return request
60+ else :
61+ raise ValueError ("Not a valid request_from_code_thread value: %r" % request )
5662
5763 def _blocking_run_code (self ):
5864 unfinished = self .interp .runsource (self .source )
59- self .requests_from_code_thread .put (('done' , unfinished ))
60- def _blocking_wait_for (self , method = lambda : None , args = [], kwargs = {}):
61- """The method the code would like to be called, or nothing
65+ self .requests_from_code_thread .put ('unfinished' if unfinished else 'done' )
66+
67+ def wait_and_get_value (self ):
68+ """Return the argument passed in to .run_code(for_code)
6269
6370 Nothing means calls to run_code must be...
64- does this thing even have a point? is it required for stdout.write?
6571 """
66- self .requests_from_code_thread .put ((method , args , kwargs ))
72+ self .requests_from_code_thread .put ('wait' )
73+ return self .responses_for_code_thread .get ()
74+
75+ def refresh_and_get_value (self ):
76+ """Returns the argument passed in to .run_code(for_code) """
77+ self .requests_from_code_thread .put ('refresh' )
6778 return self .responses_for_code_thread .get ()
6879
6980class FakeOutput (object ):
7081 def __init__ (self , coderunner , please ):
7182 self .coderunner = coderunner
7283 self .please = please
7384 def write (self , * args , ** kwargs ):
74- return self .coderunner ._blocking_wait_for (self .please , args , kwargs )
85+ self .please (* args , ** kwargs )
86+ return self .coderunner .refresh_and_get_value ()
7587
7688if __name__ == '__main__' :
7789 orig_stdout = sys .stdout
7890 orig_stderr = sys .stderr
7991 c = CodeRunner (stuff_a_refresh_request = lambda : orig_stdout .flush () or orig_stderr .flush ())
8092 stdout = FakeOutput (c , orig_stdout .write )
81- stderr = FakeOutput (c , orig_stderr .write )
8293 sys .stdout = stdout
83- sys .stderr = stderr
8494 c .load_code ('1 + 1' )
8595 c .run_code ()
8696 c .run_code ()
0 commit comments