Beispiel #1
0
 def test_with_value_string(self):
     actual = parse_explicit_quantity(
         {
             "additionalProperties": [
                 {"key": "quantityString", "value": "0.5kr/kvm"},
             ]
         },
         {},
     )
     self.assertEqual(actual["value"]["size"]["amount"]["min"], 0.5)
Beispiel #2
0
 def test_with_value_and_unit(self):
     actual = parse_explicit_quantity(
         {
             "additionalProperties": [
                 {"key": "unitPrice", "value": "16"},
                 {"key": "unitPriceUnit", "value": "g"},
             ]
         },
         {},
     )
     self.assertEqual(actual["value"]["size"]["amount"]["min"], 16)
Beispiel #3
0
 def test_with_size_and_unit(self):
     actual = parse_explicit_quantity(
         {
             "additionalProperties": [
                 {"key": "quantityValue", "value": "4"},
                 {"key": "quantityUnit", "value": "l"},
             ]
         },
         {},
     )
     self.assertEqual(actual["quantity"]["size"]["amount"]["min"], 4)
def transform_product(offer: ScraperOffer, config: HandleConfig) -> MpnOffer:
    result: MpnOffer = {}
    # Still handle Shopgun offers a little differently..
    if "shopgun" in config["provenance"]:
        result = transform_shopgun_product(offer, config)
    else:
        # Start here for everything not Shopgun offer.
        offer = transform_fields(offer, config["fieldMapping"])
        result: MpnOffer = {}

        namespace = config["namespace"]
        provenanceId = get_provenance_id(offer)
        result["provenanceId"] = provenanceId
        result["href"] = offer["url"]
        result["ahref"] = offer.get("trackingUrl")

        result["uri"] = get_product_uri(namespace, provenanceId)
        result["pricing"] = get_product_pricing({**offer, **result})
        result["validThrough"] = time.one_week_ahead
        result["validFrom"] = time.time
        result["dealer"] = offer.get("dealer", namespace)
        result["gtins"] = get_gtins({**offer, **result})

        try:
            result["imageUrl"] = result["imageUrl"].replace(
                "http://", "https://")
        except Exception:
            pass

        # Handle quantity from scraper by parsing it like a string
        extra_quantity_string = " ".join(
            (str(offer[key])
             for key in ("rawQuantity", "quantityValue", "quantityUnit")
             if offer.get(key)), )

        parse_quantity_strings = list(
            get_field_from_scraper_offer(offer, key)
            for key in config["extractQuantityFields"])
        if extra_quantity_string:
            parse_quantity_strings.append(extra_quantity_string)

        safe_unit_list = ["l", "kg"
                          ] if "grocery" in config["collection_name"] else None

        parsed_quantity = parse_quantity(
            list(x for x in parse_quantity_strings if x), safe_unit_list)
        if config["ignore_none"]:
            for k, v in parsed_quantity.items():
                if remove_none_fields(v):
                    parsed_quantity[k] = v
                else:
                    parsed_quantity[k] = {}

        parsed_explicit_quantity = parse_explicit_quantity(offer, config)
        parsed_quantity = {
            **parsed_quantity,
            **parsed_explicit_quantity,
        }
        result["mpnStock"] = get_stock_status(offer)
        result["categories"] = get_categories(
            pydash.get(offer, "categories"),
            config["categoriesLimits"],
        )
        result = {**result, **parsed_quantity}

    result["market"] = config["market"]
    result["isPartner"] = config.get("is_partner", False)

    result = analyze_quantity(result)
    result = standardize_quantity(result)
    quantity = result.get("quantity")

    final_result = {**offer, **result, **quantity}

    if config["ignore_none"]:
        final_result = remove_none_fields(final_result)

    return final_result
Beispiel #5
0
 def test_with_item(self):
     actual = parse_explicit_quantity(jemogfix_item, {})
     self.assertEqual(actual["value"]["size"]["amount"]["min"], 22.9)
Beispiel #6
0
 def test_no_explicit_quantity_fields(self):
     self.assertDictEqual(parse_explicit_quantity({}, {}), {})