|
import shutil |
|
import textwrap |
|
from pathlib import Path |
|
|
|
import pytest |
|
|
|
from gradio.cli.commands.components._create_utils import OVERRIDES |
|
from gradio.cli.commands.components.build import _build |
|
from gradio.cli.commands.components.create import _create |
|
from gradio.cli.commands.components.publish import _get_version_from_file |
|
from gradio.cli.commands.components.show import _show |
|
|
|
|
|
@pytest.mark.parametrize( |
|
"template", |
|
[ |
|
"Row", |
|
"Column", |
|
"Tabs", |
|
"Group", |
|
"Accordion", |
|
"AnnotatedImage", |
|
"HighlightedText", |
|
"BarPlot", |
|
"ClearButton", |
|
"ColorPicker", |
|
"DuplicateButton", |
|
"LinePlot", |
|
"LogoutButton", |
|
"LoginButton", |
|
"ScatterPlot", |
|
"UploadButton", |
|
"JSON", |
|
"FileExplorer", |
|
"Model3D", |
|
], |
|
) |
|
def test_template_override_component(template, tmp_path): |
|
_create( |
|
"MyComponent", |
|
tmp_path, |
|
template=template, |
|
overwrite=True, |
|
install=False, |
|
configure_metadata=False, |
|
) |
|
app = (tmp_path / "demo" / "app.py").read_text() |
|
answer = textwrap.dedent( |
|
f""" |
|
import gradio as gr |
|
from gradio_mycomponent import MyComponent |
|
|
|
{OVERRIDES[template].demo_code.format(name="MyComponent")} |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
""" |
|
) |
|
assert app.strip() == answer.strip() |
|
assert (tmp_path / "backend" / "gradio_mycomponent" / "mycomponent.py").exists() |
|
|
|
|
|
def test_raise_error_component_template_does_not_exist(tmp_path): |
|
with pytest.raises( |
|
ValueError, |
|
match="Cannot find NonExistentComponent in gradio.components or gradio.layouts", |
|
): |
|
_create( |
|
"MyComponent", |
|
tmp_path, |
|
template="NonExistentComponent", |
|
overwrite=True, |
|
install=False, |
|
configure_metadata=False, |
|
) |
|
|
|
|
|
def test_do_not_replace_class_name_in_import_statement(tmp_path): |
|
_create( |
|
"MyImage", |
|
template="Image", |
|
directory=tmp_path, |
|
overwrite=True, |
|
install=False, |
|
configure_metadata=False, |
|
) |
|
code = (tmp_path / "backend" / "gradio_myimage" / "myimage.py").read_text() |
|
assert "from PIL import Image as _Image" in code |
|
assert "class MyImage" in code |
|
assert "_Image.Image" in code |
|
|
|
|
|
def test_raises_if_directory_exists(tmp_path): |
|
with pytest.raises( |
|
Exception |
|
): |
|
_create("MyComponent", tmp_path, configure_metadata=False) |
|
|
|
|
|
def test_show(capsys): |
|
_show() |
|
stdout, _ = capsys.readouterr() |
|
assert "Form Component" in stdout |
|
assert "Beginner Friendly" in stdout |
|
assert "Layout" in stdout |
|
assert "Dataframe" not in stdout |
|
assert "Dataset" not in stdout |
|
|
|
|
|
@pytest.mark.xfail |
|
@pytest.mark.parametrize("template", ["Image"]) |
|
def test_build(template, virtualenv): |
|
|
|
pnpm_lock = Path(__file__).parent / ".." / "pnpm-lock.yaml" |
|
pnpm_copy = Path(__file__).parent / ".." / "pnpm-lock-copy.yaml" |
|
shutil.copy(str(pnpm_lock), str(pnpm_copy)) |
|
|
|
|
|
dir_ = ( |
|
Path(__file__).parent / ".." / "js" / "preview" / "test" / "testtextbox" |
|
).resolve() |
|
shutil.rmtree(str(dir_), ignore_errors=True) |
|
|
|
try: |
|
|
|
gradio_dir = Path(__file__).parent / ".." |
|
client = Path(__file__).parent / ".." / "client" / "python" |
|
virtualenv.run("pip install build") |
|
virtualenv.run(f"pip install -e {str(gradio_dir)}") |
|
virtualenv.run(f"pip install -e {str(client)}") |
|
|
|
virtualenv.run( |
|
f"{shutil.which('gradio')} cc create TestTextbox --template {template} --no-configure-metadata --directory {str(dir_)}", |
|
) |
|
assert (dir_ / "frontend" / "node_modules").exists() |
|
|
|
|
|
|
|
virtualenv.run(f"pip install -e {str(client)}") |
|
virtualenv.run(f"{shutil.which('gradio')} cc build {str(dir_)}") |
|
|
|
template_dir: Path = dir_ / "backend" / "gradio_testtextbox" / "templates" |
|
assert template_dir.exists() and template_dir.is_dir() |
|
assert list(template_dir.glob("**/index.js")) |
|
assert (dir_ / "dist").exists() and list((dir_ / "dist").glob("*.whl")) |
|
finally: |
|
shutil.move(str(pnpm_copy), str(pnpm_lock)) |
|
shutil.rmtree(str(dir_), ignore_errors=True) |
|
|
|
|
|
def test_build_fails_if_component_not_installed(tmp_path): |
|
_create( |
|
"MyComponent", |
|
tmp_path, |
|
template="SimpleTextbox", |
|
overwrite=True, |
|
install=False, |
|
configure_metadata=False, |
|
) |
|
with pytest.raises( |
|
ValueError, |
|
match=r"Your custom component package \(gradio_mycomponent\) is not installed!", |
|
): |
|
_build(tmp_path) |
|
|
|
|
|
def test_fallback_template_app(tmp_path): |
|
_create( |
|
"SimpleComponent2", |
|
directory=tmp_path, |
|
overwrite=True, |
|
install=False, |
|
configure_metadata=False, |
|
) |
|
app = (tmp_path / "demo" / "app.py").read_text() |
|
answer = textwrap.dedent( |
|
""" |
|
|
|
import gradio as gr |
|
from gradio_simplecomponent2 import SimpleComponent2 |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Change the value (keep it JSON) and the front-end will update automatically.") |
|
SimpleComponent2(value={"message": "Hello from Gradio!"}, label="Static") |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|
|
""" |
|
) |
|
assert app.strip() == answer.strip() |
|
|
|
|
|
def test_get_version_from_wheel(): |
|
assert ( |
|
_get_version_from_file(Path("gradio_textwithattachments-0.0.3-py3-none.whl")) |
|
== "0.0.3" |
|
) |
|
assert ( |
|
_get_version_from_file(Path("gradio_textwithattachments-1.0.3b12-py3-none.whl")) |
|
== "1.0.3b12" |
|
) |
|
|