1
1
import json
2
2
import re
3
+ from typing import List , Dict , Any , Optional
3
4
4
5
# prefix components:
5
6
space = " "
11
12
IMAGE_SIZES = ["small" , "medium" , "regular" , "large" , "extra-large" ]
12
13
IMAGE_BASE_URL = "https://storefront-prod.nl.picnicinternational.com/static/images"
13
14
15
+ SOLE_ARTICLE_ID_PATTERN = re .compile (r"sole_article_id=([0-9]+)" )
16
+
17
+
14
18
def _tree_generator (response : list , prefix : str = "" ):
15
19
"""A recursive tree generator,
16
20
will yield a visual tree structure line by line
@@ -38,8 +42,8 @@ def _url_generator(url: str, country_code: str, api_version: str):
38
42
return url .format (country_code .lower (), api_version )
39
43
40
44
41
- def _get_category_id_from_link (category_link : str ) -> str :
42
- pattern = r' categories/(\d+)'
45
+ def _get_category_id_from_link (category_link : str ) -> Optional [ str ] :
46
+ pattern = r" categories/(\d+)"
43
47
first_number = re .search (pattern , category_link )
44
48
if first_number :
45
49
result = str (first_number .group (1 ))
@@ -48,55 +52,54 @@ def _get_category_id_from_link(category_link: str) -> str:
48
52
return None
49
53
50
54
51
- def _get_category_name (category_link : str , categories : list ) -> str :
55
+ def _get_category_name (category_link : str , categories : list ) -> Optional [ str ] :
52
56
category_id = _get_category_id_from_link (category_link )
53
57
if category_id :
54
- category = next ((item for item in categories if item ["id" ] == category_id ), None )
58
+ category = next (
59
+ (item for item in categories if item ["id" ] == category_id ), None
60
+ )
55
61
if category :
56
62
return category ["name" ]
57
63
else :
58
64
return None
59
65
else :
60
66
return None
61
67
68
+
62
69
def get_recipe_image (id : str , size = "regular" ):
63
70
sizes = IMAGE_SIZES + ["1250x1250" ]
64
71
assert size in sizes , "size must be one of: " + ", " .join (sizes )
65
72
return f"{ IMAGE_BASE_URL } /recipes/{ id } /{ size } .png"
66
73
67
74
68
75
def get_image (id : str , size = "regular" , suffix = "webp" ):
69
- assert "tile" in size if suffix == "webp" else True , (
70
- "webp format only supports tile sizes"
71
- )
76
+ assert (
77
+ "tile" in size if suffix == "webp" else True
78
+ ), "webp format only supports tile sizes"
72
79
assert suffix in ["webp" , "png" ], "suffix must be webp or png"
73
80
sizes = IMAGE_SIZES + [f"tile-{ size } " for size in IMAGE_SIZES ]
74
81
75
- assert size in sizes , (
76
- "size must be one of: " + ", " .join (sizes )
77
- )
82
+ assert size in sizes , "size must be one of: " + ", " .join (sizes )
78
83
return f"{ IMAGE_BASE_URL } /{ id } /{ size } .{ suffix } "
79
84
80
85
81
- def _extract_search_results (raw_results : dict ) -> list :
86
+ def _extract_search_results (raw_results : Dict [str , Any ]) -> List [Dict [str , Any ]]:
87
+ """Extract search results from a nested dictionary structure returned by Picnic search."""
82
88
search_results = []
83
- sole_article_id_pattern = re .compile (r"sole_article_id=([0-9]+)" )
84
-
85
- # Iterate over the nested structure of raw_results
86
- for child1 in raw_results .get ("body" , {}).get ("children" , []):
87
- for child2 in child1 .get ("children" , []):
88
- content = child2 .get ("content" )
89
- if content and "selling_unit" in content :
90
- # Extracting the sole_article_id from the serialized JSON of pml
91
- sole_article_ids = sole_article_id_pattern .findall (
92
- json .dumps (child2 .get ("pml" , {}))
89
+
90
+ for section in raw_results .get ("body" , {}).get ("children" , []):
91
+ for item in section .get ("children" , []):
92
+ content = item .get ("content" , {})
93
+ if "selling_unit" in content :
94
+ sole_article_ids = SOLE_ARTICLE_ID_PATTERN .findall (
95
+ json .dumps (item .get ("pml" , {}))
93
96
)
94
- if sole_article_ids :
95
- sole_article_id = sole_article_ids [ 0 ]
96
- # Create and append the result entry
97
- result_entry = {
98
- ** content [ "selling_unit" ] ,
99
- "sole_article_id" : sole_article_id ,
100
- }
101
- search_results . append ( result_entry )
97
+ sole_article_id = sole_article_ids [ 0 ] if sole_article_ids else None
98
+
99
+ result_entry = {
100
+ ** content [ "selling_unit" ],
101
+ "sole_article_id" : sole_article_id ,
102
+ }
103
+ search_results . append ( result_entry )
104
+
102
105
return search_results
0 commit comments