1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-12 06:43:48 +01:00
This commit is contained in:
J. Nick Koston
2025-10-09 07:41:01 -10:00
parent 4623456eba
commit 9215111c57
3 changed files with 20 additions and 36 deletions

View File

@@ -40,6 +40,15 @@ from esphome.config_helpers import Extend, Remove
# Path to common bus configs
COMMON_BUS_PATH = Path("tests/test_build_components/common")
# Components that must be tested in isolation (not grouped or batched with others)
# These have known build issues that prevent grouping
# NOTE: This should be kept in sync with both test_build_components and split_components_for_ci.py
ISOLATED_COMPONENTS = {
"camera_encoder": "Multiple definition errors: esp32-camera IDF component conflicts with ESPHome camera component",
"camera": "Uses relative include paths that break when merged with other components",
"esphome": "Defines devices/areas in esphome: section that are referenced in other sections - breaks when merged",
}
@lru_cache(maxsize=1)
def get_common_bus_packages() -> frozenset[str]:

View File

@@ -21,19 +21,11 @@ import sys
sys.path.insert(0, str(Path(__file__).parent.parent))
from script.analyze_component_buses import (
ISOLATED_COMPONENTS,
analyze_all_components,
create_grouping_signature,
)
# Components that must be tested in isolation (not grouped or batched with others)
# These have known build issues that prevent grouping
# NOTE: This should be kept in sync with ISOLATED_COMPONENTS in test_build_components
ISOLATED_COMPONENTS = {
"camera_encoder": "Multiple definition errors: esp32-camera IDF component conflicts with ESPHome camera component",
"camera": "Uses relative include paths that break when merged with other components",
"esphome": "Defines devices/areas in esphome: section that are referenced in other sections - breaks when merged",
}
def has_test_files(component_name: str, tests_dir: Path) -> bool:
"""Check if a component has test files.
@@ -94,26 +86,16 @@ def create_intelligent_batches(
signature_groups: dict[str, list[str]] = defaultdict(list)
for component in components_with_tests:
# Components in ISOLATED_COMPONENTS can share a batch/runner with others
# but won't be grouped/merged - they're tested individually
# Give each one a unique signature so they can be batched but not grouped
if component in ISOLATED_COMPONENTS:
# Components that can't be grouped get unique signatures
# This includes both manually curated ISOLATED_COMPONENTS and
# automatically detected non_groupable components
# These can share a batch/runner but won't be grouped/merged
if component in ISOLATED_COMPONENTS or component in non_groupable:
signature_groups[f"isolated_{component}"].append(component)
continue
# Components that can't be grouped (use local files, etc.)
# Also get unique signatures
if component in non_groupable:
signature_groups[f"isolated_{component}"].append(component)
continue
if component not in component_buses:
# Component has no bus configs, put in "no_buses" group
# These components CAN be grouped together
signature_groups["no_buses"].append(component)
continue
# Get signature from any platform (they should all have the same buses)
# Components not in component_buses were filtered out by has_test_files check
comp_platforms = component_buses[component]
for platform, buses in comp_platforms.items():
if buses:
@@ -149,9 +131,9 @@ def create_intelligent_batches(
# Flatten all groups in signature-sorted order
# Components within each signature group stay in their natural order
all_components = []
for signature, group_components in sorted_groups:
all_components.extend(group_components)
all_components = [
comp for _, group_components in sorted_groups for comp in group_components
]
# Split into batches of batch_size
# Isolated components are included in all_components (in "isolated" group)

View File

@@ -27,6 +27,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent))
# pylint: disable=wrong-import-position
from script.analyze_component_buses import (
ISOLATED_COMPONENTS,
analyze_all_components,
create_grouping_signature,
is_platform_component,
@@ -34,14 +35,6 @@ from script.analyze_component_buses import (
)
from script.merge_component_configs import merge_component_configs
# Components that must be tested in isolation (not grouped)
# These have known build issues that prevent grouping
ISOLATED_COMPONENTS = {
"camera_encoder": "Multiple definition errors: esp32-camera IDF component conflicts with ESPHome camera component (buffer_impl.cpp symbols defined in both src/camera/ and src/esphome/components/camera/)",
"camera": "Uses relative include paths that break when merged with other components",
"esphome": "Defines devices/areas in esphome: section that are referenced in other sections - breaks when merged",
}
def find_component_tests(
components_dir: Path, component_pattern: str = "*"