| @ -0,0 +1,29 @@ | |||||
| #!/bin/python | |||||
| import os | |||||
| import warnings | |||||
| import yaml | |||||
| import recipes.ingredients | |||||
| from recipes.recipe import Recipe | |||||
| base_dir = ".." | |||||
| # load ingredients | |||||
| ingredients = {} | |||||
| with open(base_dir + "/ingredients.yaml") as file: | |||||
| ingredients = recipes.ingredients.load(file) | |||||
| # load recipes | |||||
| recipes = {} | |||||
| for filename in os.listdir(base_dir + "/recipes"): | |||||
| split_filename = filename.split(".") | |||||
| if split_filename[-1] != "yaml": | |||||
| warnings.warn("bad file format: " + split_filename) | |||||
| continue | |||||
| with open(base_dir + "/recipes/" + filename) as file: | |||||
| recipe_name = split_filename[0] | |||||
| recipe_yaml = yaml.load(file, Loader=yaml.BaseLoader) | |||||
| print(recipe_yaml) | |||||
| recipes[recipe_name] = Recipe(recipe_name, recipe_yaml, ingredients) | |||||
| @ -0,0 +1,49 @@ | |||||
| #!/bin/false | |||||
| import yaml | |||||
| import warnings | |||||
| from .measure import MEASURE_TYPES | |||||
| class Ingredient: | |||||
| def __init__(self, name, object): | |||||
| # ingredient name in different languages | |||||
| self.name = {"en": name} | |||||
| if "translations" in object: | |||||
| for language in object["translations"]: | |||||
| self.name[language] = object["translations"][language] | |||||
| if "types" in object: | |||||
| self.types = object["types"] | |||||
| else: | |||||
| self.types = {} | |||||
| # initialize measurement types | |||||
| self.measure = [] | |||||
| if "measure" in object: | |||||
| # ensure we have a list of measure types | |||||
| measures = [] | |||||
| if isinstance(object["measure"], str): | |||||
| measures = [object["measure"]] | |||||
| elif isinstance(object["measure"], list): | |||||
| measures = object["measure"] | |||||
| else: | |||||
| warnings.warn(name + ".measure should be string or list") | |||||
| # transform measure name into measure objects | |||||
| for measure_name in measures: | |||||
| if measure_name not in MEASURE_TYPES: | |||||
| warnings.warn("Unknown measure type: " + measure_name) | |||||
| else: | |||||
| self.measure.append(MEASURE_TYPES[measure_name]) | |||||
| def load(stream): | |||||
| ingredients = yaml.load(stream, Loader=yaml.BaseLoader) | |||||
| ret_ingredients = {} | |||||
| for name in ingredients: | |||||
| if name in ret_ingredients: | |||||
| warnings.warn("Duplicate ingredient: " + name) | |||||
| ret_ingredients[name] = Ingredient(name, ingredients[name]) | |||||
| return ret_ingredients | |||||
| @ -0,0 +1,22 @@ | |||||
| #!/bin/false | |||||
| class Measure: | |||||
| def __init__(self): | |||||
| pass | |||||
| class Weight(Measure): | |||||
| def __init__(self): | |||||
| super().__init__() | |||||
| class Volume(Measure): | |||||
| def __init__(self): | |||||
| super().__init__() | |||||
| MEASURE_TYPES = { | |||||
| "weight": Weight(), | |||||
| "volume": Volume(), | |||||
| } | |||||
| @ -0,0 +1,36 @@ | |||||
| #!/bin/false | |||||
| def loadTitle(title_object): | |||||
| if isinstance(title_object, str): | |||||
| return {"en": title_object} | |||||
| elif isinstance(title_object, dict): | |||||
| return title_object | |||||
| else: | |||||
| pass | |||||
| class Step: | |||||
| def __init__(self, object: dict, ingredients: dict, isMain: bool): | |||||
| if isMain or "title" not in object: | |||||
| self.title = "" | |||||
| else: | |||||
| self.title = loadTitle(object["title"]) | |||||
| # TODO: finish loading | |||||
| pass | |||||
| class Recipe: | |||||
| def __init__(self, name: str, object: dict, ingredients: dict): | |||||
| if "title" not in object: | |||||
| self.title = loadTitle(name) | |||||
| else: | |||||
| self.title = loadTitle(object["title"]) | |||||
| self.steps = [] | |||||
| if "step" not in object: | |||||
| self.steps = [Step(object, ingredients, isMain=True)] | |||||
| else: | |||||
| for step in object["step"]: | |||||
| self.steps.append(Step(step, ingredients, isMain=False)) | |||||