Added LambdaCommand

This commit is contained in:
2025-11-24 21:31:23 +01:00
parent 84c63f0c5a
commit a6ab4b2a68
3 changed files with 23 additions and 3 deletions

View File

@@ -4,7 +4,7 @@ from typing import Callable, Any
from fasthtml.components import * from fasthtml.components import *
from myfasthtml.controls.BaseCommands import BaseCommands from myfasthtml.controls.BaseCommands import BaseCommands
from myfasthtml.controls.helpers import Ids, mk from myfasthtml.controls.helpers import mk
from myfasthtml.core.commands import Command from myfasthtml.core.commands import Command
from myfasthtml.core.instances import MultipleInstance, BaseInstance from myfasthtml.core.instances import MultipleInstance, BaseInstance
from myfasthtml.core.matching_utils import subsequence_matching, fuzzy_matching from myfasthtml.core.matching_utils import subsequence_matching, fuzzy_matching

View File

@@ -45,7 +45,7 @@ class BaseCommand:
def execute(self, client_response: dict = None): def execute(self, client_response: dict = None):
raise NotImplementedError raise NotImplementedError
def htmx(self, target="this", swap="outerHTML", trigger=None): def htmx(self, target: Optional[str] = "this", swap="outerHTML", trigger=None):
# Note that the default value is the same than in get_htmx_params() # Note that the default value is the same than in get_htmx_params()
if target is None: if target is None:
self._htmx_extra["hx-swap"] = "none" self._htmx_extra["hx-swap"] = "none"
@@ -180,6 +180,15 @@ class Command(BaseCommand):
return [ret] + ret_from_bindings return [ret] + ret_from_bindings
class LambdaCommand(Command):
def __init__(self, delegate, name="LambdaCommand", description="Lambda Command"):
super().__init__(name, description, delegate)
self.htmx(target=None)
def execute(self, client_response: dict = None):
return self.callback(client_response)
class CommandsManager: class CommandsManager:
commands = {} commands = {}

View File

@@ -5,7 +5,7 @@ import pytest
from fasthtml.components import Button, Div from fasthtml.components import Button, Div
from myutils.observable import make_observable, bind from myutils.observable import make_observable, bind
from myfasthtml.core.commands import Command, CommandsManager from myfasthtml.core.commands import Command, CommandsManager, LambdaCommand
from myfasthtml.core.constants import ROUTE_ROOT, Routes from myfasthtml.core.constants import ROUTE_ROOT, Routes
from myfasthtml.test.matcher import matches from myfasthtml.test.matcher import matches
@@ -183,3 +183,14 @@ class TestCommandExecute:
assert "hx-swap-oob" not in res[0].attrs assert "hx-swap-oob" not in res[0].attrs
assert "hx-swap-oob" not in res[1].attrs assert "hx-swap-oob" not in res[1].attrs
assert "hx-swap-oob" not in res[3].attrs assert "hx-swap-oob" not in res[3].attrs
class TestLambaCommand:
def test_i_can_create_a_command_from_lambda(self):
command = LambdaCommand(lambda resp: "Hello World")
assert command.execute() == "Hello World"
def test_by_default_target_is_none(self):
command = LambdaCommand(lambda resp: "Hello World")
assert command.get_htmx_params()["hx-swap"] == "none"