diff --git a/src/apify_client/_resource_clients/dataset.py b/src/apify_client/_resource_clients/dataset.py index 1f772dde..7cb3b399 100644 --- a/src/apify_client/_resource_clients/dataset.py +++ b/src/apify_client/_resource_clients/dataset.py @@ -402,6 +402,7 @@ def stream_items( skip_hidden: bool | None = None, xml_root: str | None = None, xml_row: str | None = None, + flatten: list[str] | None = None, signature: str | None = None, timeout: Timeout = 'long', ) -> Iterator[HttpResponse]: @@ -445,6 +446,7 @@ def stream_items( xml_root: Overrides default root element name of xml output. By default the root element is items. xml_row: Overrides default element name that wraps each page or page function result object in xml output. By default the element name is item. + flatten: A list of fields that should be flattened. signature: Signature used to access the items. timeout: Timeout for the API HTTP request. @@ -469,6 +471,7 @@ def stream_items( skipHidden=skip_hidden, xmlRoot=xml_root, xmlRow=xml_row, + flatten=flatten, signature=signature, ) @@ -964,6 +967,7 @@ async def stream_items( skip_hidden: bool | None = None, xml_root: str | None = None, xml_row: str | None = None, + flatten: list[str] | None = None, signature: str | None = None, timeout: Timeout = 'long', ) -> AsyncIterator[HttpResponse]: @@ -1007,6 +1011,7 @@ async def stream_items( xml_root: Overrides default root element name of xml output. By default the root element is items. xml_row: Overrides default element name that wraps each page or page function result object in xml output. By default the element name is item. + flatten: A list of fields that should be flattened. signature: Signature used to access the items. timeout: Timeout for the API HTTP request. @@ -1031,6 +1036,7 @@ async def stream_items( skipHidden=skip_hidden, xmlRoot=xml_root, xmlRow=xml_row, + flatten=flatten, signature=signature, ) diff --git a/tests/unit/test_client_streaming.py b/tests/unit/test_client_streaming.py index 9e5782e7..811fda7d 100644 --- a/tests/unit/test_client_streaming.py +++ b/tests/unit/test_client_streaming.py @@ -53,6 +53,28 @@ async def test_dataset_stream_items_async( assert await response.aread() == STREAM_CONTENT +def test_dataset_stream_items_flatten_sync(httpserver: HTTPServer) -> None: + """`flatten` is sent as a comma-separated query parameter.""" + httpserver.expect_request( + f'/v2/datasets/{DATASET_ID}/items', query_string={'format': 'json', 'flatten': 'a,b.c'} + ).respond_with_data(STREAM_CONTENT) + client = ApifyClient(token='test', api_url=httpserver.url_for('/').removesuffix('/')) + + with client.dataset(DATASET_ID).stream_items(flatten=['a', 'b.c']) as response: + assert response.read() == STREAM_CONTENT + + +async def test_dataset_stream_items_flatten_async(httpserver: HTTPServer) -> None: + """`flatten` is sent as a comma-separated query parameter.""" + httpserver.expect_request( + f'/v2/datasets/{DATASET_ID}/items', query_string={'format': 'json', 'flatten': 'a,b.c'} + ).respond_with_data(STREAM_CONTENT) + client = ApifyClientAsync(token='test', api_url=httpserver.url_for('/').removesuffix('/')) + + async with client.dataset(DATASET_ID).stream_items(flatten=['a', 'b.c']) as response: + assert await response.aread() == STREAM_CONTENT + + def test_key_value_store_stream_record_sync( httpserver: HTTPServer, http_client_class: type[HttpClient],