apify 2.7.1b7__tar.gz → 2.7.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.

Files changed (239) hide show
  1. {apify-2.7.1b7 → apify-2.7.1b8}/.github/workflows/run_code_checks.yaml +0 -1
  2. {apify-2.7.1b7 → apify-2.7.1b8}/CHANGELOG.md +123 -0
  3. {apify-2.7.1b7 → apify-2.7.1b8}/Makefile +3 -3
  4. {apify-2.7.1b7 → apify-2.7.1b8}/PKG-INFO +7 -5
  5. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/03_dataset_exports.py +2 -2
  6. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/03_rq.py +1 -4
  7. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/conditional_actor_charge.py +2 -2
  8. {apify-2.7.1b7 → apify-2.7.1b8}/docs/04_upgrading/upgrading_to_v2.md +2 -2
  9. apify-2.7.1b8/docs/04_upgrading/upgrading_to_v3.md +18 -0
  10. {apify-2.7.1b7 → apify-2.7.1b8}/pyproject.toml +22 -17
  11. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/_actor.py +6 -7
  12. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/_configuration.py +33 -0
  13. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/_proxy_configuration.py +8 -5
  14. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/_utils.py +9 -1
  15. apify-2.7.1b8/src/apify/events/__init__.py +5 -0
  16. apify-2.7.1b8/src/apify/events/_apify_event_manager.py +140 -0
  17. apify-2.7.1b8/src/apify/events/_types.py +102 -0
  18. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/log.py +0 -7
  19. apify-2.7.1b8/src/apify/request_loaders/__init__.py +18 -0
  20. apify-2.7.1b7/src/apify/storages/_request_list.py → apify-2.7.1b8/src/apify/request_loaders/_apify_request_list.py +22 -15
  21. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/_logging_config.py +1 -4
  22. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/extensions/_httpcache.py +9 -5
  23. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/requests.py +3 -3
  24. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/scheduler.py +8 -5
  25. apify-2.7.1b8/src/apify/storage_clients/__init__.py +10 -0
  26. apify-2.7.1b8/src/apify/storage_clients/_apify/__init__.py +11 -0
  27. apify-2.7.1b8/src/apify/storage_clients/_apify/_dataset_client.py +304 -0
  28. apify-2.7.1b8/src/apify/storage_clients/_apify/_key_value_store_client.py +241 -0
  29. apify-2.7.1b8/src/apify/storage_clients/_apify/_models.py +107 -0
  30. apify-2.7.1b8/src/apify/storage_clients/_apify/_request_queue_client.py +787 -0
  31. apify-2.7.1b8/src/apify/storage_clients/_apify/_storage_client.py +80 -0
  32. apify-2.7.1b8/src/apify/storage_clients/_file_system/__init__.py +2 -0
  33. apify-2.7.1b8/src/apify/storage_clients/_file_system/_key_value_store_client.py +36 -0
  34. apify-2.7.1b8/src/apify/storage_clients/_file_system/_storage_client.py +35 -0
  35. apify-2.7.1b8/src/apify/storages/__init__.py +3 -0
  36. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/actor_source_base/Dockerfile +4 -0
  37. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/actor_source_base/requirements.txt +1 -1
  38. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/conftest.py +7 -21
  39. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_api_helpers.py +4 -6
  40. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_dataset.py +4 -3
  41. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_key_value_store.py +17 -15
  42. apify-2.7.1b8/tests/integration/test_actor_request_queue.py +320 -0
  43. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_crawlers_with_storages.py +1 -3
  44. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_request_queue.py +22 -25
  45. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_actor_create_proxy_configuration.py +2 -2
  46. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_actor_dataset.py +5 -30
  47. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_actor_env_helpers.py +3 -27
  48. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_actor_key_value_store.py +25 -45
  49. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_actor_lifecycle.py +1 -1
  50. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_actor_request_queue.py +3 -4
  51. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_request_list.py +7 -6
  52. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/conftest.py +14 -33
  53. apify-2.7.1b7/tests/unit/test_platform_event_manager.py → apify-2.7.1b8/tests/unit/events/test_apify_event_manager.py +8 -7
  54. apify-2.7.1b8/tests/unit/scrapy/pipelines/__init__.py +0 -0
  55. apify-2.7.1b8/tests/unit/scrapy/requests/__init__.py +0 -0
  56. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -2
  57. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/scrapy/requests/test_to_scrapy_request.py +6 -10
  58. apify-2.7.1b8/tests/unit/scrapy/utils/__init__.py +0 -0
  59. apify-2.7.1b8/tests/unit/storage_clients/__init__.py +0 -0
  60. apify-2.7.1b8/tests/unit/storage_clients/test_apify_request_queue_client.py +38 -0
  61. apify-2.7.1b8/tests/unit/storage_clients/test_file_system.py +55 -0
  62. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/test_proxy_configuration.py +13 -7
  63. {apify-2.7.1b7 → apify-2.7.1b8}/uv.lock +423 -652
  64. {apify-2.7.1b7 → apify-2.7.1b8}/website/package-lock.json +627 -592
  65. {apify-2.7.1b7 → apify-2.7.1b8}/website/sidebars.js +4 -4
  66. apify-2.7.1b8/website/static/.nojekyll +0 -0
  67. apify-2.7.1b7/src/apify/_platform_event_manager.py +0 -215
  68. apify-2.7.1b7/src/apify/apify_storage_client/__init__.py +0 -3
  69. apify-2.7.1b7/src/apify/apify_storage_client/_apify_storage_client.py +0 -72
  70. apify-2.7.1b7/src/apify/apify_storage_client/_dataset_client.py +0 -190
  71. apify-2.7.1b7/src/apify/apify_storage_client/_dataset_collection_client.py +0 -51
  72. apify-2.7.1b7/src/apify/apify_storage_client/_key_value_store_client.py +0 -109
  73. apify-2.7.1b7/src/apify/apify_storage_client/_key_value_store_collection_client.py +0 -51
  74. apify-2.7.1b7/src/apify/apify_storage_client/_request_queue_client.py +0 -176
  75. apify-2.7.1b7/src/apify/apify_storage_client/_request_queue_collection_client.py +0 -51
  76. apify-2.7.1b7/src/apify/storages/__init__.py +0 -5
  77. apify-2.7.1b7/tests/integration/test_actor_request_queue.py +0 -88
  78. {apify-2.7.1b7 → apify-2.7.1b8}/.editorconfig +0 -0
  79. {apify-2.7.1b7 → apify-2.7.1b8}/.github/CODEOWNERS +0 -0
  80. {apify-2.7.1b7 → apify-2.7.1b8}/.github/workflows/build_and_deploy_docs.yaml +0 -0
  81. {apify-2.7.1b7 → apify-2.7.1b8}/.github/workflows/check_pr_title.yaml +0 -0
  82. {apify-2.7.1b7 → apify-2.7.1b8}/.github/workflows/pre_release.yaml +0 -0
  83. {apify-2.7.1b7 → apify-2.7.1b8}/.github/workflows/release.yaml +0 -0
  84. {apify-2.7.1b7 → apify-2.7.1b8}/.github/workflows/update_new_issue.yaml +0 -0
  85. {apify-2.7.1b7 → apify-2.7.1b8}/.gitignore +0 -0
  86. {apify-2.7.1b7 → apify-2.7.1b8}/.markdownlint.yaml +0 -0
  87. {apify-2.7.1b7 → apify-2.7.1b8}/.pre-commit-config.yaml +0 -0
  88. {apify-2.7.1b7 → apify-2.7.1b8}/CONTRIBUTING.md +0 -0
  89. {apify-2.7.1b7 → apify-2.7.1b8}/LICENSE +0 -0
  90. {apify-2.7.1b7 → apify-2.7.1b8}/README.md +0 -0
  91. {apify-2.7.1b7 → apify-2.7.1b8}/docs/01_overview/01_introduction.mdx +0 -0
  92. {apify-2.7.1b7 → apify-2.7.1b8}/docs/01_overview/02_running_actors_locally.mdx +0 -0
  93. {apify-2.7.1b7 → apify-2.7.1b8}/docs/01_overview/03_actor_structure.mdx +0 -0
  94. {apify-2.7.1b7 → apify-2.7.1b8}/docs/01_overview/code/01_introduction.py +0 -0
  95. {apify-2.7.1b7 → apify-2.7.1b8}/docs/01_overview/code/actor_structure/__init__.py +0 -0
  96. {apify-2.7.1b7 → apify-2.7.1b8}/docs/01_overview/code/actor_structure/__main__.py +0 -0
  97. {apify-2.7.1b7 → apify-2.7.1b8}/docs/01_overview/code/actor_structure/main.py +0 -0
  98. {apify-2.7.1b7 → apify-2.7.1b8}/docs/01_overview/code/actor_structure/py.typed +0 -0
  99. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/01_beautifulsoup_httpx.mdx +0 -0
  100. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/02_crawlee.mdx +0 -0
  101. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/03_playwright.mdx +0 -0
  102. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/04_selenium.mdx +0 -0
  103. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/05_scrapy.mdx +0 -0
  104. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/01_beautifulsoup_httpx.py +0 -0
  105. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/02_crawlee_beautifulsoup.py +0 -0
  106. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/02_crawlee_playwright.py +0 -0
  107. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/03_playwright.py +0 -0
  108. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/04_selenium.py +0 -0
  109. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/scrapy_project/src/__init__.py +0 -0
  110. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/scrapy_project/src/__main__.py +0 -0
  111. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/scrapy_project/src/items.py +0 -0
  112. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/scrapy_project/src/main.py +0 -0
  113. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/scrapy_project/src/py.typed +0 -0
  114. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/scrapy_project/src/settings.py +0 -0
  115. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
  116. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/scrapy_project/src/spiders/py.typed +0 -0
  117. {apify-2.7.1b7 → apify-2.7.1b8}/docs/02_guides/code/scrapy_project/src/spiders/title.py +0 -0
  118. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/01_actor_lifecycle.mdx +0 -0
  119. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/02_actor_input.mdx +0 -0
  120. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/03_storages.mdx +0 -0
  121. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/04_actor_events.mdx +0 -0
  122. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/05_proxy_management.mdx +0 -0
  123. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/06_interacting_with_other_actors.mdx +0 -0
  124. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/07_webhooks.mdx +0 -0
  125. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/08_access_apify_api.mdx +0 -0
  126. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/09_running_webserver.mdx +0 -0
  127. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/10_logging.mdx +0 -0
  128. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/11_configuration.mdx +0 -0
  129. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/12_pay_per_event.mdx +0 -0
  130. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/01_context_manager.py +0 -0
  131. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/01_init_exit.py +0 -0
  132. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/01_reboot.py +0 -0
  133. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/01_status_message.py +0 -0
  134. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/02_input.py +0 -0
  135. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/03_dataset_read_write.py +0 -0
  136. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/03_deleting_storages.py +0 -0
  137. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/03_kvs_iterating.py +0 -0
  138. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/03_kvs_public_url.py +0 -0
  139. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/03_kvs_read_write.py +0 -0
  140. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/03_opening_storages.py +0 -0
  141. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/04_actor_events.py +0 -0
  142. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/05_apify_proxy.py +0 -0
  143. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/05_apify_proxy_config.py +0 -0
  144. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/05_custom_proxy.py +0 -0
  145. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/05_custom_proxy_function.py +0 -0
  146. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/05_proxy_actor_input.py +0 -0
  147. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/05_proxy_httpx.py +0 -0
  148. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/05_proxy_rotation.py +0 -0
  149. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/06_interacting_call.py +0 -0
  150. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/06_interacting_call_task.py +0 -0
  151. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/06_interacting_metamorph.py +0 -0
  152. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/06_interacting_start.py +0 -0
  153. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/07_webhook.py +0 -0
  154. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/07_webhook_preventing.py +0 -0
  155. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/08_actor_client.py +0 -0
  156. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/08_actor_new_client.py +0 -0
  157. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/09_webserver.py +0 -0
  158. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/10_log_config.py +0 -0
  159. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/10_logger_usage.py +0 -0
  160. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/10_redirect_log.py +0 -0
  161. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/10_redirect_log_existing_run.py +0 -0
  162. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/11_config.py +0 -0
  163. {apify-2.7.1b7 → apify-2.7.1b8}/docs/03_concepts/code/actor_charge.py +0 -0
  164. {apify-2.7.1b7 → apify-2.7.1b8}/docs/pyproject.toml +0 -0
  165. {apify-2.7.1b7 → apify-2.7.1b8}/renovate.json +0 -0
  166. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/__init__.py +0 -0
  167. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/_charging.py +0 -0
  168. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/_consts.py +0 -0
  169. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/_crypto.py +0 -0
  170. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/_models.py +0 -0
  171. {apify-2.7.1b7/src/apify/apify_storage_client → apify-2.7.1b8/src/apify/events}/py.typed +0 -0
  172. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/py.typed +0 -0
  173. {apify-2.7.1b7/src/apify/scrapy/middlewares → apify-2.7.1b8/src/apify/request_loaders}/py.typed +0 -0
  174. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/__init__.py +0 -0
  175. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/_actor_runner.py +0 -0
  176. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/_async_thread.py +0 -0
  177. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/extensions/__init__.py +0 -0
  178. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/middlewares/__init__.py +0 -0
  179. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
  180. {apify-2.7.1b7/src/apify/scrapy/pipelines → apify-2.7.1b8/src/apify/scrapy/middlewares}/py.typed +0 -0
  181. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/pipelines/__init__.py +0 -0
  182. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
  183. {apify-2.7.1b7/src/apify/scrapy → apify-2.7.1b8/src/apify/scrapy/pipelines}/py.typed +0 -0
  184. {apify-2.7.1b7/src/apify/storages → apify-2.7.1b8/src/apify/scrapy}/py.typed +0 -0
  185. {apify-2.7.1b7 → apify-2.7.1b8}/src/apify/scrapy/utils.py +0 -0
  186. /apify-2.7.1b7/tests/integration/__init__.py → /apify-2.7.1b8/src/apify/storage_clients/_apify/py.typed +0 -0
  187. /apify-2.7.1b7/tests/integration/actor_source_base/src/__init__.py → /apify-2.7.1b8/src/apify/storage_clients/py.typed +0 -0
  188. /apify-2.7.1b7/tests/unit/__init__.py → /apify-2.7.1b8/src/apify/storages/py.typed +0 -0
  189. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/README.md +0 -0
  190. {apify-2.7.1b7/tests/unit/actor → apify-2.7.1b8/tests/integration}/__init__.py +0 -0
  191. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/_utils.py +0 -0
  192. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/actor_source_base/server.py +0 -0
  193. {apify-2.7.1b7/tests/unit/scrapy → apify-2.7.1b8/tests/integration/actor_source_base/src}/__init__.py +0 -0
  194. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/actor_source_base/src/__main__.py +0 -0
  195. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/actor_source_base/src/main.py +0 -0
  196. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_call_timeouts.py +0 -0
  197. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_charge.py +0 -0
  198. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
  199. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_events.py +0 -0
  200. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_lifecycle.py +0 -0
  201. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_log.py +0 -0
  202. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_actor_scrapy.py +0 -0
  203. {apify-2.7.1b7 → apify-2.7.1b8}/tests/integration/test_fixtures.py +0 -0
  204. {apify-2.7.1b7/tests/unit/scrapy/extensions → apify-2.7.1b8/tests/unit}/__init__.py +0 -0
  205. {apify-2.7.1b7/tests/unit/scrapy/middlewares → apify-2.7.1b8/tests/unit/actor}/__init__.py +0 -0
  206. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_actor_helpers.py +0 -0
  207. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_actor_log.py +0 -0
  208. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
  209. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/actor/test_configuration.py +0 -0
  210. {apify-2.7.1b7/tests/unit/scrapy/pipelines → apify-2.7.1b8/tests/unit/events}/__init__.py +0 -0
  211. {apify-2.7.1b7/tests/unit/scrapy/requests → apify-2.7.1b8/tests/unit/scrapy}/__init__.py +0 -0
  212. {apify-2.7.1b7/tests/unit/scrapy/utils → apify-2.7.1b8/tests/unit/scrapy/extensions}/__init__.py +0 -0
  213. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
  214. /apify-2.7.1b7/website/static/.nojekyll → /apify-2.7.1b8/tests/unit/scrapy/middlewares/__init__.py +0 -0
  215. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
  216. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
  217. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
  218. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
  219. {apify-2.7.1b7 → apify-2.7.1b8}/tests/unit/test_crypto.py +0 -0
  220. {apify-2.7.1b7 → apify-2.7.1b8}/website/.eslintrc.json +0 -0
  221. {apify-2.7.1b7 → apify-2.7.1b8}/website/babel.config.js +0 -0
  222. {apify-2.7.1b7 → apify-2.7.1b8}/website/build_api_reference.sh +0 -0
  223. {apify-2.7.1b7 → apify-2.7.1b8}/website/docusaurus.config.js +0 -0
  224. {apify-2.7.1b7 → apify-2.7.1b8}/website/generate_module_shortcuts.py +0 -0
  225. {apify-2.7.1b7 → apify-2.7.1b8}/website/package.json +0 -0
  226. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/components/ApiLink.jsx +0 -0
  227. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/components/Gradients.jsx +0 -0
  228. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/components/Highlights.jsx +0 -0
  229. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/components/Highlights.module.css +0 -0
  230. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/components/RunnableCodeBlock.jsx +0 -0
  231. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/components/RunnableCodeBlock.module.css +0 -0
  232. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/css/custom.css +0 -0
  233. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/pages/home_page_example.py +0 -0
  234. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/pages/index.js +0 -0
  235. {apify-2.7.1b7 → apify-2.7.1b8}/website/src/pages/index.module.css +0 -0
  236. {apify-2.7.1b7 → apify-2.7.1b8}/website/static/img/docs-og.png +0 -0
  237. {apify-2.7.1b7 → apify-2.7.1b8}/website/static/img/guides/redirected_logs_example.webp +0 -0
  238. {apify-2.7.1b7 → apify-2.7.1b8}/website/tools/docs-prettier.config.js +0 -0
  239. {apify-2.7.1b7 → apify-2.7.1b8}/website/tools/utils/externalLink.js +0 -0
