| """Regression tests for packaging metadata in pyproject.toml.""" |
|
|
| from pathlib import Path |
| import tomllib |
|
|
|
|
| def _load_optional_dependencies(): |
| pyproject_path = Path(__file__).resolve().parents[1] / "pyproject.toml" |
| with pyproject_path.open("rb") as handle: |
| project = tomllib.load(handle)["project"] |
| return project["optional-dependencies"] |
|
|
|
|
| def test_matrix_extra_linux_only_in_all(): |
| """mautrix[encryption] depends on python-olm which is upstream-broken on |
| modern macOS (archived libolm, C++ errors with Clang 21+). The [matrix] |
| extra is included in [all] but gated to Linux via a platform marker so |
| that ``hermes update`` doesn't fail on macOS.""" |
| optional_dependencies = _load_optional_dependencies() |
|
|
| assert "matrix" in optional_dependencies |
| |
| assert "hermes-agent[matrix]" not in optional_dependencies["all"] |
| |
| linux_gated = [ |
| dep for dep in optional_dependencies["all"] |
| if "matrix" in dep and "linux" in dep |
| ] |
| assert linux_gated, "expected hermes-agent[matrix] with sys_platform=='linux' marker in [all]" |
|
|
|
|
| def test_messaging_extra_includes_qrcode_for_weixin_setup(): |
| optional_dependencies = _load_optional_dependencies() |
|
|
| messaging_extra = optional_dependencies["messaging"] |
| assert any(dep.startswith("qrcode") for dep in messaging_extra) |
|
|
|
|
| def test_dingtalk_extra_includes_qrcode_for_qr_auth(): |
| """DingTalk's QR-code device-flow auth (hermes_cli/dingtalk_auth.py) |
| needs the qrcode package.""" |
| optional_dependencies = _load_optional_dependencies() |
|
|
| dingtalk_extra = optional_dependencies["dingtalk"] |
| assert any(dep.startswith("qrcode") for dep in dingtalk_extra) |
|
|
|
|
| def test_feishu_extra_includes_qrcode_for_qr_login(): |
| """Feishu's QR login flow (gateway/platforms/feishu.py) needs the |
| qrcode package.""" |
| optional_dependencies = _load_optional_dependencies() |
|
|
| feishu_extra = optional_dependencies["feishu"] |
| assert any(dep.startswith("qrcode") for dep in feishu_extra) |
|
|