apify 2.7.0__tar.gz → 2.7.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.

Files changed (210) hide show
  1. {apify-2.7.0 → apify-2.7.1}/.github/workflows/pre_release.yaml +4 -4
  2. {apify-2.7.0 → apify-2.7.1}/.github/workflows/release.yaml +4 -4
  3. {apify-2.7.0 → apify-2.7.1}/.github/workflows/run_code_checks.yaml +4 -4
  4. {apify-2.7.0 → apify-2.7.1}/CHANGELOG.md +8 -5
  5. {apify-2.7.0 → apify-2.7.1}/CONTRIBUTING.md +1 -1
  6. {apify-2.7.0 → apify-2.7.1}/PKG-INFO +3 -2
  7. {apify-2.7.0 → apify-2.7.1}/docs/01_overview/02_running_actors_locally.mdx +1 -1
  8. {apify-2.7.0 → apify-2.7.1}/pyproject.toml +5 -4
  9. {apify-2.7.0 → apify-2.7.1}/src/apify/_actor.py +1 -2
  10. {apify-2.7.0 → apify-2.7.1}/src/apify/_charging.py +3 -2
  11. {apify-2.7.0 → apify-2.7.1}/src/apify/_models.py +1 -1
  12. {apify-2.7.0 → apify-2.7.1}/src/apify/_platform_event_manager.py +20 -5
  13. {apify-2.7.0 → apify-2.7.1}/src/apify/_utils.py +1 -4
  14. {apify-2.7.0 → apify-2.7.1}/src/apify/storages/_request_list.py +2 -2
  15. {apify-2.7.0 → apify-2.7.1}/tests/integration/conftest.py +2 -2
  16. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_events.py +1 -3
  17. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_actor_lifecycle.py +1 -3
  18. {apify-2.7.0 → apify-2.7.1}/tests/unit/conftest.py +22 -3
  19. {apify-2.7.0 → apify-2.7.1}/tests/unit/test_platform_event_manager.py +1 -4
  20. {apify-2.7.0 → apify-2.7.1}/uv.lock +500 -229
  21. {apify-2.7.0 → apify-2.7.1}/website/package-lock.json +1010 -598
  22. {apify-2.7.0 → apify-2.7.1}/website/package.json +1 -1
  23. {apify-2.7.0 → apify-2.7.1}/website/src/pages/index.module.css +1 -1
  24. {apify-2.7.0 → apify-2.7.1}/.editorconfig +0 -0
  25. {apify-2.7.0 → apify-2.7.1}/.github/CODEOWNERS +0 -0
  26. {apify-2.7.0 → apify-2.7.1}/.github/workflows/build_and_deploy_docs.yaml +0 -0
  27. {apify-2.7.0 → apify-2.7.1}/.github/workflows/check_pr_title.yaml +0 -0
  28. {apify-2.7.0 → apify-2.7.1}/.github/workflows/update_new_issue.yaml +0 -0
  29. {apify-2.7.0 → apify-2.7.1}/.gitignore +0 -0
  30. {apify-2.7.0 → apify-2.7.1}/.markdownlint.yaml +0 -0
  31. {apify-2.7.0 → apify-2.7.1}/.pre-commit-config.yaml +0 -0
  32. {apify-2.7.0 → apify-2.7.1}/LICENSE +0 -0
  33. {apify-2.7.0 → apify-2.7.1}/Makefile +0 -0
  34. {apify-2.7.0 → apify-2.7.1}/README.md +0 -0
  35. {apify-2.7.0 → apify-2.7.1}/docs/01_overview/01_introduction.mdx +0 -0
  36. {apify-2.7.0 → apify-2.7.1}/docs/01_overview/03_actor_structure.mdx +0 -0
  37. {apify-2.7.0 → apify-2.7.1}/docs/01_overview/code/01_introduction.py +0 -0
  38. {apify-2.7.0 → apify-2.7.1}/docs/01_overview/code/actor_structure/__init__.py +0 -0
  39. {apify-2.7.0 → apify-2.7.1}/docs/01_overview/code/actor_structure/__main__.py +0 -0
  40. {apify-2.7.0 → apify-2.7.1}/docs/01_overview/code/actor_structure/main.py +0 -0
  41. {apify-2.7.0 → apify-2.7.1}/docs/01_overview/code/actor_structure/py.typed +0 -0
  42. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/01_beautifulsoup_httpx.mdx +0 -0
  43. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/02_crawlee.mdx +0 -0
  44. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/03_playwright.mdx +0 -0
  45. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/04_selenium.mdx +0 -0
  46. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/05_scrapy.mdx +0 -0
  47. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/01_beautifulsoup_httpx.py +0 -0
  48. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/02_crawlee_beautifulsoup.py +0 -0
  49. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/02_crawlee_playwright.py +0 -0
  50. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/03_playwright.py +0 -0
  51. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/04_selenium.py +0 -0
  52. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/__init__.py +0 -0
  53. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/__main__.py +0 -0
  54. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/items.py +0 -0
  55. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/main.py +0 -0
  56. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/py.typed +0 -0
  57. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/settings.py +0 -0
  58. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
  59. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/spiders/py.typed +0 -0
  60. {apify-2.7.0 → apify-2.7.1}/docs/02_guides/code/scrapy_project/src/spiders/title.py +0 -0
  61. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/01_actor_lifecycle.mdx +0 -0
  62. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/02_actor_input.mdx +0 -0
  63. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/03_storages.mdx +0 -0
  64. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/04_actor_events.mdx +0 -0
  65. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/05_proxy_management.mdx +0 -0
  66. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/06_interacting_with_other_actors.mdx +0 -0
  67. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/07_webhooks.mdx +0 -0
  68. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/08_access_apify_api.mdx +0 -0
  69. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/09_running_webserver.mdx +0 -0
  70. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/10_logging.mdx +0 -0
  71. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/11_configuration.mdx +0 -0
  72. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/12_pay_per_event.mdx +0 -0
  73. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/01_context_manager.py +0 -0
  74. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/01_init_exit.py +0 -0
  75. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/01_reboot.py +0 -0
  76. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/01_status_message.py +0 -0
  77. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/02_input.py +0 -0
  78. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/03_dataset_exports.py +0 -0
  79. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/03_dataset_read_write.py +0 -0
  80. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/03_deleting_storages.py +0 -0
  81. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/03_kvs_iterating.py +0 -0
  82. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/03_kvs_public_url.py +0 -0
  83. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/03_kvs_read_write.py +0 -0
  84. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/03_opening_storages.py +0 -0
  85. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/03_rq.py +0 -0
  86. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/04_actor_events.py +0 -0
  87. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/05_apify_proxy.py +0 -0
  88. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/05_apify_proxy_config.py +0 -0
  89. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/05_custom_proxy.py +0 -0
  90. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/05_custom_proxy_function.py +0 -0
  91. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/05_proxy_actor_input.py +0 -0
  92. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/05_proxy_httpx.py +0 -0
  93. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/05_proxy_rotation.py +0 -0
  94. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/06_interacting_call.py +0 -0
  95. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/06_interacting_call_task.py +0 -0
  96. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/06_interacting_metamorph.py +0 -0
  97. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/06_interacting_start.py +0 -0
  98. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/07_webhook.py +0 -0
  99. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/07_webhook_preventing.py +0 -0
  100. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/08_actor_client.py +0 -0
  101. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/08_actor_new_client.py +0 -0
  102. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/09_webserver.py +0 -0
  103. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/10_log_config.py +0 -0
  104. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/10_logger_usage.py +0 -0
  105. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/11_config.py +0 -0
  106. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/actor_charge.py +0 -0
  107. {apify-2.7.0 → apify-2.7.1}/docs/03_concepts/code/conditional_actor_charge.py +0 -0
  108. {apify-2.7.0 → apify-2.7.1}/docs/04_upgrading/upgrading_to_v2.md +0 -0
  109. {apify-2.7.0 → apify-2.7.1}/docs/pyproject.toml +0 -0
  110. {apify-2.7.0 → apify-2.7.1}/renovate.json +0 -0
  111. {apify-2.7.0 → apify-2.7.1}/src/apify/__init__.py +0 -0
  112. {apify-2.7.0 → apify-2.7.1}/src/apify/_configuration.py +0 -0
  113. {apify-2.7.0 → apify-2.7.1}/src/apify/_consts.py +0 -0
  114. {apify-2.7.0 → apify-2.7.1}/src/apify/_crypto.py +0 -0
  115. {apify-2.7.0 → apify-2.7.1}/src/apify/_proxy_configuration.py +0 -0
  116. {apify-2.7.0 → apify-2.7.1}/src/apify/apify_storage_client/__init__.py +0 -0
  117. {apify-2.7.0 → apify-2.7.1}/src/apify/apify_storage_client/_apify_storage_client.py +0 -0
  118. {apify-2.7.0 → apify-2.7.1}/src/apify/apify_storage_client/_dataset_client.py +0 -0
  119. {apify-2.7.0 → apify-2.7.1}/src/apify/apify_storage_client/_dataset_collection_client.py +0 -0
  120. {apify-2.7.0 → apify-2.7.1}/src/apify/apify_storage_client/_key_value_store_client.py +0 -0
  121. {apify-2.7.0 → apify-2.7.1}/src/apify/apify_storage_client/_key_value_store_collection_client.py +0 -0
  122. {apify-2.7.0 → apify-2.7.1}/src/apify/apify_storage_client/_request_queue_client.py +0 -0
  123. {apify-2.7.0 → apify-2.7.1}/src/apify/apify_storage_client/_request_queue_collection_client.py +0 -0
  124. {apify-2.7.0 → apify-2.7.1}/src/apify/apify_storage_client/py.typed +0 -0
  125. {apify-2.7.0 → apify-2.7.1}/src/apify/log.py +0 -0
  126. {apify-2.7.0 → apify-2.7.1}/src/apify/py.typed +0 -0
  127. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/__init__.py +0 -0
  128. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/_actor_runner.py +0 -0
  129. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/_async_thread.py +0 -0
  130. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/_logging_config.py +0 -0
  131. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/extensions/__init__.py +0 -0
  132. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/extensions/_httpcache.py +0 -0
  133. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/middlewares/__init__.py +0 -0
  134. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
  135. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/middlewares/py.typed +0 -0
  136. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/pipelines/__init__.py +0 -0
  137. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
  138. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/pipelines/py.typed +0 -0
  139. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/py.typed +0 -0
  140. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/requests.py +0 -0
  141. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/scheduler.py +0 -0
  142. {apify-2.7.0 → apify-2.7.1}/src/apify/scrapy/utils.py +0 -0
  143. {apify-2.7.0 → apify-2.7.1}/src/apify/storages/__init__.py +0 -0
  144. {apify-2.7.0 → apify-2.7.1}/src/apify/storages/py.typed +0 -0
  145. {apify-2.7.0 → apify-2.7.1}/tests/integration/README.md +0 -0
  146. {apify-2.7.0 → apify-2.7.1}/tests/integration/__init__.py +0 -0
  147. {apify-2.7.0 → apify-2.7.1}/tests/integration/_utils.py +0 -0
  148. {apify-2.7.0 → apify-2.7.1}/tests/integration/actor_source_base/Dockerfile +0 -0
  149. {apify-2.7.0 → apify-2.7.1}/tests/integration/actor_source_base/requirements.txt +0 -0
  150. {apify-2.7.0 → apify-2.7.1}/tests/integration/actor_source_base/src/__init__.py +0 -0
  151. {apify-2.7.0 → apify-2.7.1}/tests/integration/actor_source_base/src/__main__.py +0 -0
  152. {apify-2.7.0 → apify-2.7.1}/tests/integration/actor_source_base/src/main.py +0 -0
  153. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_api_helpers.py +0 -0
  154. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_call_timeouts.py +0 -0
  155. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_charge.py +0 -0
  156. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
  157. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_dataset.py +0 -0
  158. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_key_value_store.py +0 -0
  159. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_lifecycle.py +0 -0
  160. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_log.py +0 -0
  161. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_request_queue.py +0 -0
  162. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_actor_scrapy.py +0 -0
  163. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_fixtures.py +0 -0
  164. {apify-2.7.0 → apify-2.7.1}/tests/integration/test_request_queue.py +0 -0
  165. {apify-2.7.0 → apify-2.7.1}/tests/unit/__init__.py +0 -0
  166. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/__init__.py +0 -0
  167. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
  168. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_actor_dataset.py +0 -0
  169. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_actor_env_helpers.py +0 -0
  170. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_actor_helpers.py +0 -0
  171. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_actor_key_value_store.py +0 -0
  172. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_actor_log.py +0 -0
  173. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
  174. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_actor_request_queue.py +0 -0
  175. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_configuration.py +0 -0
  176. {apify-2.7.0 → apify-2.7.1}/tests/unit/actor/test_request_list.py +0 -0
  177. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/__init__.py +0 -0
  178. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/extensions/__init__.py +0 -0
  179. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
  180. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/middlewares/__init__.py +0 -0
  181. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
  182. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/pipelines/__init__.py +0 -0
  183. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
  184. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/requests/__init__.py +0 -0
  185. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
  186. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
  187. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/utils/__init__.py +0 -0
  188. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
  189. {apify-2.7.0 → apify-2.7.1}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
  190. {apify-2.7.0 → apify-2.7.1}/tests/unit/test_crypto.py +0 -0
  191. {apify-2.7.0 → apify-2.7.1}/tests/unit/test_proxy_configuration.py +0 -0
  192. {apify-2.7.0 → apify-2.7.1}/website/.eslintrc.json +0 -0
  193. {apify-2.7.0 → apify-2.7.1}/website/babel.config.js +0 -0
  194. {apify-2.7.0 → apify-2.7.1}/website/build_api_reference.sh +0 -0
  195. {apify-2.7.0 → apify-2.7.1}/website/docusaurus.config.js +0 -0
  196. {apify-2.7.0 → apify-2.7.1}/website/generate_module_shortcuts.py +0 -0
  197. {apify-2.7.0 → apify-2.7.1}/website/sidebars.js +0 -0
  198. {apify-2.7.0 → apify-2.7.1}/website/src/components/ApiLink.jsx +0 -0
  199. {apify-2.7.0 → apify-2.7.1}/website/src/components/Gradients.jsx +0 -0
  200. {apify-2.7.0 → apify-2.7.1}/website/src/components/Highlights.jsx +0 -0
  201. {apify-2.7.0 → apify-2.7.1}/website/src/components/Highlights.module.css +0 -0
  202. {apify-2.7.0 → apify-2.7.1}/website/src/components/RunnableCodeBlock.jsx +0 -0
  203. {apify-2.7.0 → apify-2.7.1}/website/src/components/RunnableCodeBlock.module.css +0 -0
  204. {apify-2.7.0 → apify-2.7.1}/website/src/css/custom.css +0 -0
  205. {apify-2.7.0 → apify-2.7.1}/website/src/pages/home_page_example.py +0 -0
  206. {apify-2.7.0 → apify-2.7.1}/website/src/pages/index.js +0 -0
  207. {apify-2.7.0 → apify-2.7.1}/website/static/.nojekyll +0 -0
  208. {apify-2.7.0 → apify-2.7.1}/website/static/img/docs-og.png +0 -0
  209. {apify-2.7.0 → apify-2.7.1}/website/tools/docs-prettier.config.js +0 -0
  210. {apify-2.7.0 → apify-2.7.1}/website/tools/utils/externalLink.js +0 -0
