apify 3.0.0__tar.gz → 3.0.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-3.0.0 → apify-3.0.1}/.github/workflows/build_and_deploy_docs.yaml +1 -1
- {apify-3.0.0 → apify-3.0.1}/CHANGELOG.md +11 -169
- {apify-3.0.0 → apify-3.0.1}/PKG-INFO +2 -2
- {apify-3.0.0 → apify-3.0.1}/pyproject.toml +3 -3
- {apify-3.0.0 → apify-3.0.1}/src/apify/_configuration.py +9 -0
- apify-3.0.1/src/apify/storage_clients/_file_system/_key_value_store_client.py +103 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/storage_clients/test_file_system.py +23 -10
- {apify-3.0.0 → apify-3.0.1}/uv.lock +614 -503
- {apify-3.0.0 → apify-3.0.1}/website/package-lock.json +2484 -855
- {apify-3.0.0 → apify-3.0.1}/website/package.json +1 -1
- apify-3.0.0/src/apify/storage_clients/_file_system/_key_value_store_client.py +0 -57
- {apify-3.0.0 → apify-3.0.1}/.editorconfig +0 -0
- {apify-3.0.0 → apify-3.0.1}/.github/CODEOWNERS +0 -0
- {apify-3.0.0 → apify-3.0.1}/.github/workflows/check_pr_title.yaml +0 -0
- {apify-3.0.0 → apify-3.0.1}/.github/workflows/pre_release.yaml +0 -0
- {apify-3.0.0 → apify-3.0.1}/.github/workflows/release.yaml +0 -0
- {apify-3.0.0 → apify-3.0.1}/.github/workflows/run_code_checks.yaml +0 -0
- {apify-3.0.0 → apify-3.0.1}/.github/workflows/update_new_issue.yaml +0 -0
- {apify-3.0.0 → apify-3.0.1}/.gitignore +0 -0
- {apify-3.0.0 → apify-3.0.1}/.markdownlint.yaml +0 -0
- {apify-3.0.0 → apify-3.0.1}/.pre-commit-config.yaml +0 -0
- {apify-3.0.0 → apify-3.0.1}/CONTRIBUTING.md +0 -0
- {apify-3.0.0 → apify-3.0.1}/LICENSE +0 -0
- {apify-3.0.0 → apify-3.0.1}/Makefile +0 -0
- {apify-3.0.0 → apify-3.0.1}/README.md +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/01_overview/01_introduction.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/01_overview/02_running_actors_locally.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/01_overview/03_actor_structure.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/01_overview/code/01_introduction.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/01_overview/code/actor_structure/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/01_overview/code/actor_structure/__main__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/01_overview/code/actor_structure/main.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/01_overview/code/actor_structure/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/01_actor_lifecycle.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/02_actor_input.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/03_storages.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/04_actor_events.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/05_proxy_management.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/06_interacting_with_other_actors.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/07_webhooks.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/08_access_apify_api.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/09_running_webserver.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/10_logging.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/11_configuration.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/12_pay_per_event.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/01_context_manager.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/01_init_exit.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/01_reboot.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/01_status_message.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/02_input.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/03_dataset_exports.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/03_dataset_read_write.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/03_deleting_storages.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/03_kvs_iterating.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/03_kvs_public_url.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/03_kvs_read_write.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/03_opening_storages.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/03_rq.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/04_actor_events.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/05_apify_proxy.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/05_apify_proxy_config.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/05_custom_proxy.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/05_custom_proxy_function.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/05_proxy_actor_input.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/05_proxy_httpx.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/05_proxy_rotation.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/06_interacting_call.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/06_interacting_call_task.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/06_interacting_metamorph.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/06_interacting_start.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/07_webhook.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/07_webhook_preventing.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/08_actor_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/08_actor_new_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/09_webserver.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/10_log_config.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/10_logger_usage.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/10_redirect_log.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/10_redirect_log_existing_run.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/11_config.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/actor_charge.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/02_concepts/code/conditional_actor_charge.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/01_beautifulsoup_httpx.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/02_parsel_impit.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/03_playwright.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/04_selenium.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/05_crawlee.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/06_scrapy.mdx +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/01_beautifulsoup_httpx.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/02_parsel_impit.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/03_playwright.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/04_selenium.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/05_crawlee_beautifulsoup.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/05_crawlee_parsel.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/05_crawlee_playwright.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/scrapy_project/src/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/scrapy_project/src/__main__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/scrapy_project/src/items.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/scrapy_project/src/main.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/scrapy_project/src/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/scrapy_project/src/settings.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/scrapy_project/src/spiders/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/03_guides/code/scrapy_project/src/spiders/title.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/04_upgrading/upgrading_to_v2.md +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/04_upgrading/upgrading_to_v3.md +0 -0
- {apify-3.0.0 → apify-3.0.1}/docs/pyproject.toml +0 -0
- {apify-3.0.0 → apify-3.0.1}/renovate.json +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/_actor.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/_charging.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/_consts.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/_crypto.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/_models.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/_proxy_configuration.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/_utils.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/events/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/events/_apify_event_manager.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/events/_types.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/events/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/log.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/request_loaders/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/request_loaders/_apify_request_list.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/request_loaders/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/_actor_runner.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/_async_thread.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/_logging_config.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/extensions/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/extensions/_httpcache.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/middlewares/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/middlewares/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/pipelines/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/pipelines/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/requests.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/scheduler.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/scrapy/utils.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/_dataset_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/_key_value_store_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/_models.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/_request_queue_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/_request_queue_shared_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/_request_queue_single_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/_storage_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/_utils.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_apify/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_file_system/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_file_system/_storage_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_smart_apify/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/_smart_apify/_storage_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storage_clients/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storages/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/src/apify/storages/py.typed +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/README.md +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/_utils.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/actor_source_base/Dockerfile +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/actor_source_base/requirements.txt +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/actor_source_base/server.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/actor_source_base/src/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/actor_source_base/src/__main__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/actor_source_base/src/main.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/conftest.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_api_helpers.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_call_timeouts.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_charge.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_dataset.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_events.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_key_value_store.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_lifecycle.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_log.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_request_queue.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_actor_scrapy.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_apify_storages.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_crawlers_with_storages.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_fixtures.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/integration/test_request_queue.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_actor_dataset.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_actor_env_helpers.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_actor_helpers.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_actor_key_value_store.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_actor_lifecycle.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_actor_log.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_actor_request_queue.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_configuration.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/actor/test_request_list.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/conftest.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/events/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/events/test_apify_event_manager.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/extensions/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/middlewares/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/pipelines/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/requests/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/utils/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/storage_clients/__init__.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/storage_clients/test_apify_request_queue_client.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/test_apify_storages.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/test_crypto.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/tests/unit/test_proxy_configuration.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/.eslintrc.json +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/babel.config.js +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/build_api_reference.sh +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/docusaurus.config.js +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/generate_module_shortcuts.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/sidebars.js +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/components/ApiLink.jsx +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/components/Gradients.jsx +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/components/Highlights.jsx +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/components/Highlights.module.css +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/components/RunnableCodeBlock.jsx +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/components/RunnableCodeBlock.module.css +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/css/custom.css +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/pages/home_page_example.py +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/pages/index.js +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/pages/index.module.css +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/src/theme/DocItem/Content/index.js +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/static/.nojekyll +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/static/img/docs-og.png +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/static/img/guides/redirected_logs_example.webp +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/tools/docs-prettier.config.js +0 -0
- {apify-3.0.0 → apify-3.0.1}/website/tools/utils/externalLink.js +0 -0
|
@@ -2,8 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [3.0.1](https://github.com/apify/apify-sdk-python/releases/tag/v3.0.1) (2025-10-08)
|
|
6
|
+
|
|
7
|
+
### 🐛 Bug Fixes
|
|
8
|
+
|
|
9
|
+
- Also load input from a file with a .json extension in file system storage ([#617](https://github.com/apify/apify-sdk-python/pull/617)) ([b62804c](https://github.com/apify/apify-sdk-python/commit/b62804c170069cd7aa77572bb9682a156581cbac)) by [@janbuchar](https://github.com/janbuchar)
|
|
10
|
+
|
|
11
|
+
|
|
5
12
|
## [3.0.0](https://github.com/apify/apify-sdk-python/releases/tag/v3.0.0) (2025-09-29)
|
|
6
13
|
|
|
14
|
+
- Check out the [Upgrading guide](https://docs.apify.com/sdk/python/docs/upgrading/upgrading-to-v3) to ensure a smooth update.
|
|
15
|
+
|
|
7
16
|
### 🚀 Features
|
|
8
17
|
|
|
9
18
|
- Add deduplication to `add_batch_of_requests` ([#534](https://github.com/apify/apify-sdk-python/pull/534)) ([dd03c4d](https://github.com/apify/apify-sdk-python/commit/dd03c4d446f611492adf35f1b5738648ee5a66f7)) by [@Pijukatel](https://github.com/Pijukatel), closes [#514](https://github.com/apify/apify-sdk-python/issues/514)
|
|
@@ -33,175 +42,6 @@ All notable changes to this project will be documented in this file.
|
|
|
33
42
|
- [**breaking**] Make default Apify storages use alias mechanism ([#606](https://github.com/apify/apify-sdk-python/pull/606)) ([dbea7d9](https://github.com/apify/apify-sdk-python/commit/dbea7d97fe7f25aa8658a32c5bb46a3800561df5)) by [@Pijukatel](https://github.com/Pijukatel), closes [#599](https://github.com/apify/apify-sdk-python/issues/599)
|
|
34
43
|
|
|
35
44
|
|
|
36
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
37
|
-
|
|
38
|
-
### 🚀 Features
|
|
39
|
-
|
|
40
|
-
- **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)
|
|
41
|
-
|
|
42
|
-
### 🐛 Bug Fixes
|
|
43
|
-
|
|
44
|
-
- 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)
|
|
45
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
49
|
-
|
|
50
|
-
### 🚀 Features
|
|
51
|
-
|
|
52
|
-
- **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)
|
|
53
|
-
|
|
54
|
-
### 🐛 Bug Fixes
|
|
55
|
-
|
|
56
|
-
- 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)
|
|
57
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
61
|
-
|
|
62
|
-
### 🚀 Features
|
|
63
|
-
|
|
64
|
-
- **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)
|
|
65
|
-
|
|
66
|
-
### 🐛 Bug Fixes
|
|
67
|
-
|
|
68
|
-
- 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)
|
|
69
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
73
|
-
|
|
74
|
-
### 🚀 Features
|
|
75
|
-
|
|
76
|
-
- **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)
|
|
77
|
-
|
|
78
|
-
### 🐛 Bug Fixes
|
|
79
|
-
|
|
80
|
-
- 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)
|
|
81
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
85
|
-
|
|
86
|
-
### 🚀 Features
|
|
87
|
-
|
|
88
|
-
- **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)
|
|
89
|
-
|
|
90
|
-
### 🐛 Bug Fixes
|
|
91
|
-
|
|
92
|
-
- 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)
|
|
93
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
97
|
-
|
|
98
|
-
### 🚀 Features
|
|
99
|
-
|
|
100
|
-
- **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)
|
|
101
|
-
|
|
102
|
-
### 🐛 Bug Fixes
|
|
103
|
-
|
|
104
|
-
- 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)
|
|
105
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
109
|
-
|
|
110
|
-
### 🚀 Features
|
|
111
|
-
|
|
112
|
-
- **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)
|
|
113
|
-
|
|
114
|
-
### 🐛 Bug Fixes
|
|
115
|
-
|
|
116
|
-
- 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)
|
|
117
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
121
|
-
|
|
122
|
-
### 🚀 Features
|
|
123
|
-
|
|
124
|
-
- **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)
|
|
125
|
-
|
|
126
|
-
### 🐛 Bug Fixes
|
|
127
|
-
|
|
128
|
-
- 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)
|
|
129
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
133
|
-
|
|
134
|
-
### 🚀 Features
|
|
135
|
-
|
|
136
|
-
- **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)
|
|
137
|
-
|
|
138
|
-
### 🐛 Bug Fixes
|
|
139
|
-
|
|
140
|
-
- 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)
|
|
141
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
145
|
-
|
|
146
|
-
### 🚀 Features
|
|
147
|
-
|
|
148
|
-
- **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)
|
|
149
|
-
|
|
150
|
-
### 🐛 Bug Fixes
|
|
151
|
-
|
|
152
|
-
- 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)
|
|
153
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
157
|
-
|
|
158
|
-
### 🚀 Features
|
|
159
|
-
|
|
160
|
-
- **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)
|
|
161
|
-
|
|
162
|
-
### 🐛 Bug Fixes
|
|
163
|
-
|
|
164
|
-
- 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)
|
|
165
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
169
|
-
|
|
170
|
-
### 🚀 Features
|
|
171
|
-
|
|
172
|
-
- **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)
|
|
173
|
-
|
|
174
|
-
### 🐛 Bug Fixes
|
|
175
|
-
|
|
176
|
-
- 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)
|
|
177
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
181
|
-
|
|
182
|
-
### 🚀 Features
|
|
183
|
-
|
|
184
|
-
- **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)
|
|
185
|
-
|
|
186
|
-
### 🐛 Bug Fixes
|
|
187
|
-
|
|
188
|
-
- 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)
|
|
189
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
|
|
193
|
-
|
|
194
|
-
### 🚀 Features
|
|
195
|
-
|
|
196
|
-
- **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)
|
|
197
|
-
|
|
198
|
-
### 🐛 Bug Fixes
|
|
199
|
-
|
|
200
|
-
- 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)
|
|
201
|
-
- Tagline overlap ([#501](https://github.com/apify/apify-sdk-python/pull/501)) ([bae8340](https://github.com/apify/apify-sdk-python/commit/bae8340c46fea756ea35ea4d591da84c09d478e2)) by [@katzino](https://github.com/katzino)
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
45
|
## [2.7.3](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.3) (2025-08-11)
|
|
206
46
|
|
|
207
47
|
### 🐛 Bug Fixes
|
|
@@ -341,6 +181,8 @@ All notable changes to this project will be documented in this file.
|
|
|
341
181
|
|
|
342
182
|
## [2.0.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.0.0) (2024-09-10)
|
|
343
183
|
|
|
184
|
+
- Check out the [Upgrading guide](https://docs.apify.com/sdk/python/docs/upgrading/upgrading-to-v2) to ensure a smooth update.
|
|
185
|
+
|
|
344
186
|
### 🚀 Features
|
|
345
187
|
|
|
346
188
|
- Better Actor API typing ([#256](https://github.com/apify/apify-sdk-python/pull/256)) ([abb87e7](https://github.com/apify/apify-sdk-python/commit/abb87e7f3c272f88a9a76292d8394fe93b98428a)) by [@janbuchar](https://github.com/janbuchar), closes [#243](https://github.com/apify/apify-sdk-python/issues/243)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apify
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.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
|
|
@@ -228,7 +228,7 @@ Requires-Python: >=3.10
|
|
|
228
228
|
Requires-Dist: apify-client<3.0.0,>=2.0.0
|
|
229
229
|
Requires-Dist: apify-shared<3.0.0,>=2.0.0
|
|
230
230
|
Requires-Dist: cachetools>=5.5.0
|
|
231
|
-
Requires-Dist: crawlee<2.0.0,>=1.0.
|
|
231
|
+
Requires-Dist: crawlee<2.0.0,>=1.0.2
|
|
232
232
|
Requires-Dist: cryptography>=42.0.0
|
|
233
233
|
Requires-Dist: impit>=0.6.1
|
|
234
234
|
Requires-Dist: lazy-object-proxy>=1.11.0
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "apify"
|
|
7
|
-
version = "3.0.
|
|
7
|
+
version = "3.0.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" }
|
|
@@ -36,7 +36,7 @@ keywords = [
|
|
|
36
36
|
dependencies = [
|
|
37
37
|
"apify-client>=2.0.0,<3.0.0",
|
|
38
38
|
"apify-shared>=2.0.0,<3.0.0",
|
|
39
|
-
"crawlee>=1.0.
|
|
39
|
+
"crawlee>=1.0.2,<2.0.0",
|
|
40
40
|
"cachetools>=5.5.0",
|
|
41
41
|
"cryptography>=42.0.0",
|
|
42
42
|
"impit>=0.6.1",
|
|
@@ -75,7 +75,7 @@ dev = [
|
|
|
75
75
|
"pytest-timeout~=2.4.0",
|
|
76
76
|
"pytest-xdist~=3.8.0",
|
|
77
77
|
"pytest~=8.4.0",
|
|
78
|
-
"ruff~=0.
|
|
78
|
+
"ruff~=0.14.0",
|
|
79
79
|
"setuptools", # setuptools are used by pytest but not explicitly required
|
|
80
80
|
"types-cachetools~=6.2.0.20250827",
|
|
81
81
|
"uvicorn[standard]",
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from datetime import datetime, timedelta
|
|
4
4
|
from decimal import Decimal
|
|
5
5
|
from logging import getLogger
|
|
6
|
+
from pathlib import Path
|
|
6
7
|
from typing import Annotated, Any
|
|
7
8
|
|
|
8
9
|
from pydantic import AliasChoices, BeforeValidator, Field, model_validator
|
|
@@ -421,6 +422,14 @@ class Configuration(CrawleeConfiguration):
|
|
|
421
422
|
logger.warning('Actor is running on the Apify platform, `disable_browser_sandbox` was changed to True.')
|
|
422
423
|
return self
|
|
423
424
|
|
|
425
|
+
@property
|
|
426
|
+
def canonical_input_key(self) -> str:
|
|
427
|
+
return str(Path(self.input_key).with_suffix('.json'))
|
|
428
|
+
|
|
429
|
+
@property
|
|
430
|
+
def input_key_candidates(self) -> set[str]:
|
|
431
|
+
return {self.input_key, self.canonical_input_key, Path(self.canonical_input_key).stem}
|
|
432
|
+
|
|
424
433
|
@classmethod
|
|
425
434
|
def get_global_configuration(cls) -> Configuration:
|
|
426
435
|
"""Retrieve the global instance of the configuration.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from more_itertools import flatten
|
|
6
|
+
from typing_extensions import Self, override
|
|
7
|
+
|
|
8
|
+
from crawlee._consts import METADATA_FILENAME
|
|
9
|
+
from crawlee.configuration import Configuration as CrawleeConfiguration
|
|
10
|
+
from crawlee.storage_clients._file_system import FileSystemKeyValueStoreClient
|
|
11
|
+
from crawlee.storage_clients.models import KeyValueStoreRecord
|
|
12
|
+
|
|
13
|
+
from apify._configuration import Configuration
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ApifyFileSystemKeyValueStoreClient(FileSystemKeyValueStoreClient):
|
|
19
|
+
"""Apify-specific implementation of the `FileSystemKeyValueStoreClient`.
|
|
20
|
+
|
|
21
|
+
The only difference is that it overrides the `purge` method to delete all files in the key-value store
|
|
22
|
+
directory, except for the metadata file and the `INPUT.json` file.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
@override
|
|
26
|
+
@classmethod
|
|
27
|
+
async def open(
|
|
28
|
+
cls,
|
|
29
|
+
*,
|
|
30
|
+
id: str | None,
|
|
31
|
+
name: str | None,
|
|
32
|
+
alias: str | None,
|
|
33
|
+
configuration: CrawleeConfiguration,
|
|
34
|
+
) -> Self:
|
|
35
|
+
client = await super().open(id=id, name=name, alias=alias, configuration=configuration)
|
|
36
|
+
|
|
37
|
+
await client._sanitize_input_json_files() # noqa: SLF001 - it's okay, this is a factory method
|
|
38
|
+
|
|
39
|
+
return client
|
|
40
|
+
|
|
41
|
+
@override
|
|
42
|
+
async def purge(self) -> None:
|
|
43
|
+
"""Purges the key-value store by deleting all its contents.
|
|
44
|
+
|
|
45
|
+
It deletes all files in the key-value store directory, except for the metadata file and
|
|
46
|
+
the `INPUT.json` file. It also updates the metadata to reflect that the store has been purged.
|
|
47
|
+
"""
|
|
48
|
+
configuration = Configuration.get_global_configuration()
|
|
49
|
+
|
|
50
|
+
async with self._lock:
|
|
51
|
+
files_to_keep = set(
|
|
52
|
+
flatten([key, f'{key}.{METADATA_FILENAME}'] for key in configuration.input_key_candidates)
|
|
53
|
+
)
|
|
54
|
+
files_to_keep.add(METADATA_FILENAME)
|
|
55
|
+
|
|
56
|
+
for file_path in self.path_to_kvs.glob('*'):
|
|
57
|
+
if file_path.name in files_to_keep:
|
|
58
|
+
continue
|
|
59
|
+
if file_path.is_file():
|
|
60
|
+
await asyncio.to_thread(file_path.unlink, missing_ok=True)
|
|
61
|
+
|
|
62
|
+
await self._update_metadata(
|
|
63
|
+
update_accessed_at=True,
|
|
64
|
+
update_modified_at=True,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
async def _sanitize_input_json_files(self) -> None:
|
|
68
|
+
"""Handle missing metadata for input files."""
|
|
69
|
+
configuration = Configuration.get_global_configuration()
|
|
70
|
+
alternative_keys = configuration.input_key_candidates - {configuration.canonical_input_key}
|
|
71
|
+
|
|
72
|
+
if (self.path_to_kvs / configuration.canonical_input_key).exists():
|
|
73
|
+
# Refresh metadata to prevent inconsistencies
|
|
74
|
+
input_data = await asyncio.to_thread(
|
|
75
|
+
lambda: json.loads((self.path_to_kvs / configuration.canonical_input_key).read_text())
|
|
76
|
+
)
|
|
77
|
+
await self.set_value(key=configuration.canonical_input_key, value=input_data)
|
|
78
|
+
|
|
79
|
+
for alternative_key in alternative_keys:
|
|
80
|
+
if (alternative_input_file := self.path_to_kvs / alternative_key).exists():
|
|
81
|
+
logger.warning(f'Redundant input file found: {alternative_input_file}')
|
|
82
|
+
else:
|
|
83
|
+
for alternative_key in alternative_keys:
|
|
84
|
+
alternative_input_file = self.path_to_kvs / alternative_key
|
|
85
|
+
|
|
86
|
+
# Only process files that actually exist
|
|
87
|
+
if alternative_input_file.exists():
|
|
88
|
+
# Refresh metadata to prevent inconsistencies
|
|
89
|
+
with alternative_input_file.open() as f:
|
|
90
|
+
input_data = await asyncio.to_thread(lambda: json.load(f))
|
|
91
|
+
await self.set_value(key=alternative_key, value=input_data)
|
|
92
|
+
|
|
93
|
+
@override
|
|
94
|
+
async def get_value(self, *, key: str) -> KeyValueStoreRecord | None:
|
|
95
|
+
configuration = Configuration.get_global_configuration()
|
|
96
|
+
|
|
97
|
+
if key in configuration.input_key_candidates:
|
|
98
|
+
for candidate in configuration.input_key_candidates:
|
|
99
|
+
value = await super().get_value(key=candidate)
|
|
100
|
+
if value is not None:
|
|
101
|
+
return value
|
|
102
|
+
|
|
103
|
+
return await super().get_value(key=key)
|
|
@@ -2,16 +2,16 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import json
|
|
5
|
-
from
|
|
5
|
+
from pathlib import Path
|
|
6
6
|
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from crawlee import service_locator
|
|
7
10
|
from crawlee._consts import METADATA_FILENAME
|
|
8
11
|
|
|
9
12
|
from apify import Actor, Configuration
|
|
10
13
|
from apify.storage_clients._file_system import ApifyFileSystemKeyValueStoreClient
|
|
11
14
|
|
|
12
|
-
if TYPE_CHECKING:
|
|
13
|
-
from pathlib import Path
|
|
14
|
-
|
|
15
15
|
|
|
16
16
|
async def test_purge_preserves_input_file_and_metadata() -> None:
|
|
17
17
|
"""Test that purge() preserves INPUT.json and metadata files but removes other files."""
|
|
@@ -61,19 +61,32 @@ async def test_purge_preserves_input_file_and_metadata() -> None:
|
|
|
61
61
|
|
|
62
62
|
# Verify INPUT.json content is unchanged
|
|
63
63
|
input_content = await asyncio.to_thread(input_file.read_text)
|
|
64
|
-
assert input_content == '{"test": "input"}'
|
|
64
|
+
assert json.loads(input_content) == json.loads('{"test": "input"}')
|
|
65
|
+
|
|
65
66
|
|
|
67
|
+
@pytest.mark.parametrize('input_file_name', ['INPUT', 'INPUT.json'])
|
|
68
|
+
async def test_pre_existing_input_used_by_actor(input_file_name: str) -> None:
|
|
69
|
+
configuration = Configuration()
|
|
70
|
+
service_locator.set_configuration(configuration)
|
|
71
|
+
|
|
72
|
+
# Create key-value store directory and make sure that it is empty
|
|
73
|
+
path_to_input = Path(configuration.storage_dir) / 'key_value_stores' / 'default'
|
|
74
|
+
path_to_input.mkdir(parents=True)
|
|
75
|
+
assert list(path_to_input.glob('*')) == []
|
|
66
76
|
|
|
67
|
-
async def test_pre_existing_input_used_by_actor(tmp_path: Path) -> None:
|
|
68
77
|
pre_existing_input = {
|
|
69
78
|
'foo': 'bar',
|
|
70
79
|
}
|
|
71
80
|
|
|
72
|
-
configuration = Configuration.get_global_configuration()
|
|
73
81
|
# Create pre-existing INPUT.json file
|
|
74
|
-
path_to_input
|
|
75
|
-
path_to_input.mkdir(parents=True)
|
|
76
|
-
(path_to_input / f'{configuration.input_key}.json').write_text(json.dumps(pre_existing_input))
|
|
82
|
+
(path_to_input / input_file_name).write_text(json.dumps(pre_existing_input))
|
|
77
83
|
|
|
78
84
|
async with Actor():
|
|
79
85
|
assert pre_existing_input == await Actor.get_input()
|
|
86
|
+
|
|
87
|
+
# Make sure that the input file doesn't get renamed in the process and metadata are added
|
|
88
|
+
assert set(path_to_input.glob('*')) == {
|
|
89
|
+
path_to_input / '__metadata__.json',
|
|
90
|
+
path_to_input / input_file_name,
|
|
91
|
+
path_to_input / f'{input_file_name}.__metadata__.json',
|
|
92
|
+
}
|