adf0d17497
publish / version_or_publish (push) Waiting to run
storybook-build / changes (push) Waiting to run
storybook-build / :storybook-build (push) Blocked by required conditions
Sync Gradio Skills to Hugging Face / sync-skills (push) Waiting to run
functional / changes (push) Waiting to run
functional / build-frontend (push) Blocked by required conditions
functional / functional-test-SSR=false (push) Blocked by required conditions
functional / functional-reload (push) Blocked by required conditions
functional / functional-test-SSR=true (push) Blocked by required conditions
hygiene / hygiene-test (push) Waiting to run
python / changes (push) Waiting to run
python / build (push) Blocked by required conditions
python / test-ubuntu-latest-flaky (push) Blocked by required conditions
python / test-ubuntu-latest-not-flaky (push) Blocked by required conditions
python / test-windows-latest-flaky (push) Blocked by required conditions
python / test-windows-latest-not-flaky (push) Blocked by required conditions
js / changes (push) Waiting to run
js / js-test (push) Blocked by required conditions
docs-build / changes (push) Waiting to run
docs-build / docs-build (push) Blocked by required conditions
docs-build / website-build (push) Blocked by required conditions
111 lines
4.1 KiB
Python
111 lines
4.1 KiB
Python
import os
|
|
import pathlib
|
|
import tempfile
|
|
from unittest.mock import MagicMock
|
|
|
|
import pytest
|
|
|
|
import gradio as gr
|
|
from gradio import flagging
|
|
|
|
os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
|
|
|
|
|
|
class TestDefaultFlagging:
|
|
def test_default_flagging_callback(self):
|
|
with tempfile.TemporaryDirectory() as tmpdirname:
|
|
io = gr.Interface(lambda x: x, "text", "text", flagging_dir=tmpdirname)
|
|
io.launch(prevent_thread_lock=True)
|
|
row_count = io.flagging_callback.flag(["test", "test"])
|
|
assert row_count == 1 # 2 rows written including header
|
|
row_count = io.flagging_callback.flag(["test", "test"])
|
|
assert row_count == 2 # 3 rows written including header
|
|
io.close()
|
|
|
|
def test_files_saved_as_file_paths(self):
|
|
image = {"path": str(pathlib.Path(__file__).parent / "test_files" / "bus.png")}
|
|
with tempfile.TemporaryDirectory() as tmpdirname:
|
|
io = gr.Interface(
|
|
lambda x: x,
|
|
"image",
|
|
"image",
|
|
flagging_dir=tmpdirname,
|
|
flagging_mode="auto",
|
|
)
|
|
io.launch(prevent_thread_lock=True)
|
|
io.flagging_callback.flag([image, image])
|
|
io.close()
|
|
with open(os.path.join(tmpdirname, "dataset1.csv")) as f:
|
|
flagged_data = f.readlines()[1].split(",")[0]
|
|
assert flagged_data.endswith("bus.png")
|
|
io.close()
|
|
|
|
def test_flagging_does_not_create_unnecessary_directories(self):
|
|
with tempfile.TemporaryDirectory() as tmpdirname:
|
|
io = gr.Interface(lambda x: x, "text", "text", flagging_dir=tmpdirname)
|
|
io.launch(prevent_thread_lock=True)
|
|
io.flagging_callback.flag(["test", "test"])
|
|
assert os.listdir(tmpdirname) == ["dataset1.csv"]
|
|
|
|
|
|
class TestSimpleFlagging:
|
|
def test_simple_csv_flagging_callback(self):
|
|
with tempfile.TemporaryDirectory() as tmpdirname:
|
|
io = gr.Interface(
|
|
lambda x: x,
|
|
"text",
|
|
"text",
|
|
flagging_dir=tmpdirname,
|
|
flagging_callback=flagging.SimpleCSVLogger(),
|
|
)
|
|
io.launch(prevent_thread_lock=True)
|
|
row_count = io.flagging_callback.flag(["test", "test"])
|
|
assert row_count == 0 # no header in SimpleCSVLogger
|
|
row_count = io.flagging_callback.flag(["test", "test"])
|
|
assert row_count == 1 # no header in SimpleCSVLogger
|
|
io.close()
|
|
|
|
|
|
class TestDisableFlagging:
|
|
def test_flagging_no_permission_error_with_flagging_disabled(self):
|
|
tmpdirname = tempfile.mkdtemp()
|
|
os.chmod(tmpdirname, 0o444) # Make directory read-only
|
|
nonwritable_path = os.path.join(tmpdirname, "flagging_dir")
|
|
io = gr.Interface(
|
|
lambda x: x,
|
|
"text",
|
|
"text",
|
|
flagging_mode="never",
|
|
flagging_dir=nonwritable_path,
|
|
)
|
|
io.launch(prevent_thread_lock=True)
|
|
io.close()
|
|
|
|
|
|
class TestInterfaceSetsUpFlagging:
|
|
@pytest.mark.parametrize(
|
|
"flagging_mode, called",
|
|
[
|
|
("manual", True),
|
|
("auto", True),
|
|
("never", False),
|
|
],
|
|
)
|
|
def test_flag_method_init_called(self, flagging_mode, called):
|
|
flagging.FlagMethod.__init__ = MagicMock() # type: ignore
|
|
flagging.FlagMethod.__init__.return_value = None # type: ignore
|
|
gr.Interface(lambda x: x, "text", "text", flagging_mode=flagging_mode)
|
|
assert flagging.FlagMethod.__init__.called == called # type: ignore
|
|
|
|
@pytest.mark.parametrize(
|
|
"options, processed_options",
|
|
[
|
|
(None, [("Flag", None)]),
|
|
(["yes", "no"], [("Flag as yes", "yes"), ("Flag as no", "no")]),
|
|
([("abc", "de"), ("123", "45")], [("abc", "de"), ("123", "45")]),
|
|
],
|
|
)
|
|
def test_flagging_options_processed_correctly(self, options, processed_options):
|
|
io = gr.Interface(lambda x: x, "text", "text", flagging_options=options)
|
|
assert io.flagging_options == processed_options
|