From 8d313e2e2a9d7225b53e44709ef380800b4780ab Mon Sep 17 00:00:00 2001 From: JanHranicky Date: Wed, 6 Aug 2025 15:42:43 +0200 Subject: [PATCH 1/5] extended status param to an array of statuses --- .../resource_clients/run_collection.py | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/apify_client/clients/resource_clients/run_collection.py b/src/apify_client/clients/resource_clients/run_collection.py index 0e314c91..3cec5fcc 100644 --- a/src/apify_client/clients/resource_clients/run_collection.py +++ b/src/apify_client/clients/resource_clients/run_collection.py @@ -26,7 +26,7 @@ def list( limit: int | None = None, offset: int | None = None, desc: bool | None = None, - status: ActorJobStatus | None = None, + status: ActorJobStatus | list[ActorJobStatus] | None = None, ) -> ListPage[dict]: """List all Actor runs. @@ -40,16 +40,21 @@ def list( limit: How many runs to retrieve. offset: What run to include as first when retrieving the list. desc: Whether to sort the runs in descending order based on their start date. - status: Retrieve only runs with the provided status. + status: Retrieve only runs with the provided statuses. Returns: The retrieved Actor runs. """ + if isinstance(status,list): + status_param = [maybe_extract_enum_member_value(s) for s in status] + else: + status_param = maybe_extract_enum_member_value(status) + return self._list( limit=limit, offset=offset, desc=desc, - status=maybe_extract_enum_member_value(status), + status=status_param, ) @@ -67,7 +72,7 @@ async def list( limit: int | None = None, offset: int | None = None, desc: bool | None = None, - status: ActorJobStatus | None = None, + status: ActorJobStatus | list[ActorJobStatus] | None = None, ) -> ListPage[dict]: """List all Actor runs. @@ -86,9 +91,14 @@ async def list( Returns: The retrieved Actor runs. """ + if isinstance(status,list): + status_param = [maybe_extract_enum_member_value(s) for s in status] + else: + status_param = maybe_extract_enum_member_value(status) + return await self._list( limit=limit, offset=offset, desc=desc, - status=maybe_extract_enum_member_value(status), + status=status_param, ) From 0825c00d5b72c7a79957f9ca0830070ea687712c Mon Sep 17 00:00:00 2001 From: JanHranicky Date: Wed, 6 Aug 2025 16:13:12 +0200 Subject: [PATCH 2/5] added TestRunCollectionSync tests --- tests/integration/test_run_collection.py | 49 ++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 tests/integration/test_run_collection.py diff --git a/tests/integration/test_run_collection.py b/tests/integration/test_run_collection.py new file mode 100644 index 00000000..7bdfa926 --- /dev/null +++ b/tests/integration/test_run_collection.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest + +if TYPE_CHECKING: + from apify_client import ApifyClient + +from apify_shared.consts import ActorJobStatus + +pytestmark = pytest.mark.integration + +class TestRunCollectionSync: + APIFY_HELLO_WORLD_ACTOR = 'apify/hello-world' + created_runs: list[dict] + + def setup_runs(self, apify_client: ApifyClient) -> None: + self.created_runs = [] + self.created_runs.append(apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).call()) + + self.created_runs.append(apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).call(timeout_secs=1)) + + def teadown_runs(self,apify_client: ApifyClient) -> None: + for run in self.created_runs: + apify_client.run(run.get('id')).delete() + + async def test_run_collection_list_multiple_statuses(self,apify_client: ApifyClient) -> None: + self.setup_runs(apify_client) + + run_collection = apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).runs() + + multiple_status_runs = run_collection.list(status=[ActorJobStatus.SUCCEEDED, ActorJobStatus.TIMED_OUT]) + single_status_runs = run_collection.list(status=ActorJobStatus.SUCCEEDED) + + assert multiple_status_runs is not None + assert single_status_runs is not None + + assert hasattr(multiple_status_runs, 'items') + assert hasattr(single_status_runs, 'items') + + assert all( + run.get('status') in [ActorJobStatus.SUCCEEDED, ActorJobStatus.TIMED_OUT] + for run in multiple_status_runs.items + ) + assert all(run.get('status') == ActorJobStatus.SUCCEEDED for run in single_status_runs.items) + + self.teadown_runs(apify_client) + From 18bc4431cde603e3c9de8255d3db093ea73dff2d Mon Sep 17 00:00:00 2001 From: JanHranicky Date: Wed, 6 Aug 2025 16:47:07 +0200 Subject: [PATCH 3/5] synced docustrings --- src/apify_client/clients/resource_clients/run_collection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apify_client/clients/resource_clients/run_collection.py b/src/apify_client/clients/resource_clients/run_collection.py index 3cec5fcc..085f1695 100644 --- a/src/apify_client/clients/resource_clients/run_collection.py +++ b/src/apify_client/clients/resource_clients/run_collection.py @@ -86,7 +86,7 @@ async def list( limit: How many runs to retrieve. offset: What run to include as first when retrieving the list. desc: Whether to sort the runs in descending order based on their start date. - status: Retrieve only runs with the provided status. + status: Retrieve only runs with the provided statuses. Returns: The retrieved Actor runs. From 6f93871ce86f95e84bc7657f654e424d6021fc5f Mon Sep 17 00:00:00 2001 From: JanHranicky Date: Wed, 6 Aug 2025 16:49:49 +0200 Subject: [PATCH 4/5] formatted code --- .../clients/resource_clients/run_collection.py | 4 ++-- tests/integration/test_run_collection.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apify_client/clients/resource_clients/run_collection.py b/src/apify_client/clients/resource_clients/run_collection.py index 085f1695..41f9634d 100644 --- a/src/apify_client/clients/resource_clients/run_collection.py +++ b/src/apify_client/clients/resource_clients/run_collection.py @@ -45,7 +45,7 @@ def list( Returns: The retrieved Actor runs. """ - if isinstance(status,list): + if isinstance(status, list): status_param = [maybe_extract_enum_member_value(s) for s in status] else: status_param = maybe_extract_enum_member_value(status) @@ -91,7 +91,7 @@ async def list( Returns: The retrieved Actor runs. """ - if isinstance(status,list): + if isinstance(status, list): status_param = [maybe_extract_enum_member_value(s) for s in status] else: status_param = maybe_extract_enum_member_value(status) diff --git a/tests/integration/test_run_collection.py b/tests/integration/test_run_collection.py index 7bdfa926..e53c2c74 100644 --- a/tests/integration/test_run_collection.py +++ b/tests/integration/test_run_collection.py @@ -11,6 +11,7 @@ pytestmark = pytest.mark.integration + class TestRunCollectionSync: APIFY_HELLO_WORLD_ACTOR = 'apify/hello-world' created_runs: list[dict] @@ -21,11 +22,11 @@ def setup_runs(self, apify_client: ApifyClient) -> None: self.created_runs.append(apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).call(timeout_secs=1)) - def teadown_runs(self,apify_client: ApifyClient) -> None: + def teadown_runs(self, apify_client: ApifyClient) -> None: for run in self.created_runs: apify_client.run(run.get('id')).delete() - async def test_run_collection_list_multiple_statuses(self,apify_client: ApifyClient) -> None: + async def test_run_collection_list_multiple_statuses(self, apify_client: ApifyClient) -> None: self.setup_runs(apify_client) run_collection = apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).runs() @@ -42,8 +43,7 @@ async def test_run_collection_list_multiple_statuses(self,apify_client: ApifyCli assert all( run.get('status') in [ActorJobStatus.SUCCEEDED, ActorJobStatus.TIMED_OUT] for run in multiple_status_runs.items - ) + ) assert all(run.get('status') == ActorJobStatus.SUCCEEDED for run in single_status_runs.items) self.teadown_runs(apify_client) - From 3f6917a7cfdc9fcdfab1919cf291132f18d3d8da Mon Sep 17 00:00:00 2001 From: JanHranicky Date: Wed, 6 Aug 2025 17:02:02 +0200 Subject: [PATCH 5/5] fixed type-check errors --- tests/integration/test_run_collection.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/integration/test_run_collection.py b/tests/integration/test_run_collection.py index e53c2c74..3d1be6cd 100644 --- a/tests/integration/test_run_collection.py +++ b/tests/integration/test_run_collection.py @@ -18,13 +18,20 @@ class TestRunCollectionSync: def setup_runs(self, apify_client: ApifyClient) -> None: self.created_runs = [] - self.created_runs.append(apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).call()) - self.created_runs.append(apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).call(timeout_secs=1)) + successfull_run = apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).call() + if successfull_run is not None: + self.created_runs.append(successfull_run) + + timed_out_run = apify_client.actor(self.APIFY_HELLO_WORLD_ACTOR).call(timeout_secs=1) + if timed_out_run is not None: + self.created_runs.append(timed_out_run) def teadown_runs(self, apify_client: ApifyClient) -> None: for run in self.created_runs: - apify_client.run(run.get('id')).delete() + run_id = run.get('id') + if isinstance(run_id, str): + apify_client.run(run_id).delete() async def test_run_collection_list_multiple_statuses(self, apify_client: ApifyClient) -> None: self.setup_runs(apify_client)