From 26644cb2b7e7a1329ae4befed3b1bb46e9a743d1 Mon Sep 17 00:00:00 2001 From: David Foster Date: Sun, 7 Jan 2024 17:31:04 -0500 Subject: [PATCH] Continuous Integration: Export warnings as warning annotations in GitHub Actions --- src/crystal/tests/index.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/crystal/tests/index.py b/src/crystal/tests/index.py index f251be0d..e8f785a0 100644 --- a/src/crystal/tests/index.py +++ b/src/crystal/tests/index.py @@ -1,3 +1,4 @@ +from contextlib import contextmanager from crystal.tests import ( test_addgroup, test_addrooturl, @@ -34,7 +35,7 @@ import sys import time import traceback -from typing import Any, Callable, Coroutine, Dict, List, Optional, Tuple +from typing import Any, Callable, Coroutine, Dict, List, Iterator, Optional, Tuple from unittest import SkipTest import warnings @@ -232,3 +233,27 @@ def _run_tests(test_names: List[str]) -> bool: print() return is_ok + + +@contextmanager +def _warnings_sent_to_ci() -> Iterator[None]: + if not _running_in_ci(): + yield + return + + super_showwarning = warnings.showwarning # capture + + def showwarning(message, category, filename, lineno, file=None, line=None): + # Syntax: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#example-setting-a-warning-message + print(f'::warning file={filename},line={lineno}::{message}') + return super_showwarning(message, category, filename, lineno, file, line) + + warnings.showwarning = showwarning + try: + yield + finally: + warnings.showwarning = super_showwarning + + +def _running_in_ci() -> bool: + return os.environ.get('GITHUB_ACTIONS') == 'true'