apify 2.7.1b2__tar.gz → 2.7.2__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 (213) hide show
  1. {apify-2.7.1b2 → apify-2.7.2}/.github/workflows/pre_release.yaml +4 -4
  2. {apify-2.7.1b2 → apify-2.7.2}/.github/workflows/release.yaml +4 -4
  3. {apify-2.7.1b2 → apify-2.7.2}/.github/workflows/run_code_checks.yaml +4 -4
  4. {apify-2.7.1b2 → apify-2.7.2}/CHANGELOG.md +14 -5
  5. {apify-2.7.1b2 → apify-2.7.2}/CONTRIBUTING.md +1 -1
  6. {apify-2.7.1b2 → apify-2.7.2}/PKG-INFO +5 -4
  7. {apify-2.7.1b2 → apify-2.7.2}/docs/01_overview/02_running_actors_locally.mdx +1 -1
  8. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/10_logging.mdx +0 -30
  9. {apify-2.7.1b2 → apify-2.7.2}/pyproject.toml +9 -8
  10. {apify-2.7.1b2 → apify-2.7.2}/src/apify/_actor.py +1 -2
  11. {apify-2.7.1b2 → apify-2.7.2}/src/apify/_charging.py +3 -2
  12. {apify-2.7.1b2 → apify-2.7.2}/src/apify/_models.py +1 -1
  13. {apify-2.7.1b2 → apify-2.7.2}/src/apify/_platform_event_manager.py +20 -5
  14. {apify-2.7.1b2 → apify-2.7.2}/src/apify/_utils.py +1 -4
  15. {apify-2.7.1b2 → apify-2.7.2}/src/apify/storages/_request_list.py +2 -2
  16. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/conftest.py +2 -2
  17. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_api_helpers.py +2 -2
  18. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_events.py +1 -3
  19. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_actor_lifecycle.py +1 -3
  20. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/conftest.py +22 -3
  21. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/test_platform_event_manager.py +1 -4
  22. {apify-2.7.1b2 → apify-2.7.2}/uv.lock +423 -141
  23. {apify-2.7.1b2 → apify-2.7.2}/website/package-lock.json +1042 -631
  24. {apify-2.7.1b2 → apify-2.7.2}/website/package.json +1 -1
  25. {apify-2.7.1b2 → apify-2.7.2}/website/src/pages/index.module.css +1 -1
  26. apify-2.7.1b2/docs/03_concepts/code/10_redirect_log.py +0 -15
  27. apify-2.7.1b2/docs/03_concepts/code/10_redirect_log_existing_run.py +0 -24
  28. apify-2.7.1b2/website/static/img/guides/redirected_logs_example.webp +0 -0
  29. {apify-2.7.1b2 → apify-2.7.2}/.editorconfig +0 -0
  30. {apify-2.7.1b2 → apify-2.7.2}/.github/CODEOWNERS +0 -0
  31. {apify-2.7.1b2 → apify-2.7.2}/.github/workflows/build_and_deploy_docs.yaml +0 -0
  32. {apify-2.7.1b2 → apify-2.7.2}/.github/workflows/check_pr_title.yaml +0 -0
  33. {apify-2.7.1b2 → apify-2.7.2}/.github/workflows/update_new_issue.yaml +0 -0
  34. {apify-2.7.1b2 → apify-2.7.2}/.gitignore +0 -0
  35. {apify-2.7.1b2 → apify-2.7.2}/.markdownlint.yaml +0 -0
  36. {apify-2.7.1b2 → apify-2.7.2}/.pre-commit-config.yaml +0 -0
  37. {apify-2.7.1b2 → apify-2.7.2}/LICENSE +0 -0
  38. {apify-2.7.1b2 → apify-2.7.2}/Makefile +0 -0
  39. {apify-2.7.1b2 → apify-2.7.2}/README.md +0 -0
  40. {apify-2.7.1b2 → apify-2.7.2}/docs/01_overview/01_introduction.mdx +0 -0
  41. {apify-2.7.1b2 → apify-2.7.2}/docs/01_overview/03_actor_structure.mdx +0 -0
  42. {apify-2.7.1b2 → apify-2.7.2}/docs/01_overview/code/01_introduction.py +0 -0
  43. {apify-2.7.1b2 → apify-2.7.2}/docs/01_overview/code/actor_structure/__init__.py +0 -0
  44. {apify-2.7.1b2 → apify-2.7.2}/docs/01_overview/code/actor_structure/__main__.py +0 -0
  45. {apify-2.7.1b2 → apify-2.7.2}/docs/01_overview/code/actor_structure/main.py +0 -0
  46. {apify-2.7.1b2 → apify-2.7.2}/docs/01_overview/code/actor_structure/py.typed +0 -0
  47. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/01_beautifulsoup_httpx.mdx +0 -0
  48. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/02_crawlee.mdx +0 -0
  49. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/03_playwright.mdx +0 -0
  50. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/04_selenium.mdx +0 -0
  51. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/05_scrapy.mdx +0 -0
  52. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/01_beautifulsoup_httpx.py +0 -0
  53. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/02_crawlee_beautifulsoup.py +0 -0
  54. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/02_crawlee_playwright.py +0 -0
  55. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/03_playwright.py +0 -0
  56. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/04_selenium.py +0 -0
  57. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/scrapy_project/src/__init__.py +0 -0
  58. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/scrapy_project/src/__main__.py +0 -0
  59. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/scrapy_project/src/items.py +0 -0
  60. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/scrapy_project/src/main.py +0 -0
  61. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/scrapy_project/src/py.typed +0 -0
  62. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/scrapy_project/src/settings.py +0 -0
  63. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
  64. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/scrapy_project/src/spiders/py.typed +0 -0
  65. {apify-2.7.1b2 → apify-2.7.2}/docs/02_guides/code/scrapy_project/src/spiders/title.py +0 -0
  66. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/01_actor_lifecycle.mdx +0 -0
  67. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/02_actor_input.mdx +0 -0
  68. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/03_storages.mdx +0 -0
  69. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/04_actor_events.mdx +0 -0
  70. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/05_proxy_management.mdx +0 -0
  71. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/06_interacting_with_other_actors.mdx +0 -0
  72. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/07_webhooks.mdx +0 -0
  73. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/08_access_apify_api.mdx +0 -0
  74. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/09_running_webserver.mdx +0 -0
  75. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/11_configuration.mdx +0 -0
  76. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/12_pay_per_event.mdx +0 -0
  77. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/01_context_manager.py +0 -0
  78. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/01_init_exit.py +0 -0
  79. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/01_reboot.py +0 -0
  80. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/01_status_message.py +0 -0
  81. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/02_input.py +0 -0
  82. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/03_dataset_exports.py +0 -0
  83. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/03_dataset_read_write.py +0 -0
  84. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/03_deleting_storages.py +0 -0
  85. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/03_kvs_iterating.py +0 -0
  86. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/03_kvs_public_url.py +0 -0
  87. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/03_kvs_read_write.py +0 -0
  88. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/03_opening_storages.py +0 -0
  89. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/03_rq.py +0 -0
  90. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/04_actor_events.py +0 -0
  91. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/05_apify_proxy.py +0 -0
  92. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/05_apify_proxy_config.py +0 -0
  93. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/05_custom_proxy.py +0 -0
  94. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/05_custom_proxy_function.py +0 -0
  95. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/05_proxy_actor_input.py +0 -0
  96. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/05_proxy_httpx.py +0 -0
  97. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/05_proxy_rotation.py +0 -0
  98. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/06_interacting_call.py +0 -0
  99. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/06_interacting_call_task.py +0 -0
  100. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/06_interacting_metamorph.py +0 -0
  101. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/06_interacting_start.py +0 -0
  102. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/07_webhook.py +0 -0
  103. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/07_webhook_preventing.py +0 -0
  104. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/08_actor_client.py +0 -0
  105. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/08_actor_new_client.py +0 -0
  106. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/09_webserver.py +0 -0
  107. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/10_log_config.py +0 -0
  108. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/10_logger_usage.py +0 -0
  109. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/11_config.py +0 -0
  110. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/actor_charge.py +0 -0
  111. {apify-2.7.1b2 → apify-2.7.2}/docs/03_concepts/code/conditional_actor_charge.py +0 -0
  112. {apify-2.7.1b2 → apify-2.7.2}/docs/04_upgrading/upgrading_to_v2.md +0 -0
  113. {apify-2.7.1b2 → apify-2.7.2}/docs/pyproject.toml +0 -0
  114. {apify-2.7.1b2 → apify-2.7.2}/renovate.json +0 -0
  115. {apify-2.7.1b2 → apify-2.7.2}/src/apify/__init__.py +0 -0
  116. {apify-2.7.1b2 → apify-2.7.2}/src/apify/_configuration.py +0 -0
  117. {apify-2.7.1b2 → apify-2.7.2}/src/apify/_consts.py +0 -0
  118. {apify-2.7.1b2 → apify-2.7.2}/src/apify/_crypto.py +0 -0
  119. {apify-2.7.1b2 → apify-2.7.2}/src/apify/_proxy_configuration.py +0 -0
  120. {apify-2.7.1b2 → apify-2.7.2}/src/apify/apify_storage_client/__init__.py +0 -0
  121. {apify-2.7.1b2 → apify-2.7.2}/src/apify/apify_storage_client/_apify_storage_client.py +0 -0
  122. {apify-2.7.1b2 → apify-2.7.2}/src/apify/apify_storage_client/_dataset_client.py +0 -0
  123. {apify-2.7.1b2 → apify-2.7.2}/src/apify/apify_storage_client/_dataset_collection_client.py +0 -0
  124. {apify-2.7.1b2 → apify-2.7.2}/src/apify/apify_storage_client/_key_value_store_client.py +0 -0
  125. {apify-2.7.1b2 → apify-2.7.2}/src/apify/apify_storage_client/_key_value_store_collection_client.py +0 -0
  126. {apify-2.7.1b2 → apify-2.7.2}/src/apify/apify_storage_client/_request_queue_client.py +0 -0
  127. {apify-2.7.1b2 → apify-2.7.2}/src/apify/apify_storage_client/_request_queue_collection_client.py +0 -0
  128. {apify-2.7.1b2 → apify-2.7.2}/src/apify/apify_storage_client/py.typed +0 -0
  129. {apify-2.7.1b2 → apify-2.7.2}/src/apify/log.py +0 -0
  130. {apify-2.7.1b2 → apify-2.7.2}/src/apify/py.typed +0 -0
  131. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/__init__.py +0 -0
  132. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/_actor_runner.py +0 -0
  133. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/_async_thread.py +0 -0
  134. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/_logging_config.py +0 -0
  135. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/extensions/__init__.py +0 -0
  136. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/extensions/_httpcache.py +0 -0
  137. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/middlewares/__init__.py +0 -0
  138. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
  139. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/middlewares/py.typed +0 -0
  140. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/pipelines/__init__.py +0 -0
  141. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
  142. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/pipelines/py.typed +0 -0
  143. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/py.typed +0 -0
  144. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/requests.py +0 -0
  145. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/scheduler.py +0 -0
  146. {apify-2.7.1b2 → apify-2.7.2}/src/apify/scrapy/utils.py +0 -0
  147. {apify-2.7.1b2 → apify-2.7.2}/src/apify/storages/__init__.py +0 -0
  148. {apify-2.7.1b2 → apify-2.7.2}/src/apify/storages/py.typed +0 -0
  149. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/README.md +0 -0
  150. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/__init__.py +0 -0
  151. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/_utils.py +0 -0
  152. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/actor_source_base/Dockerfile +0 -0
  153. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/actor_source_base/requirements.txt +0 -0
  154. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/actor_source_base/src/__init__.py +0 -0
  155. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/actor_source_base/src/__main__.py +0 -0
  156. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/actor_source_base/src/main.py +0 -0
  157. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_call_timeouts.py +0 -0
  158. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_charge.py +0 -0
  159. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
  160. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_dataset.py +0 -0
  161. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_key_value_store.py +0 -0
  162. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_lifecycle.py +0 -0
  163. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_log.py +0 -0
  164. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_request_queue.py +0 -0
  165. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_actor_scrapy.py +0 -0
  166. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_fixtures.py +0 -0
  167. {apify-2.7.1b2 → apify-2.7.2}/tests/integration/test_request_queue.py +0 -0
  168. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/__init__.py +0 -0
  169. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/__init__.py +0 -0
  170. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
  171. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_actor_dataset.py +0 -0
  172. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_actor_env_helpers.py +0 -0
  173. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_actor_helpers.py +0 -0
  174. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_actor_key_value_store.py +0 -0
  175. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_actor_log.py +0 -0
  176. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
  177. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_actor_request_queue.py +0 -0
  178. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_configuration.py +0 -0
  179. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/actor/test_request_list.py +0 -0
  180. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/__init__.py +0 -0
  181. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/extensions/__init__.py +0 -0
  182. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
  183. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/middlewares/__init__.py +0 -0
  184. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
  185. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/pipelines/__init__.py +0 -0
  186. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
  187. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/requests/__init__.py +0 -0
  188. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
  189. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
  190. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/utils/__init__.py +0 -0
  191. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
  192. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
  193. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/test_crypto.py +0 -0
  194. {apify-2.7.1b2 → apify-2.7.2}/tests/unit/test_proxy_configuration.py +0 -0
  195. {apify-2.7.1b2 → apify-2.7.2}/website/.eslintrc.json +0 -0
  196. {apify-2.7.1b2 → apify-2.7.2}/website/babel.config.js +0 -0
  197. {apify-2.7.1b2 → apify-2.7.2}/website/build_api_reference.sh +0 -0
  198. {apify-2.7.1b2 → apify-2.7.2}/website/docusaurus.config.js +0 -0
  199. {apify-2.7.1b2 → apify-2.7.2}/website/generate_module_shortcuts.py +0 -0
  200. {apify-2.7.1b2 → apify-2.7.2}/website/sidebars.js +0 -0
  201. {apify-2.7.1b2 → apify-2.7.2}/website/src/components/ApiLink.jsx +0 -0
  202. {apify-2.7.1b2 → apify-2.7.2}/website/src/components/Gradients.jsx +0 -0
  203. {apify-2.7.1b2 → apify-2.7.2}/website/src/components/Highlights.jsx +0 -0
  204. {apify-2.7.1b2 → apify-2.7.2}/website/src/components/Highlights.module.css +0 -0
  205. {apify-2.7.1b2 → apify-2.7.2}/website/src/components/RunnableCodeBlock.jsx +0 -0
  206. {apify-2.7.1b2 → apify-2.7.2}/website/src/components/RunnableCodeBlock.module.css +0 -0
  207. {apify-2.7.1b2 → apify-2.7.2}/website/src/css/custom.css +0 -0
  208. {apify-2.7.1b2 → apify-2.7.2}/website/src/pages/home_page_example.py +0 -0
  209. {apify-2.7.1b2 → apify-2.7.2}/website/src/pages/index.js +0 -0
  210. {apify-2.7.1b2 → apify-2.7.2}/website/static/.nojekyll +0 -0
  211. {apify-2.7.1b2 → apify-2.7.2}/website/static/img/docs-og.png +0 -0
  212. {apify-2.7.1b2 → apify-2.7.2}/website/tools/docs-prettier.config.js +0 -0
  213. {apify-2.7.1b2 → apify-2.7.2}/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,20 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [2.7.2](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.2) (2025-07-30)
