apify 2.6.1b7__tar.gz → 2.6.1b8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of apify might be problematic. Click here for more details.

Files changed (211) hide show
  1. {apify-2.6.1b7 → apify-2.6.1b8}/CHANGELOG.md +1 -0
  2. {apify-2.6.1b7 → apify-2.6.1b8}/PKG-INFO +1 -1
  3. {apify-2.6.1b7 → apify-2.6.1b8}/pyproject.toml +1 -1
  4. apify-2.6.1b8/src/apify/_consts.py +13 -0
  5. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_crypto.py +11 -4
  6. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_key_value_store.py +38 -4
  7. apify-2.6.1b7/src/apify/_consts.py +0 -10
  8. {apify-2.6.1b7 → apify-2.6.1b8}/.editorconfig +0 -0
  9. {apify-2.6.1b7 → apify-2.6.1b8}/.github/CODEOWNERS +0 -0
  10. {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/build_and_deploy_docs.yaml +0 -0
  11. {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/check_pr_title.yaml +0 -0
  12. {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/pre_release.yaml +0 -0
  13. {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/release.yaml +0 -0
  14. {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/run_code_checks.yaml +0 -0
  15. {apify-2.6.1b7 → apify-2.6.1b8}/.github/workflows/update_new_issue.yaml +0 -0
  16. {apify-2.6.1b7 → apify-2.6.1b8}/.gitignore +0 -0
  17. {apify-2.6.1b7 → apify-2.6.1b8}/.markdownlint.yaml +0 -0
  18. {apify-2.6.1b7 → apify-2.6.1b8}/.pre-commit-config.yaml +0 -0
  19. {apify-2.6.1b7 → apify-2.6.1b8}/CONTRIBUTING.md +0 -0
  20. {apify-2.6.1b7 → apify-2.6.1b8}/LICENSE +0 -0
  21. {apify-2.6.1b7 → apify-2.6.1b8}/Makefile +0 -0
  22. {apify-2.6.1b7 → apify-2.6.1b8}/README.md +0 -0
  23. {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/01_introduction.mdx +0 -0
  24. {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/02_running_actors_locally.mdx +0 -0
  25. {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/03_actor_structure.mdx +0 -0
  26. {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/01_introduction.py +0 -0
  27. {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/actor_structure/__init__.py +0 -0
  28. {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/actor_structure/__main__.py +0 -0
  29. {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/actor_structure/main.py +0 -0
  30. {apify-2.6.1b7 → apify-2.6.1b8}/docs/01_overview/code/actor_structure/py.typed +0 -0
  31. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/01_beautifulsoup_httpx.mdx +0 -0
  32. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/02_crawlee.mdx +0 -0
  33. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/03_playwright.mdx +0 -0
  34. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/04_selenium.mdx +0 -0
  35. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/05_scrapy.mdx +0 -0
  36. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/01_beautifulsoup_httpx.py +0 -0
  37. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/02_crawlee_beautifulsoup.py +0 -0
  38. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/02_crawlee_playwright.py +0 -0
  39. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/03_playwright.py +0 -0
  40. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/04_selenium.py +0 -0
  41. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/__init__.py +0 -0
  42. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/__main__.py +0 -0
  43. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/items.py +0 -0
  44. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/main.py +0 -0
  45. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/py.typed +0 -0
  46. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/settings.py +0 -0
  47. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/spiders/__init__.py +0 -0
  48. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/spiders/py.typed +0 -0
  49. {apify-2.6.1b7 → apify-2.6.1b8}/docs/02_guides/code/scrapy_project/src/spiders/title.py +0 -0
  50. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/01_actor_lifecycle.mdx +0 -0
  51. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/02_actor_input.mdx +0 -0
  52. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/03_storages.mdx +0 -0
  53. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/04_actor_events.mdx +0 -0
  54. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/05_proxy_management.mdx +0 -0
  55. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/06_interacting_with_other_actors.mdx +0 -0
  56. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/07_webhooks.mdx +0 -0
  57. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/08_access_apify_api.mdx +0 -0
  58. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/09_running_webserver.mdx +0 -0
  59. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/10_logging.mdx +0 -0
  60. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/11_configuration.mdx +0 -0
  61. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/12_pay_per_event.mdx +0 -0
  62. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/01_context_manager.py +0 -0
  63. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/01_init_exit.py +0 -0
  64. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/01_reboot.py +0 -0
  65. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/01_status_message.py +0 -0
  66. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/02_input.py +0 -0
  67. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_dataset_exports.py +0 -0
  68. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_dataset_read_write.py +0 -0
  69. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_deleting_storages.py +0 -0
  70. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_kvs_iterating.py +0 -0
  71. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_kvs_public_url.py +0 -0
  72. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_kvs_read_write.py +0 -0
  73. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_opening_storages.py +0 -0
  74. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/03_rq.py +0 -0
  75. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/04_actor_events.py +0 -0
  76. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_apify_proxy.py +0 -0
  77. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_apify_proxy_config.py +0 -0
  78. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_custom_proxy.py +0 -0
  79. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_custom_proxy_function.py +0 -0
  80. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_proxy_actor_input.py +0 -0
  81. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_proxy_httpx.py +0 -0
  82. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/05_proxy_rotation.py +0 -0
  83. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/06_interacting_call.py +0 -0
  84. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/06_interacting_call_task.py +0 -0
  85. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/06_interacting_metamorph.py +0 -0
  86. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/06_interacting_start.py +0 -0
  87. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/07_webhook.py +0 -0
  88. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/07_webhook_preventing.py +0 -0
  89. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/08_actor_client.py +0 -0
  90. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/08_actor_new_client.py +0 -0
  91. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/09_webserver.py +0 -0
  92. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/10_log_config.py +0 -0
  93. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/10_logger_usage.py +0 -0
  94. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/11_config.py +0 -0
  95. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/actor_charge.py +0 -0
  96. {apify-2.6.1b7 → apify-2.6.1b8}/docs/03_concepts/code/conditional_actor_charge.py +0 -0
  97. {apify-2.6.1b7 → apify-2.6.1b8}/docs/04_upgrading/upgrading_to_v2.md +0 -0
  98. {apify-2.6.1b7 → apify-2.6.1b8}/docs/pyproject.toml +0 -0
  99. {apify-2.6.1b7 → apify-2.6.1b8}/renovate.json +0 -0
  100. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/__init__.py +0 -0
  101. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_actor.py +0 -0
  102. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_charging.py +0 -0
  103. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_configuration.py +0 -0
  104. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_models.py +0 -0
  105. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_platform_event_manager.py +0 -0
  106. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_proxy_configuration.py +0 -0
  107. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/_utils.py +0 -0
  108. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/__init__.py +0 -0
  109. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_apify_storage_client.py +0 -0
  110. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_dataset_client.py +0 -0
  111. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_dataset_collection_client.py +0 -0
  112. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_key_value_store_client.py +0 -0
  113. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_key_value_store_collection_client.py +0 -0
  114. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_request_queue_client.py +0 -0
  115. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/_request_queue_collection_client.py +0 -0
  116. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/apify_storage_client/py.typed +0 -0
  117. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/log.py +0 -0
  118. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/py.typed +0 -0
  119. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/__init__.py +0 -0
  120. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/_actor_runner.py +0 -0
  121. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/_async_thread.py +0 -0
  122. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/_logging_config.py +0 -0
  123. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/extensions/__init__.py +0 -0
  124. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/extensions/_httpcache.py +0 -0
  125. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/middlewares/__init__.py +0 -0
  126. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/middlewares/apify_proxy.py +0 -0
  127. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/middlewares/py.typed +0 -0
  128. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/pipelines/__init__.py +0 -0
  129. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/pipelines/actor_dataset_push.py +0 -0
  130. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/pipelines/py.typed +0 -0
  131. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/py.typed +0 -0
  132. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/requests.py +0 -0
  133. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/scheduler.py +0 -0
  134. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/scrapy/utils.py +0 -0
  135. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/storages/__init__.py +0 -0
  136. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/storages/_request_list.py +0 -0
  137. {apify-2.6.1b7 → apify-2.6.1b8}/src/apify/storages/py.typed +0 -0
  138. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/README.md +0 -0
  139. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/__init__.py +0 -0
  140. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/_utils.py +0 -0
  141. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/Dockerfile +0 -0
  142. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/requirements.txt +0 -0
  143. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/src/__init__.py +0 -0
  144. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/src/__main__.py +0 -0
  145. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/actor_source_base/src/main.py +0 -0
  146. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/conftest.py +0 -0
  147. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_api_helpers.py +0 -0
  148. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_call_timeouts.py +0 -0
  149. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_charge.py +0 -0
  150. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_create_proxy_configuration.py +0 -0
  151. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_dataset.py +0 -0
  152. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_events.py +0 -0
  153. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_key_value_store.py +0 -0
  154. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_lifecycle.py +0 -0
  155. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_log.py +0 -0
  156. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_request_queue.py +0 -0
  157. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_actor_scrapy.py +0 -0
  158. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_fixtures.py +0 -0
  159. {apify-2.6.1b7 → apify-2.6.1b8}/tests/integration/test_request_queue.py +0 -0
  160. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/__init__.py +0 -0
  161. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/__init__.py +0 -0
  162. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_create_proxy_configuration.py +0 -0
  163. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_dataset.py +0 -0
  164. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_env_helpers.py +0 -0
  165. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_helpers.py +0 -0
  166. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_lifecycle.py +0 -0
  167. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_log.py +0 -0
  168. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_non_default_instance.py +0 -0
  169. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_actor_request_queue.py +0 -0
  170. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_configuration.py +0 -0
  171. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/actor/test_request_list.py +0 -0
  172. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/conftest.py +0 -0
  173. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/__init__.py +0 -0
  174. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/extensions/__init__.py +0 -0
  175. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/extensions/test_httpcache.py +0 -0
  176. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/middlewares/__init__.py +0 -0
  177. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/middlewares/test_apify_proxy.py +0 -0
  178. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/pipelines/__init__.py +0 -0
  179. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/pipelines/test_actor_dataset_push.py +0 -0
  180. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/requests/__init__.py +0 -0
  181. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/requests/test_to_apify_request.py +0 -0
  182. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/requests/test_to_scrapy_request.py +0 -0
  183. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/utils/__init__.py +0 -0
  184. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/utils/test_apply_apify_settings.py +0 -0
  185. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/scrapy/utils/test_get_basic_auth_header.py +0 -0
  186. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/test_crypto.py +0 -0
  187. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/test_platform_event_manager.py +0 -0
  188. {apify-2.6.1b7 → apify-2.6.1b8}/tests/unit/test_proxy_configuration.py +0 -0
  189. {apify-2.6.1b7 → apify-2.6.1b8}/uv.lock +0 -0
  190. {apify-2.6.1b7 → apify-2.6.1b8}/website/.eslintrc.json +0 -0
  191. {apify-2.6.1b7 → apify-2.6.1b8}/website/babel.config.js +0 -0
  192. {apify-2.6.1b7 → apify-2.6.1b8}/website/build_api_reference.sh +0 -0
  193. {apify-2.6.1b7 → apify-2.6.1b8}/website/docusaurus.config.js +0 -0
  194. {apify-2.6.1b7 → apify-2.6.1b8}/website/generate_module_shortcuts.py +0 -0
  195. {apify-2.6.1b7 → apify-2.6.1b8}/website/package-lock.json +0 -0
  196. {apify-2.6.1b7 → apify-2.6.1b8}/website/package.json +0 -0
  197. {apify-2.6.1b7 → apify-2.6.1b8}/website/sidebars.js +0 -0
  198. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/ApiLink.jsx +0 -0
  199. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/Gradients.jsx +0 -0
  200. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/Highlights.jsx +0 -0
  201. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/Highlights.module.css +0 -0
  202. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/RunnableCodeBlock.jsx +0 -0
  203. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/components/RunnableCodeBlock.module.css +0 -0
  204. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/css/custom.css +0 -0
  205. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/pages/home_page_example.py +0 -0
  206. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/pages/index.js +0 -0
  207. {apify-2.6.1b7 → apify-2.6.1b8}/website/src/pages/index.module.css +0 -0
  208. {apify-2.6.1b7 → apify-2.6.1b8}/website/static/.nojekyll +0 -0
  209. {apify-2.6.1b7 → apify-2.6.1b8}/website/static/img/docs-og.png +0 -0
  210. {apify-2.6.1b7 → apify-2.6.1b8}/website/tools/docs-prettier.config.js +0 -0
  211. {apify-2.6.1b7 → apify-2.6.1b8}/website/tools/utils/externalLink.js +0 -0
@@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file.
8
8
  ### 🚀 Features
9
9
 
10
10
  - 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)
11
+ - **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
12
 
12
13
 
13
14
  <!-- git-cliff-unreleased-end -->
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apify
3
- Version: 2.6.1b7
3
+ Version: 2.6.1b8
4
4
  Summary: Apify SDK for Python
5
5
  Project-URL: Apify Homepage, https://apify.com
6
6
  Project-URL: Changelog, https://docs.apify.com/sdk/python/docs/changelog
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "apify"
7
- version = "2.6.1b7"
7
+ version = "2.6.1b8"
8
8
  description = "Apify SDK for Python"
9
9
  authors = [{ name = "Apify Technologies s.r.o.", email = "support@apify.com" }]
10
10
  license = { file = "LICENSE" }
@@ -0,0 +1,13 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from datetime import timedelta
5
+
6
+ EVENT_LISTENERS_TIMEOUT = timedelta(seconds=5)
7
+
8
+ BASE64_REGEXP = '[-A-Za-z0-9+/]*={0,3}'
9
+ ENCRYPTED_STRING_VALUE_PREFIX = 'ENCRYPTED_VALUE'
10
+ ENCRYPTED_JSON_VALUE_PREFIX = 'ENCRYPTED_JSON'
11
+ ENCRYPTED_INPUT_VALUE_REGEXP = re.compile(
12
+ f'^({ENCRYPTED_STRING_VALUE_PREFIX}|{ENCRYPTED_JSON_VALUE_PREFIX}):(?:({BASE64_REGEXP}):)?({BASE64_REGEXP}):({BASE64_REGEXP})$'
13
+ )
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import base64
4
4
  import hashlib
5
5
  import hmac
6
+ import json
6
7
  import string
7
8
  from typing import Any
8
9
 
@@ -14,7 +15,7 @@ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
14
15
  from apify_shared.utils import ignore_docs
15
16
  from crawlee._utils.crypto import crypto_random_object_id
16
17
 
17
- from apify._consts import ENCRYPTED_INPUT_VALUE_REGEXP
18
+ from apify._consts import ENCRYPTED_INPUT_VALUE_REGEXP, ENCRYPTED_JSON_VALUE_PREFIX, ENCRYPTED_STRING_VALUE_PREFIX
18
19
 
19
20
  ENCRYPTION_KEY_LENGTH = 32
20
21
  ENCRYPTION_IV_LENGTH = 16
@@ -147,14 +148,20 @@ def decrypt_input_secrets(private_key: rsa.RSAPrivateKey, input_data: Any) -> An
147
148
  if isinstance(value, str):
148
149
  match = ENCRYPTED_INPUT_VALUE_REGEXP.fullmatch(value)
149
150
  if match:
150
- encrypted_password = match.group(1)
151
- encrypted_value = match.group(2)
152
- input_data[key] = private_decrypt(
151
+ prefix = match.group(1)
152
+ encrypted_password = match.group(3)
153
+ encrypted_value = match.group(4)
154
+ decrypted_value = private_decrypt(
153
155
  encrypted_password,
154
156
  encrypted_value,
155
157
  private_key=private_key,
156
158
  )
157
159
 
160
+ if prefix == ENCRYPTED_STRING_VALUE_PREFIX:
161
+ input_data[key] = decrypted_value
162
+ elif prefix == ENCRYPTED_JSON_VALUE_PREFIX:
163
+ input_data[key] = json.loads(decrypted_value)
164
+
158
165
  return input_data
159
166
 
160
167
 
@@ -9,7 +9,7 @@ from apify_shared.utils import json_dumps
9
9
 
10
10
  from ..test_crypto import PRIVATE_KEY_PASSWORD, PRIVATE_KEY_PEM_BASE64, PUBLIC_KEY
11
11
  from apify import Actor
12
- from apify._consts import ENCRYPTED_INPUT_VALUE_PREFIX
12
+ from apify._consts import ENCRYPTED_JSON_VALUE_PREFIX, ENCRYPTED_STRING_VALUE_PREFIX
13
13
  from apify._crypto import public_encrypt
14
14
 
15
15
  if TYPE_CHECKING:
@@ -74,11 +74,42 @@ async def test_get_input_with_encrypted_secrets(
74
74
  monkeypatch.setenv(ApifyEnvVars.INPUT_SECRETS_PRIVATE_KEY_PASSPHRASE, PRIVATE_KEY_PASSWORD)
75
75
 
76
76
  input_key = 'INPUT'
77
+ secret_string_legacy = 'secret-string'
77
78
  secret_string = 'secret-string'
78
- encrypted_secret = public_encrypt(secret_string, public_key=PUBLIC_KEY)
79
+ secret_object = {'foo': 'bar', 'baz': 'qux'}
80
+ secret_array = ['foo', 'bar', 'baz']
81
+
82
+ # The legacy encryption format uses ENCRYPTED_STRING_VALUE_PREFIX prefix, value in raw string and does
83
+ # not include schemahash. The new format uses ENCRYPTED_JSON_VALUE_PREFIX prefix, value in JSON format
84
+ # and includes schemahash. We are testing both formats to ensure backward compatibility.
85
+
86
+ encrypted_string_legacy = public_encrypt(secret_string_legacy, public_key=PUBLIC_KEY)
87
+ encrypted_string = public_encrypt(json_dumps(secret_string), public_key=PUBLIC_KEY)
88
+ encrypted_object = public_encrypt(json_dumps(secret_object), public_key=PUBLIC_KEY)
89
+ encrypted_array = public_encrypt(json_dumps(secret_array), public_key=PUBLIC_KEY)
90
+
79
91
  input_with_secret = {
80
92
  'foo': 'bar',
81
- 'secret': f'{ENCRYPTED_INPUT_VALUE_PREFIX}:{encrypted_secret["encrypted_password"]}:{encrypted_secret["encrypted_value"]}', # noqa: E501
93
+ 'secret_string_legacy': (
94
+ f'{ENCRYPTED_STRING_VALUE_PREFIX}:'
95
+ f'{encrypted_string_legacy["encrypted_password"]}:'
96
+ f'{encrypted_string_legacy["encrypted_value"]}'
97
+ ),
98
+ 'secret_string': (
99
+ f'{ENCRYPTED_JSON_VALUE_PREFIX}:schemahash:'
100
+ f'{encrypted_string["encrypted_password"]}:'
101
+ f'{encrypted_string["encrypted_value"]}'
102
+ ),
103
+ 'secret_object': (
104
+ f'{ENCRYPTED_JSON_VALUE_PREFIX}:schemahash:'
105
+ f'{encrypted_object["encrypted_password"]}:'
106
+ f'{encrypted_object["encrypted_value"]}'
107
+ ),
108
+ 'secret_array': (
109
+ f'{ENCRYPTED_JSON_VALUE_PREFIX}:schemahash:'
110
+ f'{encrypted_array["encrypted_password"]}:'
111
+ f'{encrypted_array["encrypted_value"]}'
112
+ ),
82
113
  }
83
114
 
84
115
  await memory_storage_client.key_value_stores().get_or_create(id='default')
@@ -91,4 +122,7 @@ async def test_get_input_with_encrypted_secrets(
91
122
  async with Actor as my_actor:
92
123
  input = await my_actor.get_input() # noqa: A001
93
124
  assert input['foo'] == input_with_secret['foo']
94
- assert input['secret'] == secret_string
125
+ assert input['secret_string_legacy'] == secret_string_legacy
126
+ assert input['secret_string'] == secret_string
127
+ assert input['secret_object'] == secret_object
128
+ assert input['secret_array'] == secret_array
@@ -1,10 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import re
4
- from datetime import timedelta
5
-
6
- EVENT_LISTENERS_TIMEOUT = timedelta(seconds=5)
7
-
8
- BASE64_REGEXP = '[-A-Za-z0-9+/]*={0,3}'
9
- ENCRYPTED_INPUT_VALUE_PREFIX = 'ENCRYPTED_VALUE'
10
- ENCRYPTED_INPUT_VALUE_REGEXP = re.compile(f'^{ENCRYPTED_INPUT_VALUE_PREFIX}:({BASE64_REGEXP}):({BASE64_REGEXP})$')
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes