diff --git a/.github/workflows/mypy.yml b/.github/workflows/ty.yml similarity index 74% rename from .github/workflows/mypy.yml rename to .github/workflows/ty.yml index 1cbab882e..f2b114908 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/ty.yml @@ -1,4 +1,4 @@ -name: Mypy Checks +name: Ty Checks on: pull_request: @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true jobs: - mypy: + ty: runs-on: ubuntu-latest timeout-minutes: 20 @@ -32,23 +32,20 @@ jobs: run: | python_files=() for file in ${{ steps.changed-files.outputs.all_changed_files }}; do - if [[ $file == *.py ]]; then + if [[ $file == src/graph_sitter/*.py || $file == src/codemods/*.py || $file == src/gsbuild/*.py ]]; then python_files+=("${file}") fi done echo "python_files=${python_files[*]}" >> $GITHUB_ENV - - name: Add MyPy annotator - uses: pr-annotators/mypy-pr-annotator@v1.0.0 - - name: Skip rust rewrite baseline type debt if: ${{ env.python_files != '' && github.event.pull_request.head.ref == 'rust-rewrite' }} run: | - echo "Skipping PR-wide mypy for the rust-rewrite baseline merge." + echo "Skipping PR-wide ty for the rust-rewrite baseline merge." echo "Known type debt is documented in rust-rewrite/agent-handoff.md." - - name: Run mypy + - name: Run ty if: ${{ env.python_files != '' && github.event.pull_request.head.ref != 'rust-rewrite' }} run: | - echo "Running mypy on changed files: ${{ env.python_files }}" - uv run mypy --no-pretty --show-absolute-path ${{ env.python_files }} + echo "Running ty on changed files: ${{ env.python_files }}" + uv run ty check --output-format=github ${{ env.python_files }} diff --git a/mypy.ini b/mypy.ini deleted file mode 100644 index d186be42f..000000000 --- a/mypy.ini +++ /dev/null @@ -1,51 +0,0 @@ -[mypy] -# renovate: datasource=python-version depName=python -python_version = 3.12 - -# Report missing imports. -ignore_missing_imports = True - -# Follow imports and report import errors -follow_imports = normal - -# Allow variables to be typed as 'Any' implicitly -# These should all be removed once Codegen fixes these errors -disallow_any_unimported = False -disallow_any_expr = False -disallow_any_decorated = False -disallow_any_generics = False -disallow_any_explicit = False - -# Disallow calling functions without type annotations -disallow_untyped_calls = False -# Temporarily disabled until Codegen can be used to fix these errors - -# Check the bodies of untyped function definitions -check_untyped_defs = False -# Temporarily disabled until Codegen can be used to fix these errors - -# Strictly enforce distinction between None and non-None types -# Temporarily disabled until Codegen can be used to fix these errors - -# Show error codes in error messages -show_error_codes = True -show_error_context = True -warn_unused_ignores = True -# Pretty = false for mypy to work in pycharm -pretty = False -# Excluded Directories -exclude = (?x)( - .idea/.* - | .mypy_cache/.* - | .pytest_cache/.* - | .ruff_cache/.* - | .vscode/.* - | .*/codegen_tests/.* - | .*/tests/.* - | venv/.* - | scripts/.* - | .*/codemods/.*/test_.*/ - | ^/expected/ - | tests/unit/skills/snapshots/* - ) -plugins = pydantic.mypy diff --git a/pyproject.toml b/pyproject.toml index 2ccd587b4..8ad998bde 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -130,7 +130,6 @@ dev-dependencies = [ "pytest>=8.3.3", "pytest-cov>=6.3.0,<6.3.1", "ruff>=0.6.8", - "mypy[mypyc,faster-cache]>=1.13.0", "pre-commit>=4.0.1", "pytest-xdist>=3.6.1,<4.0.0", "pytest-mock<4.0.0,>=3.14.0", @@ -162,6 +161,7 @@ dev-dependencies = [ "pytest-lsp>=1.0.0b1", "cython>=3.0.11", "pytest-split>=0.10.0", + "ty>=0.0.51", ] [tool.uv.workspace] @@ -202,6 +202,23 @@ show_contexts = true [tool.pyright] pythonVersion = "3.12" enableExperimentalFeatures = true + +[tool.ty.environment] +python-version = "3.12" + +[tool.ty.src] +include = ["src/graph_sitter", "src/codemods", "src/gsbuild"] +exclude = [ + ".idea/**", + ".vscode/**", + "**/codegen_tests/**", + "tests/**", + "scripts/**", + "**/codemods/**/test_*/**", + "expected/**", + "tests/unit/skills/snapshots/**", +] + [tool.pytest.ini_options] # addopts = -v pythonpath = "." diff --git a/rust-rewrite/agent-handoff.md b/rust-rewrite/agent-handoff.md index 63ded8c76..167448689 100644 --- a/rust-rewrite/agent-handoff.md +++ b/rust-rewrite/agent-handoff.md @@ -58,7 +58,7 @@ Hosted checks on the current branch are the stronger merge signal for large-repo - Complete mutable expression object parity. - Promise-chain async conversion parity. - Rust backend readiness as a default backend for production without explicit rollout gates. -- Clean branch-wide mypy. The rust-rewrite baseline PR intentionally skips PR-wide mypy because the branch changes a large Python surface with known type debt; future focused PRs should restore normal mypy expectations for the files they touch. +- Clean branch-wide ty. The rust-rewrite baseline PR intentionally skips PR-wide ty because the branch changes a large Python surface with known type debt; future focused PRs should restore normal ty expectations for the files they touch. ## High-Value Fanout Lanes diff --git a/rust-rewrite/future-agent-brief.md b/rust-rewrite/future-agent-brief.md index 21207fc5a..f1082b363 100644 --- a/rust-rewrite/future-agent-brief.md +++ b/rust-rewrite/future-agent-brief.md @@ -10,7 +10,7 @@ This branch is intended to become the new development baseline, not the final Ru - Public API stance: keep the Python shell for users and codemods. - Backend stance: Rust compact mode is opt-in and covers the supported subset documented in `supported-subset.json`. - Python backend stance: keep it after this merge. Delete it only after the deletion gates below pass. -- CI stance: fast Rust checks, extension builds, wheel smokes, docs/site checks, and large-repo opt-in checks are the meaningful signal for this baseline. Branch-wide mypy is intentionally skipped for the baseline PR because the branch carries known type debt across a large changed Python surface. The legacy GitHub fixture-push integration tests are also skipped only for the `rust-rewrite` baseline PR because they push branches to an external fixture repo and require a writable PAT; restore or replace that lane after merge. Current `pull_request_target` runs get this through test-level `GITHUB_HEAD_REF == "rust-rewrite"` skips because workflow edits in this PR are not used until they land on `develop`. General release wheels still build `macos-13` on tags/workflow calls, but PRs skip that queue-heavy duplicate and rely on `macos-latest` for macOS smoke. +- CI stance: fast Rust checks, extension builds, wheel smokes, docs/site checks, and large-repo opt-in checks are the meaningful signal for this baseline. Branch-wide ty is intentionally skipped for the baseline PR because the branch carries known type debt across a large changed Python surface. The legacy GitHub fixture-push integration tests are also skipped only for the `rust-rewrite` baseline PR because they push branches to an external fixture repo and require a writable PAT; restore or replace that lane after merge. Current `pull_request_target` runs get this through test-level `GITHUB_HEAD_REF == "rust-rewrite"` skips because workflow edits in this PR are not used until they land on `develop`. General release wheels still build `macos-13` on tags/workflow calls, but PRs skip that queue-heavy duplicate and rely on `macos-latest` for macOS smoke. ## What Future Agents Should Trust @@ -27,7 +27,7 @@ This branch is intended to become the new development baseline, not the final Ru - Full TypeScript type-system, namespace, JSX prop, and mutable expression-object parity. - Python backend deletion readiness. - Published-package `uvx graph-sitter ...` claims until a real released artifact is validated. -- Branch-wide mypy cleanliness. +- Branch-wide ty cleanliness. - Legacy GitHub push integration coverage on the baseline PR; the Rust merge signal comes from unit, fast, extension, wheel, docs/site, and large-repo proof lanes. ## Python Backend Deletion Gates @@ -40,7 +40,7 @@ The Python backend can be removed only after these are complete: - [ ] Add full graph-wide parity harnesses for pinned Airflow and Next.js. Evidence: file, import, export, reference, dependency, external-reference, subclass, and deterministic ordering comparisons. - [ ] Expand codemod parity beyond smoke flows. Evidence: real codemods on pinned large repos assert exact file-byte diffs, changed-file sets, wall time, and RSS. - [ ] Replace or remove Python-only graph internals. Evidence: no required public path depends on `rustworkx.PyDiGraph`, eager `SourceFile._nodes`, persistent `tree_sitter.Node` wrappers, or Python object graph traversal. -- [ ] Restore normal mypy and external integration expectations. Evidence: remove the `rust-rewrite` PR skip in `.github/workflows/mypy.yml`, remove the baseline-only `integration-tests` skip in `.github/workflows/test.yml`, or replace the fixture-push tests with hermetic/local equivalents. +- [ ] Restore normal ty and external integration expectations. Evidence: remove the `rust-rewrite` PR skip in `.github/workflows/ty.yml`, remove the baseline-only `integration-tests` skip in `.github/workflows/test.yml`, or replace the fixture-push tests with hermetic/local equivalents. - [ ] Validate released `uvx graph-sitter ...` package behavior. Evidence: `uvx graph-sitter doctor`, `parse`, `run`, and `transform` work from a clean environment with a published version. ## Highest-Value Fanout Work diff --git a/src/graph_sitter/compiled/resolution.pyi b/src/graph_sitter/compiled/resolution.pyi index a80a02c3e..02d312eca 100644 --- a/src/graph_sitter/compiled/resolution.pyi +++ b/src/graph_sitter/compiled/resolution.pyi @@ -1,18 +1,18 @@ from dataclasses import dataclass, field from functools import cached_property as cached_property -from typing import Generic from typing_extensions import TypeVar from graph_sitter.codebase.codebase_context import CodebaseContext -from graph_sitter.core.dataclasses.usage import UsageKind, UsageType +from graph_sitter.core.dataclasses.usage import UsageKind as UsageKind +from graph_sitter.core.dataclasses.usage import UsageType from graph_sitter.core.interfaces.editable import Editable from graph_sitter.core.interfaces.has_name import HasName NodeType = TypeVar("NodeType") @dataclass -class ResolutionStack(Generic[NodeType]): +class ResolutionStack[NodeType]: """Represents the resolution stack from a symbol to a usage Symbol diff --git a/src/graph_sitter/compiled/sort.pyi b/src/graph_sitter/compiled/sort.pyi new file mode 100644 index 000000000..21daac479 --- /dev/null +++ b/src/graph_sitter/compiled/sort.pyi @@ -0,0 +1,19 @@ +from collections.abc import Iterable + +from tree_sitter import Node as TSNode +from typing_extensions import TypeVar + +from graph_sitter.core.interfaces.editable import Editable + +E = TypeVar("E", bound=Editable) + +def sort_editables( + nodes: Iterable[E | None] | Iterable[E], + *, + reverse: bool = False, + dedupe: bool = True, + alphabetical: bool = False, + by_file: bool = False, + by_id: bool = False, +) -> list[E]: ... +def sort_nodes(nodes: Iterable[TSNode | None] | Iterable[TSNode], *, reverse: bool = False, dedupe: bool = True) -> list[TSNode]: ... diff --git a/src/graph_sitter/compiled/utils.pyi b/src/graph_sitter/compiled/utils.pyi index c75f0ce03..696826f76 100644 --- a/src/graph_sitter/compiled/utils.pyi +++ b/src/graph_sitter/compiled/utils.pyi @@ -4,6 +4,8 @@ from functools import lru_cache as functools_lru_cache from tree_sitter import Node as TSNode +TSNode = TSNode + def get_all_identifiers(node: TSNode) -> list[TSNode]: """Get all the identifiers in a tree-sitter node. Recursive implementation""" diff --git a/src/graph_sitter/core/autocommit/decorators.py b/src/graph_sitter/core/autocommit/decorators.py index c696b5e7c..d449f7f95 100644 --- a/src/graph_sitter/core/autocommit/decorators.py +++ b/src/graph_sitter/core/autocommit/decorators.py @@ -1,7 +1,7 @@ from graph_sitter.shared.logging.get_logger import get_logger import functools from collections.abc import Callable -from typing import TYPE_CHECKING, ParamSpec, TypeVar, Union, overload +from typing import TYPE_CHECKING, Any, ParamSpec, TypeVar, Union, cast, overload import wrapt @@ -39,10 +39,18 @@ def writer( commit: Whether to commit if there is an update. Do not set this to False unless you are absolutely sure the method can be retried with commit as True safely. """ if wrapped is None: - return functools.partial(writer, commit=commit) + return cast( + Callable[[Callable[P, T]], Callable[P, T]], + functools.partial(writer, commit=commit), + ) @wrapt.decorator(enabled=enabled) - def wrapper(wrapped: Callable[P, T], instance: "Editable", args, kwargs) -> T: + def wrapper( + wrapped: Callable[P, T], + instance: Any, + args: tuple[Any, ...], + kwargs: dict[str, Any], + ) -> T: if instance is None: instance = args[0] if instance.removed: @@ -57,35 +65,39 @@ def wrapper(wrapped: Callable[P, T], instance: "Editable", args, kwargs) -> T: @wrapt.decorator(enabled=enabled) def remover( - wrapped: Callable[P, T], + wrapped: Callable[..., T], instance: Union["Symbol", None] = None, - args: P.args = None, - kwargs: P.kwargs = None, -) -> Callable[P, T]: + args: tuple[Any, ...] = (), + kwargs: dict[str, Any] | None = None, +) -> T: """Indicates the node will be removed at the end of this method. Further usage of the node will result in undefined behaviour and a warning. """ if instance is None: - instance = args[0] + instance = cast("Symbol", args[0]) + if kwargs is None: + kwargs = {} logger.debug("Removing node %r, %r", instance, wrapped) with instance.ctx._autocommit.write_state(instance): ret = wrapped(*args, **kwargs) # instance.ctx._autocommit.set_pending(instance, REMOVED) - instance.removed = True + cast(Any, instance).removed = True return ret @wrapt.decorator(enabled=enabled) def repr_func( - wrapped: Callable[P, T], + wrapped: Callable[..., T], instance: Union["Editable", None] = None, - args: P.args = None, - kwargs: P.kwargs = None, -) -> Callable[P, T]: + args: tuple[Any, ...] = (), + kwargs: dict[str, Any] | None = None, +) -> T: """Indicates the method is use in debugging/logs.""" if instance is None: - instance = args[0] + instance = cast("Editable", args[0]) + if kwargs is None: + kwargs = {} autocommit = instance.ctx._autocommit old_state = autocommit.enter_state(AutoCommitState.Special) try: @@ -97,19 +109,21 @@ def repr_func( @wrapt.decorator(enabled=enabled) def mover( - wrapped: Callable[P, tuple[NodeId, NodeId]], + wrapped: Callable[..., tuple[NodeId, NodeId]], instance: Union["Symbol", None] = None, - args: P.args = None, - kwargs: P.kwargs = None, -) -> Callable[P, None]: + args: tuple[Any, ...] = (), + kwargs: dict[str, Any] | None = None, +) -> None: """Indicates the Node will be moved by the end of this method. It should also return the node_id of itself and the new file """ if instance is None: - instance = args[0] + instance = cast("Symbol", args[0]) + if kwargs is None: + kwargs = {} with instance.ctx._autocommit.write_state(instance, move=True): file_node_id, node_id = wrapped(*args, **kwargs) instance.ctx._autocommit.set_pending(instance, node_id, file_node_id) - instance.removed = False + cast(Any, instance).removed = False return None diff --git a/uv.lock b/uv.lock index 2d9ef8743..f06f9ff3d 100644 --- a/uv.lock +++ b/uv.lock @@ -1236,7 +1236,6 @@ dev = [ { name = "jupyterlab" }, { name = "loguru" }, { name = "modal" }, - { name = "mypy", extra = ["faster-cache", "mypyc"] }, { name = "pre-commit" }, { name = "pre-commit-uv" }, { name = "pytest" }, @@ -1251,6 +1250,7 @@ dev = [ { name = "ruff" }, { name = "ruff-lsp" }, { name = "sybil", extra = ["pytest"] }, + { name = "ty" }, { name = "typer" }, { name = "uv" }, ] @@ -1352,7 +1352,6 @@ dev = [ { name = "jupyterlab", specifier = ">=4.3.5" }, { name = "loguru", specifier = ">=0.7.3" }, { name = "modal", specifier = ">=0.73.25" }, - { name = "mypy", extras = ["mypyc", "faster-cache"], specifier = ">=1.13.0" }, { name = "pre-commit", specifier = ">=4.0.1" }, { name = "pre-commit-uv", specifier = ">=4.1.4" }, { name = "pytest", specifier = ">=8.3.3" }, @@ -1367,6 +1366,7 @@ dev = [ { name = "ruff", specifier = ">=0.6.8" }, { name = "ruff-lsp", specifier = ">=0.0.55,<1.0.0" }, { name = "sybil", extras = ["pytest"], specifier = ">=9.0.0" }, + { name = "ty", specifier = ">=0.0.51" }, { name = "typer", specifier = ">=0.12.5" }, { name = "uv", specifier = ">=0.4.25" }, ] @@ -2319,39 +2319,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/d9/f7f9379981e39b8c2511c9e0326d212accacb82f12fbfdc1aa2ce2a7b2b6/multiprocess-0.70.16-py39-none-any.whl", hash = "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", size = 133351, upload-time = "2024-01-28T18:52:31.981Z" }, ] -[[package]] -name = "mypy" -version = "1.15.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mypy-extensions" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717, upload-time = "2025-02-05T03:50:34.655Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981, upload-time = "2025-02-05T03:50:28.25Z" }, - { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175, upload-time = "2025-02-05T03:50:13.411Z" }, - { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675, upload-time = "2025-02-05T03:50:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020, upload-time = "2025-02-05T03:48:48.705Z" }, - { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582, upload-time = "2025-02-05T03:49:03.628Z" }, - { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614, upload-time = "2025-02-05T03:50:00.313Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592, upload-time = "2025-02-05T03:48:55.789Z" }, - { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611, upload-time = "2025-02-05T03:48:44.581Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443, upload-time = "2025-02-05T03:49:25.514Z" }, - { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541, upload-time = "2025-02-05T03:49:57.623Z" }, - { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348, upload-time = "2025-02-05T03:48:52.361Z" }, - { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648, upload-time = "2025-02-05T03:49:11.395Z" }, - { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777, upload-time = "2025-02-05T03:50:08.348Z" }, -] - -[package.optional-dependencies] -faster-cache = [ - { name = "orjson" }, -] -mypyc = [ - { name = "setuptools" }, -] - [[package]] name = "mypy-extensions" version = "1.1.0" @@ -2533,44 +2500,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/2a/7dd3d207ec669cacc1f186fd856a0f61dbc255d24f6fdc1a6715d6051b0f/openai-1.109.1-py3-none-any.whl", hash = "sha256:6bcaf57086cf59159b8e27447e4e7dd019db5d29a438072fbd49c290c7e65315", size = 948627, upload-time = "2025-09-24T13:00:50.754Z" }, ] -[[package]] -name = "orjson" -version = "3.10.18" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/0b/fea456a3ffe74e70ba30e01ec183a9b26bec4d497f61dcfce1b601059c60/orjson-3.10.18.tar.gz", hash = "sha256:e8da3947d92123eda795b68228cafe2724815621fe35e8e320a9e9593a4bcd53", size = 5422810, upload-time = "2025-04-29T23:30:08.423Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/21/1a/67236da0916c1a192d5f4ccbe10ec495367a726996ceb7614eaa687112f2/orjson-3.10.18-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:50c15557afb7f6d63bc6d6348e0337a880a04eaa9cd7c9d569bcb4e760a24753", size = 249184, upload-time = "2025-04-29T23:28:53.612Z" }, - { url = "https://files.pythonhosted.org/packages/b3/bc/c7f1db3b1d094dc0c6c83ed16b161a16c214aaa77f311118a93f647b32dc/orjson-3.10.18-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:356b076f1662c9813d5fa56db7d63ccceef4c271b1fb3dd522aca291375fcf17", size = 133279, upload-time = "2025-04-29T23:28:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/af/84/664657cd14cc11f0d81e80e64766c7ba5c9b7fc1ec304117878cc1b4659c/orjson-3.10.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:559eb40a70a7494cd5beab2d73657262a74a2c59aff2068fdba8f0424ec5b39d", size = 136799, upload-time = "2025-04-29T23:28:56.828Z" }, - { url = "https://files.pythonhosted.org/packages/9a/bb/f50039c5bb05a7ab024ed43ba25d0319e8722a0ac3babb0807e543349978/orjson-3.10.18-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3c29eb9a81e2fbc6fd7ddcfba3e101ba92eaff455b8d602bf7511088bbc0eae", size = 132791, upload-time = "2025-04-29T23:28:58.751Z" }, - { url = "https://files.pythonhosted.org/packages/93/8c/ee74709fc072c3ee219784173ddfe46f699598a1723d9d49cbc78d66df65/orjson-3.10.18-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6612787e5b0756a171c7d81ba245ef63a3533a637c335aa7fcb8e665f4a0966f", size = 137059, upload-time = "2025-04-29T23:29:00.129Z" }, - { url = "https://files.pythonhosted.org/packages/6a/37/e6d3109ee004296c80426b5a62b47bcadd96a3deab7443e56507823588c5/orjson-3.10.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ac6bd7be0dcab5b702c9d43d25e70eb456dfd2e119d512447468f6405b4a69c", size = 138359, upload-time = "2025-04-29T23:29:01.704Z" }, - { url = "https://files.pythonhosted.org/packages/4f/5d/387dafae0e4691857c62bd02839a3bf3fa648eebd26185adfac58d09f207/orjson-3.10.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9f72f100cee8dde70100406d5c1abba515a7df926d4ed81e20a9730c062fe9ad", size = 142853, upload-time = "2025-04-29T23:29:03.576Z" }, - { url = "https://files.pythonhosted.org/packages/27/6f/875e8e282105350b9a5341c0222a13419758545ae32ad6e0fcf5f64d76aa/orjson-3.10.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca85398d6d093dd41dc0983cbf54ab8e6afd1c547b6b8a311643917fbf4e0c", size = 133131, upload-time = "2025-04-29T23:29:05.753Z" }, - { url = "https://files.pythonhosted.org/packages/48/b2/73a1f0b4790dcb1e5a45f058f4f5dcadc8a85d90137b50d6bbc6afd0ae50/orjson-3.10.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22748de2a07fcc8781a70edb887abf801bb6142e6236123ff93d12d92db3d406", size = 134834, upload-time = "2025-04-29T23:29:07.35Z" }, - { url = "https://files.pythonhosted.org/packages/56/f5/7ed133a5525add9c14dbdf17d011dd82206ca6840811d32ac52a35935d19/orjson-3.10.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3a83c9954a4107b9acd10291b7f12a6b29e35e8d43a414799906ea10e75438e6", size = 413368, upload-time = "2025-04-29T23:29:09.301Z" }, - { url = "https://files.pythonhosted.org/packages/11/7c/439654221ed9c3324bbac7bdf94cf06a971206b7b62327f11a52544e4982/orjson-3.10.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:303565c67a6c7b1f194c94632a4a39918e067bd6176a48bec697393865ce4f06", size = 153359, upload-time = "2025-04-29T23:29:10.813Z" }, - { url = "https://files.pythonhosted.org/packages/48/e7/d58074fa0cc9dd29a8fa2a6c8d5deebdfd82c6cfef72b0e4277c4017563a/orjson-3.10.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:86314fdb5053a2f5a5d881f03fca0219bfdf832912aa88d18676a5175c6916b5", size = 137466, upload-time = "2025-04-29T23:29:12.26Z" }, - { url = "https://files.pythonhosted.org/packages/57/4d/fe17581cf81fb70dfcef44e966aa4003360e4194d15a3f38cbffe873333a/orjson-3.10.18-cp312-cp312-win32.whl", hash = "sha256:187ec33bbec58c76dbd4066340067d9ece6e10067bb0cc074a21ae3300caa84e", size = 142683, upload-time = "2025-04-29T23:29:13.865Z" }, - { url = "https://files.pythonhosted.org/packages/e6/22/469f62d25ab5f0f3aee256ea732e72dc3aab6d73bac777bd6277955bceef/orjson-3.10.18-cp312-cp312-win_amd64.whl", hash = "sha256:f9f94cf6d3f9cd720d641f8399e390e7411487e493962213390d1ae45c7814fc", size = 134754, upload-time = "2025-04-29T23:29:15.338Z" }, - { url = "https://files.pythonhosted.org/packages/10/b0/1040c447fac5b91bc1e9c004b69ee50abb0c1ffd0d24406e1350c58a7fcb/orjson-3.10.18-cp312-cp312-win_arm64.whl", hash = "sha256:3d600be83fe4514944500fa8c2a0a77099025ec6482e8087d7659e891f23058a", size = 131218, upload-time = "2025-04-29T23:29:17.324Z" }, - { url = "https://files.pythonhosted.org/packages/04/f0/8aedb6574b68096f3be8f74c0b56d36fd94bcf47e6c7ed47a7bd1474aaa8/orjson-3.10.18-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:69c34b9441b863175cc6a01f2935de994025e773f814412030f269da4f7be147", size = 249087, upload-time = "2025-04-29T23:29:19.083Z" }, - { url = "https://files.pythonhosted.org/packages/bc/f7/7118f965541aeac6844fcb18d6988e111ac0d349c9b80cda53583e758908/orjson-3.10.18-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1ebeda919725f9dbdb269f59bc94f861afbe2a27dce5608cdba2d92772364d1c", size = 133273, upload-time = "2025-04-29T23:29:20.602Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d9/839637cc06eaf528dd8127b36004247bf56e064501f68df9ee6fd56a88ee/orjson-3.10.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5adf5f4eed520a4959d29ea80192fa626ab9a20b2ea13f8f6dc58644f6927103", size = 136779, upload-time = "2025-04-29T23:29:22.062Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6d/f226ecfef31a1f0e7d6bf9a31a0bbaf384c7cbe3fce49cc9c2acc51f902a/orjson-3.10.18-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7592bb48a214e18cd670974f289520f12b7aed1fa0b2e2616b8ed9e069e08595", size = 132811, upload-time = "2025-04-29T23:29:23.602Z" }, - { url = "https://files.pythonhosted.org/packages/73/2d/371513d04143c85b681cf8f3bce743656eb5b640cb1f461dad750ac4b4d4/orjson-3.10.18-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f872bef9f042734110642b7a11937440797ace8c87527de25e0c53558b579ccc", size = 137018, upload-time = "2025-04-29T23:29:25.094Z" }, - { url = "https://files.pythonhosted.org/packages/69/cb/a4d37a30507b7a59bdc484e4a3253c8141bf756d4e13fcc1da760a0b00cb/orjson-3.10.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0315317601149c244cb3ecef246ef5861a64824ccbcb8018d32c66a60a84ffbc", size = 138368, upload-time = "2025-04-29T23:29:26.609Z" }, - { url = "https://files.pythonhosted.org/packages/1e/ae/cd10883c48d912d216d541eb3db8b2433415fde67f620afe6f311f5cd2ca/orjson-3.10.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0da26957e77e9e55a6c2ce2e7182a36a6f6b180ab7189315cb0995ec362e049", size = 142840, upload-time = "2025-04-29T23:29:28.153Z" }, - { url = "https://files.pythonhosted.org/packages/6d/4c/2bda09855c6b5f2c055034c9eda1529967b042ff8d81a05005115c4e6772/orjson-3.10.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb70d489bc79b7519e5803e2cc4c72343c9dc1154258adf2f8925d0b60da7c58", size = 133135, upload-time = "2025-04-29T23:29:29.726Z" }, - { url = "https://files.pythonhosted.org/packages/13/4a/35971fd809a8896731930a80dfff0b8ff48eeb5d8b57bb4d0d525160017f/orjson-3.10.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9e86a6af31b92299b00736c89caf63816f70a4001e750bda179e15564d7a034", size = 134810, upload-time = "2025-04-29T23:29:31.269Z" }, - { url = "https://files.pythonhosted.org/packages/99/70/0fa9e6310cda98365629182486ff37a1c6578e34c33992df271a476ea1cd/orjson-3.10.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c382a5c0b5931a5fc5405053d36c1ce3fd561694738626c77ae0b1dfc0242ca1", size = 413491, upload-time = "2025-04-29T23:29:33.315Z" }, - { url = "https://files.pythonhosted.org/packages/32/cb/990a0e88498babddb74fb97855ae4fbd22a82960e9b06eab5775cac435da/orjson-3.10.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8e4b2ae732431127171b875cb2668f883e1234711d3c147ffd69fe5be51a8012", size = 153277, upload-time = "2025-04-29T23:29:34.946Z" }, - { url = "https://files.pythonhosted.org/packages/92/44/473248c3305bf782a384ed50dd8bc2d3cde1543d107138fd99b707480ca1/orjson-3.10.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d808e34ddb24fc29a4d4041dcfafbae13e129c93509b847b14432717d94b44f", size = 137367, upload-time = "2025-04-29T23:29:36.52Z" }, - { url = "https://files.pythonhosted.org/packages/ad/fd/7f1d3edd4ffcd944a6a40e9f88af2197b619c931ac4d3cfba4798d4d3815/orjson-3.10.18-cp313-cp313-win32.whl", hash = "sha256:ad8eacbb5d904d5591f27dee4031e2c1db43d559edb8f91778efd642d70e6bea", size = 142687, upload-time = "2025-04-29T23:29:38.292Z" }, - { url = "https://files.pythonhosted.org/packages/4b/03/c75c6ad46be41c16f4cfe0352a2d1450546f3c09ad2c9d341110cd87b025/orjson-3.10.18-cp313-cp313-win_amd64.whl", hash = "sha256:aed411bcb68bf62e85588f2a7e03a6082cc42e5a2796e06e72a962d7c6310b52", size = 134794, upload-time = "2025-04-29T23:29:40.349Z" }, - { url = "https://files.pythonhosted.org/packages/c2/28/f53038a5a72cc4fd0b56c1eafb4ef64aec9685460d5ac34de98ca78b6e29/orjson-3.10.18-cp313-cp313-win_arm64.whl", hash = "sha256:f54c1385a0e6aba2f15a40d703b858bedad36ded0491e55d35d905b2c34a4cc3", size = 131186, upload-time = "2025-04-29T23:29:41.922Z" }, -] - [[package]] name = "overrides" version = "7.7.0" @@ -4244,6 +4173,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/92/ef/c6deb083748be3bcad6f471b6ae983950c161890bf5ae1b2af80cc56c530/trove_classifiers-2025.5.9.12-py3-none-any.whl", hash = "sha256:e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce", size = 14119, upload-time = "2025-05-09T12:04:46.38Z" }, ] +[[package]] +name = "ty" +version = "0.0.51" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/ce/352fcdba5c72ea20e5d2e46e28809cdb617575b71209d971eff2ace8e6c4/ty-0.0.51.tar.gz", hash = "sha256:b90172d46365bb9d51a7011cbb5c60cc4f514f42c86635df6c092b717f85e1ac", size = 5953151, upload-time = "2026-06-19T01:48:58.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/8f/8fe7cab79a45320b2cdcd602f16d44c8108d2f418ff7ec316c6212f1f0cc/ty-0.0.51-py3-none-linux_armv6l.whl", hash = "sha256:947986bd82d324b3a5c58ce03f1dad160cdf36443d3e8f64b3484b861ba9bc64", size = 11884805, upload-time = "2026-06-19T01:48:20.184Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b4/56fdc39a3f44c0564fd157e1e59e1f9c3fc5ba57ae4472ded85c67c63d74/ty-0.0.51-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:25a5b31e6f23fd5dc63ad29087ded09932409e4154e2fe07bbaed015035990bb", size = 11633593, upload-time = "2026-06-19T01:48:22.998Z" }, + { url = "https://files.pythonhosted.org/packages/33/57/136e83f24fc04f5afdcabff42f40fa27eae5ac3f0e3f12627d072a55f679/ty-0.0.51-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2faed19a8f1505370de071c008df52a994fc03a204f3267c3a33a32ca26f854f", size = 11063076, upload-time = "2026-06-19T01:48:25.223Z" }, + { url = "https://files.pythonhosted.org/packages/32/f8/5d32f0df5692446440ab781b9b119aa3e0c0dbfa78c583fe9be8417d54fa/ty-0.0.51-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08adbe53fb8bc9e7f00e89bf1d3c875a02cda76d83f109d2e6ab1ff35a7bfa8c", size = 11579542, upload-time = "2026-06-19T01:48:27.302Z" }, + { url = "https://files.pythonhosted.org/packages/7f/0c/4f54ef338e9623886809ecd508931b0cd5b3aba1e591586a2f6aeaa8bd11/ty-0.0.51-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dc5e93695ab5dcbf1eef663aee60ec23a413547cc9cb06adcb0d842e9166bd0f", size = 11676189, upload-time = "2026-06-19T01:48:29.518Z" }, + { url = "https://files.pythonhosted.org/packages/56/27/31729066f9b9d3596941edaf267894eefc0b30df4518f003dba5f7276258/ty-0.0.51-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd92913bc90d1705ef9391ff8c6822b61e2e827fa295eb30bf0dfabcf815645", size = 12188154, upload-time = "2026-06-19T01:48:31.68Z" }, + { url = "https://files.pythonhosted.org/packages/2f/38/d4301aa12d2283c7130908baf1417a37dfe3e10f5669cb4ce2853c2540b4/ty-0.0.51-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:429a997394dac73870d71b87cc90efc54da3efaf319e72ca18aeef35a78aef90", size = 12780597, upload-time = "2026-06-19T01:48:33.839Z" }, + { url = "https://files.pythonhosted.org/packages/c1/52/4b2e67e53f126d39abe201bd2299e467e27463a284e965ad195cbc217fa0/ty-0.0.51-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62d94f06e8c317e89b6884f2bde443040e596b88c7c79bd944c84c105b06257a", size = 12491115, upload-time = "2026-06-19T01:48:36.169Z" }, + { url = "https://files.pythonhosted.org/packages/74/50/aabfe55c132ebe72b4d639cbf772d931e11b0990d29c1f691922b6ccabc1/ty-0.0.51-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8f52952cff665bc52a36147e610c10f5699d30007d7a14ab7f345cff93476ff", size = 12230135, upload-time = "2026-06-19T01:48:38.445Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1b/9aa428052dbed91c50919cd080426a313cf20ce14c6bfe2b71345e548671/ty-0.0.51-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:c1bd1355aee86af01e4e21b0bc16fc460fb05905761f0d8b8d70841de0feade8", size = 12468123, upload-time = "2026-06-19T01:48:40.47Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5a/f6ce69f2575259386c950c40e02578d0902760cb61f95045e9971182c24e/ty-0.0.51-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:79d1877e93460f936bc10ed1a31525702b7ce51075763ccba993be17f0b9e905", size = 11541672, upload-time = "2026-06-19T01:48:42.635Z" }, + { url = "https://files.pythonhosted.org/packages/35/3a/2af48924a683e959e95e5cc4dc88e5a8595206a0812b869032b95196f2b0/ty-0.0.51-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:cc233a6235fb23e2a44b14731a10043e37ba2f30f2c361cf49ad3633c5b9da9c", size = 11694015, upload-time = "2026-06-19T01:48:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/a4/12/899875d8a60b198c8121cb92ce18e18cc072d23ca2130fcdaa176383ef72/ty-0.0.51-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bc7459348a253247bbfb2669a021e614281b86bbea24c36112b8a6e1a2499a16", size = 11832856, upload-time = "2026-06-19T01:48:47.028Z" }, + { url = "https://files.pythonhosted.org/packages/e6/a2/88f681d826d97cc96ef9f6cadd4935f775758944cee07340aa46113bce28/ty-0.0.51-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:49a21237f6fd1de56beaff0a3e85fe022a09a3401e67e3abec41ce838a5d4d2e", size = 12333449, upload-time = "2026-06-19T01:48:49.091Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/535a4163b4452c6978c31fedfd7b5803cf3a2253e9455cde350f86638d6a/ty-0.0.51-py3-none-win32.whl", hash = "sha256:61b4b6a003c3ebe53a63a1125c9b6542aa01bc1b6c9a235d01ee328d000d61a9", size = 11177338, upload-time = "2026-06-19T01:48:51.433Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4d/2334fbb74291a20129fa7aaa8f789619ec9b6883b27f997b8baa27e4674f/ty-0.0.51-py3-none-win_amd64.whl", hash = "sha256:608d417cd1eaf79bcbd713d9830d5e3db9d57ec225c3af3e4ac9a9ff66b45d70", size = 12325675, upload-time = "2026-06-19T01:48:53.774Z" }, + { url = "https://files.pythonhosted.org/packages/50/b5/d49096cd5f3694becb86a5a6ccd0f229ead695fc7430d6bc4dd0a104c6fe/ty-0.0.51-py3-none-win_arm64.whl", hash = "sha256:62ced5e380284f12b2dc4802a3e4ed3dac39913fc6719afde7978814a4c7f169", size = 11657350, upload-time = "2026-06-19T01:48:55.904Z" }, +] + [[package]] name = "typeguard" version = "4.4.2"