@@ -38,22 +38,40 @@ impl LanguagePlugin for Python3Plugin {
3838 exercise_directory : & Path ,
3939 exercise_name : String ,
4040 ) -> Result < ExerciseDesc , TmcError > {
41- let run_result = run_tmc_command ( exercise_directory, & [ "available_points" ] , None ) ;
41+ let available_points_json = exercise_directory. join ( ".available_points.json" ) ;
42+ // remove any existing points json
43+ if available_points_json. exists ( ) {
44+ fs:: remove_file ( & available_points_json)
45+ . map_err ( |e| PythonError :: FileRemove ( available_points_json. clone ( ) , e) ) ?;
46+ }
4247
48+ let run_result = run_tmc_command ( exercise_directory, & [ "available_points" ] , None ) ;
4349 if let Err ( error) = run_result {
4450 log:: error!( "Failed to scan exercise. {}" , error) ;
4551 }
4652
47- let test_descs = parse_exercise_description ( exercise_directory) ?;
48- Ok ( ExerciseDesc :: new ( exercise_name, test_descs) )
53+ let test_descs_res = parse_exercise_description ( & available_points_json) ;
54+ // remove file regardless of parse success
55+ if available_points_json. exists ( ) {
56+ fs:: remove_file ( & available_points_json)
57+ . map_err ( |e| PythonError :: FileRemove ( available_points_json. clone ( ) , e) ) ?;
58+ }
59+ Ok ( ExerciseDesc :: new ( exercise_name, test_descs_res?) )
4960 }
5061
5162 fn run_tests_with_timeout (
5263 & self ,
53- path : & Path ,
64+ exercise_directory : & Path ,
5465 timeout : Option < Duration > ,
5566 ) -> Result < RunResult , TmcError > {
56- let output = run_tmc_command ( path, & [ ] , timeout) ?;
67+ let test_results_json = exercise_directory. join ( ".tmc_test_results.json" ) ;
68+ // remove any existing results json
69+ if test_results_json. exists ( ) {
70+ fs:: remove_file ( & test_results_json)
71+ . map_err ( |e| PythonError :: FileRemove ( test_results_json. clone ( ) , e) ) ?;
72+ }
73+
74+ let output = run_tmc_command ( exercise_directory, & [ ] , timeout) ?;
5775 if let OutputWithTimeout :: Timeout { .. } = output {
5876 return Ok ( RunResult {
5977 status : RunStatus :: TestsFailed ,
@@ -69,7 +87,14 @@ impl LanguagePlugin for Python3Plugin {
6987 logs : HashMap :: new ( ) ,
7088 } ) ;
7189 }
72- Ok ( parse_test_result ( path) ?)
90+
91+ let parse_res = parse_test_result ( & test_results_json) ;
92+ // remove file regardless of parse success
93+ if test_results_json. exists ( ) {
94+ fs:: remove_file ( & test_results_json)
95+ . map_err ( |e| PythonError :: FileRemove ( test_results_json. clone ( ) , e) ) ?;
96+ }
97+ Ok ( parse_res?)
7398 }
7499
75100 fn is_exercise_type_correct ( path : & Path ) -> bool {
@@ -137,29 +162,26 @@ fn run_tmc_command(
137162 Ok ( output)
138163}
139164
140- /// Parse and remove(!) exercise description file
141- fn parse_exercise_description ( exercise_directory : & Path ) -> Result < Vec < TestDesc > , PythonError > {
165+ /// Parse exercise description file
166+ fn parse_exercise_description ( available_points_json : & Path ) -> Result < Vec < TestDesc > , PythonError > {
142167 let mut test_descs = vec ! [ ] ;
143- let points_path = exercise_directory. join ( ".available_points.json" ) ;
144- let file =
145- File :: open ( & points_path) . map_err ( |e| PythonError :: FileOpen ( points_path. clone ( ) , e) ) ?;
168+ let file = File :: open ( & available_points_json)
169+ . map_err ( |e| PythonError :: FileOpen ( available_points_json. to_path_buf ( ) , e) ) ?;
146170 // TODO: deserialize directly into Vec<TestDesc>?
147171 let json: HashMap < String , Vec < String > > = serde_json:: from_reader ( BufReader :: new ( file) )
148- . map_err ( |e| PythonError :: Deserialize ( points_path . clone ( ) , e) ) ?;
172+ . map_err ( |e| PythonError :: Deserialize ( available_points_json . to_path_buf ( ) , e) ) ?;
149173 for ( key, value) in json {
150174 test_descs. push ( TestDesc :: new ( key, value) ) ;
151175 }
152- fs:: remove_file ( & points_path) . map_err ( |e| PythonError :: FileRemove ( points_path, e) ) ?;
153176 Ok ( test_descs)
154177}
155178
156- /// Parse and remove(!) test result file
157- fn parse_test_result ( exercise_directory : & Path ) -> Result < RunResult , PythonError > {
158- let test_results_path = exercise_directory. join ( ".tmc_test_results.json" ) ;
159- let results_file = File :: open ( & test_results_path)
160- . map_err ( |e| PythonError :: FileOpen ( test_results_path. clone ( ) , e) ) ?;
179+ /// Parse test result file
180+ fn parse_test_result ( test_results_json : & Path ) -> Result < RunResult , PythonError > {
181+ let results_file = File :: open ( & test_results_json)
182+ . map_err ( |e| PythonError :: FileOpen ( test_results_json. to_path_buf ( ) , e) ) ?;
161183 let test_results: Vec < PythonTestResult > = serde_json:: from_reader ( BufReader :: new ( results_file) )
162- . map_err ( |e| PythonError :: Deserialize ( test_results_path . clone ( ) , e) ) ?;
184+ . map_err ( |e| PythonError :: Deserialize ( test_results_json . to_path_buf ( ) , e) ) ?;
163185 let test_results: Vec < TestResult > = test_results
164186 . into_iter ( )
165187 . map ( PythonTestResult :: into_test_result)
@@ -171,8 +193,6 @@ fn parse_test_result(exercise_directory: &Path) -> Result<RunResult, PythonError
171193 status = RunStatus :: TestsFailed ;
172194 }
173195 }
174- fs:: remove_file ( & test_results_path)
175- . map_err ( |e| PythonError :: FileRemove ( test_results_path, e) ) ?;
176196 Ok ( RunResult :: new ( status, test_results, HashMap :: new ( ) ) )
177197}
178198
0 commit comments