Assistant: codex Assistant-Model: gpt-6.1-sol Assistant-Session: 01a126e1-76f8-7643-8cf3-e93336539ade
27 lines
2.9 KiB
Python
27 lines
2.9 KiB
Python
import subprocess,sys,os,json,re,shutil
|
|
from pathlib import Path
|
|
root=Path("/tmp/journey-source");shutil.copytree("/source",root);os.chdir(root)
|
|
env=os.environ.copy();env["PYTHONDONTWRITEBYTECODE"]="1";env["PYTHONPATH"]="src"
|
|
original=subprocess.run([sys.executable,"-m","unittest","discover","-s","tests"],env=env,capture_output=True,text=True)
|
|
text=original.stdout+original.stderr
|
|
summary={"original_exit":original.returncode,"original_exception_classes":sorted(set(re.findall(r"\b(?:ModuleNotFoundError|ImportError|AssertionError|RuntimeError|ValueError)\b",text))),"original_missing_pytest":"No module named 'pytest'" in text,"original_missing_jsonschema":"No module named 'jsonschema'" in text}
|
|
subprocess.run([sys.executable,"-m","venv","/tmp/ci-venv"],check=True,capture_output=True)
|
|
py="/tmp/ci-venv/bin/python"
|
|
install=subprocess.run([py,"-m","pip","install","--no-cache-dir",".[runtime]","pytest==8.4.2"],capture_output=True,text=True)
|
|
summary["dependency_install_exit"]=install.returncode
|
|
if install.returncode:
|
|
summary["install_error_classes"]=sorted(set(re.findall(r"\b(?:OSError|PermissionError|RuntimeError|ConnectionError|SSLError|ReadTimeoutError|ProxyError)\b",install.stdout+install.stderr)))
|
|
summary["install_failure_flags"]={v:(v in install.stdout+install.stderr) for v in ["Read-only file system","No space left on device","Temporary failure in name resolution","Failed to establish a new connection","No matching distribution found","Permission denied","Invalid requirement"]}
|
|
print(json.dumps(summary));raise SystemExit(install.returncode)
|
|
checks=[]
|
|
for argv in [[py,"-m","pytest","-q"],[py,"scripts/check_layer_conformance.py","--report"],[py,"scripts/run_journey_suites.py","--report","/tmp/journey-report.json"]]:
|
|
r=subprocess.run(argv,env=env,capture_output=True,text=True);combined=r.stdout+r.stderr
|
|
check={"argv":argv,"exit":r.returncode,"exception_classes":sorted(set(re.findall(r"\b(?:ModuleNotFoundError|ImportError|AssertionError|RuntimeError|ValueError)\b",combined)))}
|
|
if "pytest" in argv:check["failed_collection_modules"]=sorted(set(re.findall(r"(?:ERROR collecting |ERROR )(tests/[A-Za-z0-9_/.]+\.py)",combined)));check["summary"]=re.findall(r"(?:\d+ passed|\d+ skipped|\d+ failed|\d+ warnings?)",combined[-1000:])
|
|
if "--report" in argv and "check_layer_conformance.py" in argv[1]:check["accepted_v08_digest_named"]="3d8298560069ef471fba28d2b1245fb2309328f231dad1a667cdf0ce5a5a7c8b" in combined
|
|
checks.append(check)
|
|
if r.returncode:break
|
|
summary["fixed_checks"]=checks
|
|
if Path("/tmp/journey-report.json").exists():
|
|
d=json.loads(Path("/tmp/journey-report.json").read_text());summary["journey_summary"]={"tests_run":d["tests_run"],"test_success":d["test_success"],"skipped":d["skipped"],"complete":d["complete"],"unresolved_journeys":[r["id"] for r in d["journeys"] if r["implementation"]!="implemented"]}
|
|
print(json.dumps(summary));raise SystemExit(any(c["exit"] for c in checks))
|