Strip multi-word rich tags when rich is not installed (#1807)

Without `rich` installed, `kasa` prints tags like `[bold red]Only
discover is available without --host or --alias[/bold red]` verbatim.
The fallback in `kasa/cli/common.py` strips only single-word tags
(`\[/?[a-z]+]`), and `error()` uses the two-word `[bold red]`.

The pattern is changed to `\[/?[a-z]+(?: [a-z]+)*]`, so space-separated lowercase words are stripped too.
This commit is contained in:
WolfGanG
2026-10-25 00:11:13 +08:00
committed by GitHub
parent c60f48df23
commit 0932f30d06
2 changed files with 17 additions and 1 deletions

View File

@@ -34,7 +34,7 @@ except ImportError:
# but only lower case tags to avoid stripping out
# raw data from the device that is printed from
# the device state.
rich_formatting = re.compile(r"\[/?[a-z]+]")
rich_formatting = re.compile(r"\[/?[a-z]+(?: [a-z]+)*]")
def _strip_rich_formatting(echo_func):
"""Strip rich formatting from messages."""

View File

@@ -1,5 +1,7 @@
import importlib.util
import json
import re
import sys
from datetime import datetime
from unittest.mock import ANY, PropertyMock, patch
from zoneinfo import ZoneInfo
@@ -1552,3 +1554,17 @@ async def test_discover_config_invalid(
)
assert res.exit_code == 1
assert "--target is not a valid option for single host discovery" in res.output
def test_echo_strips_rich_tags_without_rich(monkeypatch, capsys):
"""Multi-word rich tags are stripped when rich is not installed."""
monkeypatch.setitem(sys.modules, "rich", None)
spec = importlib.util.find_spec("kasa.cli.common")
assert spec
assert spec.loader
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
module._echo("[bold red]Only discover is available[/bold red] [ABC]")
assert capsys.readouterr().out == "Only discover is available [ABC]\n"