From f6970b90e812548b1df7e8e0b66fd7895eba3784 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Sun, 19 Jul 2026 09:10:03 +0200 Subject: [PATCH] fix(walmart): parse category breadcrumb path into breadCrumbs and category --- .../proprietary/platforms/walmart/parsers.py | 17 ++++++++++++++++- .../platforms/walmart/fixtures/product.html | 2 +- .../unit/platforms/walmart/test_parsers.py | 3 +++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/surfsense_backend/app/proprietary/platforms/walmart/parsers.py b/surfsense_backend/app/proprietary/platforms/walmart/parsers.py index 9a0d070a1..5ea32c4d1 100644 --- a/surfsense_backend/app/proprietary/platforms/walmart/parsers.py +++ b/surfsense_backend/app/proprietary/platforms/walmart/parsers.py @@ -122,6 +122,19 @@ def _images(image_info: dict[str, Any]) -> list[str]: return images +def _breadcrumbs(product: dict[str, Any]) -> list[str]: + """Category breadcrumb names, root→leaf. + + Walmart ships ``category.path`` as a list of ``{name, url}`` nodes, e.g. + ``[{"name": "Home Improvement"}, ..., {"name": "Air Conditioners"}]`` — not + a string. + """ + path = dig(product, "category", "path") + if not isinstance(path, list): + return [] + return [node["name"] for node in path if isinstance(node, dict) and node.get("name")] + + def _reviews_sample( reviews: dict[str, Any] | None, limit: int = 10 ) -> dict[str, Any] | None: @@ -151,6 +164,7 @@ def parse_product( price_info = product.get("priceInfo") or {} image_info = product.get("imageInfo") or {} availability = product.get("availabilityStatus") + breadcrumbs = _breadcrumbs(product) fields: dict[str, Any] = { "usItemId": str(product.get("usItemId") or product.get("id") or "") or None, @@ -172,7 +186,8 @@ def parse_product( else None, "thumbnailImage": image_info.get("thumbnailUrl"), "images": _images(image_info), - "category": dig(product, "category", "path"), + "category": breadcrumbs[-1] if breadcrumbs else None, + "breadCrumbs": breadcrumbs, "variants": product.get("variantCriteria") or [], } if include_reviews_sample: diff --git a/surfsense_backend/tests/unit/platforms/walmart/fixtures/product.html b/surfsense_backend/tests/unit/platforms/walmart/fixtures/product.html index 3db17b152..183ddff6b 100644 --- a/surfsense_backend/tests/unit/platforms/walmart/fixtures/product.html +++ b/surfsense_backend/tests/unit/platforms/walmart/fixtures/product.html @@ -1,3 +1,3 @@ Midea AC - + diff --git a/surfsense_backend/tests/unit/platforms/walmart/test_parsers.py b/surfsense_backend/tests/unit/platforms/walmart/test_parsers.py index da66064ab..596131a2e 100644 --- a/surfsense_backend/tests/unit/platforms/walmart/test_parsers.py +++ b/surfsense_backend/tests/unit/platforms/walmart/test_parsers.py @@ -35,6 +35,9 @@ def test_product_parser_extracts_core_fields_and_review_sample(): "https://i5.walmartimages.com/1.jpg", "https://i5.walmartimages.com/2.jpg", ] + # Walmart ships category.path as breadcrumb objects, not a string. + assert item["breadCrumbs"] == ["Home", "Air Conditioners"] + assert item["category"] == "Air Conditioners" assert item["reviewsSample"]["totalReviewCount"] == 6287 assert item["reviewsSample"]["topReviews"][0]["verifiedPurchase"] is True