Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enforces specific order in nutrition keys and adds reorder script #1203

Merged
merged 14 commits into from
Aug 26, 2024
36 changes: 36 additions & 0 deletions scripts/reorder_json_keys.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,20 @@
from recipe_scrapers._utils import get_abstract_methods

KEYS = get_abstract_methods()
NUTRITION_KEYS_ORDER = [
"servingSize",
"calories",
"fatContent",
"saturatedFatContent",
"unsaturatedFatContent",
"transFatContent",
"carbohydrateContent",
"sugarContent",
"proteinContent",
"sodiumContent",
"fiberContent",
"cholesterolContent",
]
jknndy marked this conversation as resolved.
Show resolved Hide resolved


def reorder_json_keys(file_path):
Expand All @@ -19,12 +33,34 @@ def reorder_json_keys(file_path):
file.write("\n")


def reorder_nutrition_keys(file_path):
with open(file_path, encoding="utf-8") as file:
data = json.load(file)

if "nutrients" in data and data["nutrients"] is not None:
nutrients = data["nutrients"]
reordered_nutrients = {
key: nutrients[key] for key in NUTRITION_KEYS_ORDER if key in nutrients
}
for key in nutrients:
if key not in reordered_nutrients:
reordered_nutrients[key] = nutrients[key]

if list(nutrients.keys()) != list(reordered_nutrients.keys()):
data["nutrients"] = reordered_nutrients
with open(file_path, "w", encoding="utf-8") as file:
print(f"Re-ordering nutrition keys for: {file_path}")
json.dump(data, file, indent=2, ensure_ascii=False)
file.write("\n")


def process_directory(directory):
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(".json"):
file_path = os.path.join(root, file)
reorder_json_keys(file_path)
reorder_nutrition_keys(file_path)
jknndy marked this conversation as resolved.
Show resolved Hide resolved


if __name__ == "__main__":
Expand Down
55 changes: 55 additions & 0 deletions tests/library/test_nutrition_order.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import json
import os
import unittest


class TestNutritionKeyOrder(unittest.TestCase):

def test_nutrition_key_order(self):
correct_order = [
"servingSize",
"calories",
"fatContent",
"saturatedFatContent",
"unsaturatedFatContent",
"transFatContent",
"carbohydrateContent",
"sugarContent",
"proteinContent",
"sodiumContent",
"fiberContent",
"cholesterolContent",
]
json_directory = "tests/test_data/"

for root, dirs, files in os.walk(json_directory):
for filename in files:
if filename.endswith(".json"):
with open(os.path.join(root, filename), encoding="utf-8") as f:
data = json.load(f)

if "nutrients" in data and data["nutrients"] is not None:
nutrients = data["nutrients"]
actual_keys = list(nutrients.keys())

ordered_keys = [
key for key in correct_order if key in actual_keys
]
other_keys = [
key for key in actual_keys if key not in correct_order
]

expected_keys = ordered_keys + other_keys