@@ -36,7 +36,6 @@ jobs:
36
36
 
37
37
  integration_tests:
38
38
  name: Integration tests
39
- needs: [lint_check, type_check, unit_tests]
40
39
  uses: apify/workflows/.github/workflows/python_integration_tests.yaml@main
41
40
  secrets: inherit
42
41
  with:
@@ -5,10 +5,25 @@ All notable changes to this project will be documented in this file.
5
5
  <!-- git-cliff-unreleased-start -->
6
6
  ## 2.7.1 - **not yet released**
7
7
 
8
+ ### 🚀 Features
9
+
10
+ - 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)
11
+
8
12
  ### 🐛 Bug Fixes
9
13
 
10
14
  - Restrict apify-shared and apify-client versions ([#523](https://github.com/apify/apify-sdk-python/pull/523)) ([b3ae5a9](https://github.com/apify/apify-sdk-python/commit/b3ae5a972a65454a4998eda59c9fcc3f6b7e8579)) by [@vdusek](https://github.com/vdusek)
11
15
  - Expose `APIFY_USER_IS_PAYING` env var to the configuration ([#507](https://github.com/apify/apify-sdk-python/pull/507)) ([0801e54](https://github.com/apify/apify-sdk-python/commit/0801e54887317c1280cc6828ecd3f2cc53287e76)) by [@stepskop](https://github.com/stepskop)
16
+ - Resolve DeprecationWarning in ApifyEventManager ([#555](https://github.com/apify/apify-sdk-python/pull/555)) ([0c5111d](https://github.com/apify/apify-sdk-python/commit/0c5111dafe19796ec1fb9652a44c031bed9758df)) by [@vdusek](https://github.com/vdusek), closes [#343](https://github.com/apify/apify-sdk-python/issues/343)
17
+
18
+ ### Chore
19
+
20
+ - [**breaking**] Update apify-client and apify-shared to v2.0 ([#548](https://github.com/apify/apify-sdk-python/pull/548)) ([8ba084d](https://github.com/apify/apify-sdk-python/commit/8ba084ded6cd018111343f2219260b481c8d4e35)) by [@vdusek](https://github.com/vdusek)
21
+
22
+ ### Refactor
23
+
24
+ - [**breaking**] Adapt to the Crawlee v1.0 ([#470](https://github.com/apify/apify-sdk-python/pull/470)) ([f7e3320](https://github.com/apify/apify-sdk-python/commit/f7e33206cf3e4767faacbdc43511b45b6785f929)) by [@vdusek](https://github.com/vdusek), closes [#469](https://github.com/apify/apify-sdk-python/issues/469), [#540](https://github.com/apify/apify-sdk-python/issues/540)
25
+ - [**breaking**] Replace `httpx` with `impit` ([#560](https://github.com/apify/apify-sdk-python/pull/560)) ([cca3869](https://github.com/apify/apify-sdk-python/commit/cca3869e85968865e56aafcdcb36fbccba27aef0)) by [@Mantisus](https://github.com/Mantisus), closes [#558](https://github.com/apify/apify-sdk-python/issues/558)
26
+ - [**breaking**] Remove `Request.id` field ([#553](https://github.com/apify/apify-sdk-python/pull/553)) ([445ab5d](https://github.com/apify/apify-sdk-python/commit/445ab5d752b785fc2018b35c8adbe779253d7acd)) by [@Pijukatel](https://github.com/Pijukatel)
12
27
 
13
28
 
14
29
  <!-- git-cliff-unreleased-end -->
@@ -24,6 +39,114 @@ All notable changes to this project will be documented in this file.
24
39
  - 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)
25
40
 
26
41
 
42
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
43
+
44
+ ### 🚀 Features
45
+
46
+ - **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)
47
+
48
+ ### 🐛 Bug Fixes
49
+
50
+ - 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)
51
+ - 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)
52
+
53
+
54
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
55
+
56
+ ### 🚀 Features
57
+
58
+ - **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)
59
+
60
+ ### 🐛 Bug Fixes
61
+
62
+ - 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)
63
+ - 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)
64
+
65
+
66
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
67
+
68
+ ### 🚀 Features
69
+
70
+ - **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)
71
+
72
+ ### 🐛 Bug Fixes
73
+
74
+ - 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)
75
+ - 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)
76
+
77
+
78
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
79
+
80
+ ### 🚀 Features
81
+
82
+ - **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)
83
+
84
+ ### 🐛 Bug Fixes
85
+
86
+ - 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)
87
+ - 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)
88
+
89
+
90
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
91
+
92
+ ### 🚀 Features
93
+
94
+ - **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)
95
+
96
+ ### 🐛 Bug Fixes
97
+
98
+ - 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)
99
+ - 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)
100
+
101
+
102
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
103
+
104
+ ### 🚀 Features
105
+
106
+ - **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)
107
+
108
+ ### 🐛 Bug Fixes
109
+
110
+ - 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)
111
+ - 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)
112
+
113
+
114
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
115
+
116
+ ### 🚀 Features
117
+
118
+ - **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)
119
+
120
+ ### 🐛 Bug Fixes
121
+
122
+ - 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)
123
+ - 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)
124
+
125
+
126
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
127
+
128
+ ### 🚀 Features
129
+
130
+ - **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)
131
+
132
+ ### 🐛 Bug Fixes
133
+
134
+ - 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)
135
+ - 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)
136
+
137
+
138
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
139
+
140
+ ### 🚀 Features
141
+
142
+ - **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)
143
+
144
+ ### 🐛 Bug Fixes
145
+
146
+ - 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)
147
+ - 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)
148
+
149
+
27
150
  ## [2.7.3](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.3) (2025-08-11)
