Textualize / textual

The lean application framework for Python. Build sophisticated user interfaces with a simple Python API. Run your apps in the terminal and a web browser.
https://textual.textualize.io/
MIT License
24.09k stars 742 forks source link

Crash when using hot-reloading with new hatch CSS rule #4604

Closed darrenburns closed 1 month ago

darrenburns commented 1 month ago
  1. Run an app in debug mode.
  2. Add a hatch rule to the Screen in the CSS file.
  3. Remove the hatch rule from the CSS file and save it, triggering a hot reload.
  4. The app crashes: TypeError: cannot unpack non-iterable NoneType object
Details
│ /Users/darrenburns/Code/posting/.venv/lib/python3.11/site-packages/text │
│ ual/css/stylesheet.py:661 in replace_rules                              │
│                                                                         │
│   658 │   │   │   get_rule = rules.get                                  │
│   659 │   │   │                                                         │
│   660 │   │   │   for key in modified_rule_keys:                        │
│ ❱ 661 │   │   │   │   setattr(base_styles, key, get_rule(key))          │
│   662 │   │                                                             │
│   663 │   │   node.notify_style_update()                                │
│   664                                                                   │
│                                                                         │
│ ╭────────────────────────────── locals ───────────────────────────────╮ │
│ │            animate = False                                          │ │
│ │        base_styles = Styles(                                        │ │
│ │                      │   layout=,                         │ │
│ │                      │   background=Color(30, 30, 30),              │ │
│ │                      │   overflow_y='auto',                         │ │
│ │                      │   scrollbar_color=Color(35, 86, 139),        │ │
│ │                      │   scrollbar_color_hover=Color(35, 86, 139),  │ │
│ │                      │   scrollbar_color_active=Color(              │ │
│ │                      │   │   231,                                   │ │
│ │                      │   │   146,                                   │ │
│ │                      │   │   13                                     │ │
│ │                      │   ),                                         │ │
│ │                      │   scrollbar_corner_color=Color(20, 25, 31),  │ │
│ │                      │   scrollbar_background=Color(20, 25, 31),    │ │
│ │                      │   scrollbar_background_hover=Color(          │ │
│ │                      │   │   0,                                     │ │
│ │                      │   │   5,                                     │ │
│ │                      │   │   15                                     │ │
│ │                      │   ),                                         │ │
│ │                      │   scrollbar_background_active=Color(         │ │
│ │                      │   │   0,                                     │ │
│ │                      │   │   0,                                     │ │
│ │                      │   │   0                                      │ │
│ │                      │   ),                                         │ │
│ │                      │   scrollbar_size_vertical=2,                 │ │
│ │                      │   scrollbar_size_horizontal=1,               │ │
│ │                      │   link_color=Color(255, 255, 255, a=0.87),   │ │
│ │                      │   auto_link_color=True,                      │ │
│ │                      │   link_background=Color(0, 0, 0, a=0),       │ │
│ │                      │   link_style=Style(underline=True),          │ │
│ │                      │   link_color_hover=Color(                    │ │
│ │                      │   │   255,                                   │ │
│ │                      │   │   255,                                   │ │
│ │                      │   │   255,                                   │ │
│ │                      │   │   a=0.87                                 │ │
│ │                      │   ),                                         │ │
│ │                      │   auto_link_color_hover=True,                │ │
│ │                      │   link_background_hover=Color(1, 120, 212),  │ │
│ │                      │   link_style_hover=Style(                    │ │
│ │                      │   │   bold=True,                             │ │
│ │                      │   │   underline=False                        │ │
│ │                      │   ),                                         │ │
│ │                      │   hatch=('╳', Color(0, 69, 120))             │ │
│ │                      )                                              │ │
│ │                cls =     │ │
│ │           get_rule =                                    │ │
│ │                key = 'hatch'                                        │ │
│ │ modified_rule_keys = {                                              │ │
│ │                      │   'auto_link_background_hover',              │ │
│ │                      │   'hatch',                                   │ │
│ │                      │   'link_color',                              │ │
│ │                      │   'link_style_hover',                        │ │
│ │                      │   'overflow_y',                              │ │
│ │                      │   'auto_scrollbar_color',                    │ │
│ │                      │   'scrollbar_corner_color',                  │ │
│ │                      │   'background',                              │ │
│ │                      │   'scrollbar_size_vertical',                 │ │
│ │                      │   'link_style',                              │ │
│ │                      │   ... +20                                    │ │
│ │                      }                                              │ │
│ │               node = MainScreen()                                   │ │
│ │              rules = {                                              │ │
│ │                      │   'auto_scrollbar_background': False,        │ │
│ │                      │   'scrollbar_background': Color(             │ │
│ │                      │   │   20,                                    │ │
│ │                      │   │   25,                                    │ │
│ │                      │   │   31                                     │ │
│ │                      │   ),                                         │ │
│ │                      │   'auto_scrollbar_background_hover': False,  │ │
│ │                      │   'scrollbar_background_hover': Color(       │ │
│ │                      │   │   0,                                     │ │
│ │                      │   │   5,                                     │ │
│ │                      │   │   15                                     │ │
│ │                      │   ),                                         │ │
│ │                      │   'auto_scrollbar_background_active': False, │ │
│ │                      │   'scrollbar_background_active': Color(      │ │
│ │                      │   │   0,                                     │ │
│ │                      │   │   0,                                     │ │
│ │                      │   │   0                                      │ │
│ │                      │   ),                                         │ │
│ │                      │   'auto_scrollbar_color': False,             │ │
│ │                      │   'scrollbar_color': Color(35, 86, 139),     │ │
│ │                      │   'auto_scrollbar_color_active': False,      │ │
│ │                      │   'scrollbar_color_active': Color(           │ │
│ │                      │   │   231,                                   │ │
│ │                      │   │   146,                                   │ │
│ │                      │   │   13                                     │ │
│ │                      │   ),                                         │ │
│ │                      │   ... +19                                    │ │
│ │                      }                                              │ │
│ │             styles = RenderStyles(                                  │ │
│ │                      │   layout=,                         │ │
│ │                      │   background=Color(30, 30, 30),              │ │
│ │                      │   overflow_y='auto',                         │ │
│ │                      │   scrollbar_color=Color(35, 86, 139),        │ │
│ │                      │   scrollbar_color_hover=Color(35, 86, 139),  │ │
│ │                      │   scrollbar_color_active=Color(              │ │
│ │                      │   │   231,                                   │ │
│ │                      │   │   146,                                   │ │
│ │                      │   │   13                                     │ │
│ │                      │   ),                                         │ │
│ │                      │   scrollbar_corner_color=Color(20, 25, 31),  │ │
│ │                      │   scrollbar_background=Color(20, 25, 31),    │ │
│ │                      │   scrollbar_background_hover=Color(          │ │
│ │                      │   │   0,                                     │ │
│ │                      │   │   5,                                     │ │
│ │                      │   │   15                                     │ │
│ │                      │   ),                                         │ │
│ │                      │   scrollbar_background_active=Color(         │ │
│ │                      │   │   0,                                     │ │
│ │                      │   │   0,                                     │ │
│ │                      │   │   0                                      │ │
│ │                      │   ),                                         │ │
│ │                      │   scrollbar_size_vertical=2,                 │ │
│ │                      │   scrollbar_size_horizontal=1,               │ │
│ │                      │   link_color=Color(255, 255, 255, a=0.87),   │ │
│ │                      │   auto_link_color=True,                      │ │
│ │                      │   link_background=Color(0, 0, 0, a=0),       │ │
│ │                      │   link_style=Style(underline=True),          │ │
│ │                      │   link_color_hover=Color(                    │ │
│ │                      │   │   255,                                   │ │
│ │                      │   │   255,                                   │ │
│ │                      │   │   255,                                   │ │
│ │                      │   │   a=0.87                                 │ │
│ │                      │   ),                                         │ │
│ │                      │   auto_link_color_hover=True,                │ │
│ │                      │   link_background_hover=Color(1, 120, 212),  │ │
│ │                      │   link_style_hover=Style(                    │ │
│ │                      │   │   bold=True,                             │ │
│ │                      │   │   underline=False                        │ │
│ │                      │   ),                                         │ │
│ │                      │   hatch=('╳', Color(0, 69, 120))             │ │
│ │                      )                                              │ │
│ ╰─────────────────────────────────────────────────────────────────────╯ │
│                                                                         │
│ /Users/darrenburns/Code/posting/.venv/lib/python3.11/site-packages/text │
│ ual/css/_style_properties.py:1152 in __set__                            │
│                                                                         │
│   1149 │   │   return cast("tuple[str, Color]", obj.get_rule("hatch", ( │
│   1150 │                                                                │
│   1151 │   def __set__(self, obj: StylesBase, value: tuple[str, Color | │
│ ❱ 1152 │   │   character, color = value                                 │
│   1153 │   │   if len(character) != 1:                                  │
│   1154 │   │   │   try:                                                 │
│   1155 │   │   │   │   character = HATCHES[character]                   │
│                                                                         │
│ ╭────────────────────────────── locals ───────────────────────────────╮ │
│ │   obj = Styles(                                                     │ │
│ │         │   layout=,                                      │ │
│ │         │   background=Color(30, 30, 30),                           │ │
│ │         │   overflow_y='auto',                                      │ │
│ │         │   scrollbar_color=Color(35, 86, 139),                     │ │
│ │         │   scrollbar_color_hover=Color(35, 86, 139),               │ │
│ │         │   scrollbar_color_active=Color(231, 146, 13),             │ │
│ │         │   scrollbar_corner_color=Color(20, 25, 31),               │ │
│ │         │   scrollbar_background=Color(20, 25, 31),                 │ │
│ │         │   scrollbar_background_hover=Color(0, 5, 15),             │ │
│ │         │   scrollbar_background_active=Color(0, 0, 0),             │ │
│ │         │   scrollbar_size_vertical=2,                              │ │
│ │         │   scrollbar_size_horizontal=1,                            │ │
│ │         │   link_color=Color(255, 255, 255, a=0.87),                │ │
│ │         │   auto_link_color=True,                                   │ │
│ │         │   link_background=Color(0, 0, 0, a=0),                    │ │
│ │         │   link_style=Style(underline=True),                       │ │
│ │         │   link_color_hover=Color(255, 255, 255, a=0.87),          │ │
│ │         │   auto_link_color_hover=True,                             │ │
│ │         │   link_background_hover=Color(1, 120, 212),               │ │
│ │         │   link_style_hover=Style(bold=True, underline=False),     │ │
│ │         │   hatch=('╳', Color(0, 69, 120))                          │ │
│ │         )                                                           │ │
│ │  self =                                                 │ │
│ │ value = None                                                        │ │
│ ╰─────────────────────────────────────────────────────────────────────╯ │
╰─────────────────────────────────────────────────────────────────────────╯
TypeError: cannot unpack non-iterable NoneType object
github-actions[bot] commented 1 month ago

Don't forget to star the repository!

Follow @textualizeio for Textual updates.