chore(ci): bump github/codeql-action/analyze from 4.37.3 to 4.37.9 #15
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Prove | |
| # La suite di prove dello strumento gira a ogni push su main e a ogni pull | |
| # request. scripts/prova_profilo_voce.py usa la sola libreria standard di | |
| # Python: ogni prova nasce da un difetto trovato durante l'audit e serve a | |
| # impedire che torni. Gira anche l'autoprova dell'hook facoltativo | |
| # extras/hooks/consenti-solo-profilo-voce.py. Nessuna dipendenza da installare. | |
| # Su Linux il collegamento simbolico si crea senza privilegi, quindi qui la | |
| # prova del contenimento del corpus gira davvero, mentre su Windows si salta. | |
| on: | |
| push: | |
| branches: ["main"] | |
| pull_request: | |
| branches: ["main"] | |
| # Permessi minimi: leggere il codice è tutto ciò che serve per lanciare le prove. | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: "prove-${{ github.ref }}" | |
| cancel-in-progress: true | |
| jobs: | |
| prove: | |
| name: Suite di prove (Python) | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Preleva il codice | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| - name: Prepara Python | |
| uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 | |
| with: | |
| python-version: "3.12" | |
| - name: Prove dello strumento | |
| run: python scripts/prova_profilo_voce.py | |
| - name: Autoprova dell'hook | |
| run: python extras/hooks/consenti-solo-profilo-voce.py --prova | |
| # La versione è scritta in quattro posti, e finora niente impediva di | |
| # aggiornarne tre su quattro. Qui si controlla che dicano la stessa cosa. | |
| - name: Versione coerente nei quattro posti | |
| run: | | |
| python - <<'PY' | |
| import json | |
| import pathlib | |
| import re | |
| import sys | |
| manifest = json.loads( | |
| pathlib.Path(".claude-plugin/plugin.json").read_text(encoding="utf-8") | |
| )["version"] | |
| trovate = {"plugin.json": manifest} | |
| citazione = re.search( | |
| r"^version:\s*(\S+)", | |
| pathlib.Path("CITATION.cff").read_text(encoding="utf-8"), | |
| re.MULTILINE, | |
| ) | |
| trovate["CITATION.cff"] = citazione.group(1) if citazione else None | |
| strumento = re.search( | |
| r'^VERSIONE\s*=\s*"([^"]+)"', | |
| pathlib.Path("scripts/profilo_voce.py").read_text(encoding="utf-8"), | |
| re.MULTILINE, | |
| ) | |
| trovate["profilo_voce.py"] = strumento.group(1) if strumento else None | |
| # Il badge della versione è dinamico e legge la release da GitHub, | |
| # quindi la quarta fonte da confrontare è la voce più recente del | |
| # changelog, esclusa la sezione di ciò che non è ancora rilasciato. | |
| voce = re.search( | |
| r"^## \[([0-9]+\.[0-9]+\.[0-9]+)\]", | |
| pathlib.Path("CHANGELOG.md").read_text(encoding="utf-8"), | |
| re.MULTILINE, | |
| ) | |
| trovate["CHANGELOG.md"] = voce.group(1) if voce else None | |
| for dove, valore in trovate.items(): | |
| print(f"{dove}: {valore}") | |
| if len(set(trovate.values())) != 1 or None in trovate.values(): | |
| print("Le versioni non coincidono.") | |
| sys.exit(1) | |
| print("Le quattro versioni coincidono.") | |
| PY | |
| # I badge del README dichiarano dei numeri. Un badge che dice il falso è | |
| # peggio di un badge assente, quindi i numeri si confrontano con quelli | |
| # che le prove stampano davvero. | |
| - name: Numeri dei badge veri | |
| run: | | |
| python - <<'PY' | |
| import pathlib | |
| import re | |
| import subprocess | |
| import sys | |
| readme = pathlib.Path("README.md").read_text(encoding="utf-8") | |
| def dal_badge(etichetta): | |
| trovato = re.search(rf"badge/{etichetta}-([0-9]+)-", readme) | |
| return int(trovato.group(1)) if trovato else None | |
| def dallo_script(comando, modello): | |
| uscita = subprocess.run( | |
| [sys.executable] + comando, | |
| capture_output=True, text=True, | |
| ) | |
| # Il conteggio vale solo dove nessuna prova salta. I rami del | |
| # collegamento simbolico non girano sui sistemi che non lo | |
| # permettono, e lì il totale è per forza più basso: su quelle | |
| # macchine il confronto non prova niente e non deve bloccare. | |
| saltate = re.search(r"([0-9]+) saltat", uscita.stdout) | |
| if saltate and int(saltate.group(1)) > 0: | |
| print(f" {saltate.group(1)} prove saltate su questa " | |
| f"piattaforma: confronto non attendibile, salto") | |
| return None | |
| trovato = re.search(modello, uscita.stdout) | |
| return int(trovato.group(1)) if trovato else None | |
| controlli = [ | |
| ("prove", dal_badge("prove"), | |
| dallo_script(["scripts/prova_profilo_voce.py"], | |
| r"([0-9]+) prove, ")), | |
| ("autoprova dell'hook", dal_badge("autoprova_hook"), | |
| dallo_script( | |
| ["extras/hooks/consenti-solo-profilo-voce.py", "--prova"], | |
| r"([0-9]+) casi, ")), | |
| ] | |
| storto = False | |
| for nome, nel_badge, davvero in controlli: | |
| if davvero is None: | |
| print(f"{nome}: badge {nel_badge}, confronto saltato") | |
| continue | |
| print(f"{nome}: badge {nel_badge}, eseguite {davvero}") | |
| if nel_badge is None or nel_badge != davvero: | |
| storto = True | |
| if storto: | |
| print("Un badge dichiara un numero che le prove non confermano.") | |
| sys.exit(1) | |
| print("I numeri dei badge corrispondono.") | |
| PY |