Skip to content

Commit

Permalink
Merge pull request #153 from spraakbanken/135-port-para-html-route
Browse files Browse the repository at this point in the history
port para service
  • Loading branch information
kod-kristoff authored Jun 14, 2024
2 parents e650192 + 01a3df2 commit 148bd47
Show file tree
Hide file tree
Showing 8 changed files with 305 additions and 76 deletions.
9 changes: 0 additions & 9 deletions src/sblex/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
import locale
import datetime
import cjson
import fullform
import fullform_lex
import compound
import paradigms
import version
import plist
import pos
Expand Down Expand Up @@ -73,12 +70,6 @@ def handler(req):
elif function == "pos" and len(args) == 0:
(result, result_code) = pos.function(format)

elif function == "para" and len(args) <= 1:
if len(args) == 0:
(result, result_code) = paradigms.function(format, "")
else:
(result, result_code) = paradigms.function(format, args[0])

elif function == "sms" and len(args) <= 1:
(result, result_code) = compound.function(format, args[0])

Expand Down
62 changes: 0 additions & 62 deletions src/sblex/paradigms.py

This file was deleted.

101 changes: 97 additions & 4 deletions src/sblex/saldo_ws/routes/paradigms.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import sys

from fastapi import APIRouter, Depends, status
from fastapi.responses import ORJSONResponse
from fastapi import APIRouter, Depends, Request, status
from fastapi.responses import HTMLResponse, ORJSONResponse, RedirectResponse
from opentelemetry import trace
from sblex.application.queries import NoPartOfSpeechOnBaseform, Paradigms
from sblex.saldo_ws import deps
from sblex.saldo_ws import deps, templating

router = APIRouter()