28
151
 
29
152
  ### 🐛 Bug Fixes
@@ -26,13 +26,13 @@ type-check:
26
26
  uv run mypy
27
27
 
28
28
  unit-tests:
29
- uv run pytest --numprocesses=auto --verbose --cov=src/apify tests/unit
29
+ uv run pytest --numprocesses=auto -vv --cov=src/apify tests/unit
30
30
 
31
31
  unit-tests-cov:
32
- uv run pytest --numprocesses=auto --verbose --cov=src/apify --cov-report=html tests/unit
32
+ uv run pytest --numprocesses=auto -vv --cov=src/apify --cov-report=html tests/unit
33
33
 
34
34
  integration-tests:
35
- uv run pytest --numprocesses=$(INTEGRATION_TESTS_CONCURRENCY) --verbose tests/integration
35
+ uv run pytest --numprocesses=$(INTEGRATION_TESTS_CONCURRENCY) -vv tests/integration
36
36
 
37
37
  format:
38
38
  uv run ruff check --fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apify
3
- Version: 2.7.1b7
3
+ Version: 2.7.1b8
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
@@ -225,15 +225,17 @@ Classifier: Programming Language :: Python :: 3.12
225
225
  Classifier: Programming Language :: Python :: 3.13
226
226
  Classifier: Topic :: Software Development :: Libraries
