From cbbceb4d0dedb663f6a4f6508a09b832f1501c8a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 21 Nov 2023 00:07:51 +0100 Subject: [PATCH] Ensure generated names are unique Instead of dropping chars in str_sanitize we now replace them with _ to avoid collisions fixes esphome/issues#5135 --- esphome/core/helpers.cpp | 4 ++-- esphome/helpers.py | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/esphome/core/helpers.cpp b/esphome/core/helpers.cpp index 714a1642f8..d6280fa537 100644 --- a/esphome/core/helpers.cpp +++ b/esphome/core/helpers.cpp @@ -279,9 +279,9 @@ std::string str_snake_case(const std::string &str) { } std::string str_sanitize(const std::string &str) { std::string out; - std::copy_if(str.begin(), str.end(), std::back_inserter(out), [](const char &c) { + std::replace_if(str.begin(), str.end(), [](const char &c) { return c == '-' || c == '_' || (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); - }); + }, '_'); return out; } std::string str_snprintf(const char *fmt, size_t len, ...) { diff --git a/esphome/helpers.py b/esphome/helpers.py index 4012b2067f..00416b591f 100644 --- a/esphome/helpers.py +++ b/esphome/helpers.py @@ -357,6 +357,9 @@ def snake_case(value): return value.replace(" ", "_").lower() +_DISALLOWED_CHARS = re.compile(r"[^a-zA-Z0-9_]") + + def sanitize(value): """Same behaviour as `helpers.cpp` method `str_sanitize`.""" - return re.sub("[^-_0-9a-zA-Z]", r"", value) + return _DISALLOWED_CHARS.sub("_", value)