Skip to content

Commit 7bf81b7

Browse files
authored
Merge pull request #1077 from davep/bug/1047/id-case-redux
Change DOM queries to be case-sensitive for classes and IDs
2 parents af7cb90 + 4573407 commit 7bf81b7

File tree

4 files changed

+8
-7
lines changed

4 files changed

+8
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
2424
- Widgets are now closed in reversed DOM order
2525
- Input widget justify hardcoded to left to prevent text-align interference
2626
- Changed `textual run` so that it patches `argv` in more situations
27+
- DOM classes and IDs are now always treated fully case-sensitive https://github.com/Textualize/textual/issues/1047
2728

2829
### Added
2930

src/textual/css/model.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ class Selector:
4444
type: SelectorType = SelectorType.TYPE
4545
pseudo_classes: list[str] = field(default_factory=list)
4646
specificity: Specificity3 = field(default_factory=lambda: (0, 0, 0))
47-
_name_lower: str = field(default="", repr=False)
4847
advance: int = 1
4948

5049
@property
@@ -61,7 +60,6 @@ def css(self) -> str:
6160
return f"#{self.name}{pseudo_suffix}"
6261

6362
def __post_init__(self) -> None:
64-
self._name_lower = self.name.lower()
6563
self._checks = {
6664
SelectorType.UNIVERSAL: self._check_universal,
6765
SelectorType.TYPE: self._check_type,
@@ -94,21 +92,21 @@ def _check_universal(self, node: DOMNode) -> bool:
9492
return node.has_pseudo_class(*self.pseudo_classes)
9593

9694
def _check_type(self, node: DOMNode) -> bool:
97-
if self._name_lower not in node._css_type_names:
95+
if self.name not in node._css_type_names:
9896
return False
9997
if self.pseudo_classes and not node.has_pseudo_class(*self.pseudo_classes):
10098
return False
10199
return True
102100

103101
def _check_class(self, node: DOMNode) -> bool:
104-
if not node.has_class(self._name_lower):
102+
if not node.has_class(self.name):
105103
return False
106104
if self.pseudo_classes and not node.has_pseudo_class(*self.pseudo_classes):
107105
return False
108106
return True
109107

110108
def _check_id(self, node: DOMNode) -> bool:
111-
if not node.id == self._name_lower:
109+
if not node.id == self.name:
112110
return False
113111
if self.pseudo_classes and not node.has_pseudo_class(*self.pseudo_classes):
114112
return False

src/textual/dom.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class DOMNode(MessagePump):
108108

109109
# True if this node inherits the CSS from the base class.
110110
_inherit_css: ClassVar[bool] = True
111-
# List of names of base class (lower cased) that inherit CSS
111+
# List of names of base classes that inherit CSS
112112
_css_type_names: ClassVar[frozenset[str]] = frozenset()
113113

114114
def __init__(
@@ -168,7 +168,7 @@ def __init_subclass__(cls, inherit_css: bool = True) -> None:
168168
cls._inherit_css = inherit_css
169169
css_type_names: set[str] = set()
170170
for base in cls._css_bases(cls):
171-
css_type_names.add(base.__name__.lower())
171+
css_type_names.add(base.__name__)
172172
cls._css_type_names = frozenset(css_type_names)
173173

174174
def get_component_styles(self, name: str) -> RenderStyles:

tests/test_query.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ class App(Widget):
5454
assert list(app.query("#main")) == [main_view]
5555
assert list(app.query("View#main")) == [main_view]
5656
assert list(app.query("#widget1")) == [widget1]
57+
assert list(app.query("#Widget1")) == [] # Note case.
5758
assert list(app.query("#widget2")) == [widget2]
59+
assert list(app.query("#Widget2")) == [] # Note case.
5860

5961
assert list(app.query("Widget.float")) == [sidebar, tooltip, helpbar]
6062
assert list(app.query(Widget).filter(".float")) == [sidebar, tooltip, helpbar]

0 commit comments

Comments
 (0)