From 801051b70b6b82dcbad3f47360d9873cc64b3000 Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Wed, 22 Feb 2023 13:32:49 +0000 Subject: [PATCH] garantee order --- src/textual/css/stylesheet.py | 2 +- src/textual/dom.py | 16 ++++++++-------- tests/snapshot_tests/test_snapshots.py | 4 +++- tests/test_dom.py | 26 +++++++++++++------------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/textual/css/stylesheet.py b/src/textual/css/stylesheet.py index 492e231d2..d1c886923 100644 --- a/src/textual/css/stylesheet.py +++ b/src/textual/css/stylesheet.py @@ -406,7 +406,7 @@ class Stylesheet: ) self.replace_rules(node, node_rules, animate=animate) - component_classes = node._get_component_classes() + component_classes = DOMNode._get_component_classes(type(node)) if component_classes: old_component_styles = node._component_styles.copy() node._component_styles.clear() diff --git a/src/textual/dom.py b/src/textual/dom.py index 904c91289..c0b5596c4 100644 --- a/src/textual/dom.py +++ b/src/textual/dom.py @@ -229,8 +229,8 @@ class DOMNode(MessagePump): # Node bases are in reversed order so that the base class is lower priority return self._css_bases(self.__class__) - @classmethod - def _css_bases(cls, base: Type[DOMNode]) -> Iterable[Type[DOMNode]]: + @staticmethod + def _css_bases(base: Type[DOMNode]) -> Iterable[Type[DOMNode]]: """Get the DOMNode base classes, which inherit CSS. Args: @@ -317,8 +317,8 @@ class DOMNode(MessagePump): return css_stack - @classmethod - def _get_component_classes(cls) -> frozenset[str]: + @staticmethod + def _get_component_classes(node_type: type[DOMNode]) -> Iterable[str]: """Gets the component classes for this class and inherited from bases. Component classes are inherited from base classes, unless @@ -327,13 +327,13 @@ class DOMNode(MessagePump): Returns: A set with all the component classes available. """ - component_classes: set[str] = set() - for base in cls._css_bases(cls): - component_classes.update(base.__dict__.get("COMPONENT_CLASSES", set())) + component_classes: list[str] = [] + for base in DOMNode._css_bases(node_type): + component_classes.extend(base.__dict__.get("COMPONENT_CLASSES", ())) if not base.__dict__.get("_inherit_component_classes", True): break - return frozenset(component_classes) + return sorted(component_classes) @property def parent(self) -> DOMNode | None: diff --git a/tests/snapshot_tests/test_snapshots.py b/tests/snapshot_tests/test_snapshots.py index 05d48a5fe..314f2461b 100644 --- a/tests/snapshot_tests/test_snapshots.py +++ b/tests/snapshot_tests/test_snapshots.py @@ -238,4 +238,6 @@ def test_disabled_widgets(snap_compare): def test_focus_component_class(snap_compare): - assert snap_compare(SNAPSHOT_APPS_DIR / "focus_component_class.py", press=["tab"]) + assert snap_compare( + SNAPSHOT_APPS_DIR / "focus_component_class.py", press=["tab", "_"] + ) diff --git a/tests/test_dom.py b/tests/test_dom.py index f366d0706..b88b4052c 100644 --- a/tests/test_dom.py +++ b/tests/test_dom.py @@ -143,27 +143,27 @@ def test_component_classes_inheritance(): COMPONENT_CLASSES = {"f-1"} node = DOMNode() - node_cc = node._get_component_classes() + node_cc = DOMNode._get_component_classes(type(node)) a = A() - a_cc = a._get_component_classes() + a_cc = DOMNode._get_component_classes(type(a)) b = B() - b_cc = b._get_component_classes() + b_cc = DOMNode._get_component_classes(type(b)) c = C() - c_cc = c._get_component_classes() + c_cc = DOMNode._get_component_classes(type(c)) d = D() - d_cc = d._get_component_classes() + d_cc = DOMNode._get_component_classes(type(d)) e = E() - e_cc = e._get_component_classes() + e_cc = DOMNode._get_component_classes(type(e)) f = F() - f_cc = f._get_component_classes() + f_cc = DOMNode._get_component_classes(type(f)) - assert node_cc == set() - assert a_cc == {"a-1", "a-2"} - assert b_cc == {"b-1"} - assert c_cc == {"b-1", "c-1", "c-2"} + assert node_cc == [] + assert a_cc == ["a-1", "a-2"] + assert b_cc == ["b-1"] + assert c_cc == ["b-1", "c-1", "c-2"] assert d_cc == c_cc - assert e_cc == {"b-1", "c-1", "c-2", "e-1"} - assert f_cc == {"f-1"} + assert e_cc == ["b-1", "c-1", "c-2", "e-1"] + assert f_cc == ["f-1"] @pytest.fixture