UX-08 2c: short refusals, error texts and option texts
Validator refusals name the setting by its label and key, say what is wrong and what to change, and keep the rejected value and limit. Option names and descriptions are short in en and nl; citations moved to DOCS "For installers" and the test_translations citation check now pins the instruction on the tab and the record in DOCS. No rule, key, schema, default or exit code changed. Allowlist 167 -> 43 (log lines only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LyR88rXETvwhTgx6yHE39p
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
e1d0970b23
commit
2c516a032c
@@ -413,6 +413,8 @@ def problems_of(kind, text):
|
||||
p = []
|
||||
if len(words(text)) > lim:
|
||||
p.append(f"over {lim} words ({len(words(text))})")
|
||||
if kind != "log" and ";" in text: # logs are phase 2d
|
||||
p.append("semicolon")
|
||||
return p + text_problems(text, keys=keys, entities=ents)
|
||||
|
||||
|
||||
@@ -424,7 +426,7 @@ ALLOW_FILE = HERE / "ux08_allowlist.txt"
|
||||
# The allowlist may never grow. The test demands the list be exactly this long,
|
||||
# so deleting lines means lowering this number in the same change, and adding
|
||||
# one means raising it where a reviewer sees it.
|
||||
ALLOWLIST_MAX = 167
|
||||
ALLOWLIST_MAX = 43
|
||||
|
||||
|
||||
def read_allowlist(path):
|
||||
@@ -527,6 +529,32 @@ check(f"no allowlist entry is stale, so the list only shrinks "
|
||||
check(f"the allowlist is exactly its cap ({len(allow)} entries, cap "
|
||||
f"{ALLOWLIST_MAX}): lower the cap when you delete lines",
|
||||
len(allow) == ALLOWLIST_MAX)
|
||||
|
||||
# A refusal names a setting by its Configuration-tab label (UX-08 2c). The
|
||||
# catalogue's labels must be the en.yaml names without group prefix and unit.
|
||||
_TR = TL.parse_translation_file(HERE / "translations" / "en.yaml")["configuration"]
|
||||
|
||||
|
||||
def _label_stems(key):
|
||||
names = [c[key]["name"] for c in (_TR, _TR["inverters"]["fields"])
|
||||
if isinstance(c.get(key), dict)]
|
||||
out = set()
|
||||
for n in names:
|
||||
n = n.split("·")[-1].strip()
|
||||
while re.search(r"\s*\([^()]*\)$", n):
|
||||
n = re.sub(r"\s*\([^()]*\)$", "", n)
|
||||
out.add(n)
|
||||
return out
|
||||
|
||||
|
||||
_drift = sorted(f"{k}: {v!r}" for k, v in messages.LABELS.items()
|
||||
if v not in _label_stems(k))
|
||||
check(f"every label a refusal quotes is the setting's name in en.yaml "
|
||||
f"(drifted: {_drift})", not _drift)
|
||||
check("...and a refusal quotes the label and then the key, so the config "
|
||||
"panel still files it under that setting",
|
||||
messages.setting("max_w", "inverter-b")
|
||||
== "“Inverter rating” (max_w) for inverter-b")
|
||||
print(f"CI: UX-08 allowlist {len(allow)} entries "
|
||||
+ ", ".join(f"{k} {sum(1 for x in allow if x.startswith(k + ' '))}"
|
||||
for k in LIMITS))
|
||||
@@ -567,6 +595,11 @@ check("an entity id in an alarm is refused", bool(body_problems(
|
||||
"Check sensor.battery_power now.", messages.ALARM)))
|
||||
check("...but allowed in a refusal", not problems_of(
|
||||
"refusal", "Check sensor.battery_power in Developer Tools."))
|
||||
check("a semicolon in a refusal or an option text is refused",
|
||||
bool(problems_of("refusal", "It is wrong; fix it."))
|
||||
and bool(problems_of("option-desc", "It is wrong; fix it.")))
|
||||
check("a label that drifted from en.yaml is caught",
|
||||
"Inverter power" not in _label_stems("max_w"))
|
||||
check("an option key in an alarm is refused", bool(body_problems(
|
||||
"Lower peak_soc_floor.", messages.ALARM)))
|
||||
check("a message that lost its Details line is refused",
|
||||
|
||||
Reference in New Issue
Block a user