apify 2.5.1b10__tar.gz → 2.5.1b11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of apify might be problematic. Click here for more details.
- {apify-2.5.1b10 → apify-2.5.1b11}/CHANGELOG.md +4 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/PKG-INFO +1 -1
- {apify-2.5.1b10 → apify-2.5.1b11}/pyproject.toml +1 -1
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/_actor.py +39 -7
- apify-2.5.1b11/tests/integration/test_actor_call_timeouts.py +105 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/package-lock.json +3 -3
- {apify-2.5.1b10 → apify-2.5.1b11}/.editorconfig +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.github/CODEOWNERS +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.github/workflows/build_and_deploy_docs.yaml +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.github/workflows/check_pr_title.yaml +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.github/workflows/pre_release.yaml +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.github/workflows/release.yaml +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.github/workflows/run_code_checks.yaml +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.github/workflows/update_new_issue.yaml +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.gitignore +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.markdownlint.yaml +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/.pre-commit-config.yaml +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/CONTRIBUTING.md +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/LICENSE +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/Makefile +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/README.md +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/01_overview/01_introduction.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/01_overview/02_running_actors_locally.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/01_overview/03_actor_structure.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/01_overview/code/01_introduction.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/01_overview/code/actor_structure/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/01_overview/code/actor_structure/__main__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/01_overview/code/actor_structure/main.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/01_overview/code/actor_structure/py.typed +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/01_beautifulsoup_httpx.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/02_crawlee.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/03_playwright.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/04_selenium.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/05_scrapy.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/01_beautifulsoup_httpx.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/02_crawlee_beautifulsoup.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/02_crawlee_playwright.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/03_playwright.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/04_selenium.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/__main__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/items.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/main.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/py.typed +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/settings.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/spiders/py.typed +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/spiders/title.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/01_actor_lifecycle.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/02_actor_input.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/03_storages.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/04_actor_events.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/05_proxy_management.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/06_interacting_with_other_actors.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/07_webhooks.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/08_access_apify_api.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/09_running_webserver.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/10_logging.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/11_configuration.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/12_pay_per_event.mdx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/01_context_manager.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/01_init_exit.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/01_reboot.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/01_status_message.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/02_input.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/03_dataset_exports.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/03_dataset_read_write.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/03_deleting_storages.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/03_kvs_iterating.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/03_kvs_public_url.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/03_kvs_read_write.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/03_opening_storages.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/03_rq.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/04_actor_events.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/05_apify_proxy.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/05_apify_proxy_config.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/05_custom_proxy.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/05_custom_proxy_function.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/05_proxy_actor_input.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/05_proxy_httpx.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/05_proxy_rotation.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/06_interacting_call.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/06_interacting_call_task.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/06_interacting_metamorph.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/06_interacting_start.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/07_webhook.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/07_webhook_preventing.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/08_actor_client.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/08_actor_new_client.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/09_webserver.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/10_log_config.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/10_logger_usage.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/11_config.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/actor_charge.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/03_concepts/code/conditional_actor_charge.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/04_upgrading/upgrading_to_v2.md +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/docs/pyproject.toml +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/renovate.json +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/_charging.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/_configuration.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/_consts.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/_crypto.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/_models.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/_platform_event_manager.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/_proxy_configuration.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/_utils.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/_apify_storage_client.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/_dataset_client.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/_dataset_collection_client.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/_key_value_store_client.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/_key_value_store_collection_client.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/_request_queue_client.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/_request_queue_collection_client.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/py.typed +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/log.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/py.typed +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/_actor_runner.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/_async_thread.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/_logging_config.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/extensions/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/extensions/_httpcache.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/middlewares/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/middlewares/py.typed +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/pipelines/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/pipelines/py.typed +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/py.typed +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/requests.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/scheduler.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/scrapy/utils.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/storages/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/storages/_request_list.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/src/apify/storages/py.typed +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/README.md +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/_utils.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/actor_source_base/Dockerfile +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/actor_source_base/requirements.txt +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/actor_source_base/src/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/actor_source_base/src/__main__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/actor_source_base/src/main.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/conftest.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_api_helpers.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_charge.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_dataset.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_events.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_key_value_store.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_lifecycle.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_log.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_request_queue.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_scrapy.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_fixtures.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_request_queue.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_actor_dataset.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_actor_env_helpers.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_actor_helpers.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_actor_key_value_store.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_actor_lifecycle.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_actor_log.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_actor_request_queue.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_configuration.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/actor/test_request_list.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/conftest.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/extensions/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/middlewares/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/pipelines/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/requests/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/utils/__init__.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/test_crypto.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/test_platform_event_manager.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/tests/unit/test_proxy_configuration.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/uv.lock +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/.eslintrc.json +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/babel.config.js +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/build_api_reference.sh +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/docusaurus.config.js +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/generate_module_shortcuts.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/package.json +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/sidebars.js +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/components/ApiLink.jsx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/components/Gradients.jsx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/components/Highlights.jsx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/components/Highlights.module.css +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/components/RunnableCodeBlock.jsx +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/components/RunnableCodeBlock.module.css +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/css/custom.css +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/pages/home_page_example.py +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/pages/index.js +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/src/pages/index.module.css +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/static/.nojekyll +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/static/img/docs-og.png +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/tools/docs-prettier.config.js +0 -0
- {apify-2.5.1b10 → apify-2.5.1b11}/website/tools/utils/externalLink.js +0 -0
|
@@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
<!-- git-cliff-unreleased-start -->
|
|
6
6
|
## 2.5.1 - **not yet released**
|
|
7
7
|
|
|
8
|
+
### 🚀 Features
|
|
9
|
+
|
|
10
|
+
- Add `RemainingTime` option for `timeout` argument of `Actor.call` and `Actor.start` ([#473](https://github.com/apify/apify-sdk-python/pull/473)) ([ba7f757](https://github.com/apify/apify-sdk-python/commit/ba7f757a82661a5a181d9bd767950d09557409f9)) by [@Pijukatel](https://github.com/Pijukatel), closes [#472](https://github.com/apify/apify-sdk-python/issues/472)
|
|
11
|
+
|
|
8
12
|
### 🐛 Bug Fixes
|
|
9
13
|
|
|
10
14
|
- Fix duplicate logs from apify logger in Scrapy integration ([#457](https://github.com/apify/apify-sdk-python/pull/457)) ([2745ee6](https://github.com/apify/apify-sdk-python/commit/2745ee6529deecb4f2838c764b9bb3fb6606762b)) by [@vdusek](https://github.com/vdusek), closes [#391](https://github.com/apify/apify-sdk-python/issues/391)
|
|
@@ -4,7 +4,7 @@ import asyncio
|
|
|
4
4
|
import os
|
|
5
5
|
import sys
|
|
6
6
|
from contextlib import suppress
|
|
7
|
-
from datetime import timedelta
|
|
7
|
+
from datetime import datetime, timedelta, timezone
|
|
8
8
|
from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar, cast, overload
|
|
9
9
|
|
|
10
10
|
from lazy_object_proxy import Proxy
|
|
@@ -693,7 +693,7 @@ class _ActorType:
|
|
|
693
693
|
content_type: str | None = None,
|
|
694
694
|
build: str | None = None,
|
|
695
695
|
memory_mbytes: int | None = None,
|
|
696
|
-
timeout: timedelta | None = None,
|
|
696
|
+
timeout: timedelta | None | Literal['RemainingTime'] = None,
|
|
697
697
|
wait_for_finish: int | None = None,
|
|
698
698
|
webhooks: list[Webhook] | None = None,
|
|
699
699
|
) -> ActorRun:
|
|
@@ -711,7 +711,8 @@ class _ActorType:
|
|
|
711
711
|
memory_mbytes: Memory limit for the run, in megabytes. By default, the run uses a memory limit specified
|
|
712
712
|
in the default run configuration for the Actor.
|
|
713
713
|
timeout: Optional timeout for the run, in seconds. By default, the run uses timeout specified in
|
|
714
|
-
the default run configuration for the Actor.
|
|
714
|
+
the default run configuration for the Actor. Using `RemainingTime` will set timeout of the other Actor
|
|
715
|
+
to the time remaining from this Actor timeout.
|
|
715
716
|
wait_for_finish: The maximum number of seconds the server waits for the run to finish. By default,
|
|
716
717
|
it is 0, the maximum value is 300.
|
|
717
718
|
webhooks: Optional ad-hoc webhooks (https://docs.apify.com/webhooks/ad-hoc-webhooks) associated with
|
|
@@ -732,18 +733,39 @@ class _ActorType:
|
|
|
732
733
|
else:
|
|
733
734
|
serialized_webhooks = None
|
|
734
735
|
|
|
736
|
+
if timeout == 'RemainingTime':
|
|
737
|
+
actor_start_timeout = self._get_remaining_time()
|
|
738
|
+
elif timeout is None:
|
|
739
|
+
actor_start_timeout = None
|
|
740
|
+
elif isinstance(timeout, timedelta):
|
|
741
|
+
actor_start_timeout = timeout
|
|
742
|
+
else:
|
|
743
|
+
raise ValueError(f'Invalid timeout {timeout!r}: expected `None`, `"RemainingTime"`, or a `timedelta`.')
|
|
744
|
+
|
|
735
745
|
api_result = await client.actor(actor_id).start(
|
|
736
746
|
run_input=run_input,
|
|
737
747
|
content_type=content_type,
|
|
738
748
|
build=build,
|
|
739
749
|
memory_mbytes=memory_mbytes,
|
|
740
|
-
timeout_secs=int(
|
|
750
|
+
timeout_secs=int(actor_start_timeout.total_seconds()) if actor_start_timeout is not None else None,
|
|
741
751
|
wait_for_finish=wait_for_finish,
|
|
742
752
|
webhooks=serialized_webhooks,
|
|
743
753
|
)
|
|
744
754
|
|
|
745
755
|
return ActorRun.model_validate(api_result)
|
|
746
756
|
|
|
757
|
+
def _get_remaining_time(self) -> timedelta | None:
|
|
758
|
+
"""Get time remaining from the actor timeout. Returns `None` if not on an Apify platform."""
|
|
759
|
+
if self.is_at_home() and self.configuration.timeout_at:
|
|
760
|
+
return self.configuration.timeout_at - datetime.now(tz=timezone.utc)
|
|
761
|
+
|
|
762
|
+
self.log.warning(
|
|
763
|
+
'Returning `None` instead of remaining time. Using `RemainingTime` argument is only possible when the Actor'
|
|
764
|
+
' is running on the Apify platform and when the timeout for the Actor run is set. '
|
|
765
|
+
f'{self.is_at_home()=}, {self.configuration.timeout_at=}'
|
|
766
|
+
)
|
|
767
|
+
return None
|
|
768
|
+
|
|
747
769
|
async def abort(
|
|
748
770
|
self,
|
|
749
771
|
run_id: str,
|
|
@@ -787,7 +809,7 @@ class _ActorType:
|
|
|
787
809
|
content_type: str | None = None,
|
|
788
810
|
build: str | None = None,
|
|
789
811
|
memory_mbytes: int | None = None,
|
|
790
|
-
timeout: timedelta | None = None,
|
|
812
|
+
timeout: timedelta | None | Literal['RemainingTime'] = None,
|
|
791
813
|
webhooks: list[Webhook] | None = None,
|
|
792
814
|
wait: timedelta | None = None,
|
|
793
815
|
) -> ActorRun | None:
|
|
@@ -805,7 +827,8 @@ class _ActorType:
|
|
|
805
827
|
memory_mbytes: Memory limit for the run, in megabytes. By default, the run uses a memory limit specified
|
|
806
828
|
in the default run configuration for the Actor.
|
|
807
829
|
timeout: Optional timeout for the run, in seconds. By default, the run uses timeout specified in
|
|
808
|
-
the default run configuration for the Actor.
|
|
830
|
+
the default run configuration for the Actor. Using `RemainingTime` will set timeout of the other Actor
|
|
831
|
+
to the time remaining from this Actor timeout.
|
|
809
832
|
webhooks: Optional webhooks (https://docs.apify.com/webhooks) associated with the Actor run, which can
|
|
810
833
|
be used to receive a notification, e.g. when the Actor finished or failed. If you already have
|
|
811
834
|
a webhook set up for the Actor, you do not have to add it again here.
|
|
@@ -826,12 +849,21 @@ class _ActorType:
|
|
|
826
849
|
else:
|
|
827
850
|
serialized_webhooks = None
|
|
828
851
|
|
|
852
|
+
if timeout == 'RemainingTime':
|
|
853
|
+
actor_call_timeout = self._get_remaining_time()
|
|
854
|
+
elif timeout is None:
|
|
855
|
+
actor_call_timeout = None
|
|
856
|
+
elif isinstance(timeout, timedelta):
|
|
857
|
+
actor_call_timeout = timeout
|
|
858
|
+
else:
|
|
859
|
+
raise ValueError(f'Invalid timeout {timeout!r}: expected `None`, `"RemainingTime"`, or a `timedelta`.')
|
|
860
|
+
|
|
829
861
|
api_result = await client.actor(actor_id).call(
|
|
830
862
|
run_input=run_input,
|
|
831
863
|
content_type=content_type,
|
|
832
864
|
build=build,
|
|
833
865
|
memory_mbytes=memory_mbytes,
|
|
834
|
-
timeout_secs=int(
|
|
866
|
+
timeout_secs=int(actor_call_timeout.total_seconds()) if actor_call_timeout is not None else None,
|
|
835
867
|
webhooks=serialized_webhooks,
|
|
836
868
|
wait_secs=int(wait.total_seconds()) if wait is not None else None,
|
|
837
869
|
)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from apify import Actor
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from .conftest import MakeActorFunction, RunActorFunction
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
async def test_actor_start_remaining_timeout(
|
|
13
|
+
make_actor: MakeActorFunction,
|
|
14
|
+
run_actor: RunActorFunction,
|
|
15
|
+
) -> None:
|
|
16
|
+
"""Test that correct timeout is set when using `RemainingTime` value for the `timeout` argument.
|
|
17
|
+
|
|
18
|
+
In this test, one Actor starts itself again and checks that the timeout is correctly set on the second Actor run.
|
|
19
|
+
Timeout should be the remaining time of the first Actor run calculated at the moment of the other Actor start."""
|
|
20
|
+
|
|
21
|
+
async def main() -> None:
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
|
|
24
|
+
async with Actor:
|
|
25
|
+
actor_input = (await Actor.get_input()) or {}
|
|
26
|
+
if actor_input.get('called_from_another_actor', False) is True:
|
|
27
|
+
# If this Actor run was started with a specific argument (the second Actor run), return immediately.
|
|
28
|
+
# Asserts checking the timeout are in the first Actor run.
|
|
29
|
+
return
|
|
30
|
+
|
|
31
|
+
# Start another run of this actor with timeout set to the time remaining in this actor run
|
|
32
|
+
other_run_data = await Actor.call(
|
|
33
|
+
actor_id=Actor.configuration.actor_id or '',
|
|
34
|
+
run_input={'called_from_another_actor': True},
|
|
35
|
+
timeout='RemainingTime',
|
|
36
|
+
)
|
|
37
|
+
assert other_run_data is not None
|
|
38
|
+
try:
|
|
39
|
+
# To make sure that the actor is started
|
|
40
|
+
await asyncio.sleep(5)
|
|
41
|
+
assert other_run_data.options is not None
|
|
42
|
+
assert Actor.configuration.timeout_at is not None
|
|
43
|
+
assert Actor.configuration.started_at is not None
|
|
44
|
+
|
|
45
|
+
remaining_time_after_actor_start = Actor.configuration.timeout_at - datetime.now(tz=timezone.utc)
|
|
46
|
+
|
|
47
|
+
assert other_run_data.options.timeout > remaining_time_after_actor_start
|
|
48
|
+
assert other_run_data.options.timeout < Actor.configuration.timeout_at - Actor.configuration.started_at
|
|
49
|
+
finally:
|
|
50
|
+
# Make sure the other actor run is aborted
|
|
51
|
+
await Actor.apify_client.run(other_run_data.id).abort()
|
|
52
|
+
|
|
53
|
+
actor = await make_actor(label='remaining-timeout', main_func=main)
|
|
54
|
+
run_result = await run_actor(actor)
|
|
55
|
+
|
|
56
|
+
assert run_result.status == 'SUCCEEDED'
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
async def test_actor_call_remaining_timeout(
|
|
60
|
+
make_actor: MakeActorFunction,
|
|
61
|
+
run_actor: RunActorFunction,
|
|
62
|
+
) -> None:
|
|
63
|
+
"""Test that correct timeout is set when using `RemainingTime` value for the `timeout` argument.
|
|
64
|
+
|
|
65
|
+
In this test, one Actor starts itself again and checks that the timeout is correctly set on the second Actor run.
|
|
66
|
+
Timeout should be the remaining time of the first Actor run calculated at the moment of the other Actor call."""
|
|
67
|
+
|
|
68
|
+
async def main() -> None:
|
|
69
|
+
from datetime import datetime, timezone
|
|
70
|
+
|
|
71
|
+
async with Actor:
|
|
72
|
+
actor_input = (await Actor.get_input()) or {}
|
|
73
|
+
if actor_input.get('called_from_another_actor', False) is True:
|
|
74
|
+
# If this Actor run was started with a specific argument (the second Actor run), return immediately.
|
|
75
|
+
# Asserts checking the timeout are in the first Actor run.
|
|
76
|
+
return
|
|
77
|
+
|
|
78
|
+
# Start another run of this actor with timeout set to the time remaining in this actor run
|
|
79
|
+
other_run_data = await Actor.call(
|
|
80
|
+
actor_id=Actor.configuration.actor_id or '',
|
|
81
|
+
run_input={'called_from_another_actor': True},
|
|
82
|
+
timeout='RemainingTime',
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
assert other_run_data is not None
|
|
86
|
+
try:
|
|
87
|
+
# To make sure that the actor is started
|
|
88
|
+
await asyncio.sleep(5)
|
|
89
|
+
|
|
90
|
+
assert other_run_data.options is not None
|
|
91
|
+
assert Actor.configuration.timeout_at is not None
|
|
92
|
+
assert Actor.configuration.started_at is not None
|
|
93
|
+
|
|
94
|
+
remaining_time_after_actor_start = Actor.configuration.timeout_at - datetime.now(tz=timezone.utc)
|
|
95
|
+
|
|
96
|
+
assert other_run_data.options.timeout > remaining_time_after_actor_start
|
|
97
|
+
assert other_run_data.options.timeout < Actor.configuration.timeout_at - Actor.configuration.started_at
|
|
98
|
+
finally:
|
|
99
|
+
# Make sure the other actor run is aborted
|
|
100
|
+
await Actor.apify_client.run(other_run_data.id).abort()
|
|
101
|
+
|
|
102
|
+
actor = await make_actor(label='remaining-timeout', main_func=main)
|
|
103
|
+
run_result = await run_actor(actor)
|
|
104
|
+
|
|
105
|
+
assert run_result.status == 'SUCCEEDED'
|
|
@@ -1586,9 +1586,9 @@
|
|
|
1586
1586
|
}
|
|
1587
1587
|
},
|
|
1588
1588
|
"node_modules/@apify/docs-theme": {
|
|
1589
|
-
"version": "1.0.
|
|
1590
|
-
"resolved": "https://registry.npmjs.org/@apify/docs-theme/-/docs-theme-1.0.
|
|
1591
|
-
"integrity": "sha512-
|
|
1589
|
+
"version": "1.0.175",
|
|
1590
|
+
"resolved": "https://registry.npmjs.org/@apify/docs-theme/-/docs-theme-1.0.175.tgz",
|
|
1591
|
+
"integrity": "sha512-aiVACmQ2T9aU+r/c3NNpJSO77y7LOvty6vlUy4UyNo85bwIyUyjqxEMPhnnG1RaHXBACCYcoGKL2ZOrqiGSl9A==",
|
|
1592
1592
|
"license": "ISC",
|
|
1593
1593
|
"dependencies": {
|
|
1594
1594
|
"@apify/docs-search-modal": "^1.2.1",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{apify-2.5.1b10 → apify-2.5.1b11}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/_dataset_collection_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{apify-2.5.1b10 → apify-2.5.1b11}/src/apify/apify_storage_client/_request_queue_collection_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{apify-2.5.1b10 → apify-2.5.1b11}/tests/integration/test_actor_create_proxy_configuration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|