Fix gr.SelectData so that the target attribute is correctly attached, and the filedata is included in the data attribute with gr.Gallery (#5798)

* fix select

* add changeset

* add changeset

* restore

* refactor

* add pytest

* typo

---------

Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com>
This commit is contained in:
Abubakar Abid 2023-10-05 12:53:52 -07:00 committed by GitHub
parent 37e70842d5
commit a0d3cc45c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 43 additions and 9 deletions

View File

@ -0,0 +1,6 @@
---
"@gradio/gallery": patch
"gradio": patch
---
fix:Fix `gr.SelectData` so that the target attribute is correctly attached, and the filedata is included in the data attribute with `gr.Gallery`

View File

@ -14,6 +14,7 @@ from gradio.helpers import EventData
from gradio.state_holder import SessionState
if TYPE_CHECKING:
from gradio.blocks import Blocks
from gradio.routes import App
set_documentation_group("routes")
@ -186,22 +187,30 @@ def restore_session_state(app: App, body: PredictBody):
return session_state, iterators
def prepare_event_data(
blocks: Blocks,
body: PredictBody,
fn_index_inferred: int,
) -> EventData:
dependency = blocks.dependencies[fn_index_inferred]
target = dependency["targets"][0] if len(dependency["targets"]) else None
event_data = EventData(
blocks.blocks.get(target[0]) if target else None,
body.event_data,
)
return event_data
async def call_process_api(
app: App,
body: PredictBody,
gr_request: Union[Request, list[Request]],
fn_index_inferred,
fn_index_inferred: int,
):
session_state, iterators = restore_session_state(app=app, body=body)
dependency = app.get_blocks().dependencies[fn_index_inferred]
target = dependency["targets"][0] if len(dependency["targets"]) else None
event_data = EventData(
app.get_blocks().blocks.get(target) if target else None,
body.event_data,
)
event_data = prepare_event_data(app.get_blocks(), body, fn_index_inferred)
event_id = getattr(body, "event_id", None)
fn_index = body.fn_index

View File

@ -134,7 +134,7 @@
if (selected_index !== null) {
dispatch("select", {
index: selected_index,
value: _value?.[selected_index][1]
value: [_value?.[selected_index][0].data, _value?.[selected_index][1]]
});
}
}

19
test/test_route_utils.py Normal file
View File

@ -0,0 +1,19 @@
import gradio as gr
from gradio.data_classes import PredictBody
from gradio.helpers import EventData
from gradio.route_utils import prepare_event_data
def test_prepare_event_data():
def on_select(evt: gr.SelectData):
return f"You selected {evt.value} at {evt.index} from {evt.target}"
with gr.Blocks() as demo:
textbox = gr.Textbox("Hello World!")
statement = gr.Textbox()
textbox.select(on_select, None, statement)
body = PredictBody(data=[], event_data={"value": "World", "index": [6, 11]})
event_data = prepare_event_data(demo, body, 0)
correct_event_data = EventData(textbox, {"value": "World", "index": [6, 11]})
assert vars(event_data) == vars(correct_event_data)