Public Access
feat: seed 30 starter recipes spanning chicken/beef/pork/fish/vegetarian
This commit is contained in:
@@ -4,6 +4,7 @@ Revision ID: 0007
|
|||||||
Revises: 0006
|
Revises: 0006
|
||||||
Create Date: 2026-05-05
|
Create Date: 2026-05-05
|
||||||
"""
|
"""
|
||||||
|
import json
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
@@ -106,14 +107,726 @@ def _upsert_ingredients() -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# 30 starter recipes. Each entry:
|
||||||
|
# (name, prep_min, cook_min, servings, cuisine_tags, dietary_tags,
|
||||||
|
# protein_type, calories_per_serving,
|
||||||
|
# ingredients [(canonical_name, qty, unit), ...],
|
||||||
|
# instructions [str, ...])
|
||||||
|
RECIPES = [
|
||||||
|
# ---------- Chicken (8) ----------
|
||||||
|
(
|
||||||
|
"Sheet-Pan Chicken Thighs with Roasted Vegetables",
|
||||||
|
10, 30, 4, ["american"], [], "chicken", 520,
|
||||||
|
[
|
||||||
|
("Chicken Thighs, Boneless Skinless", 2.0, "lb"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Broccoli", 1.0, "lb"),
|
||||||
|
("Sweet Potato", 2.0, "ea"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
("Black Pepper", 0.5, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Preheat oven to 425F.",
|
||||||
|
"Toss chicken and vegetables with olive oil, salt, and pepper on a sheet pan.",
|
||||||
|
"Roast 30 minutes until chicken reads 165F internal.",
|
||||||
|
"Rest 5 minutes before serving.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Chicken Tikka Masala",
|
||||||
|
15, 25, 4, ["indian"], [], "chicken", 610,
|
||||||
|
[
|
||||||
|
("Chicken Breast, Boneless Skinless", 1.5, "lb"),
|
||||||
|
("Greek Yogurt, Plain", 0.5, "cup"),
|
||||||
|
("Curry Powder", 2.0, "tsp"),
|
||||||
|
("Diced Tomatoes, Canned", 1.0, "can"),
|
||||||
|
("Coconut Milk, Canned", 1.0, "can"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Ginger, Fresh", 1.0, "tbsp"),
|
||||||
|
("Yellow Onion", 1.0, "ea"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Marinate diced chicken in yogurt and curry powder 10 minutes.",
|
||||||
|
"Saute onion, garlic, and ginger until soft.",
|
||||||
|
"Add chicken; brown 5 minutes.",
|
||||||
|
"Stir in tomatoes and coconut milk; simmer 15 minutes.",
|
||||||
|
"Season with salt; serve over rice.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Lemon Garlic Chicken Piccata",
|
||||||
|
10, 20, 4, ["italian"], [], "chicken", 480,
|
||||||
|
[
|
||||||
|
("Chicken Breast, Boneless Skinless", 1.5, "lb"),
|
||||||
|
("Butter, Unsalted", 3.0, "tbsp"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Lemon", 2.0, "ea"),
|
||||||
|
("Chicken Broth", 1.0, "cup"),
|
||||||
|
("Parsley, Italian", 0.25, "bunch"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Pound chicken to even thickness; season with salt.",
|
||||||
|
"Sear in butter 4 minutes per side; remove.",
|
||||||
|
"Add garlic, lemon juice, and broth to pan; reduce 5 minutes.",
|
||||||
|
"Return chicken to pan; spoon sauce over.",
|
||||||
|
"Garnish with parsley.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Thai Basil Chicken Stir-Fry",
|
||||||
|
10, 12, 4, ["thai", "asian"], [], "chicken", 460,
|
||||||
|
[
|
||||||
|
("Chicken Thighs, Boneless Skinless", 1.5, "lb"),
|
||||||
|
("Soy Sauce", 3.0, "tbsp"),
|
||||||
|
("Garlic", 4.0, "clove"),
|
||||||
|
("Bell Pepper, Red", 1.0, "ea"),
|
||||||
|
("Ginger, Fresh", 1.0, "tbsp"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Rice, Long-Grain White", 1.5, "cup"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Cook rice per package directions.",
|
||||||
|
"Heat oil in wok; add garlic and ginger 30 seconds.",
|
||||||
|
"Add diced chicken; stir-fry 6 minutes.",
|
||||||
|
"Add bell pepper and soy sauce; cook 4 minutes more.",
|
||||||
|
"Serve over rice.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Chicken Fajitas",
|
||||||
|
10, 15, 4, ["mexican"], [], "chicken", 510,
|
||||||
|
[
|
||||||
|
("Chicken Breast, Boneless Skinless", 1.5, "lb"),
|
||||||
|
("Bell Pepper, Red", 1.0, "ea"),
|
||||||
|
("Bell Pepper, Green", 1.0, "ea"),
|
||||||
|
("Yellow Onion", 1.0, "ea"),
|
||||||
|
("Cumin, Ground", 1.5, "tsp"),
|
||||||
|
("Paprika, Smoked", 1.0, "tsp"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Tortilla, Flour", 8.0, "ea"),
|
||||||
|
("Lime", 1.0, "ea"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Slice chicken and vegetables into strips.",
|
||||||
|
"Toss with cumin, paprika, salt, and oil.",
|
||||||
|
"Sear chicken in hot skillet 6 minutes; remove.",
|
||||||
|
"Cook peppers and onions 6 minutes.",
|
||||||
|
"Combine, squeeze lime, and serve in warm tortillas.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Mediterranean Chicken Bowls",
|
||||||
|
15, 20, 4, ["mediterranean"], [], "chicken", 540,
|
||||||
|
[
|
||||||
|
("Chicken Breast, Boneless Skinless", 1.25, "lb"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Lemon", 1.0, "ea"),
|
||||||
|
("Chickpeas, Canned", 1.0, "can"),
|
||||||
|
("Spinach, Fresh", 4.0, "oz"),
|
||||||
|
("Tomato, Roma", 2.0, "ea"),
|
||||||
|
("Greek Yogurt, Plain", 0.5, "cup"),
|
||||||
|
("Garlic", 2.0, "clove"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Marinate chicken in olive oil, lemon juice, garlic, and salt 10 minutes.",
|
||||||
|
"Grill or pan-sear chicken 6 minutes per side; slice.",
|
||||||
|
"Warm chickpeas in skillet 3 minutes.",
|
||||||
|
"Assemble bowls with spinach, tomato, chickpeas, chicken.",
|
||||||
|
"Top with yogurt and a lemon wedge.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Honey Soy Glazed Chicken",
|
||||||
|
10, 20, 4, ["asian"], [], "chicken", 500,
|
||||||
|
[
|
||||||
|
("Chicken Thighs, Boneless Skinless", 2.0, "lb"),
|
||||||
|
("Soy Sauce", 4.0, "tbsp"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Ginger, Fresh", 1.0, "tbsp"),
|
||||||
|
("Rice, Long-Grain White", 1.5, "cup"),
|
||||||
|
("Broccoli", 0.75, "lb"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Cook rice per package directions; steam broccoli.",
|
||||||
|
"Whisk soy sauce, garlic, and ginger.",
|
||||||
|
"Sear chicken 4 minutes per side.",
|
||||||
|
"Pour sauce over; simmer 6 minutes until glazed.",
|
||||||
|
"Slice and serve over rice with broccoli.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Creamy Tuscan Chicken",
|
||||||
|
10, 20, 4, ["italian"], [], "chicken", 620,
|
||||||
|
[
|
||||||
|
("Chicken Breast, Boneless Skinless", 1.5, "lb"),
|
||||||
|
("Butter, Unsalted", 2.0, "tbsp"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Spinach, Fresh", 4.0, "oz"),
|
||||||
|
("Tomato, Roma", 2.0, "ea"),
|
||||||
|
("Milk, Whole", 1.0, "cup"),
|
||||||
|
("Parmesan, Grated", 4.0, "tbsp"),
|
||||||
|
("Italian Seasoning", 1.0, "tsp"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Season chicken with salt and Italian seasoning; sear in butter 5 minutes per side.",
|
||||||
|
"Remove chicken; add garlic and tomato to pan 2 minutes.",
|
||||||
|
"Stir in milk and parmesan; simmer 4 minutes.",
|
||||||
|
"Add spinach until wilted.",
|
||||||
|
"Return chicken to sauce and serve.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
# ---------- Beef (4) ----------
|
||||||
|
(
|
||||||
|
"Spaghetti Bolognese",
|
||||||
|
10, 30, 4, ["italian"], [], "beef", 640,
|
||||||
|
[
|
||||||
|
("Ground Beef, 85/15", 1.0, "lb"),
|
||||||
|
("Pasta, Spaghetti", 1.0, "lb"),
|
||||||
|
("Yellow Onion", 1.0, "ea"),
|
||||||
|
("Carrot", 2.0, "ea"),
|
||||||
|
("Celery", 2.0, "stalk"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Diced Tomatoes, Canned", 1.0, "can"),
|
||||||
|
("Italian Seasoning", 1.0, "tsp"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Saute onion, carrot, celery, and garlic in olive oil 6 minutes.",
|
||||||
|
"Add ground beef; brown 8 minutes.",
|
||||||
|
"Stir in tomatoes and Italian seasoning; simmer 20 minutes.",
|
||||||
|
"Cook spaghetti to al dente; drain.",
|
||||||
|
"Toss pasta with sauce; season with salt.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Classic Beef Tacos",
|
||||||
|
10, 15, 4, ["mexican"], [], "beef", 560,
|
||||||
|
[
|
||||||
|
("Ground Beef, 85/15", 1.0, "lb"),
|
||||||
|
("Yellow Onion", 1.0, "ea"),
|
||||||
|
("Cumin, Ground", 1.5, "tsp"),
|
||||||
|
("Paprika, Smoked", 1.0, "tsp"),
|
||||||
|
("Tortilla, Corn", 8.0, "ea"),
|
||||||
|
("Cheddar Cheese, Sharp", 4.0, "oz"),
|
||||||
|
("Salsa, Jarred", 4.0, "tbsp"),
|
||||||
|
("Cilantro", 0.25, "bunch"),
|
||||||
|
("Lime", 1.0, "ea"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Brown beef and diced onion 8 minutes.",
|
||||||
|
"Add cumin, paprika, salt; cook 2 minutes more.",
|
||||||
|
"Warm tortillas in dry skillet.",
|
||||||
|
"Assemble tacos with beef, cheese, salsa, cilantro.",
|
||||||
|
"Squeeze lime over and serve.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Korean-Style Beef Bowls",
|
||||||
|
10, 12, 4, ["asian", "korean"], [], "beef", 580,
|
||||||
|
[
|
||||||
|
("Ground Beef, 85/15", 1.0, "lb"),
|
||||||
|
("Soy Sauce", 4.0, "tbsp"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Ginger, Fresh", 1.0, "tbsp"),
|
||||||
|
("Rice, Long-Grain White", 1.5, "cup"),
|
||||||
|
("Broccoli", 0.75, "lb"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Cook rice and steam broccoli.",
|
||||||
|
"Brown beef 5 minutes; drain excess fat.",
|
||||||
|
"Add garlic, ginger, soy sauce; simmer 4 minutes.",
|
||||||
|
"Spoon over rice with broccoli alongside.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Slow-Braised Beef Stew",
|
||||||
|
15, 120, 6, ["american"], [], "beef", 560,
|
||||||
|
[
|
||||||
|
("Ground Beef, 85/15", 1.5, "lb"),
|
||||||
|
("Yellow Onion", 1.0, "ea"),
|
||||||
|
("Carrot", 3.0, "ea"),
|
||||||
|
("Celery", 2.0, "stalk"),
|
||||||
|
("Sweet Potato", 2.0, "ea"),
|
||||||
|
("Diced Tomatoes, Canned", 1.0, "can"),
|
||||||
|
("Chicken Broth", 3.0, "cup"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Salt, Kosher", 1.5, "tsp"),
|
||||||
|
("Black Pepper", 0.5, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Brown beef in olive oil; remove.",
|
||||||
|
"Saute onion, carrot, celery 6 minutes.",
|
||||||
|
"Return beef; add tomatoes, broth, sweet potato, salt, pepper.",
|
||||||
|
"Cover; simmer low 2 hours until tender.",
|
||||||
|
"Adjust seasoning and serve.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
# ---------- Turkey (3) ----------
|
||||||
|
(
|
||||||
|
"Turkey Chili",
|
||||||
|
10, 30, 6, ["american"], [], "turkey", 430,
|
||||||
|
[
|
||||||
|
("Ground Turkey", 1.25, "lb"),
|
||||||
|
("Black Beans, Canned", 2.0, "can"),
|
||||||
|
("Diced Tomatoes, Canned", 1.0, "can"),
|
||||||
|
("Yellow Onion", 1.0, "ea"),
|
||||||
|
("Bell Pepper, Red", 1.0, "ea"),
|
||||||
|
("Cumin, Ground", 2.0, "tsp"),
|
||||||
|
("Paprika, Smoked", 1.0, "tsp"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Saute onion, pepper, garlic in oil 6 minutes.",
|
||||||
|
"Add turkey; brown 8 minutes.",
|
||||||
|
"Stir in cumin, paprika, salt.",
|
||||||
|
"Add tomatoes and beans; simmer 20 minutes.",
|
||||||
|
"Adjust seasoning and serve.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Turkey Meatballs in Marinara",
|
||||||
|
15, 25, 4, ["italian"], [], "turkey", 540,
|
||||||
|
[
|
||||||
|
("Ground Turkey", 1.25, "lb"),
|
||||||
|
("Eggs, Large", 1.0, "ea"),
|
||||||
|
("Parmesan, Grated", 4.0, "tbsp"),
|
||||||
|
("Italian Seasoning", 1.0, "tsp"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Diced Tomatoes, Canned", 1.0, "can"),
|
||||||
|
("Pasta, Spaghetti", 0.75, "lb"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Mix turkey, egg, parmesan, half the garlic, salt; form 16 meatballs.",
|
||||||
|
"Brown meatballs in oil 6 minutes.",
|
||||||
|
"Add remaining garlic, tomatoes, Italian seasoning; simmer 18 minutes.",
|
||||||
|
"Cook spaghetti to al dente; drain.",
|
||||||
|
"Serve meatballs and sauce over pasta.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Turkey Lettuce Wraps",
|
||||||
|
10, 12, 4, ["asian"], [], "turkey", 380,
|
||||||
|
[
|
||||||
|
("Ground Turkey", 1.0, "lb"),
|
||||||
|
("Soy Sauce", 3.0, "tbsp"),
|
||||||
|
("Garlic", 2.0, "clove"),
|
||||||
|
("Ginger, Fresh", 1.0, "tbsp"),
|
||||||
|
("Bell Pepper, Red", 1.0, "ea"),
|
||||||
|
("Cilantro", 0.25, "bunch"),
|
||||||
|
("Lime", 1.0, "ea"),
|
||||||
|
("Olive Oil", 1.0, "tbsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Heat oil; saute garlic and ginger 30 seconds.",
|
||||||
|
"Add turkey; brown 6 minutes.",
|
||||||
|
"Stir in diced bell pepper and soy sauce; cook 4 minutes.",
|
||||||
|
"Spoon into lettuce leaves; top with cilantro and lime.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
# ---------- Pork (3) ----------
|
||||||
|
(
|
||||||
|
"Pan-Seared Pork Chops with Apple Glaze",
|
||||||
|
10, 18, 4, ["american"], [], "pork", 520,
|
||||||
|
[
|
||||||
|
("Pork Chops, Bone-In", 2.0, "lb"),
|
||||||
|
("Butter, Unsalted", 2.0, "tbsp"),
|
||||||
|
("Garlic", 2.0, "clove"),
|
||||||
|
("Chicken Broth", 0.5, "cup"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
("Black Pepper", 0.5, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Season chops with salt and pepper.",
|
||||||
|
"Sear in butter 5 minutes per side.",
|
||||||
|
"Add garlic and broth; simmer 4 minutes.",
|
||||||
|
"Spoon pan sauce over chops and serve.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Pork Carnitas Tacos",
|
||||||
|
15, 150, 6, ["mexican"], [], "pork", 580,
|
||||||
|
[
|
||||||
|
("Pork Chops, Bone-In", 2.5, "lb"),
|
||||||
|
("Yellow Onion", 1.0, "ea"),
|
||||||
|
("Garlic", 4.0, "clove"),
|
||||||
|
("Cumin, Ground", 1.5, "tsp"),
|
||||||
|
("Lime", 2.0, "ea"),
|
||||||
|
("Tortilla, Corn", 12.0, "ea"),
|
||||||
|
("Cilantro", 0.5, "bunch"),
|
||||||
|
("Salt, Kosher", 1.5, "tsp"),
|
||||||
|
("Chicken Broth", 1.0, "cup"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Cube pork; season with salt and cumin.",
|
||||||
|
"Combine pork, onion, garlic, broth, and lime juice in pot.",
|
||||||
|
"Cover; simmer 2.5 hours until shreddable.",
|
||||||
|
"Shred pork; broil 4 minutes for crispy edges.",
|
||||||
|
"Serve in warm tortillas with cilantro and lime.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Pork Stir-Fry with Bell Peppers",
|
||||||
|
10, 12, 4, ["asian"], [], "pork", 470,
|
||||||
|
[
|
||||||
|
("Pork Chops, Bone-In", 1.25, "lb"),
|
||||||
|
("Bell Pepper, Red", 1.0, "ea"),
|
||||||
|
("Bell Pepper, Green", 1.0, "ea"),
|
||||||
|
("Soy Sauce", 3.0, "tbsp"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Ginger, Fresh", 1.0, "tbsp"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Rice, Long-Grain White", 1.5, "cup"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Cook rice per package directions.",
|
||||||
|
"Slice pork off bone into strips.",
|
||||||
|
"Stir-fry pork in oil 5 minutes; remove.",
|
||||||
|
"Cook peppers, garlic, ginger 4 minutes.",
|
||||||
|
"Return pork; add soy sauce; cook 2 minutes; serve over rice.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
# ---------- Fish / Seafood (3) ----------
|
||||||
|
(
|
||||||
|
"Lemon Herb Baked Salmon",
|
||||||
|
5, 18, 4, ["mediterranean"], [], "fish", 480,
|
||||||
|
[
|
||||||
|
("Salmon Fillet", 1.5, "lb"),
|
||||||
|
("Lemon", 1.0, "ea"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Garlic", 2.0, "clove"),
|
||||||
|
("Parsley, Italian", 0.25, "bunch"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
("Black Pepper", 0.5, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Preheat oven to 400F.",
|
||||||
|
"Place salmon on lined sheet; drizzle with oil and lemon juice.",
|
||||||
|
"Top with minced garlic, salt, pepper.",
|
||||||
|
"Bake 15 minutes until flaky.",
|
||||||
|
"Garnish with parsley.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Garlic Shrimp Scampi",
|
||||||
|
5, 12, 4, ["italian"], [], "fish", 520,
|
||||||
|
[
|
||||||
|
("Shrimp, Peeled", 1.25, "lb"),
|
||||||
|
("Pasta, Spaghetti", 0.75, "lb"),
|
||||||
|
("Butter, Unsalted", 3.0, "tbsp"),
|
||||||
|
("Garlic", 4.0, "clove"),
|
||||||
|
("Lemon", 1.0, "ea"),
|
||||||
|
("Parsley, Italian", 0.25, "bunch"),
|
||||||
|
("Olive Oil", 1.0, "tbsp"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Cook pasta to al dente; reserve 0.5 cup water.",
|
||||||
|
"Saute garlic in butter and oil 1 minute.",
|
||||||
|
"Add shrimp; cook 4 minutes until pink.",
|
||||||
|
"Toss with pasta, lemon juice, reserved water, salt.",
|
||||||
|
"Top with parsley.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Shrimp Tacos with Cilantro Lime Slaw",
|
||||||
|
15, 8, 4, ["mexican"], [], "fish", 460,
|
||||||
|
[
|
||||||
|
("Shrimp, Peeled", 1.0, "lb"),
|
||||||
|
("Cumin, Ground", 1.0, "tsp"),
|
||||||
|
("Paprika, Smoked", 1.0, "tsp"),
|
||||||
|
("Olive Oil", 1.0, "tbsp"),
|
||||||
|
("Tortilla, Corn", 8.0, "ea"),
|
||||||
|
("Cilantro", 0.5, "bunch"),
|
||||||
|
("Lime", 2.0, "ea"),
|
||||||
|
("Sour Cream", 4.0, "tbsp"),
|
||||||
|
("Avocado", 1.0, "ea"),
|
||||||
|
("Salt, Kosher", 0.75, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Toss shrimp with cumin, paprika, salt, oil.",
|
||||||
|
"Sear 3 minutes per side.",
|
||||||
|
"Mix cilantro and lime juice with sour cream for slaw.",
|
||||||
|
"Warm tortillas; fill with shrimp, slaw, sliced avocado.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
# ---------- Vegetarian (5) ----------
|
||||||
|
(
|
||||||
|
"Black Bean Tacos",
|
||||||
|
5, 10, 4, ["mexican"], ["vegetarian"], "vegetarian", 410,
|
||||||
|
[
|
||||||
|
("Black Beans, Canned", 2.0, "can"),
|
||||||
|
("Cumin, Ground", 1.0, "tsp"),
|
||||||
|
("Paprika, Smoked", 1.0, "tsp"),
|
||||||
|
("Tortilla, Corn", 8.0, "ea"),
|
||||||
|
("Avocado", 1.0, "ea"),
|
||||||
|
("Salsa, Jarred", 4.0, "tbsp"),
|
||||||
|
("Cilantro", 0.25, "bunch"),
|
||||||
|
("Lime", 1.0, "ea"),
|
||||||
|
("Salt, Kosher", 0.5, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Drain beans; warm with cumin, paprika, salt 6 minutes.",
|
||||||
|
"Mash slightly with fork.",
|
||||||
|
"Warm tortillas in dry skillet.",
|
||||||
|
"Fill with beans, avocado, salsa, cilantro.",
|
||||||
|
"Squeeze lime over and serve.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Chickpea Curry",
|
||||||
|
10, 25, 4, ["indian"], ["vegetarian", "vegan"], "vegetarian", 480,
|
||||||
|
[
|
||||||
|
("Chickpeas, Canned", 2.0, "can"),
|
||||||
|
("Coconut Milk, Canned", 1.0, "can"),
|
||||||
|
("Yellow Onion", 1.0, "ea"),
|
||||||
|
("Garlic", 3.0, "clove"),
|
||||||
|
("Ginger, Fresh", 1.0, "tbsp"),
|
||||||
|
("Curry Powder", 2.0, "tsp"),
|
||||||
|
("Diced Tomatoes, Canned", 1.0, "can"),
|
||||||
|
("Spinach, Fresh", 4.0, "oz"),
|
||||||
|
("Rice, Long-Grain White", 1.5, "cup"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Cook rice per package directions.",
|
||||||
|
"Saute onion, garlic, ginger 5 minutes.",
|
||||||
|
"Stir in curry powder, tomatoes, coconut milk; simmer 15 minutes.",
|
||||||
|
"Add chickpeas and spinach; cook 5 minutes.",
|
||||||
|
"Season with salt; serve over rice.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Caprese Pasta",
|
||||||
|
10, 15, 4, ["italian"], ["vegetarian"], "vegetarian", 540,
|
||||||
|
[
|
||||||
|
("Pasta, Penne", 1.0, "lb"),
|
||||||
|
("Tomato, Roma", 4.0, "ea"),
|
||||||
|
("Mozzarella, Shredded", 6.0, "oz"),
|
||||||
|
("Olive Oil", 3.0, "tbsp"),
|
||||||
|
("Garlic", 2.0, "clove"),
|
||||||
|
("Italian Seasoning", 1.0, "tsp"),
|
||||||
|
("Parsley, Italian", 0.25, "bunch"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Cook penne to al dente; drain.",
|
||||||
|
"Saute garlic and diced tomato in oil 5 minutes.",
|
||||||
|
"Toss with pasta, Italian seasoning, salt.",
|
||||||
|
"Top with mozzarella; cover 2 minutes to melt.",
|
||||||
|
"Garnish with parsley.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Zucchini and Spinach Frittata",
|
||||||
|
10, 20, 4, ["mediterranean"], ["vegetarian"], "vegetarian", 360,
|
||||||
|
[
|
||||||
|
("Eggs, Large", 8.0, "ea"),
|
||||||
|
("Zucchini", 1.0, "ea"),
|
||||||
|
("Spinach, Fresh", 3.0, "oz"),
|
||||||
|
("Yellow Onion", 0.5, "ea"),
|
||||||
|
("Parmesan, Grated", 4.0, "tbsp"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Salt, Kosher", 0.75, "tsp"),
|
||||||
|
("Black Pepper", 0.25, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Preheat oven to 375F.",
|
||||||
|
"Saute onion and zucchini in oil 5 minutes; add spinach.",
|
||||||
|
"Whisk eggs, parmesan, salt, pepper; pour over vegetables.",
|
||||||
|
"Cook 3 minutes on stovetop, then bake 12 minutes until set.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Roasted Sweet Potato and Chickpea Bowl",
|
||||||
|
10, 30, 4, ["mediterranean"], ["vegetarian", "vegan"], "vegetarian", 470,
|
||||||
|
[
|
||||||
|
("Sweet Potato", 3.0, "ea"),
|
||||||
|
("Chickpeas, Canned", 1.0, "can"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
("Cumin, Ground", 1.0, "tsp"),
|
||||||
|
("Paprika, Smoked", 1.0, "tsp"),
|
||||||
|
("Spinach, Fresh", 4.0, "oz"),
|
||||||
|
("Greek Yogurt, Plain", 0.5, "cup"),
|
||||||
|
("Lemon", 1.0, "ea"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Preheat oven to 425F.",
|
||||||
|
"Toss diced sweet potato and drained chickpeas with oil, cumin, paprika, salt.",
|
||||||
|
"Roast 30 minutes.",
|
||||||
|
"Whisk yogurt with lemon juice.",
|
||||||
|
"Plate over spinach; drizzle with yogurt sauce.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
# ---------- Mixed / Other (4) ----------
|
||||||
|
(
|
||||||
|
"Veggie Fried Rice with Egg",
|
||||||
|
10, 12, 4, ["asian"], ["vegetarian"], "vegetarian", 440,
|
||||||
|
[
|
||||||
|
("Rice, Long-Grain White", 2.0, "cup"),
|
||||||
|
("Eggs, Large", 3.0, "ea"),
|
||||||
|
("Soy Sauce", 3.0, "tbsp"),
|
||||||
|
("Carrot", 2.0, "ea"),
|
||||||
|
("Bell Pepper, Red", 1.0, "ea"),
|
||||||
|
("Garlic", 2.0, "clove"),
|
||||||
|
("Ginger, Fresh", 1.0, "tbsp"),
|
||||||
|
("Olive Oil", 2.0, "tbsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Cook rice; spread on tray to cool (or use day-old rice).",
|
||||||
|
"Scramble eggs in oil; remove.",
|
||||||
|
"Stir-fry carrot, pepper, garlic, ginger 4 minutes.",
|
||||||
|
"Add rice and soy sauce; toss 4 minutes.",
|
||||||
|
"Fold eggs back in and serve.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Breakfast-for-Dinner Veggie Scramble",
|
||||||
|
5, 12, 4, ["american"], ["vegetarian"], "vegetarian", 380,
|
||||||
|
[
|
||||||
|
("Eggs, Large", 8.0, "ea"),
|
||||||
|
("Bell Pepper, Green", 1.0, "ea"),
|
||||||
|
("Tomato, Roma", 2.0, "ea"),
|
||||||
|
("Cheddar Cheese, Sharp", 3.0, "oz"),
|
||||||
|
("Butter, Unsalted", 2.0, "tbsp"),
|
||||||
|
("Salt, Kosher", 0.5, "tsp"),
|
||||||
|
("Black Pepper", 0.25, "tsp"),
|
||||||
|
("Tortilla, Flour", 4.0, "ea"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Saute diced pepper and tomato in butter 4 minutes.",
|
||||||
|
"Whisk eggs with salt and pepper; add to pan.",
|
||||||
|
"Stir gently 4 minutes until just set.",
|
||||||
|
"Fold in cheese; serve with warm tortillas.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Chicken and Rice Soup",
|
||||||
|
10, 30, 6, ["american"], [], "chicken", 360,
|
||||||
|
[
|
||||||
|
("Chicken Breast, Boneless Skinless", 1.0, "lb"),
|
||||||
|
("Chicken Broth", 6.0, "cup"),
|
||||||
|
("Carrot", 3.0, "ea"),
|
||||||
|
("Celery", 2.0, "stalk"),
|
||||||
|
("Yellow Onion", 1.0, "ea"),
|
||||||
|
("Garlic", 2.0, "clove"),
|
||||||
|
("Rice, Long-Grain White", 0.75, "cup"),
|
||||||
|
("Parsley, Italian", 0.25, "bunch"),
|
||||||
|
("Olive Oil", 1.0, "tbsp"),
|
||||||
|
("Salt, Kosher", 1.0, "tsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Saute onion, carrot, celery, garlic 6 minutes.",
|
||||||
|
"Add broth and chicken; simmer 15 minutes.",
|
||||||
|
"Remove chicken; shred. Add rice; cook 12 minutes.",
|
||||||
|
"Return chicken; season with salt.",
|
||||||
|
"Garnish with parsley.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Loaded Veggie Quesadillas",
|
||||||
|
10, 12, 4, ["mexican"], ["vegetarian"], "vegetarian", 520,
|
||||||
|
[
|
||||||
|
("Tortilla, Flour", 8.0, "ea"),
|
||||||
|
("Cheddar Cheese, Sharp", 6.0, "oz"),
|
||||||
|
("Black Beans, Canned", 1.0, "can"),
|
||||||
|
("Bell Pepper, Red", 1.0, "ea"),
|
||||||
|
("Yellow Onion", 0.5, "ea"),
|
||||||
|
("Cumin, Ground", 0.5, "tsp"),
|
||||||
|
("Olive Oil", 1.0, "tbsp"),
|
||||||
|
("Salsa, Jarred", 4.0, "tbsp"),
|
||||||
|
("Sour Cream", 4.0, "tbsp"),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Saute pepper and onion in oil 5 minutes; stir in beans and cumin.",
|
||||||
|
"Layer cheese and filling on tortillas; top with second tortilla.",
|
||||||
|
"Toast in dry skillet 2 minutes per side until golden.",
|
||||||
|
"Cut into wedges; serve with salsa and sour cream.",
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def _insert_recipes() -> None:
|
def _insert_recipes() -> None:
|
||||||
"""Populated in P4-14."""
|
bind = op.get_bind()
|
||||||
pass
|
|
||||||
|
# Build a name_lower -> id map once.
|
||||||
|
rows = bind.execute(sa.text("SELECT id, name_lower FROM ingredient")).fetchall()
|
||||||
|
name_to_id = {row.name_lower: str(row.id) for row in rows}
|
||||||
|
|
||||||
|
for (
|
||||||
|
name, prep, cook, servings, cuisine_tags, dietary_tags,
|
||||||
|
protein, calories, ingredients, instructions,
|
||||||
|
) in RECIPES:
|
||||||
|
ingredient_payload = []
|
||||||
|
for ing_name, qty, unit in ingredients:
|
||||||
|
ing_id = name_to_id.get(ing_name.lower())
|
||||||
|
if ing_id is None:
|
||||||
|
raise RuntimeError(
|
||||||
|
f"Recipe {name!r} references unknown ingredient {ing_name!r}. "
|
||||||
|
f"Add it to INGREDIENTS or fix the name."
|
||||||
|
)
|
||||||
|
ingredient_payload.append({
|
||||||
|
"ingredient_id": ing_id,
|
||||||
|
"qty": float(qty),
|
||||||
|
"unit": unit,
|
||||||
|
})
|
||||||
|
|
||||||
|
bind.execute(
|
||||||
|
sa.text(
|
||||||
|
"""
|
||||||
|
INSERT INTO recipe (
|
||||||
|
id, name, prep_time_minutes, cook_time_minutes, servings,
|
||||||
|
cuisine_tags, dietary_tags, protein_type, calories_per_serving,
|
||||||
|
ingredients, instructions, is_manually_added
|
||||||
|
)
|
||||||
|
VALUES (
|
||||||
|
gen_random_uuid(), :name, :prep, :cook, :servings,
|
||||||
|
:cuisine_tags, :dietary_tags, :protein, :calories,
|
||||||
|
CAST(:ingredients AS jsonb), :instructions, false
|
||||||
|
)
|
||||||
|
ON CONFLICT DO NOTHING
|
||||||
|
"""
|
||||||
|
),
|
||||||
|
{
|
||||||
|
"name": name,
|
||||||
|
"prep": prep,
|
||||||
|
"cook": cook,
|
||||||
|
"servings": servings,
|
||||||
|
"cuisine_tags": cuisine_tags,
|
||||||
|
"dietary_tags": dietary_tags,
|
||||||
|
"protein": protein,
|
||||||
|
"calories": calories,
|
||||||
|
"ingredients": json.dumps(ingredient_payload),
|
||||||
|
"instructions": instructions,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _delete_recipes() -> None:
|
def _delete_recipes() -> None:
|
||||||
"""Populated in P4-14."""
|
bind = op.get_bind()
|
||||||
pass
|
names = [row[0] for row in RECIPES]
|
||||||
|
bind.execute(
|
||||||
|
sa.text("DELETE FROM recipe WHERE name = ANY(:names) AND is_manually_added = false"),
|
||||||
|
{"names": names},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _delete_ingredients() -> None:
|
def _delete_ingredients() -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user