mirror of
https://github.com/langgenius/dify.git
synced 2026-03-13 21:22:28 +08:00
fix(ci): make pyrefly diff comments focus on diagnostics (#32778)
This commit is contained in:
parent
baeea77c5b
commit
691c9911c7
10
.github/workflows/pyrefly-diff.yml
vendored
10
.github/workflows/pyrefly-diff.yml
vendored
@ -29,16 +29,22 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: uv sync --project api --dev
|
||||
|
||||
- name: Prepare diagnostics extractor
|
||||
run: |
|
||||
git show ${{ github.event.pull_request.head.sha }}:api/libs/pyrefly_diagnostics.py > /tmp/pyrefly_diagnostics.py
|
||||
|
||||
- name: Run pyrefly on PR branch
|
||||
run: |
|
||||
uv run --directory api pyrefly check > /tmp/pyrefly_pr.txt 2>&1 || true
|
||||
uv run --directory api --dev pyrefly check 2>&1 \
|
||||
| uv run --directory api python /tmp/pyrefly_diagnostics.py > /tmp/pyrefly_pr.txt || true
|
||||
|
||||
- name: Checkout base branch
|
||||
run: git checkout ${{ github.base_ref }}
|
||||
|
||||
- name: Run pyrefly on base branch
|
||||
run: |
|
||||
uv run --directory api pyrefly check > /tmp/pyrefly_base.txt 2>&1 || true
|
||||
uv run --directory api --dev pyrefly check 2>&1 \
|
||||
| uv run --directory api python /tmp/pyrefly_diagnostics.py > /tmp/pyrefly_base.txt || true
|
||||
|
||||
- name: Compute diff
|
||||
run: |
|
||||
|
||||
48
api/libs/pyrefly_diagnostics.py
Normal file
48
api/libs/pyrefly_diagnostics.py
Normal file
@ -0,0 +1,48 @@
|
||||
"""Helpers for producing concise pyrefly diagnostics for CI diff output."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
|
||||
_DIAGNOSTIC_PREFIXES = ("ERROR ", "WARNING ")
|
||||
_LOCATION_PREFIX = "-->"
|
||||
|
||||
|
||||
def extract_diagnostics(raw_output: str) -> str:
|
||||
"""Extract stable diagnostic lines from pyrefly output.
|
||||
|
||||
The full pyrefly output includes code excerpts and carets, which create noisy
|
||||
diffs. This helper keeps only:
|
||||
- diagnostic headline lines (``ERROR ...`` / ``WARNING ...``)
|
||||
- the following location line (``--> path:line:column``), when present
|
||||
"""
|
||||
|
||||
lines = raw_output.splitlines()
|
||||
diagnostics: list[str] = []
|
||||
|
||||
for index, line in enumerate(lines):
|
||||
if line.startswith(_DIAGNOSTIC_PREFIXES):
|
||||
diagnostics.append(line.rstrip())
|
||||
|
||||
next_index = index + 1
|
||||
if next_index < len(lines):
|
||||
next_line = lines[next_index]
|
||||
if next_line.lstrip().startswith(_LOCATION_PREFIX):
|
||||
diagnostics.append(next_line.rstrip())
|
||||
|
||||
if not diagnostics:
|
||||
return ""
|
||||
|
||||
return "\n".join(diagnostics) + "\n"
|
||||
|
||||
|
||||
def main() -> int:
|
||||
"""Read pyrefly output from stdin and print normalized diagnostics."""
|
||||
|
||||
raw_output = sys.stdin.read()
|
||||
sys.stdout.write(extract_diagnostics(raw_output))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
51
api/tests/unit_tests/libs/test_pyrefly_diagnostics.py
Normal file
51
api/tests/unit_tests/libs/test_pyrefly_diagnostics.py
Normal file
@ -0,0 +1,51 @@
|
||||
from libs.pyrefly_diagnostics import extract_diagnostics
|
||||
|
||||
|
||||
def test_extract_diagnostics_keeps_only_summary_and_location_lines() -> None:
|
||||
# Arrange
|
||||
raw_output = """INFO Checking project configured at `/tmp/project/pyrefly.toml`
|
||||
ERROR `result` may be uninitialized [unbound-name]
|
||||
--> controllers/console/app/annotation.py:126:16
|
||||
|
|
||||
126 | return result, 200
|
||||
| ^^^^^^
|
||||
|
|
||||
ERROR Object of class `App` has no attribute `access_mode` [missing-attribute]
|
||||
--> controllers/console/app/app.py:574:13
|
||||
|
|
||||
574 | app_model.access_mode = app_setting.access_mode
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
"""
|
||||
|
||||
# Act
|
||||
diagnostics = extract_diagnostics(raw_output)
|
||||
|
||||
# Assert
|
||||
assert diagnostics == (
|
||||
"ERROR `result` may be uninitialized [unbound-name]\n"
|
||||
" --> controllers/console/app/annotation.py:126:16\n"
|
||||
"ERROR Object of class `App` has no attribute `access_mode` [missing-attribute]\n"
|
||||
" --> controllers/console/app/app.py:574:13\n"
|
||||
)
|
||||
|
||||
|
||||
def test_extract_diagnostics_handles_error_without_location_line() -> None:
|
||||
# Arrange
|
||||
raw_output = "ERROR unexpected pyrefly output format [bad-format]\n"
|
||||
|
||||
# Act
|
||||
diagnostics = extract_diagnostics(raw_output)
|
||||
|
||||
# Assert
|
||||
assert diagnostics == "ERROR unexpected pyrefly output format [bad-format]\n"
|
||||
|
||||
|
||||
def test_extract_diagnostics_returns_empty_for_non_error_output() -> None:
|
||||
# Arrange
|
||||
raw_output = "INFO Checking project configured at `/tmp/project/pyrefly.toml`\n"
|
||||
|
||||
# Act
|
||||
diagnostics = extract_diagnostics(raw_output)
|
||||
|
||||
# Assert
|
||||
assert diagnostics == ""
|
||||
Loading…
Reference in New Issue
Block a user