apify 2.5.1b6__tar.gz → 2.5.1b8__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.1b6 → apify-2.5.1b8}/CHANGELOG.md +1 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/PKG-INFO +1 -1
- {apify-2.5.1b6 → apify-2.5.1b8}/pyproject.toml +1 -1
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/_proxy_configuration.py +15 -18
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/test_proxy_configuration.py +30 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/uv.lock +1571 -1568
- {apify-2.5.1b6 → apify-2.5.1b8}/website/package-lock.json +977 -977
- {apify-2.5.1b6 → apify-2.5.1b8}/.editorconfig +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.github/CODEOWNERS +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.github/workflows/build_and_deploy_docs.yaml +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.github/workflows/check_pr_title.yaml +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.github/workflows/pre_release.yaml +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.github/workflows/release.yaml +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.github/workflows/run_code_checks.yaml +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.github/workflows/update_new_issue.yaml +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.gitignore +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.markdownlint.yaml +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/.pre-commit-config.yaml +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/CONTRIBUTING.md +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/LICENSE +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/Makefile +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/README.md +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/01_overview/01_introduction.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/01_overview/02_running_actors_locally.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/01_overview/03_actor_structure.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/01_overview/code/01_introduction.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/01_overview/code/actor_structure/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/01_overview/code/actor_structure/__main__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/01_overview/code/actor_structure/main.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/01_overview/code/actor_structure/py.typed +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/01_beautifulsoup_httpx.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/02_crawlee.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/03_playwright.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/04_selenium.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/05_scrapy.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/01_beautifulsoup_httpx.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/02_crawlee_beautifulsoup.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/02_crawlee_playwright.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/03_playwright.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/04_selenium.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/scrapy_project/src/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/scrapy_project/src/__main__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/scrapy_project/src/items.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/scrapy_project/src/main.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/scrapy_project/src/py.typed +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/scrapy_project/src/settings.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/scrapy_project/src/spiders/py.typed +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/02_guides/code/scrapy_project/src/spiders/title.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/01_actor_lifecycle.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/02_actor_input.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/03_storages.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/04_actor_events.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/05_proxy_management.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/06_interacting_with_other_actors.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/07_webhooks.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/08_access_apify_api.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/09_running_webserver.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/10_logging.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/11_configuration.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/12_pay_per_event.mdx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/01_context_manager.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/01_init_exit.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/01_reboot.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/01_status_message.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/02_input.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/03_dataset_exports.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/03_dataset_read_write.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/03_deleting_storages.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/03_kvs_iterating.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/03_kvs_public_url.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/03_kvs_read_write.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/03_opening_storages.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/03_rq.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/04_actor_events.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/05_apify_proxy.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/05_apify_proxy_config.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/05_custom_proxy.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/05_custom_proxy_function.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/05_proxy_actor_input.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/05_proxy_httpx.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/05_proxy_rotation.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/06_interacting_call.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/06_interacting_call_task.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/06_interacting_metamorph.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/06_interacting_start.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/07_webhook.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/07_webhook_preventing.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/08_actor_client.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/08_actor_new_client.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/09_webserver.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/10_log_config.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/10_logger_usage.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/11_config.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/actor_charge.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/03_concepts/code/conditional_actor_charge.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/04_upgrading/upgrading_to_v2.md +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/docs/pyproject.toml +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/renovate.json +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/_actor.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/_charging.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/_configuration.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/_consts.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/_crypto.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/_models.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/_platform_event_manager.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/_utils.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/apify_storage_client/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/apify_storage_client/_apify_storage_client.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/apify_storage_client/_dataset_client.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/apify_storage_client/_dataset_collection_client.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/apify_storage_client/_key_value_store_client.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/apify_storage_client/_key_value_store_collection_client.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/apify_storage_client/_request_queue_client.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/apify_storage_client/_request_queue_collection_client.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/apify_storage_client/py.typed +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/log.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/py.typed +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/_actor_runner.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/_async_thread.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/_logging_config.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/extensions/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/extensions/_httpcache.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/middlewares/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/middlewares/py.typed +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/pipelines/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/pipelines/py.typed +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/py.typed +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/requests.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/scheduler.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/scrapy/utils.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/storages/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/storages/_request_list.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/src/apify/storages/py.typed +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/README.md +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/_utils.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/actor_source_base/Dockerfile +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/actor_source_base/requirements.txt +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/actor_source_base/src/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/actor_source_base/src/__main__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/actor_source_base/src/main.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/conftest.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_api_helpers.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_charge.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_dataset.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_events.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_key_value_store.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_lifecycle.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_log.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_request_queue.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_actor_scrapy.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_fixtures.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/integration/test_request_queue.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_actor_dataset.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_actor_env_helpers.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_actor_helpers.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_actor_key_value_store.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_actor_lifecycle.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_actor_log.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_actor_request_queue.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_configuration.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/actor/test_request_list.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/conftest.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/extensions/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/middlewares/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/pipelines/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/requests/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/utils/__init__.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/test_crypto.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/tests/unit/test_platform_event_manager.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/.eslintrc.json +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/babel.config.js +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/build_api_reference.sh +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/docusaurus.config.js +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/generate_module_shortcuts.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/package.json +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/sidebars.js +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/components/ApiLink.jsx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/components/Gradients.jsx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/components/Highlights.jsx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/components/Highlights.module.css +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/components/RunnableCodeBlock.jsx +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/components/RunnableCodeBlock.module.css +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/css/custom.css +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/pages/home_page_example.py +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/pages/index.js +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/src/pages/index.module.css +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/static/.nojekyll +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/static/img/docs-og.png +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/tools/docs-prettier.config.js +0 -0
- {apify-2.5.1b6 → apify-2.5.1b8}/website/tools/utils/externalLink.js +0 -0
|
@@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file.
|
|
|
8
8
|
### 🐛 Bug Fixes
|
|
9
9
|
|
|
10
10
|
- 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)
|
|
11
|
+
- Prefer proxy password from env var ([#468](https://github.com/apify/apify-sdk-python/pull/468)) ([1c4ad9b](https://github.com/apify/apify-sdk-python/commit/1c4ad9bcfbf6ac404f942d7d2d249b036c2e7f54)) by [@stepskop](https://github.com/stepskop)
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
<!-- git-cliff-unreleased-end -->
|
|
@@ -178,7 +178,9 @@ class ProxyConfiguration(CrawleeProxyConfiguration):
|
|
|
178
178
|
self._country_code = country_code
|
|
179
179
|
|
|
180
180
|
async def initialize(self) -> None:
|
|
181
|
-
"""
|
|
181
|
+
"""Check if using proxy, if so, check the access.
|
|
182
|
+
|
|
183
|
+
Load the Apify Proxy password from API (only if not passed to constructor or through env var).
|
|
182
184
|
|
|
183
185
|
Only called if Apify Proxy configuration is used. Also checks if country has access to Apify Proxy groups
|
|
184
186
|
if the country code is provided.
|
|
@@ -187,7 +189,17 @@ class ProxyConfiguration(CrawleeProxyConfiguration):
|
|
|
187
189
|
`ProxyConfiguration` instance instead of calling this manually.
|
|
188
190
|
"""
|
|
189
191
|
if self._uses_apify_proxy:
|
|
190
|
-
|
|
192
|
+
if not self._password:
|
|
193
|
+
await self._maybe_fetch_password()
|
|
194
|
+
if not self._password:
|
|
195
|
+
raise ValueError(
|
|
196
|
+
'Apify Proxy password must be provided using the "password" constructor argument '
|
|
197
|
+
f'or the "{ApifyEnvVars.PROXY_PASSWORD}" environment variable. '
|
|
198
|
+
f'You can also provide your Apify token via the "${ApifyEnvVars.TOKEN}" environment variable, '
|
|
199
|
+
f'so that the SDK can fetch the proxy password from Apify API, '
|
|
200
|
+
f'when not provided through constructor or ${ApifyEnvVars.PROXY_PASSWORD}.'
|
|
201
|
+
)
|
|
202
|
+
|
|
191
203
|
await self._check_access()
|
|
192
204
|
|
|
193
205
|
async def new_proxy_info(
|
|
@@ -255,22 +267,7 @@ class ProxyConfiguration(CrawleeProxyConfiguration):
|
|
|
255
267
|
user_info = await self._apify_client.user().get()
|
|
256
268
|
if user_info:
|
|
257
269
|
password = user_info['proxy']['password']
|
|
258
|
-
|
|
259
|
-
if self._password:
|
|
260
|
-
if self._password != password:
|
|
261
|
-
logger.warning(
|
|
262
|
-
'The Apify Proxy password you provided belongs to a different user than the Apify '
|
|
263
|
-
'token you are using. Are you sure this is correct?'
|
|
264
|
-
)
|
|
265
|
-
else:
|
|
266
|
-
self._password = password
|
|
267
|
-
|
|
268
|
-
if not self._password:
|
|
269
|
-
raise ValueError(
|
|
270
|
-
'Apify Proxy password must be provided using the "password" constructor argument '
|
|
271
|
-
f'or the "{ApifyEnvVars.PROXY_PASSWORD}" environment variable. If you add '
|
|
272
|
-
f'the "{ApifyEnvVars.TOKEN}" environment variable, the password will be automatically inferred.'
|
|
273
|
-
)
|
|
270
|
+
self._password = password
|
|
274
271
|
|
|
275
272
|
async def _check_access(self) -> None:
|
|
276
273
|
proxy_status_url = f'{self._configuration.proxy_status_url}/?format=json'
|
|
@@ -432,6 +432,36 @@ async def test_initialize_with_manual_password(monkeypatch: pytest.MonkeyPatch,
|
|
|
432
432
|
assert proxy_configuration.is_man_in_the_middle is False
|
|
433
433
|
|
|
434
434
|
|
|
435
|
+
async def test_initialize_prefering_password_from_env_over_calling_api(
|
|
436
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
437
|
+
respx_mock: MockRouter,
|
|
438
|
+
patched_apify_client: ApifyClientAsync,
|
|
439
|
+
) -> None:
|
|
440
|
+
dummy_proxy_status_url = 'http://dummy-proxy-status-url.com'
|
|
441
|
+
monkeypatch.setenv(ApifyEnvVars.PROXY_STATUS_URL.value, dummy_proxy_status_url)
|
|
442
|
+
monkeypatch.setenv(ApifyEnvVars.PROXY_PASSWORD.value, DUMMY_PASSWORD)
|
|
443
|
+
|
|
444
|
+
respx_mock.get(dummy_proxy_status_url).mock(
|
|
445
|
+
httpx.Response(
|
|
446
|
+
200,
|
|
447
|
+
json={
|
|
448
|
+
'connected': True,
|
|
449
|
+
'connectionError': None,
|
|
450
|
+
'isManInTheMiddle': False,
|
|
451
|
+
},
|
|
452
|
+
)
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
proxy_configuration = ProxyConfiguration()
|
|
456
|
+
|
|
457
|
+
await proxy_configuration.initialize()
|
|
458
|
+
|
|
459
|
+
assert proxy_configuration._password == DUMMY_PASSWORD
|
|
460
|
+
assert proxy_configuration.is_man_in_the_middle is False
|
|
461
|
+
|
|
462
|
+
assert len(patched_apify_client.calls['user']['get']) == 0 # type: ignore[attr-defined]
|
|
463
|
+
|
|
464
|
+
|
|
435
465
|
@pytest.mark.skip(reason='There are issues with log propagation to caplog, see issue #462.')
|
|
436
466
|
async def test_initialize_with_manual_password_different_than_user_one(
|
|
437
467
|
monkeypatch: pytest.MonkeyPatch,
|