apify 2.7.1b20__tar.gz → 2.7.1b21__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 (241) hide show
  1. {apify-2.7.1b20 → apify-2.7.1b21}/CHANGELOG.md +13 -0
  2. {apify-2.7.1b20 → apify-2.7.1b21}/PKG-INFO +2 -2
  3. {apify-2.7.1b20 → apify-2.7.1b21}/docs/04_upgrading/upgrading_to_v3.md +49 -11
  4. {apify-2.7.1b20 → apify-2.7.1b21}/pyproject.toml +2 -2
  5. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/_actor.py +37 -66
  6. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/__init__.py +2 -0
  7. apify-2.7.1b21/src/apify/storage_clients/_apify/_request_queue_client.py +327 -0
  8. apify-2.7.1b20/src/apify/storage_clients/_apify/_request_queue_client.py → apify-2.7.1b21/src/apify/storage_clients/_apify/_request_queue_shared_client.py +36 -323
  9. apify-2.7.1b21/src/apify/storage_clients/_apify/_request_queue_single_client.py +399 -0
  10. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_apify/_storage_client.py +26 -4
  11. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_apify/_utils.py +27 -1
  12. apify-2.7.1b21/src/apify/storage_clients/_smart_apify/__init__.py +1 -0
  13. apify-2.7.1b21/src/apify/storage_clients/_smart_apify/_storage_client.py +117 -0
  14. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/actor_source_base/requirements.txt +1 -1
  15. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/conftest.py +10 -5
  16. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_request_queue.py +7 -4
  17. apify-2.7.1b21/tests/integration/test_apify_storages.py +152 -0
  18. apify-2.7.1b21/tests/integration/test_request_queue.py +1191 -0
  19. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_actor_log.py +35 -31
  20. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_configuration.py +3 -17
  21. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/storage_clients/test_apify_request_queue_client.py +1 -1
  22. {apify-2.7.1b20 → apify-2.7.1b21}/uv.lock +5 -5
  23. apify-2.7.1b20/tests/integration/test_apify_storages.py +0 -75
  24. apify-2.7.1b20/tests/integration/test_request_queue.py +0 -1304
  25. {apify-2.7.1b20 → apify-2.7.1b21}/.editorconfig +0 -0
  26. {apify-2.7.1b20 → apify-2.7.1b21}/.github/CODEOWNERS +0 -0
  27. {apify-2.7.1b20 → apify-2.7.1b21}/.github/workflows/build_and_deploy_docs.yaml +0 -0
  28. {apify-2.7.1b20 → apify-2.7.1b21}/.github/workflows/check_pr_title.yaml +0 -0
  29. {apify-2.7.1b20 → apify-2.7.1b21}/.github/workflows/pre_release.yaml +0 -0
  30. {apify-2.7.1b20 → apify-2.7.1b21}/.github/workflows/release.yaml +0 -0
  31. {apify-2.7.1b20 → apify-2.7.1b21}/.github/workflows/run_code_checks.yaml +0 -0
  32. {apify-2.7.1b20 → apify-2.7.1b21}/.github/workflows/update_new_issue.yaml +0 -0
  33. {apify-2.7.1b20 → apify-2.7.1b21}/.gitignore +0 -0
  34. {apify-2.7.1b20 → apify-2.7.1b21}/.markdownlint.yaml +0 -0
  35. {apify-2.7.1b20 → apify-2.7.1b21}/.pre-commit-config.yaml +0 -0
  36. {apify-2.7.1b20 → apify-2.7.1b21}/CONTRIBUTING.md +0 -0
  37. {apify-2.7.1b20 → apify-2.7.1b21}/LICENSE +0 -0
  38. {apify-2.7.1b20 → apify-2.7.1b21}/Makefile +0 -0
  39. {apify-2.7.1b20 → apify-2.7.1b21}/README.md +0 -0
  40. {apify-2.7.1b20 → apify-2.7.1b21}/docs/01_overview/01_introduction.mdx +0 -0
  41. {apify-2.7.1b20 → apify-2.7.1b21}/docs/01_overview/02_running_actors_locally.mdx +0 -0
  42. {apify-2.7.1b20 → apify-2.7.1b21}/docs/01_overview/03_actor_structure.mdx +0 -0
  43. {apify-2.7.1b20 → apify-2.7.1b21}/docs/01_overview/code/01_introduction.py +0 -0
  44. {apify-2.7.1b20 → apify-2.7.1b21}/docs/01_overview/code/actor_structure/__init__.py +0 -0
  45. {apify-2.7.1b20 → apify-2.7.1b21}/docs/01_overview/code/actor_structure/__main__.py +0 -0
  46. {apify-2.7.1b20 → apify-2.7.1b21}/docs/01_overview/code/actor_structure/main.py +0 -0
  47. {apify-2.7.1b20 → apify-2.7.1b21}/docs/01_overview/code/actor_structure/py.typed +0 -0
  48. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/01_actor_lifecycle.mdx +0 -0
  49. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/02_actor_input.mdx +0 -0
  50. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/03_storages.mdx +0 -0
  51. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/04_actor_events.mdx +0 -0
  52. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/05_proxy_management.mdx +0 -0
  53. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/06_interacting_with_other_actors.mdx +0 -0
  54. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/07_webhooks.mdx +0 -0
  55. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/08_access_apify_api.mdx +0 -0
  56. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/09_running_webserver.mdx +0 -0
  57. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/10_logging.mdx +0 -0
  58. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/11_configuration.mdx +0 -0
  59. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/12_pay_per_event.mdx +0 -0
  60. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/01_context_manager.py +0 -0
  61. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/01_init_exit.py +0 -0
  62. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/01_reboot.py +0 -0
  63. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/01_status_message.py +0 -0
  64. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/02_input.py +0 -0
  65. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/03_dataset_exports.py +0 -0
  66. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/03_dataset_read_write.py +0 -0
  67. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/03_deleting_storages.py +0 -0
  68. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/03_kvs_iterating.py +0 -0
  69. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/03_kvs_public_url.py +0 -0
  70. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/03_kvs_read_write.py +0 -0
  71. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/03_opening_storages.py +0 -0
  72. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/03_rq.py +0 -0
  73. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/04_actor_events.py +0 -0
  74. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/05_apify_proxy.py +0 -0
  75. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/05_apify_proxy_config.py +0 -0
  76. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/05_custom_proxy.py +0 -0
  77. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/05_custom_proxy_function.py +0 -0
  78. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/05_proxy_actor_input.py +0 -0
  79. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/05_proxy_httpx.py +0 -0
  80. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/05_proxy_rotation.py +0 -0
  81. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/06_interacting_call.py +0 -0
  82. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/06_interacting_call_task.py +0 -0
  83. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/06_interacting_metamorph.py +0 -0
  84. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/06_interacting_start.py +0 -0
  85. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/07_webhook.py +0 -0
  86. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/07_webhook_preventing.py +0 -0
  87. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/08_actor_client.py +0 -0
  88. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/08_actor_new_client.py +0 -0
  89. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/09_webserver.py +0 -0
  90. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/10_log_config.py +0 -0
  91. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/10_logger_usage.py +0 -0
  92. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/10_redirect_log.py +0 -0
  93. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/10_redirect_log_existing_run.py +0 -0
  94. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/11_config.py +0 -0
  95. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/actor_charge.py +0 -0
  96. {apify-2.7.1b20 → apify-2.7.1b21}/docs/02_concepts/code/conditional_actor_charge.py +0 -0
  97. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/01_beautifulsoup_httpx.mdx +0 -0
  98. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/02_parsel_impit.mdx +0 -0
  99. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/03_playwright.mdx +0 -0
  100. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/04_selenium.mdx +0 -0
  101. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/05_crawlee.mdx +0 -0
  102. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/06_scrapy.mdx +0 -0
  103. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/01_beautifulsoup_httpx.py +0 -0
  104. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/02_parsel_impit.py +0 -0
  105. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/03_playwright.py +0 -0
  106. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/04_selenium.py +0 -0
  107. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/05_crawlee_beautifulsoup.py +0 -0
  108. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/05_crawlee_parsel.py +0 -0
  109. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/05_crawlee_playwright.py +0 -0
  110. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/scrapy_project/src/__init__.py +0 -0
  111. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/scrapy_project/src/__main__.py +0 -0
  112. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/scrapy_project/src/items.py +0 -0
  113. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/scrapy_project/src/main.py +0 -0
  114. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/scrapy_project/src/py.typed +0 -0
  115. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/scrapy_project/src/settings.py +0 -0
  116. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
  117. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/scrapy_project/src/spiders/py.typed +0 -0
  118. {apify-2.7.1b20 → apify-2.7.1b21}/docs/03_guides/code/scrapy_project/src/spiders/title.py +0 -0
  119. {apify-2.7.1b20 → apify-2.7.1b21}/docs/04_upgrading/upgrading_to_v2.md +0 -0
  120. {apify-2.7.1b20 → apify-2.7.1b21}/docs/pyproject.toml +0 -0
  121. {apify-2.7.1b20 → apify-2.7.1b21}/renovate.json +0 -0
  122. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/__init__.py +0 -0
  123. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/_charging.py +0 -0
  124. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/_configuration.py +0 -0
  125. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/_consts.py +0 -0
  126. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/_crypto.py +0 -0
  127. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/_models.py +0 -0
  128. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/_proxy_configuration.py +0 -0
  129. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/_utils.py +0 -0
  130. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/events/__init__.py +0 -0
  131. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/events/_apify_event_manager.py +0 -0
  132. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/events/_types.py +0 -0
  133. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/events/py.typed +0 -0
  134. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/log.py +0 -0
  135. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/py.typed +0 -0
  136. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/request_loaders/__init__.py +0 -0
  137. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/request_loaders/_apify_request_list.py +0 -0
  138. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/request_loaders/py.typed +0 -0
  139. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/__init__.py +0 -0
  140. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/_actor_runner.py +0 -0
  141. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/_async_thread.py +0 -0
  142. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/_logging_config.py +0 -0
  143. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/extensions/__init__.py +0 -0
  144. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/extensions/_httpcache.py +0 -0
  145. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/middlewares/__init__.py +0 -0
  146. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
  147. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/middlewares/py.typed +0 -0
  148. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/pipelines/__init__.py +0 -0
  149. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
  150. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/pipelines/py.typed +0 -0
  151. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/py.typed +0 -0
  152. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/requests.py +0 -0
  153. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/scheduler.py +0 -0
  154. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/scrapy/utils.py +0 -0
  155. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_apify/__init__.py +0 -0
  156. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_apify/_dataset_client.py +0 -0
  157. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_apify/_key_value_store_client.py +0 -0
  158. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_apify/_models.py +0 -0
  159. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_apify/py.typed +0 -0
  160. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_file_system/__init__.py +0 -0
  161. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_file_system/_key_value_store_client.py +0 -0
  162. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/_file_system/_storage_client.py +0 -0
  163. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storage_clients/py.typed +0 -0
  164. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storages/__init__.py +0 -0
  165. {apify-2.7.1b20 → apify-2.7.1b21}/src/apify/storages/py.typed +0 -0
  166. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/README.md +0 -0
  167. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/__init__.py +0 -0
  168. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/_utils.py +0 -0
  169. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/actor_source_base/Dockerfile +0 -0
  170. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/actor_source_base/server.py +0 -0
  171. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/actor_source_base/src/__init__.py +0 -0
  172. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/actor_source_base/src/__main__.py +0 -0
  173. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/actor_source_base/src/main.py +0 -0
  174. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_api_helpers.py +0 -0
  175. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_call_timeouts.py +0 -0
  176. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_charge.py +0 -0
  177. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
  178. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_dataset.py +0 -0
  179. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_events.py +0 -0
  180. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_key_value_store.py +0 -0
  181. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_lifecycle.py +0 -0
  182. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_log.py +0 -0
  183. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_actor_scrapy.py +0 -0
  184. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_crawlers_with_storages.py +0 -0
  185. {apify-2.7.1b20 → apify-2.7.1b21}/tests/integration/test_fixtures.py +0 -0
  186. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/__init__.py +0 -0
  187. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/__init__.py +0 -0
  188. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
  189. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_actor_dataset.py +0 -0
  190. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_actor_env_helpers.py +0 -0
  191. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_actor_helpers.py +0 -0
  192. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_actor_key_value_store.py +0 -0
  193. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_actor_lifecycle.py +0 -0
  194. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
  195. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_actor_request_queue.py +0 -0
  196. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/actor/test_request_list.py +0 -0
  197. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/conftest.py +0 -0
  198. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/events/__init__.py +0 -0
  199. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/events/test_apify_event_manager.py +0 -0
  200. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/__init__.py +0 -0
  201. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/extensions/__init__.py +0 -0
  202. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
  203. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/middlewares/__init__.py +0 -0
  204. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
  205. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/pipelines/__init__.py +0 -0
  206. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
  207. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/requests/__init__.py +0 -0
  208. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
  209. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
  210. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/utils/__init__.py +0 -0
  211. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
  212. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
  213. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/storage_clients/__init__.py +0 -0
  214. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/storage_clients/test_file_system.py +0 -0
  215. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/test_apify_storages.py +0 -0
  216. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/test_crypto.py +0 -0
  217. {apify-2.7.1b20 → apify-2.7.1b21}/tests/unit/test_proxy_configuration.py +0 -0
  218. {apify-2.7.1b20 → apify-2.7.1b21}/website/.eslintrc.json +0 -0
  219. {apify-2.7.1b20 → apify-2.7.1b21}/website/babel.config.js +0 -0
  220. {apify-2.7.1b20 → apify-2.7.1b21}/website/build_api_reference.sh +0 -0
  221. {apify-2.7.1b20 → apify-2.7.1b21}/website/docusaurus.config.js +0 -0
  222. {apify-2.7.1b20 → apify-2.7.1b21}/website/generate_module_shortcuts.py +0 -0
  223. {apify-2.7.1b20 → apify-2.7.1b21}/website/package-lock.json +0 -0
  224. {apify-2.7.1b20 → apify-2.7.1b21}/website/package.json +0 -0
  225. {apify-2.7.1b20 → apify-2.7.1b21}/website/sidebars.js +0 -0
  226. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/components/ApiLink.jsx +0 -0
  227. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/components/Gradients.jsx +0 -0
  228. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/components/Highlights.jsx +0 -0
  229. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/components/Highlights.module.css +0 -0
  230. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/components/RunnableCodeBlock.jsx +0 -0
  231. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/components/RunnableCodeBlock.module.css +0 -0
  232. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/css/custom.css +0 -0
  233. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/pages/home_page_example.py +0 -0
  234. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/pages/index.js +0 -0
  235. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/pages/index.module.css +0 -0
  236. {apify-2.7.1b20 → apify-2.7.1b21}/website/src/theme/DocItem/Content/index.js +0 -0
  237. {apify-2.7.1b20 → apify-2.7.1b21}/website/static/.nojekyll +0 -0
  238. {apify-2.7.1b20 → apify-2.7.1b21}/website/static/img/docs-og.png +0 -0
  239. {apify-2.7.1b20 → apify-2.7.1b21}/website/static/img/guides/redirected_logs_example.webp +0 -0
  240. {apify-2.7.1b20 → apify-2.7.1b21}/website/tools/docs-prettier.config.js +0 -0
  241. {apify-2.7.1b20 → apify-2.7.1b21}/website/tools/utils/externalLink.js +0 -0
