-
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Adding a knowledge panel for Hunger Games (#8)
* Implementing simple hunger game KP * Updated suggested changes * refactor in names * Added tests for knowledge panel * Update test_main.py * Update test_main.py * refractoring in code * minor update * Update test_main.py * Update app/knowledge_panels.py Co-authored-by: Alex Garel <alex@garel.org> * updated suggested changes * update the url * Update test_knowledge_panels.py Co-authored-by: Alex Garel <alex@garel.org>
- Loading branch information
Showing
5 changed files
with
241 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
from typing import Union | ||
|
||
from urllib.parse import urlencode | ||
|
||
from .models import HungerGameFilter | ||
|
||
|
||
def hunger_game_kp( | ||
hunger_game_filter: HungerGameFilter, | ||
value: Union[str, None] = None, | ||
country: Union[str, None] = None, | ||
): | ||
query = {} | ||
description = "" | ||
if hunger_game_filter == "country": | ||
country = value | ||
hunger_game_filter = value = None | ||
if country is not None: | ||
query["country"] = country | ||
description = country | ||
if hunger_game_filter is not None: | ||
query["type"] = f"{hunger_game_filter}" | ||
description = f"{hunger_game_filter}" | ||
if value is not None: | ||
query["value_tag"] = value | ||
description = f"{value} {hunger_game_filter}" | ||
questions_url = "https://hunger.openfoodfacts.org/questions" | ||
if query: | ||
questions_url += f"?{urlencode(query)}" | ||
description = f"Answer robotoff questions about {description}" | ||
html = f"<p><a href='{questions_url}'>{description}</a></p>\n" | ||
return { | ||
"hunger-game": { | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": {"html": str(html)}, | ||
}, | ||
], | ||
}, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,36 +1,34 @@ | ||
from typing import Union | ||
|
||
from fastapi import FastAPI | ||
from .models import Facetname | ||
|
||
from .knowledge_panels import hunger_game_kp | ||
from .models import FacetName, HungerGameFilter | ||
|
||
app = FastAPI() | ||
|
||
|
||
@app.get("/") | ||
def hello(): | ||
return {"message": "Hello from facets-knowledge-panels! Tip: open /docs for documentation"} | ||
|
||
@app.get("/brand/president") | ||
def ansewer_questions_brand_president(): | ||
return { | ||
"knowledge_panels": [ | ||
{ | ||
"hunger-game": { | ||
"type": "hunger-game", | ||
"level": "questions", | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": { | ||
"html":"<p><a href=\"https://hunger.openfoodfacts.org/?type=brand&value_tag=president\">Answer questions about brand president</a></p>\n" | ||
}, | ||
}, | ||
], | ||
}, | ||
|
||
}, | ||
], | ||
} | ||
|
||
@app.get("/{facet_name}/{facet_value}") | ||
def knowledge_panel(facet_name :Facetname,facet_value: str ): | ||
return { "knowledge_panels": []} | ||
"message": "Hello from facets-knowledge-panels! Tip: open /docs for documentation" | ||
} | ||
|
||
|
||
@app.get("/knowledge_panel") | ||
def knowledge_panel( | ||
facet_name: FacetName, | ||
facet_value: Union[str, None] = None, | ||
country: Union[str, None] = None, | ||
): | ||
# FacetName is the model that have list of values | ||
# facet_value are the list of values connecting to FacetName eg:- category/beer, here beer is the value | ||
panels = [] | ||
if facet_name in HungerGameFilter.list(): | ||
panels.append( | ||
hunger_game_kp( | ||
hunger_game_filter=facet_name, value=facet_value, country=country | ||
) | ||
) | ||
|
||
return {"knowledge_panels": panels} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
from app.main import hunger_game_kp | ||
|
||
|
||
def test_hunger_game_kp_with_filter_value_and_country(): | ||
assert hunger_game_kp( | ||
hunger_game_filter="country", value="germany", country="france" | ||
) == { | ||
"hunger-game": { | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": { | ||
"html": "<p><a href='https://hunger.openfoodfacts.org/questions?country=germany'>Answer robotoff questions about germany</a></p>\n" | ||
}, | ||
} | ||
] | ||
} | ||
} | ||
|
||
|
||
def test_hunger_game_kp_with_category(): | ||
assert hunger_game_kp(hunger_game_filter="category") == { | ||
"hunger-game": { | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": { | ||
"html": "<p><a href='https://hunger.openfoodfacts.org/questions?type=category'>Answer robotoff questions about category</a></p>\n" | ||
}, | ||
} | ||
] | ||
} | ||
} | ||
|
||
|
||
def test_hunger_game_kp_category_with_country(): | ||
assert hunger_game_kp(hunger_game_filter="category", country="france") == { | ||
"hunger-game": { | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": { | ||
"html": "<p><a href='https://hunger.openfoodfacts.org/questions?country=france&type=category'>Answer robotoff questions about category</a></p>\n" | ||
}, | ||
} | ||
] | ||
} | ||
} | ||
|
||
|
||
def test_hunger_game_kp_category_with_value(): | ||
assert hunger_game_kp(hunger_game_filter="category", value="beer") == { | ||
"hunger-game": { | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": { | ||
"html": "<p><a href='https://hunger.openfoodfacts.org/questions?type=category&value_tag=beer'>Answer robotoff questions about beer category</a></p>\n" | ||
}, | ||
} | ||
] | ||
} | ||
} | ||
|
||
|
||
def test_hunger_game_kp_brand_with_value(): | ||
assert hunger_game_kp(hunger_game_filter="brand", value="nestle") == { | ||
"hunger-game": { | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": { | ||
"html": "<p><a href='https://hunger.openfoodfacts.org/questions?type=brand&value_tag=nestle'>Answer robotoff questions about nestle brand</a></p>\n" | ||
}, | ||
} | ||
] | ||
} | ||
} | ||
|
||
|
||
def test_hunger_game_kp_label_with_value(): | ||
assert hunger_game_kp(hunger_game_filter="label", value="organic") == { | ||
"hunger-game": { | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": { | ||
"html": "<p><a href='https://hunger.openfoodfacts.org/questions?type=label&value_tag=organic'>Answer robotoff questions about organic label</a></p>\n" | ||
}, | ||
} | ||
] | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,31 +1,72 @@ | ||
from curses import panel | ||
from urllib import response | ||
import json | ||
|
||
from app.main import app, knowledge_panel | ||
from fastapi.testclient import TestClient | ||
import requests | ||
from app.main import app | ||
|
||
client = TestClient(app) | ||
|
||
def test_answer_questions_brand_president(): | ||
response = client.get("/brand/president") | ||
|
||
def test_hello(): | ||
response = client.get("/") | ||
assert response.status_code == 200 | ||
assert response.json() == { | ||
"message": "Hello from facets-knowledge-panels! Tip: open /docs for documentation" | ||
} | ||
|
||
|
||
def test_knowledge_panel(): | ||
response = client.get("/knowledge_panel?facet_name=origin") | ||
assert response.status_code == 200 | ||
assert response.json() == {"knowledge_panels": [ | ||
{ | ||
"hunger-game": { | ||
"type": "hunger-game", | ||
"level": "questions", | ||
"elements": [ | ||
{ | ||
response_body = response.json() | ||
assert response_body["knowledge_panels"] == [] | ||
|
||
|
||
def test_knowledge_panel_badendpoint(): | ||
response = client.get("/knowledge_panel_bad") | ||
assert response.status_code == 404 | ||
|
||
|
||
def test_knowledge_panel_ctegory_with_value_and_country(): | ||
assert knowledge_panel( | ||
facet_name="category", facet_value="chocolate", country="belgium" | ||
) == { | ||
"knowledge_panels": [ | ||
{ | ||
"hunger-game": { | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": { | ||
"html":"<p><a href=\"https://hunger.openfoodfacts.org/?type=brand&value_tag=president\">Answer questions about brand president</a></p>\n" | ||
"html": "<p><a href='https://hunger.openfoodfacts.org/questions?country=belgium&type=category&value_tag=chocolate'>Answer robotoff questions about chocolate category</a></p>\n" | ||
}, | ||
} | ||
] | ||
} | ||
} | ||
] | ||
} | ||
|
||
|
||
def test_knowledge_panel_ctegory_with_country(): | ||
assert knowledge_panel(facet_name="category", country="india") == { | ||
"knowledge_panels": [ | ||
{ | ||
"hunger-game": { | ||
"elements": [ | ||
{ | ||
"element_type": "text", | ||
"text_element": { | ||
"html": "<p><a href='https://hunger.openfoodfacts.org/questions?country=india&type=category'>Answer robotoff questions about category</a></p>\n" | ||
}, | ||
], | ||
}, | ||
}, | ||
],} | ||
|
||
def test_answer_questions_brand_president_bad(): | ||
response = client.get("/brand/bad_endpoint") | ||
assert response.status_code == 404 | ||
assert response.json() == {'detail': 'Not Found'} | ||
} | ||
] | ||
} | ||
} | ||
] | ||
} | ||
|
||
|
||
def test_knowledge_panel_with_allergen(): | ||
assert knowledge_panel(facet_name="allergen") == {"knowledge_panels": []} |