apify-client-python
apify-client-python copied to clipboard
fix: aborting of last Actor/task run
Problem description
Aborting the last Actor run does not work
- Resulting in:
apify_client._errors.ApifyApiError: We have bad news: there is no API endpoint at this URL.
Did you specify it correctly?
- Code to reproduce it:
# sync version
from apify_client import ApifyClient
TOKEN = '...'
ACTOR_ID = '...'
def actor_run_abort(apify_client: ApifyClient, actor_id: str) -> None:
actor_client = apify_client.actor(actor_id)
actor_client.call(wait_secs=1)
last_run = actor_client.last_run(status='RUNNING', origin='API')
aborted_info = last_run.abort()
print(f'aborted_info: {aborted_info}')
if __name__ == '__main__':
apify_client = ApifyClient(TOKEN)
actor_run_abort(apify_client, ACTOR_ID)
# async version
import asyncio
from apify_client import ApifyClientAsync
TOKEN = '...'
ACTOR_ID = '...'
async def actor_run_abort_async(apify_client: ApifyClientAsync, actor_id: str) -> None:
actor_client = apify_client.actor(actor_id)
await actor_client.call(wait_secs=1)
last_run = await actor_client.last_run(status='RUNNING', origin='API')
aborted_info = await last_run.abort()
print(f'aborted_info: {aborted_info}')
if __name__ == '__main__':
apify_client = ApifyClientAsync(TOKEN)
asyncio.run(actor_run_abort_async(apify_client, ACTOR_ID))
Aborting of the last task run does not work
- Resulting in:
apify_client._errors.ApifyApiError: We have bad news: there is no API endpoint at this URL.
Did you specify it correctly?
- Code to reproduce it:
# sync version
from apify_client import ApifyClient
TOKEN = '...'
TASK_ID = '...'
def task_run_abort(apify_client: ApifyClient, task_id: str) -> None:
task_client = apify_client.task(task_id)
task_client.call(wait_secs=1)
last_run = task_client.last_run(status='RUNNING', origin='API')
aborted_info = last_run.abort()
print(f'aborted_info: {aborted_info}')
if __name__ == '__main__':
apify_client = ApifyClient(TOKEN)
task_run_abort(apify_client, TASK_ID)
# async version
import asyncio
from apify_client import ApifyClientAsync
TOKEN = '...'
TASK_ID = '...'
async def task_run_abort_async(apify_client: ApifyClientAsync, task_id: str) -> None:
task_client = apify_client.task(task_id)
await task_client.call(wait_secs=1)
last_run = await task_client.last_run(status='RUNNING', origin='API')
aborted_info = await last_run.abort()
print(f'aborted_info: {aborted_info}')
if __name__ == '__main__':
apify_client = ApifyClientAsync(TOKEN)
asyncio.run(task_run_abort_async(apify_client, TASK_ID))
Related issues
- The aborting of the last task run was reported in https://github.com/apify/apify-client-python/issues/190. The aborting of the last Actor run does not work as well as was described above.
Solution
- Using additional API call to be able to call
https://api.apify.com/v2/acts/{actorId}/runs/{runId}/abort
in both cases. - In the async version it results in
last_run
method beingasync
(should not be released as patch version). - Copied from source code (Actor run):
# 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
- Copied from source code (task run):
# 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
Testing
- As we do not have a proper testing framework here, it was tested just manually with the code examples provided at the beginning.