@@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file.
11
11
  - Add new methods to ChargingManager ([#580](https://github.com/apify/apify-sdk-python/pull/580)) ([54f7f8b](https://github.com/apify/apify-sdk-python/commit/54f7f8b29c5982be98b595dac11eceff915035c9)) by [@vdusek](https://github.com/vdusek)
12
12
  - Add support for NDU storages ([#594](https://github.com/apify/apify-sdk-python/pull/594)) ([8721ef5](https://github.com/apify/apify-sdk-python/commit/8721ef5731bcb1a04ad63c930089bf83be29f308)) by [@vdusek](https://github.com/vdusek), closes [#1175](https://github.com/apify/apify-sdk-python/issues/1175)
13
13
  - Add stats to `ApifyRequestQueueClient` ([#574](https://github.com/apify/apify-sdk-python/pull/574)) ([21f6782](https://github.com/apify/apify-sdk-python/commit/21f6782b444f623aba986b4922cf67bafafd4b2c)) by [@Pijukatel](https://github.com/Pijukatel), closes [#1344](https://github.com/apify/apify-sdk-python/issues/1344)
14
+ - Add specialized ApifyRequestQueue clients ([#573](https://github.com/apify/apify-sdk-python/pull/573)) ([f830ab0](https://github.com/apify/apify-sdk-python/commit/f830ab09b1fa12189c9d3297d5cf18a4f2da62fa)) by [@Pijukatel](https://github.com/Pijukatel)
14
15
 
15
16
  ### 🐛 Bug Fixes
16
17
 
@@ -178,6 +179,18 @@ All notable changes to this project will be documented in this file.
178
179
  - 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)
179
180
 
180
181
 
182
+ ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
183
+
184
+ ### 🚀 Features
185
+
186
+ - **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)
187
+
188
+ ### 🐛 Bug Fixes
189
+
190
+ - 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)
191
+ - 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)
192
+
193
+
181
194
 
182
195
  ## [2.7.3](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.3) (2025-08-11)
183
196
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apify
3
- Version: 2.7.1b20
3
+ Version: 2.7.1b21
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==0.6.13b42
231
+ Requires-Dist: crawlee==0.6.13b46
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
@@ -69,6 +69,13 @@ Some changes in the related model classes:
69
69
  ## Removed Actor.config property
70
70
  - `Actor.config` property has been removed. Use `Actor.configuration` instead.
71
71
 
72
+ ## Default storage ids in configuration changed to None
73
+ - `Configuration.default_key_value_store_id` changed from `'default'` to `None`.
74
+ - `Configuration.default_dataset_id` changed from `'default'` to `None`.
75
+ - `Configuration.default_request_queue_id` changed from `'default'` to `None`.
76
+
77
+ Previously using the default storage without specifying its `id` in `Configuration` would lead to using specific storage with id `'default'`. Now it will use newly created unnamed storage with `'id'` assigned by the Apify platform, consecutive calls to get the default storage will return the same storage.
78
+
72
79
  ## Actor initialization and ServiceLocator changes
73
80
 
74
81
  `Actor` initialization and global `service_locator` services setup is more strict and predictable.
@@ -102,20 +109,51 @@ async def main():
102
109
  )
103
110
  ```
104
111
 
105
- ## Removed Actor.config property
106
- - `Actor.config` property has been removed. Use `Actor.configuration` instead.
112
+ ### Changes in storage clients
107
113
 
108
- ## Default storage ids in configuration changed to None
109
- - `Configuration.default_key_value_store_id` changed from `'default'` to `None`.
110
- - `Configuration.default_dataset_id` changed from `'default'` to `None`.
111
- - `Configuration.default_request_queue_id` changed from `'default'` to `None`.
114
+ ## Explicit control over storage clients used in Actor
115
+ - It is now possible to have full control over which storage clients are used by the `Actor`. To make development of Actors convenient, the `Actor` has two storage clients. One that is used when running on Apify platform or when opening storages with `force_cloud=True` and the other client that is used when running outside the Apify platform. The `Actor` has reasonable defaults and for the majority of use-cases there is no need to change it. However, if you need to use a different storage client, you can set it up before entering `Actor` context through `service_locator`.
116
+
117
+ **Now (v3.0):**
118
+
119
+ ```python
120
+ from crawlee import service_locator
121
+ from apify.storage_clients import ApifyStorageClient, SmartApifyStorageClient, MemoryStorageClient
122
+ from apify import Actor
123
+
124
+
125
+ async def main():
126
+ service_locator.set_storage_client(
127
+ SmartApifyStorageClient(
128
+ cloud_storage_client=ApifyStorageClient(request_queue_access="single"),
129
+ local_storage_client=MemoryStorageClient()
130
+ )
131
+ )
132
+ async with Actor:
133
+ rq = await Actor.open_request_queue()
134
+ ```
112
135
 
113
- Previously using the default storage without specifying its `id` in `Configuration` would lead to using specific storage with id `'default'`. Now it will use newly created unnamed storage with `'id'` assigned by the Apify platform, consecutive calls to get the default storage will return the same storage.
114
136
 
115
- ## Storages
137
+ ## The default use of optimized ApifyRequestQueueClient
116
138
 
117
- <!-- TODO -->
139
+ - The default client for working with Apify platform based `RequestQueue` is now optimized and simplified client which does significantly lower amount of API calls, but does not support multiple consumers working on the same queue. It is cheaper and faster and is suitable for the majority of the use cases.
140
+ - The full client is still available, but it has to be explicitly requested via `request_queue_access="shared"` argument when using the `ApifyStorageClient`.
118
141
 
119
- ## Storage clients
142
+ **Now (v3.0):**
143
+
144
+ ```python
145
+ from crawlee import service_locator
146
+ from apify.storage_clients import ApifyStorageClient, SmartApifyStorageClient
147
+ from apify import Actor
120
148
 
121
- <!-- TODO -->
149
+
150
+ async def main():
151
+ # Full client that supports multiple consumers of the Apify Request Queue
152
+ service_locator.set_storage_client(
153
+ SmartApifyStorageClient(
154
+ cloud_storage_client=ApifyStorageClient(request_queue_access="shared"),
155
+ )
156
+ )
157
+ async with Actor:
158
+ rq = await Actor.open_request_queue()
159
+ ```
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "apify"
7
- version = "2.7.1b20"
7
+ version = "2.7.1b21"
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==0.6.13b42",
39
+ "crawlee==0.6.13b46",
40
40
  "cachetools>=5.5.0",
41
41
  "cryptography>=42.0.0",
42
42
  "impit>=0.6.1",
@@ -25,7 +25,6 @@ from crawlee.events import (
25
25
  EventPersistStateData,
26
26
  EventSystemInfoData,
27
27
  )
28
- from crawlee.storage_clients import FileSystemStorageClient
29
28
 
30
29
  from apify._charging import ChargeResult, ChargingManager, ChargingManagerImplementation
31
30
  from apify._configuration import Configuration
@@ -38,6 +37,7 @@ from apify.events import ApifyEventManager, EventManager, LocalEventManager
38
37
  from apify.log import _configure_logging, logger
39
38
  from apify.storage_clients import ApifyStorageClient
40
39
  from apify.storage_clients._file_system import ApifyFileSystemStorageClient
40
+ from apify.storage_clients._smart_apify._storage_client import SmartApifyStorageClient
41
41
  from apify.storages import Dataset, KeyValueStore, RequestQueue
42
42
 
43
43
  if TYPE_CHECKING:
@@ -48,7 +48,6 @@ if TYPE_CHECKING:
48
48
  from typing_extensions import Self
49
49
 
50
50
  from crawlee.proxy_configuration import _NewUrlFunction
51
- from crawlee.storage_clients import StorageClient
52
51
 
53
52
  from apify._models import Webhook
54
53
 
@@ -131,7 +130,6 @@ class _ActorType:
131
130
  self._configuration = configuration
132
131
  self._configure_logging = configure_logging
133
132
  self._apify_client: ApifyClientAsync | None = None
134
- self._local_storage_client: StorageClient | None = None
135
133
 
136
134
  self._is_initialized = False
137
135
 
@@ -234,45 +232,42 @@ class _ActorType:
234
232
  """The logging.Logger instance the Actor uses."""
235
233
  return logger
236
234
 
237
- def _get_local_storage_client(self) -> StorageClient:
238
- """Get the local storage client the Actor instance uses."""
239
- if self._local_storage_client:
240
- return self._local_storage_client
235
+ def _raise_if_not_initialized(self) -> None:
236
+ if not self._is_initialized:
237
+ raise RuntimeError('The Actor was not initialized!')
238
+
239
+ @cached_property
240
+ def _storage_client(self) -> SmartApifyStorageClient:
241
+ """Storage client used by the actor.
241
242
 
243
+ Depending on the initialization of the service locator the client can be created in different ways.
244
+ """
242
245
  try:
243
- # Set implicit default local storage client, unless local storage client was already set.
244
- implicit_storage_client = ApifyFileSystemStorageClient()
246
+ # Nothing was set by the user.
247
+ implicit_storage_client = SmartApifyStorageClient(
248
+ local_storage_client=ApifyFileSystemStorageClient(), cloud_storage_client=ApifyStorageClient()
249
+ )
245
250
  service_locator.set_storage_client(implicit_storage_client)
246
- self._local_storage_client = implicit_storage_client
247
251
  except ServiceConflictError:
248
252
  self.log.debug(
249
253
  'Storage client in service locator was set explicitly before Actor.init was called.'
250
254
  'Using the existing storage client as implicit storage client for the Actor.'
251
255
  )
252
-
253
- self._local_storage_client = service_locator.get_storage_client()
254
- if type(self._local_storage_client) is FileSystemStorageClient:
255
- self.log.warning(
256
- f'Using {FileSystemStorageClient.__module__}.{FileSystemStorageClient.__name__} in Actor context is not'
257
- f' recommended and can lead to problems with reading the input file. Use '
258
- f'`apify.storage_clients.FileSystemStorageClient` instead.'
259
- )
260
-
261
- return self._local_storage_client
262
-
263
- def _raise_if_not_initialized(self) -> None:
264
- if not self._is_initialized:
265
- raise RuntimeError('The Actor was not initialized!')
266
-
267
- def _raise_if_cloud_requested_but_not_configured(self, *, force_cloud: bool) -> None:
268
- if not force_cloud:
269
- return
270
-
271
- if not self.is_at_home() and self.configuration.token is None:
272
- raise RuntimeError(
273
- 'In order to use the Apify cloud storage from your computer, '
274
- 'you need to provide an Apify token using the APIFY_TOKEN environment variable.'
275
- )
256
+ else:
257
+ return implicit_storage_client
258
+
259
+ # User set something in the service locator.
260
+ explicit_storage_client = service_locator.get_storage_client()
261
+ if isinstance(explicit_storage_client, SmartApifyStorageClient):
262
+ # The client was manually set to the right type in the service locator. This is the explicit way.
263
+ return explicit_storage_client
264
+
265
+ raise RuntimeError(
266
+ 'The storage client in the service locator has to be instance of SmartApifyStorageClient. If you want to '
267
+ 'set the storage client manually you have to call '
268
+ '`service_locator.set_storage_client(SmartApifyStorageClient(...))` before entering Actor context or '
269
+ 'awaiting `Actor.init`.'
270
+ )
276
271
 
277
272
  async def init(self) -> None:
278
273
  """Initialize the Actor instance.
@@ -285,6 +280,7 @@ class _ActorType:
285
280
  This method should be called immediately before performing any additional Actor actions, and it should be
286
281
  called only once.
287
282
  """
283
+ self.log.info('Initializing Actor...')
288
284
  if self._configuration:
289
285
  # Set explicitly the configuration in the service locator
290
286
  service_locator.set_configuration(self.configuration)
@@ -298,22 +294,13 @@ class _ActorType:
298
294
  if _ActorType._is_any_instance_initialized:
299
295
  self.log.warning('Repeated Actor initialization detected - this is non-standard usage, proceed with care')
300
296
 
301
- # Create an instance of the cloud storage client, the local storage client is obtained
302
- # from the service locator
303
- self._cloud_storage_client = ApifyStorageClient()
304
-
305
297
  # Make sure that the currently initialized instance is also available through the global `Actor` proxy
306
298
  cast('Proxy', Actor).__wrapped__ = self
307
299
 
308
300
  self._is_exiting = False
309
301
  self._was_final_persist_state_emitted = False
310
302
 
311
- # If the Actor is running on the Apify platform, we set the cloud storage client.
312
- if self.is_at_home():
313
- service_locator.set_storage_client(self._cloud_storage_client)
314
- self._local_storage_client = self._cloud_storage_client
315
- else:
316
- self._get_local_storage_client()
303
+ self.log.debug(f'Storage client set to {self._storage_client}')
317
304
 
318
305
  service_locator.set_event_manager(self.event_manager)
319
306
 
@@ -321,7 +308,6 @@ class _ActorType:
321
308
  if self._configure_logging:
322
309
  _configure_logging()
323
310
 
324
- self.log.info('Initializing Actor...')
325
311
  self.log.info('System info', extra=get_system_info())
326
312
 
327
313
  await self.event_manager.__aenter__()
@@ -470,16 +456,11 @@ class _ActorType:
470
456
  An instance of the `Dataset` class for the given ID or name.
471
457
  """
472
458
  self._raise_if_not_initialized()
473
- self._raise_if_cloud_requested_but_not_configured(force_cloud=force_cloud)
474
-
475
- storage_client = self._cloud_storage_client if force_cloud else self._get_local_storage_client()
476
-
477
459
  return await Dataset.open(
478
460
  id=id,
479
- alias=alias,
480
461
  name=name,
481
- configuration=self.configuration,
482
- storage_client=storage_client,
462
+ alias=alias,
463
+ storage_client=self._storage_client.get_suitable_storage_client(force_cloud=force_cloud),
483
464
  )
484
465
 
485
466
  async def open_key_value_store(
@@ -509,16 +490,11 @@ class _ActorType:
509
490
  An instance of the `KeyValueStore` class for the given ID or name.
510
491
  """
511
492
  self._raise_if_not_initialized()
512
- self._raise_if_cloud_requested_but_not_configured(force_cloud=force_cloud)
513
-
514
- storage_client = self._cloud_storage_client if force_cloud else self._get_local_storage_client()
515
-
516
493
  return await KeyValueStore.open(
517
494
  id=id,
518
- alias=alias,
519
495
  name=name,
520
- configuration=self.configuration,
521
- storage_client=storage_client,
496
+ alias=alias,
497
+ storage_client=self._storage_client.get_suitable_storage_client(force_cloud=force_cloud),
522
498
  )
523
499
 
524
500
  async def open_request_queue(
@@ -550,16 +526,11 @@ class _ActorType:
550
526
  An instance of the `RequestQueue` class for the given ID or name.
551
527
  """
552
528
  self._raise_if_not_initialized()
553
- self._raise_if_cloud_requested_but_not_configured(force_cloud=force_cloud)
554
-
555
- storage_client = self._cloud_storage_client if force_cloud else self._get_local_storage_client()
556
-
557
529
  return await RequestQueue.open(
558
530
  id=id,
559
- alias=alias,
560
531
  name=name,
561
- configuration=self.configuration,
562
- storage_client=storage_client,
532
+ alias=alias,
533
+ storage_client=self._storage_client.get_suitable_storage_client(force_cloud=force_cloud),
563
534
  )
564
535
 
565
536
  @overload
@@ -2,9 +2,11 @@ from crawlee.storage_clients import MemoryStorageClient
2
2
 
3
3
  from ._apify import ApifyStorageClient
4
4
  from ._file_system import ApifyFileSystemStorageClient as FileSystemStorageClient
5
+ from ._smart_apify import SmartApifyStorageClient
5
6
 
6
7
  __all__ = [
7
8
  'ApifyStorageClient',
8
9
  'FileSystemStorageClient',
9
10
  'MemoryStorageClient',
11
+ 'SmartApifyStorageClient',
10
12
  ]