restore css bases

This commit is contained in:
Will McGugan
2023-02-22 13:41:05 +00:00
parent 801051b70b
commit edd1c28b79
3 changed files with 26 additions and 29 deletions

View File

@@ -406,7 +406,7 @@ class Stylesheet:
) )
self.replace_rules(node, node_rules, animate=animate) self.replace_rules(node, node_rules, animate=animate)
component_classes = DOMNode._get_component_classes(type(node)) component_classes = node._get_component_classes()
if component_classes: if component_classes:
old_component_styles = node._component_styles.copy() old_component_styles = node._component_styles.copy()
node._component_styles.clear() node._component_styles.clear()

View File

@@ -1,12 +1,12 @@
from __future__ import annotations from __future__ import annotations
import re import re
from functools import lru_cache
from inspect import getfile from inspect import getfile
from typing import ( from typing import (
TYPE_CHECKING, TYPE_CHECKING,
ClassVar, ClassVar,
Iterable, Iterable,
Iterator,
Sequence, Sequence,
Type, Type,
TypeVar, TypeVar,
@@ -219,18 +219,18 @@ class DOMNode(MessagePump):
styles = self._component_styles[name] styles = self._component_styles[name]
return styles return styles
def _post_mount(self) -> None: def _post_mount(self):
"""Called after the object has been mounted.""" """Called after the object has been mounted."""
Reactive._initialize_object(self) Reactive._initialize_object(self)
@property @property
def _node_bases(self) -> Iterable[Type[DOMNode]]: def _node_bases(self) -> Iterator[Type[DOMNode]]:
"""The DOMNode bases classes (including self.__class__)""" """The DOMNode bases classes (including self.__class__)"""
# Node bases are in reversed order so that the base class is lower priority # Node bases are in reversed order so that the base class is lower priority
return self._css_bases(self.__class__) return self._css_bases(self.__class__)
@staticmethod @classmethod
def _css_bases(base: Type[DOMNode]) -> Iterable[Type[DOMNode]]: def _css_bases(cls, base: Type[DOMNode]) -> Iterator[Type[DOMNode]]:
"""Get the DOMNode base classes, which inherit CSS. """Get the DOMNode base classes, which inherit CSS.
Args: Args:
@@ -240,10 +240,8 @@ class DOMNode(MessagePump):
An iterable of DOMNode classes. An iterable of DOMNode classes.
""" """
_class = base _class = base
node_classes: list[Type[DOMNode]] = []
add_class = node_classes.append
while True: while True:
add_class(_class) yield _class
if not _class._inherit_css: if not _class._inherit_css:
break break
for _base in _class.__bases__: for _base in _class.__bases__:
@@ -252,7 +250,6 @@ class DOMNode(MessagePump):
break break
else: else:
break break
return node_classes
@classmethod @classmethod
def _merge_bindings(cls) -> Bindings: def _merge_bindings(cls) -> Bindings:
@@ -317,8 +314,7 @@ class DOMNode(MessagePump):
return css_stack return css_stack
@staticmethod def _get_component_classes(self) -> set[str]:
def _get_component_classes(node_type: type[DOMNode]) -> Iterable[str]:
"""Gets the component classes for this class and inherited from bases. """Gets the component classes for this class and inherited from bases.
Component classes are inherited from base classes, unless Component classes are inherited from base classes, unless
@@ -327,13 +323,14 @@ class DOMNode(MessagePump):
Returns: Returns:
A set with all the component classes available. A set with all the component classes available.
""" """
component_classes: list[str] = []
for base in DOMNode._css_bases(node_type): component_classes: set[str] = set()
component_classes.extend(base.__dict__.get("COMPONENT_CLASSES", ())) for base in self._node_bases:
component_classes.update(base.__dict__.get("COMPONENT_CLASSES", set()))
if not base.__dict__.get("_inherit_component_classes", True): if not base.__dict__.get("_inherit_component_classes", True):
break break
return sorted(component_classes) return component_classes
@property @property
def parent(self) -> DOMNode | None: def parent(self) -> DOMNode | None:

View File

@@ -143,27 +143,27 @@ def test_component_classes_inheritance():
COMPONENT_CLASSES = {"f-1"} COMPONENT_CLASSES = {"f-1"}
node = DOMNode() node = DOMNode()
node_cc = DOMNode._get_component_classes(type(node)) node_cc = node._get_component_classes()
a = A() a = A()
a_cc = DOMNode._get_component_classes(type(a)) a_cc = a._get_component_classes()
b = B() b = B()
b_cc = DOMNode._get_component_classes(type(b)) b_cc = b._get_component_classes()
c = C() c = C()
c_cc = DOMNode._get_component_classes(type(c)) c_cc = c._get_component_classes()
d = D() d = D()
d_cc = DOMNode._get_component_classes(type(d)) d_cc = d._get_component_classes()
e = E() e = E()
e_cc = DOMNode._get_component_classes(type(e)) e_cc = e._get_component_classes()
f = F() f = F()
f_cc = DOMNode._get_component_classes(type(f)) f_cc = f._get_component_classes()
assert node_cc == [] assert node_cc == set()
assert a_cc == ["a-1", "a-2"] assert a_cc == {"a-1", "a-2"}
assert b_cc == ["b-1"] assert b_cc == {"b-1"}
assert c_cc == ["b-1", "c-1", "c-2"] assert c_cc == {"b-1", "c-1", "c-2"}
assert d_cc == c_cc assert d_cc == c_cc
assert e_cc == ["b-1", "c-1", "c-2", "e-1"] assert e_cc == {"b-1", "c-1", "c-2", "e-1"}
assert f_cc == ["f-1"] assert f_cc == {"f-1"}
@pytest.fixture @pytest.fixture