try:
self.assertEqual(expected_keys, actual_keys)
except AssertionError as e:
recommend_reorder_helper = (
"\n\nTo automatically reorder the nutrition keys, run the following command:\n"
"python scripts/reorder_json_keys.py\n"
)
raise AssertionError(
f"File: {os.path.join(root, filename)}\n"
f"{str(e)}"
f"{recommend_reorder_helper}"
) from e
12 changes: 6 additions & 6 deletions tests/test_data/101cookbooks.com/onehundredonecookbooks.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,16 @@
"ratings": 5.0,
"ratings_count": 5,
"nutrients": {
"servingSize": "1 serving",
"calories": "143 kcal",
"carbohydrateContent": "9 g",
"proteinContent": "4 g",
"fatContent": "12 g",
"saturatedFatContent": "10 g",
"sodiumContent": "629 mg",
"fiberContent": "3 g",
"sugarContent": "2 g",
"unsaturatedFatContent": "2 g",
"servingSize": "1 serving"
"carbohydrateContent": "9 g",
"sugarContent": "2 g",
"proteinContent": "4 g",
"sodiumContent": "629 mg",
"fiberContent": "3 g"
},
"image": "https://images.101cookbooks.com/coconut_broccoli_soup.jpg?w=1200&auto=format",
"keywords": [
Expand Down
16 changes: 8 additions & 8 deletions tests/test_data/aberlehome.com/aberlehome.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,18 +58,18 @@
"ratings": 4.8,
"ratings_count": 54,
"nutrients": {
"servingSize": "1",
"calories": "288 calories",
"carbohydrateContent": "52 grams carbohydrates",
"cholesterolContent": "29 milligrams cholesterol",
"fatContent": "5 grams fat",
"fiberContent": "2 grams fiber",
"proteinContent": "9 grams protein",
"saturatedFatContent": "2 grams saturated fat",
"servingSize": "1",
"sodiumContent": "436 milligrams sodium",
"sugarContent": "6 grams sugar",
"unsaturatedFatContent": "2 grams unsaturated fat",
"transFatContent": "0 grams trans fat",
"unsaturatedFatContent": "2 grams unsaturated fat"
"carbohydrateContent": "52 grams carbohydrates",
"sugarContent": "6 grams sugar",
"proteinContent": "9 grams protein",
"sodiumContent": "436 milligrams sodium",
"fiberContent": "2 grams fiber",
"cholesterolContent": "29 milligrams cholesterol"
},
"image": "https://aberlehome.com/wp-content/uploads/2021/07/sourdough-croissants-021-480x480.jpg",
"keywords": [
Expand Down
6 changes: 3 additions & 3 deletions tests/test_data/acouplecooks.com/acouplecooks.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@
"cooking_method": "Stovetop",
"nutrients": {
"calories": "176 calories",
"sugarContent": "0 g",
"sodiumContent": "427.1 mg",
"fatContent": "9.2 g",
"saturatedFatContent": "5.5 g",
"transFatContent": "0 g",
"carbohydrateContent": "0.8 g",
"fiberContent": "0 g",
"sugarContent": "0 g",
"proteinContent": "23 g",
"sodiumContent": "427.1 mg",
"fiberContent": "0 g",
"cholesterolContent": "205.4 mg"
},
"image": "https://www.acouplecooks.com/wp-content/uploads/2019/05/Garlic-Butter-Shrimp-022-225x225.jpg",
Expand Down
10 changes: 5 additions & 5 deletions tests/test_data/addapinch.com/addapinch_1.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,16 @@
"ratings": 5.0,
"ratings_count": 4164,
"nutrients": {
"servingSize": "1 serving",
"calories": "124 kcal",
"carbohydrateContent": "27 g",
"proteinContent": "3 g",
"fatContent": "1 g",
"saturatedFatContent": "1 g",
"cholesterolContent": "15 mg",
"carbohydrateContent": "27 g",
"sugarContent": "17 g",
"proteinContent": "3 g",
"sodiumContent": "178 mg",
"fiberContent": "1 g",
"sugarContent": "17 g",
"servingSize": "1 serving"
"cholesterolContent": "15 mg"
},
"image": "https://addapinch.com/wp-content/uploads/2020/04/chocolate-cake-DSC_1768.jpg",
"keywords": [
Expand Down
12 changes: 6 additions & 6 deletions tests/test_data/addapinch.com/addapinch_2.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,18 +69,18 @@
"Grater/ Zester"
],
"nutrients": {
"servingSize": "1 serving",
"calories": "361 kcal",
"carbohydrateContent": "56 g",
"proteinContent": "5 g",
"fatContent": "14 g",
"saturatedFatContent": "8 g",
"unsaturatedFatContent": "4 g",
"transFatContent": "1 g",
"cholesterolContent": "36 mg",
"carbohydrateContent": "56 g",
"sugarContent": "31 g",
"proteinContent": "5 g",
"sodiumContent": "272 mg",
"fiberContent": "1 g",
"sugarContent": "31 g",
"unsaturatedFatContent": "4 g",
"servingSize": "1 serving"
"cholesterolContent": "36 mg"
},
"image": "https://addapinch.com/wp-content/uploads/2015/03/citrus-scones-recipe-DSC_12521-2.jpg",
"keywords": [
Expand Down
4 changes: 2 additions & 2 deletions tests/test_data/aflavorjournal.com/aflavorjournal_1.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@
"1 Mini Food Processor optional: for a very smooth ranch (see notes)"
],
"nutrients": {
"calories": "107 kcal",
"servingSize": "2 tbsp."
"servingSize": "2 tbsp.",
"calories": "107 kcal"
},
"image": "https://aflavorjournal.com/wp-content/uploads/2022/06/Small-Batch-Ranch-Dressing-Featured.jpg",
"keywords": [
Expand Down
10 changes: 5 additions & 5 deletions tests/test_data/aflavorjournal.com/aflavorjournal_2.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,16 +96,16 @@
"nutrients": {
"servingSize": "1 salad",
"calories": "665 kcal",
"carbohydrateContent": "16 g",
"proteinContent": "49 g",
"fatContent": "46 g",
"saturatedFatContent": "8 g",
"unsaturatedFatContent": "35 g",
"transFatContent": "0.04 g",
"cholesterolContent": "113 mg",
"carbohydrateContent": "16 g",
"sugarContent": "5 g",
"proteinContent": "49 g",
"sodiumContent": "1347 mg",
"fiberContent": "9 g",
"sugarContent": "5 g",
"unsaturatedFatContent": "35 g"
"cholesterolContent": "113 mg"
},
"image": "https://aflavorjournal.com/wp-content/uploads/2024/02/Salmon-Kale-Salad-Ftd.jpg",
"keywords": [
Expand Down
12 changes: 6 additions & 6 deletions tests/test_data/allrecipes.com/allrecipescurated.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@
"ratings_count": 489,
"nutrients": {
"calories": "551 kcal",
"carbohydrateContent": "54 g",
"cholesterolContent": "58 mg",
"fatContent": "26 g",
"fiberContent": "3 g",
"proteinContent": "29 g",
"saturatedFatContent": "11 g",
"sodiumContent": "1183 mg",
"unsaturatedFatContent": "0 g",
"carbohydrateContent": "54 g",
"sugarContent": "5 g",
"unsaturatedFatContent": "0 g"
"proteinContent": "29 g",
"sodiumContent": "1183 mg",
"fiberContent": "3 g",
"cholesterolContent": "58 mg"
},
"image": "https://www.allrecipes.com/thmb/dA8YLuNy2HMa9s-tSTiFYjPdXy0=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/5225433-four-cheese-margherita-pizza-Christina-4x3-1-29b0fe4316b74017a5ae437e9ebb319d.jpg"
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,14 @@
"ratings_count": 1,
"nutrients": {
"calories": "412 calories",
"sugarContent": "11.6 g",
"sodiumContent": "1172.4 mg",
"fatContent": "25.2 g",
"saturatedFatContent": "14.8 g",
"transFatContent": "0.1 g",
"carbohydrateContent": "37.9 g",
"fiberContent": "2 g",
"sugarContent": "11.6 g",
"proteinContent": "9.7 g",
"sodiumContent": "1172.4 mg",
"fiberContent": "2 g",
"cholesterolContent": "111.3 mg"
},
"image": "https://allthehealthythings.com/wp-content/uploads/2023/08/Jalapeno-Cheddar-Skillet-Cornbread-with-Whipped-Hot-Honey-Butter-6-scaled-225x225.jpg",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@
"ratings_count": 1,
"nutrients": {
"calories": "299 calories",
"sugarContent": "37.4 g",
"sodiumContent": "52.8 mg",
"fatContent": "7.8 g",
"saturatedFatContent": "3.5 g",
"transFatContent": "0 g",
"carbohydrateContent": "45.5 g",
"fiberContent": "3.9 g",
"sugarContent": "37.4 g",
"proteinContent": "14.7 g",
"sodiumContent": "52.8 mg",
"fiberContent": "3.9 g",
"cholesterolContent": "18.5 mg"
},
"image": "https://allthehealthythings.com/wp-content/uploads/2021/06/triple-berry-smoothie-4-1-225x225.jpg",
Expand Down
4 changes: 2 additions & 2 deletions tests/test_data/ambitiouskitchen.com/ambitiouskitchen.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@
"fatContent": "12.1 g",
"saturatedFatContent": "5.3 g",
"carbohydrateContent": "31.3 g",
"fiberContent": "4.4 g",
"sugarContent": "4 g",
"proteinContent": "19.1 g"
"proteinContent": "19.1 g",
"fiberContent": "4.4 g"
},
"image": "https://www.ambitiouskitchen.com/wp-content/uploads/2019/10/Vegetarian-Spinach-Pumpkin-Lasagna-5sq.jpg",
"keywords": [
Expand Down
6 changes: 3 additions & 3 deletions tests/test_data/arla.se/arla_1.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,11 @@
"ratings": 4.2,
"ratings_count": 13,
"nutrients": {
"type": "NutritionInformation",
"calories": "920 kcal",
"carbohydrateContent": "49 g",
"fatContent": "61 g",
"proteinContent": "43 g"
"carbohydrateContent": "49 g",
"proteinContent": "43 g",
"type": "NutritionInformation"
},
"image": "https://images.arla.com/recordid/FB2425A1-47CE-4EFB-8D47570F80762F18/reuben-sandwich.jpg?format=jpg&width=1300&height=525",
"keywords": [
Expand Down
6 changes: 3 additions & 3 deletions tests/test_data/arla.se/arla_2.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,11 @@
"ratings": 3.5,
"ratings_count": 205,
"nutrients": {
"type": "NutritionInformation",
"calories": "470 kcal",
"carbohydrateContent": "55 g",
"fatContent": "26 g",
"proteinContent": "4 g"
"carbohydrateContent": "55 g",
"proteinContent": "4 g",
"type": "NutritionInformation"
},
"image": "https://cdn-rdb.arla.com/Files/arla-se/1800291189/1765383d-98b9-4a7e-b6cb-a4a0d6bcbdbc.jpg?w=1300&h=525&mode=crop&ak=f525e733&hm=697c0698",
"keywords": [
Expand Down
16 changes: 8 additions & 8 deletions tests/test_data/averiecooks.com/averiecooks.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,18 @@
"ratings": 5.0,
"ratings_count": 13,
"nutrients": {
"servingSize": "1",
"calories": "4245 calories",
"carbohydrateContent": "812 grams carbohydrates",
"cholesterolContent": "17 milligrams cholesterol",
"fatContent": "20 grams fat",
"fiberContent": "4 grams fiber",
"proteinContent": "34 grams protein",
"saturatedFatContent": "8 grams saturated fat",
"servingSize": "1",
"sodiumContent": "1160 milligrams sodium",
"sugarContent": "717 grams sugar",
"unsaturatedFatContent": "12 grams unsaturated fat",
"transFatContent": "0 grams trans fat",
"unsaturatedFatContent": "12 grams unsaturated fat"
"carbohydrateContent": "812 grams carbohydrates",
"sugarContent": "717 grams sugar",
"proteinContent": "34 grams protein",
"sodiumContent": "1160 milligrams sodium",
"fiberContent": "4 grams fiber",
"cholesterolContent": "17 milligrams cholesterol"
},
"image": "https://www.averiecooks.com/wp-content/uploads/2020/07/watermelonsalad-5-480x480.jpg",
"keywords": [
Expand Down
Loading
Loading