mirror of
https://github.com/esphome/esphome.git
synced 2025-10-12 23:03:46 +01:00
tweak
This commit is contained in:
@@ -78,6 +78,38 @@ def uses_local_file_references(component_dir: Path) -> bool:
|
|||||||
return bool(re.search(r"\$\{?component_dir\}?", content))
|
return bool(re.search(r"\$\{?component_dir\}?", content))
|
||||||
|
|
||||||
|
|
||||||
|
def is_platform_component(component_dir: Path) -> bool:
|
||||||
|
"""Check if a component is a platform component (abstract base class).
|
||||||
|
|
||||||
|
Platform components have IS_PLATFORM_COMPONENT = True and cannot be
|
||||||
|
instantiated without a platform-specific implementation. These components
|
||||||
|
define abstract methods and cause linker errors if compiled standalone.
|
||||||
|
|
||||||
|
Examples: canbus, mcp23x08_base, mcp23x17_base
|
||||||
|
|
||||||
|
Args:
|
||||||
|
component_dir: Path to the component's test directory
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True if this is a platform component
|
||||||
|
"""
|
||||||
|
# Check in the actual component source, not tests
|
||||||
|
# tests/components/X -> tests/components -> tests -> repo root
|
||||||
|
repo_root = component_dir.parent.parent.parent
|
||||||
|
comp_init = (
|
||||||
|
repo_root / "esphome" / "components" / component_dir.name / "__init__.py"
|
||||||
|
)
|
||||||
|
|
||||||
|
if not comp_init.exists():
|
||||||
|
return False
|
||||||
|
|
||||||
|
try:
|
||||||
|
content = comp_init.read_text()
|
||||||
|
return "IS_PLATFORM_COMPONENT = True" in content
|
||||||
|
except Exception: # pylint: disable=broad-exception-caught
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def extract_common_buses(yaml_file: Path) -> set[str]:
|
def extract_common_buses(yaml_file: Path) -> set[str]:
|
||||||
"""Extract which common bus configs are included in a YAML test file.
|
"""Extract which common bus configs are included in a YAML test file.
|
||||||
|
|
||||||
@@ -149,7 +181,7 @@ def analyze_all_components(
|
|||||||
Returns:
|
Returns:
|
||||||
Tuple of:
|
Tuple of:
|
||||||
- Dictionary mapping component name to platform->buses mapping
|
- Dictionary mapping component name to platform->buses mapping
|
||||||
- Set of component names that use local files (cannot be grouped)
|
- Set of component names that cannot be grouped (use local files or are platform components)
|
||||||
"""
|
"""
|
||||||
if tests_dir is None:
|
if tests_dir is None:
|
||||||
tests_dir = Path("tests/components")
|
tests_dir = Path("tests/components")
|
||||||
@@ -175,6 +207,11 @@ def analyze_all_components(
|
|||||||
if uses_local_file_references(component_dir):
|
if uses_local_file_references(component_dir):
|
||||||
non_groupable.add(component_name)
|
non_groupable.add(component_name)
|
||||||
|
|
||||||
|
# Check if component is a platform component (abstract base class)
|
||||||
|
# Platform components define abstract methods and cause linker errors
|
||||||
|
if is_platform_component(component_dir):
|
||||||
|
non_groupable.add(component_name)
|
||||||
|
|
||||||
return components, non_groupable
|
return components, non_groupable
|
||||||
|
|
||||||
|
|
||||||
@@ -280,6 +317,8 @@ def main() -> None:
|
|||||||
components[comp] = platform_buses
|
components[comp] = platform_buses
|
||||||
if uses_local_file_references(comp_dir):
|
if uses_local_file_references(comp_dir):
|
||||||
non_groupable.add(comp)
|
non_groupable.add(comp)
|
||||||
|
if is_platform_component(comp_dir):
|
||||||
|
non_groupable.add(comp)
|
||||||
else:
|
else:
|
||||||
# Analyze all components
|
# Analyze all components
|
||||||
components, non_groupable = analyze_all_components(tests_dir)
|
components, non_groupable = analyze_all_components(tests_dir)
|
||||||
|
@@ -10,6 +10,7 @@ display:
|
|||||||
|
|
||||||
touchscreen:
|
touchscreen:
|
||||||
- platform: ft63x6
|
- platform: ft63x6
|
||||||
|
id: ft63x6_touchscreen
|
||||||
interrupt_pin: ${interrupt_pin}
|
interrupt_pin: ${interrupt_pin}
|
||||||
transform:
|
transform:
|
||||||
swap_xy: true
|
swap_xy: true
|
||||||
|
Reference in New Issue
Block a user