apify 2.6.1b7__tar.gz → 2.6.1b9__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.1b7 → apify-2.6.1b9}/CHANGELOG.md +5 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/PKG-INFO +1 -1
- {apify-2.6.1b7 → apify-2.6.1b9}/pyproject.toml +1 -1
- apify-2.6.1b9/src/apify/_consts.py +13 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/_crypto.py +11 -4
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_actor_key_value_store.py +38 -4
- {apify-2.6.1b7 → apify-2.6.1b9}/website/package-lock.json +860 -3060
- {apify-2.6.1b7 → apify-2.6.1b9}/website/package.json +1 -1
- apify-2.6.1b7/src/apify/_consts.py +0 -10
- {apify-2.6.1b7 → apify-2.6.1b9}/.editorconfig +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.github/CODEOWNERS +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.github/workflows/build_and_deploy_docs.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.github/workflows/check_pr_title.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.github/workflows/pre_release.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.github/workflows/release.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.github/workflows/run_code_checks.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.github/workflows/update_new_issue.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.gitignore +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.markdownlint.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/.pre-commit-config.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/CONTRIBUTING.md +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/LICENSE +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/Makefile +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/README.md +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/01_overview/01_introduction.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/01_overview/02_running_actors_locally.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/01_overview/03_actor_structure.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/01_overview/code/01_introduction.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/01_overview/code/actor_structure/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/01_overview/code/actor_structure/__main__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/01_overview/code/actor_structure/main.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/01_overview/code/actor_structure/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/01_beautifulsoup_httpx.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/02_crawlee.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/03_playwright.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/04_selenium.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/05_scrapy.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/01_beautifulsoup_httpx.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/02_crawlee_beautifulsoup.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/02_crawlee_playwright.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/03_playwright.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/04_selenium.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/scrapy_project/src/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/scrapy_project/src/__main__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/scrapy_project/src/items.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/scrapy_project/src/main.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/scrapy_project/src/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/scrapy_project/src/settings.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/scrapy_project/src/spiders/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/02_guides/code/scrapy_project/src/spiders/title.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/01_actor_lifecycle.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/02_actor_input.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/03_storages.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/04_actor_events.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/05_proxy_management.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/06_interacting_with_other_actors.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/07_webhooks.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/08_access_apify_api.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/09_running_webserver.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/10_logging.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/11_configuration.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/12_pay_per_event.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/01_context_manager.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/01_init_exit.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/01_reboot.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/01_status_message.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/02_input.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/03_dataset_exports.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/03_dataset_read_write.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/03_deleting_storages.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/03_kvs_iterating.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/03_kvs_public_url.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/03_kvs_read_write.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/03_opening_storages.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/03_rq.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/04_actor_events.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/05_apify_proxy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/05_apify_proxy_config.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/05_custom_proxy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/05_custom_proxy_function.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/05_proxy_actor_input.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/05_proxy_httpx.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/05_proxy_rotation.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/06_interacting_call.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/06_interacting_call_task.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/06_interacting_metamorph.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/06_interacting_start.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/07_webhook.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/07_webhook_preventing.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/08_actor_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/08_actor_new_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/09_webserver.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/10_log_config.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/10_logger_usage.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/11_config.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/actor_charge.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/03_concepts/code/conditional_actor_charge.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/04_upgrading/upgrading_to_v2.md +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/docs/pyproject.toml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/renovate.json +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/_actor.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/_charging.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/_models.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/_platform_event_manager.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/_proxy_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/_utils.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/apify_storage_client/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/apify_storage_client/_apify_storage_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/apify_storage_client/_dataset_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/apify_storage_client/_dataset_collection_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/apify_storage_client/_key_value_store_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/apify_storage_client/_key_value_store_collection_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/apify_storage_client/_request_queue_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/apify_storage_client/_request_queue_collection_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/apify_storage_client/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/log.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/_actor_runner.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/_async_thread.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/_logging_config.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/extensions/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/extensions/_httpcache.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/middlewares/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/middlewares/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/pipelines/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/pipelines/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/requests.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/scheduler.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/scrapy/utils.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/storages/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/storages/_request_list.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/src/apify/storages/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/README.md +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/_utils.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/actor_source_base/Dockerfile +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/actor_source_base/requirements.txt +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/actor_source_base/src/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/actor_source_base/src/__main__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/actor_source_base/src/main.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/conftest.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_api_helpers.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_call_timeouts.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_charge.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_dataset.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_events.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_key_value_store.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_lifecycle.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_log.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_request_queue.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_actor_scrapy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_fixtures.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/integration/test_request_queue.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_actor_dataset.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_actor_env_helpers.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_actor_helpers.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_actor_lifecycle.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_actor_log.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_actor_request_queue.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/actor/test_request_list.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/conftest.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/extensions/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/middlewares/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/pipelines/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/requests/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/utils/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/test_crypto.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/test_platform_event_manager.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/tests/unit/test_proxy_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/uv.lock +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/.eslintrc.json +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/babel.config.js +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/build_api_reference.sh +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/docusaurus.config.js +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/generate_module_shortcuts.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/sidebars.js +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/components/ApiLink.jsx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/components/Gradients.jsx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/components/Highlights.jsx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/components/Highlights.module.css +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/components/RunnableCodeBlock.jsx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/components/RunnableCodeBlock.module.css +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/css/custom.css +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/pages/home_page_example.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/pages/index.js +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/src/pages/index.module.css +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/static/.nojekyll +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/static/img/docs-og.png +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/tools/docs-prettier.config.js +0 -0
- {apify-2.6.1b7 → apify-2.6.1b9}/website/tools/utils/externalLink.js +0 -0
|
@@ -8,6 +8,11 @@ All notable changes to this project will be documented in this file.
|
|
|
8
8
|
### 🚀 Features
|
|
9
9
|
|
|
10
10
|
- 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)
|
|
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)
|
|
12
|
+
|
|
13
|
+
### 🐛 Bug Fixes
|
|
14
|
+
|
|
15
|
+
- Sync `@docusaurus` theme version [internal] ([#500](https://github.com/apify/apify-sdk-python/pull/500)) ([a7485e7](https://github.com/apify/apify-sdk-python/commit/a7485e7d2276fde464ce862573d5b95e7d4d836a)) by [@katzino](https://github.com/katzino)
|
|
11
16
|
|
|
12
17
|
|
|
13
18
|
<!-- git-cliff-unreleased-end -->
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from datetime import timedelta
|
|
5
|
+
|
|
6
|
+
EVENT_LISTENERS_TIMEOUT = timedelta(seconds=5)
|
|
7
|
+
|
|
8
|
+
BASE64_REGEXP = '[-A-Za-z0-9+/]*={0,3}'
|
|
9
|
+
ENCRYPTED_STRING_VALUE_PREFIX = 'ENCRYPTED_VALUE'
|
|
10
|
+
ENCRYPTED_JSON_VALUE_PREFIX = 'ENCRYPTED_JSON'
|
|
11
|
+
ENCRYPTED_INPUT_VALUE_REGEXP = re.compile(
|
|
12
|
+
f'^({ENCRYPTED_STRING_VALUE_PREFIX}|{ENCRYPTED_JSON_VALUE_PREFIX}):(?:({BASE64_REGEXP}):)?({BASE64_REGEXP}):({BASE64_REGEXP})$'
|
|
13
|
+
)
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import base64
|
|
4
4
|
import hashlib
|
|
5
5
|
import hmac
|
|
6
|
+
import json
|
|
6
7
|
import string
|
|
7
8
|
from typing import Any
|
|
8
9
|
|
|
@@ -14,7 +15,7 @@ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
|
|
14
15
|
from apify_shared.utils import ignore_docs
|
|
15
16
|
from crawlee._utils.crypto import crypto_random_object_id
|
|
16
17
|
|
|
17
|
-
from apify._consts import ENCRYPTED_INPUT_VALUE_REGEXP
|
|
18
|
+
from apify._consts import ENCRYPTED_INPUT_VALUE_REGEXP, ENCRYPTED_JSON_VALUE_PREFIX, ENCRYPTED_STRING_VALUE_PREFIX
|
|
18
19
|
|
|
19
20
|
ENCRYPTION_KEY_LENGTH = 32
|
|
20
21
|
ENCRYPTION_IV_LENGTH = 16
|
|
@@ -147,14 +148,20 @@ def decrypt_input_secrets(private_key: rsa.RSAPrivateKey, input_data: Any) -> An
|
|
|
147
148
|
if isinstance(value, str):
|
|
148
149
|
match = ENCRYPTED_INPUT_VALUE_REGEXP.fullmatch(value)
|
|
149
150
|
if match:
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
prefix = match.group(1)
|
|
152
|
+
encrypted_password = match.group(3)
|
|
153
|
+
encrypted_value = match.group(4)
|
|
154
|
+
decrypted_value = private_decrypt(
|
|
153
155
|
encrypted_password,
|
|
154
156
|
encrypted_value,
|
|
155
157
|
private_key=private_key,
|
|
156
158
|
)
|
|
157
159
|
|
|
160
|
+
if prefix == ENCRYPTED_STRING_VALUE_PREFIX:
|
|
161
|
+
input_data[key] = decrypted_value
|
|
162
|
+
elif prefix == ENCRYPTED_JSON_VALUE_PREFIX:
|
|
163
|
+
input_data[key] = json.loads(decrypted_value)
|
|
164
|
+
|
|
158
165
|
return input_data
|
|
159
166
|
|
|
160
167
|
|
|
@@ -9,7 +9,7 @@ from apify_shared.utils import json_dumps
|
|
|
9
9
|
|
|
10
10
|
from ..test_crypto import PRIVATE_KEY_PASSWORD, PRIVATE_KEY_PEM_BASE64, PUBLIC_KEY
|
|
11
11
|
from apify import Actor
|
|
12
|
-
from apify._consts import
|
|
12
|
+
from apify._consts import ENCRYPTED_JSON_VALUE_PREFIX, ENCRYPTED_STRING_VALUE_PREFIX
|
|
13
13
|
from apify._crypto import public_encrypt
|
|
14
14
|
|
|
15
15
|
if TYPE_CHECKING:
|
|
@@ -74,11 +74,42 @@ async def test_get_input_with_encrypted_secrets(
|
|
|
74
74
|
monkeypatch.setenv(ApifyEnvVars.INPUT_SECRETS_PRIVATE_KEY_PASSPHRASE, PRIVATE_KEY_PASSWORD)
|
|
75
75
|
|
|
76
76
|
input_key = 'INPUT'
|
|
77
|
+
secret_string_legacy = 'secret-string'
|
|
77
78
|
secret_string = 'secret-string'
|
|
78
|
-
|
|
79
|
+
secret_object = {'foo': 'bar', 'baz': 'qux'}
|
|
80
|
+
secret_array = ['foo', 'bar', 'baz']
|
|
81
|
+
|
|
82
|
+
# The legacy encryption format uses ENCRYPTED_STRING_VALUE_PREFIX prefix, value in raw string and does
|
|
83
|
+
# not include schemahash. The new format uses ENCRYPTED_JSON_VALUE_PREFIX prefix, value in JSON format
|
|
84
|
+
# and includes schemahash. We are testing both formats to ensure backward compatibility.
|
|
85
|
+
|
|
86
|
+
encrypted_string_legacy = public_encrypt(secret_string_legacy, public_key=PUBLIC_KEY)
|
|
87
|
+
encrypted_string = public_encrypt(json_dumps(secret_string), public_key=PUBLIC_KEY)
|
|
88
|
+
encrypted_object = public_encrypt(json_dumps(secret_object), public_key=PUBLIC_KEY)
|
|
89
|
+
encrypted_array = public_encrypt(json_dumps(secret_array), public_key=PUBLIC_KEY)
|
|
90
|
+
|
|
79
91
|
input_with_secret = {
|
|
80
92
|
'foo': 'bar',
|
|
81
|
-
'
|
|
93
|
+
'secret_string_legacy': (
|
|
94
|
+
f'{ENCRYPTED_STRING_VALUE_PREFIX}:'
|
|
95
|
+
f'{encrypted_string_legacy["encrypted_password"]}:'
|
|
96
|
+
f'{encrypted_string_legacy["encrypted_value"]}'
|
|
97
|
+
),
|
|
98
|
+
'secret_string': (
|
|
99
|
+
f'{ENCRYPTED_JSON_VALUE_PREFIX}:schemahash:'
|
|
100
|
+
f'{encrypted_string["encrypted_password"]}:'
|
|
101
|
+
f'{encrypted_string["encrypted_value"]}'
|
|
102
|
+
),
|
|
103
|
+
'secret_object': (
|
|
104
|
+
f'{ENCRYPTED_JSON_VALUE_PREFIX}:schemahash:'
|
|
105
|
+
f'{encrypted_object["encrypted_password"]}:'
|
|
106
|
+
f'{encrypted_object["encrypted_value"]}'
|
|
107
|
+
),
|
|
108
|
+
'secret_array': (
|
|
109
|
+
f'{ENCRYPTED_JSON_VALUE_PREFIX}:schemahash:'
|
|
110
|
+
f'{encrypted_array["encrypted_password"]}:'
|
|
111
|
+
f'{encrypted_array["encrypted_value"]}'
|
|
112
|
+
),
|
|
82
113
|
}
|
|
83
114
|
|
|
84
115
|
await memory_storage_client.key_value_stores().get_or_create(id='default')
|
|
@@ -91,4 +122,7 @@ async def test_get_input_with_encrypted_secrets(
|
|
|
91
122
|
async with Actor as my_actor:
|
|
92
123
|
input = await my_actor.get_input() # noqa: A001
|
|
93
124
|
assert input['foo'] == input_with_secret['foo']
|
|
94
|
-
assert input['
|
|
125
|
+
assert input['secret_string_legacy'] == secret_string_legacy
|
|
126
|
+
assert input['secret_string'] == secret_string
|
|
127
|
+
assert input['secret_object'] == secret_object
|
|
128
|
+
assert input['secret_array'] == secret_array
|