|
import inspect |
|
import os |
|
|
|
import numpy as np |
|
import pandas as pd |
|
import pytest |
|
from gradio_client import utils as client_utils |
|
from gradio_pdf import PDF |
|
|
|
import gradio as gr |
|
from gradio import processing_utils |
|
from gradio.components.base import Component |
|
from gradio.data_classes import GradioModel, GradioRootModel |
|
from gradio.templates import TextArea |
|
|
|
os.environ["GRADIO_ANALYTICS_ENABLED"] = "False" |
|
|
|
|
|
class TestGettingComponents: |
|
def test_component_function(self): |
|
assert isinstance(gr.components.component("textarea", render=False), TextArea) |
|
|
|
@pytest.mark.parametrize( |
|
"component, render, unrender, should_be_rendered", |
|
[ |
|
(gr.Textbox(render=True), False, True, False), |
|
(gr.Textbox(render=False), False, False, False), |
|
(gr.Textbox(render=False), True, False, True), |
|
("textbox", False, False, False), |
|
("textbox", True, False, True), |
|
], |
|
) |
|
def test_get_component_instance_rendering( |
|
self, component, render, unrender, should_be_rendered |
|
): |
|
with gr.Blocks(): |
|
textbox = gr.components.get_component_instance( |
|
component, render=render, unrender=unrender |
|
) |
|
assert textbox.is_rendered == should_be_rendered |
|
|
|
|
|
class TestNames: |
|
|
|
def test_no_duplicate_uncased_names(self, io_components): |
|
unique_subclasses_uncased = {s.__name__.lower() for s in io_components} |
|
assert len(io_components) == len(unique_subclasses_uncased) |
|
|
|
|
|
def test_dataframe_process_example_converts_dataframes(): |
|
df_comp = gr.Dataframe() |
|
assert df_comp.process_example( |
|
pd.DataFrame({"a": [1, 2, 3, 4], "b": [5, 6, 7, 8]}) |
|
) == [ |
|
[1, 5], |
|
[2, 6], |
|
[3, 7], |
|
[4, 8], |
|
] |
|
assert df_comp.process_example(np.array([[1, 2], [3, 4.0]])) == [ |
|
[1.0, 2.0], |
|
[3.0, 4.0], |
|
] |
|
|
|
|
|
@pytest.mark.parametrize("component", [gr.Model3D, gr.File, gr.Audio]) |
|
def test_process_example_returns_file_basename(component): |
|
component = component() |
|
assert ( |
|
component.process_example("/home/freddy/sources/example.ext") == "example.ext" |
|
) |
|
assert component.process_example(None) == "" |
|
|
|
|
|
def test_component_class_ids(): |
|
button_id = gr.Button().component_class_id |
|
textbox_id = gr.Textbox().component_class_id |
|
json_id = gr.JSON().component_class_id |
|
mic_id = gr.Mic().component_class_id |
|
microphone_id = gr.Microphone().component_class_id |
|
audio_id = gr.Audio().component_class_id |
|
|
|
assert button_id == gr.Button().component_class_id |
|
assert textbox_id == gr.Textbox().component_class_id |
|
assert json_id == gr.JSON().component_class_id |
|
assert mic_id == gr.Mic().component_class_id |
|
assert microphone_id == gr.Microphone().component_class_id |
|
assert audio_id == gr.Audio().component_class_id |
|
assert mic_id == microphone_id |
|
|
|
|
|
assert len({button_id, textbox_id, json_id, microphone_id, audio_id}) == 5 |
|
|
|
|
|
def test_constructor_args(): |
|
assert gr.Textbox(max_lines=314).constructor_args == {"max_lines": 314} |
|
assert gr.LoginButton(visible=False, value="Log in please").constructor_args == { |
|
"visible": False, |
|
"value": "Log in please", |
|
} |
|
|
|
|
|
def test_template_component_configs(io_components): |
|
""" |
|
This test ensures that every "template" (the classes defined in gradio/template.py) |
|
has all of the arguments that its parent class has. E.g. the constructor of the `Sketchpad` |
|
class should have all of the arguments that the constructor of `ImageEditor` has |
|
""" |
|
template_components = [c for c in io_components if getattr(c, "is_template", False)] |
|
for component in template_components: |
|
component_parent_class = inspect.getmro(component)[1] |
|
template_config = component().get_config() |
|
parent_config = component_parent_class().get_config() |
|
assert set(parent_config.keys()).issubset(set(template_config.keys())) |
|
|
|
|
|
def test_component_example_values(io_components): |
|
for component in io_components: |
|
if component == PDF: |
|
continue |
|
elif component in [gr.BarPlot, gr.LinePlot, gr.ScatterPlot]: |
|
c: Component = component(x="x", y="y") |
|
else: |
|
c: Component = component() |
|
c.postprocess(c.example_value()) |
|
|
|
|
|
def test_component_example_payloads(io_components): |
|
for component in io_components: |
|
if component == PDF: |
|
continue |
|
elif issubclass(component, gr.components.NativePlot): |
|
c: Component = component(x="x", y="y") |
|
elif component == gr.FileExplorer: |
|
c: Component = component(root_dir="gradio") |
|
else: |
|
c: Component = component() |
|
data = c.example_payload() |
|
data = client_utils.synchronize_async( |
|
processing_utils.async_move_files_to_cache, |
|
data, |
|
c, |
|
check_in_upload_folder=False, |
|
) |
|
if getattr(c, "data_model", None) and data is not None: |
|
if issubclass(c.data_model, GradioModel): |
|
data = c.data_model(**data) |
|
elif issubclass(c.data_model, GradioRootModel): |
|
data = c.data_model(root=data) |
|
c.preprocess(data) |
|
|