apify 2.6.1b7__tar.gz → 2.6.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.6.1b7 → apify-2.6.1b8}/CHANGELOG.md +1 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/PKG-INFO +1 -1
- {apify-2.6.1b7 → apify-2.6.1b8}/pyproject.toml +1 -1
- apify-2.6.1b8/src/apify/_consts.py +13 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_crypto.py +11 -4
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_key_value_store.py +38 -4
- apify-2.6.1b7/src/apify/_consts.py +0 -10
- {apify-2.6.1b7 → apify-2.6.1b8}/.editorconfig +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.github/CODEOWNERS +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/build_and_deploy_docs.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/check_pr_title.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/pre_release.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/release.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/run_code_checks.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/update_new_issue.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.gitignore +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.markdownlint.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/.pre-commit-config.yaml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/CONTRIBUTING.md +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/LICENSE +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/Makefile +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/README.md +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/01_introduction.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/02_running_actors_locally.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/03_actor_structure.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/01_introduction.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/actor_structure/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/actor_structure/__main__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/actor_structure/main.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/actor_structure/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/01_beautifulsoup_httpx.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/02_crawlee.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/03_playwright.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/04_selenium.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/05_scrapy.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/01_beautifulsoup_httpx.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/02_crawlee_beautifulsoup.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/02_crawlee_playwright.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/03_playwright.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/04_selenium.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/__main__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/items.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/main.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/settings.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/spiders/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/spiders/title.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/01_actor_lifecycle.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/02_actor_input.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/03_storages.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/04_actor_events.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/05_proxy_management.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/06_interacting_with_other_actors.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/07_webhooks.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/08_access_apify_api.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/09_running_webserver.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/10_logging.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/11_configuration.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/12_pay_per_event.mdx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/01_context_manager.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/01_init_exit.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/01_reboot.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/01_status_message.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/02_input.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_dataset_exports.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_dataset_read_write.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_deleting_storages.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_kvs_iterating.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_kvs_public_url.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_kvs_read_write.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_opening_storages.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_rq.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/04_actor_events.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_apify_proxy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_apify_proxy_config.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_custom_proxy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_custom_proxy_function.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_proxy_actor_input.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_proxy_httpx.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_proxy_rotation.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/06_interacting_call.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/06_interacting_call_task.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/06_interacting_metamorph.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/06_interacting_start.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/07_webhook.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/07_webhook_preventing.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/08_actor_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/08_actor_new_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/09_webserver.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/10_log_config.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/10_logger_usage.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/11_config.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/actor_charge.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/conditional_actor_charge.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/04_upgrading/upgrading_to_v2.md +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/docs/pyproject.toml +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/renovate.json +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_actor.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_charging.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_models.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_platform_event_manager.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_proxy_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_utils.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_apify_storage_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_dataset_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_dataset_collection_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_key_value_store_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_key_value_store_collection_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_request_queue_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_request_queue_collection_client.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/log.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/_actor_runner.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/_async_thread.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/_logging_config.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/extensions/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/extensions/_httpcache.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/middlewares/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/middlewares/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/pipelines/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/pipelines/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/requests.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/scheduler.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/utils.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/storages/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/storages/_request_list.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/storages/py.typed +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/README.md +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/_utils.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/Dockerfile +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/requirements.txt +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/src/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/src/__main__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/src/main.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/conftest.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_api_helpers.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_call_timeouts.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_charge.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_dataset.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_events.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_key_value_store.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_lifecycle.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_log.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_request_queue.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_scrapy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_fixtures.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_request_queue.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_dataset.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_env_helpers.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_helpers.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_lifecycle.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_log.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_request_queue.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_request_list.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/conftest.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/extensions/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/middlewares/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/pipelines/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/requests/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/utils/__init__.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/test_crypto.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/test_platform_event_manager.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/test_proxy_configuration.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/uv.lock +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/.eslintrc.json +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/babel.config.js +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/build_api_reference.sh +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/docusaurus.config.js +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/generate_module_shortcuts.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/package-lock.json +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/package.json +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/sidebars.js +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/ApiLink.jsx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/Gradients.jsx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/Highlights.jsx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/Highlights.module.css +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/RunnableCodeBlock.jsx +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/RunnableCodeBlock.module.css +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/css/custom.css +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/pages/home_page_example.py +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/pages/index.js +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/src/pages/index.module.css +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/static/.nojekyll +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/static/img/docs-og.png +0 -0
- {apify-2.6.1b7 → apify-2.6.1b8}/website/tools/docs-prettier.config.js +0 -0
- {apify-2.6.1b7 → apify-2.6.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
|
### 🚀 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)
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
<!-- 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
|
|
@@ -1,10 +0,0 @@
|
|
|
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_INPUT_VALUE_PREFIX = 'ENCRYPTED_VALUE'
|
|
10
|
-
ENCRYPTED_INPUT_VALUE_REGEXP = re.compile(f'^{ENCRYPTED_INPUT_VALUE_PREFIX}:({BASE64_REGEXP}):({BASE64_REGEXP})$')
|
|
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
|
|
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.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_dataset_collection_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_key_value_store_collection_client.py
RENAMED
|
File without changes
|
|
File without changes
|
{apify-2.6.1b7 → apify-2.6.1b8}/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
|
|
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
|