Skip to content

Commit

Permalink
Merge pull request #102 from Gallaecio/auto-fields
Browse files Browse the repository at this point in the history
Prevent None.cast call
  • Loading branch information
kmike authored Aug 26, 2024
2 parents a926028 + d5a1d58 commit 8c606af
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
22 changes: 22 additions & 0 deletions tests/test_processors.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from typing import Type

import pytest
from lxml.html import fromstring
from parsel import Selector, SelectorList
Expand All @@ -16,12 +18,15 @@
Image,
ProductPage,
)
from zyte_common_items.components.metadata import Metadata
from zyte_common_items.items.product import ProductMetadata
from zyte_common_items.processors import (
_format_price,
brand_processor,
breadcrumbs_processor,
gtin_processor,
images_processor,
metadata_processor,
price_processor,
rating_processor,
)
Expand Down Expand Up @@ -415,3 +420,20 @@ def price(self):

page = PricePage(base_url) # type: ignore[arg-type]
assert page.price == expected_value


@pytest.mark.parametrize(
"input_value,BasePage,expected_value",
[
(None, ProductPage, None),
(Metadata(), ProductPage, ProductMetadata()),
],
)
def test_metadata(input_value, BasePage: Type, expected_value):
class CustomPage(BasePage):
@field(out=[metadata_processor])
def metadata(self):
return input_value

page = CustomPage(base_url) # type: ignore[arg-type]
assert page.metadata == expected_value
4 changes: 2 additions & 2 deletions zyte_common_items/processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -402,9 +402,9 @@ def probability_request_list_processor(
return [request.cast(ProbabilityRequest) for request in request_list]


def metadata_processor(metadata: BaseMetadata, page):
def metadata_processor(metadata: Optional[BaseMetadata], page):
"""Processor for a metadata field that ensures that the output metadata
object uses the metadata class declared by *page*."""
if page.metadata_cls is None:
if metadata is None or page.metadata_cls is None:
return None
return metadata.cast(page.metadata_cls)

0 comments on commit 8c606af

Please sign in to comment.