Kaynağa Gözat

Patch server_side event with function signature (#1010)

Sheldon 2 yıl önce
ebeveyn
işleme
b056b79479
1 değiştirilmiş dosya ile 27 ekleme ve 10 silme
  1. 27 10
      pynecone/event.py

+ 27 - 10
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",