Files
harbour-aira/tests/cover_action_check.py
T
Carlo b4ac614723 0.7.2: il tasto del boost diventa Stop mentre e' in corso
In Home e in copertina: un tocco ferma il boost invece di farne ripartire un
altro (dalla copertina era il caso peggiore). Il conto alla rovescia ora prende
il posto del suggerimento nella stessa riga e con lo stesso carattere: prima,
essendo piu' alto, spingeva giu' i tasti delle azioni rapide.
Glifo di stop disegnato con scripts/make_glyphs.py. Catalogo 199 voci.
2026-10-11 12:45:56 +02:00

106 lines
4.5 KiB
Python

#!/usr/bin/env python3
"""Controllo statico dell'azione sulla copertina (P8 del piano).
Verifica le regole che la documentazione Silica pone sulle azioni di copertina,
e che il componente sia usato come va usato:
- il `CoverActionList` sta come figlio diretto della copertina (qui la radice
e' `CoverBackground`, che eredita da `Cover`: e' li' che va dichiarato).
Un elenco annidato dentro un altro elemento non si attaccherebbe;
- al massimo una azione: la documentazione dice che due si possono avere, ma
che lo stile delle app di sistema ne mostra una;
- l'icona si dichiara con `iconSource` (non `icon.source`, che e' del
pulsante Button: sbagliarlo qui non da' errore, l'icona semplicemente non
compare);
- l'icona esiste davvero, risolta rispetto al file QML che definisce la
copertina;
- il comando che l'azione invia esiste nella tabella dei comandi del bridge
(un id sbagliato lo scoprirebbe solo il telefono, con un 400).
Non serve il kit Silica: legge i file. Uscita 0 = tutto a posto.
"""
import pathlib
import re
import sys
RADICE = pathlib.Path(__file__).resolve().parent.parent
COPERTINA = RADICE / "qml" / "cover" / "CoverPage.qml"
BRIDGE = RADICE / "bridge" / "aira_bridge.py"
def main():
if not COPERTINA.exists():
print("ESITO: manca %s" % COPERTINA)
return 1
testo = COPERTINA.read_text(encoding="utf-8")
righe = testo.splitlines()
problemi = []
radice = next((r.strip() for r in righe
if re.match(r"^[A-Z][A-Za-z]*\s*\{", r)), "")
if not re.match(r"CoverBackground|Cover\s*\{", radice):
problemi.append("la radice della copertina e' %r: le azioni vanno dentro "
"un Cover (CoverBackground eredita da Cover)" % radice[:40])
# il CoverActionList deve stare al primo livello dentro la radice
elenchi = [(i, r) for i, r in enumerate(righe) if re.match(r"^\s*CoverActionList\s*\{", r)]
if not elenchi:
print("nessuna azione sulla copertina: niente da controllare (0.6.8 e prima)")
return 0
for i, r in elenchi:
rientro = len(r) - len(r.lstrip())
if rientro != 4:
problemi.append("riga %d: il CoverActionList e' rientrato di %d spazi, "
"deve essere figlio diretto della copertina" % (i + 1, rientro))
azioni = [r for r in righe if re.match(r"^\s*CoverAction\s*\{", r)]
if len(azioni) > 1:
problemi.append("%d azioni: la documentazione Silica ne ammette piu' di una "
"ma lo stile delle app di sistema ne mostra una" % len(azioni))
if re.search(r"^\s*icon\.source\s*:", testo, re.M):
problemi.append("usa `iconSource`, non `icon.source`: `icon.source` e' del "
"pulsante Button e qui non darebbe errore, solo nessuna icona")
for m in re.finditer(r'"(\.\./icons/[^"]+\.png)"', testo):
icona = (COPERTINA.parent / m.group(1)).resolve()
if not icona.exists():
problemi.append("l'icona %s non esiste (risolta da %s)"
% (m.group(1), COPERTINA.name))
else:
print("icona: %s -> %s" % (m.group(1), icona.relative_to(RADICE)))
# L'invio puo' essere condizionale (il tasto del boost avvia o ferma) e
# scritto su piu' righe: si prende tutto il testo fra sendCommand( e la
# parentesi di chiusura, poi tutti i letterali che sembrano un id.
comandi = []
for m in re.finditer(r"sendCommand\(([^)]*)\)", testo, re.S):
comandi += [s for s in re.findall(r'"([^"]+)"', m.group(1))
if re.match(r"^[a-z][a-z_]*$", s)]
if not comandi:
problemi.append("l'azione non invia nessun comando: a che serve?")
else:
print("comandi inviati: %s" % ", ".join(comandi))
for c in comandi:
if not BRIDGE.exists():
print("salto il controllo del comando %r: manca %s" % (c, BRIDGE))
continue
ponte = BRIDGE.read_text(encoding="utf-8")
if not re.search(r'"%s"\s*:' % re.escape(c), ponte):
problemi.append("il comando %r non e' nella tabella del bridge: "
"il telefono riceverebbe un 400" % c)
else:
print("comando: %s -> presente nel bridge" % c)
if problemi:
for p in problemi:
print("PROBLEMA: %s" % p)
print("ESITO: %d problemi sull'azione di copertina" % len(problemi))
return 1
print("ESITO: azione di copertina a posto")
return 0
if __name__ == "__main__":
sys.exit(main())