2026-02-21 21:58:35 -05:00
|
|
|
"""Shared helper utilities for per-item behavior modules."""
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parse_bool_like(value: object, *, default: bool = True) -> bool:
|
|
|
|
|
"""Parse permissive bool-like values used by item params."""
|
|
|
|
|
|
|
|
|
|
if isinstance(value, bool):
|
|
|
|
|
return value
|
|
|
|
|
if isinstance(value, (int, float)):
|
|
|
|
|
return bool(value)
|
|
|
|
|
if isinstance(value, str):
|
|
|
|
|
token = value.strip().lower()
|
|
|
|
|
if token in {"on", "true", "1", "yes"}:
|
|
|
|
|
return True
|
|
|
|
|
if token in {"off", "false", "0", "no"}:
|
|
|
|
|
return False
|
|
|
|
|
return default
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parse_bool_like_or_none(value: object) -> bool | None:
|
|
|
|
|
"""Parse permissive bool-like values, returning None when invalid."""
|
|
|
|
|
|
|
|
|
|
if isinstance(value, bool):
|
|
|
|
|
return value
|
|
|
|
|
if isinstance(value, (int, float)):
|
|
|
|
|
return bool(value)
|
|
|
|
|
if isinstance(value, str):
|
|
|
|
|
token = value.strip().lower()
|
|
|
|
|
if token in {"on", "true", "1", "yes"}:
|
|
|
|
|
return True
|
|
|
|
|
if token in {"off", "false", "0", "no"}:
|
|
|
|
|
return False
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def toggle_bool_param(params: dict, key: str, *, default: bool = True) -> bool:
|
|
|
|
|
"""Toggle a bool-like item param key and return the next value."""
|
|
|
|
|
|
|
|
|
|
current = parse_bool_like(params.get(key), default=default)
|
|
|
|
|
return not current
|
|
|
|
|
|
2026-02-24 02:39:51 -05:00
|
|
|
|
|
|
|
|
def keep_only_known_params(params: dict, allowed_keys: tuple[str, ...]) -> dict:
|
|
|
|
|
"""Return a copy containing only explicitly allowed item param keys."""
|
|
|
|
|
|
|
|
|
|
allowed = set(allowed_keys)
|
|
|
|
|
return {key: value for key, value in params.items() if key in allowed}
|