Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
# Changelog

## [1.6.5](../../releases/tag/v1.6.5) - Not released yet
## [1.7.0](../../releases/tag/v1.7.0) - Not released yet
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why a feature release when you only have fixes in it?

Copy link
Contributor Author

@vdusek vdusek May 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From PR description:

In the async version it results in last_run method being async (should not be released as patch version).

So, since we are making additional requests, the last_run method must be made async. This change is technically breaking, although the original implementation was broken. Therefore, I have released it as a new minor version. This means it will not be updated automatically if you are using a tilde pin like apify-client~=1.6.0.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, then please mention it in the changelog too. I would still go with a patch release personally, especially since it was broken before anyway, but it's not a huge deal. I don't know how common it is to lock versions via ~, but I am quite sure people do not do that to get around breaking changes.


...
### Fixed

- fix abort of last task run
- fix abort of last Actor run

## [1.6.4](../../releases/tag/v1.6.4) - 2024-02-27

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "apify_client"
version = "1.6.5"
version = "1.7.0"
description = "Apify API client for Python"
readme = "README.md"
license = { text = "Apache Software License" }
Expand Down
48 changes: 45 additions & 3 deletions src/apify_client/clients/resource_clients/actor.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,13 @@ def last_run(
Returns:
RunClient: The resource client for the last run of this actor.
"""
return RunClient(
# Note:
# The API does not provide a direct endpoint for aborting the last Actor run using a URL like:
# https://api.apify.com/v2/acts/{actor_id}/runs/last/abort
# To achieve this, we need to implement a workaround using the following URL format:
# https://api.apify.com/v2/acts/{actorId}/runs/{runId}/abort

last_run_client = RunClient(
**self._sub_resource_init_options(
resource_id='last',
resource_path='runs',
Expand All @@ -355,6 +361,21 @@ def last_run(
)
)

last_run_client_info = last_run_client.get()
actor_id = last_run_client_info['actId'] # type: ignore
actor_run_id = last_run_client_info['id'] # type: ignore

return RunClient(
**self._sub_resource_init_options(
base_url='https://api.apify.com/v2',
resource_path=f'acts/{actor_id}/runs/{actor_run_id}',
params=self._params(
status=maybe_extract_enum_member_value(status),
origin=maybe_extract_enum_member_value(origin),
),
)
)

def versions(self: ActorClient) -> ActorVersionCollectionClient:
"""Retrieve a client for the versions of this actor."""
return ActorVersionCollectionClient(**self._sub_resource_init_options())
Expand Down Expand Up @@ -634,7 +655,7 @@ def runs(self: ActorClientAsync) -> RunCollectionClientAsync:
"""Retrieve a client for the runs of this actor."""
return RunCollectionClientAsync(**self._sub_resource_init_options(resource_path='runs'))

def last_run(self: ActorClientAsync, *, status: ActorJobStatus | None = None, origin: MetaOrigin | None = None) -> RunClientAsync:
async def last_run(self: ActorClientAsync, *, status: ActorJobStatus | None = None, origin: MetaOrigin | None = None) -> RunClientAsync:
"""Retrieve the client for the last run of this actor.

Last run is retrieved based on the start time of the runs.
Expand All @@ -646,7 +667,13 @@ def last_run(self: ActorClientAsync, *, status: ActorJobStatus | None = None, or
Returns:
RunClientAsync: The resource client for the last run of this actor.
"""
return RunClientAsync(
# Note:
# The API does not provide a direct endpoint for aborting the last Actor run using a URL like:
# https://api.apify.com/v2/acts/{actor_id}/runs/last/abort
# To achieve this, we need to implement a workaround using the following URL format:
# https://api.apify.com/v2/acts/{actorId}/runs/{runId}/abort

last_run_client = RunClientAsync(
**self._sub_resource_init_options(
resource_id='last',
resource_path='runs',
Expand All @@ -657,6 +684,21 @@ def last_run(self: ActorClientAsync, *, status: ActorJobStatus | None = None, or
)
)

last_run_client_info = await last_run_client.get()
actor_id = last_run_client_info['actId'] # type: ignore
actor_run_id = last_run_client_info['id'] # type: ignore

return RunClientAsync(
**self._sub_resource_init_options(
base_url='https://api.apify.com/v2',
resource_path=f'acts/{actor_id}/runs/{actor_run_id}',
params=self._params(
status=maybe_extract_enum_member_value(status),
origin=maybe_extract_enum_member_value(origin),
),
)
)

def versions(self: ActorClientAsync) -> ActorVersionCollectionClientAsync:
"""Retrieve a client for the versions of this actor."""
return ActorVersionCollectionClientAsync(**self._sub_resource_init_options())
Expand Down
48 changes: 45 additions & 3 deletions src/apify_client/clients/resource_clients/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,13 @@ def last_run(self: TaskClient, *, status: ActorJobStatus | None = None, origin:
Returns:
RunClient: The resource client for the last run of this task.
"""
return RunClient(
# Note:
# The API does not provide a direct endpoint for aborting the last task run using a URL like:
# https://api.apify.com/v2/actor-tasks/{task_id}/runs/last/abort
# To achieve this, we need to implement a workaround using the following URL format:
# https://api.apify.com/v2/acts/{actorId}/runs/{runId}/abort

last_run_client = RunClient(
**self._sub_resource_init_options(
resource_id='last',
resource_path='runs',
Expand All @@ -277,6 +283,21 @@ def last_run(self: TaskClient, *, status: ActorJobStatus | None = None, origin:
)
)

last_run_client_info = last_run_client.get()
actor_id = last_run_client_info['actId'] # type: ignore
actor_run_id = last_run_client_info['id'] # type: ignore

return RunClient(
**self._sub_resource_init_options(
base_url='https://api.apify.com/v2',
resource_path=f'acts/{actor_id}/runs/{actor_run_id}',
params=self._params(
status=maybe_extract_enum_member_value(status),
origin=maybe_extract_enum_member_value(origin),
),
)
)

def webhooks(self: TaskClient) -> WebhookCollectionClient:
"""Retrieve a client for webhooks associated with this task."""
return WebhookCollectionClient(**self._sub_resource_init_options())
Expand Down Expand Up @@ -491,7 +512,7 @@ def runs(self: TaskClientAsync) -> RunCollectionClientAsync:
"""Retrieve a client for the runs of this task."""
return RunCollectionClientAsync(**self._sub_resource_init_options(resource_path='runs'))

def last_run(self: TaskClientAsync, *, status: ActorJobStatus | None = None, origin: MetaOrigin | None = None) -> RunClientAsync:
async def last_run(self: TaskClientAsync, *, status: ActorJobStatus | None = None, origin: MetaOrigin | None = None) -> RunClientAsync:
"""Retrieve the client for the last run of this task.

Last run is retrieved based on the start time of the runs.
Expand All @@ -503,7 +524,13 @@ def last_run(self: TaskClientAsync, *, status: ActorJobStatus | None = None, ori
Returns:
RunClientAsync: The resource client for the last run of this task.
"""
return RunClientAsync(
# Note:
# The API does not provide a direct endpoint for aborting the last task run using a URL like:
# https://api.apify.com/v2/actor-tasks/{task_id}/runs/last/abort
# To achieve this, we need to implement a workaround using the following URL format:
# https://api.apify.com/v2/acts/{actorId}/runs/{runId}/abort

last_run_client = RunClientAsync(
**self._sub_resource_init_options(
resource_id='last',
resource_path='runs',
Expand All @@ -514,6 +541,21 @@ def last_run(self: TaskClientAsync, *, status: ActorJobStatus | None = None, ori
)
)

last_run_client_info = await last_run_client.get()
actor_id = last_run_client_info['actId'] # type: ignore
actor_run_id = last_run_client_info['id'] # type: ignore

return RunClientAsync(
**self._sub_resource_init_options(
base_url='https://api.apify.com/v2',
resource_path=f'acts/{actor_id}/runs/{actor_run_id}',
params=self._params(
status=maybe_extract_enum_member_value(status),
origin=maybe_extract_enum_member_value(origin),
),
)
)

def webhooks(self: TaskClientAsync) -> WebhookCollectionClientAsync:
"""Retrieve a client for webhooks associated with this task."""
return WebhookCollectionClientAsync(**self._sub_resource_init_options())