mirror of
https://github.com/esphome/esphome.git
synced 2026-05-28 04:55:48 +08:00
[api] Populate schema defaults for transitive cpp test deps; add json override
- script/build_helpers.py: when injecting a non-MULTI_CONF component
into the post-validation config, run its CONFIG_SCHEMA with {} so
defaults are populated. Without this, socket got config = {} and
socket.FILTER_SOURCE_FILES crashed with KeyError on
'implementation' (the schema's defaulted key was never filled in).
Falls back to {} if the schema can't validate empty input.
- tests/components/json/__init__.py: enable codegen for json so its
to_code runs during cpp unit test builds, registering the
ArduinoJson library. Required for any api dep test, since
json_util.cpp #includes <ArduinoJson.h>.
Locally verified 'script/cpp_unit_test.py api' now compiles and runs;
ProtoMacVarint test suite (9 cases) passes.
This commit is contained in:
+15
-5
@@ -326,11 +326,21 @@ def compile_and_get_binary(
|
|||||||
# system, not a real loadable component (get_component returns None)
|
# system, not a real loadable component (get_component returns None)
|
||||||
elif (component := get_component(component_name)) is not None:
|
elif (component := get_component(component_name)) is not None:
|
||||||
# MULTI_CONF components store their config as a list of dicts,
|
# MULTI_CONF components store their config as a list of dicts,
|
||||||
# everything else stores a single dict. Using the wrong shape
|
# everything else stores a single dict. Run the component's
|
||||||
# breaks code paths that subscript CORE.config[component] with
|
# schema with {} so defaults get populated -- code paths like
|
||||||
# a string key (e.g. socket.FILTER_SOURCE_FILES).
|
# socket.FILTER_SOURCE_FILES expect a fully-populated mapping.
|
||||||
default = [] if component.multi_conf else {}
|
if component.multi_conf:
|
||||||
config.setdefault(component_name, default)
|
config.setdefault(component_name, [])
|
||||||
|
elif component_name not in config:
|
||||||
|
schema = component.config_schema
|
||||||
|
try:
|
||||||
|
config[component_name] = schema({}) if schema is not None else {}
|
||||||
|
except Exception: # noqa: BLE001
|
||||||
|
# Schema requires explicit input we can't synthesize; fall
|
||||||
|
# back to an empty mapping so subscripting at least returns
|
||||||
|
# KeyError on missing keys rather than crashing on the
|
||||||
|
# wrong type.
|
||||||
|
config[component_name] = {}
|
||||||
|
|
||||||
# Register platforms from the extra config (benchmark.yaml) so
|
# Register platforms from the extra config (benchmark.yaml) so
|
||||||
# USE_SENSOR, USE_LIGHT, etc. defines are emitted without needing
|
# USE_SENSOR, USE_LIGHT, etc. defines are emitted without needing
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
from tests.testing_helpers import ComponentManifestOverride
|
||||||
|
|
||||||
|
|
||||||
|
def override_manifest(manifest: ComponentManifestOverride) -> None:
|
||||||
|
# json's to_code calls cg.add_library("bblanchon/ArduinoJson", ...). C++
|
||||||
|
# unit test builds that pull json in transitively (e.g. api) need that
|
||||||
|
# library registration to happen, otherwise json_util.cpp fails to find
|
||||||
|
# ArduinoJson.h.
|
||||||
|
manifest.enable_codegen()
|
||||||
Reference in New Issue
Block a user