diff --git a/pyproject.toml b/pyproject.toml index 0f017ca871..800d789190 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,9 +120,7 @@ dev = [ # We explicitly constrain black>=24.3.0 to override the transitive dependency. "black>=24.3.0", "anyio<5.0.0", - # Pin below 3.0, which drops Python 3.10 support and introduces a breaking API. Once Crawlee - # drops Python 3.10 (https://github.com/apify/crawlee-python/issues/1721), remove this constraint. - "apify_client<3.0.0", # For e2e tests. + "apify_client<4.0.0", # For e2e tests. "build<2.0.0", # For e2e tests. "fakeredis[probabilistic,json,lua]<3.0.0", "poethepoet<1.0.0", diff --git a/tests/e2e/project_template/test_static_crawlers_templates.py b/tests/e2e/project_template/test_static_crawlers_templates.py index f37094cae3..ad8f225a51 100644 --- a/tests/e2e/project_template/test_static_crawlers_templates.py +++ b/tests/e2e/project_template/test_static_crawlers_templates.py @@ -1,6 +1,7 @@ import os import re import subprocess +from datetime import timedelta from pathlib import Path from typing import Literal @@ -137,15 +138,15 @@ async def test_static_crawler_actor_at_apify( # then poll client-side via `BuildClientAsync.wait_for_finish` until it reaches a terminal # status, and assert it succeeded before starting the run. rebuild = await actor.build(version_number='0.0') - finished_build = await client.build(rebuild['id']).wait_for_finish(wait_secs=900) + finished_build = await client.build(rebuild.id).wait_for_finish(wait_duration=timedelta(seconds=900)) assert finished_build is not None, 'Stagehand rebuild did not reach a terminal status within 900s.' - assert finished_build['status'] == 'SUCCEEDED', ( - f'Stagehand rebuild did not succeed: status={finished_build["status"]!r}, build={finished_build}' + assert finished_build.status == 'SUCCEEDED', ( + f'Stagehand rebuild did not succeed: status={finished_build.status!r}, build={finished_build}' ) - build_number = finished_build['buildNumber'] + build_number = finished_build.build_number started_run_data = await actor.start(memory_mbytes=8192, build=build_number) - actor_run = client.run(started_run_data['id']) + actor_run = client.run(started_run_data.id) finished_run_data = await actor_run.wait_for_finish() actor_run_log = await actor_run.log().get() @@ -157,7 +158,7 @@ async def test_static_crawler_actor_at_apify( additional_run_info = f'Full actor run log: {actor_run_log}' assert actor_run_log assert finished_run_data - assert finished_run_data['status'] == 'SUCCEEDED', additional_run_info + assert finished_run_data.status == 'SUCCEEDED', additional_run_info assert ( 'Crawler.stop() was called with following reason: The crawler has reached its limit of 10 requests per crawl.' ) in actor_run_log, additional_run_info diff --git a/uv.lock b/uv.lock index 71bbaaf423..5e2b90c786 100644 --- a/uv.lock +++ b/uv.lock @@ -3,10 +3,10 @@ revision = 5 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", "python_full_version == '3.13.*' and sys_platform != 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version == '3.12.*' and sys_platform != 'emscripten'", "python_full_version < '3.12'", ] @@ -84,17 +84,18 @@ wheels = [ [[package]] name = "apify-client" -version = "2.5.1" +version = "3.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "apify-shared" }, { name = "colorama" }, { name = "impit" }, { name = "more-itertools" }, + { name = "pydantic", extra = ["email"] }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/e4/1eaee14189886362a7d5629c362fb1bdc5bb36d506c99e97e866eea5a0e9/apify_client-2.5.1.tar.gz", hash = "sha256:ff8457c9cc14cbfe0eefb337a8c0a33f4d81e7760768bdd036e7470a5bc63c24", size = 380576, upload-time = "2026-05-20T09:43:36.461Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/eb/e99684fd036fd63f9b3f95ebeafa0e706e02b7c7066ac091444683cb0471/apify_client-3.3.0.tar.gz", hash = "sha256:4adb1d2d424ceb72f7382bd51b9372a687e5cc1ea54f1bc252228e0eb9316687", size = 158619, upload-time = "2026-10-08T11:22:35.225Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/13/56a809582558d3662c47b1d16cf8c0d979d658a08a6acaf83598319fa9ee/apify_client-2.5.1-py3-none-any.whl", hash = "sha256:5515f43fd6edd5388db0534660403662bfc0650febd69a6f0d8e58f32a6d7269", size = 86995, upload-time = "2026-05-20T09:43:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/a4/30/0ef4c0a26ef68c491f502dbe149478f97ec68d56bcc097d3505ee6cd660d/apify_client-3.3.0-py3-none-any.whl", hash = "sha256:57edb1382e44b54a58f0ca2f62fe884c09994fcfad94ff327bcbed490022d708", size = 174351, upload-time = "2026-10-08T11:22:33.826Z" }, ] [[package]] @@ -106,15 +107,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/05/14521197ae61dba29f01dd23264d7457aa402568b92bf3fb89fd12a5d6db/apify_fingerprint_datapoints-0.15.0-py3-none-any.whl", hash = "sha256:fc9299b3136880f47b468897cd00ac622ad2c2a93e9cc9f972d10dbf5ed2b3aa", size = 761805, upload-time = "2026-08-05T14:08:55.518Z" }, ] -[[package]] -name = "apify-shared" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d2/b5/266fa0ae7871fcbe0a425e32f1c0888ac3a41e64a60577f6ab97ad97b3bd/apify_shared-2.3.0.tar.gz", hash = "sha256:43f800c5f758e50ad66c09aeb6a0951ba3c32e852cdfa50f34f4089d44d40c1f", size = 17361, upload-time = "2026-08-03T11:50:12.787Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/cd/028a20734898b30ce17db78fe481405bb700dc0f064201f754e1c95900bb/apify_shared-2.3.0-py3-none-any.whl", hash = "sha256:8019636fe63cfa1e7bc60cdd3f0c61202c020a8b86b1629079701822e8567833", size = 13526, upload-time = "2026-08-03T11:50:11.482Z" }, -] - [[package]] name = "arrow" version = "1.4.0" @@ -1113,7 +1105,7 @@ provides-extras = ["all", "adaptive-crawler", "pydantic-ai", "beautifulsoup", "c [package.metadata.requires-dev] dev = [ { name = "anyio", specifier = "<5.0.0" }, - { name = "apify-client", specifier = "<3.0.0" }, + { name = "apify-client", specifier = "<4.0.0" }, { name = "black", specifier = ">=24.3.0" }, { name = "build", specifier = "<2.0.0" }, { name = "fakeredis", extras = ["probabilistic", "json", "lua"], specifier = "<3.0.0" }, @@ -1319,6 +1311,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, ] +[[package]] +name = "dnspython" +version = "2.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4a/50822184bd67cc6493f0fb6a880749158fcd31ab3fa07409acfd91f9fc85/dnspython-2.9.0.tar.gz", hash = "sha256:b44dc6b18f07a8b1c56676a19fbfdb5209415b046a9cece286baafa87ff3f7f1", size = 423560, upload-time = "2026-10-09T00:07:24.352Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/02/cdcc9b7c051786a103c3b09e1003a82fa0c66bcb91ffbdabcfbf7b4163b9/dnspython-2.9.0-py3-none-any.whl", hash = "sha256:9a4aedb833c3c1b49214d04d44d3032ab7a9135f7c1d29a549b4ff78fd82fda9", size = 354822, upload-time = "2026-10-09T00:07:22.622Z" }, +] + [[package]] name = "docspec" version = "2.2.1" @@ -1366,6 +1367,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/40/fd/f139b1ffdd06a06c6a2e3e542fa88963b59cb6165fd572d1220e901e288f/editor-2.0.1-py3-none-any.whl", hash = "sha256:96277ffb0c529d9b54f0c10bff4bd39d23ab1298504424232319b1a26b41240a", size = 4699, upload-time = "2026-09-19T14:28:58.753Z" }, ] +[[package]] +name = "email-validator" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, +] + [[package]] name = "execnet" version = "2.1.2" @@ -2818,10 +2832,10 @@ version = "2.5.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", "python_full_version == '3.13.*' and sys_platform != 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version == '3.12.*' and sys_platform != 'emscripten'", ] sdist = { url = "https://files.pythonhosted.org/packages/95/b0/c7453d0b6e2073c3264468b106ee1563750cecc910965e67357e3698c83e/numpy-2.5.4.tar.gz", hash = "sha256:9a94cf751c9ad8ebaa835bcd3d40dacf8534ad086b88c38029b65123c7999d2a", size = 20866315, upload-time = "2026-10-10T20:05:31.422Z" } @@ -3418,6 +3432,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/eb/9146591cc819d040475bf7f2be786710c7f7eb8083693bf859728da2ca9c/pydantic-2.14.0-py3-none-any.whl", hash = "sha256:15fab1bea6f1dc5003b54fc2ecab230c1fd1dbade2acd4addc52d81e32416d4b", size = 487109, upload-time = "2026-10-08T14:34:46.864Z" }, ] +[package.optional-dependencies] +email = [ + { name = "email-validator" }, +] + [[package]] name = "pydantic-ai-slim" version = "2.55.0" @@ -4365,10 +4384,10 @@ version = "1.18.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'emscripten'", - "python_full_version == '3.13.*' and sys_platform == 'emscripten'", - "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten'", + "python_full_version == '3.13.*' and sys_platform == 'emscripten'", "python_full_version == '3.13.*' and sys_platform != 'emscripten'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", "python_full_version == '3.12.*' and sys_platform != 'emscripten'", ] dependencies = [