From 226d6fa2c96609880be5ab145f52fd58c34caa6d Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Wed, 24 Sep 2025 15:43:10 +0100 Subject: [PATCH 01/11] remove rye + all in on uv --- Brewfile | 2 +- CLAUDE.md | 24 +-- noxfile.py | 3 +- pyproject.toml | 65 +++---- requirements-dev.lock | 399 ------------------------------------------ requirements.lock | 366 -------------------------------------- scripts/bootstrap | 7 +- scripts/format | 2 +- scripts/lint | 4 +- scripts/test | 2 +- uv.lock | 359 +++++++++++++++++++++++++++++++++++-- 11 files changed, 393 insertions(+), 840 deletions(-) delete mode 100644 requirements-dev.lock delete mode 100644 requirements.lock diff --git a/Brewfile b/Brewfile index 492ca37b..c43041ce 100644 --- a/Brewfile +++ b/Brewfile @@ -1,2 +1,2 @@ -brew "rye" +brew "uv" diff --git a/CLAUDE.md b/CLAUDE.md index ffb1e50f..985d5fab 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,26 +4,26 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Development Commands -### Package Management in the top level repo -- Use `rye` for dependency management (preferred) +### Package Management +- Use `uv` for dependency management - Run `./scripts/bootstrap` to set up the environment -- Or use `rye sync --all-features` directly +- Or use `uv sync --all-extras --group dev` directly -Special note: the individual tutorials maintain their own tutorial specific virtualenv using `uv`. So when testing/running tutorials, you `uv run` instead of `rye run`. Everything else is similar. +Both the main repo and individual tutorials use `uv` for consistency. #### Testing -- Run tests: `rye run pytest` or `./scripts/test` -- Run specific test: `rye run pytest path/to/test_file.py::TestClass::test_method -v` +- Run tests: `uv run pytest` or `./scripts/test` +- Run specific test: `uv run pytest path/to/test_file.py::TestClass::test_method -v` - Mock server is automatically started for tests, runs on port 4010 #### Linting and Formatting -- Format code: `rye run format` or `./scripts/format` - * The repository is still in flux, so running format might accidentally change files that aren't part of your scope of changes. So always run `run rye format` with additional arguments to constrain the formatting to the files that you are modifying. -- Lint code: `rye run lint` or `./scripts/lint` -- Type check: `rye run typecheck` (runs both pyright and mypy) +- Format code: `uv run task format` or `./scripts/format` + * The repository is still in flux, so running format might accidentally change files that aren't part of your scope of changes. So always run `uv run task format` with additional arguments to constrain the formatting to the files that you are modifying. +- Lint code: `uv run task lint` or `./scripts/lint` +- Type check: `uv run task typecheck` (runs both pyright and mypy) ### Building and Running -- Build package: `rye build` +- Build package: `uv build` @@ -89,5 +89,5 @@ Most SDK code is auto-generated. Manual changes are preserved in: ### Environment Requirements - Python 3.12+ required -- Uses Rye for dependency management +- Uses UV for dependency management - Supports both sync and async client patterns \ No newline at end of file diff --git a/noxfile.py b/noxfile.py index 53bca7ff..f8e65328 100644 --- a/noxfile.py +++ b/noxfile.py @@ -3,7 +3,8 @@ @nox.session(reuse_venv=True, name="test-pydantic-v1") def test_pydantic_v1(session: nox.Session) -> None: - session.install("-r", "requirements-dev.lock") + # Install dependencies via uv + session.run("uv", "sync", "--group", "dev", external=True) session.install("pydantic<2") session.run("pytest", "--showlocals", "--ignore=tests/functional", *session.posargs) diff --git a/pyproject.toml b/pyproject.toml index 953a3320..47880451 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,10 +71,13 @@ dev = [ [project.scripts] agentex = "agentex.lib.cli.commands.main:app" -[tool.rye] -managed = true -# version pins are in requirements-dev.lock -dev-dependencies = [ + +[build-system] +requires = ["hatchling==1.26.3", "hatch-fancy-pypi-readme"] +build-backend = "hatchling.build" + +[dependency-groups] +dev = [ "pyright==1.1.399", "mypy", "respx", @@ -89,48 +92,28 @@ dev-dependencies = [ "nest_asyncio==1.6.0", "pytest-xdist>=3.6.1", "debugpy>=1.8.15", -] - -[tool.rye.scripts] -format = { chain = [ - "format:ruff", - "format:docs", - "fix:ruff", - # run formatting again to fix any inconsistencies when imports are stripped - "format:ruff", -]} -"format:docs" = "python scripts/utils/ruffen-docs.py README.md api.md" -"format:ruff" = "ruff format" - -"lint" = { chain = [ - "check:ruff", - "typecheck", - "check:importable", -]} -"check:ruff" = "ruff check ." -"fix:ruff" = "ruff check --fix ." - -"check:importable" = "python -c 'import agentex'" - -typecheck = { chain = [ - "typecheck:pyright", - "typecheck:mypy" -]} -"typecheck:pyright" = "pyright" -"typecheck:verify-types" = "pyright --verifytypes agentex --ignoreexternal" -"typecheck:mypy" = "mypy ." - -[build-system] -requires = ["hatchling==1.26.3", "hatch-fancy-pypi-readme"] -build-backend = "hatchling.build" - -[dependency-groups] -dev = [ "ipywidgets>=8.1.7", "nbstripout>=0.8.1", "yaspin>=3.1.0", + "taskipy>=1.12.0", ] +[tool.taskipy.tasks] +format = { cmd = "task format:ruff && task format:docs && task fix:ruff && task format:ruff", help = "Format code with ruff and docs" } +"format:docs" = { cmd = "python scripts/utils/ruffen-docs.py README.md api.md", help = "Format documentation" } +"format:ruff" = { cmd = "ruff format", help = "Format code with ruff" } + +lint = { cmd = "task check:ruff && task typecheck && task check:importable", help = "Run all linting checks" } +"check:ruff" = { cmd = "ruff check .", help = "Check code with ruff" } +"fix:ruff" = { cmd = "ruff check --fix .", help = "Fix ruff issues automatically" } + +"check:importable" = { cmd = "python -c 'import agentex'", help = "Check that agentex can be imported" } + +typecheck = { cmd = "task typecheck:pyright && task typecheck:mypy", help = "Run type checking" } +"typecheck:pyright" = { cmd = "pyright", help = "Run pyright type checker" } +"typecheck:verify-types" = { cmd = "pyright --verifytypes agentex --ignoreexternal", help = "Verify types" } +"typecheck:mypy" = { cmd = "mypy .", help = "Run mypy type checker" } + [tool.hatch.build] include = [ "src/*" diff --git a/requirements-dev.lock b/requirements-dev.lock deleted file mode 100644 index c2b6e799..00000000 --- a/requirements-dev.lock +++ /dev/null @@ -1,399 +0,0 @@ -# generated by rye -# use `rye lock` or `rye sync` to update this lockfile -# -# last locked with the following flags: -# pre: false -# features: [] -# all-features: true -# with-sources: false -# generate-hashes: false -# universal: false - --e file:. -aiohappyeyeballs==2.6.1 - # via aiohttp -aiohttp==3.12.8 - # via agentex-sdk - # via httpx-aiohttp - # via litellm -aiosignal==1.3.2 - # via aiohttp -annotated-types==0.6.0 - # via pydantic -anyio==4.10.0 - # via agentex-sdk - # via httpx - # via mcp - # via openai - # via scale-gp - # via scale-gp-beta - # via sse-starlette - # via starlette - # via watchfiles -appnope==0.1.4 - # via ipykernel -argcomplete==3.1.2 - # via nox -asttokens==3.0.0 - # via stack-data -attrs==25.3.0 - # via aiohttp - # via jsonschema - # via referencing -cachetools==5.5.2 - # via google-auth -certifi==2023.7.22 - # via httpcore - # via httpx - # via kubernetes - # via requests -charset-normalizer==3.4.3 - # via requests -click==8.2.1 - # via litellm - # via typer - # via uvicorn -cloudpickle==3.1.1 - # via agentex-sdk -colorama==0.4.6 - # via griffe -colorlog==6.7.0 - # via nox -comm==0.2.3 - # via ipykernel -debugpy==1.8.16 - # via ipykernel -decorator==5.2.1 - # via ipython -dirty-equals==0.6.0 -distlib==0.3.7 - # via virtualenv -distro==1.8.0 - # via agentex-sdk - # via openai - # via scale-gp - # via scale-gp-beta -execnet==2.1.1 - # via pytest-xdist -executing==2.2.0 - # via stack-data -fastapi==0.115.14 - # via agentex-sdk -filelock==3.12.4 - # via huggingface-hub - # via virtualenv -frozenlist==1.6.2 - # via aiohttp - # via aiosignal -fsspec==2025.7.0 - # via huggingface-hub -google-auth==2.40.3 - # via kubernetes -griffe==1.12.0 - # via openai-agents -h11==0.16.0 - # via httpcore - # via uvicorn -hf-xet==1.1.7 - # via huggingface-hub -httpcore==1.0.9 - # via httpx -httpx==0.27.2 - # via agentex-sdk - # via httpx-aiohttp - # via litellm - # via mcp - # via openai - # via respx - # via scale-gp - # via scale-gp-beta -httpx-aiohttp==0.1.8 - # via agentex-sdk -httpx-sse==0.4.1 - # via mcp -huggingface-hub==0.34.4 - # via tokenizers -idna==3.4 - # via anyio - # via httpx - # via requests - # via yarl -importlib-metadata==7.0.0 - # via litellm -iniconfig==2.0.0 - # via pytest -ipykernel==6.30.1 - # via agentex-sdk -ipython==9.4.0 - # via ipykernel -ipython-pygments-lexers==1.1.1 - # via ipython -jedi==0.19.2 - # via ipython -jinja2==3.1.6 - # via agentex-sdk - # via litellm -jiter==0.10.0 - # via openai -jsonref==1.1.0 - # via agentex-sdk -jsonschema==4.25.0 - # via agentex-sdk - # via litellm - # via mcp -jsonschema-specifications==2025.4.1 - # via jsonschema -jupyter-client==8.6.3 - # via ipykernel -jupyter-core==5.8.1 - # via ipykernel - # via jupyter-client -kubernetes==28.1.0 - # via agentex-sdk -litellm==1.75.5.post1 - # via agentex-sdk -markdown-it-py==3.0.0 - # via rich -markupsafe==3.0.2 - # via jinja2 -matplotlib-inline==0.1.7 - # via ipykernel - # via ipython -mcp==1.12.4 - # via agentex-sdk - # via openai-agents -mdurl==0.1.2 - # via markdown-it-py -multidict==6.4.4 - # via aiohttp - # via yarl -mypy==1.14.1 -mypy-extensions==1.0.0 - # via mypy -nest-asyncio==1.6.0 - # via ipykernel -nexus-rpc==1.1.0 - # via temporalio -nodeenv==1.8.0 - # via pyright -nox==2023.4.22 -oauthlib==3.3.1 - # via kubernetes - # via requests-oauthlib -openai==1.99.9 - # via agentex-sdk - # via litellm - # via openai-agents -openai-agents==0.2.7 - # via agentex-sdk -packaging==23.2 - # via huggingface-hub - # via ipykernel - # via nox - # via pytest -parso==0.8.4 - # via jedi -pexpect==4.9.0 - # via ipython -platformdirs==3.11.0 - # via jupyter-core - # via virtualenv -pluggy==1.5.0 - # via pytest -prompt-toolkit==3.0.51 - # via ipython - # via questionary -propcache==0.3.1 - # via aiohttp - # via yarl -protobuf==5.29.5 - # via temporalio -psutil==7.0.0 - # via ipykernel -ptyprocess==0.7.0 - # via pexpect -pure-eval==0.2.3 - # via stack-data -pyasn1==0.6.1 - # via pyasn1-modules - # via rsa -pyasn1-modules==0.4.2 - # via google-auth -pydantic==2.10.3 - # via agentex-sdk - # via fastapi - # via litellm - # via mcp - # via openai - # via openai-agents - # via pydantic-settings - # via python-on-whales - # via scale-gp - # via scale-gp-beta -pydantic-core==2.27.1 - # via pydantic -pydantic-settings==2.10.1 - # via mcp -pygments==2.18.0 - # via ipython - # via ipython-pygments-lexers - # via pytest - # via rich -pyjwt==2.10.1 - # via redis -pyright==1.1.399 -pytest==8.4.1 - # via agentex-sdk - # via pytest-asyncio - # via pytest-xdist -pytest-asyncio==1.1.0 - # via agentex-sdk -pytest-xdist==3.7.0 -python-dateutil==2.8.2 - # via jupyter-client - # via kubernetes - # via time-machine -python-dotenv==1.1.1 - # via litellm - # via mcp - # via pydantic-settings -python-multipart==0.0.20 - # via mcp -python-on-whales==0.73.0 - # via agentex-sdk -pytz==2023.3.post1 - # via dirty-equals -pyyaml==6.0.2 - # via agentex-sdk - # via huggingface-hub - # via kubernetes -pyzmq==27.0.1 - # via ipykernel - # via jupyter-client -questionary==2.1.0 - # via agentex-sdk -redis==5.3.1 - # via agentex-sdk -referencing==0.36.2 - # via jsonschema - # via jsonschema-specifications -regex==2025.7.34 - # via tiktoken -requests==2.32.4 - # via huggingface-hub - # via kubernetes - # via openai-agents - # via python-on-whales - # via requests-oauthlib - # via tiktoken -requests-oauthlib==2.0.0 - # via kubernetes -respx==0.22.0 -rich==13.9.4 - # via agentex-sdk - # via typer -rpds-py==0.27.0 - # via jsonschema - # via referencing -rsa==4.9.1 - # via google-auth -ruff==0.9.4 - # via agentex-sdk -scale-gp==0.1.0a59 - # via agentex-sdk -scale-gp-beta==0.1.0a20 - # via agentex-sdk -setuptools==68.2.2 - # via nodeenv -shellingham==1.5.4 - # via typer -six==1.16.0 - # via kubernetes - # via python-dateutil -sniffio==1.3.0 - # via agentex-sdk - # via anyio - # via httpx - # via openai - # via scale-gp - # via scale-gp-beta -sse-starlette==3.0.2 - # via mcp -stack-data==0.6.3 - # via ipython -starlette==0.46.2 - # via fastapi - # via mcp -temporalio==1.15.0 - # via agentex-sdk -tiktoken==0.11.0 - # via litellm -time-machine==2.9.0 -tokenizers==0.21.4 - # via litellm -tornado==6.5.2 - # via ipykernel - # via jupyter-client -tqdm==4.67.1 - # via huggingface-hub - # via openai - # via python-on-whales -traitlets==5.14.3 - # via ipykernel - # via ipython - # via jupyter-client - # via jupyter-core - # via matplotlib-inline -typer==0.16.0 - # via agentex-sdk - # via mcp - # via python-on-whales -types-protobuf==6.30.2.20250809 - # via temporalio -types-requests==2.31.0.6 - # via openai-agents -types-urllib3==1.26.25.14 - # via types-requests -typing-extensions==4.12.2 - # via agentex-sdk - # via anyio - # via fastapi - # via huggingface-hub - # via mypy - # via nexus-rpc - # via openai - # via openai-agents - # via pydantic - # via pydantic-core - # via pyright - # via python-on-whales - # via referencing - # via scale-gp - # via scale-gp-beta - # via temporalio - # via typer - # via typing-inspection -typing-inspection==0.4.1 - # via pydantic-settings -tzdata==2025.2 - # via agentex-sdk -tzlocal==5.3.1 - # via agentex-sdk -urllib3==1.26.20 - # via kubernetes - # via requests -uvicorn==0.35.0 - # via agentex-sdk - # via mcp -virtualenv==20.24.5 - # via nox -watchfiles==0.24.0 - # via agentex-sdk -wcwidth==0.2.13 - # via prompt-toolkit -websocket-client==1.8.0 - # via kubernetes -yarl==1.20.0 - # via aiohttp -zipp==3.17.0 - # via importlib-metadata diff --git a/requirements.lock b/requirements.lock deleted file mode 100644 index 58bc3e38..00000000 --- a/requirements.lock +++ /dev/null @@ -1,366 +0,0 @@ -# generated by rye -# use `rye lock` or `rye sync` to update this lockfile -# -# last locked with the following flags: -# pre: false -# features: [] -# all-features: true -# with-sources: false -# generate-hashes: false -# universal: false - --e file:. -aiohappyeyeballs==2.6.1 - # via aiohttp -aiohttp==3.12.8 - # via agentex-sdk - # via httpx-aiohttp - # via litellm -aiosignal==1.3.2 - # via aiohttp -annotated-types==0.6.0 - # via pydantic -anyio==4.10.0 - # via agentex-sdk - # via httpx - # via mcp - # via openai - # via scale-gp - # via scale-gp-beta - # via sse-starlette - # via starlette - # via watchfiles -appnope==0.1.4 - # via ipykernel -asttokens==3.0.0 - # via stack-data -attrs==25.3.0 - # via aiohttp - # via jsonschema - # via referencing -cachetools==5.5.2 - # via google-auth -certifi==2023.7.22 - # via httpcore - # via httpx - # via kubernetes - # via requests -charset-normalizer==3.4.3 - # via requests -click==8.2.1 - # via litellm - # via typer - # via uvicorn -cloudpickle==3.1.1 - # via agentex-sdk -colorama==0.4.6 - # via griffe -comm==0.2.3 - # via ipykernel -debugpy==1.8.16 - # via ipykernel -decorator==5.2.1 - # via ipython -distro==1.8.0 - # via agentex-sdk - # via openai - # via scale-gp - # via scale-gp-beta -executing==2.2.0 - # via stack-data -fastapi==0.115.14 - # via agentex-sdk -filelock==3.19.1 - # via huggingface-hub -frozenlist==1.6.2 - # via aiohttp - # via aiosignal -fsspec==2025.7.0 - # via huggingface-hub -google-auth==2.40.3 - # via kubernetes -griffe==1.12.0 - # via openai-agents -h11==0.16.0 - # via httpcore - # via uvicorn -hf-xet==1.1.7 - # via huggingface-hub -httpcore==1.0.9 - # via httpx -httpx==0.27.2 - # via agentex-sdk - # via httpx-aiohttp - # via litellm - # via mcp - # via openai - # via scale-gp - # via scale-gp-beta -httpx-aiohttp==0.1.8 - # via agentex-sdk -httpx-sse==0.4.1 - # via mcp -huggingface-hub==0.34.4 - # via tokenizers -idna==3.4 - # via anyio - # via httpx - # via requests - # via yarl -importlib-metadata==8.7.0 - # via litellm -iniconfig==2.1.0 - # via pytest -ipykernel==6.30.1 - # via agentex-sdk -ipython==9.4.0 - # via ipykernel -ipython-pygments-lexers==1.1.1 - # via ipython -jedi==0.19.2 - # via ipython -jinja2==3.1.6 - # via agentex-sdk - # via litellm -jiter==0.10.0 - # via openai -jsonref==1.1.0 - # via agentex-sdk -jsonschema==4.25.0 - # via agentex-sdk - # via litellm - # via mcp -jsonschema-specifications==2025.4.1 - # via jsonschema -jupyter-client==8.6.3 - # via ipykernel -jupyter-core==5.8.1 - # via ipykernel - # via jupyter-client -kubernetes==28.1.0 - # via agentex-sdk -litellm==1.75.5.post1 - # via agentex-sdk -markdown-it-py==4.0.0 - # via rich -markupsafe==3.0.2 - # via jinja2 -matplotlib-inline==0.1.7 - # via ipykernel - # via ipython -mcp==1.12.4 - # via agentex-sdk - # via openai-agents -mdurl==0.1.2 - # via markdown-it-py -multidict==6.4.4 - # via aiohttp - # via yarl -nest-asyncio==1.6.0 - # via ipykernel -nexus-rpc==1.1.0 - # via temporalio -oauthlib==3.3.1 - # via kubernetes - # via requests-oauthlib -openai==1.99.9 - # via agentex-sdk - # via litellm - # via openai-agents -openai-agents==0.2.7 - # via agentex-sdk -packaging==25.0 - # via huggingface-hub - # via ipykernel - # via pytest -parso==0.8.4 - # via jedi -pexpect==4.9.0 - # via ipython -platformdirs==4.3.8 - # via jupyter-core -pluggy==1.6.0 - # via pytest -prompt-toolkit==3.0.51 - # via ipython - # via questionary -propcache==0.3.1 - # via aiohttp - # via yarl -protobuf==5.29.5 - # via temporalio -psutil==7.0.0 - # via ipykernel -ptyprocess==0.7.0 - # via pexpect -pure-eval==0.2.3 - # via stack-data -pyasn1==0.6.1 - # via pyasn1-modules - # via rsa -pyasn1-modules==0.4.2 - # via google-auth -pydantic==2.10.3 - # via agentex-sdk - # via fastapi - # via litellm - # via mcp - # via openai - # via openai-agents - # via pydantic-settings - # via python-on-whales - # via scale-gp - # via scale-gp-beta -pydantic-core==2.27.1 - # via pydantic -pydantic-settings==2.10.1 - # via mcp -pygments==2.19.2 - # via ipython - # via ipython-pygments-lexers - # via pytest - # via rich -pyjwt==2.10.1 - # via redis -pytest==8.4.1 - # via agentex-sdk - # via pytest-asyncio -pytest-asyncio==1.1.0 - # via agentex-sdk -python-dateutil==2.9.0.post0 - # via jupyter-client - # via kubernetes -python-dotenv==1.1.1 - # via litellm - # via mcp - # via pydantic-settings -python-multipart==0.0.20 - # via mcp -python-on-whales==0.73.0 - # via agentex-sdk -pyyaml==6.0.2 - # via agentex-sdk - # via huggingface-hub - # via kubernetes -pyzmq==27.0.1 - # via ipykernel - # via jupyter-client -questionary==2.1.0 - # via agentex-sdk -redis==5.3.1 - # via agentex-sdk -referencing==0.36.2 - # via jsonschema - # via jsonschema-specifications -regex==2025.7.34 - # via tiktoken -requests==2.32.4 - # via huggingface-hub - # via kubernetes - # via openai-agents - # via python-on-whales - # via requests-oauthlib - # via tiktoken -requests-oauthlib==2.0.0 - # via kubernetes -rich==13.9.4 - # via agentex-sdk - # via typer -rpds-py==0.27.0 - # via jsonschema - # via referencing -rsa==4.9.1 - # via google-auth -ruff==0.12.9 - # via agentex-sdk -scale-gp==0.1.0a59 - # via agentex-sdk -scale-gp-beta==0.1.0a20 - # via agentex-sdk -shellingham==1.5.4 - # via typer -six==1.17.0 - # via kubernetes - # via python-dateutil -sniffio==1.3.0 - # via agentex-sdk - # via anyio - # via httpx - # via openai - # via scale-gp - # via scale-gp-beta -sse-starlette==3.0.2 - # via mcp -stack-data==0.6.3 - # via ipython -starlette==0.46.2 - # via fastapi - # via mcp -temporalio==1.15.0 - # via agentex-sdk -tiktoken==0.11.0 - # via litellm -tokenizers==0.21.4 - # via litellm -tornado==6.5.2 - # via ipykernel - # via jupyter-client -tqdm==4.67.1 - # via huggingface-hub - # via openai - # via python-on-whales -traitlets==5.14.3 - # via ipykernel - # via ipython - # via jupyter-client - # via jupyter-core - # via matplotlib-inline -typer==0.16.0 - # via agentex-sdk - # via mcp - # via python-on-whales -types-protobuf==6.30.2.20250809 - # via temporalio -types-requests==2.31.0.6 - # via openai-agents -types-urllib3==1.26.25.14 - # via types-requests -typing-extensions==4.12.2 - # via agentex-sdk - # via anyio - # via fastapi - # via huggingface-hub - # via nexus-rpc - # via openai - # via openai-agents - # via pydantic - # via pydantic-core - # via python-on-whales - # via referencing - # via scale-gp - # via scale-gp-beta - # via temporalio - # via typer - # via typing-inspection -typing-inspection==0.4.1 - # via pydantic-settings -tzdata==2025.2 - # via agentex-sdk -tzlocal==5.3.1 - # via agentex-sdk -urllib3==1.26.20 - # via kubernetes - # via requests -uvicorn==0.35.0 - # via agentex-sdk - # via mcp -watchfiles==0.24.0 - # via agentex-sdk -wcwidth==0.2.13 - # via prompt-toolkit -websocket-client==1.8.0 - # via kubernetes -yarl==1.20.0 - # via aiohttp -zipp==3.23.0 - # via importlib-metadata diff --git a/scripts/bootstrap b/scripts/bootstrap index e84fe62c..049852e4 100755 --- a/scripts/bootstrap +++ b/scripts/bootstrap @@ -4,7 +4,7 @@ set -e cd "$(dirname "$0")/.." -if ! command -v rye >/dev/null 2>&1 && [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ]; then +if ! command -v uv >/dev/null 2>&1 && [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ]; then brew bundle check >/dev/null 2>&1 || { echo "==> Installing Homebrew dependencies…" brew bundle @@ -13,7 +13,4 @@ fi echo "==> Installing Python dependencies…" -# experimental uv support makes installations significantly faster -rye config --set-bool behavior.use-uv=true - -rye sync --all-features +uv sync --all-extras --group dev diff --git a/scripts/format b/scripts/format index 667ec2d7..80777a85 100755 --- a/scripts/format +++ b/scripts/format @@ -5,4 +5,4 @@ set -e cd "$(dirname "$0")/.." echo "==> Running formatters" -rye run format +uv run task format diff --git a/scripts/lint b/scripts/lint index 69fa62e9..ce3aa348 100755 --- a/scripts/lint +++ b/scripts/lint @@ -5,7 +5,7 @@ set -e cd "$(dirname "$0")/.." echo "==> Running lints" -rye run lint +uv run task lint echo "==> Making sure it imports" -rye run python -c 'import agentex' +uv run python -c 'import agentex' diff --git a/scripts/test b/scripts/test index 2c69d995..db770565 100755 --- a/scripts/test +++ b/scripts/test @@ -55,4 +55,4 @@ fi export DEFER_PYDANTIC_BUILD=false echo "==> Running tests" -rye run pytest "$@" +uv run pytest "$@" diff --git a/uv.lock b/uv.lock index e1c22638..c16e8a21 100644 --- a/uv.lock +++ b/uv.lock @@ -1,10 +1,10 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.12, <4" [[package]] name = "agentex-sdk" -version = "0.4.8" +version = "0.4.16" source = { editable = "." } dependencies = [ { name = "aiohttp" }, @@ -53,8 +53,23 @@ dev = [ [package.dev-dependencies] dev = [ + { name = "debugpy" }, + { name = "dirty-equals" }, + { name = "importlib-metadata" }, { name = "ipywidgets" }, + { name = "mypy" }, { name = "nbstripout" }, + { name = "nest-asyncio" }, + { name = "nox" }, + { name = "pyright" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-xdist" }, + { name = "respx" }, + { name = "rich" }, + { name = "ruff" }, + { name = "taskipy" }, + { name = "time-machine" }, { name = "yaspin" }, ] @@ -101,8 +116,23 @@ provides-extras = ["aiohttp", "dev"] [package.metadata.requires-dev] dev = [ + { name = "debugpy", specifier = ">=1.8.15" }, + { name = "dirty-equals", specifier = ">=0.6.0" }, + { name = "importlib-metadata", specifier = ">=6.7.0" }, { name = "ipywidgets", specifier = ">=8.1.7" }, + { name = "mypy" }, { name = "nbstripout", specifier = ">=0.8.1" }, + { name = "nest-asyncio", specifier = "==1.6.0" }, + { name = "nox" }, + { name = "pyright", specifier = "==1.1.399" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-xdist", specifier = ">=3.6.1" }, + { name = "respx" }, + { name = "rich", specifier = ">=13.7.1" }, + { name = "ruff" }, + { name = "taskipy", specifier = ">=1.12.0" }, + { name = "time-machine" }, { name = "yaspin", specifier = ">=3.1.0" }, ] @@ -211,6 +241,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, ] +[[package]] +name = "argcomplete" +version = "3.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/0f/861e168fc813c56a78b35f3c30d91c6757d1fd185af1110f1aec784b35d0/argcomplete-3.6.2.tar.gz", hash = "sha256:d0519b1bc867f5f4f4713c41ad0aba73a4a5f007449716b16f385f2166dc6adf", size = 73403, upload-time = "2025-04-03T04:57:03.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591", size = 43708, upload-time = "2025-04-03T04:57:01.591Z" }, +] + [[package]] name = "asttokens" version = "3.0.0" @@ -352,6 +391,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "colorlog" +version = "6.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/7a/359f4d5df2353f26172b3cc39ea32daa39af8de522205f512f458923e677/colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2", size = 16624, upload-time = "2024-10-29T18:34:51.011Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/51/9b208e85196941db2f0654ad0357ca6388ab3ed67efdbfc799f35d1f83aa/colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff", size = 11424, upload-time = "2024-10-29T18:34:49.815Z" }, +] + [[package]] name = "comm" version = "0.2.3" @@ -387,6 +438,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] +[[package]] +name = "dependency-groups" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/55/f054de99871e7beb81935dea8a10b90cd5ce42122b1c3081d5282fdb3621/dependency_groups-1.3.1.tar.gz", hash = "sha256:78078301090517fd938c19f64a53ce98c32834dfe0dee6b88004a569a6adfefd", size = 10093, upload-time = "2025-05-02T00:34:29.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/c7/d1ec24fb280caa5a79b6b950db565dab30210a66259d17d5bb2b3a9f878d/dependency_groups-1.3.1-py3-none-any.whl", hash = "sha256:51aeaa0dfad72430fcfb7bcdbefbd75f3792e5919563077f30bc0d73f4493030", size = 8664, upload-time = "2025-05-02T00:34:27.085Z" }, +] + +[[package]] +name = "dirty-equals" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/69/f8a63f97166565dbf01e6a3fdf4665313719a6781125f105e4ffde82c5cd/dirty_equals-0.10.0.tar.gz", hash = "sha256:623d7a07c5ba437f1a834c6246d1e3eb97238ca70331c61a499d9aabd757b899", size = 125778, upload-time = "2025-09-19T16:05:31.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/87/0fc6e51f9db3a3b3de88fb0c9cf6414d4572d565f4ba4d166023cbd4354d/dirty_equals-0.10.0-py3-none-any.whl", hash = "sha256:bbf4a4eaafd56e371dafe2edf2265315ebd71a441b142ed801511aa33e4c3438", size = 28014, upload-time = "2025-09-19T16:05:29.953Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, +] + [[package]] name = "distro" version = "1.9.0" @@ -396,6 +477,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 = "execnet" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload-time = "2024-04-08T09:04:19.245Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload-time = "2024-04-08T09:04:17.414Z" }, +] + [[package]] name = "executing" version = "2.2.0" @@ -1018,6 +1108,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "mslex" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/97/7022667073c99a0fe028f2e34b9bf76b49a611afd21b02527fbfd92d4cd5/mslex-1.3.0.tar.gz", hash = "sha256:641c887d1d3db610eee2af37a8e5abda3f70b3006cdfd2d0d29dc0d1ae28a85d", size = 11583, upload-time = "2024-10-16T13:16:18.523Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/f2/66bd65ca0139675a0d7b18f0bada6e12b51a984e41a76dbe44761bf1b3ee/mslex-1.3.0-py3-none-any.whl", hash = "sha256:c7074b347201b3466fc077c5692fbce9b5f62a63a51f537a53fbbd02eff2eea4", size = 7820, upload-time = "2024-10-16T13:16:17.566Z" }, +] + [[package]] name = "multidict" version = "6.6.4" @@ -1081,6 +1180,47 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/69/b547032297c7e63ba2af494edba695d781af8a0c6e89e4d06cf848b21d80/multidict-6.6.4-py3-none-any.whl", hash = "sha256:27d8f8e125c07cb954e54d75d04905a9bba8a439c1d84aca94949d4d03d8601c", size = 12313, upload-time = "2025-08-11T12:08:46.891Z" }, ] +[[package]] +name = "mypy" +version = "1.18.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "pathspec" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/77/8f0d0001ffad290cef2f7f216f96c814866248a0b92a722365ed54648e7e/mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b", size = 3448846, upload-time = "2025-09-19T00:11:10.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/06/dfdd2bc60c66611dd8335f463818514733bc763e4760dee289dcc33df709/mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34", size = 12908273, upload-time = "2025-09-19T00:10:58.321Z" }, + { url = "https://files.pythonhosted.org/packages/81/14/6a9de6d13a122d5608e1a04130724caf9170333ac5a924e10f670687d3eb/mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764", size = 11920910, upload-time = "2025-09-19T00:10:20.043Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a9/b29de53e42f18e8cc547e38daa9dfa132ffdc64f7250e353f5c8cdd44bee/mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893", size = 12465585, upload-time = "2025-09-19T00:10:33.005Z" }, + { url = "https://files.pythonhosted.org/packages/77/ae/6c3d2c7c61ff21f2bee938c917616c92ebf852f015fb55917fd6e2811db2/mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914", size = 13348562, upload-time = "2025-09-19T00:10:11.51Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/aec68ab3b4aebdf8f36d191b0685d99faa899ab990753ca0fee60fb99511/mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8", size = 13533296, upload-time = "2025-09-19T00:10:06.568Z" }, + { url = "https://files.pythonhosted.org/packages/9f/83/abcb3ad9478fca3ebeb6a5358bb0b22c95ea42b43b7789c7fb1297ca44f4/mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074", size = 9828828, upload-time = "2025-09-19T00:10:28.203Z" }, + { url = "https://files.pythonhosted.org/packages/5f/04/7f462e6fbba87a72bc8097b93f6842499c428a6ff0c81dd46948d175afe8/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc", size = 12898728, upload-time = "2025-09-19T00:10:01.33Z" }, + { url = "https://files.pythonhosted.org/packages/99/5b/61ed4efb64f1871b41fd0b82d29a64640f3516078f6c7905b68ab1ad8b13/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e", size = 11910758, upload-time = "2025-09-19T00:10:42.607Z" }, + { url = "https://files.pythonhosted.org/packages/3c/46/d297d4b683cc89a6e4108c4250a6a6b717f5fa96e1a30a7944a6da44da35/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986", size = 12475342, upload-time = "2025-09-19T00:11:00.371Z" }, + { url = "https://files.pythonhosted.org/packages/83/45/4798f4d00df13eae3bfdf726c9244bcb495ab5bd588c0eed93a2f2dd67f3/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d", size = 13338709, upload-time = "2025-09-19T00:11:03.358Z" }, + { url = "https://files.pythonhosted.org/packages/d7/09/479f7358d9625172521a87a9271ddd2441e1dab16a09708f056e97007207/mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba", size = 13529806, upload-time = "2025-09-19T00:10:26.073Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/ac0f2c7e9d0ea3c75cd99dff7aec1c9df4a1376537cb90e4c882267ee7e9/mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544", size = 9833262, upload-time = "2025-09-19T00:10:40.035Z" }, + { url = "https://files.pythonhosted.org/packages/5a/0c/7d5300883da16f0063ae53996358758b2a2df2a09c72a5061fa79a1f5006/mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce", size = 12893775, upload-time = "2025-09-19T00:10:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/50/df/2cffbf25737bdb236f60c973edf62e3e7b4ee1c25b6878629e88e2cde967/mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d", size = 11936852, upload-time = "2025-09-19T00:10:51.631Z" }, + { url = "https://files.pythonhosted.org/packages/be/50/34059de13dd269227fb4a03be1faee6e2a4b04a2051c82ac0a0b5a773c9a/mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c", size = 12480242, upload-time = "2025-09-19T00:11:07.955Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/040983fad5132d85914c874a2836252bbc57832065548885b5bb5b0d4359/mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb", size = 13326683, upload-time = "2025-09-19T00:09:55.572Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ba/89b2901dd77414dd7a8c8729985832a5735053be15b744c18e4586e506ef/mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075", size = 13514749, upload-time = "2025-09-19T00:10:44.827Z" }, + { url = "https://files.pythonhosted.org/packages/25/bc/cc98767cffd6b2928ba680f3e5bc969c4152bf7c2d83f92f5a504b92b0eb/mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf", size = 9982959, upload-time = "2025-09-19T00:10:37.344Z" }, + { url = "https://files.pythonhosted.org/packages/87/e3/be76d87158ebafa0309946c4a73831974d4d6ab4f4ef40c3b53a385a66fd/mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e", size = 2352367, upload-time = "2025-09-19T00:10:15.489Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + [[package]] name = "nbformat" version = "5.10.4" @@ -1129,6 +1269,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/2f/9e9d0dcaa4c6ffa22b7aa31069a8a264c753ff8027b36af602cce038c92f/nexus_rpc-1.1.0-py3-none-any.whl", hash = "sha256:d1b007af2aba186a27e736f8eaae39c03aed05b488084ff6c3d1785c9ba2ad38", size = 27743, upload-time = "2025-07-07T19:03:57.556Z" }, ] +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, +] + +[[package]] +name = "nox" +version = "2025.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argcomplete" }, + { name = "attrs" }, + { name = "colorlog" }, + { name = "dependency-groups" }, + { name = "packaging" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/80/47712208c410defec169992e57c179f0f4d92f5dd17ba8daca50a8077e23/nox-2025.5.1.tar.gz", hash = "sha256:2a571dfa7a58acc726521ac3cd8184455ebcdcbf26401c7b737b5bc6701427b2", size = 4023334, upload-time = "2025-05-01T16:35:48.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/be/7b423b02b09eb856beffe76fe8c4121c99852db74dd12a422dcb72d1134e/nox-2025.5.1-py3-none-any.whl", hash = "sha256:56abd55cf37ff523c254fcec4d152ed51e5fe80e2ab8317221d8b828ac970a31", size = 71753, upload-time = "2025-05-01T16:35:46.037Z" }, +] + [[package]] name = "oauthlib" version = "3.3.1" @@ -1193,6 +1359,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" }, ] +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, +] + [[package]] name = "pexpect" version = "4.9.0" @@ -1308,17 +1483,17 @@ wheels = [ [[package]] name = "psutil" -version = "7.0.0" +version = "6.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload-time = "2025-02-13T21:54:07.946Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502, upload-time = "2024-12-19T18:21:20.568Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload-time = "2025-02-13T21:54:12.36Z" }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload-time = "2025-02-13T21:54:16.07Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload-time = "2025-02-13T21:54:18.662Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload-time = "2025-02-13T21:54:21.811Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload-time = "2025-02-13T21:54:24.68Z" }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload-time = "2025-02-13T21:54:34.31Z" }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload-time = "2025-02-13T21:54:37.486Z" }, + { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511, upload-time = "2024-12-19T18:21:45.163Z" }, + { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985, upload-time = "2024-12-19T18:21:49.254Z" }, + { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488, upload-time = "2024-12-19T18:21:51.638Z" }, + { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477, upload-time = "2024-12-19T18:21:55.306Z" }, + { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017, upload-time = "2024-12-19T18:21:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602, upload-time = "2024-12-19T18:22:08.808Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444, upload-time = "2024-12-19T18:22:11.335Z" }, ] [[package]] @@ -1458,6 +1633,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, ] +[[package]] +name = "pyright" +version = "1.1.399" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nodeenv" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/9d/d91d5f6d26b2db95476fefc772e2b9a16d54c6bd0ea6bb5c1b6d635ab8b4/pyright-1.1.399.tar.gz", hash = "sha256:439035d707a36c3d1b443aec980bc37053fbda88158eded24b8eedcf1c7b7a1b", size = 3856954, upload-time = "2025-04-10T04:40:25.703Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/b5/380380c9e7a534cb1783c70c3e8ac6d1193c599650a55838d0557586796e/pyright-1.1.399-py3-none-any.whl", hash = "sha256:55f9a875ddf23c9698f24208c764465ffdfd38be6265f7faf9a176e1dc549f3b", size = 5592584, upload-time = "2025-04-10T04:40:23.502Z" }, +] + [[package]] name = "pytest" version = "8.4.1" @@ -1486,6 +1674,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/9d/bf86eddabf8c6c9cb1ea9a869d6873b46f105a5d292d3a6f7071f5b07935/pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf", size = 15157, upload-time = "2025-07-16T04:29:24.929Z" }, ] +[[package]] +name = "pytest-xdist" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "execnet" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1733,6 +1934,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, ] +[[package]] +name = "respx" +version = "0.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/7c/96bd0bc759cf009675ad1ee1f96535edcb11e9666b985717eb8c87192a95/respx-0.22.0.tar.gz", hash = "sha256:3c8924caa2a50bd71aefc07aa812f2466ff489f1848c96e954a5362d17095d91", size = 28439, upload-time = "2024-12-19T22:33:59.374Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/67/afbb0978d5399bc9ea200f1d4489a23c9a1dad4eee6376242b8182389c79/respx-0.22.0-py2.py3-none-any.whl", hash = "sha256:631128d4c9aba15e56903fb5f66fb1eff412ce28dd387ca3a81339e52dbd3ad0", size = 25127, upload-time = "2024-12-19T22:33:57.837Z" }, +] + [[package]] name = "rich" version = "13.9.4" @@ -1964,6 +2177,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload-time = "2025-04-13T13:56:16.21Z" }, ] +[[package]] +name = "taskipy" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama" }, + { name = "mslex", marker = "sys_platform == 'win32'" }, + { name = "psutil" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/44/572261df3db9c6c3332f8618fafeb07a578fd18b06673c73f000f3586749/taskipy-1.14.1.tar.gz", hash = "sha256:410fbcf89692dfd4b9f39c2b49e1750b0a7b81affd0e2d7ea8c35f9d6a4774ed", size = 14475, upload-time = "2024-11-26T16:37:46.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/97/4e4cfb1391c81e926bebe3d68d5231b5dbc3bb41c6ba48349e68a881462d/taskipy-1.14.1-py3-none-any.whl", hash = "sha256:6e361520f29a0fd2159848e953599f9c75b1d0b047461e4965069caeb94908f1", size = 13052, upload-time = "2024-11-26T16:37:44.546Z" }, +] + [[package]] name = "temporalio" version = "1.15.0" @@ -2016,6 +2244,72 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/79/bcf350609f3a10f09fe4fc207f132085e497fdd3612f3925ab24d86a0ca0/tiktoken-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:2177ffda31dec4023356a441793fed82f7af5291120751dee4d696414f54db0c", size = 883901, upload-time = "2025-08-08T23:57:59.359Z" }, ] +[[package]] +name = "time-machine" +version = "2.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/a4/1b5fdd165f61b67f445fac2a7feb0c655118edef429cd09ff5a8067f7f1d/time_machine-2.19.0.tar.gz", hash = "sha256:7c5065a8b3f2bbb449422c66ef71d114d3f909c276a6469642ecfffb6a0fcd29", size = 14576, upload-time = "2025-08-19T17:22:08.402Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/aa/7e00614d339e4d687f6e96e312a1566022528427d237ec639df66c4547bc/time_machine-2.19.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c85cf437dc3c07429456d8d6670ac90ecbd8241dcd0fbf03e8db2800576f91ff", size = 19308, upload-time = "2025-08-19T17:20:55.25Z" }, + { url = "https://files.pythonhosted.org/packages/ab/3c/bde3c757394f5bca2fbc1528d4117960a26c38f9b160bf471b38d2378d8f/time_machine-2.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d9238897e8ef54acdf59f5dff16f59ca0720e7c02d820c56b4397c11db5d3eb9", size = 15019, upload-time = "2025-08-19T17:20:56.204Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e0/8ca916dd918018352d377f1f5226ee071cfbeb7dbbde2b03d14a411ac2b1/time_machine-2.19.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e312c7d5d6bfffb96c6a7b39ff29e3046de100d7efaa3c01552654cfbd08f14c", size = 33079, upload-time = "2025-08-19T17:20:57.166Z" }, + { url = "https://files.pythonhosted.org/packages/48/69/184a0209f02dd0cb5e01e8d13cd4c97a5f389c4e3d09b95160dd676ad1e7/time_machine-2.19.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:714c40b2c90d1c57cc403382d5a9cf16e504cb525bfe9650095317da3c3d62b5", size = 34925, upload-time = "2025-08-19T17:20:58.117Z" }, + { url = "https://files.pythonhosted.org/packages/43/42/4bbf4309e8e57cea1086eb99052d97ff6ddecc1ab6a3b07aa4512f8bf963/time_machine-2.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2eaa1c675d500dc3ccae19e9fb1feff84458a68c132bbea47a80cc3dd2df7072", size = 36384, upload-time = "2025-08-19T17:20:59.108Z" }, + { url = "https://files.pythonhosted.org/packages/b1/af/9f510dc1719157348c1a2e87423aed406589070b54b503cb237d9bf3a4fe/time_machine-2.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e77a414e9597988af53b2b2e67242c9d2f409769df0d264b6d06fda8ca3360d4", size = 34881, upload-time = "2025-08-19T17:21:00.116Z" }, + { url = "https://files.pythonhosted.org/packages/ca/28/61764a635c70cc76c76ba582dfdc1a84834cddaeb96789023af5214426b2/time_machine-2.19.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cd93996970e11c382b04d4937c3cd0b0167adeef14725ece35aae88d8a01733c", size = 32931, upload-time = "2025-08-19T17:21:01.095Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e0/f028d93b266e6ade8aca5851f76ebbc605b2905cdc29981a2943b43e1a6c/time_machine-2.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8e20a6d8d6e23174bd7e931e134d9610b136db460b249d07e84ecdad029ec352", size = 34241, upload-time = "2025-08-19T17:21:02.052Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a6/36d1950ed1d3f613158024cf1dcc73db1d9ef0b9117cf51ef2e37dc06499/time_machine-2.19.0-cp312-cp312-win32.whl", hash = "sha256:95afc9bc65228b27be80c2756799c20b8eb97c4ef382a9b762b6d7888bc84099", size = 17021, upload-time = "2025-08-19T17:21:03.374Z" }, + { url = "https://files.pythonhosted.org/packages/b1/0d/e2dce93355abda3cac69e77fe96566757e98b8fe7fdcbddce89c9ced3f5f/time_machine-2.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:e84909af950e2448f4e2562ea5759c946248c99ab380d2b47d79b62bd76fa236", size = 17857, upload-time = "2025-08-19T17:21:04.331Z" }, + { url = "https://files.pythonhosted.org/packages/eb/28/50ae6fb83b7feeeca7a461c0dc156cf7ef5e6ef594a600d06634fde6a2cb/time_machine-2.19.0-cp312-cp312-win_arm64.whl", hash = "sha256:0390a1ea9fa7e9d772a39b7c61b34fdcca80eb9ffac339cc0441c6c714c81470", size = 16677, upload-time = "2025-08-19T17:21:05.39Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b8/24ebce67aa531bae2cbe164bb3f4abc6467dc31f3aead35e77f5a075ea3e/time_machine-2.19.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5e172866753e6041d3b29f3037dc47c20525176a494a71bbd0998dfdc4f11f2f", size = 19373, upload-time = "2025-08-19T17:21:06.701Z" }, + { url = "https://files.pythonhosted.org/packages/53/a5/c9a5240fd2f845d3ff9fa26f8c8eaa29f7239af9d65007e61d212250f15b/time_machine-2.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f70f68379bd6f542ae6775cce9a4fa3dcc20bf7959c42eaef871c14469e18097", size = 15056, upload-time = "2025-08-19T17:21:07.667Z" }, + { url = "https://files.pythonhosted.org/packages/b9/92/66cce5d2fb2a5e68459aca85fd18a7e2d216f725988940cd83f96630f2f1/time_machine-2.19.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e69e0b0f694728a00e72891ef8dd00c7542952cb1c87237db594b6b27d504a96", size = 33172, upload-time = "2025-08-19T17:21:08.619Z" }, + { url = "https://files.pythonhosted.org/packages/ae/20/b499e9ab4364cd466016c33dcdf4f56629ca4c20b865bd4196d229f31d92/time_machine-2.19.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3ae0a8b869574301ec5637e32c270c7384cca5cd6e230f07af9d29271a7fa293", size = 35042, upload-time = "2025-08-19T17:21:09.622Z" }, + { url = "https://files.pythonhosted.org/packages/41/32/b252d3d32791eb16c07d553c820dbc33d9c7fa771de3d1c602190bded2b7/time_machine-2.19.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:554e4317de90e2f7605ff80d153c8bb56b38c0d0c0279feb17e799521e987b8c", size = 36535, upload-time = "2025-08-19T17:21:10.571Z" }, + { url = "https://files.pythonhosted.org/packages/98/cf/4d0470062b9742e1b040ab81bad04d1a5d1de09806507bb6188989cfa1a7/time_machine-2.19.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6567a5ec5538ed550539ac29be11b3cb36af1f9894e2a72940cba0292cc7c3c9", size = 34945, upload-time = "2025-08-19T17:21:11.538Z" }, + { url = "https://files.pythonhosted.org/packages/24/71/2f741b29d98b1c18f6777a32236497c3d3264b6077e431cea4695684c8a1/time_machine-2.19.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82e9ffe8dfff07b0d810a2ad015a82cd78c6a237f6c7cf185fa7f747a3256f8a", size = 33014, upload-time = "2025-08-19T17:21:12.858Z" }, + { url = "https://files.pythonhosted.org/packages/e8/83/ca8dba6106562843fd99f672e5aaf95badbc10f4f13f7cfe8d8640a7019d/time_machine-2.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7e1c4e578cdd69b3531d8dd3fbcb92a0cd879dadb912ee37af99c3a9e3c0d285", size = 34350, upload-time = "2025-08-19T17:21:13.923Z" }, + { url = "https://files.pythonhosted.org/packages/21/7f/34fe540450e18d0a993240100e4b86e8d03d831b92af8bb6ddb2662dc6fc/time_machine-2.19.0-cp313-cp313-win32.whl", hash = "sha256:72dbd4cbc3d96dec9dd281ddfbb513982102776b63e4e039f83afb244802a9e5", size = 17047, upload-time = "2025-08-19T17:21:14.874Z" }, + { url = "https://files.pythonhosted.org/packages/bf/5d/c8be73df82c7ebe7cd133279670e89b8b110af3ce1412c551caa9d08e625/time_machine-2.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:e17e3e089ac95f9a145ce07ff615e3c85674f7de36f2d92aaf588493a23ffb4b", size = 17868, upload-time = "2025-08-19T17:21:15.819Z" }, + { url = "https://files.pythonhosted.org/packages/92/13/2dfd3b8fb285308f61cd7aa9bfa96f46ddf916e3549a0f0afd094c556599/time_machine-2.19.0-cp313-cp313-win_arm64.whl", hash = "sha256:149072aff8e3690e14f4916103d898ea0d5d9c95531b6aa0995251c299533f7b", size = 16710, upload-time = "2025-08-19T17:21:16.748Z" }, + { url = "https://files.pythonhosted.org/packages/05/c1/deebb361727d2c5790f9d4d874be1b19afd41f4375581df465e6718b46a2/time_machine-2.19.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f3589fee1ed0ab6ee424a55b0ea1ec694c4ba64cc26895bcd7d99f3d1bc6a28a", size = 20053, upload-time = "2025-08-19T17:21:17.704Z" }, + { url = "https://files.pythonhosted.org/packages/45/e8/fe3376951e6118d8ec1d1f94066a169b791424fe4a26c7dfc069b153ee08/time_machine-2.19.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7887e85275c4975fe54df03dcdd5f38bd36be973adc68a8c77e17441c3b443d6", size = 15423, upload-time = "2025-08-19T17:21:18.668Z" }, + { url = "https://files.pythonhosted.org/packages/9c/c7/f88d95cd1a87c650cf3749b4d64afdaf580297aa18ad7f4b44ec9d252dfc/time_machine-2.19.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ce0be294c209928563fcce1c587963e60ec803436cf1e181acd5bc1e425d554b", size = 39630, upload-time = "2025-08-19T17:21:19.645Z" }, + { url = "https://files.pythonhosted.org/packages/cc/5d/65a5c48a65357e56ec6f032972e4abd1c02d4fca4b0717a3aaefd19014d4/time_machine-2.19.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a62fd1ab380012c86f4c042010418ed45eb31604f4bf4453e17c9fa60bc56a29", size = 41242, upload-time = "2025-08-19T17:21:20.979Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f9/fe5209e1615fde0a8cad6c4e857157b150333ed1fe31a7632b08cfe0ebdd/time_machine-2.19.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b25ec853a4530a5800731257f93206b12cbdee85ede964ebf8011b66086a7914", size = 44278, upload-time = "2025-08-19T17:21:21.984Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3a/a5e5fe9c5d614cde0a9387ff35e8dfd12c5ef6384e4c1a21b04e6e0b905d/time_machine-2.19.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a430e4d0e0556f021a9c78e9b9f68e5e8910bdace4aa34ed4d1a73e239ed9384", size = 42321, upload-time = "2025-08-19T17:21:23.755Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c5/56eca774e9162bc1ce59111d2bd69140dc8908c9478c92ec7bd15d547600/time_machine-2.19.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2415b7495ec4364c8067071e964fbadfe746dd4cdb43983f2f0bd6ebed13315c", size = 39270, upload-time = "2025-08-19T17:21:26.009Z" }, + { url = "https://files.pythonhosted.org/packages/9b/69/5dd0c420667578169a12acc8c8fd7452e8cfb181e41c9b4ac7e88fa36686/time_machine-2.19.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dbfc6b90c10f288594e1bf89a728a98cc0030791fd73541bbdc6b090aff83143", size = 40193, upload-time = "2025-08-19T17:21:27.054Z" }, + { url = "https://files.pythonhosted.org/packages/75/a7/de974d421bd55c9355583427c2a38fb0237bb5fd6614af492ba89dacb2f9/time_machine-2.19.0-cp313-cp313t-win32.whl", hash = "sha256:16f5d81f650c0a4d117ab08036dc30b5f8b262e11a4a0becc458e7f1c011b228", size = 17542, upload-time = "2025-08-19T17:21:28.674Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/aa0d05becd5d06ae8d3f16d657dc8cc9400c8d79aef80299de196467ff12/time_machine-2.19.0-cp313-cp313t-win_amd64.whl", hash = "sha256:645699616ec14e147094f601e6ab9553ff6cea37fad9c42720a6d7ed04bcd5dc", size = 18703, upload-time = "2025-08-19T17:21:29.663Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c0/f785a4c7c73aa176510f7c48b84b49c26be84af0d534deb222e0327f750e/time_machine-2.19.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b32daa965d13237536ea3afaa5ad61ade2b2d9314bc3a20196a0d2e1d7b57c6a", size = 17020, upload-time = "2025-08-19T17:21:30.653Z" }, + { url = "https://files.pythonhosted.org/packages/ed/97/c5fb51def06c0b2b6735332ad118ab35b4d9b85368792e5b638e99b1b686/time_machine-2.19.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:31cb43c8fd2d961f31bed0ff4e0026964d2b35e5de9e0fabbfecf756906d3612", size = 19360, upload-time = "2025-08-19T17:21:31.94Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4e/2d795f7d6b7f5205ffe737a05bb1cf19d8038233b797062b2ef412b8512b/time_machine-2.19.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:bdf481a75afc6bff3e520db594501975b652f7def21cd1de6aa971d35ba644e6", size = 15033, upload-time = "2025-08-19T17:21:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/dd/32/9bad501e360b4e758c58fae616ca5f8c7ad974b343f2463a15b2bf77a366/time_machine-2.19.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:00bee4bb950ac6a08d62af78e4da0cf2b4fc2abf0de2320d0431bf610db06e7c", size = 33379, upload-time = "2025-08-19T17:21:33.925Z" }, + { url = "https://files.pythonhosted.org/packages/a3/45/eda0ca4d793dfd162478d6163759b1c6ce7f6e61daa7fd7d62b31f21f87f/time_machine-2.19.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9f02199490906582302ce09edd32394fb393271674c75d7aa76c7a3245f16003", size = 35123, upload-time = "2025-08-19T17:21:34.945Z" }, + { url = "https://files.pythonhosted.org/packages/f0/5a/97e16325442ae5731fcaac794f0a1ef9980eff8a5491e58201d7eb814a34/time_machine-2.19.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e35726c7ba625f844c13b1fc0d4f81f394eefaee1d3a094a9093251521f2ef15", size = 36588, upload-time = "2025-08-19T17:21:35.975Z" }, + { url = "https://files.pythonhosted.org/packages/e8/9d/bf0b2ccc930cc4a316f26f1c78d3f313cd0fa13bb7480369b730a8f129db/time_machine-2.19.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:304315023999cd401ff02698870932b893369e1cfeb2248d09f6490507a92e97", size = 35013, upload-time = "2025-08-19T17:21:37.017Z" }, + { url = "https://files.pythonhosted.org/packages/f0/5a/39ac6a3078174f9715d88364871348b249631f12e76de1b862433b3f8862/time_machine-2.19.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9765d4f003f263ea8bfd90d2d15447ca4b3dfa181922cf6cf808923b02ac180a", size = 33303, upload-time = "2025-08-19T17:21:38.352Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ac/d8646baf9f95f2e792a6d7a7b35e92fca253c4a992afff801beafae0e5c2/time_machine-2.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7837ef3fd5911eb9b480909bb93d922737b6bdecea99dfcedb0a03807de9b2d3", size = 34440, upload-time = "2025-08-19T17:21:39.382Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8b/8b6568c5ae966d80ead03ab537be3c6acf2af06fb501c2d466a3162c6295/time_machine-2.19.0-cp314-cp314-win32.whl", hash = "sha256:4bb5bd43b1bdfac3007b920b51d8e761f024ed465cfeec63ac4296922a4ec428", size = 17162, upload-time = "2025-08-19T17:21:40.381Z" }, + { url = "https://files.pythonhosted.org/packages/46/a5/211c1ab4566eba5308b2dc001b6349e3a032e3f6afa67ca2f27ea6b27af5/time_machine-2.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:f583bbd0aa8ab4a7c45a684bf636d9e042d466e30bcbae1d13e7541e2cbe7207", size = 18040, upload-time = "2025-08-19T17:21:41.363Z" }, + { url = "https://files.pythonhosted.org/packages/b8/fc/4c2fb705f6371cb83824da45a8b967514a922fc092a0ef53979334d97a70/time_machine-2.19.0-cp314-cp314-win_arm64.whl", hash = "sha256:f379c6f8a6575a8284592179cf528ce89373f060301323edcc44f1fa1d37be12", size = 16752, upload-time = "2025-08-19T17:21:42.336Z" }, + { url = "https://files.pythonhosted.org/packages/79/ab/6437d18f31c666b5116c97572a282ac2590a82a0a9867746a6647eaf4613/time_machine-2.19.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a3b8981f9c663b0906b05ab4d0ca211fae4b63b47c6ec26de5374fe56c836162", size = 20057, upload-time = "2025-08-19T17:21:43.35Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a2/e03639ec2ba7200328bbcad8a2b2b1d5fccca9cceb9481b164a1cabdcb33/time_machine-2.19.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8e9c6363893e7f52c226afbebb23e825259222d100e67dfd24c8a6d35f1a1907", size = 15430, upload-time = "2025-08-19T17:21:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ff/39e63a48e840f3e36ce24846ee51dd99c6dba635659b1750a2993771e88e/time_machine-2.19.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:206fcd6c9a6f00cac83db446ad1effc530a8cec244d2780af62db3a2d0a9871b", size = 39622, upload-time = "2025-08-19T17:21:45.821Z" }, + { url = "https://files.pythonhosted.org/packages/9a/2e/ee5ac79c4954768705801e54817c7d58e07e25a0bb227e775f501f3e2122/time_machine-2.19.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bf33016a1403c123373ffaeff25e26e69d63bf2c63b6163932efed94160db7ef", size = 41235, upload-time = "2025-08-19T17:21:46.783Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3e/9af5f39525e779185c77285b8bbae15340eeeaa0afb33d458bc8b47d459b/time_machine-2.19.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9247c4bb9bbd3ff584ef4efbdec8efd9f37aa08bcfc4728bde1e489c2cb445bd", size = 44276, upload-time = "2025-08-19T17:21:47.759Z" }, + { url = "https://files.pythonhosted.org/packages/59/fe/572c7443cc27140bbeae3947279bbd4a120f9e8622253a20637f260b7813/time_machine-2.19.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:77f9bb0b86758d1f2d9352642c874946ad5815df53ef4ca22eb9d532179fe50d", size = 42330, upload-time = "2025-08-19T17:21:48.881Z" }, + { url = "https://files.pythonhosted.org/packages/cf/24/1a81c2e08ee7dae13ec8ceed27a29afa980c3d63852e42f1e023bf0faa03/time_machine-2.19.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0b529e262df3b9c449f427385f4d98250828c879168c2e00eec844439f40b370", size = 39281, upload-time = "2025-08-19T17:21:49.907Z" }, + { url = "https://files.pythonhosted.org/packages/d2/60/6f0d6e5108978ca1a2a4ffb4d1c7e176d9199bb109fd44efe2680c60b52a/time_machine-2.19.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9199246e31cdc810e5d89cb71d09144c4d745960fdb0824da4994d152aca3303", size = 40201, upload-time = "2025-08-19T17:21:50.953Z" }, + { url = "https://files.pythonhosted.org/packages/73/b9/3ea4951e8293b0643feb98c0b9a176fa822154f1810835db3f282968ab10/time_machine-2.19.0-cp314-cp314t-win32.whl", hash = "sha256:0fe81bae55b7aefc2c2a34eb552aa82e6c61a86b3353a3c70df79b9698cb02ca", size = 17743, upload-time = "2025-08-19T17:21:51.948Z" }, + { url = "https://files.pythonhosted.org/packages/e4/8b/cd802884ca8a98e2b6cdc2397d57dd12ff8a7d1481e06fc3fad3d4e7e5ff/time_machine-2.19.0-cp314-cp314t-win_amd64.whl", hash = "sha256:7253791b8d7e7399fbeed7a8193cb01bc004242864306288797056badbdaf80b", size = 18956, upload-time = "2025-08-19T17:21:52.997Z" }, + { url = "https://files.pythonhosted.org/packages/c6/49/cabb1593896082fd55e34768029b8b0ca23c9be8b2dc127e0fc14796d33e/time_machine-2.19.0-cp314-cp314t-win_arm64.whl", hash = "sha256:536bd1ac31ab06a1522e7bf287602188f502dc19d122b1502c4f60b1e8efac79", size = 17068, upload-time = "2025-08-19T17:21:54.064Z" }, +] + [[package]] name = "tokenizers" version = "0.21.4" @@ -2041,6 +2335,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/f2/fd673d979185f5dcbac4be7d09461cbb99751554ffb6718d0013af8604cb/tokenizers-0.21.4-cp39-abi3-win_amd64.whl", hash = "sha256:475d807a5c3eb72c59ad9b5fcdb254f6e17f53dfcbb9903233b0dfa9c943b597", size = 2507568, upload-time = "2025-07-28T15:48:55.456Z" }, ] +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, +] + [[package]] name = "tornado" version = "6.5.2" @@ -2190,6 +2513,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" }, ] +[[package]] +name = "virtualenv" +version = "20.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" }, +] + [[package]] name = "watchfiles" version = "0.24.0" From 4b213265bddc9d12e48083b56e15677af9c7374b Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Wed, 24 Sep 2025 16:22:54 +0100 Subject: [PATCH 02/11] migrate ci fully to uv --- .github/workflows/ci.yml | 45 ++++++++++++++++----------------------- CLAUDE.md | 3 ++- pyproject.toml | 46 ++++++++++++++++++++++++++++------------ uv.lock | 36 +++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 42 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f528a614..f807e68a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,19 +21,16 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install Rye - run: | - curl -sSf https://rye.astral.sh/get | bash - echo "$HOME/.rye/shims" >> $GITHUB_PATH - env: - RYE_VERSION: '0.44.0' - RYE_INSTALL_OPTION: '--yes' + - uses: astral-sh/setup-uv@v3 + with: + version: "latest" + enable-cache: true - name: Install dependencies - run: rye sync --all-features + run: uv sync --all-extras --group dev - name: Run lints - run: ./scripts/lint + run: uv run task ci-lint build: if: github.event_name == 'push' || github.event.pull_request.head.repo.fork @@ -46,19 +43,16 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install Rye - run: | - curl -sSf https://rye.astral.sh/get | bash - echo "$HOME/.rye/shims" >> $GITHUB_PATH - env: - RYE_VERSION: '0.44.0' - RYE_INSTALL_OPTION: '--yes' + - uses: astral-sh/setup-uv@v3 + with: + version: "latest" + enable-cache: true - name: Install dependencies - run: rye sync --all-features + run: uv sync --all-extras --group dev - name: Run build - run: rye build + run: uv run task ci-build - name: Get GitHub OIDC Token if: github.repository == 'stainless-sdks/agentex-sdk-python' @@ -83,16 +77,13 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install Rye - run: | - curl -sSf https://rye.astral.sh/get | bash - echo "$HOME/.rye/shims" >> $GITHUB_PATH - env: - RYE_VERSION: '0.44.0' - RYE_INSTALL_OPTION: '--yes' + - uses: astral-sh/setup-uv@v3 + with: + version: "latest" + enable-cache: true - name: Bootstrap - run: ./scripts/bootstrap + run: uv run task bootstrap - name: Run tests - run: ./scripts/test + run: uv run task ci-test diff --git a/CLAUDE.md b/CLAUDE.md index 985d5fab..4857c4bc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,8 +6,9 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ### Package Management - Use `uv` for dependency management -- Run `./scripts/bootstrap` to set up the environment +- Run `uv run task bootstrap` to set up the environment - Or use `uv sync --all-extras --group dev` directly +- Run `uv run task setup-pre-commit` to install pre-commit hooks Both the main repo and individual tutorials use `uv` for consistency. diff --git a/pyproject.toml b/pyproject.toml index 47880451..9ec64a3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,23 +96,41 @@ dev = [ "nbstripout>=0.8.1", "yaspin>=3.1.0", "taskipy>=1.12.0", + "pre-commit>=3.5.0", ] [tool.taskipy.tasks] -format = { cmd = "task format:ruff && task format:docs && task fix:ruff && task format:ruff", help = "Format code with ruff and docs" } -"format:docs" = { cmd = "python scripts/utils/ruffen-docs.py README.md api.md", help = "Format documentation" } -"format:ruff" = { cmd = "ruff format", help = "Format code with ruff" } - -lint = { cmd = "task check:ruff && task typecheck && task check:importable", help = "Run all linting checks" } -"check:ruff" = { cmd = "ruff check .", help = "Check code with ruff" } -"fix:ruff" = { cmd = "ruff check --fix .", help = "Fix ruff issues automatically" } - -"check:importable" = { cmd = "python -c 'import agentex'", help = "Check that agentex can be imported" } - -typecheck = { cmd = "task typecheck:pyright && task typecheck:mypy", help = "Run type checking" } -"typecheck:pyright" = { cmd = "pyright", help = "Run pyright type checker" } -"typecheck:verify-types" = { cmd = "pyright --verifytypes agentex --ignoreexternal", help = "Verify types" } -"typecheck:mypy" = { cmd = "mypy .", help = "Run mypy type checker" } +# === ATOMIC TASKS (building blocks) === +"format-ruff" = { cmd = "ruff format", help = "Format code with ruff" } +"format-docs" = { cmd = "python scripts/utils/ruffen-docs.py README.md api.md", help = "Format documentation" } +"check-ruff" = { cmd = "ruff check .", help = "Check code with ruff" } +"fix-ruff" = { cmd = "ruff check --fix .", help = "Fix ruff issues automatically" } +"check-types-pyright" = { cmd = "pyright", help = "Run pyright type checker" } +"check-types-mypy" = { cmd = "mypy .", help = "Run mypy type checker" } +"check-importable" = { cmd = "python -c 'import agentex'", help = "Check that agentex can be imported" } + +# === COMPOSITE TASKS with hooks === +format = { cmd = "task format-ruff", help = "Format code with ruff and docs" } +post_format = "task format-docs" + +typecheck = { cmd = "task check-types-pyright", help = "Run type checking" } +post_typecheck = "task check-types-mypy" + +lint = { cmd = "task check-ruff", help = "Run all linting checks" } +post_lint = "task typecheck && task check-importable" + +# === SCRIPT DELEGATION (complex operations) === +bootstrap = { cmd = "./scripts/bootstrap", help = "Set up development environment" } +test = { cmd = "./scripts/test", help = "Run tests with mock server" } +mock = { cmd = "./scripts/mock", help = "Start mock API server" } + +# === DEVELOPMENT SETUP === +setup-pre-commit = { cmd = "pre-commit install", help = "Install pre-commit hooks" } + +# === CI-SPECIFIC TASKS === +ci-lint = { cmd = "task lint", help = "Run linting for CI" } +ci-test = { cmd = "task test", help = "Run tests for CI" } +ci-build = { cmd = "uv build", help = "Build package for CI" } [tool.hatch.build] include = [ diff --git a/uv.lock b/uv.lock index c16e8a21..8cfc09fb 100644 --- a/uv.lock +++ b/uv.lock @@ -61,6 +61,7 @@ dev = [ { name = "nbstripout" }, { name = "nest-asyncio" }, { name = "nox" }, + { name = "pre-commit" }, { name = "pyright" }, { name = "pytest" }, { name = "pytest-asyncio" }, @@ -124,6 +125,7 @@ dev = [ { name = "nbstripout", specifier = ">=0.8.1" }, { name = "nest-asyncio", specifier = "==1.6.0" }, { name = "nox" }, + { name = "pre-commit", specifier = ">=3.5.0" }, { name = "pyright", specifier = "==1.1.399" }, { name = "pytest" }, { name = "pytest-asyncio" }, @@ -319,6 +321,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, ] +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.3" @@ -716,6 +727,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/39/7b/bb06b061991107cd8783f300adff3e7b7f284e330fd82f507f2a1417b11d/huggingface_hub-0.34.4-py3-none-any.whl", hash = "sha256:9b365d781739c93ff90c359844221beef048403f1bc1f1c123c191257c3c890a", size = 561452, upload-time = "2025-08-08T09:14:50.159Z" }, ] +[[package]] +name = "identify" +version = "2.6.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/c4/62963f25a678f6a050fb0505a65e9e726996171e6dbe1547f79619eefb15/identify-2.6.14.tar.gz", hash = "sha256:663494103b4f717cb26921c52f8751363dc89db64364cd836a9bf1535f53cd6a", size = 99283, upload-time = "2025-09-06T19:30:52.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/ae/2ad30f4652712c82f1c23423d79136fbce338932ad166d70c1efb86a5998/identify-2.6.14-py2.py3-none-any.whl", hash = "sha256:11a073da82212c6646b1f39bb20d4483bfb9543bd5566fec60053c4bb309bf2e", size = 99172, upload-time = "2025-09-06T19:30:51.759Z" }, +] + [[package]] name = "idna" version = "3.10" @@ -1398,6 +1418,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] +[[package]] +name = "pre-commit" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" }, +] + [[package]] name = "prompt-toolkit" version = "3.0.51" From 7a793c299069583e9eb463f69b7500ed4e81a83e Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Wed, 24 Sep 2025 16:23:02 +0100 Subject: [PATCH 03/11] add pre-commit --- .pre-commit-config.yaml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..11b006ca --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,26 @@ +repos: + - repo: local + hooks: + - id: format + name: Format code and docs + entry: uv run task format + language: system + types: [python] + pass_filenames: false + + - id: lint + name: Lint code and type check + entry: uv run task lint + language: system + types: [python] + pass_filenames: false + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-toml + - id: check-merge-conflict + - id: check-added-large-files \ No newline at end of file From 1bffb285f567abe4bf52f5fde489e8a1d7b134ec Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Wed, 24 Sep 2025 16:27:59 +0100 Subject: [PATCH 04/11] remove python version pin --- .python-version | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .python-version diff --git a/.python-version b/.python-version deleted file mode 100644 index e4fba218..00000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12 From c33988b89e635f080c7ab56d86f856f5c899c7bd Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Wed, 24 Sep 2025 16:37:45 +0100 Subject: [PATCH 05/11] refactor github workflows --- .github/workflows/ci.yml | 41 ++++++---------------------- .github/workflows/publish-pypi.yml | 19 ++----------- .github/workflows/release-doctor.yml | 6 +++- bin/check-release-environment | 21 -------------- bin/publish-pypi | 6 ---- 5 files changed, 17 insertions(+), 76 deletions(-) delete mode 100644 bin/check-release-environment delete mode 100644 bin/publish-pypi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f807e68a..1d781b4b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,17 +20,9 @@ jobs: if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: - uses: actions/checkout@v4 - - - uses: astral-sh/setup-uv@v3 - with: - version: "latest" - enable-cache: true - - - name: Install dependencies - run: uv sync --all-extras --group dev - - - name: Run lints - run: uv run task ci-lint + - uses: astral-sh/setup-uv@v6 + - run: uv sync --all-extras --group dev + - run: uv run task ci-lint build: if: github.event_name == 'push' || github.event.pull_request.head.repo.fork @@ -42,17 +34,9 @@ jobs: runs-on: ${{ github.repository == 'stainless-sdks/agentex-sdk-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} steps: - uses: actions/checkout@v4 - - - uses: astral-sh/setup-uv@v3 - with: - version: "latest" - enable-cache: true - - - name: Install dependencies - run: uv sync --all-extras --group dev - - - name: Run build - run: uv run task ci-build + - uses: astral-sh/setup-uv@v6 + - run: uv sync --all-extras --group dev + - run: uv run task ci-build - name: Get GitHub OIDC Token if: github.repository == 'stainless-sdks/agentex-sdk-python' @@ -77,13 +61,6 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v3 - with: - version: "latest" - enable-cache: true - - - name: Bootstrap - run: uv run task bootstrap - - - name: Run tests - run: uv run task ci-test + - uses: astral-sh/setup-uv@v6 + - run: uv run task bootstrap + - run: uv run task ci-test diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index 7e8ac3bd..2c240497 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -4,7 +4,6 @@ name: Publish PyPI on: workflow_dispatch: - release: types: [published] @@ -12,20 +11,8 @@ jobs: publish: name: publish runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - - - name: Install Rye - run: | - curl -sSf https://rye.astral.sh/get | bash - echo "$HOME/.rye/shims" >> $GITHUB_PATH - env: - RYE_VERSION: '0.44.0' - RYE_INSTALL_OPTION: '--yes' - - - name: Publish to PyPI - run: | - bash ./bin/publish-pypi - env: - PYPI_TOKEN: ${{ secrets.AGENTEX_PYPI_TOKEN || secrets.PYPI_TOKEN }} + - uses: astral-sh/setup-uv@v6 + - run: uv build + - run: uv publish --token ${{ secrets.AGENTEX_PYPI_TOKEN || secrets.PYPI_TOKEN }} diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml index 0521b7f6..def20cf5 100644 --- a/.github/workflows/release-doctor.yml +++ b/.github/workflows/release-doctor.yml @@ -16,6 +16,10 @@ jobs: - name: Check release environment run: | - bash ./bin/check-release-environment + if [ -z "$PYPI_TOKEN" ]; then + echo "Error: The PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets." + exit 1 + fi + echo "The environment is ready to push releases!" env: PYPI_TOKEN: ${{ secrets.AGENTEX_PYPI_TOKEN || secrets.PYPI_TOKEN }} diff --git a/bin/check-release-environment b/bin/check-release-environment deleted file mode 100644 index b845b0f4..00000000 --- a/bin/check-release-environment +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -errors=() - -if [ -z "${PYPI_TOKEN}" ]; then - errors+=("The PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.") -fi - -lenErrors=${#errors[@]} - -if [[ lenErrors -gt 0 ]]; then - echo -e "Found the following errors in the release environment:\n" - - for error in "${errors[@]}"; do - echo -e "- $error\n" - done - - exit 1 -fi - -echo "The environment is ready to push releases!" diff --git a/bin/publish-pypi b/bin/publish-pypi deleted file mode 100644 index 826054e9..00000000 --- a/bin/publish-pypi +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -set -eux -mkdir -p dist -rye build --clean -rye publish --yes --token=$PYPI_TOKEN From 0314293281696551fa6fc9be46dd43e1564e5c99 Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Wed, 24 Sep 2025 16:46:41 +0100 Subject: [PATCH 06/11] cleanup leftovers --- CLAUDE.md | 6 +++--- pyproject.toml | 2 +- scripts/bootstrap | 16 ---------------- scripts/format | 8 -------- scripts/lint | 11 ----------- 5 files changed, 4 insertions(+), 39 deletions(-) delete mode 100755 scripts/bootstrap delete mode 100755 scripts/format delete mode 100755 scripts/lint diff --git a/CLAUDE.md b/CLAUDE.md index 4857c4bc..2806e5a7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,14 +13,14 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co Both the main repo and individual tutorials use `uv` for consistency. #### Testing -- Run tests: `uv run pytest` or `./scripts/test` +- Run tests: `uv run task test` (with mock server) or `uv run pytest` (direct) - Run specific test: `uv run pytest path/to/test_file.py::TestClass::test_method -v` - Mock server is automatically started for tests, runs on port 4010 #### Linting and Formatting -- Format code: `uv run task format` or `./scripts/format` +- Format code: `uv run task format` * The repository is still in flux, so running format might accidentally change files that aren't part of your scope of changes. So always run `uv run task format` with additional arguments to constrain the formatting to the files that you are modifying. -- Lint code: `uv run task lint` or `./scripts/lint` +- Lint code: `uv run task lint` - Type check: `uv run task typecheck` (runs both pyright and mypy) ### Building and Running diff --git a/pyproject.toml b/pyproject.toml index 9ec64a3a..0cc6c50b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,11 +120,11 @@ lint = { cmd = "task check-ruff", help = "Run all linting checks" } post_lint = "task typecheck && task check-importable" # === SCRIPT DELEGATION (complex operations) === -bootstrap = { cmd = "./scripts/bootstrap", help = "Set up development environment" } test = { cmd = "./scripts/test", help = "Run tests with mock server" } mock = { cmd = "./scripts/mock", help = "Start mock API server" } # === DEVELOPMENT SETUP === +bootstrap = { cmd = "uv sync --all-extras --group dev", help = "Set up development environment" } setup-pre-commit = { cmd = "pre-commit install", help = "Install pre-commit hooks" } # === CI-SPECIFIC TASKS === diff --git a/scripts/bootstrap b/scripts/bootstrap deleted file mode 100755 index 049852e4..00000000 --- a/scripts/bootstrap +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -if ! command -v uv >/dev/null 2>&1 && [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ]; then - brew bundle check >/dev/null 2>&1 || { - echo "==> Installing Homebrew dependencies…" - brew bundle - } -fi - -echo "==> Installing Python dependencies…" - -uv sync --all-extras --group dev diff --git a/scripts/format b/scripts/format deleted file mode 100755 index 80777a85..00000000 --- a/scripts/format +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -echo "==> Running formatters" -uv run task format diff --git a/scripts/lint b/scripts/lint deleted file mode 100755 index ce3aa348..00000000 --- a/scripts/lint +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -echo "==> Running lints" -uv run task lint - -echo "==> Making sure it imports" -uv run python -c 'import agentex' From e48a4c345c15c116aa22243f742a7be94409ace8 Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Wed, 24 Sep 2025 16:51:57 +0100 Subject: [PATCH 07/11] Revamped contributing.md --- CONTRIBUTING.md | 92 ++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 36 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 04c64123..27bad2dc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,37 +1,39 @@ ## Setting up the environment -### With Rye +We use [UV](https://docs.astral.sh/uv/) for fast, modern Python package management. UV automatically handles Python installation and virtual environment management. -We use [Rye](https://rye.astral.sh/) to manage dependencies because it will automatically provision a Python environment with the expected Python version. To set it up, run: +### Quick Setup ```sh -$ ./scripts/bootstrap +# Setup environment and dependencies +$ uv run task bootstrap + +# Install pre-commit hooks +$ uv run task setup-pre-commit ``` -Or [install Rye manually](https://rye.astral.sh/guide/installation/) and run: +### Manual Setup + +If you prefer to install UV manually: ```sh -$ rye sync --all-features +# Install UV - https://docs.astral.sh/uv/getting-started/installation/ +$ curl -LsSf https://astral.sh/uv/install.sh | sh + +# Install dependencies +$ uv sync --all-extras --group dev ``` -You can then run scripts using `rye run python script.py` or by activating the virtual environment: +You can then run commands using `uv run` or by activating the virtual environment: ```sh -# Activate the virtual environment - https://docs.python.org/3/library/venv.html#how-venvs-work +# Activate the virtual environment $ source .venv/bin/activate -# now you can omit the `rye run` prefix +# Now you can omit the `uv run` prefix $ python script.py ``` -### Without Rye - -Alternatively if you don't want to install `Rye`, you can stick with the standard `pip` setup by ensuring you have the Python version specified in `.python-version`, create a virtual environment however you desire and then install dependencies using this command: - -```sh -$ pip install -r requirements-dev.lock -``` - ## Modifying/Adding code Most of the SDK is generated code. Modifications to code will be persisted between generations, but may @@ -45,7 +47,7 @@ All files in the `examples/` directory are not modified by the generator and can ```py # add an example to examples/.py -#!/usr/bin/env -S rye run python +#!/usr/bin/env -S uv run python … ``` @@ -72,9 +74,9 @@ Building this package will create two files in the `dist/` directory, a `.tar.gz To create a distributable version of the library, all you have to do is run this command: ```sh -$ rye build +$ uv build # or -$ python -m build +$ uv run task ci-build ``` Then to install: @@ -83,36 +85,50 @@ Then to install: $ pip install ./path-to-wheel-file.whl ``` -## Running tests +## Development Workflow -Most tests require you to [set up a mock server](https://github.com/stoplightio/prism) against the OpenAPI spec to run the tests. +We use [Taskipy](https://github.com/taskipy/taskipy) to manage development tasks. All commands are defined in `pyproject.toml` and can be run with `uv run task `. -```sh -# you will need npm installed -$ npx prism mock path/to/your/openapi.yml -``` +### Running tests ```sh -$ ./scripts/test -``` +# Run tests with automatic mock server management +$ uv run task test -## Linting and formatting +# Or run tests directly (no mock server setup) +$ uv run pytest +``` -This repository uses [ruff](https://github.com/astral-sh/ruff) and -[black](https://github.com/psf/black) to format the code in the repository. +The test command automatically handles [Prism mock server](https://github.com/stoplightio/prism) setup and teardown using the OpenAPI spec. -To lint: +### Linting and formatting ```sh -$ ./scripts/lint +# Format code and documentation +$ uv run task format + +# Run all linting checks +$ uv run task lint + +# Run type checking only +$ uv run task typecheck ``` -To format and fix all ruff issues automatically: +### Available Tasks ```sh -$ ./scripts/format +# See all available tasks +$ uv run task --list ``` +Key tasks: +- `bootstrap` - Set up development environment +- `format` - Format code with Ruff and documentation +- `lint` - Run all checks (Ruff + type checking + import validation) +- `test` - Run tests with mock server orchestration +- `mock` - Start standalone mock API server +- `setup-pre-commit` - Install pre-commit hooks + ## Publishing and releases Changes made to this repository via the automated release PR pipeline should publish to PyPI automatically. If @@ -124,8 +140,12 @@ You can release to package managers by using [the `Publish PyPI` GitHub action]( ### Publish manually -If you need to manually release a package, you can run the `bin/publish-pypi` script with a `PYPI_TOKEN` set on -the environment. +If you need to manually release a package, you can use UV directly: + +```sh +$ uv build +$ uv publish --token $PYPI_TOKEN +``` ## 🤖 **Vibe Coding Setup** From 19e0d77acc3a6d13ee4222ab351c26744c8e933f Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Wed, 24 Sep 2025 17:15:04 +0100 Subject: [PATCH 08/11] fix dev dependencies --- pyproject.toml | 39 ++++++++++++++++++--------------------- uv.lock | 20 ++++++++------------ 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0cc6c50b..7e48e980 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,14 +33,9 @@ dependencies = [ "mcp[cli]>=1.4.1", "scale-gp>=0.1.0a59", "openai-agents==0.2.7", # 0.2.3 bug - https://github.com/openai/openai-agents-python/issues/1276 + "cloudpickle>=3.1.1", "tzlocal>=5.3.1", "tzdata>=2025.2", - "pytest>=8.4.0", - "pytest-asyncio>=1.0.0", - "scale-gp-beta==0.1.0a20", - "ipykernel>=6.29.5", - "openai==1.99.9", # anything higher than 1.99.9 breaks litellm - https://github.com/BerriAI/litellm/issues/13711 - "cloudpickle>=3.1.1", ] requires-python = ">= 3.12,<4" classifiers = [ @@ -78,25 +73,28 @@ build-backend = "hatchling.build" [dependency-groups] dev = [ - "pyright==1.1.399", - "mypy", - "respx", - "pytest", - "pytest-asyncio", - "ruff", - "time-machine", - "nox", "dirty-equals>=0.6.0", - "importlib-metadata>=6.7.0", - "rich>=13.7.1", - "nest_asyncio==1.6.0", - "pytest-xdist>=3.6.1", "debugpy>=1.8.15", + "importlib-metadata>=6.7.0", "ipywidgets>=8.1.7", + "ipykernel>=6.29.5", + "mypy", "nbstripout>=0.8.1", - "yaspin>=3.1.0", - "taskipy>=1.12.0", + "nest_asyncio==1.6.0", + "nox", + "openai==1.99.9", # anything higher than 1.99.9 breaks litellm - https://github.com/BerriAI/litellm/issues/13711 "pre-commit>=3.5.0", + "pyright==1.1.399", + "pytest>=8.4.0", + "pytest-asyncio>=1.0.0", + "pytest-xdist>=3.6.1", + "respx", + "rich>=13.7.1", + "ruff", + "scale-gp-beta==0.1.0a20", + "taskipy>=1.12.0", + "time-machine", + "yaspin>=3.1.0", ] [tool.taskipy.tasks] @@ -124,7 +122,6 @@ test = { cmd = "./scripts/test", help = "Run tests with mock server" } mock = { cmd = "./scripts/mock", help = "Start mock API server" } # === DEVELOPMENT SETUP === -bootstrap = { cmd = "uv sync --all-extras --group dev", help = "Set up development environment" } setup-pre-commit = { cmd = "pre-commit install", help = "Install pre-commit hooks" } # === CI-SPECIFIC TASKS === diff --git a/uv.lock b/uv.lock index 8cfc09fb..87293e2e 100644 --- a/uv.lock +++ b/uv.lock @@ -13,25 +13,20 @@ dependencies = [ { name = "distro" }, { name = "fastapi" }, { name = "httpx" }, - { name = "ipykernel" }, { name = "jinja2" }, { name = "jsonref" }, { name = "jsonschema" }, { name = "kubernetes" }, { name = "litellm" }, { name = "mcp", extra = ["cli"] }, - { name = "openai" }, { name = "openai-agents" }, { name = "pydantic" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, { name = "python-on-whales" }, { name = "pyyaml" }, { name = "questionary" }, { name = "redis" }, { name = "rich" }, { name = "scale-gp" }, - { name = "scale-gp-beta" }, { name = "sniffio" }, { name = "temporalio" }, { name = "typer" }, @@ -56,11 +51,13 @@ dev = [ { name = "debugpy" }, { name = "dirty-equals" }, { name = "importlib-metadata" }, + { name = "ipykernel" }, { name = "ipywidgets" }, { name = "mypy" }, { name = "nbstripout" }, { name = "nest-asyncio" }, { name = "nox" }, + { name = "openai" }, { name = "pre-commit" }, { name = "pyright" }, { name = "pytest" }, @@ -69,6 +66,7 @@ dev = [ { name = "respx" }, { name = "rich" }, { name = "ruff" }, + { name = "scale-gp-beta" }, { name = "taskipy" }, { name = "time-machine" }, { name = "yaspin" }, @@ -84,18 +82,14 @@ requires-dist = [ { name = "fastapi", specifier = ">=0.115.0,<0.116" }, { name = "httpx", specifier = ">=0.27.2,<0.28" }, { name = "httpx-aiohttp", marker = "extra == 'aiohttp'", specifier = ">=0.1.8" }, - { name = "ipykernel", specifier = ">=6.29.5" }, { name = "jinja2", specifier = ">=3.1.3,<4" }, { name = "jsonref", specifier = ">=1.1.0,<2" }, { name = "jsonschema", specifier = ">=4.23.0,<5" }, { name = "kubernetes", specifier = ">=25.0.0,<29.0.0" }, { name = "litellm", specifier = ">=1.66.0,<2" }, { name = "mcp", extras = ["cli"], specifier = ">=1.4.1" }, - { name = "openai", specifier = "==1.99.9" }, { name = "openai-agents", specifier = "==0.2.7" }, { name = "pydantic", specifier = ">=2.0.0,<3" }, - { name = "pytest", specifier = ">=8.4.0" }, - { name = "pytest-asyncio", specifier = ">=1.0.0" }, { name = "python-on-whales", specifier = ">=0.73.0,<0.74" }, { name = "pyyaml", specifier = ">=6.0.2,<7" }, { name = "questionary", specifier = ">=2.0.1,<3" }, @@ -103,7 +97,6 @@ requires-dist = [ { name = "rich", specifier = ">=13.9.2,<14" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.3.4" }, { name = "scale-gp", specifier = ">=0.1.0a59" }, - { name = "scale-gp-beta", specifier = "==0.1.0a20" }, { name = "sniffio" }, { name = "temporalio", specifier = ">=1.10.0,<2" }, { name = "typer", specifier = ">=0.16,<0.17" }, @@ -120,19 +113,22 @@ dev = [ { name = "debugpy", specifier = ">=1.8.15" }, { name = "dirty-equals", specifier = ">=0.6.0" }, { name = "importlib-metadata", specifier = ">=6.7.0" }, + { name = "ipykernel", specifier = ">=6.29.5" }, { name = "ipywidgets", specifier = ">=8.1.7" }, { name = "mypy" }, { name = "nbstripout", specifier = ">=0.8.1" }, { name = "nest-asyncio", specifier = "==1.6.0" }, { name = "nox" }, + { name = "openai", specifier = "==1.99.9" }, { name = "pre-commit", specifier = ">=3.5.0" }, { name = "pyright", specifier = "==1.1.399" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, + { name = "pytest", specifier = ">=8.4.0" }, + { name = "pytest-asyncio", specifier = ">=1.0.0" }, { name = "pytest-xdist", specifier = ">=3.6.1" }, { name = "respx" }, { name = "rich", specifier = ">=13.7.1" }, { name = "ruff" }, + { name = "scale-gp-beta", specifier = "==0.1.0a20" }, { name = "taskipy", specifier = ">=1.12.0" }, { name = "time-machine" }, { name = "yaspin", specifier = ">=3.1.0" }, From ccae40e98ed43e0ce2cfcfe4d63d4b7a0c2bb64e Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Wed, 24 Sep 2025 17:15:17 +0100 Subject: [PATCH 09/11] get rid of chicken and egg bootstrap --- .github/workflows/ci.yml | 2 +- CLAUDE.md | 3 +-- CONTRIBUTING.md | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d781b4b..db2a1ee9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,5 +62,5 @@ jobs: - uses: actions/checkout@v4 - uses: astral-sh/setup-uv@v6 - - run: uv run task bootstrap + - run: uv sync --all-extras --group dev - run: uv run task ci-test diff --git a/CLAUDE.md b/CLAUDE.md index 2806e5a7..8989e1a5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,8 +6,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ### Package Management - Use `uv` for dependency management -- Run `uv run task bootstrap` to set up the environment -- Or use `uv sync --all-extras --group dev` directly +- Run `uv sync --all-extras --group dev` to set up the environment - Run `uv run task setup-pre-commit` to install pre-commit hooks Both the main repo and individual tutorials use `uv` for consistency. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 27bad2dc..244b6b42 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ We use [UV](https://docs.astral.sh/uv/) for fast, modern Python package manageme ```sh # Setup environment and dependencies -$ uv run task bootstrap +$ uv sync --all-extras --group dev # Install pre-commit hooks $ uv run task setup-pre-commit @@ -122,7 +122,6 @@ $ uv run task --list ``` Key tasks: -- `bootstrap` - Set up development environment - `format` - Format code with Ruff and documentation - `lint` - Run all checks (Ruff + type checking + import validation) - `test` - Run tests with mock server orchestration From 5b3363c55b593ed760785082c5677a1aaf65a5dd Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Thu, 25 Sep 2025 16:06:50 +0100 Subject: [PATCH 10/11] Replace setup-uv with internal gh workflow --- .github/actions/setup-uv/action.yml | 34 +++++++++++++++++++++++++++++ .github/workflows/ci.yml | 6 ++--- .github/workflows/publish-pypi.yml | 2 +- 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 .github/actions/setup-uv/action.yml diff --git a/.github/actions/setup-uv/action.yml b/.github/actions/setup-uv/action.yml new file mode 100644 index 00000000..32af104b --- /dev/null +++ b/.github/actions/setup-uv/action.yml @@ -0,0 +1,34 @@ +name: 'Setup UV (Manual)' +description: 'Manually install UV package manager' +inputs: + uv-version: + description: 'UV version to install' + required: false + default: 'latest' + python-version: + description: 'Python version to use' + required: false + default: '3.12' + +runs: + using: 'composite' + steps: + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ inputs.python-version }} + + - name: Install UV + shell: bash + run: | + if [ "${{ inputs.uv-version }}" = "latest" ]; then + curl -LsSf https://astral.sh/uv/install.sh | sh + else + curl -LsSf https://astral.sh/uv/${{ inputs.uv-version }}/install.sh | sh + fi + echo "$HOME/.local/bin" >> $GITHUB_PATH + + - name: Verify UV installation + shell: bash + run: | + uv --version \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db2a1ee9..2463f079 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: ./.github/actions/setup-uv - run: uv sync --all-extras --group dev - run: uv run task ci-lint @@ -34,7 +34,7 @@ jobs: runs-on: ${{ github.repository == 'stainless-sdks/agentex-sdk-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} steps: - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: ./.github/actions/setup-uv - run: uv sync --all-extras --group dev - run: uv run task ci-build @@ -61,6 +61,6 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: ./.github/actions/setup-uv - run: uv sync --all-extras --group dev - run: uv run task ci-test diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index 2c240497..7e36c8d6 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -13,6 +13,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: ./.github/actions/setup-uv - run: uv build - run: uv publish --token ${{ secrets.AGENTEX_PYPI_TOKEN || secrets.PYPI_TOKEN }} From bb2314b3cdefe40b75e5e4d628b11234b0ce6e49 Mon Sep 17 00:00:00 2001 From: Prassanna Ravishankar Date: Thu, 2 Oct 2025 17:33:31 +0100 Subject: [PATCH 11/11] remove accidental mypy addition --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7046499d..3ae6e6f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -119,7 +119,6 @@ format = { cmd = "task format-ruff", help = "Format code with ruff and docs" } post_format = "task format-docs" typecheck = { cmd = "task check-types-pyright", help = "Run type checking" } -post_typecheck = "task check-types-mypy" lint = { cmd = "task check-ruff", help = "Run all linting checks" } post_lint = "task typecheck && task check-importable"