Package: groceries-tobiasli
groceriesgroceriesTools for parsing human readable shopping lists and recipe ingredients.Installpip install groceries-tobiasliUsagegroceriescontains a set of classes that solve a lot of shopping and food-related problems:Ingredientis a container for a food item, and parses amount, unit and item name from an arbitrary string. The base structure for anIngredientstring isOptional[amount] Optional[unit] grocery_name, Optional[comment].GroceryListis a container forIngredientsand handles summation of all ingredients, as well as algebra.Cookbookis a container forRecipe, and make them searchable.Menuis the class returned when you use aCookbookto parse an actual, typed shopping list. It contains the recipes and ingredients that are parsed from the shopping list.IngredientIngredientis a class that takes any arbitrary string describing an
amount of an grocery item. The amount and unit is generalized and with
the formatting ingroceriesthe unit can be represented infromgroceriesimportIngredientprint(repr(Ingredient('10 2/3 tbs soy sauce')))# <Ingredient object: 1.60 dl soy sauce: <Unit: volume: [liter, litre, liters, ...]>>To simply get the most reasonable representation of theIngredient,
simply convert it to a string:print(Ingredient('302.3949133 grams baked beans'))# 1 lbs baked beansGroceryListGroceryListis the base component for most of the functionality ingroceries. AGroceryListaccepts groceries
as strings on a human readable format. They are added to aGroceryListasIngredientinstances.fromgroceriesimportGroceryListgl=GroceryList()gl.add_ingredients(['2 pounds sugar','2 kg sugar','chocolate','1/4 floz foo','1 2/9 tbs foo'])print(gl)# <GroceryList object: 3 ingredients#                chocolate,#        0.26 dl foo,#      2907.18 g sugar# >GroceryListinstances can be added, subtracted with otherGroceryLists. They can also be multiplied with skalars.gl = gl - GroceryList(ingredients=['953.5 g sugar', 'chocolate']) * 2
print(gl)

# <GroceryList object: 2 ingredients
#        0.26 dl foo,
#        1.00 kg sugar
# >Recipe and CookbooksTheGroceryListclass is used to represent ingredients in recipes.Recipeis a class that contains information
on how to cook a specific meal. You can have multipleRecipesand add them to aCookbook.The recipes are searchable both on name and tags.# Demo scripts for grocery readme.fromgroceriesimportRecipe,Cookbookrecipe1=Recipe(name='Carbonara',tags=['pasta','fast','egg','bacon'],time=20,serves=2,how_to='''Cook pasta. As pasta is preparing, fry bacon.When bacon is done, add frozen pees and continue frying until pees are cooked.Mix finished pasta with bacon and pees. Add eggs and grated parmesan and stir.Season with salt and pepper.''',ingredients=['150 g spaghetti','100 g bacon','100 g frozen green pees','2 eggs','50 g parmesan','salt','pepper'])recipe2=Recipe(name="Mac'n cheese",tags=['pasta','fast'],time=5,serves=2,how_to='''Cook mac. Add cheese. serve.''',ingredients=['150 g maccaroni','100 g cheese',])recipe3=Recipe(name='Chocolate',tags=['sweet','dessert'],time=2,serves=2,how_to='''Eat chocolate.''',ingredients=['200 g chocolate'])cookbook=Cookbook(recipes=[recipe1,recipe2,recipe3])# Accepts fuzzy string matching:print(cookbook.find_recipe('mac cheese'))# <Recipe object: Mac'n cheese># Mac'n cheese is the first match for pasta, but searches are cycling.# So when performing a category match again you won't be presented# with the same recipe again:print(cookbook.find_recipe('pasta'))# <Recipe object: Carbonara>MenuMenuis a class for parsing an entire weeks worth of shopping,
with syntax for meals on specific days as well as regular groceries.# Continuation from previous code block.menu=cookbook.parse_menu('''Monday: mac cheeseTuesday: sweetWednesday: pasta2 tbs coffee1 floz baked beans1 banana2 banana4 liters coffee''')print(menu.generate_processed_menu_str())# Monday: Mac'n cheese til 2# Tuesday: Chocolate til 2# Wednesday: Carbonara til 2# 0.30 dl coffee# 0.30 dl baked beans# 1 banana# 2 banana# 4 l coffeeprint(menu.groceries)# <GroceryList object: 13 ingredients#          100 g bacon,#        0.30 dl baked beans,#              3 banana,#          100 g cheese,#          200 g chocolate,#         4.03 l coffee,#              2 eggs,#          100 g frozen green pees,#          150 g maccaroni,#           50 g parmesan,#                pepper,#                salt,#          150 g spaghetti# >Changing configsgrocerieshas built in functionality to change whatever configuration
defines the units, ingredient rules and formatting.To change a particular config, eithermodify an existing config at runtime,use one of the other supplied configs, orcreate your own from one of thegroceries.configs.config_types.To finally set a specific config, useconfigs.set_config().fromgroceriesimportconfig,languageprint(config.language.language_name)# 'English'config.set_config(language.norwegian.language)print(config.language.language_name)# 'Norwegian'A special condition applies if you are changing unit configs.Changing unit configFor Units, specifically, we need to reload the unit definition if the
config relating to unit handling is changed. This is done viaunits.reload_units()fromgroceriesimportconfig,configs,units,Ingredientprint(Ingredient('2 lbs butter'))# 2 lb butterBut we want to force a different config for units. We want to use a
purely metric unit definition that will always formatIngredients as
metric.To do that we have to find the unit definition that we want, and set
that config. Since we are changing the units, we also have to reload
the units.config.set_config(configs.unit_definition.metric.unit_definition)units.units.reload_units()The new formatting will yield metric, as inches is removed from the
formatting definition.print(Ingredient('2 lb butter'))# 907.18 g butterSo, happy shopping!