@@ -32,26 +32,26 @@ jobs:
32
32
  name: Lint check
33
33
  uses: apify/workflows/.github/workflows/python_lint_check.yaml@main
34
34
  with:
35
- python-versions: '["3.10", "3.11", "3.12", "3.13"]'
35
+ python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
36
36
 
37
37
  type_check:
38
38
  name: Type check
39
39
  uses: apify/workflows/.github/workflows/python_type_check.yaml@main
40
40
  with:
41
- python-versions: '["3.10", "3.11", "3.12", "3.13"]'
41
+ python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
42
42
 
43
43
  unit_tests:
44
44
  name: Unit tests
45
45
  uses: apify/workflows/.github/workflows/python_unit_tests.yaml@main
46
46
  with:
47
- python-versions: '["3.10", "3.11", "3.12", "3.13"]'
47
+ python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
48
48
 
49
49
  integration_tests:
50
50
  name: Integration tests
51
51
  uses: apify/workflows/.github/workflows/python_integration_tests.yaml@main
52
52
  secrets: inherit
53
53
  with:
54
- python-versions: '["3.10", "3.13"]'
54
+ python-versions: '["3.9", "3.13"]'
55
55
 
56
56
  update_changelog:
57
57
  name: Update changelog
@@ -43,26 +43,26 @@ jobs:
43
43
  name: Lint check
