1
0
mirror of https://github.com/esphome/esphome.git synced 2025-11-17 15:26:01 +00:00

Compare commits

..

1 Commits

Author SHA1 Message Date
J. Nick Koston
23be236133 [number] Modernize to C++17 nested namespaces 2025-11-16 20:54:43 -06:00
11 changed files with 39 additions and 136 deletions

View File

@@ -1,8 +1,7 @@
#include "automation.h"
#include "esphome/core/log.h"
namespace esphome {
namespace number {
namespace esphome::number {
static const char *const TAG = "number.automation";
@@ -52,5 +51,4 @@ void ValueRangeTrigger::on_state_(float state) {
this->rtc_.save(&in_range);
}
} // namespace number
} // namespace esphome
} // namespace esphome::number

View File

@@ -4,8 +4,7 @@
#include "esphome/core/automation.h"
#include "esphome/core/component.h"
namespace esphome {
namespace number {
namespace esphome::number {
class NumberStateTrigger : public Trigger<float> {
public:
@@ -91,5 +90,4 @@ template<typename... Ts> class NumberInRangeCondition : public Condition<Ts...>
float max_{NAN};
};
} // namespace number
} // namespace esphome
} // namespace esphome::number

View File

@@ -3,8 +3,7 @@
#include "esphome/core/controller_registry.h"
#include "esphome/core/log.h"
namespace esphome {
namespace number {
namespace esphome::number {
static const char *const TAG = "number";
@@ -43,5 +42,4 @@ void Number::add_on_state_callback(std::function<void(float)> &&callback) {
this->state_callback_.add(std::move(callback));
}
} // namespace number
} // namespace esphome
} // namespace esphome::number

View File

@@ -6,8 +6,7 @@
#include "number_call.h"
#include "number_traits.h"
namespace esphome {
namespace number {
namespace esphome::number {
class Number;
void log_number(const char *tag, const char *prefix, const char *type, Number *obj);
@@ -53,5 +52,4 @@ class Number : public EntityBase {
CallbackManager<void(float)> state_callback_;
};
} // namespace number
} // namespace esphome
} // namespace esphome::number

View File

@@ -2,8 +2,7 @@
#include "number.h"
#include "esphome/core/log.h"
namespace esphome {
namespace number {
namespace esphome::number {
static const char *const TAG = "number";
@@ -125,5 +124,4 @@ void NumberCall::perform() {
this->parent_->control(target_value);
}
} // namespace number
} // namespace esphome
} // namespace esphome::number

View File

@@ -4,8 +4,7 @@
#include "esphome/core/log.h"
#include "number_traits.h"
namespace esphome {
namespace number {
namespace esphome::number {
class Number;
@@ -44,5 +43,4 @@ class NumberCall {
bool cycle_;
};
} // namespace number
} // namespace esphome
} // namespace esphome::number

View File

@@ -1,10 +1,8 @@
#include "esphome/core/log.h"
#include "number_traits.h"
namespace esphome {
namespace number {
namespace esphome::number {
static const char *const TAG = "number";
} // namespace number
} // namespace esphome
} // namespace esphome::number

View File

@@ -3,8 +3,7 @@
#include "esphome/core/entity_base.h"
#include "esphome/core/helpers.h"
namespace esphome {
namespace number {
namespace esphome::number {
enum NumberMode : uint8_t {
NUMBER_MODE_AUTO = 0,
@@ -35,5 +34,4 @@ class NumberTraits : public EntityBase_DeviceClass, public EntityBase_UnitOfMeas
NumberMode mode_{NUMBER_MODE_AUTO};
};
} // namespace number
} // namespace esphome
} // namespace esphome::number

View File

@@ -338,44 +338,21 @@ def check_replaceme(value):
)
def _get_item_id(item: Any) -> str | Extend | Remove | None:
"""Attempts to get a list item's ID"""
if not isinstance(item, dict):
return None # not a dict, can't have ID
# 1.- Check regular case:
# - id: my_id
item_id = item.get(CONF_ID)
if item_id is None and len(item) == 1:
# 2.- Check single-key dict case:
# - obj:
# id: my_id
item = next(iter(item.values()))
if isinstance(item, dict):
item_id = item.get(CONF_ID)
if isinstance(item_id, Extend):
# Remove instances of Extend so they don't overwrite the original item when merging:
del item[CONF_ID]
return item_id
def _build_list_index(
lst: list[Any],
) -> tuple[
OrderedDict[str | Extend | Remove, Any], list[tuple[int, str, Any]], set[str]
]:
def _build_list_index(lst):
index = OrderedDict()
extensions, removals = [], set()
for pos, item in enumerate(lst):
for item in lst:
if item is None:
removals.add(None)
continue
item_id = _get_item_id(item)
if isinstance(item_id, Extend):
extensions.append((pos, item_id.value, item))
continue
if isinstance(item_id, Remove):
removals.add(item_id.value)
continue
item_id = None
if isinstance(item, dict) and (item_id := item.get(CONF_ID)):
if isinstance(item_id, Extend):
extensions.append(item)
continue
if isinstance(item_id, Remove):
removals.add(item_id.value)
continue
if not item_id or item_id in index:
# no id or duplicate -> pass through with identity-based key
item_id = id(item)
@@ -383,7 +360,7 @@ def _build_list_index(
return index, extensions, removals
def resolve_extend_remove(value: Any, is_key: bool = False) -> None:
def resolve_extend_remove(value, is_key=None):
if isinstance(value, ESPLiteralValue):
return # do not check inside literal blocks
if isinstance(value, list):
@@ -391,16 +368,26 @@ def resolve_extend_remove(value: Any, is_key: bool = False) -> None:
if extensions or removals:
# Rebuild the original list after
# processing all extensions and removals
for pos, item_id, item in extensions:
for item in extensions:
item_id = item[CONF_ID].value
if item_id in removals:
continue
old = index.get(item_id)
if old is None:
# Failed to find source for extension
with cv.prepend_path(pos):
# Find index of item to show error at correct position
i = next(
(
i
for i, d in enumerate(value)
if d.get(CONF_ID) == item[CONF_ID]
)
)
with cv.prepend_path(i):
raise cv.Invalid(
f"Source for extension of ID '{item_id}' was not found."
)
item[CONF_ID] = item_id
index[item_id] = merge_config(old, item)
for item_id in removals:
index.pop(item_id, None)

View File

@@ -7,27 +7,3 @@ some_component:
value: 2
- id: component2
value: 5
lvgl:
pages:
- id: page1
widgets:
- obj:
id: object1
x: 3
y: 2
width: 4
- obj:
id: object3
x: 6
y: 12
widgets:
- obj:
id: object4
x: 14
y: 9
width: 15
height: 13
- obj:
id: object5
x: 10
y: 11

View File

@@ -13,30 +13,6 @@ packages:
value: 5
- id: component3
value: 6
- lvgl:
pages:
- id: page1
widgets:
- obj:
id: object1
x: 1
y: 2
- obj:
id: object2
x: 5
- obj:
id: object3
x: 6
y: 7
widgets:
- obj:
id: object4
x: 8
y: 9
- obj:
id: object5
x: 10
y: 11
some_component:
- id: !extend ${A}
@@ -44,23 +20,3 @@ some_component:
- id: component2
value: 3
- id: !remove ${C}
lvgl:
pages:
- id: !extend page1
widgets:
- obj:
id: !extend object1
x: 3
width: 4
- obj:
id: !remove object2
- obj:
id: !extend object3
y: 12
height: 13
widgets:
- obj:
id: !extend object4
x: 14
width: 15