Skip to content

Commit 449f0fa

Browse files
emontnemeryfrenck
andauthored
Bump floor registry to version 1.3 and sort floors (home-assistant#157614)
Co-authored-by: Franck Nijhof <[email protected]>
1 parent 2e008d2 commit 449f0fa

File tree

2 files changed

+306
-7
lines changed

2 files changed

+306
-7
lines changed

homeassistant/helpers/floor_registry.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import dataclasses
88
from dataclasses import dataclass
99
from datetime import datetime
10+
import math
1011
from typing import Any, Literal, TypedDict
1112

1213
from homeassistant.core import Event, HomeAssistant, callback
@@ -30,7 +31,7 @@
3031
)
3132
STORAGE_KEY = "core.floor_registry"
3233
STORAGE_VERSION_MAJOR = 1
33-
STORAGE_VERSION_MINOR = 2
34+
STORAGE_VERSION_MINOR = 3
3435

3536

3637
class _FloorStoreData(TypedDict):
@@ -102,6 +103,16 @@ async def _async_migrate_func(
102103
for floor in old_data["floors"]:
103104
floor["created_at"] = floor["modified_at"] = created_at
104105

106+
if old_minor_version < 3:
107+
# Version 1.3 sorts the floors by their level attribute, then by name
108+
old_data["floors"] = sorted(
109+
old_data["floors"],
110+
key=lambda floor: (
111+
math.inf if floor["level"] is None else -floor["level"],
112+
floor["name"].casefold(),
113+
),
114+
)
115+
105116
return old_data # type: ignore[return-value]
106117

107118

tests/helpers/test_floor_registry.py

Lines changed: 294 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Tests for the floor registry."""
22

3-
from datetime import datetime
3+
from datetime import UTC, datetime
44
from functools import partial
55
import re
66
from typing import Any
@@ -478,11 +478,88 @@ async def test_migration_from_1_1(
478478
"floors": [
479479
{
480480
"floor_id": "12345A",
481-
"name": "mock",
481+
"name": "AA floor no level floor",
482482
"aliases": [],
483483
"icon": None,
484484
"level": None,
485-
}
485+
},
486+
{
487+
"floor_id": "12345B",
488+
"name": "CC floor no level floor",
489+
"aliases": [],
490+
"icon": None,
491+
"level": None,
492+
},
493+
{
494+
"floor_id": "12345C",
495+
"name": "bb floor no level floor",
496+
"aliases": [],
497+
"icon": None,
498+
"level": None,
499+
},
500+
{
501+
"floor_id": "12345D",
502+
"name": "AA floor level -1",
503+
"aliases": [],
504+
"icon": None,
505+
"level": -1,
506+
},
507+
{
508+
"floor_id": "12345E",
509+
"name": "CC floor level -1",
510+
"aliases": [],
511+
"icon": None,
512+
"level": -1,
513+
},
514+
{
515+
"floor_id": "12345F",
516+
"name": "bb floor level -1",
517+
"aliases": [],
518+
"icon": None,
519+
"level": -1,
520+
},
521+
{
522+
"floor_id": "12345G",
523+
"name": "AA floor level 0",
524+
"aliases": [],
525+
"icon": None,
526+
"level": 0,
527+
},
528+
{
529+
"floor_id": "12345H",
530+
"name": "CC floor level 0",
531+
"aliases": [],
532+
"icon": None,
533+
"level": 0,
534+
},
535+
{
536+
"floor_id": "12345I",
537+
"name": "bb floor level 0",
538+
"aliases": [],
539+
"icon": None,
540+
"level": 0,
541+
},
542+
{
543+
"floor_id": "12345J",
544+
"name": "AA floor level 1",
545+
"aliases": [],
546+
"icon": None,
547+
"level": 1,
548+
},
549+
{
550+
"floor_id": "12345K",
551+
"name": "CC floor level 1",
552+
"aliases": [],
553+
"icon": None,
554+
"level": 1,
555+
},
556+
{
557+
"floor_id": "12345L",
558+
"name": "bb floor level 1",
559+
"aliases": [],
560+
"icon": None,
561+
"level": 1,
562+
},
486563
]
487564
},
488565
}
@@ -491,9 +568,121 @@ async def test_migration_from_1_1(
491568
registry = fr.async_get(hass)
492569

493570
# Test data was loaded
494-
entry = registry.async_get_floor_by_name("mock")
571+
entry = registry.async_get_floor_by_name("AA floor no level floor")
495572
assert entry.floor_id == "12345A"
496573

574+
# Check sort order
575+
assert list(registry.async_list_floors()) == [
576+
fr.FloorEntry(
577+
name="AA floor level 1",
578+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
579+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
580+
aliases=set(),
581+
floor_id="12345J",
582+
icon=None,
583+
level=1,
584+
),
585+
fr.FloorEntry(
586+
name="bb floor level 1",
587+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
588+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
589+
aliases=set(),
590+
floor_id="12345L",
591+
icon=None,
592+
level=1,
593+
),
594+
fr.FloorEntry(
595+
name="CC floor level 1",
596+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
597+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
598+
aliases=set(),
599+
floor_id="12345K",
600+
icon=None,
601+
level=1,
602+
),
603+
fr.FloorEntry(
604+
name="AA floor level 0",
605+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
606+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
607+
aliases=set(),
608+
floor_id="12345G",
609+
icon=None,
610+
level=0,
611+
),
612+
fr.FloorEntry(
613+
name="bb floor level 0",
614+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
615+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
616+
aliases=set(),
617+
floor_id="12345I",
618+
icon=None,
619+
level=0,
620+
),
621+
fr.FloorEntry(
622+
name="CC floor level 0",
623+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
624+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
625+
aliases=set(),
626+
floor_id="12345H",
627+
icon=None,
628+
level=0,
629+
),
630+
fr.FloorEntry(
631+
name="AA floor level -1",
632+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
633+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
634+
aliases=set(),
635+
floor_id="12345D",
636+
icon=None,
637+
level=-1,
638+
),
639+
fr.FloorEntry(
640+
name="bb floor level -1",
641+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
642+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
643+
aliases=set(),
644+
floor_id="12345F",
645+
icon=None,
646+
level=-1,
647+
),
648+
fr.FloorEntry(
649+
name="CC floor level -1",
650+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
651+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
652+
aliases=set(),
653+
floor_id="12345E",
654+
icon=None,
655+
level=-1,
656+
),
657+
fr.FloorEntry(
658+
name="AA floor no level floor",
659+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
660+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
661+
aliases=set(),
662+
floor_id="12345A",
663+
icon=None,
664+
level=None,
665+
),
666+
fr.FloorEntry(
667+
name="bb floor no level floor",
668+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
669+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
670+
aliases=set(),
671+
floor_id="12345C",
672+
icon=None,
673+
level=None,
674+
),
675+
fr.FloorEntry(
676+
name="CC floor no level floor",
677+
created_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
678+
modified_at=datetime(1970, 1, 1, 0, 0, tzinfo=UTC),
679+
aliases=set(),
680+
floor_id="12345B",
681+
icon=None,
682+
level=None,
683+
),
684+
]
685+
497686
# Check we store migrated data
498687
await flush_store(registry._store)
499688
assert hass_storage[fr.STORAGE_KEY] == {
@@ -504,13 +693,112 @@ async def test_migration_from_1_1(
504693
"floors": [
505694
{
506695
"aliases": [],
696+
"created_at": "1970-01-01T00:00:00+00:00",
697+
"floor_id": "12345J",
698+
"icon": None,
699+
"level": 1,
700+
"modified_at": "1970-01-01T00:00:00+00:00",
701+
"name": "AA floor level 1",
702+
},
703+
{
704+
"aliases": [],
705+
"created_at": "1970-01-01T00:00:00+00:00",
706+
"floor_id": "12345L",
507707
"icon": None,
708+
"level": 1,
709+
"modified_at": "1970-01-01T00:00:00+00:00",
710+
"name": "bb floor level 1",
711+
},
712+
{
713+
"aliases": [],
714+
"created_at": "1970-01-01T00:00:00+00:00",
715+
"floor_id": "12345K",
716+
"icon": None,
717+
"level": 1,
718+
"modified_at": "1970-01-01T00:00:00+00:00",
719+
"name": "CC floor level 1",
720+
},
721+
{
722+
"aliases": [],
723+
"created_at": "1970-01-01T00:00:00+00:00",
724+
"floor_id": "12345G",
725+
"icon": None,
726+
"level": 0,
727+
"modified_at": "1970-01-01T00:00:00+00:00",
728+
"name": "AA floor level 0",
729+
},
730+
{
731+
"aliases": [],
732+
"created_at": "1970-01-01T00:00:00+00:00",
733+
"floor_id": "12345I",
734+
"icon": None,
735+
"level": 0,
736+
"modified_at": "1970-01-01T00:00:00+00:00",
737+
"name": "bb floor level 0",
738+
},
739+
{
740+
"aliases": [],
741+
"created_at": "1970-01-01T00:00:00+00:00",
742+
"floor_id": "12345H",
743+
"icon": None,
744+
"level": 0,
745+
"modified_at": "1970-01-01T00:00:00+00:00",
746+
"name": "CC floor level 0",
747+
},
748+
{
749+
"aliases": [],
750+
"created_at": "1970-01-01T00:00:00+00:00",
751+
"floor_id": "12345D",
752+
"icon": None,
753+
"level": -1,
754+
"modified_at": "1970-01-01T00:00:00+00:00",
755+
"name": "AA floor level -1",
756+
},
757+
{
758+
"aliases": [],
759+
"created_at": "1970-01-01T00:00:00+00:00",
760+
"floor_id": "12345F",
761+
"icon": None,
762+
"level": -1,
763+
"modified_at": "1970-01-01T00:00:00+00:00",
764+
"name": "bb floor level -1",
765+
},
766+
{
767+
"aliases": [],
768+
"created_at": "1970-01-01T00:00:00+00:00",
769+
"floor_id": "12345E",
770+
"icon": None,
771+
"level": -1,
772+
"modified_at": "1970-01-01T00:00:00+00:00",
773+
"name": "CC floor level -1",
774+
},
775+
{
776+
"aliases": [],
777+
"created_at": "1970-01-01T00:00:00+00:00",
508778
"floor_id": "12345A",
779+
"icon": None,
509780
"level": None,
510-
"name": "mock",
781+
"modified_at": "1970-01-01T00:00:00+00:00",
782+
"name": "AA floor no level floor",
783+
},
784+
{
785+
"aliases": [],
511786
"created_at": "1970-01-01T00:00:00+00:00",
787+
"floor_id": "12345C",
788+
"icon": None,
789+
"level": None,
512790
"modified_at": "1970-01-01T00:00:00+00:00",
513-
}
791+
"name": "bb floor no level floor",
792+
},
793+
{
794+
"aliases": [],
795+
"created_at": "1970-01-01T00:00:00+00:00",
796+
"floor_id": "12345B",
797+
"icon": None,
798+
"level": None,
799+
"modified_at": "1970-01-01T00:00:00+00:00",
800+
"name": "CC floor no level floor",
801+
},
514802
]
515803
},
516804
}

0 commit comments

Comments
 (0)