227
227
  Requires-Python: >=3.10
228
- Requires-Dist: apify-client<2.0.0
229
- Requires-Dist: apify-shared<2.0.0
230
- Requires-Dist: crawlee~=0.6.0
228
+ Requires-Dist: apify-client<3.0.0,>=2.0.0
229
+ Requires-Dist: apify-shared<3.0.0,>=2.0.0
230
+ Requires-Dist: cachetools>=5.5.0
231
+ Requires-Dist: crawlee==1.0.0rc1
231
232
  Requires-Dist: cryptography>=42.0.0
232
- Requires-Dist: httpx>=0.27.0
233
+ Requires-Dist: impit>=0.5.3
233
234
  Requires-Dist: lazy-object-proxy<1.11.0
234
235
  Requires-Dist: more-itertools>=10.2.0
235
236
  Requires-Dist: typing-extensions>=4.1.0
236
237
  Requires-Dist: websockets>=14.0
238
+ Requires-Dist: yarl>=1.18.0
237
239
  Provides-Extra: scrapy
238
240
  Requires-Dist: scrapy>=2.11.0; extra == 'scrapy'
239
241
  Description-Content-Type: text/markdown
@@ -11,14 +11,14 @@ async def main() -> None:
11
11
  await dataset.export_to(
12
12
  content_type='csv',
13
13
  key='data.csv',
14
- to_key_value_store_name='my-cool-key-value-store',
14
+ to_kvs_name='my-cool-key-value-store',
15
15
  )
