Skip to content

chore(ci): bump github/codeql-action/analyze from 4.37.3 to 4.37.9 #15

chore(ci): bump github/codeql-action/analyze from 4.37.3 to 4.37.9

chore(ci): bump github/codeql-action/analyze from 4.37.3 to 4.37.9 #15

Workflow file for this run

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