Skip to content

Commit

Permalink
feat: Adding a knowledge panel for Hunger Games (#8)
Browse files Browse the repository at this point in the history
* 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
sumit-158 and alexgarel committed Jul 15, 2022
1 parent 0db36bb commit b3b8328
Show file tree
Hide file tree
Showing 5 changed files with 241 additions and 52 deletions.
41 changes: 41 additions & 0 deletions app/knowledge_panels.py
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)},
},
],
},
}
52 changes: 25 additions & 27 deletions app/main.py
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}
22 changes: 19 additions & 3 deletions app/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from pydantic import BaseModel
from enum import Enum

class Facetname(str, Enum):
from pydantic import BaseModel


class FacetName(str, Enum):
country = "country"
nutrition_grade = "nutrition-grade"
nova_group = "nova-group"
Expand All @@ -20,5 +22,19 @@ class Facetname(str, Enum):
nucleotide = "nucleotide"
allergen = "allergen"
trace = "trace"


@staticmethod
def list():
return [c.value for c in FacetName]


class HungerGameFilter(str, Enum):
label = "label"
category = "category"
country = "country"
brand = "brand"
product_weight = "product_weight"

@staticmethod
def list():
return [c.value for c in HungerGameFilter]
93 changes: 93 additions & 0 deletions tests/test_knowledge_panels.py
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"
},
}
]
}
}
85 changes: 63 additions & 22 deletions tests/test_main.py
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": []}

0 comments on commit b3b8328

Please sign in to comment.