16
16
 
17
17
  # Export the data as JSON
18
18
  await dataset.export_to(
19
19
  content_type='json',
20
20
  key='data.json',
21
- to_key_value_store_name='my-cool-key-value-store',
21
+ to_kvs_name='my-cool-key-value-store',
22
22
  )
23
23
 
24
24
  # Print the exported records
@@ -20,13 +20,10 @@ async def main() -> None:
20
20
 
21
21
  # If you try to add an existing request again, it will not do anything
22
22
  add_request_info = await queue.add_request(
23
- Request.from_url('http://different-example.com/5')
23
+ Request.from_url('http://example.com/5')
24
24
  )
25
25
  Actor.log.info(f'Add request info: {add_request_info}')
26
26
 
27
- processed_request = await queue.get_request(add_request_info.id)
28
- Actor.log.info(f'Processed request: {processed_request}')
29
-
30
27
  # Finally, process the queue until all requests are handled
31
28
  while not await queue.is_finished():
32
29
  # Fetch the next unhandled request in the queue
@@ -6,8 +6,8 @@ async def main() -> None:
6
6
  # Check the dataset because there might already be items
7
7
  # if the run migrated or was restarted
8
8
  default_dataset = await Actor.open_dataset()
9
- dataset_info = await default_dataset.get_info()
10
- charged_items = dataset_info.item_count if dataset_info else 0
9
+ metadata = await default_dataset.get_metadata()
10
+ charged_items = metadata.item_count
11
11
 
