apify 2.6.1b11__tar.gz → 2.7.1__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.6.1b11 → apify-2.7.1}/.github/workflows/pre_release.yaml +4 -4
- {apify-2.6.1b11 → apify-2.7.1}/.github/workflows/release.yaml +4 -4
- {apify-2.6.1b11 → apify-2.7.1}/.github/workflows/run_code_checks.yaml +4 -4
- {apify-2.6.1b11 → apify-2.7.1}/CHANGELOG.md +9 -8
- {apify-2.6.1b11 → apify-2.7.1}/CONTRIBUTING.md +1 -1
- {apify-2.6.1b11 → apify-2.7.1}/PKG-INFO +3 -2
- {apify-2.6.1b11 → apify-2.7.1}/docs/01_overview/02_running_actors_locally.mdx +1 -1
- {apify-2.6.1b11 → apify-2.7.1}/pyproject.toml +5 -4
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/_actor.py +1 -2
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/_charging.py +3 -2
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/_models.py +1 -1
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/_platform_event_manager.py +20 -5
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/_utils.py +1 -4
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/storages/_request_list.py +2 -2
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/conftest.py +2 -2
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_events.py +1 -3
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_actor_lifecycle.py +1 -3
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/conftest.py +22 -3
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/test_platform_event_manager.py +1 -4
- {apify-2.6.1b11 → apify-2.7.1}/uv.lock +500 -229
- {apify-2.6.1b11 → apify-2.7.1}/website/package-lock.json +1010 -598
- {apify-2.6.1b11 → apify-2.7.1}/website/package.json +1 -1
- {apify-2.6.1b11 → apify-2.7.1}/website/src/pages/index.module.css +1 -1
- {apify-2.6.1b11 → apify-2.7.1}/.editorconfig +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/.github/CODEOWNERS +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/.github/workflows/build_and_deploy_docs.yaml +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/.github/workflows/check_pr_title.yaml +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/.github/workflows/update_new_issue.yaml +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/.gitignore +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/.markdownlint.yaml +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/.pre-commit-config.yaml +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/LICENSE +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/Makefile +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/README.md +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/01_overview/01_introduction.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/01_overview/03_actor_structure.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/01_overview/code/01_introduction.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/01_overview/code/actor_structure/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/01_overview/code/actor_structure/__main__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/01_overview/code/actor_structure/main.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/01_overview/code/actor_structure/py.typed +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/01_beautifulsoup_httpx.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/02_crawlee.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/03_playwright.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/04_selenium.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/05_scrapy.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/01_beautifulsoup_httpx.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/02_crawlee_beautifulsoup.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/02_crawlee_playwright.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/03_playwright.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/04_selenium.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/__main__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/items.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/main.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/py.typed +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/settings.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/spiders/py.typed +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/spiders/title.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/01_actor_lifecycle.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/02_actor_input.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/03_storages.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/04_actor_events.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/05_proxy_management.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/06_interacting_with_other_actors.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/07_webhooks.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/08_access_apify_api.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/09_running_webserver.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/10_logging.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/11_configuration.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/12_pay_per_event.mdx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/01_context_manager.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/01_init_exit.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/01_reboot.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/01_status_message.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/02_input.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/03_dataset_exports.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/03_dataset_read_write.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/03_deleting_storages.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/03_kvs_iterating.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/03_kvs_public_url.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/03_kvs_read_write.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/03_opening_storages.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/03_rq.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/04_actor_events.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/05_apify_proxy.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/05_apify_proxy_config.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/05_custom_proxy.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/05_custom_proxy_function.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/05_proxy_actor_input.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/05_proxy_httpx.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/05_proxy_rotation.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/06_interacting_call.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/06_interacting_call_task.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/06_interacting_metamorph.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/06_interacting_start.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/07_webhook.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/07_webhook_preventing.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/08_actor_client.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/08_actor_new_client.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/09_webserver.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/10_log_config.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/10_logger_usage.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/11_config.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/actor_charge.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/03_concepts/code/conditional_actor_charge.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/04_upgrading/upgrading_to_v2.md +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/docs/pyproject.toml +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/renovate.json +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/_configuration.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/_consts.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/_crypto.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/_proxy_configuration.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/apify_storage_client/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/apify_storage_client/_apify_storage_client.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/apify_storage_client/_dataset_client.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/apify_storage_client/_dataset_collection_client.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/apify_storage_client/_key_value_store_client.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/apify_storage_client/_key_value_store_collection_client.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/apify_storage_client/_request_queue_client.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/apify_storage_client/_request_queue_collection_client.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/apify_storage_client/py.typed +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/log.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/py.typed +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/_actor_runner.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/_async_thread.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/_logging_config.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/extensions/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/extensions/_httpcache.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/middlewares/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/middlewares/py.typed +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/pipelines/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/pipelines/py.typed +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/py.typed +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/requests.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/scheduler.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/scrapy/utils.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/storages/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/src/apify/storages/py.typed +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/README.md +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/_utils.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/actor_source_base/Dockerfile +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/actor_source_base/requirements.txt +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/actor_source_base/src/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/actor_source_base/src/__main__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/actor_source_base/src/main.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_api_helpers.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_call_timeouts.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_charge.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_dataset.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_key_value_store.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_lifecycle.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_log.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_request_queue.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_actor_scrapy.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_fixtures.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/integration/test_request_queue.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_actor_dataset.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_actor_env_helpers.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_actor_helpers.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_actor_key_value_store.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_actor_log.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_actor_request_queue.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_configuration.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/actor/test_request_list.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/extensions/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/middlewares/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/pipelines/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/requests/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/utils/__init__.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/test_crypto.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/tests/unit/test_proxy_configuration.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/.eslintrc.json +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/babel.config.js +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/build_api_reference.sh +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/docusaurus.config.js +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/generate_module_shortcuts.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/sidebars.js +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/src/components/ApiLink.jsx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/src/components/Gradients.jsx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/src/components/Highlights.jsx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/src/components/Highlights.module.css +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/src/components/RunnableCodeBlock.jsx +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/src/components/RunnableCodeBlock.module.css +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/src/css/custom.css +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/src/pages/home_page_example.py +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/src/pages/index.js +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/static/.nojekyll +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/static/img/docs-og.png +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/tools/docs-prettier.config.js +0 -0
- {apify-2.6.1b11 → apify-2.7.1}/website/tools/utils/externalLink.js +0 -0
|
@@ -32,26 +32,26 @@ jobs:
|
|
|
32
32
|
name: Lint check
|
|
33
33
|
uses: apify/workflows/.github/workflows/python_lint_check.yaml@main
|
|
34
34
|
with:
|
|
35
|
-
python-versions: '["3.10", "3.11", "3.12", "3.13"]'
|
|
35
|
+
python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
|
|
36
36
|
|
|
37
37
|
type_check:
|
|
38
38
|
name: Type check
|
|
39
39
|
uses: apify/workflows/.github/workflows/python_type_check.yaml@main
|
|
40
40
|
with:
|
|
41
|
-
python-versions: '["3.10", "3.11", "3.12", "3.13"]'
|
|
41
|
+
python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
|
|
42
42
|
|
|
43
43
|
unit_tests:
|
|
44
44
|
name: Unit tests
|
|
45
45
|
uses: apify/workflows/.github/workflows/python_unit_tests.yaml@main
|
|
46
46
|
with:
|
|
47
|
-
python-versions: '["3.10", "3.11", "3.12", "3.13"]'
|
|
47
|
+
python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
|
|
48
48
|
|
|
49
49
|
integration_tests:
|
|
50
50
|
name: Integration tests
|
|
51
51
|
uses: apify/workflows/.github/workflows/python_integration_tests.yaml@main
|
|
52
52
|
secrets: inherit
|
|
53
53
|
with:
|
|
54
|
-
python-versions: '["3.
|
|
54
|
+
python-versions: '["3.9", "3.13"]'
|
|
55
55
|
|
|
56
56
|
update_changelog:
|
|
57
57
|
name: Update changelog
|
|
@@ -43,26 +43,26 @@ jobs:
|
|
|
43
43
|
name: Lint check
|
|
44
44
|
uses: apify/workflows/.github/workflows/python_lint_check.yaml@main
|
|
45
45
|
with:
|
|
46
|
-
python-versions: '["3.10", "3.11", "3.12", "3.13"]'
|
|
46
|
+
python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
|
|
47
47
|
|
|
48
48
|
type_check:
|
|
49
49
|
name: Type check
|
|
50
50
|
uses: apify/workflows/.github/workflows/python_type_check.yaml@main
|
|
51
51
|
with:
|
|
52
|
-
python-versions: '["3.10", "3.11", "3.12", "3.13"]'
|
|
52
|
+
python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
|
|
53
53
|
|
|
54
54
|
unit_tests:
|
|
55
55
|
name: Unit tests
|
|
56
56
|
uses: apify/workflows/.github/workflows/python_unit_tests.yaml@main
|
|
57
57
|
with:
|
|
58
|
-
python-versions: '["3.10", "3.11", "3.12", "3.13"]'
|
|
58
|
+
python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
|
|
59
59
|
|
|
60
60
|
integration_tests:
|
|
61
61
|
name: Integration tests
|
|
62
62
|
uses: apify/workflows/.github/workflows/python_integration_tests.yaml@main
|
|
63
63
|
secrets: inherit
|
|
64
64
|
with:
|
|
65
|
-
python-versions: '["3.
|
|
65
|
+
python-versions: '["3.9", "3.13"]'
|
|
66
66
|
|
|
67
67
|
update_changelog:
|
|
68
68
|
name: Update changelog
|
|
@@ -11,19 +11,19 @@ jobs:
|
|
|
11
11
|
name: Lint check
|
|
12
12
|
uses: apify/workflows/.github/workflows/python_lint_check.yaml@main
|
|
13
13
|
with:
|
|
14
|
-
python-versions: '["3.10", "3.11", "3.12", "3.13"]'
|
|
14
|
+
python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
|
|
15
15
|
|
|
16
16
|
type_check:
|
|
17
17
|
name: Type check
|
|
18
18
|
uses: apify/workflows/.github/workflows/python_type_check.yaml@main
|
|
19
19
|
with:
|
|
20
|
-
python-versions: '["3.10", "3.11", "3.12", "3.13"]'
|
|
20
|
+
python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
|
|
21
21
|
|
|
22
22
|
unit_tests:
|
|
23
23
|
name: Unit tests
|
|
24
24
|
uses: apify/workflows/.github/workflows/python_unit_tests.yaml@main
|
|
25
25
|
with:
|
|
26
|
-
python-versions: '["3.10", "3.11", "3.12", "3.13"]'
|
|
26
|
+
python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
|
|
27
27
|
|
|
28
28
|
docs_check:
|
|
29
29
|
name: Docs check
|
|
@@ -35,4 +35,4 @@ jobs:
|
|
|
35
35
|
uses: apify/workflows/.github/workflows/python_integration_tests.yaml@main
|
|
36
36
|
secrets: inherit
|
|
37
37
|
with:
|
|
38
|
-
python-versions: '["3.
|
|
38
|
+
python-versions: '["3.9", "3.13"]'
|
|
@@ -2,21 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
## 2.6.1 - **not yet released**
|
|
5
|
+
## [2.7.1](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.1) (2025-07-24)
|
|
7
6
|
|
|
8
7
|
### 🚀 Features
|
|
9
8
|
|
|
10
|
-
-
|
|
11
|
-
- **crypto:** Decrypt secret objects ([#482](https://github.com/apify/apify-sdk-python/pull/482)) ([ce9daf7](https://github.com/apify/apify-sdk-python/commit/ce9daf7381212b8dc194e8a643e5ca0dedbc0078)) by [@MFori](https://github.com/MFori)
|
|
9
|
+
- **crypto:** Decrypt secret objects (#482) ([4d62f46](https://github.com/apify/apify-sdk-python/commit/4d62f466b1d4d717fdb0ebacfeb30df49aa6d742))
|
|
12
10
|
|
|
13
|
-
### 🐛 Bug Fixes
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
|
|
13
|
+
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
14
|
+
|
|
15
|
+
### 🚀 Features
|
|
16
|
+
|
|
17
|
+
- Expose `logger` argument on `Actor.call` to control log redirection from started Actor run ([#487](https://github.com/apify/apify-sdk-python/pull/487)) ([aa6fa47](https://github.com/apify/apify-sdk-python/commit/aa6fa4750ea1bc7909be1191c0d276a2046930c2)) by [@Pijukatel](https://github.com/Pijukatel)
|
|
18
|
+
- **crypto:** Decrypt secret objects ([#482](https://github.com/apify/apify-sdk-python/pull/482)) ([ce9daf7](https://github.com/apify/apify-sdk-python/commit/ce9daf7381212b8dc194e8a643e5ca0dedbc0078)) by [@MFori](https://github.com/MFori)
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
<!-- git-cliff-unreleased-end -->
|
|
20
21
|
## [2.6.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.6.0) (2025-06-09)
|
|
21
22
|
|
|
22
23
|
### 🚀 Features
|
|
@@ -4,7 +4,7 @@ Here you'll find a contributing guide to get started with development.
|
|
|
4
4
|
|
|
5
5
|
## Environment
|
|
6
6
|
|
|
7
|
-
For local development, it is required to have Python 3.
|
|
7
|
+
For local development, it is required to have Python 3.9 (or a later version) installed.
|
|
8
8
|
|
|
9
9
|
We use [uv](https://docs.astral.sh/uv/) for project management. Install it and set up your IDE accordingly.
|
|
10
10
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apify
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.1
|
|
4
4
|
Summary: Apify SDK for Python
|
|
5
5
|
Project-URL: Apify Homepage, https://apify.com
|
|
6
6
|
Project-URL: Changelog, https://docs.apify.com/sdk/python/docs/changelog
|
|
@@ -219,12 +219,13 @@ Classifier: Environment :: Console
|
|
|
219
219
|
Classifier: Intended Audience :: Developers
|
|
220
220
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
221
221
|
Classifier: Operating System :: OS Independent
|
|
222
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
222
223
|
Classifier: Programming Language :: Python :: 3.10
|
|
223
224
|
Classifier: Programming Language :: Python :: 3.11
|
|
224
225
|
Classifier: Programming Language :: Python :: 3.12
|
|
225
226
|
Classifier: Programming Language :: Python :: 3.13
|
|
226
227
|
Classifier: Topic :: Software Development :: Libraries
|
|
227
|
-
Requires-Python: >=3.
|
|
228
|
+
Requires-Python: >=3.9
|
|
228
229
|
Requires-Dist: apify-client>=1.11.0
|
|
229
230
|
Requires-Dist: apify-shared>=1.3.0
|
|
230
231
|
Requires-Dist: crawlee~=0.6.0
|
|
@@ -11,7 +11,7 @@ In this page, you'll learn how to create and run Apify Actors locally on your co
|
|
|
11
11
|
|
|
12
12
|
## Requirements
|
|
13
13
|
|
|
14
|
-
The Apify SDK requires Python version 3.
|
|
14
|
+
The Apify SDK requires Python version 3.9 or above to run Python Actors locally.
|
|
15
15
|
|
|
16
16
|
## Creating your first Actor
|
|
17
17
|
|
|
@@ -4,18 +4,19 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "apify"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.7.1"
|
|
8
8
|
description = "Apify SDK for Python"
|
|
9
9
|
authors = [{ name = "Apify Technologies s.r.o.", email = "support@apify.com" }]
|
|
10
10
|
license = { file = "LICENSE" }
|
|
11
11
|
readme = "README.md"
|
|
12
|
-
requires-python = ">=3.
|
|
12
|
+
requires-python = ">=3.9"
|
|
13
13
|
classifiers = [
|
|
14
14
|
"Development Status :: 5 - Production/Stable",
|
|
15
15
|
"Environment :: Console",
|
|
16
16
|
"Intended Audience :: Developers",
|
|
17
17
|
"License :: OSI Approved :: Apache Software License",
|
|
18
18
|
"Operating System :: OS Independent",
|
|
19
|
+
"Programming Language :: Python :: 3.9",
|
|
19
20
|
"Programming Language :: Python :: 3.10",
|
|
20
21
|
"Programming Language :: Python :: 3.11",
|
|
21
22
|
"Programming Language :: Python :: 3.12",
|
|
@@ -187,7 +188,7 @@ asyncio_mode = "auto"
|
|
|
187
188
|
timeout = 1200
|
|
188
189
|
|
|
189
190
|
[tool.mypy]
|
|
190
|
-
python_version = "3.
|
|
191
|
+
python_version = "3.9"
|
|
191
192
|
plugins = ["pydantic.mypy"]
|
|
192
193
|
files = ["src", "tests", "docs", "website"]
|
|
193
194
|
check_untyped_defs = true
|
|
@@ -214,7 +215,7 @@ module = [
|
|
|
214
215
|
ignore_missing_imports = true
|
|
215
216
|
|
|
216
217
|
[tool.basedpyright]
|
|
217
|
-
pythonVersion = "3.
|
|
218
|
+
pythonVersion = "3.9"
|
|
218
219
|
typeCheckingMode = "standard"
|
|
219
220
|
include = ["src", "tests", "docs", "website"]
|
|
220
221
|
|
|
@@ -5,7 +5,7 @@ import os
|
|
|
5
5
|
import sys
|
|
6
6
|
from contextlib import suppress
|
|
7
7
|
from datetime import datetime, timedelta, timezone
|
|
8
|
-
from typing import TYPE_CHECKING, Any, Literal, TypeVar, cast, overload
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar, cast, overload
|
|
9
9
|
|
|
10
10
|
from lazy_object_proxy import Proxy
|
|
11
11
|
from more_itertools import flatten
|
|
@@ -39,7 +39,6 @@ from apify.storages import Dataset, KeyValueStore, RequestQueue
|
|
|
39
39
|
|
|
40
40
|
if TYPE_CHECKING:
|
|
41
41
|
import logging
|
|
42
|
-
from collections.abc import Callable
|
|
43
42
|
from types import TracebackType
|
|
44
43
|
|
|
45
44
|
from typing_extensions import Self
|
|
@@ -4,7 +4,7 @@ import math
|
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from datetime import datetime, timezone
|
|
6
6
|
from decimal import Decimal
|
|
7
|
-
from typing import TYPE_CHECKING, Protocol
|
|
7
|
+
from typing import TYPE_CHECKING, Protocol, Union
|
|
8
8
|
|
|
9
9
|
from pydantic import TypeAdapter
|
|
10
10
|
|
|
@@ -23,7 +23,8 @@ if TYPE_CHECKING:
|
|
|
23
23
|
|
|
24
24
|
from apify._configuration import Configuration
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
|
|
27
|
+
run_validator: TypeAdapter[ActorRun | None] = TypeAdapter(Union[ActorRun, None])
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
@docs_group('Interfaces')
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
from datetime import datetime
|
|
5
|
-
from typing import TYPE_CHECKING, Annotated, Any, Literal
|
|
5
|
+
from typing import TYPE_CHECKING, Annotated, Any, Literal, Union
|
|
6
6
|
|
|
7
7
|
import websockets.asyncio.client
|
|
8
8
|
from pydantic import BaseModel, Discriminator, Field, TypeAdapter
|
|
@@ -113,10 +113,25 @@ class UnknownEvent(BaseModel):
|
|
|
113
113
|
data: Annotated[dict[str, Any], Field(default_factory=dict)]
|
|
114
114
|
|
|
115
115
|
|
|
116
|
-
EventMessage =
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
EventMessage = Union[
|
|
117
|
+
PersistStateEvent,
|
|
118
|
+
SystemInfoEvent,
|
|
119
|
+
MigratingEvent,
|
|
120
|
+
AbortingEvent,
|
|
121
|
+
ExitEvent,
|
|
122
|
+
EventWithoutData,
|
|
123
|
+
]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
event_data_adapter: TypeAdapter[EventMessage | DeprecatedEvent | UnknownEvent] = TypeAdapter(
|
|
127
|
+
Union[
|
|
128
|
+
Annotated[
|
|
129
|
+
EventMessage,
|
|
130
|
+
Discriminator('name'),
|
|
131
|
+
],
|
|
132
|
+
DeprecatedEvent,
|
|
133
|
+
UnknownEvent,
|
|
134
|
+
]
|
|
120
135
|
)
|
|
121
136
|
|
|
122
137
|
|
|
@@ -3,10 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import builtins
|
|
4
4
|
import sys
|
|
5
5
|
from importlib import metadata
|
|
6
|
-
from typing import
|
|
7
|
-
|
|
8
|
-
if TYPE_CHECKING:
|
|
9
|
-
from collections.abc import Callable
|
|
6
|
+
from typing import Callable, Literal
|
|
10
7
|
|
|
11
8
|
|
|
12
9
|
def get_system_info() -> dict:
|
|
@@ -4,7 +4,7 @@ import asyncio
|
|
|
4
4
|
import re
|
|
5
5
|
from asyncio import Task
|
|
6
6
|
from functools import partial
|
|
7
|
-
from typing import Annotated, Any
|
|
7
|
+
from typing import Annotated, Any, Union
|
|
8
8
|
|
|
9
9
|
from pydantic import BaseModel, Field, TypeAdapter
|
|
10
10
|
|
|
@@ -35,7 +35,7 @@ class _SimpleUrlInput(_RequestDetails):
|
|
|
35
35
|
url: str
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
url_input_adapter = TypeAdapter(list[_RequestsFromUrlInput
|
|
38
|
+
url_input_adapter = TypeAdapter(list[Union[_RequestsFromUrlInput, _SimpleUrlInput]])
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
@docs_group('Classes')
|
|
@@ -7,7 +7,7 @@ import subprocess
|
|
|
7
7
|
import sys
|
|
8
8
|
import textwrap
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import TYPE_CHECKING, Any, Protocol
|
|
10
|
+
from typing import TYPE_CHECKING, Any, Callable, Protocol
|
|
11
11
|
|
|
12
12
|
import pytest
|
|
13
13
|
from filelock import FileLock
|
|
@@ -22,7 +22,7 @@ from ._utils import generate_unique_resource_name
|
|
|
22
22
|
from apify._models import ActorRun
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
|
-
from collections.abc import Awaitable,
|
|
25
|
+
from collections.abc import Awaitable, Coroutine, Iterator, Mapping
|
|
26
26
|
from decimal import Decimal
|
|
27
27
|
|
|
28
28
|
from apify_client.clients.resource_clients import ActorClientAsync
|
|
@@ -16,11 +16,9 @@ async def test_emit_and_capture_interval_events(
|
|
|
16
16
|
run_actor: RunActorFunction,
|
|
17
17
|
) -> None:
|
|
18
18
|
async def main() -> None:
|
|
19
|
-
# TC003 - TYPE_CHECKING section is problematic for our integration tests.
|
|
20
19
|
import os
|
|
21
|
-
from collections.abc import Callable # noqa: TC003
|
|
22
20
|
from datetime import datetime
|
|
23
|
-
from typing import Any
|
|
21
|
+
from typing import Any, Callable
|
|
24
22
|
|
|
25
23
|
from apify_shared.consts import ActorEventTypes, ApifyEnvVars
|
|
26
24
|
from crawlee.events._types import Event, EventSystemInfoData
|
|
@@ -5,7 +5,7 @@ import contextlib
|
|
|
5
5
|
import json
|
|
6
6
|
import sys
|
|
7
7
|
from datetime import datetime, timezone
|
|
8
|
-
from typing import TYPE_CHECKING, Any, cast
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Callable, cast
|
|
9
9
|
from unittest.mock import AsyncMock, Mock
|
|
10
10
|
|
|
11
11
|
import pytest
|
|
@@ -19,8 +19,6 @@ from apify import Actor
|
|
|
19
19
|
from apify._actor import _ActorType
|
|
20
20
|
|
|
21
21
|
if TYPE_CHECKING:
|
|
22
|
-
from collections.abc import Callable
|
|
23
|
-
|
|
24
22
|
from lazy_object_proxy import Proxy
|
|
25
23
|
|
|
26
24
|
|
|
@@ -4,7 +4,8 @@ import asyncio
|
|
|
4
4
|
import inspect
|
|
5
5
|
import os
|
|
6
6
|
from collections import defaultdict
|
|
7
|
-
from
|
|
7
|
+
from copy import deepcopy
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Callable, get_type_hints
|
|
8
9
|
|
|
9
10
|
import pytest
|
|
10
11
|
|
|
@@ -18,7 +19,6 @@ from crawlee.storages import _creation_management
|
|
|
18
19
|
import apify._actor
|
|
19
20
|
|
|
20
21
|
if TYPE_CHECKING:
|
|
21
|
-
from collections.abc import Callable
|
|
22
22
|
from pathlib import Path
|
|
23
23
|
|
|
24
24
|
|
|
@@ -125,7 +125,26 @@ class ApifyClientAsyncPatcher:
|
|
|
125
125
|
if not client_method:
|
|
126
126
|
raise ValueError(f'ApifyClientAsync does not contain method "{method}"!')
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
try:
|
|
129
|
+
# Try to get the return type of the client method using `typing.get_type_hints()`
|
|
130
|
+
client_method_return_type = get_type_hints(client_method)['return']
|
|
131
|
+
except TypeError:
|
|
132
|
+
# There is a known issue with `typing.get_type_hints()` on Python 3.9. It raises a `TypeError`
|
|
133
|
+
# when `|` (Union) is used in the type hint, even with `from __future__ import annotations`. Since we
|
|
134
|
+
# only need the return type, we attempt the following workaround.
|
|
135
|
+
|
|
136
|
+
# 1. Create a deep copy of the client method object
|
|
137
|
+
client_method_copied = deepcopy(client_method)
|
|
138
|
+
|
|
139
|
+
# 2. Restrict the annotations to only include the return type
|
|
140
|
+
client_method_copied.__annotations__ = {'return': client_method.__annotations__['return']}
|
|
141
|
+
|
|
142
|
+
# 3. Try to get the return type again using `typing.get_type_hints()`
|
|
143
|
+
client_method_return_type = get_type_hints(client_method_copied)['return']
|
|
144
|
+
|
|
145
|
+
# TODO: Remove this fallback once we drop support for Python 3.9
|
|
146
|
+
# https://github.com/apify/apify-sdk-python/issues/151
|
|
147
|
+
|
|
129
148
|
original_submethod = getattr(client_method_return_type, submethod, None)
|
|
130
149
|
|
|
131
150
|
if not original_submethod:
|
|
@@ -4,7 +4,7 @@ import asyncio
|
|
|
4
4
|
import json
|
|
5
5
|
import logging
|
|
6
6
|
from collections import defaultdict
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import Any, Callable
|
|
8
8
|
from unittest.mock import Mock
|
|
9
9
|
|
|
10
10
|
import pytest
|
|
@@ -17,9 +17,6 @@ from crawlee.events._types import Event
|
|
|
17
17
|
from apify import Configuration
|
|
18
18
|
from apify._platform_event_manager import PlatformEventManager, SystemInfoEventData
|
|
19
19
|
|
|
20
|
-
if TYPE_CHECKING:
|
|
21
|
-
from collections.abc import Callable
|
|
22
|
-
|
|
23
20
|
|
|
24
21
|
@pytest.mark.skip(reason='There are issues with log propagation to caplog, see issue #462.')
|
|
25
22
|
async def test_lifecycle_local(caplog: pytest.LogCaptureFixture) -> None:
|