From 22db78d551bea00c2b4d2ee71a76458d56c99e65 Mon Sep 17 00:00:00 2001 From: Aiden Grossman Date: Tue, 7 Oct 2025 20:49:55 +0000 Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20change?= =?UTF-8?q?s=20to=20main=20this=20commit=20is=20based=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.6 [skip ci] --- premerge/advisor/advisor_lib.py | 25 +++++++++++++++++++++++++ premerge/advisor/advisor_lib_test.py | 16 ++++++++++++++++ premerge/advisor/requirements.lock.txt | 23 +++++++++++++++++++++++ premerge/advisor/requirements.txt | 2 ++ premerge/advisor/server.py | 21 +++++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 premerge/advisor/advisor_lib.py create mode 100644 premerge/advisor/advisor_lib_test.py create mode 100644 premerge/advisor/requirements.lock.txt create mode 100644 premerge/advisor/requirements.txt create mode 100644 premerge/advisor/server.py diff --git a/premerge/advisor/advisor_lib.py b/premerge/advisor/advisor_lib.py new file mode 100644 index 000000000..5e7092172 --- /dev/null +++ b/premerge/advisor/advisor_lib.py @@ -0,0 +1,25 @@ +from typing import TypedDict + + +class TestFailure(TypedDict): + name: str + message: str + + +class FailureExplanation(TypedDict): + name: str + explained: bool + reason: str | None + + +def upload_failures(test_failures: list[TestFailure]): + pass + + +def explain_failures(test_failures: list[TestFailure]) -> list[FailureExplanation]: + explanations = [] + for test_failure in test_failures: + explanations.append( + {"name": test_failure["name"], "explained": False, "reason": None} + ) + return explanations diff --git a/premerge/advisor/advisor_lib_test.py b/premerge/advisor/advisor_lib_test.py new file mode 100644 index 000000000..4d79e2dd5 --- /dev/null +++ b/premerge/advisor/advisor_lib_test.py @@ -0,0 +1,16 @@ +import unittest + +import advisor_lib + + +class AdvisorLibTest(unittest.TestCase): + def test_upload_failures(self): + failures = [{"name": "a.ll", "message": "failed"}] + advisor_lib.upload_failures(failures) + + def test_explain_failures(self): + failures = [{"name": "a.ll", "message": "failed"}] + self.assertListEqual( + advisor_lib.explain_failures(failures), + [{"name": "a.ll", "explained": False, "reason": None}], + ) diff --git a/premerge/advisor/requirements.lock.txt b/premerge/advisor/requirements.lock.txt new file mode 100644 index 000000000..cbd939df5 --- /dev/null +++ b/premerge/advisor/requirements.lock.txt @@ -0,0 +1,23 @@ +# +# This file is autogenerated by pip-compile with Python 3.13 +# by the following command: +# +# pip-compile --output-file=requirements.lock.txt ./requirements.txt +# +blinker==1.9.0 + # via flask +click==8.3.0 + # via flask +flask==3.1.2 + # via -r requirements.txt +itsdangerous==2.2.0 + # via flask +jinja2==3.1.6 + # via flask +markupsafe==3.0.3 + # via + # flask + # jinja2 + # werkzeug +werkzeug==3.1.3 + # via flask diff --git a/premerge/advisor/requirements.txt b/premerge/advisor/requirements.txt new file mode 100644 index 000000000..12fdfe73f --- /dev/null +++ b/premerge/advisor/requirements.txt @@ -0,0 +1,2 @@ +flask==3.1.2 + diff --git a/premerge/advisor/server.py b/premerge/advisor/server.py new file mode 100644 index 000000000..6cd91ef54 --- /dev/null +++ b/premerge/advisor/server.py @@ -0,0 +1,21 @@ +import flask +from flask import Flask + +import advisor_lib + +app = Flask(__name__) + + +@app.route("/upload", methods=["POST"]) +def upload(): + advisor_lib.upload_failures(flask.request.json) + return flask.Response(status=204) + + +@app.route("/explain") +def explain(): + return advisor_lib.explain_failures(flask.request.json) + + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5000)