Skip to content

Commit 0a24de3

Browse files
committed
refactor: modernize run-tests helpers with typing and safer subprocess handling
Suggested-by: firewave <firewave@users.noreply.github.com>
1 parent c48d0fd commit 0a24de3

1 file changed

Lines changed: 25 additions & 16 deletions

File tree

run-tests.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1+
from __future__ import annotations
12

23
import glob
34
import os
45
import shutil
56
import subprocess
67
import sys
8+
from typing import List, Tuple
79

8-
def cleanup(out):
9-
ret = ''
10-
for s in out.decode('utf-8').split('\n'):
11-
if len(s) > 1 and s[0] == '#':
10+
11+
def cleanup(out: str) -> str:
12+
parts = []
13+
for line in out.decode('utf-8').splitlines():
14+
if len(line) > 1 and line[0] == '#':
1215
continue
13-
s = "".join(s.split())
14-
ret = ret + s
15-
return ret
16+
parts.append("".join(line.split()))
17+
return "".join(parts)
1618

1719

1820
# Check for required compilers and exit if any are missing
@@ -93,15 +95,22 @@ def cleanup(out):
9395
]
9496

9597

96-
def run(compiler_executable, compiler_args):
97-
"""Execute a compiler command and capture its output."""
98-
compiler_cmd = [compiler_executable]
99-
compiler_cmd.extend(compiler_args)
100-
p = subprocess.Popen(compiler_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
101-
comm = p.communicate()
102-
exit_code = p.returncode
103-
output = cleanup(comm[0])
104-
error = comm[0].decode('utf-8').strip()
98+
def run(compiler_executable: str, compiler_args: List[str]) -> Tuple[int, str, str]:
99+
"""Execute a compiler command and capture its exit code, stdout, and stderr."""
100+
cmd = [compiler_executable, *compiler_args]
101+
102+
try:
103+
with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as process:
104+
stdout, stderr = process.communicate()
105+
exit_code = process.returncode
106+
except FileNotFoundError as e:
107+
# Compiler not found
108+
return (127, "", f"{e}")
109+
except Exception as e:
110+
return (1, "", f"{e}")
111+
112+
output = cleanup(stdout) # bytes -> str via cleanup
113+
error = (stderr or b"").decode("utf-8", errors="replace").strip()
105114
return (exit_code, output, error)
106115

107116

0 commit comments

Comments
 (0)