12
12
  # highlight-start
13
13
  if Actor.get_charging_manager().get_pricing_info().is_pay_per_event:
@@ -3,7 +3,7 @@ id: upgrading-to-v2
3
3
  title: Upgrading to v2
4
4
  ---
5
5
 
6
- This page summarizes most of the breaking changes between Apify Python SDK v1.x and v2.0.
6
+ This page summarizes the breaking changes between Apify Python SDK v1.x and v2.0.
7
7
 
8
8
  ## Python version support
9
9
 
@@ -12,7 +12,7 @@ Support for Python 3.8 has been dropped. The Apify Python SDK v2.x now requires
12
12
  ## Storages
13
13
 
14
14
  - The SDK now uses [crawlee](https://github.com/apify/crawlee-python) for local storage emulation. This change should not affect intended usage (working with `Dataset`, `KeyValueStore` and `RequestQueue` classes from the `apify.storages` module or using the shortcuts exposed by the `Actor` class) in any way.
15
- - There is a difference in the `RequestQueue.add_request` method: it accepts an `apify.Request` object instead of a free-form dictionary.
15
+ - There is a difference in the `RequestQueue.add_request` method: it accepts an `apify.Request` object instead of a free-form dictionary.
16
16
  - A quick way to migrate from dict-based arguments is to wrap it with a `Request.model_validate()` call.
17
17
  - The preferred way is using the `Request.from_url` helper which prefills the `unique_key` and `id` attributes, or instantiating it directly, e.g., `Request(url='https://example.tld', ...)`.
18
18
  - For simple use cases, `add_request` also accepts plain strings that contain an URL, e.g. `queue.add_request('https://example.tld')`.
@@ -0,0 +1,18 @@
1
+ ---
2
+ id: upgrading-to-v3
3
+ title: Upgrading to v3
4
+ ---
5
+
6
+ This page summarizes the breaking changes between Apify Python SDK v2.x and v3.0.
7
+
8
+ ## Python version support
9
+
10
+ Support for Python 3.9 has been dropped. The Apify Python SDK v3.x now requires Python 3.10 or later. Make sure your environment is running a compatible version before upgrading.
11
+
12
+ ## Storages
13
+
14
+ <!-- TODO -->
15
+
16
+ ## Storage clients
17
+
18
+ <!-- TODO -->
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "apify"
7
- version = "2.7.1b7"
7
+ version = "2.7.1b8"
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" }
@@ -34,17 +34,19 @@ keywords = [
34
34
  "scraping",
35
35
  ]
36
36
  dependencies = [
37
- "apify-client<2.0.0",
38
- "apify-shared<2.0.0",
39
- "crawlee~=0.6.0",
37
+ "apify-client>=2.0.0,<3.0.0",
38
+ "apify-shared>=2.0.0,<3.0.0",
39
+ "crawlee==1.0.0rc1",
40
+ "cachetools>=5.5.0",
40
41
  "cryptography>=42.0.0",
41
- "httpx>=0.27.0",
42
42
  # TODO: ensure compatibility with the latest version of lazy-object-proxy
43
43
  # https://github.com/apify/apify-sdk-python/issues/460
44
+ "impit>=0.5.3",
44
45
  "lazy-object-proxy<1.11.0",
45
46
  "more_itertools>=10.2.0",
46
47
  "typing-extensions>=4.1.0",
47
48
  "websockets>=14.0",
49
+ "yarl>=1.18.0",
48
50
  ]
49
51
 
50
52
  [project.optional-dependencies]
@@ -64,27 +66,30 @@ scrapy = ["scrapy>=2.11.0"]
64
66
  dev = [
65
67
  "build~=1.3.0",
66
68
  "crawlee[parsel]",
67
- "dycw-pytest-only>=2.1.1",
68
- "griffe~=1.11.0",
69
+ "dycw-pytest-only~=2.1.0",
70
+ "griffe~=1.12.0",
69
71
  "mypy~=1.17.0",
70
72
  "pre-commit~=4.3.0",
71
73
  "pydoc-markdown~=4.8.0",
72
74
  "pytest-asyncio~=1.1.0",
73
75
  "pytest-cov~=6.2.0",
74
- "pytest-httpserver>=1.1.3",
75
- "pytest-timeout>=2.4.0",
76
+ "pytest-httpserver~=1.1.0",
77
+ "pytest-timeout~=2.4.0",
76
78
  "pytest-xdist~=3.8.0",
77
79
  "pytest~=8.4.0",
78
80
  "ruff~=0.12.0",
79
81
  "setuptools", # setuptools are used by pytest but not explicitly required
82
+ "types-cachetools~=6.0.0.20250525",
80
83
  "uvicorn[standard]",
81
- "werkzeug~=3.1.3", # Werkzeug is used by httpserver
82
- "yarl~=1.20.0", # yarl is used by crawlee
84
+ "werkzeug~=3.1.0", # Werkzeug is used by httpserver
83
85
  ]
84
86
 
85
87
  [tool.hatch.build.targets.wheel]
86
88
  packages = ["src/apify"]
87
89
 
90
+ [tool.hatch.metadata]
91
+ allow-direct-references = true
92
+
88
93
  [tool.ruff]
89
94
  line-length = 120
90
95
  include = ["src/**/*.py", "tests/**/*.py", "docs/**/*.py", "website/**/*.py"]
@@ -208,12 +213,12 @@ exclude = []
208
213
 
209
214
  [[tool.mypy.overrides]]
210
215
  module = [
211
- 'bs4',
212
- 'lazy_object_proxy',
213
- 'nest_asyncio',
214
- 'playwright.*',
215
- 'scrapy.*',
216
- 'selenium.*',
216
+ 'bs4', # Documentation
217
+ 'httpx', # Documentation
218
+ 'lazy_object_proxy', # Untyped and stubs not available
219
+ 'playwright.*', # Documentation
220
+ 'scrapy.*', # Untyped and stubs not available
221
+ 'selenium.*', # Documentation
217
222
  ]
218
223
  ignore_missing_imports = true
219
224
 
@@ -13,7 +13,6 @@ from pydantic import AliasChoices
13
13
 
14
14
  from apify_client import ApifyClientAsync
15
15
  from apify_shared.consts import ActorEnvVars, ActorExitCodes, ApifyEnvVars
16
- from apify_shared.utils import maybe_extract_enum_member_value
17
16
  from crawlee import service_locator
18
17
  from crawlee.events import (
19
18
  Event,
@@ -30,11 +29,11 @@ from apify._configuration import Configuration
30
29
  from apify._consts import EVENT_LISTENERS_TIMEOUT
31
30
  from apify._crypto import decrypt_input_secrets, load_private_key
32
31
  from apify._models import ActorRun
33
- from apify._platform_event_manager import EventManager, LocalEventManager, PlatformEventManager
34
32
  from apify._proxy_configuration import ProxyConfiguration
35
- from apify._utils import docs_group, docs_name, get_system_info, is_running_in_ipython
36
- from apify.apify_storage_client import ApifyStorageClient
33
+ from apify._utils import docs_group, docs_name, get_system_info, is_running_in_ipython, maybe_extract_enum_member_value
34
+ from apify.events import ApifyEventManager, EventManager, LocalEventManager
37
35
  from apify.log import _configure_logging, logger
36
+ from apify.storage_clients import ApifyStorageClient
38
37
  from apify.storages import Dataset, KeyValueStore, RequestQueue
39
38
 
40
39
  if TYPE_CHECKING:
@@ -126,12 +125,12 @@ class _ActorType:
126
125
 
127
126
  # Create an instance of the cloud storage client, the local storage client is obtained
128
127
  # from the service locator.
129
- self._cloud_storage_client = ApifyStorageClient.from_config(config=self._configuration)
128
+ self._cloud_storage_client = ApifyStorageClient()
130
129
 
131
130
  # Set the event manager based on whether the Actor is running on the platform or locally.
132
131
  self._event_manager = (
133
- PlatformEventManager(
134
- config=self._configuration,
132
+ ApifyEventManager(
133
+ configuration=self._configuration,
135
134
  persist_state_interval=self._configuration.persist_state_interval,
136
135
  )
137
136
  if self.is_at_home()
@@ -140,6 +140,39 @@ class Configuration(CrawleeConfiguration):
140
140
  ),
141
141
  ] = None
142
142
 
143
+ default_dataset_id: Annotated[
144
+ str,
145
+ Field(
146
+ validation_alias=AliasChoices(
147
+ 'actor_default_dataset_id',
148
+ 'apify_default_dataset_id',
149
+ ),
150
+ description='Default dataset ID used by the Apify storage client when no ID or name is provided.',
151
+ ),
152
+ ] = 'default'
153
+
154
+ default_key_value_store_id: Annotated[
155
+ str,
156
+ Field(
157
+ validation_alias=AliasChoices(
158
+ 'actor_default_key_value_store_id',
159
+ 'apify_default_key_value_store_id',
160
+ ),
161
+ description='Default key-value store ID for the Apify storage client when no ID or name is provided.',
162
+ ),
163
+ ] = 'default'
164
+
165
+ default_request_queue_id: Annotated[
166
+ str,
167
+ Field(
168
+ validation_alias=AliasChoices(
169
+ 'actor_default_request_queue_id',
170
+ 'apify_default_request_queue_id',
171
+ ),
172
+ description='Default request queue ID for the Apify storage client when no ID or name is provided.',
173
+ ),
174
+ ] = 'default'
175
+
143
176
  disable_outdated_warning: Annotated[
144
177
  bool,
145
178
  Field(
@@ -1,13 +1,15 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import ipaddress
4
+ import json
4
5
  import re
5
6
  from dataclasses import dataclass, field
6
7
  from re import Pattern
7
8
  from typing import TYPE_CHECKING, Any
8
9
  from urllib.parse import urljoin, urlparse
9
10
 
10
- import httpx
11
+ import impit
12
+ from yarl import URL
11
13
 
12
14
  from apify_shared.consts import ApifyEnvVars
13
15
  from crawlee.proxy_configuration import ProxyConfiguration as CrawleeProxyConfiguration
@@ -20,7 +22,8 @@ from apify.log import logger
20
22
 
21
23
  if TYPE_CHECKING:
22
24
  from apify_client import ApifyClientAsync
23
- from crawlee import Request
25
+
26
+ from apify import Request
24
27
 
25
28
  APIFY_PROXY_VALUE_REGEX = re.compile(r'^[\w._~]+$')
26
29
  COUNTRY_CODE_REGEX = re.compile(r'^[A-Z]{2}$')
@@ -230,7 +233,7 @@ class ProxyConfiguration(CrawleeProxyConfiguration):
230
233
  return None
231
234
 
232
235
  if self._uses_apify_proxy:
233
- parsed_url = httpx.URL(proxy_info.url)
236
+ parsed_url = URL(proxy_info.url)
234
237
  username = self._get_username(session_id)
235
238
 
236
239
  return ProxyInfo(
@@ -274,11 +277,11 @@ class ProxyConfiguration(CrawleeProxyConfiguration):
274
277
  return
275
278
 
276
279
  status = None
277
- async with httpx.AsyncClient(proxy=proxy_info.url, timeout=10) as client:
280
+ async with impit.AsyncClient(proxy=proxy_info.url, timeout=10) as client:
278
281
  for _ in range(2):
279
282
  try:
280
283
  response = await client.get(proxy_status_url)
281
- status = response.json()
284
+ status = json.loads(response.text)
282
285
  break
283
286
  except Exception: # noqa: S110
284
287
  # retry on connection errors
@@ -2,8 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  import builtins
4
4
  import sys
5
+ from enum import Enum
5
6
  from importlib import metadata
6
- from typing import TYPE_CHECKING, Literal
7
+ from typing import TYPE_CHECKING, Any, Literal
7
8
 
8
9
  if TYPE_CHECKING:
9
10
  from collections.abc import Callable
@@ -81,3 +82,10 @@ def docs_name(symbol_name: str) -> Callable: # noqa: ARG001
81
82
  return func
82
83
 
83
84
  return wrapper
85
+
86
+
87
+ def maybe_extract_enum_member_value(maybe_enum_member: Any) -> Any:
88
+ """Extract the value of an enumeration member if it is an Enum, otherwise return the original value."""
89
+ if isinstance(maybe_enum_member, Enum):
90
+ return maybe_enum_member.value
91
+ return maybe_enum_member
@@ -0,0 +1,5 @@
1
+ from crawlee.events import EventManager, LocalEventManager
2
+
3
+ from ._apify_event_manager import ApifyEventManager
4
+
5
+ __all__ = ['ApifyEventManager', 'EventManager', 'LocalEventManager']