44
44
  uses: apify/workflows/.github/workflows/python_lint_check.yaml@main
45
45
  with:
46
- python-versions: '["3.10", "3.11", "3.12", "3.13"]'
46
+ python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
47
47
 
48
48
  type_check:
49
49
  name: Type check
50
50
  uses: apify/workflows/.github/workflows/python_type_check.yaml@main
51
51
  with:
52
- python-versions: '["3.10", "3.11", "3.12", "3.13"]'
52
+ python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
53
53
 
54
54
  unit_tests:
55
55
  name: Unit tests
56
56
  uses: apify/workflows/.github/workflows/python_unit_tests.yaml@main
57
57
  with:
58
- python-versions: '["3.10", "3.11", "3.12", "3.13"]'
58
+ python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
59
59
 
60
60
  integration_tests:
61
61
  name: Integration tests
62
62
  uses: apify/workflows/.github/workflows/python_integration_tests.yaml@main
63
63
  secrets: inherit
64
64
  with:
65
- python-versions: '["3.10", "3.13"]'
65
+ python-versions: '["3.9", "3.13"]'
66
66
 
67
67
  update_changelog:
68
68
  name: Update changelog
@@ -11,19 +11,19 @@ jobs:
11
11
  name: Lint check
12
12
  uses: apify/workflows/.github/workflows/python_lint_check.yaml@main
