1
0
mirror of https://github.com/esphome/esphome.git synced 2026-02-08 00:31:58 +00:00

Bump ruff from 0.14.14 to 0.15.0 (#13752)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: J. Nick Koston <nick@home-assistant.io>
This commit is contained in:
dependabot[bot]
2026-02-04 09:24:05 +00:00
committed by GitHub
parent 2541ec1565
commit 4d05cd3059
15 changed files with 60 additions and 65 deletions

View File

@@ -11,7 +11,7 @@ ci:
repos: repos:
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version. # Ruff version.
rev: v0.14.14 rev: v0.15.0
hooks: hooks:
# Run the linter. # Run the linter.
- id: ruff - id: ruff

View File

@@ -183,7 +183,7 @@ async def to_code(config):
if CORE.using_zephyr: if CORE.using_zephyr:
zephyr_add_prj_conf("I2C", True) zephyr_add_prj_conf("I2C", True)
i2c = "i2c0" i2c = "i2c0"
if zephyr_data()[KEY_BOARD] in ["xiao_ble"]: if zephyr_data()[KEY_BOARD] == "xiao_ble":
i2c = "i2c1" i2c = "i2c1"
zephyr_add_overlay( zephyr_add_overlay(
f""" f"""

View File

@@ -272,9 +272,7 @@ async def obj_hide_to_code(config, action_id, template_arg, args):
async def do_hide(widget: Widget): async def do_hide(widget: Widget):
widget.add_flag("LV_OBJ_FLAG_HIDDEN") widget.add_flag("LV_OBJ_FLAG_HIDDEN")
widgets = [ widgets = [widget.outer or widget for widget in await get_widgets(config)]
widget.outer if widget.outer else widget for widget in await get_widgets(config)
]
return await action_to_code(widgets, do_hide, action_id, template_arg, args) return await action_to_code(widgets, do_hide, action_id, template_arg, args)
@@ -285,9 +283,7 @@ async def obj_show_to_code(config, action_id, template_arg, args):
if widget.move_to_foreground: if widget.move_to_foreground:
lv_obj.move_foreground(widget.obj) lv_obj.move_foreground(widget.obj)
widgets = [ widgets = [widget.outer or widget for widget in await get_widgets(config)]
widget.outer if widget.outer else widget for widget in await get_widgets(config)
]
return await action_to_code(widgets, do_show, action_id, template_arg, args) return await action_to_code(widgets, do_show, action_id, template_arg, args)

View File

@@ -31,7 +31,9 @@ def define_has_settings(keys: list[str], schemas: dict[str, SettingSchema]) -> N
cg.RawExpression( cg.RawExpression(
" sep ".join( " sep ".join(
map( map(
lambda key: f"F({schemas[key].backing_type}, {key}_setting, {schemas[key].default_value})", lambda key: (
f"F({schemas[key].backing_type}, {key}_setting, {schemas[key].default_value})"
),
keys, keys,
) )
) )

View File

@@ -213,9 +213,10 @@ def copy_files():
zephyr_data()[KEY_OVERLAY], zephyr_data()[KEY_OVERLAY],
) )
if zephyr_data()[KEY_BOOTLOADER] == BOOTLOADER_MCUBOOT or zephyr_data()[ if (
KEY_BOARD zephyr_data()[KEY_BOOTLOADER] == BOOTLOADER_MCUBOOT
] in ["xiao_ble"]: or zephyr_data()[KEY_BOARD] == "xiao_ble"
):
fake_board_manifest = """ fake_board_manifest = """
{ {
"frameworks": [ "frameworks": [

View File

@@ -682,7 +682,7 @@ def only_with_framework(
def validator_(obj): def validator_(obj):
if CORE.target_framework not in frameworks: if CORE.target_framework not in frameworks:
err_str = f"This feature is only available with framework(s) {', '.join([framework.value for framework in frameworks])}" err_str = f"This feature is only available with framework(s) {', '.join([framework.value for framework in frameworks])}"
if suggestion := suggestions.get(CORE.target_framework, None): if suggestion := suggestions.get(CORE.target_framework):
(component, docs_path) = suggestion (component, docs_path) = suggestion
err_str += f"\nPlease use '{component}'" err_str += f"\nPlease use '{component}'"
if docs_path: if docs_path:

View File

@@ -2,19 +2,7 @@
from __future__ import annotations from __future__ import annotations
from enum import Enum from enum import StrEnum as _StrEnum
from typing import Any
# Re-export StrEnum from standard library for backwards compatibility
class StrEnum(str, Enum): StrEnum = _StrEnum
"""Partial backport of Python 3.11's StrEnum for our basic use cases."""
def __new__(cls, value: str, *args: Any, **kwargs: Any) -> StrEnum:
"""Create a new StrEnum instance."""
if not isinstance(value, str):
raise TypeError(f"{value!r} is not a string")
return super().__new__(cls, value, *args, **kwargs)
def __str__(self) -> str:
"""Return self.value."""
return str(self.value)

View File

@@ -470,7 +470,7 @@ def wizard(path: Path) -> int:
sleep(1) sleep(1)
# Do not create wifi if the board does not support it # Do not create wifi if the board does not support it
if board not in ["rpipico"]: if board != "rpipico":
safe_print_step(3, WIFI_BIG) safe_print_step(3, WIFI_BIG)
safe_print("In this step, I'm going to create the configuration for WiFi.") safe_print("In this step, I'm going to create the configuration for WiFi.")
safe_print() safe_print()

View File

@@ -1,6 +1,6 @@
pylint==4.0.4 pylint==4.0.4
flake8==7.3.0 # also change in .pre-commit-config.yaml when updating flake8==7.3.0 # also change in .pre-commit-config.yaml when updating
ruff==0.14.14 # also change in .pre-commit-config.yaml when updating ruff==0.15.0 # also change in .pre-commit-config.yaml when updating
pyupgrade==3.21.2 # also change in .pre-commit-config.yaml when updating pyupgrade==3.21.2 # also change in .pre-commit-config.yaml when updating
pre-commit pre-commit

View File

@@ -280,7 +280,7 @@ class TypeInfo(ABC):
""" """
field_id_size = self.calculate_field_id_size() field_id_size = self.calculate_field_id_size()
method = f"{base_method}_force" if force else base_method method = f"{base_method}_force" if force else base_method
value = value_expr if value_expr else name value = value_expr or name
return f"size.{method}({field_id_size}, {value});" return f"size.{method}({field_id_size}, {value});"
@abstractmethod @abstractmethod

View File

@@ -249,7 +249,7 @@ def merge_component_configs(
if all_packages is None: if all_packages is None:
# First component - initialize package dict # First component - initialize package dict
all_packages = comp_packages if comp_packages else {} all_packages = comp_packages or {}
elif comp_packages: elif comp_packages:
# Merge packages - combine all unique package types # Merge packages - combine all unique package types
# If both have the same package type, verify they're identical # If both have the same package type, verify they're identical

View File

@@ -98,9 +98,11 @@ async def test_script_queued(
if not test3_complete.done(): if not test3_complete.done():
loop.call_later( loop.call_later(
0.3, 0.3,
lambda: test3_complete.set_result(True) lambda: (
if not test3_complete.done() test3_complete.set_result(True)
else None, if not test3_complete.done()
else None
),
) )
# Test 4: Rejection # Test 4: Rejection

View File

@@ -1011,8 +1011,8 @@ def test_get_all_dependencies_handles_missing_components() -> None:
comp.dependencies = ["missing_comp"] comp.dependencies = ["missing_comp"]
comp.auto_load = [] comp.auto_load = []
mock_get_component.side_effect = ( mock_get_component.side_effect = lambda name: (
lambda name: comp if name == "existing" else None comp if name == "existing" else None
) )
result = helpers.get_all_dependencies({"existing", "nonexistent"}) result = helpers.get_all_dependencies({"existing", "nonexistent"})

View File

@@ -453,11 +453,14 @@ def test_preload_core_config_no_platform(setup_core: Path) -> None:
# Mock _is_target_platform to avoid expensive component loading # Mock _is_target_platform to avoid expensive component loading
with patch("esphome.core.config._is_target_platform") as mock_is_platform: with patch("esphome.core.config._is_target_platform") as mock_is_platform:
# Return True for known platforms # Return True for known platforms
mock_is_platform.side_effect = lambda name: name in [ mock_is_platform.side_effect = lambda name: (
"esp32", name
"esp8266", in [
"rp2040", "esp32",
] "esp8266",
"rp2040",
]
)
with pytest.raises(cv.Invalid, match="Platform missing"): with pytest.raises(cv.Invalid, match="Platform missing"):
preload_core_config(config, result) preload_core_config(config, result)
@@ -477,11 +480,14 @@ def test_preload_core_config_multiple_platforms(setup_core: Path) -> None:
# Mock _is_target_platform to avoid expensive component loading # Mock _is_target_platform to avoid expensive component loading
with patch("esphome.core.config._is_target_platform") as mock_is_platform: with patch("esphome.core.config._is_target_platform") as mock_is_platform:
# Return True for known platforms # Return True for known platforms
mock_is_platform.side_effect = lambda name: name in [ mock_is_platform.side_effect = lambda name: (
"esp32", name
"esp8266", in [
"rp2040", "esp32",
] "esp8266",
"rp2040",
]
)
with pytest.raises(cv.Invalid, match="Found multiple target platform blocks"): with pytest.raises(cv.Invalid, match="Found multiple target platform blocks"):
preload_core_config(config, result) preload_core_config(config, result)

View File

@@ -466,8 +466,8 @@ def test_clean_build(
) as mock_get_instance: ) as mock_get_instance:
mock_config = MagicMock() mock_config = MagicMock()
mock_get_instance.return_value = mock_config mock_get_instance.return_value = mock_config
mock_config.get.side_effect = ( mock_config.get.side_effect = lambda section, option: (
lambda section, option: str(platformio_cache_dir) str(platformio_cache_dir)
if (section, option) == ("platformio", "cache_dir") if (section, option) == ("platformio", "cache_dir")
else "" else ""
) )
@@ -630,8 +630,8 @@ def test_clean_build_empty_cache_dir(
) as mock_get_instance: ) as mock_get_instance:
mock_config = MagicMock() mock_config = MagicMock()
mock_get_instance.return_value = mock_config mock_get_instance.return_value = mock_config
mock_config.get.side_effect = ( mock_config.get.side_effect = lambda section, option: (
lambda section, option: " " # Whitespace only " " # Whitespace only
if (section, option) == ("platformio", "cache_dir") if (section, option) == ("platformio", "cache_dir")
else "" else ""
) )
@@ -1574,8 +1574,8 @@ def test_copy_src_tree_writes_build_info_files(
mock_component.resources = mock_resources mock_component.resources = mock_resources
# Setup mocks # Setup mocks
mock_core.relative_src_path.side_effect = lambda *args: src_path.joinpath(*args) mock_core.relative_src_path.side_effect = src_path.joinpath
mock_core.relative_build_path.side_effect = lambda *args: build_path.joinpath(*args) mock_core.relative_build_path.side_effect = build_path.joinpath
mock_core.defines = [] mock_core.defines = []
mock_core.config_hash = 0xDEADBEEF mock_core.config_hash = 0xDEADBEEF
mock_core.comment = "Test comment" mock_core.comment = "Test comment"
@@ -1649,8 +1649,8 @@ def test_copy_src_tree_detects_config_hash_change(
build_info_h_path.write_text("// old build_info_data.h") build_info_h_path.write_text("// old build_info_data.h")
# Setup mocks # Setup mocks
mock_core.relative_src_path.side_effect = lambda *args: src_path.joinpath(*args) mock_core.relative_src_path.side_effect = src_path.joinpath
mock_core.relative_build_path.side_effect = lambda *args: build_path.joinpath(*args) mock_core.relative_build_path.side_effect = build_path.joinpath
mock_core.defines = [] mock_core.defines = []
mock_core.config_hash = 0xDEADBEEF # Different from existing mock_core.config_hash = 0xDEADBEEF # Different from existing
mock_core.comment = "" mock_core.comment = ""
@@ -1711,8 +1711,8 @@ def test_copy_src_tree_detects_version_change(
build_info_h_path.write_text("// old build_info_data.h") build_info_h_path.write_text("// old build_info_data.h")
# Setup mocks # Setup mocks
mock_core.relative_src_path.side_effect = lambda *args: src_path.joinpath(*args) mock_core.relative_src_path.side_effect = src_path.joinpath
mock_core.relative_build_path.side_effect = lambda *args: build_path.joinpath(*args) mock_core.relative_build_path.side_effect = build_path.joinpath
mock_core.defines = [] mock_core.defines = []
mock_core.config_hash = 0xDEADBEEF mock_core.config_hash = 0xDEADBEEF
mock_core.comment = "" mock_core.comment = ""
@@ -1761,8 +1761,8 @@ def test_copy_src_tree_handles_invalid_build_info_json(
build_info_h_path.write_text("// old build_info_data.h") build_info_h_path.write_text("// old build_info_data.h")
# Setup mocks # Setup mocks
mock_core.relative_src_path.side_effect = lambda *args: src_path.joinpath(*args) mock_core.relative_src_path.side_effect = src_path.joinpath
mock_core.relative_build_path.side_effect = lambda *args: build_path.joinpath(*args) mock_core.relative_build_path.side_effect = build_path.joinpath
mock_core.defines = [] mock_core.defines = []
mock_core.config_hash = 0xDEADBEEF mock_core.config_hash = 0xDEADBEEF
mock_core.comment = "" mock_core.comment = ""
@@ -1835,8 +1835,8 @@ def test_copy_src_tree_build_info_timestamp_behavior(
mock_component.resources = mock_resources mock_component.resources = mock_resources
# Setup mocks # Setup mocks
mock_core.relative_src_path.side_effect = lambda *args: src_path.joinpath(*args) mock_core.relative_src_path.side_effect = src_path.joinpath
mock_core.relative_build_path.side_effect = lambda *args: build_path.joinpath(*args) mock_core.relative_build_path.side_effect = build_path.joinpath
mock_core.defines = [] mock_core.defines = []
mock_core.config_hash = 0xDEADBEEF mock_core.config_hash = 0xDEADBEEF
mock_core.comment = "" mock_core.comment = ""
@@ -1930,8 +1930,8 @@ def test_copy_src_tree_detects_removed_source_file(
existing_file.write_text("// test file") existing_file.write_text("// test file")
# Setup mocks - no components, so the file should be removed # Setup mocks - no components, so the file should be removed
mock_core.relative_src_path.side_effect = lambda *args: src_path.joinpath(*args) mock_core.relative_src_path.side_effect = src_path.joinpath
mock_core.relative_build_path.side_effect = lambda *args: build_path.joinpath(*args) mock_core.relative_build_path.side_effect = build_path.joinpath
mock_core.defines = [] mock_core.defines = []
mock_core.config_hash = 0xDEADBEEF mock_core.config_hash = 0xDEADBEEF
mock_core.comment = "" mock_core.comment = ""
@@ -1992,8 +1992,8 @@ def test_copy_src_tree_ignores_removed_generated_file(
build_info_h.write_text("// old generated file") build_info_h.write_text("// old generated file")
# Setup mocks # Setup mocks
mock_core.relative_src_path.side_effect = lambda *args: src_path.joinpath(*args) mock_core.relative_src_path.side_effect = src_path.joinpath
mock_core.relative_build_path.side_effect = lambda *args: build_path.joinpath(*args) mock_core.relative_build_path.side_effect = build_path.joinpath
mock_core.defines = [] mock_core.defines = []
mock_core.config_hash = 0xDEADBEEF mock_core.config_hash = 0xDEADBEEF
mock_core.comment = "" mock_core.comment = ""