From 7ebac6b860049547b729c18f273b42cfc0472ae2 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 28 Jun 2022 13:52:58 +0100 Subject: [PATCH] Add wip test for user over widget css, use type alias --- sandbox/darren/just_a_box.css | 11 +++++++++++ sandbox/darren/just_a_box.py | 12 ++++++++++++ src/textual/css/parse.py | 3 ++- tests/css/test_stylesheet.py | 21 +++++++++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 sandbox/darren/just_a_box.css create mode 100644 sandbox/darren/just_a_box.py diff --git a/sandbox/darren/just_a_box.css b/sandbox/darren/just_a_box.css new file mode 100644 index 000000000..1965ecb95 --- /dev/null +++ b/sandbox/darren/just_a_box.css @@ -0,0 +1,11 @@ +Screen { + layout: dock; + height: 100%; +} + +#box { + height: 50%; + width: 50%; + align: center middle; + background: green; +} diff --git a/sandbox/darren/just_a_box.py b/sandbox/darren/just_a_box.py new file mode 100644 index 000000000..2541c7b2b --- /dev/null +++ b/sandbox/darren/just_a_box.py @@ -0,0 +1,12 @@ +from textual.app import App, ComposeResult +from textual.widgets import Static + + +class JustABox(App): + def compose(self) -> ComposeResult: + yield Static("Hello, World!", id="box") + + +if __name__ == "__main__": + app = JustABox(css_path="just_a_box.css", watch_css=True) + app.run() diff --git a/src/textual/css/parse.py b/src/textual/css/parse.py index f3ce8d3f7..9052c3b1d 100644 --- a/src/textual/css/parse.py +++ b/src/textual/css/parse.py @@ -7,6 +7,7 @@ from typing import Iterator, Iterable from rich import print from textual.css.errors import UnresolvedVariableError +from textual.css.types import Specificity3 from ._styles_builder import StylesBuilder, DeclarationError from .model import ( Declaration, @@ -20,7 +21,7 @@ from .styles import Styles from .tokenize import tokenize, tokenize_declarations, Token, tokenize_values from .tokenizer import EOFError, ReferencedBy -SELECTOR_MAP: dict[str, tuple[SelectorType, tuple[int, int, int]]] = { +SELECTOR_MAP: dict[str, tuple[SelectorType, Specificity3]] = { "selector": (SelectorType.TYPE, (0, 0, 1)), "selector_start": (SelectorType.TYPE, (0, 0, 1)), "selector_class": (SelectorType.CLASS, (0, 1, 0)), diff --git a/tests/css/test_stylesheet.py b/tests/css/test_stylesheet.py index 6d4425b42..1727b2911 100644 --- a/tests/css/test_stylesheet.py +++ b/tests/css/test_stylesheet.py @@ -3,12 +3,15 @@ from typing import Any import pytest +from tests.utilities.test_app import AppTest +from textual.app import App, ComposeResult from textual.color import Color from textual.css._help_renderables import HelpText from textual.css.stylesheet import Stylesheet, StylesheetParseError from textual.css.tokenizer import TokenizeError from textual.dom import DOMNode from textual.geometry import Spacing +from textual.widget import Widget def _make_stylesheet(css: str) -> Stylesheet: @@ -101,6 +104,24 @@ def test_stylesheet_apply_empty_rulesets(): stylesheet.apply(node) +@pytest.mark.xfail(reason="wip") +def test_stylesheet_apply_user_css_over_widget_css(): + user_css = ".a {color: red;}" + + class MyWidget(Widget): + CSS = ".a {color: blue;}" + + node = MyWidget() + node.add_class("a") + + print(node.styles.color) + stylesheet = _make_stylesheet(user_css) + stylesheet.apply(node) + + assert node.styles.background == Color(0, 0, 255) + # TODO: On Tuesday - writing the tests for prioritising user CSS above widget CSS. + + @pytest.mark.parametrize( "css_value,expectation,expected_color", [