Skip to content

Commit efe0b1b

Browse files
committed
remove temporary tmc json files before running python tmc commands
1 parent a2ceaf8 commit efe0b1b

File tree

1 file changed

+41
-21
lines changed

1 file changed

+41
-21
lines changed

tmc-langs-python3/src/plugin.rs

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)