brunneis's picture
Improve error handling, return hardhat output
fa58e66 unverified
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import subprocess
import shutil
import tempfile
from typing import Tuple
def evaluate_solution(task_id: str, solution: str) -> Tuple[bool, str]:
initial_dir = os.getcwd()
task_dir = task_id.replace('/', '_')
original_task_path = 'tasks/{}'.format(task_dir)
if not os.path.exists(original_task_path):
raise FileNotFoundError('Task not found: {}'.format(task_id))
with tempfile.TemporaryDirectory() as temp_dir:
temp_task_path = os.path.join(temp_dir, task_dir)
# Replicate the directory structure with symbolic links
shutil.copytree(
original_task_path,
temp_task_path,
symlinks=True,
dirs_exist_ok=True,
)
os.chdir(temp_task_path)
# Write solution with UTF-8 encoding
with open('contracts/Task.sol', 'w', encoding='utf-8') as f:
f.write(solution)
try:
result = subprocess.run(
['npx', 'hardhat', 'test'],
capture_output=True,
text=True,
check=True,
encoding='utf-8', # Specify UTF-8 encoding for subprocess
)
return True, result.stdout
except subprocess.CalledProcessError as e:
return False, e.stderr
finally:
os.chdir(initial_dir)