refactor: replace type-dispatch if/elif chains with registry patterns and handler maps
Some checks failed
Lint & Test / test (push) Failing after 30s
Some checks failed
Lint & Test / test (push) Failing after 30s
Backend: add registry dicts (_CONDITION_MAP, _VALUE_SOURCE_MAP, _PICTURE_SOURCE_MAP) and per-subclass from_dict() methods to eliminate ~300 lines of if/elif in factory functions. Convert automation engine dispatch (condition eval, match_mode, match_type, deactivation_mode) to dict-based lookup. Frontend: extract CSS_CARD_RENDERERS, CSS_SECTION_MAP, CSS_TYPE_SETUP, CONDITION_PILL_RENDERERS, and PICTURE_SOURCE_CARD_RENDERERS handler maps to replace scattered type-check chains in color-strips.ts, automations.ts, and streams.ts.
This commit is contained in:
@@ -42,40 +42,37 @@ router = APIRouter()
|
||||
# ===== Helpers =====
|
||||
|
||||
def _condition_from_schema(s: ConditionSchema) -> Condition:
|
||||
if s.condition_type == "always":
|
||||
return AlwaysCondition()
|
||||
if s.condition_type == "application":
|
||||
return ApplicationCondition(
|
||||
_SCHEMA_TO_CONDITION = {
|
||||
"always": lambda: AlwaysCondition(),
|
||||
"application": lambda: ApplicationCondition(
|
||||
apps=s.apps or [],
|
||||
match_type=s.match_type or "running",
|
||||
)
|
||||
if s.condition_type == "time_of_day":
|
||||
return TimeOfDayCondition(
|
||||
),
|
||||
"time_of_day": lambda: TimeOfDayCondition(
|
||||
start_time=s.start_time or "00:00",
|
||||
end_time=s.end_time or "23:59",
|
||||
)
|
||||
if s.condition_type == "system_idle":
|
||||
return SystemIdleCondition(
|
||||
),
|
||||
"system_idle": lambda: SystemIdleCondition(
|
||||
idle_minutes=s.idle_minutes if s.idle_minutes is not None else 5,
|
||||
when_idle=s.when_idle if s.when_idle is not None else True,
|
||||
)
|
||||
if s.condition_type == "display_state":
|
||||
return DisplayStateCondition(
|
||||
),
|
||||
"display_state": lambda: DisplayStateCondition(
|
||||
state=s.state or "on",
|
||||
)
|
||||
if s.condition_type == "mqtt":
|
||||
return MQTTCondition(
|
||||
),
|
||||
"mqtt": lambda: MQTTCondition(
|
||||
topic=s.topic or "",
|
||||
payload=s.payload or "",
|
||||
match_mode=s.match_mode or "exact",
|
||||
)
|
||||
if s.condition_type == "webhook":
|
||||
return WebhookCondition(
|
||||
),
|
||||
"webhook": lambda: WebhookCondition(
|
||||
token=s.token or secrets.token_hex(16),
|
||||
)
|
||||
if s.condition_type == "startup":
|
||||
return StartupCondition()
|
||||
raise ValueError(f"Unknown condition type: {s.condition_type}")
|
||||
),
|
||||
"startup": lambda: StartupCondition(),
|
||||
}
|
||||
factory = _SCHEMA_TO_CONDITION.get(s.condition_type)
|
||||
if factory is None:
|
||||
raise ValueError(f"Unknown condition type: {s.condition_type}")
|
||||
return factory()
|
||||
|
||||
|
||||
def _condition_to_schema(c: Condition) -> ConditionSchema:
|
||||
|
||||
Reference in New Issue
Block a user