1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-22 05:02:23 +01:00

Merge remote-tracking branch 'upstream/fold_ring_buffer_esp32_ble_tracker' into integration

This commit is contained in:
J. Nick Koston
2025-08-03 19:32:34 -10:00
9 changed files with 36 additions and 15 deletions

View File

@@ -168,6 +168,8 @@ This document provides essential context for AI models interacting with this pro
* `platformio.ini`: Configures the PlatformIO build environments for different microcontrollers. * `platformio.ini`: Configures the PlatformIO build environments for different microcontrollers.
* `.pre-commit-config.yaml`: Configures the pre-commit hooks for linting and formatting. * `.pre-commit-config.yaml`: Configures the pre-commit hooks for linting and formatting.
* **CI/CD Pipeline:** Defined in `.github/workflows`. * **CI/CD Pipeline:** Defined in `.github/workflows`.
* **Static Analysis & Development:**
* `esphome/core/defines.h`: A comprehensive header file containing all `#define` directives that can be added by components using `cg.add_define()` in Python. This file is used exclusively for development, static analysis tools, and CI testing - it is not used during runtime compilation. When developing components that add new defines, they must be added to this file to ensure proper IDE support and static analysis coverage. The file includes feature flags, build configurations, and platform-specific defines that help static analyzers understand the complete codebase without needing to compile for specific platforms.
## 6. Development & Testing Workflow ## 6. Development & Testing Workflow

View File

@@ -748,7 +748,7 @@ def _set_default_framework(config):
config[CONF_FRAMEWORK][CONF_TYPE] = FRAMEWORK_ARDUINO config[CONF_FRAMEWORK][CONF_TYPE] = FRAMEWORK_ARDUINO
# Show the migration message # Show the migration message
_show_framework_migration_message( _show_framework_migration_message(
config.get(CONF_NAME, "Your device"), variant config.get(CONF_NAME, "This device"), variant
) )
else: else:
config[CONF_FRAMEWORK] = ESP_IDF_FRAMEWORK_SCHEMA({}) config[CONF_FRAMEWORK] = ESP_IDF_FRAMEWORK_SCHEMA({})

View File

@@ -15,6 +15,7 @@ from freetype import (
FT_LOAD_RENDER, FT_LOAD_RENDER,
FT_LOAD_TARGET_MONO, FT_LOAD_TARGET_MONO,
Face, Face,
FT_Exception,
ft_pixel_mode_mono, ft_pixel_mode_mono,
) )
import requests import requests
@@ -94,7 +95,14 @@ class FontCache(MutableMapping):
return self.store[self._keytransform(item)] return self.store[self._keytransform(item)]
def __setitem__(self, key, value): def __setitem__(self, key, value):
self.store[self._keytransform(key)] = Face(str(value)) transformed = self._keytransform(key)
try:
self.store[transformed] = Face(str(value))
except FT_Exception as exc:
file = transformed.split(":", 1)
raise cv.Invalid(
f"{file[0].capitalize()} {file[1]} is not a valid font file"
) from exc
FONT_CACHE = FontCache() FONT_CACHE = FontCache()

View File

@@ -1,4 +1,4 @@
#include "binary_sensor.h" #include "nfc_binary_sensor.h"
#include "../nfc_helpers.h" #include "../nfc_helpers.h"
#include "esphome/core/log.h" #include "esphome/core/log.h"

View File

@@ -425,7 +425,7 @@ void AsyncEventSourceResponse::destroy(void *ptr) {
void AsyncEventSourceResponse::deq_push_back_with_dedup_(void *source, message_generator_t *message_generator) { void AsyncEventSourceResponse::deq_push_back_with_dedup_(void *source, message_generator_t *message_generator) {
DeferredEvent item(source, message_generator); DeferredEvent item(source, message_generator);
// Replace std::find_if with simple loop to reduce binary size // Use range-based for loop instead of std::find_if to reduce template instantiation overhead and binary size
for (auto &event : this->deferred_queue_) { for (auto &event : this->deferred_queue_) {
if (event == item) { if (event == item) {
event = item; event = item;

View File

@@ -87,7 +87,7 @@ from esphome.core import (
TimePeriodNanoseconds, TimePeriodNanoseconds,
TimePeriodSeconds, TimePeriodSeconds,
) )
from esphome.helpers import add_class_to_obj, list_starts_with from esphome.helpers import add_class_to_obj, docs_url, list_starts_with
from esphome.schema_extractors import ( from esphome.schema_extractors import (
SCHEMA_EXTRACT, SCHEMA_EXTRACT,
schema_extractor, schema_extractor,
@@ -666,14 +666,6 @@ def only_with_framework(
if suggestions is None: if suggestions is None:
suggestions = {} suggestions = {}
version = Version.parse(ESPHOME_VERSION)
if version.is_beta:
docs_format = "https://beta.esphome.io/components/{path}"
elif version.is_dev:
docs_format = "https://next.esphome.io/components/{path}"
else:
docs_format = "https://esphome.io/components/{path}"
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])}"
@@ -681,7 +673,7 @@ def only_with_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:
err_str += f": {docs_format.format(path=docs_path)}" err_str += f": {docs_url(path=f'components/{docs_path}')}"
raise Invalid(err_str) raise Invalid(err_str)
return obj return obj

View File

@@ -9,6 +9,8 @@ import re
import tempfile import tempfile
from urllib.parse import urlparse from urllib.parse import urlparse
from esphome.const import __version__ as ESPHOME_VERSION
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
IS_MACOS = platform.system() == "Darwin" IS_MACOS = platform.system() == "Darwin"
@@ -503,3 +505,20 @@ _DISALLOWED_CHARS = re.compile(r"[^a-zA-Z0-9-_]")
def sanitize(value): def sanitize(value):
"""Same behaviour as `helpers.cpp` method `str_sanitize`.""" """Same behaviour as `helpers.cpp` method `str_sanitize`."""
return _DISALLOWED_CHARS.sub("_", value) return _DISALLOWED_CHARS.sub("_", value)
def docs_url(path: str) -> str:
"""Return the URL to the documentation for a given path."""
# Local import to avoid circular import
from esphome.config_validation import Version
version = Version.parse(ESPHOME_VERSION)
if version.is_beta:
docs_format = "https://beta.esphome.io/{path}"
elif version.is_dev:
docs_format = "https://next.esphome.io/{path}"
else:
docs_format = "https://esphome.io/{path}"
path = path.removeprefix("/")
return docs_format.format(path=path)

View File

@@ -12,7 +12,7 @@ platformio==6.1.18 # When updating platformio, also update /docker/Dockerfile
esptool==5.0.2 esptool==5.0.2
click==8.1.7 click==8.1.7
esphome-dashboard==20250514.0 esphome-dashboard==20250514.0
aioesphomeapi==37.2.3 aioesphomeapi==37.2.4
zeroconf==0.147.0 zeroconf==0.147.0
puremagic==1.30 puremagic==1.30
ruamel.yaml==0.18.14 # dashboard_import ruamel.yaml==0.18.14 # dashboard_import