From ca125b728a0803a5b5ed71a5189e6b68175edcad Mon Sep 17 00:00:00 2001 From: Freddy Boulton Date: Tue, 25 Jun 2024 05:36:36 +0100 Subject: [PATCH] Fix reload mode for jupyter notebook and stateful demos (#8599) * Remove deprecated method * add changeset * Fix bug * Update test * add changeset --------- Co-authored-by: gradio-pr-bot --- .changeset/grumpy-houses-raise.md | 6 ++++++ gradio/ipython_ext.py | 17 ++++++----------- js/app/src/Index.svelte | 1 + js/app/test/test_chatinterface.reload.spec.ts | 15 +++++++++++++-- pyproject.toml | 1 - 5 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 .changeset/grumpy-houses-raise.md diff --git a/.changeset/grumpy-houses-raise.md b/.changeset/grumpy-houses-raise.md new file mode 100644 index 0000000000..f379641f31 --- /dev/null +++ b/.changeset/grumpy-houses-raise.md @@ -0,0 +1,6 @@ +--- +"@gradio/app": patch +"gradio": patch +--- + +fix:Fix reload mode for jupyter notebook and stateful demos diff --git a/gradio/ipython_ext.py b/gradio/ipython_ext.py index ea7286794c..7a9c64984e 100644 --- a/gradio/ipython_ext.py +++ b/gradio/ipython_ext.py @@ -59,32 +59,27 @@ class JupyterReloader(BaseReloader): def load_ipython_extension(ipython): reloader = JupyterReloader(ipython) - @magic_arguments() - @argument("--demo-name", default="demo", help="Name of gradio blocks instance.") - @argument( + @magic_arguments() # type: ignore + @argument("--demo-name", default="demo", help="Name of gradio blocks instance.") # type: ignore + @argument( # type: ignore "--share", default=False, const=True, nargs="?", help="Whether to launch with sharing. Will slow down reloading.", ) - @register_cell_magic - @needs_local_scope + @register_cell_magic # type: ignore + @needs_local_scope # type: ignore def blocks(line, cell, local_ns): """Launch a demo defined in a cell in reload mode.""" - args = parse_argstring(blocks, line) + args = parse_argstring(blocks, line) # type: ignore exec(cell, None, local_ns) demo: gr.Blocks = local_ns[args.demo_name] if not reloader.demo_tracked(): demo.launch(share=args.share) reloader.track(demo) - elif reloader.queue_changed(demo): - print("Queue got added or removed. Restarting demo.") - reloader.running_demo.close() - demo.launch() - reloader.track(demo) else: reloader.swap_blocks(demo) return reloader.running_demo.artifact diff --git a/js/app/src/Index.svelte b/js/app/src/Index.svelte index fc76324f0b..db1163adbb 100644 --- a/js/app/src/Index.svelte +++ b/js/app/src/Index.svelte @@ -318,6 +318,7 @@ app.close(); app = await Client.connect(api_url, { status_callback: handle_status, + with_null_state: true, events: ["data", "log", "status", "render"] }); diff --git a/js/app/test/test_chatinterface.reload.spec.ts b/js/app/test/test_chatinterface.reload.spec.ts index 9fce0dd01f..2a64009074 100644 --- a/js/app/test/test_chatinterface.reload.spec.ts +++ b/js/app/test/test_chatinterface.reload.spec.ts @@ -58,9 +58,9 @@ test("gradio dev mode correctly reloads a stateful ChatInterface demo", async ({ import gradio as gr def greet(msg, history): - return "Hello" + return f"You typed: {msg}" -demo = gr.ChatInterface(fn=greet, textbox=gr.Textbox(label="foo")) +demo = gr.ChatInterface(fn=greet, textbox=gr.Textbox(label="foo", placeholder="Type a message...")) if __name__ == "__main__": demo.launch() @@ -75,6 +75,17 @@ if __name__ == "__main__": } }); await expect(page.getByLabel("foo")).toBeVisible(); + const textbox = page.getByPlaceholder("Type a message..."); + const submit_button = page.getByRole("button", { name: "Submit" }); + + await textbox.fill("hello"); + await submit_button.click(); + + await expect(textbox).toHaveValue(""); + const response = page.locator(".bot p", { + hasText: "You typed: hello" + }); + await expect(response).toBeVisible(); } finally { if (_process) kill_process(_process); } diff --git a/pyproject.toml b/pyproject.toml index 1fc08f0c87..7c38348c0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,7 +104,6 @@ exclude = [ "gradio/themes/", "gradio/_frontend_code/", "gradio/components/*_plot.py", - "gradio/ipython_ext.py", "gradio/node/*.py", "gradio/_frontend_code/*.py", ]