Skip to content

Commit 50c72b0

Browse files
committed
Reuse conversion to serializable
Signed-off-by: David Rapan <[email protected]>
1 parent 9c347b7 commit 50c72b0

File tree

3 files changed

+26
-25
lines changed

3 files changed

+26
-25
lines changed

homeassistant/components/sql/sensor.py

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
from __future__ import annotations
44

5-
from datetime import date
6-
import decimal
75
import logging
86
from typing import TYPE_CHECKING, Any
97

@@ -44,6 +42,7 @@
4442
from .const import CONF_ADVANCED_OPTIONS, CONF_COLUMN_NAME, CONF_QUERY, DOMAIN
4543
from .util import (
4644
async_create_sessionmaker,
45+
ensure_serializable,
4746
generate_lambda_stmt,
4847
redact_credentials,
4948
resolve_db_url,
@@ -247,19 +246,13 @@ def extra_state_attributes(self) -> dict[str, Any] | None:
247246
def _process(self, result: Result) -> None:
248247
"""Process the SQL result."""
249248
data = None
250-
extra_state_attributes = {}
251-
for res in result.mappings():
252-
_LOGGER.debug("Query %s result in %s", self._query, res.items())
253-
data = res[self._column_name]
254-
for key, value in res.items():
255-
if isinstance(value, decimal.Decimal):
256-
value = float(value)
257-
elif isinstance(value, date):
258-
value = value.isoformat()
259-
elif isinstance(value, (bytes, bytearray)):
260-
value = f"0x{value.hex()}"
261-
extra_state_attributes[key] = value
262-
self._attr_extra_state_attributes[key] = value
249+
250+
for row in result.mappings():
251+
row_items = row.items()
252+
_LOGGER.debug("Query %s result in %s", self._query, row_items)
253+
data = row[self._column_name]
254+
for key, value in row_items:
255+
self._attr_extra_state_attributes[key] = ensure_serializable(value)
263256

264257
if data is not None and isinstance(data, (bytes, bytearray)):
265258
data = f"0x{data.hex()}"

homeassistant/components/sql/services.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
from __future__ import annotations
44

5-
import datetime
6-
import decimal
75
import logging
86
from typing import TYPE_CHECKING
97

@@ -28,6 +26,7 @@
2826
from .const import CONF_QUERY, DOMAIN
2927
from .util import (
3028
async_create_sessionmaker,
29+
ensure_serializable,
3130
generate_lambda_stmt,
3231
redact_credentials,
3332
resolve_db_url,
@@ -77,14 +76,7 @@ def _process(result: Result) -> list[JsonValueType]:
7776
for row in result.mappings():
7877
processed_row: dict[str, JsonValueType] = {}
7978
for key, value in row.items():
80-
if isinstance(value, decimal.Decimal):
81-
processed_row[key] = float(value)
82-
elif isinstance(value, datetime.date):
83-
processed_row[key] = value.isoformat()
84-
elif isinstance(value, (bytes, bytearray)):
85-
processed_row[key] = f"0x{value.hex()}"
86-
else:
87-
processed_row[key] = value
79+
processed_row[key] = ensure_serializable(value)
8880
rows.append(processed_row)
8981
return rows
9082

homeassistant/components/sql/util.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
from __future__ import annotations
44

55
import asyncio
6+
from datetime import date
7+
from decimal import Decimal
68
import logging
9+
from typing import Any
710

811
import sqlalchemy
912
from sqlalchemy import lambda_stmt
@@ -254,3 +257,16 @@ def generate_lambda_stmt(query: str) -> StatementLambdaElement:
254257
"""Generate the lambda statement."""
255258
text = sqlalchemy.text(query)
256259
return lambda_stmt(lambda: text, lambda_cache=_SQL_LAMBDA_CACHE)
260+
261+
262+
def ensure_serializable(value: Any):
263+
"""Ensure value is serializable."""
264+
match value:
265+
case Decimal():
266+
return float(value)
267+
case date():
268+
return value.isoformat()
269+
case bytes() | bytearray():
270+
return f"0x{value.hex()}"
271+
case _:
272+
return value

0 commit comments

Comments
 (0)