1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-12 14:53:49 +01:00
This commit is contained in:
J. Nick Koston
2025-10-08 16:17:42 -10:00
parent d8ab75109a
commit a17c9fd1d3
2 changed files with 38 additions and 9 deletions

View File

@@ -16,6 +16,7 @@ The merger handles:
from __future__ import annotations from __future__ import annotations
import argparse import argparse
from functools import lru_cache
from pathlib import Path from pathlib import Path
import re import re
import sys import sys
@@ -28,6 +29,24 @@ from esphome import yaml_util
from esphome.config_helpers import merge_config from esphome.config_helpers import merge_config
@lru_cache(maxsize=1)
def get_common_bus_packages() -> frozenset[str]:
"""Get the list of common bus package names.
Reads from tests/test_build_components/common/ directory
and caches the result.
Returns:
Frozenset of common bus package names (i2c, spi, uart, etc.)
"""
common_dir = Path("tests/test_build_components/common")
if not common_dir.exists():
return frozenset()
# List all directories in common/ - these are the bus package names
return frozenset(d.name for d in common_dir.iterdir() if d.is_dir())
def load_yaml_file(yaml_file: Path) -> dict: def load_yaml_file(yaml_file: Path) -> dict:
"""Load YAML file using ESPHome's YAML loader. """Load YAML file using ESPHome's YAML loader.
@@ -44,20 +63,28 @@ def load_yaml_file(yaml_file: Path) -> dict:
def extract_packages_from_yaml(data: dict) -> dict[str, str]: def extract_packages_from_yaml(data: dict) -> dict[str, str]:
"""Extract package includes from parsed YAML. """Extract COMMON BUS package includes from parsed YAML.
Only extracts packages that are from test_build_components/common/,
ignoring component-specific packages.
Args: Args:
data: Parsed YAML dictionary data: Parsed YAML dictionary
Returns: Returns:
Dictionary mapping package name to include path (as string representation) Dictionary mapping package name to include path (as string representation)
Only includes common bus packages (i2c, spi, uart, etc.)
""" """
if "packages" not in data: if "packages" not in data:
return {} return {}
# Get common bus package names (cached)
common_bus_packages = get_common_bus_packages()
packages = {} packages = {}
for name, value in data["packages"].items(): for name, value in data["packages"].items():
# Store package info for comparison # Only include common bus packages, ignore component-specific ones
if name in common_bus_packages:
packages[name] = str(value) packages[name] = str(value)
return packages return packages

View File

@@ -81,13 +81,15 @@ def create_intelligent_batches(
sorted_groups = sorted(signature_groups.items(), key=sort_key) sorted_groups = sorted(signature_groups.items(), key=sort_key)
# Flatten all components while preserving priority order
# This allows us to fill batches to batch_size by mixing signature groups
all_components_ordered = []
for (platform, signature), group_components in sorted_groups: for (platform, signature), group_components in sorted_groups:
# Split this signature group into batches of batch_size all_components_ordered.extend(sorted(group_components))
# This keeps components with the same signature together
sorted_components = sorted(group_components) # Sort for determinism
for i in range(0, len(sorted_components), batch_size): # Create batches of exactly batch_size (except possibly the last one)
batch = sorted_components[i : i + batch_size] for i in range(0, len(all_components_ordered), batch_size):
batch = all_components_ordered[i : i + batch_size]
batches.append(batch) batches.append(batch)
return batches return batches