Expand All @@ -18,7 +18,100 @@ async def get_para_json(words: str, paradigms: Paradigms = Depends(deps.get_para
_baseform, result = paradigms.query(words)
except NoPartOfSpeechOnBaseform:
return ORJSONResponse(
{"msg": "First word has no Part-of-Speech tag. Use the form 'word:pos'"},
{
"msg": {
"eng": "First word has no Part-of-Speech tag. Use the form 'word:pos'",
"swe": "Grundformen måste förses med ordklass (grundform:ordklass).",
}
},
status_code=status.HTTP_400_BAD_REQUEST,
)
return result


@router.get("/xml/{words}", response_model=list[str])
async def get_para_xml(
request: Request,
words: str,
paradigms: Paradigms = Depends(deps.get_paradigms), # noqa: B008
):
with trace.get_tracer(__name__).start_as_current_span(
sys._getframe().f_code.co_name
) as _process_api_span:
templates = request.app.state.templates
try:
_baseform, result = paradigms.query(words)
except NoPartOfSpeechOnBaseform:
return templates.TemplateResponse(
request=request,
name="paradigms.xml",
status_code=status.HTTP_400_BAD_REQUEST,
context={
"j": [],
"no_pos": True,
},
)

return templates.TemplateResponse(
request=request,
name="paradigms.xml",
context={
"j": result,
"no_pos": False,
},
)


@router.get("/html", response_class=HTMLResponse, name="paradigms:para-html")
async def paradigm_html(
request: Request,
words: str | None = None,
paradigms: Paradigms = Depends(deps.get_paradigms), # noqa: B008
):
with trace.get_tracer(__name__).start_as_current_span(
sys._getframe().f_code.co_name
) as _process_api_span:
templates = request.app.state.templates
if words is None:
return templates.TemplateResponse(
request=request,
name="saldo_paradigms.html",
context=templating.build_context(
request=request,
title="Paradigm",
input=words,
j=[],
no_pos=False,
w="",
),
)
title = f"Paradigm | {words}" if words else "Paradigm"
try:
baseform, result = paradigms.query(words)
except NoPartOfSpeechOnBaseform:
baseform = words.split(",")[0]
return templates.TemplateResponse(
request=request,
name="saldo_paradigms.html",
status_code=status.HTTP_400_BAD_REQUEST,
context=templating.build_context(
request=request,
title=title,
input=words,
j=[],
no_pos=True,
w=baseform,
),
)


@router.get(
"/html/{words}",
response_class=HTMLResponse,
)
async def para_html_orig(
request: Request,
words: str,
):
redirect_url = request.url_for("paradigms:para-html").include_query_params(words=words)
return RedirectResponse(redirect_url)
9 changes: 9 additions & 0 deletions templates/paradigms.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
{% if no_pos %}
<error>
<msg lang="swe">Grundformen måste förses med ordklass (grundform:ordklass).</msg>
<msg lang="eng">First word has no Part-of-Speech tag. Use the form 'word:pos'.</msg>
</error>
{% else %}
<paradigms> {% for x in j %} <p> {{ x }} </p> {% endfor %} </paradigms>
{% endif %}
34 changes: 34 additions & 0 deletions templates/saldo_paradigms.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{% extends "saldo_document.html" %}
{% block content %}
<center>
<form action="{{ url_for('paradigms:para-html')}}" method="get" class="inputclass">
<input type="search" id="search" class="inputclass" value="{{ input }}" name="segment" size="30"
placeholder="Mata in kommaseparerade ordformer, där första ordet är en grundform försedd med ordklass."
results="10" />
<input type="submit" value="Sök" />
</form>
<p></p>
{% if no_pos %}
<p>Grundformen måste förses med ordklass (grundform:ordklass).</p>
{% elif w|length == 0 %}
<p>Mata in kommaseparerade ordformer, där första ordet är en grundform försedd med ordklass.</p>
<p>Exempel: <a
href="{{ url_for('paradigms:para-html').include_query_params(words='man%3Ann%2C%20m%C3%A4n') }}">man:nn,
män</a></p>
{% else %}
{% if j|length %}
<table>
{% for p in j %}
<tr>
<td>
<i><a href="{{ url_for('inflections:gen-html', paradigm=p, word=w)}}">{{ p }}</a></i>
</td>
</tr>
{% endfor %}
</table>
{% else %}
<p><b>Hittade inga paradigm.</b></p>
{% endif %}
{% endif %}
</center>
{% endblock %}
126 changes: 126 additions & 0 deletions tests/e2e/saldo_ws/__snapshots__/test_para_api.ambr
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
# serializer version: 1
# name: TestParaRoutes.test_html_invalid_input_return_400
'''
<!DOCTYPE html>
<html>

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<link rel="shortcut icon" href="https://svn.spraakdata.gu.se/sb-arkiv/pub/images/saldo_icon.png">
<link rel="stylesheet" type="text/css" href="http://testserver/static/saldo.css" />
<title>Paradigm | dväljes</title>

<script src="https://unpkg.com/htmx.org@1.9.8" crossorigin="anonymous"></script>
</head>

<body>
<center>
<p>
<a href="http://testserver/fl/html"><img
src="https://spraakbanken.gu.se/sites/spraakbanken.gu.se/files/img/saldo/saldo.gif" align="top"
alt="SALDO: gå tillbaka till startsidan" /></a>
</p>
</center>
<div id="output_table">

<center>
<form action="http://testserver/para/html" method="get" class="inputclass">
<input type="search" id="search" class="inputclass" value="dväljes" name="segment" size="30"
placeholder="Mata in kommaseparerade ordformer, där första ordet är en grundform försedd med ordklass."
results="10" />
<input type="submit" value="Sök" />
</form>
<p></p>

<p>Grundformen måste förses med ordklass (grundform:ordklass).</p>

</center>

</div>
<footer>
<hr>
<ul>
<li><a href="https://spraakbanken.gu.se/saldo">SALDOs projektsida</a></li>
<li><a href="https://svn.spraakdata.gu.se/repos/sblex/pub/saldo_instruktion.pdf">dokumentation (pdf)</a></li>
</ul>
</footer>
</body>

</html>
'''
# ---
# name: TestParaRoutes.test_html_no_input_return_200
'''
<!DOCTYPE html>
<html>

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<link rel="shortcut icon" href="https://svn.spraakdata.gu.se/sb-arkiv/pub/images/saldo_icon.png">
<link rel="stylesheet" type="text/css" href="http://testserver/static/saldo.css" />
<title>Paradigm</title>

<script src="https://unpkg.com/htmx.org@1.9.8" crossorigin="anonymous"></script>
</head>

<body>
<center>
<p>
<a href="http://testserver/fl/html"><img
src="https://spraakbanken.gu.se/sites/spraakbanken.gu.se/files/img/saldo/saldo.gif" align="top"
alt="SALDO: gå tillbaka till startsidan" /></a>
</p>
</center>
<div id="output_table">

<center>
<form action="http://testserver/para/html" method="get" class="inputclass">
<input type="search" id="search" class="inputclass" value="None" name="segment" size="30"
placeholder="Mata in kommaseparerade ordformer, där första ordet är en grundform försedd med ordklass."
results="10" />
<input type="submit" value="Sök" />
</form>
<p></p>

<p>Mata in kommaseparerade ordformer, där första ordet är en grundform försedd med ordklass.</p>
<p>Exempel: <a
href="http://testserver/para/html?words=man%253Ann%252C%2520m%25C3%25A4n">man:nn,
män</a></p>

</center>

</div>
<footer>
<hr>
<ul>
<li><a href="https://spraakbanken.gu.se/saldo">SALDOs projektsida</a></li>
<li><a href="https://svn.spraakdata.gu.se/repos/sblex/pub/saldo_instruktion.pdf">dokumentation (pdf)</a></li>
</ul>
</footer>
</body>

</html>
'''
# ---
# name: TestParaRoutes.test_html_valid_input_return_200
''
# ---
# name: TestParaRoutes.test_xml_invalid_input_return_400
'''
<?xml version="1.0" encoding="UTF-8"?>

<error>
<msg lang="swe">Grundformen måste förses med ordklass (grundform:ordklass).</msg>
<msg lang="eng">First word has no Part-of-Speech tag. Use the form 'word:pos'.</msg>
</error>

'''
# ---
# name: TestParaRoutes.test_xml_valid_input_return_200
'''
<?xml version="1.0" encoding="UTF-8"?>

<paradigms> <p> vb_0d_lyss </p> <p> vb_0d_lyster </p> <p> vb_0d_nåde </p> <p> vb_0d_vederböra </p> <p> vb_0d_värdes </p> <p> vb_1a_beundra </p> <p> vb_1a_hitta </p> <p> vb_1a_häda </p> <p> vb_1a_klaga </p> <p> vb_1a_laga </p> <p> vb_1a_skapa </p> <p> vb_1a_spara </p> <p> vb_1a_ugnsbaka </p> <p> vb_1a_unna </p> <p> vb_1a_vissla </p> <p> vb_1a_vänta </p> <p> vb_1m_existera </p> <p> vb_1m_hisna </p> <p> vb_1m_kackla </p> <p> vb_1m_svira </p> <p> vb_1m_vånna </p> <p> vb_1s_andas </p> <p> vb_1s_gillas </p> <p> vb_2a_ansöka </p> <p> vb_2a_genmäla </p> <p> vb_2a_göra </p> <p> vb_2a_hyra </p> <p> vb_2a_känna </p> <p> vb_2a_leda </p> <p> vb_2a_leva </p> <p> vb_2a_lyfta </p> <p> vb_2a_lägga </p> <p> vb_2a_mista </p> <p> vb_2a_motsäga </p> <p> vb_2a_spörja </p> <p> vb_2a_städja </p> <p> vb_2a_stödja </p> <p> vb_2a_säga </p> <p> vb_2a_sälja </p> <p> vb_2a_sända </p> <p> vb_2a_sätta </p> <p> vb_2a_tämja </p> <p> vb_2a_viga </p> <p> vb_2a_välja </p> <p> vb_2d_må </p> <p> vb_2d_rädas </p> <p> vb_2d_torde </p> <p> vb_2m_böra </p> <p> vb_2m_gitta </p> <p> vb_2m_glädja </p> <p> vb_2m_ha </p> <p> vb_2m_hända </p> <p> vb_2m_höta </p> <p> vb_2m_mysa </p> <p> vb_2m_väga </p> <p> vb_2s_blygas </p> <p> vb_2s_giftas </p> <p> vb_2s_glädjas </p> <p> vb_2s_hövas </p> <p> vb_2s_idas </p> <p> vb_2s_minnas </p> <p> vb_2s_nöjas </p> <p> vb_2s_rymmas </p> <p> vb_2s_skiljas </p> <p> vb_2s_synas </p> <p> vb_2s_trivas </p> <p> vb_2s_töras </p> <p> vb_2s_vämjas </p> <p> vb_3a_sy </p> <p> vb_3s_brås </p> <p> vb_4a_be </p> <p> vb_4a_bli </p> <p> vb_4a_bottenfrysa </p> <p> vb_4a_bära </p> <p> vb_4a_dricka </p> <p> vb_4a_emotstå </p> <p> vb_4a_falla </p> <p> vb_4a_fara </p> <p> vb_4a_flyga </p> <p> vb_4a_förgäta </p> <p> vb_4a_ge </p> <p> vb_4a_gå </p> <p> vb_4a_hålla </p> <p> vb_4a_komma </p> <p> vb_4a_missförstå </p> <p> vb_4a_rida </p> <p> vb_4a_se </p> <p> vb_4a_skjuta </p> <p> vb_4a_slå </p> <p> vb_4a_stinga </p> <p> vb_4a_stjäla </p> <p> vb_4a_svära </p> <p> vb_4a_ta </p> <p> vb_4a_tillåta </p> <p> vb_4a_äta </p> <p> vb_4d_vederfås </p> <p> vb_4m_angå </p> <p> vb_4m_bekomma </p> <p> vb_4m_erfara </p> <p> vb_4m_förevara </p> <p> vb_4m_förslå </p> <p> vb_4m_gråta </p> <p> vb_4m_innebära </p> <p> vb_4m_le </p> <p> vb_4m_ligga </p> <p> vb_4m_ljuda </p> <p> vb_4m_ryta </p> <p> vb_4m_sitta </p> <p> vb_4m_skåpäta </p> <p> vb_4m_småsvära </p> <p> vb_4m_sova </p> <p> vb_4m_stå </p> <p> vb_4m_svälta_1 </p> <p> vb_4m_vara </p> <p> vb_4m_vina </p> <p> vb_4s_bitas </p> <p> vb_4s_finnas </p> <p> vb_4s_hållas </p> <p> vb_4s_munhuggas </p> <p> vb_4s_slåss </p> <p> vb_4s_tas </p> <p> vb_4s_umgås </p> <p> vb_4s_vederfaras </p> <p> vb_id_månde </p> <p> vb_ik_bevare </p> <p> vb_oa_varda </p> <p> vb_om_heta </p> <p> vb_om_kunna </p> <p> vb_om_måste </p> <p> vb_om_skola </p> <p> vb_om_veta </p> <p> vb_om_vilja </p> <p> vb_va_begrava </p> <p> vb_va_besluta </p> <p> vb_va_bestrida </p> <p> vb_va_besvärja </p> <p> vb_va_bringa </p> <p> vb_va_framtvinga </p> <p> vb_va_frysa </p> <p> vb_va_förlöpa </p> <p> vb_va_förmäla </p> <p> vb_va_förse </p> <p> vb_va_gälda </p> <p> vb_va_gälla_kastrera </p> <p> vb_va_klyva </p> <p> vb_va_klä </p> <p> vb_va_koka </p> <p> vb_va_kväda </p> <p> vb_va_lyda </p> <p> vb_va_löpa </p> <p> vb_va_mala </p> <p> vb_va_nypa </p> <p> vb_va_nästa </p> <p> vb_va_simma </p> <p> vb_va_skvätta </p> <p> vb_va_smälta </p> <p> vb_va_snusmala </p> <p> vb_va_sprida </p> <p> vb_va_strypa </p> <p> vb_va_stupa </p> <p> vb_va_svälta_2 </p> <p> vb_va_tala </p> <p> vb_va_träda </p> <p> vb_va_tvinga </p> <p> vb_va_två </p> <p> vb_va_tälja </p> <p> vb_va_utlöpa </p> <p> vb_va_vika </p> <p> vb_va_växa </p> <p> vb_vm_avvara </p> <p> vb_vm_drypa </p> <p> vb_vm_drösa </p> <p> vb_vm_duga </p> <p> vb_vm_fnysa </p> <p> vb_vm_gala </p> <p> vb_vm_klinga </p> <p> vb_vm_kvida </p> <p> vb_vm_nysa </p> <p> vb_vm_ryka </p> <p> vb_vm_samvara </p> <p> vb_vm_sluta </p> <p> vb_vm_smälla </p> <p> vb_vm_snika </p> <p> vb_vm_strida </p> <p> vb_vm_undvara </p> <p> vb_vm_upphäva </p> <p> vb_vs_dväljas </p> </paradigms>

'''
# ---
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
{
"msg": "First word has no Part-of-Speech tag. Use the form 'word:pos'"
"msg": {
"eng": "First word has no Part-of-Speech tag. Use the form 'word:pos'",
"swe": "Grundformen måste förses med ordklass (grundform:ordklass)."
}
}
Loading

0 comments on commit 148bd47

Please sign in to comment.