gradio/test/test_interfaces.py
Abubakar Abid 63d0a28c08
Website Design Changes (#1015)
* adding gallery

* added netlify files

* new navbar design

* header section new design

* used by section new design

* cards section new design

* integrates with section new design

* customer stories section new design

* footer and gradient

* demos section new design

* docs fixes

* docs reorg

* docs reorg

* upgrading to tailwind 3

* tailwind config changes

* navbar new design

* fixing body on all pages

* Updating Guides  (#1012)

* updating getting started

* updated codecov version

* tweaks to gs

* added netlify file

* added netlify file

* website prebuild script

* increased code size

* blocks

* edits

* blocks_hello

* hello world

* guide

* merge main

* added flipper demo

* guide

* guide

* add guides

* tweak to refresh website

* header section new design

* demos section new design

* cards design

* used by section

* tweets section

* footer on all pages

* mobile responsive fixes

* mobile responsive fixes

* https fonts

* completed blocks guide

* unify components

* minor tweaks

* docs headers styling and navigation pane

* parameter code blocks

* styling description and input type

* parameter tables and other styling

* only documenting interactive components when possible

* guides

* embedding not working

* demos not working

* fixing demo code

* fixing demos

* demo fix

* updated demos

* updated demos

* ui update

* updated docstrings

* updated code snippets so they run

* updating docs

* Interface docs

* updating interface

* fixing parameters in interface.py

* required and defaults for interface, and styling

* fixing up interface (#1207)

* fixing up interface

* fixed interface methods

* formatting

* updating interface docs

* updating interface docs

* formatting

* docstring to load from docstrings

* fixed colors

* finalize interface content

* interface examples

* fixed examples

* added some blocks docs

* blocks

* component fixes

* reorganized some files (#1210)

* formatting

* added info for every component

* fixes

* blocks docs

* added blocks demos

* adding combined interfaces

* added parallel, series

* Doc: layout update (#1216)

* doc layout

* home spacing

Co-authored-by: Abubakar Abid <abubakar@huggingface.co>

* adding layouts

* layouts done

* added events for components

* formatting and https

* brings back dropdown and other components

* fix header ids

* moved ids and fixed nav

* added parameters for remaining component

* docstring fixes

* landing page demos

* demo window placeholder

* demo nav

* fixed test

* formatting

* demo code

* correctly importing gradio  css/js

* remove keyvalues

* modify launch script to move gradio assetS

* components embedded test

* correct demo name

* hide try demo and embedding

* local devserver changes

* create embedding json with configs

* changes

* fixes

* comment out layout docs

* demo work

* demo fixes

* demo embedding fixes

* typo

* jinja fix

* demo nav fix

* hide demo button

* formatting

* removed whitespace

* remove newline from parameter

* reverting comments

Co-authored-by: aliabd <ali.si3luwa@gmail.com>
Co-authored-by: Victor Muštar <victor.mustar@gmail.com>
Co-authored-by: Ali Abid <aabid94@gmail.com>
2022-05-13 19:48:46 -07:00

224 lines
8.6 KiB
Python

import io
import sys
import unittest
import unittest.mock as mock
from contextlib import contextmanager
import mlflow
import requests
import wandb
from gradio.blocks import Blocks
from gradio.interface import Interface, TabbedInterface, close_all, os
from gradio.layouts import TabItem, Tabs
from gradio.utils import assert_configs_are_equivalent_besides_ids
os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
@contextmanager
def captured_output():
new_out, new_err = io.StringIO(), io.StringIO()
old_out, old_err = sys.stdout, sys.stderr
try:
sys.stdout, sys.stderr = new_out, new_err
yield sys.stdout, sys.stderr
finally:
sys.stdout, sys.stderr = old_out, old_err
class TestInterface(unittest.TestCase):
def test_close(self):
io = Interface(lambda input: None, "textbox", "label")
_, local_url, _ = io.launch(prevent_thread_lock=True)
response = requests.get(local_url)
self.assertEqual(response.status_code, 200)
io.close()
with self.assertRaises(Exception):
response = requests.get(local_url)
def test_close_all(self):
interface = Interface(lambda input: None, "textbox", "label")
interface.close = mock.MagicMock()
close_all()
interface.close.assert_called()
def test_no_input_or_output(self):
with self.assertRaises(TypeError):
Interface(lambda x: x, examples=1234)
def test_examples_valid_path(self):
path = os.path.join(
os.path.dirname(__file__), "../gradio/test_data/flagged_with_log"
)
interface = Interface(lambda x: 3 * x, "number", "number", examples=path)
dataset_check = any(
[c["type"] == "dataset" for c in interface.get_config_file()["components"]]
)
self.assertTrue(dataset_check)
def test_test_launch(self):
with captured_output() as (out, err):
prediction_fn = lambda x: x
prediction_fn.__name__ = "prediction_fn"
interface = Interface(prediction_fn, "textbox", "label")
interface.test_launch()
output = out.getvalue().strip()
self.assertEqual(output, "Test launch: prediction_fn()... PASSED")
@mock.patch("time.sleep")
def test_block_thread(self, mock_sleep):
with self.assertRaises(KeyboardInterrupt):
with captured_output() as (out, _):
mock_sleep.side_effect = KeyboardInterrupt()
interface = Interface(lambda x: x, "textbox", "label")
interface.launch(prevent_thread_lock=False)
output = out.getvalue().strip()
self.assertEqual(
output, "Keyboard interruption in main thread... closing server."
)
@mock.patch("gradio.utils.colab_check")
def test_launch_colab_share(self, mock_colab_check):
mock_colab_check.return_value = True
interface = Interface(lambda x: x, "textbox", "label")
_, _, share_url = interface.launch(prevent_thread_lock=True)
self.assertIsNotNone(share_url)
interface.close()
@mock.patch("gradio.utils.colab_check")
@mock.patch("gradio.networking.setup_tunnel")
def test_launch_colab_share_error(self, mock_setup_tunnel, mock_colab_check):
mock_setup_tunnel.side_effect = RuntimeError()
mock_colab_check.return_value = True
interface = Interface(lambda x: x, "textbox", "label")
_, _, share_url = interface.launch(prevent_thread_lock=True)
self.assertIsNone(share_url)
interface.close()
def test_interface_representation(self):
prediction_fn = lambda x: x
prediction_fn.__name__ = "prediction_fn"
repr = str(Interface(prediction_fn, "textbox", "label")).split("\n")
self.assertTrue(prediction_fn.__name__ in repr[0])
self.assertEqual(len(repr[0]), len(repr[1]))
def test_interface_none_interp(self):
interface = Interface(lambda x: x, "textbox", "label", interpretation=[None])
scores = interface.interpret(["quickest brown fox"])[0]["interpretation"]
self.assertIsNone(scores)
@mock.patch("webbrowser.open")
def test_interface_browser(self, mock_browser):
interface = Interface(lambda x: x, "textbox", "label")
interface.launch(inbrowser=True, prevent_thread_lock=True)
mock_browser.assert_called_once()
interface.close()
def test_examples_list(self):
examples = ["test1", "test2"]
interface = Interface(lambda x: x, "textbox", "label", examples=examples)
interface.launch(prevent_thread_lock=True)
self.assertEqual(len(interface.examples), 2)
self.assertEqual(len(interface.examples[0]), 1)
interface.close()
@mock.patch("IPython.display.display")
def test_inline_display(self, mock_display):
interface = Interface(lambda x: x, "textbox", "label")
interface.launch(inline=True, prevent_thread_lock=True)
mock_display.assert_called_once()
interface.launch(inline=True, prevent_thread_lock=True)
self.assertEqual(mock_display.call_count, 2)
interface.close()
@mock.patch("comet_ml.Experiment")
def test_integration_comet(self, mock_experiment):
experiment = mock_experiment()
experiment.log_text = mock.MagicMock()
experiment.log_other = mock.MagicMock()
interface = Interface(lambda x: x, "textbox", "label")
interface.launch(prevent_thread_lock=True)
interface.integrate(comet_ml=experiment)
experiment.log_text.assert_called_with("gradio: " + interface.local_url)
interface.share_url = "tmp" # used to avoid creating real share links.
interface.integrate(comet_ml=experiment)
experiment.log_text.assert_called_with("gradio: " + interface.share_url)
self.assertEqual(experiment.log_other.call_count, 2)
interface.share_url = None
interface.close()
def test_integration_mlflow(self):
mlflow.log_param = mock.MagicMock()
interface = Interface(lambda x: x, "textbox", "label")
interface.launch(prevent_thread_lock=True)
interface.integrate(mlflow=mlflow)
mlflow.log_param.assert_called_with(
"Gradio Interface Local Link", interface.local_url
)
interface.share_url = "tmp" # used to avoid creating real share links.
interface.integrate(mlflow=mlflow)
mlflow.log_param.assert_called_with(
"Gradio Interface Share Link", interface.share_url
)
interface.share_url = None
interface.close()
def test_integration_wandb(self):
with captured_output() as (out, err):
wandb.log = mock.MagicMock()
wandb.Html = mock.MagicMock()
interface = Interface(lambda x: x, "textbox", "label")
interface.width = 500
interface.height = 500
interface.integrate(wandb=wandb)
self.assertEqual(
out.getvalue().strip(),
"The WandB integration requires you to `launch(share=True)` first.",
)
interface.share_url = "tmp"
interface.integrate(wandb=wandb)
wandb.log.assert_called_once()
@mock.patch("requests.post")
def test_integration_analytics(self, mock_post):
mlflow.log_param = mock.MagicMock()
interface = Interface(lambda x: x, "textbox", "label")
interface.analytics_enabled = True
interface.integrate(mlflow=mlflow)
mock_post.assert_called_once()
class TestTabbedInterface(unittest.TestCase):
def test_tabbed_interface_config_matches_manual_tab(self):
interface1 = Interface(lambda x: x, "textbox", "textbox")
interface2 = Interface(lambda x: x, "image", "image")
with Blocks() as demo:
with Tabs():
with TabItem(label="tab1"):
interface1.render()
with TabItem(label="tab2"):
interface2.render()
interface3 = Interface(lambda x: x, "textbox", "textbox")
interface4 = Interface(lambda x: x, "image", "image")
tabbed_interface = TabbedInterface([interface3, interface4], ["tab1", "tab2"])
self.assertTrue(
assert_configs_are_equivalent_besides_ids(
demo.get_config_file(), tabbed_interface.get_config_file()
)
)
class TestDeprecatedInterface(unittest.TestCase):
def test_deprecation_notice(self):
with self.assertWarns(Warning):
_ = Interface(lambda x: x, "textbox", "textbox", verbose=True)
if __name__ == "__main__":
unittest.main()