6
+
7
+ ### 🐛 Bug Fixes
8
+
9
+ - Restrict apify-shared and apify-client versions (#523) ([581ebae](https://github.com/apify/apify-sdk-python/commit/581ebae5752a984a34cbabc02c49945ae392db00))
10
+
11
+
12
+ ## [2.7.1](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.1) (2025-07-24)
13
+
14
+ ### 🐛 Bug Fixes
15
+
16
+ - Add back support for Python 3.9.
17
+
18
+
5
19
  ## [2.7.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.7.0) (2025-07-14)
6
20
 
7
21
  ### 🚀 Features
@@ -9,11 +23,6 @@ All notable changes to this project will be documented in this file.
9
23
  - 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
24
  - **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
25
 
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
26
 
18
27
  ## [2.6.0](https://github.com/apify/apify-sdk-python/releases/tag/v2.6.0) (2025-06-09)
19
28
 
@@ -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.1b2
3
+ Version: 2.7.2
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,14 +219,15 @@ 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-Dist: apify-client>=1.11.0
229
- Requires-Dist: apify-shared>=1.3.0
228
+ Requires-Python: >=3.9
229
+ Requires-Dist: apify-client<2.0.0
230
+ Requires-Dist: apify-shared<2.0.0
230
231
  Requires-Dist: crawlee~=0.6.0
231
232
  Requires-Dist: cryptography>=42.0.0
232
233
  Requires-Dist: httpx>=0.27.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
 
@@ -7,8 +7,6 @@ import CodeBlock from '@theme/CodeBlock';
7
7
 
8
8
  import LogConfigExample from '!!raw-loader!./code/10_log_config.py';
9
9
  import LoggerUsageExample from '!!raw-loader!./code/10_logger_usage.py';
10
- import RedirectLog from '!!raw-loader!./code/10_redirect_log.py';
11
- import RedirectLogExistingRun from '!!raw-loader!./code/10_redirect_log_existing_run.py';
12
10
 
13
11
  The Apify SDK is logging useful information through the [`logging`](https://docs.python.org/3/library/logging.html) module from Python's standard library, into the logger with the name `apify`.
14
12
 
@@ -84,31 +82,3 @@ Result:
84
82
  </pre>
85
83
 
86
84
  <!-- markdownlint-enable no-inline-html -->
87
-
88
- ## Redirect logs from other Actor runs
89
-
90
- In some situations, one Actor is going to start one or more other Actors and wait for them to finish and produce some results. In such cases, you might want to redirect the logs and status messages of the started Actors runs back to the parent Actor run, so that you can see the progress of the started Actors' runs in the parent Actor's logs. This guide will show possibilities on how to do it.
91
-
92
- ### Redirecting logs from Actor.call
93
-
94
- Typical use case for log redirection is to call another Actor using the [`Actor.call`](../../reference/class/Actor#call) method. This method has an optional `logger` argument, which is by default set to the `default` literal. This means that the logs of the called Actor will be automatically redirected to the parent Actor's logs with default formatting and filtering. If you set the `logger` argument to `None`, then no log redirection happens. The third option is to pass your own `Logger` instance with the possibility to define your own formatter, filter, and handler. Below you can see those three possible ways of log redirection when starting another Actor run through [`Actor.call`](../../reference/class/Actor#call).
95
-
96
- <CodeBlock className="language-python">
97
- {RedirectLog}
98
- </CodeBlock>
99
-
100
- Each default redirect logger log entry will have a specific format. After the timestamp, it will contain cyan colored text that will contain the redirect information - the other actor's name and the run ID. The rest of the log message will be printed in the same manner as the parent Actor's logger is configured.
101
-
102
- The log redirection can be deep, meaning that if the other actor also starts another actor and is redirecting logs from it, then in the top-level Actor, you can see it as well. See the following example screenshot of the Apify log console when one actor recursively starts itself (there are 2 levels of recursion in the example).
103
-
104
- ![Console with redirected logs](/img/guides/redirected_logs_example.webp 'Example of console with redirected logs from recursively started actor.')
105
-
106
- ### Redirecting logs from already running Actor run
107
-
108
- In some cases, you might want to connect to an already running Actor run and redirect its logs to your current Actor run. This can be done using the [ApifyClient](../../reference/class/Actor#apify_client) and getting the streamed log from a specific Actor run. You can then use it as a context manager, and the log redirection will be active in the context, or you can control the log redirection manually by explicitly calling `start` and `stop` methods.
109
-
110
- You can further decide whether you want to redirect just new logs of the ongoing Actor run, or if you also want to redirect historical logs from that Actor's run, so all logs it has produced since it was started. Both options are shown in the example code below.
111
-
112
- <CodeBlock className="language-python">
113
- {RedirectLogExistingRun}
114
- </CodeBlock>
@@ -4,18 +4,19 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "apify"
7
- version = "2.7.1b2"
7
+ version = "2.7.2"
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",
@@ -34,8 +35,8 @@ keywords = [
34
35
  "scraping",
35
36
  ]
36
37
  dependencies = [
37
- "apify-client>=1.11.0",
38
- "apify-shared>=1.3.0",
38
+ "apify-client<2.0.0",
39
+ "apify-shared<2.0.0",
39
40
  "crawlee~=0.6.0",
40
41
  "cryptography>=42.0.0",
41
42
  "httpx>=0.27.0",
@@ -65,10 +66,10 @@ dev = [
65
66
  "build~=1.2.0",
66
67
  "dycw-pytest-only>=2.1.1",
67
68
  "griffe~=1.7.0",
68
- "mypy~=1.17.0",
69
+ "mypy~=1.16.0",
69
70
  "pre-commit~=4.2.0",
70
71
  "pydoc-markdown~=4.8.0",
71
- "pytest-asyncio~=1.1.0",
72
+ "pytest-asyncio~=1.0.0",
72
73
  "pytest-cov~=6.2.0",
73
74
  "pytest-timeout>=2.4.0",
74
75
  "pytest-xdist~=3.8.0",
@@ -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
@@ -400,12 +400,12 @@ async def test_actor_adds_webhook_and_receives_event(
400
400
  async with Actor:
401
401
 
402
402
  class WebhookHandler(BaseHTTPRequestHandler):
403
- def do_GET(self) -> None: # noqa: N802
403
+ def do_GET(self) -> None:
404
404
  self.send_response(200)
405
405
  self.end_headers()
406
406
  self.wfile.write(bytes('Hello, world!', encoding='utf-8'))
407
407
 
408
- def do_POST(self) -> None: # noqa: N802
408
+ def do_POST(self) -> None:
409
409
  nonlocal webhook_body
410
410
  content_length = self.headers.get('content-length')
411
411
  length = int(content_length) if content_length else 0
@@ -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: