Resolve bare registry libraries at latest version like PlatformIO; tighten review cleanups

This commit is contained in:
J. Nick Koston
2026-08-20 03:07:07 -05:00
parent 702ef56a88
commit 9cf7ff94ac
7 changed files with 47 additions and 35 deletions
@@ -252,11 +252,10 @@ def test_write_project_link_line_and_exclusions(tmp_path: Path) -> None:
# -L/-l from esphome build_flags reach the link line, not the compiles
assert '-L"/opt/blobs"' in content
assert "-luser_blob" in content
assert "cflags" not in [
line.split(" = ")[0].strip()
for line in content.splitlines()
if "user_blob" in line
]
for line in content.splitlines():
if line.split(" = ")[0] in ("cflags", "cxxflags", "asflags"):
assert "user_blob" not in line
assert "/opt/blobs" not in line
# System libraries with the selected lwIP variant, in the builder's order
assert (
"-lhal -lphy -lpp -lnet80211 -llwip2-1460 -lwpa -lcrypto -lmain -lwps "
@@ -524,7 +523,8 @@ def test_write_project_missing_framework_dir_raises(tmp_path: Path) -> None:
def test_build_config_nonosdk_precedence() -> None:
"""With two SDK knobs set, the first table entry wins (documented order)."""
"""With two SDK knobs set (a pathological config), ties break
deterministically by table order."""
_set_flags(
"-DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305",
"-DPIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221",
@@ -100,14 +100,15 @@ def test_resolve_libraries_bundled(tmp_path: Path) -> None:
assert [lib.name for lib in libs] == ["ESP8266WiFi"]
def test_resolve_libraries_unknown_bare_name_raises(tmp_path: Path) -> None:
"""An unresolvable library fails the build by name, as PlatformIO does."""
from esphome.core import EsphomeError
def test_resolve_libraries_bare_registry_name_is_external(tmp_path: Path) -> None:
"""A bare name that is not bundled resolves from the registry at the
latest version, matching PlatformIO and the documented libraries: key."""
framework = _make_framework(tmp_path)
_add_library("Typoo", None)
with pytest.raises(EsphomeError, match="Typoo"):
_add_library("pngle", None)
with patch.object(component, "convert_libraries", return_value=[]) as mock_convert:
component.resolve_libraries(framework)
(libraries, _backend), _ = mock_convert.call_args
assert [lib.name for lib in libraries] == ["pngle"]
def _converted(name: str, source_dir: Path, data: dict) -> ConvertedLibrary:
+18 -3
View File
@@ -223,13 +223,14 @@ def test_run_compile_skips_compdb_when_ninja_unchanged(tmp_path: Path) -> None:
run(regenerate_expected=False)
def test_print_size_summary_unparsable_section_skips_summary(
def test_print_size_summary_unparsable_section(
tmp_path: Path,
capsys: pytest.CaptureFixture[str],
caplog: pytest.LogCaptureFixture,
) -> None:
"""A section that fails to parse must not produce a confident wrong total."""
bad = _SIZE_OUTPUT + ".broken abc 0\n"
"""A totals-relevant section that fails to parse must not produce a
confident wrong number; an irrelevant one only warns."""
bad = _SIZE_OUTPUT.replace(".bss 26504", ".bss abc")
with patch.object(
toolchain.subprocess,
"run",
@@ -238,3 +239,17 @@ def test_print_size_summary_unparsable_section_skips_summary(
toolchain._print_size_summary(tmp_path, tmp_path / "toolchain")
assert capsys.readouterr().out == ""
assert "Unparsable size output" in caplog.text
caplog.clear()
harmless = _SIZE_OUTPUT + ".broken abc 0\n"
with (
patch.object(
toolchain.subprocess,
"run",
return_value=MagicMock(returncode=0, stdout=harmless),
),
patch.object(toolchain, "_parse_app_size", return_value=1044464),
):
toolchain._print_size_summary(tmp_path, tmp_path / "toolchain")
assert "RAM:" in capsys.readouterr().out
assert "Unparsable size output" in caplog.text