diff --git a/pynecone/event.py b/pynecone/event.py index 681b1f047..5178cf940 100644 --- a/pynecone/event.py +++ b/pynecone/event.py @@ -142,11 +142,12 @@ class FileUpload(Base): # Special server-side events. -def server_side(name: str, **kwargs) -> EventSpec: +def server_side(name: str, sig: inspect.Signature, **kwargs) -> EventSpec: """A server-side event. Args: name: The name of the event. + sig: The function signature of the event. **kwargs: The arguments to pass to the event. Returns: @@ -157,6 +158,7 @@ def server_side(name: str, **kwargs) -> EventSpec: return None fn.__qualname__ = name + fn.__signature__ = sig return EventSpec( handler=EventHandler(fn=fn), args=tuple( @@ -175,7 +177,7 @@ def redirect(path: Union[str, Var[str]]) -> EventSpec: Returns: An event to redirect to the path. """ - return server_side("_redirect", path=path) + return server_side("_redirect", get_fn_signature(redirect), path=path) def console_log(message: Union[str, Var[str]]) -> EventSpec: @@ -187,7 +189,7 @@ def console_log(message: Union[str, Var[str]]) -> EventSpec: Returns: An event to log the message. """ - return server_side("_console", message=message) + return server_side("_console", get_fn_signature(console_log), message=message) def window_alert(message: Union[str, Var[str]]) -> EventSpec: @@ -199,7 +201,7 @@ def window_alert(message: Union[str, Var[str]]) -> EventSpec: Returns: An event to alert the message. """ - return server_side("_alert", message=message) + return server_side("_alert", get_fn_signature(window_alert), message=message) def set_value(ref: str, value: Any) -> EventSpec: @@ -213,7 +215,10 @@ def set_value(ref: str, value: Any) -> EventSpec: An event to set the ref. """ return server_side( - "_set_value", ref=Var.create_safe(format.format_ref(ref)), value=value + "_set_value", + get_fn_signature(set_value), + ref=Var.create_safe(format.format_ref(ref)), + value=value, ) @@ -333,11 +338,7 @@ def get_handler_args(event_spec: EventSpec, arg: Var) -> Tuple[Tuple[Var, Var], """ args = inspect.getfullargspec(event_spec.handler.fn).args - return ( - event_spec.args - if len(args) > 2 - else (((Var.create_safe(args[1]), arg),) if len(args) == 2 else tuple()) - ) + return event_spec.args if len(args) > 1 else tuple() def fix_events( @@ -384,6 +385,22 @@ def fix_events( return out +def get_fn_signature(fn: Callable) -> inspect.Signature: + """Get the signature of a function. + + Args: + fn: The function. + + Returns: + The signature of the function. + """ + signature = inspect.signature(fn) + new_param = inspect.Parameter( + "state", inspect.Parameter.POSITIONAL_OR_KEYWORD, annotation=Any + ) + return signature.replace(parameters=(new_param, *signature.parameters.values())) + + # A set of common event triggers. EVENT_TRIGGERS: Set[str] = { "on_focus",