Simon Clematide
Add Annotate & Export tab and public API endpoints (/annotate, /render, /models)
ad9385f
Raw History Blame Contribute Delete
2.54 kB
import unittest
from core.annotate import annotate_text, merge_conllu, resolve_model
PART = """# generator = UDPipe 2, https://lindat.mff.cuni.cz/services/udpipe
# udpipe_model = german-hdt-ud-2.17-251125
# newdoc
# newpar
# sent_id = 1
# text = {text}
1\t{text}\t_\tNOUN\t_\t_\t0\troot\t_\t_
"""
class FakeClient:
def __init__(self, error=None):
self.calls = []
self.error = error
def parse_sentence(self, text, model, strip_morphology=True, cache=None):
self.calls.append((text, model, strip_morphology))
if self.error:
return {"conllu": "", "model": model, "error": self.error}
return {"conllu": PART.format(text=text), "model": model, "error": None}
class AnnotateTests(unittest.TestCase):
def test_resolve_model_accepts_label_and_id(self):
self.assertEqual(resolve_model("UDPipe · german-gsd-ud-2.17-251125"), "german-gsd-ud-2.17-251125")
self.assertEqual(resolve_model("german-gsd-ud-2.17-251125"), "german-gsd-ud-2.17-251125")
with self.assertRaises(ValueError):
resolve_model("german")
def test_lines_are_parsed_separately_and_renumbered(self):
client = FakeClient()
result = annotate_text("Eins\n\n Zwei \n", "german-hdt-ud-2.17-251125", client=client)
self.assertEqual([call[0] for call in client.calls], ["Eins", "Zwei"])
self.assertTrue(client.calls[0][2])
conllu = result["conllu"]
self.assertEqual(result["sentences"], 2)
self.assertEqual(conllu.count("# generator"), 1)
self.assertNotIn("# newdoc", conllu)
self.assertIn("# sent_id = 1\n# text = Eins", conllu)
self.assertIn("# sent_id = 2\n# text = Zwei", conllu)
self.assertTrue(conllu.endswith("\n\n"))
def test_morphology_flag_is_passed(self):
client = FakeClient()
annotate_text("Eins", "german-hdt-ud-2.17-251125", include_morphology=True, client=client)
self.assertFalse(client.calls[0][2])
def test_one_line_may_yield_several_sentences(self):
merged = merge_conllu([PART.format(text="A") + PART.format(text="B")], "m")
self.assertIn("# sent_id = 2\n# text = B", merged)
def test_errors(self):
with self.assertRaises(ValueError):
annotate_text(" \n ", "german-hdt-ud-2.17-251125", client=FakeClient())
with self.assertRaises(RuntimeError):
annotate_text("Eins", "german-hdt-ud-2.17-251125", client=FakeClient(error="down"))
if __name__ == "__main__":
unittest.main()