Files
houseplan-card/docs/specs/038-icon-rule-builder.md
Matysh 112c260314
Validate / hacs (push) Failing after 12s
Validate / hassfest (push) Failing after 13s
Validate / frontend (push) Successful in 3m2s
Validate / golden (push) Failing after 51s
Validate / backend (push) Failing after 6m50s
Validate / smoke (push) Failing after 13m44s
Validate / performance (push) Failing after 24m13s
Release v1.61.0-beta.1
2026-08-09 21:51:33 +03:00

2.9 KiB
Raw Permalink Blame History

ТЗ #38 — Конструктор правил иконок

Цель

Обычный пользователь создаёт правило без regex, видит порядок и объяснение первого совпадения; существующие regex остаются lossless advanced rules.

Модель v2

type IconRule =
  | { kind: 'simple'; domains?: string[]; device_classes?: string[];
      name_words?: string[]; model_words?: string[]; icon: string }
  | { kind: 'regex'; pattern: string; icon: string };

Внутри одного simple rule непустые группы соединяются AND, значения группы — OR. name_words/model_words — case-insensitive literal tokens, не regex. Пустое условие невалидно. Порядок массива — приоритет, первое совпадение побеждает. Default built-in rules идут после custom.

Legacy {pattern,icon} читается как kind:'regex' и не переписывается до явного Save/Optimize. Backend принимает оба shapes на окно совместимости.

UX

  • Список sortable keyboard/pointer, номер и summary каждого правила.
  • Simple editor: domain multiselect, device_class multiselect, words chips для имени/модели, HA icon picker.
  • «Расширенный режим» показывает regex, live validation и предупреждение, что правило проверяется раньше нижележащих.
  • Test device picker использует registry projection и показывает: итоговую icon, rule number/kind и human-readable reason по каждому matched field.
  • Draft reorder/edit не влияет на plan до Save; Cancel lossless.

Compiler

compileIconRules() нормализует оба shapes в predicates и diagnostics. Invalid regex отключает только правило с объяснением, но Save блокируется. Limits: max rules/words/string length, regex length; no flags кроме i. Runtime evaluation остаётся bounded; catastrophic regex mitigated длиной и опциональным safe-regex check, а не async worker в v1.

Проверки и приёмка

  • simple AND/OR semantics, case/whitespace, order, fallback;
  • legacy regex byte-preserving roundtrip;
  • invalid/overlong regex and limits backend/frontend parity;
  • test device explanation совпадает с реальным resolveIcon;
  • reorder keyboard, unsaved Cancel, narrow dialog;
  • существующий config даёт те же icons до явного редактирования.