mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Keep black happy (again)
Need to sort out the pre-commit hooks for this machine
This commit is contained in:
@@ -8,16 +8,7 @@ from textual.binding import Binding
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
# These are the movement keys within Textual; they kind of have a special
|
# These are the movement keys within Textual; they kind of have a special
|
||||||
# status in that they will get bound to movement-related methods.
|
# status in that they will get bound to movement-related methods.
|
||||||
MOVEMENT_KEYS = [
|
MOVEMENT_KEYS = ["up", "down", "left", "right", "home", "end", "pageup", "pagedown"]
|
||||||
"up",
|
|
||||||
"down",
|
|
||||||
"left",
|
|
||||||
"right",
|
|
||||||
"home",
|
|
||||||
"end",
|
|
||||||
"pageup",
|
|
||||||
"pagedown"
|
|
||||||
]
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
class NoBindings(App[None]):
|
class NoBindings(App[None]):
|
||||||
@@ -90,6 +81,7 @@ async def test_app_screen_with_bindings() -> None:
|
|||||||
async with AppWithScreenThatHasABinding().run_test() as pilot:
|
async with AppWithScreenThatHasABinding().run_test() as pilot:
|
||||||
assert list(pilot.app.screen._bindings.keys.keys()) == ["a"]
|
assert list(pilot.app.screen._bindings.keys.keys()) == ["a"]
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
class NoBindingsAndStaticWidgetNoBindings(App[None]):
|
class NoBindingsAndStaticWidgetNoBindings(App[None]):
|
||||||
"""An app with no bindings, enclosing a widget with no bindings."""
|
"""An app with no bindings, enclosing a widget with no bindings."""
|
||||||
@@ -97,6 +89,7 @@ class NoBindingsAndStaticWidgetNoBindings(App[None]):
|
|||||||
def compose(self) -> ComposeResult:
|
def compose(self) -> ComposeResult:
|
||||||
yield Static("Poetry! They should have sent a poet.")
|
yield Static("Poetry! They should have sent a poet.")
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.xfail(
|
@pytest.mark.xfail(
|
||||||
reason="Static is incorrectly starting with bindings for movement keys [issue#1343]"
|
reason="Static is incorrectly starting with bindings for movement keys [issue#1343]"
|
||||||
)
|
)
|
||||||
@@ -106,9 +99,9 @@ async def test_just_app_no_bindings_widget_no_bindings() -> None:
|
|||||||
assert list(pilot.app._bindings.keys.keys()) == ["ctrl+c"]
|
assert list(pilot.app._bindings.keys.keys()) == ["ctrl+c"]
|
||||||
assert list(pilot.app.screen.query_one(Static)._bindings.keys.keys()) == []
|
assert list(pilot.app.screen.query_one(Static)._bindings.keys.keys()) == []
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
class AppKeyRecorder(App[None]):
|
class AppKeyRecorder(App[None]):
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.pressed_keys: list[str] = []
|
self.pressed_keys: list[str] = []
|
||||||
@@ -116,19 +109,22 @@ class AppKeyRecorder(App[None]):
|
|||||||
async def action_record(self, key: str) -> None:
|
async def action_record(self, key: str) -> None:
|
||||||
self.pressed_keys.append(key)
|
self.pressed_keys.append(key)
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
class AppWithMovementKeysBound(AppKeyRecorder):
|
class AppWithMovementKeysBound(AppKeyRecorder):
|
||||||
BINDINGS=[
|
BINDINGS = [
|
||||||
Binding("x","record('x')","x"),
|
Binding("x", "record('x')", "x"),
|
||||||
*[Binding(key,f"record({key}')",key) for key in MOVEMENT_KEYS]
|
*[Binding(key, f"record({key}')", key) for key in MOVEMENT_KEYS],
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
async def test_pressing_alpha_on_app() -> None:
|
async def test_pressing_alpha_on_app() -> None:
|
||||||
"""Test that pressing the an alpha key, when it's bound on the app, results in an action fire."""
|
"""Test that pressing the an alpha key, when it's bound on the app, results in an action fire."""
|
||||||
async with AppWithMovementKeysBound().run_test() as pilot:
|
async with AppWithMovementKeysBound().run_test() as pilot:
|
||||||
await pilot.press(*"xxxxx")
|
await pilot.press(*"xxxxx")
|
||||||
assert "".join(pilot.app.pressed_keys) == "xxxxx"
|
assert "".join(pilot.app.pressed_keys) == "xxxxx"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.xfail(
|
@pytest.mark.xfail(
|
||||||
reason="Up key isn't firing bound action on an app due to key inheritence of its screen [issue#1343]"
|
reason="Up key isn't firing bound action on an app due to key inheritence of its screen [issue#1343]"
|
||||||
)
|
)
|
||||||
@@ -138,16 +134,18 @@ async def test_pressing_movement_keys_app() -> None:
|
|||||||
await pilot.press("x", *MOVEMENT_KEYS, "x")
|
await pilot.press("x", *MOVEMENT_KEYS, "x")
|
||||||
assert pilot.app.pressed_keys == ["x", *MOVEMENT_KEYS, "x"]
|
assert pilot.app.pressed_keys == ["x", *MOVEMENT_KEYS, "x"]
|
||||||
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
class WidgetWithBindings(Static,can_focus=True):
|
class WidgetWithBindings(Static, can_focus=True):
|
||||||
"""A widget that has its own bindings for the movement keys."""
|
"""A widget that has its own bindings for the movement keys."""
|
||||||
|
|
||||||
BINDINGS=[Binding(key,f"local_record('{key}')",key) for key in MOVEMENT_KEYS]
|
BINDINGS = [Binding(key, f"local_record('{key}')", key) for key in MOVEMENT_KEYS]
|
||||||
|
|
||||||
async def action_local_record(self, key:str) -> None:
|
async def action_local_record(self, key: str) -> None:
|
||||||
# Sneaky forward reference. Just for the purposes of testing.
|
# Sneaky forward reference. Just for the purposes of testing.
|
||||||
await self.app.action_record(f"locally_{key}")
|
await self.app.action_record(f"locally_{key}")
|
||||||
|
|
||||||
|
|
||||||
class AppWithWidgetWithBindings(AppKeyRecorder):
|
class AppWithWidgetWithBindings(AppKeyRecorder):
|
||||||
"""A test app that composes with a widget that has movement bindings."""
|
"""A test app that composes with a widget that has movement bindings."""
|
||||||
|
|
||||||
@@ -157,6 +155,7 @@ class AppWithWidgetWithBindings(AppKeyRecorder):
|
|||||||
def on_mount(self) -> None:
|
def on_mount(self) -> None:
|
||||||
self.query_one(WidgetWithBindings).focus()
|
self.query_one(WidgetWithBindings).focus()
|
||||||
|
|
||||||
|
|
||||||
async def test_focused_child_widget_with_movement_bindings() -> None:
|
async def test_focused_child_widget_with_movement_bindings() -> None:
|
||||||
"""A focused child widget with movement bindings should handle its own actions."""
|
"""A focused child widget with movement bindings should handle its own actions."""
|
||||||
async with AppWithWidgetWithBindings().run_test() as pilot:
|
async with AppWithWidgetWithBindings().run_test() as pilot:
|
||||||
|
|||||||
Reference in New Issue
Block a user