From fa8225d24d86c0ec9a48cadee78dcc11b7084584 Mon Sep 17 00:00:00 2001 From: Abubakar Abid Date: Mon, 12 Feb 2024 14:05:31 -0800 Subject: [PATCH] Use updated component in `postprocess()` (#7402) * component update * add changeset * add test * lint * refactor --------- Co-authored-by: gradio-pr-bot --- .changeset/blue-walls-flash.md | 5 +++++ gradio/blocks.py | 3 +++ test/test_blocks.py | 22 +++++++++++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 .changeset/blue-walls-flash.md diff --git a/.changeset/blue-walls-flash.md b/.changeset/blue-walls-flash.md new file mode 100644 index 0000000000000..d08fb044c121b --- /dev/null +++ b/.changeset/blue-walls-flash.md @@ -0,0 +1,5 @@ +--- +"gradio": patch +--- + +fix:Use updated component in `postprocess()` diff --git a/gradio/blocks.py b/gradio/blocks.py index d73bca17b3795..489a2ec0d5ea4 100644 --- a/gradio/blocks.py +++ b/gradio/blocks.py @@ -1449,7 +1449,10 @@ def postprocess_data( raise InvalidComponentError( f"{block.__class__} Component with id {output_id} not a valid output component." ) + if output_id in state: + block = state[output_id] prediction_value = block.postprocess(prediction_value) + outputs_cached = processing_utils.move_files_to_cache( prediction_value, block, # type: ignore diff --git a/test/test_blocks.py b/test/test_blocks.py index 0c7eb6374e198..578140c8b0ff3 100644 --- a/test/test_blocks.py +++ b/test/test_blocks.py @@ -18,7 +18,7 @@ import pytest import uvicorn from fastapi.testclient import TestClient -from gradio_client import media_data +from gradio_client import Client, media_data from PIL import Image import gradio as gr @@ -823,6 +823,26 @@ def run(min, num): "error" not in session_1.json() ) # no error because sesssion 1 block config was lost when session 3 was added + def test_state_holder_is_used_in_postprocess(self, connect): + with gr.Blocks() as demo: + dropdown = gr.Dropdown(label="list", choices=["Choice 1"], interactive=True) + button = gr.Button("Get dropdown value") + button2 = gr.Button("Convert dropdown to multiselect") + button.click( + lambda x: x, inputs=dropdown, outputs=dropdown, api_name="predict" + ) + button2.click( + lambda: gr.Dropdown(multiselect=True), + outputs=dropdown, + api_name="set_multiselect", + ) + + client: Client + with connect(demo) as client: + assert client.predict("Choice 1", api_name="/predict") == "Choice 1" + client.predict(api_name="/set_multiselect") + assert client.predict("Choice 1", api_name="/predict") == ["Choice 1"] + class TestCallFunction: @pytest.mark.asyncio