13
13
  with:
14
- python-versions: '["3.10", "3.11", "3.12", "3.13"]'
14
+ python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
15
15
 
16
16
  type_check:
17
17
  name: Type check
18
18
  uses: apify/workflows/.github/workflows/python_type_check.yaml@main
19
19
  with:
20
- python-versions: '["3.10", "3.11", "3.12", "3.13"]'
20
+ python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
21
21
 
22
22
  unit_tests:
23
23
  name: Unit tests
24
24
  uses: apify/workflows/.github/workflows/python_unit_tests.yaml@main
25
25
  with:
26
- python-versions: '["3.10", "3.11", "3.12", "3.13"]'
26
+ python-versions: '["3.9", "3.10", "3.11", "3.12", "3.13"]'
27
27
 
28
28
  docs_check:
29
29
  name: Docs check
@@ -35,4 +35,4 @@ jobs:
35
35
  uses: apify/workflows/.github/workflows/python_integration_tests.yaml@main
36
36
  secrets: inherit
37
37
  with:
38
- python-versions: '["3.10", "3.13"]'
38
+ python-versions: '["3.9", "3.13"]'
@@ -2,6 +2,14 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [2.7.1](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.1) (2025-07-24)
6
+
7
+ ### 🚀 Features
8
+
9
+ - **crypto:** Decrypt secret objects (#482) ([4d62f46](https://github.com/apify/apify-sdk-python/commit/4d62f466b1d4d717fdb0ebacfeb30df49aa6d742))
10
+
11
+
12
+
5
13
  ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
6
14
 
7
15
  ### 🚀 Features
@@ -9,11 +17,6 @@ All notable changes to this project will be documented in this file.
9
17
  - Expose `logger` argument on `Actor.call` to control log redirection from started Actor run ([#487](https://github.com/apify/apify-sdk-python/pull/487)) ([aa6fa47](https://github.com/apify/apify-sdk-python/commit/aa6fa4750ea1bc7909be1191c0d276a2046930c2)) by [@Pijukatel](https://github.com/Pijukatel)
10
18
  - **crypto:** Decrypt secret objects ([#482](https://github.com/apify/apify-sdk-python/pull/482)) ([ce9daf7](https://github.com/apify/apify-sdk-python/commit/ce9daf7381212b8dc194e8a643e5ca0dedbc0078)) by [@MFori](https://github.com/MFori)
11
19
 
12
- ### 🐛 Bug Fixes
13
-
14
- - 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)
15
- - 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)
16
-
17
20
 
18
21
  ## [2.6.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.6.0) (2025-06-09)
19
22
 
@@ -4,7 +4,7 @@ Here you'll find a contributing guide to get started with development.
4
4
 
5
5
  ## Environment
6
6
 
7
- For local development, it is required to have Python 3.10 (or a later version) installed.
7
+ For local development, it is required to have Python 3.9 (or a later version) installed.
8
8
 
9
9
  We use [uv](https://docs.astral.sh/uv/) for project management. Install it and set up your IDE accordingly.
10
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apify
3
- Version: 2.7.0
3
+ Version: 2.7.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
@@ -219,12 +219,13 @@ Classifier: Environment :: Console
219
219
  Classifier: Intended Audience :: Developers
220
220
  Classifier: License :: OSI Approved :: Apache Software License
221
221
  Classifier: Operating System :: OS Independent
222
+ Classifier: Programming Language :: Python :: 3.9
222
223
  Classifier: Programming Language :: Python :: 3.10
223
224
  Classifier: Programming Language :: Python :: 3.11
224
225
  Classifier: Programming Language :: Python :: 3.12
225
226
  Classifier: Programming Language :: Python :: 3.13
226
227
  Classifier: Topic :: Software Development :: Libraries
227
- Requires-Python: >=3.10
228
+ Requires-Python: >=3.9
228
229
  Requires-Dist: apify-client>=1.11.0
229
230
  Requires-Dist: apify-shared>=1.3.0
230
231
  Requires-Dist: crawlee~=0.6.0
@@ -11,7 +11,7 @@ In this page, you'll learn how to create and run Apify Actors locally on your co
11
11
 
12
12
  ## Requirements
13
13
 
14
- The Apify SDK requires Python version 3.10 or above to run Python Actors locally.
14
+ The Apify SDK requires Python version 3.9 or above to run Python Actors locally.
15
15
 
16
16
  ## Creating your first Actor
17
17
 
@@ -4,18 +4,19 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "apify"
7
- version = "2.7.0"
7
+ version = "2.7.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" }
11
11
  readme = "README.md"
12
- requires-python = ">=3.10"
12
+ requires-python = ">=3.9"
13
13
  classifiers = [
14
14
  "Development Status :: 5 - Production/Stable",
15
15
  "Environment :: Console",
16
16
  "Intended Audience :: Developers",
17
17
  "License :: OSI Approved :: Apache Software License",
18
18
  "Operating System :: OS Independent",
19
+ "Programming Language :: Python :: 3.9",
19
20
  "Programming Language :: Python :: 3.10",
20
21
  "Programming Language :: Python :: 3.11",
21
22
  "Programming Language :: Python :: 3.12",
@@ -187,7 +188,7 @@ asyncio_mode = "auto"
187
188
  timeout = 1200
188
189
 
189
190
  [tool.mypy]
190
- python_version = "3.10"
191
+ python_version = "3.9"
191
192
  plugins = ["pydantic.mypy"]
192
193
  files = ["src", "tests", "docs", "website"]
193
194
  check_untyped_defs = true
@@ -214,7 +215,7 @@ module = [
214
215
  ignore_missing_imports = true
215
216
 
216
217
  [tool.basedpyright]
217
- pythonVersion = "3.10"
218
+ pythonVersion = "3.9"
218
219
  typeCheckingMode = "standard"
219
220
  include = ["src", "tests", "docs", "website"]
220
221
 
@@ -5,7 +5,7 @@ import os
5
5
  import sys
6
6
  from contextlib import suppress
7
7
  from datetime import datetime, timedelta, timezone
8
- from typing import TYPE_CHECKING, Any, Literal, TypeVar, cast, overload
8
+ from typing import TYPE_CHECKING, Any, Callable, Literal, TypeVar, cast, overload
9
9
 
10
10
  from lazy_object_proxy import Proxy
11
11
  from more_itertools import flatten
@@ -39,7 +39,6 @@ from apify.storages import Dataset, KeyValueStore, RequestQueue
39
39
 
40
40
  if TYPE_CHECKING:
41
41
  import logging
42
- from collections.abc import Callable
43
42
  from types import TracebackType
44
43
 
45
44
  from typing_extensions import Self
@@ -4,7 +4,7 @@ import math
4
4
  from dataclasses import dataclass
5
5
  from datetime import datetime, timezone
6
6
  from decimal import Decimal
7
- from typing import TYPE_CHECKING, Protocol
7
+ from typing import TYPE_CHECKING, Protocol, Union
8
8
 
9
9
  from pydantic import TypeAdapter
10
10
 
@@ -23,7 +23,8 @@ if TYPE_CHECKING:
23
23
 
24
24
  from apify._configuration import Configuration
25
25
 
26
- run_validator = TypeAdapter[ActorRun | None](ActorRun | None)
26
+
27
+ run_validator: TypeAdapter[ActorRun | None] = TypeAdapter(Union[ActorRun, None])
27
28
 
28
29
 
29
30
  @docs_group('Interfaces')
@@ -13,7 +13,7 @@ from crawlee._utils.urls import validate_http_url
13
13
  from apify._utils import docs_group
14
14
 
15
15
  if TYPE_CHECKING:
16
- from typing import TypeAlias
16
+ from typing_extensions import TypeAlias
17
17
 
18
18
 
19
19
  @docs_group('Data structures')
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  from datetime import datetime
5
- from typing import TYPE_CHECKING, Annotated, Any, Literal
5
+ from typing import TYPE_CHECKING, Annotated, Any, Literal, Union
6
6
 
7
7
  import websockets.asyncio.client
8
8
  from pydantic import BaseModel, Discriminator, Field, TypeAdapter
@@ -113,10 +113,25 @@ class UnknownEvent(BaseModel):
113
113
  data: Annotated[dict[str, Any], Field(default_factory=dict)]
114
114
 
115
115
 
116
- EventMessage = PersistStateEvent | SystemInfoEvent | MigratingEvent | AbortingEvent | ExitEvent | EventWithoutData
117
-
118
- event_data_adapter = TypeAdapter[EventMessage | DeprecatedEvent | UnknownEvent](
119
- Annotated[EventMessage, Discriminator('name')] | DeprecatedEvent | UnknownEvent
116
+ EventMessage = Union[
117
+ PersistStateEvent,
118
+ SystemInfoEvent,
119
+ MigratingEvent,
120
+ AbortingEvent,
121
+ ExitEvent,
122
+ EventWithoutData,
123
+ ]
124
+
125
+
126
+ event_data_adapter: TypeAdapter[EventMessage | DeprecatedEvent | UnknownEvent] = TypeAdapter(
127
+ Union[
128
+ Annotated[
129
+ EventMessage,
130
+ Discriminator('name'),
131
+ ],
132
+ DeprecatedEvent,
133
+ UnknownEvent,
134
+ ]
120
135
  )
121
136
 
122
137
 
@@ -3,10 +3,7 @@ from __future__ import annotations
3
3
  import builtins
4
4
  import sys
5
5
  from importlib import metadata
6
- from typing import TYPE_CHECKING, Literal
7
-
8
- if TYPE_CHECKING:
9
- from collections.abc import Callable
6
+ from typing import Callable, Literal
10
7
 
11
8
 
12
9
  def get_system_info() -> dict:
@@ -4,7 +4,7 @@ import asyncio
4
4
  import re
5
5
  from asyncio import Task
6
6
  from functools import partial
7
- from typing import Annotated, Any
7
+ from typing import Annotated, Any, Union
8
8
 
9
9
  from pydantic import BaseModel, Field, TypeAdapter
10
10
 
@@ -35,7 +35,7 @@ class _SimpleUrlInput(_RequestDetails):
35
35
  url: str
36
36
 
37
37
 
38
- url_input_adapter = TypeAdapter(list[_RequestsFromUrlInput | _SimpleUrlInput])
38
+ url_input_adapter = TypeAdapter(list[Union[_RequestsFromUrlInput, _SimpleUrlInput]])
39
39
 
40
40
 
41
41
  @docs_group('Classes')
@@ -7,7 +7,7 @@ import subprocess
7
7
  import sys
8
8
  import textwrap
9
9
  from pathlib import Path
10
- from typing import TYPE_CHECKING, Any, Protocol
10
+ from typing import TYPE_CHECKING, Any, Callable, Protocol
11
11
 
12
12
  import pytest
13
13
  from filelock import FileLock
@@ -22,7 +22,7 @@ from ._utils import generate_unique_resource_name
22
22
  from apify._models import ActorRun
23
23
 
24
24
  if TYPE_CHECKING:
25
- from collections.abc import Awaitable, Callable, Coroutine, Iterator, Mapping
25
+ from collections.abc import Awaitable, Coroutine, Iterator, Mapping
26
26
  from decimal import Decimal
27
27
 
28
28
  from apify_client.clients.resource_clients import ActorClientAsync
@@ -16,11 +16,9 @@ async def test_emit_and_capture_interval_events(
16
16
  run_actor: RunActorFunction,
17
17
  ) -> None:
18
18
  async def main() -> None:
19
- # TC003 - TYPE_CHECKING section is problematic for our integration tests.
20
19
  import os
21
- from collections.abc import Callable # noqa: TC003
22
20
  from datetime import datetime
23
- from typing import Any
21
+ from typing import Any, Callable
24
22
 
25
23
  from apify_shared.consts import ActorEventTypes, ApifyEnvVars
26
24
  from crawlee.events._types import Event, EventSystemInfoData
@@ -5,7 +5,7 @@ import contextlib
5
5
  import json
6
6
  import sys
7
7
  from datetime import datetime, timezone
8
- from typing import TYPE_CHECKING, Any, cast
8
+ from typing import TYPE_CHECKING, Any, Callable, cast
9
9
  from unittest.mock import AsyncMock, Mock
10
10
 
11
11
  import pytest
@@ -19,8 +19,6 @@ from apify import Actor
19
19
  from apify._actor import _ActorType
20
20
 
21
21
  if TYPE_CHECKING:
22
- from collections.abc import Callable
23
-
24
22
  from lazy_object_proxy import Proxy
25
23
 
26
24
 
@@ -4,7 +4,8 @@ import asyncio
4
4
  import inspect
5
5
  import os
6
6
  from collections import defaultdict
7
- from typing import TYPE_CHECKING, Any, get_type_hints
7
+ from copy import deepcopy
8
+ from typing import TYPE_CHECKING, Any, Callable, get_type_hints
8
9
 
9
10
  import pytest
10
11
 
@@ -18,7 +19,6 @@ from crawlee.storages import _creation_management
18
19
  import apify._actor
19
20
 
20
21
  if TYPE_CHECKING:
21
- from collections.abc import Callable
22
22
  from pathlib import Path
23
23
 
24
24
 
@@ -125,7 +125,26 @@ class ApifyClientAsyncPatcher:
125
125
  if not client_method:
126
126
  raise ValueError(f'ApifyClientAsync does not contain method "{method}"!')
127
127
 
128
- client_method_return_type = get_type_hints(client_method)['return']
128
+ try:
129
+ # Try to get the return type of the client method using `typing.get_type_hints()`
130
+ client_method_return_type = get_type_hints(client_method)['return']
131
+ except TypeError:
132
+ # There is a known issue with `typing.get_type_hints()` on Python 3.9. It raises a `TypeError`
133
+ # when `|` (Union) is used in the type hint, even with `from __future__ import annotations`. Since we
134
+ # only need the return type, we attempt the following workaround.
135
+
136
+ # 1. Create a deep copy of the client method object
137
+ client_method_copied = deepcopy(client_method)
138
+
139
+ # 2. Restrict the annotations to only include the return type
140
+ client_method_copied.__annotations__ = {'return': client_method.__annotations__['return']}
141
+
142
+ # 3. Try to get the return type again using `typing.get_type_hints()`
143
+ client_method_return_type = get_type_hints(client_method_copied)['return']
144
+
145
+ # TODO: Remove this fallback once we drop support for Python 3.9
146
+ # https://github.com/apify/apify-sdk-python/issues/151
147
+
129
148
  original_submethod = getattr(client_method_return_type, submethod, None)
130
149
 
131
150
  if not original_submethod:
@@ -4,7 +4,7 @@ import asyncio
4
4
  import json
5
5
  import logging
6
6
  from collections import defaultdict
7
- from typing import TYPE_CHECKING, Any
7
+ from typing import Any, Callable
8
8
  from unittest.mock import Mock
9
9
 
10
10
  import pytest
@@ -17,9 +17,6 @@ from crawlee.events._types import Event
17
17
  from apify import Configuration
18
18
  from apify._platform_event_manager import PlatformEventManager, SystemInfoEventData
19
19
 
20
- if TYPE_CHECKING:
21
- from collections.abc import Callable
22
-
23
20
 
24
21
  @pytest.mark.skip(reason='There are issues with log propagation to caplog, see issue #462.')
25
22
  async def test_lifecycle_local(caplog: pytest.LogCaptureFixture) -> None: