Skip to content
This repository has been archived by the owner on Nov 20, 2022. It is now read-only.

Commit

Permalink
Surprise support (#50)
Browse files Browse the repository at this point in the history
* 🐛Geschlossen in day of week line

* ✨Support "Überrasschungsmenü"

* ✅adding tests
raabf authored and srehwald committed Sep 3, 2019
1 parent a36f698 commit 6249635
Showing 4 changed files with 265 additions and 102 deletions.
5 changes: 4 additions & 1 deletion src/entities.py
Original file line number Diff line number Diff line change
@@ -8,7 +8,10 @@
class Dish:
def __init__(self, name, price, ingredients):
self.name = name
self.price = price
try:
self.price = float(price)
except ValueError:
self.price = price
self.ingredients = ingredients

def __repr__(self):
24 changes: 11 additions & 13 deletions src/menu_parser.py
Original file line number Diff line number Diff line change
@@ -178,9 +178,9 @@ def __parse_dishes(menu_html, location):

class FMIBistroMenuParser(MenuParser):
url = "http://www.wilhelm-gastronomie.de/tum-garching"
allergens = ["Gluten", "Laktose", "Milcheiweiß", "Hühnerei", "Soja", "Nüsse", "Erdnuss", "Sellerie", "Fisch",
allergens = ["Gluten", "Laktose", "Milcheiweiß", "Hühnerei", "Soja", "Nüsse", "Erdnuss", "Sellerie", "Fisch",
"Krebstiere", "Weichtiere", "Sesam", "Senf", "Milch", "Ei"]
allergens_regex = r"(Allergene:((\s|\n)*(Gluten|Laktose|Milcheiweiß|Hühnerei|Soja|Nüsse|Erdnuss|Sellerie|Fisch|Krebstiere|Weichtiere|Sesam|Senf|Milch|Ei),?(?![\w-]))*)"
allergens_regex = r"(Allergene:((\s|\n)*(Gluten|Laktose|Milcheiweiß|Hühnerei|Soja|Nüsse|Erdnuss|Sellerie|Fisch|Krebstiere|Weichtiere|Sesam|Senf|Milch|Ei),?(?![\w-]))*)"
price_regex = r"\€\s\d+,\d+"
dish_regex = r".+?\€\s\d+,\d+"

@@ -329,8 +329,9 @@ class IPPBistroMenuParser(MenuParser):
split_days_regex_soup_one_line = re.compile(r'T agessuppe siehe Aushang|Tagessuppe siehe Aushang', re.IGNORECASE)
split_days_regex_soup_two_line = re.compile(r'Aushang', re.IGNORECASE)
split_days_regex_closed = re.compile(r'Aschermittwoch|Feiertag|Geschlossen', re.IGNORECASE)
price_regex = re.compile(r"\d+,\d+\s€[^)]")
dish_regex = re.compile(r".+?\d+,\d+\s€[^)]")
surprise_without_price_regex = re.compile(r"(Überraschungsmenü\s)(\s+[^\s\d]+)")
"""Detects the ‚Überraschungsmenü‘ keyword if it has not a price. The price is expected between the groups."""
dish_regex = re.compile(r"(.+?)(\d+,\d+|\?€)\s€[^)]")

def parse(self, location):
page = requests.get(self.url)
@@ -451,25 +452,22 @@ def get_menus(self, text, year, week_number):
lines_weekdays["fri"] += " " + line[pos_fri:].replace("\n", " ")

for key in lines_weekdays:
# Appends `?€` to „Überraschungsmenü“ if it do not have a price. The second '€' is a separator for the
# later split
lines_weekdays[key] = self.surprise_without_price_regex.sub(r"\g<1>?€ € \g<2>", lines_weekdays[key])
# get rid of two-character umlauts (e.g. SMALL_LETTER_A+COMBINING_DIACRITICAL_MARK_UMLAUT)
lines_weekdays[key] = unicodedata.normalize("NFKC", lines_weekdays[key])
# remove multi-whitespaces
lines_weekdays[key] = ' '.join(lines_weekdays[key].split())
# get all dish including name and price
dish_names = re.findall(self.dish_regex, lines_weekdays[key] + " ")
# get dish prices
prices = re.findall(self.price_regex, ' '.join(dish_names))
# convert prices to float
prices = [float(price.replace("€", "").replace(",", ".").strip()) for price in prices]
# remove price and commas from dish names
dish_names = [re.sub(self.price_regex, "", dish).strip() for dish in dish_names]
dish_names_price = re.findall(self.dish_regex, lines_weekdays[key] + ' ')
# create ingredients
# all dishes have the same ingridients
ingredients = Ingredients("ipp-bistro")
ingredients.parse_ingredients("Mi,Gl,Sf,Sl,Ei,Se,4")
# create list of Dish objects
dishes = [Dish(dish_name, price, ingredients.ingredient_set) for (dish_name, price) in
list(zip(dish_names, prices))]
dishes = [Dish(dish_name.strip(), price.replace(',', '.').strip(), ingredients.ingredient_set)
for (dish_name, price) in dish_names_price]
date = self.get_date(year, week_number, self.weekday_positions[key])
# create new Menu object and add it to dict
menu = Menu(date, dishes)
60 changes: 60 additions & 0 deletions src/test/assets/ipp/KW_22-27.05.-31.05.19.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
KONRADHOF CATERING - Betriebskantine IPP

Speiseplan KW 22 Montag, 27. Mai 2019 bis Freitag, 31. Mai 2019

Montag Dienstag Mittwoch Feiertag Geschlossen




Tagessuppe siehe Aushang Tagessuppe siehe Aushang Tagessuppe siehe Aushang
Suppentopf Preis ab 0,90 € Preis ab 0,90 € Preis ab 0,90 €




Kohlrabieintopf mit Kartoffeln Puddingmilchreis mit
Veggie Überraschungsmenü
(mit Wiener 4,50 €) Himbeersauce

3,50 € 3,70 € 3,50 €




Putenschnitzel in Zitronen-
Pfefferrahmgeschnetzeltes von Gnocchi Aurora, dazu Pesto
Traditionelle Küche Kapernsauce mit
der Pute mit Reis und Grana
Petersilienkartoffeln
5,90 € 4,80 € 6,90 €



Wokgericht
Penne "Diabolo" mit Cabanossi,
Gemüse-Couscous mit
Überraschungsmenü Peperoni,Paprika, Zucchini,
Internationale Küche mariniertem Harissa-Honig-
Chilipulver und Mais, dazu Grana
Hühnchen (leicht scharf)
6,90 € 4,90 €




Luganer Schweinesteak mit "Kentucky-fried-Schnitzel",
"Battala Curry", süße Kartoffeln,
Senf, Schinken, Käse und Schweineschnitzel in Paprika-
Specials Erbsen, Kokosmilch, Senfkörner
Tomatenragout gratiniert, dazu Oregano-Panade, dazu
und Reis
Pommes frites Pommes frites
6,90 € 6,20 € 4,90 €


Änderungen vorbehalten - Allergene und Zusatzstoffe siehe Tagesaushänge
Wir sind immer offen für Anregungen, Kritik und Fragen. Senden Sie uns einfach eine E-Mail an [email protected]
Wir möchten darauf hinweisen, daß Bestandteile von Laktose 19, glutenhaltigem Getreide 20, Senf 23, Sellerie 22, Eiern 31, Sesam 24 und Geschmacksverstärker 4 in allen unseren Gerichte enthalten sein können.
Obwohl wir in unserer Küche auf jegliche Geschmacksverstärker wie z.B. Fondor verzichten, beinhalten leider viele Produkte Glutamat (z.B. Gewürzmischungen, Käse, Panaden, Sojasauce aber auch Tomaten)

278 changes: 190 additions & 88 deletions src/test/test_menu_parser.py

Large diffs are not rendered by default.

0 comments on commit 6249635

Please sign in to comment.