@@ -26,7 +26,7 @@ def execute(code_obj):
2626return TracebackSerializer ().format_exception (e )
2727
2828
29- def runner (code_source ,code ):
29+ def run_code (code_source ,code ):
3030if code_source == "shell" :
3131mode = "single"
3232code += "\n " # Allow compiling single-line compound statements
@@ -52,14 +52,15 @@ def runner(code_source, code):
5252print_friendly_syntax_error (e )
5353return {}
5454
55- birdseye_objects = None
55+ result = {}
5656
5757if code_source == "snoop" :
5858from core .workers .snoop import exec_snoop
5959traceback_info = exec_snoop (filename ,code ,code_obj )
6060elif code_source == "birdseye" :
6161from core .workers .birdseye import exec_birdseye
62- traceback_info ,birdseye_objects = exec_birdseye (filename ,code )
62+
63+ traceback_info ,result ["birdseye_objects" ]= exec_birdseye (filename ,code )
6364else :
6465traceback_info = execute (code_obj )
6566
@@ -74,52 +75,46 @@ def runner(code_source, code):
7475 )
7576output_buffer .parts .append (traceback_info )
7677
77- return birdseye_objects
78+ return result
7879
7980
80- def run_code_catch_internal_errors (entry ,input_callback ,result_callback ):
81+ def check_entry_catch_internal_errors (entry ,input_callback ,result_callback ):
8182try :
82- run_code (entry ,input_callback ,result_callback )
83+ check_entry (entry ,input_callback ,result_callback )
8384except Exception :
8485result_callback (internal_error_result ())
8586
8687
87- def run_code (entry ,input_callback ,result_callback ):
88+ def check_entry (entry ,input_callback ,result_callback ):
8889if hasattr (entry ,"to_py" ):
8990entry = entry .to_py ()
9091
9192patch_stdin (input_callback ,result_callback )
9293
9394with redirect_stdout (output_buffer .stdout ),redirect_stderr (output_buffer .stderr ):
94- birdseye_objects = runner (entry ["source" ],entry ["input" ])
95+ run_results = run_code (entry ["source" ],entry ["input" ])
9596
9697output = output_buffer .string ()
9798
9899page = pages [entry ["page_slug" ]]
99100step_cls = page .get_step (entry ["step_name" ])
100- step_instance = step_cls (entry ["input" ],output ,entry ["source" ],console )
101101
102102step_result = False
103103if entry ["step_name" ]!= "final_text" :
104+ step_instance = step_cls (entry ["input" ],output ,entry ["source" ],console )
104105try :
105106step_result = step_instance .check_with_messages ()
106107except SyntaxError :
107108pass
108109
109- messages = []
110- passed = step_result
111- if isinstance (step_result ,dict ):
112- passed = step_result .get ("passed" ,False )
113- messages = step_result .get ("messages" , [])
114- if "message" in step_result :
115- messages .append (step_result ["message" ])
116-
117- messages = [highlighted_markdown (message )for message in messages ]
110+ step_result = normalise_step_result (step_result )
111+ passed = step_result ["passed" ]
112+ messages = [highlighted_markdown (message )for message in step_result ["messages" ]]
118113
119114if passed :
120115prediction = dict (
121- choices = getattr ( step_cls , " predicted_output_choices" , None ) ,
122- answer = getattr ( step_cls , " correct_output" , None ) ,
116+ choices = step_cls . predicted_output_choices ,
117+ answer = step_cls . correct_output ,
123118 )
124119else :
125120prediction = None
@@ -129,12 +124,26 @@ def run_code(entry, input_callback, result_callback):
129124passed = passed ,
130125messages = messages ,
131126output = output ,
132- birdseye_objects = birdseye_objects ,
133127prediction = prediction ,
128+ ** run_results ,
134129 )
135130 )
136131
137132
133+ def normalise_step_result (step_result ):
134+ if not isinstance (step_result ,dict ):
135+ assert isinstance (step_result ,bool )
136+ step_result = dict (passed = step_result ,messages = [])
137+
138+ step_result .setdefault ("passed" ,False )
139+
140+ messages = step_result .setdefault ("messages" , [])
141+ if "message" in step_result :
142+ messages .append (step_result .pop ("message" ))
143+
144+ return step_result
145+
146+
138147def patch_stdin (input_callback ,result_callback ):
139148def readline (* _ ):
140149result_callback (make_result (awaiting_input = True ))