Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

upgrade mypy to v1.10.1 #21158

Merged
merged 5 commits into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions 3rdparty/python/mypy-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
mypy==1.1.1
mypy==1.10.1
mypy-typing-asserts
strawberry-graphql==0.159.1
strawberry-graphql==0.240.4
89 changes: 47 additions & 42 deletions 3rdparty/python/mypy.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
// ],
// "generated_with_requirements": [
// "mypy-typing-asserts",
// "mypy==1.1.1",
// "strawberry-graphql==0.159.1"
// "mypy==1.10.1",
// "strawberry-graphql==0.240.4"
// ],
// "manylinux": "manylinux2014",
// "requirement_constraints": [],
Expand All @@ -26,60 +26,61 @@
"allow_wheels": true,
"build_isolation": true,
"constraints": [],
"excluded": [],
"locked_resolves": [
{
"locked_requirements": [
{
"artifacts": [
{
"algorithm": "sha256",
"hash": "5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3",
"url": "https://files.pythonhosted.org/packages/f8/39/e5143e7ec70939d2076c1165ae9d4a3815597019c4d797b7f959cf778600/graphql_core-3.2.3-py3-none-any.whl"
"hash": "1604f2042edc5f3114f49cac9d77e25863be51b23a54a61a23245cf32f6476f0",
"url": "https://files.pythonhosted.org/packages/d1/33/cc72c4c658c6316f188a60bc4e5a91cd4ceaaa8c3e7e691ac9297e4e72c7/graphql_core-3.2.4-py3-none-any.whl"
},
{
"algorithm": "sha256",
"hash": "06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676",
"url": "https://files.pythonhosted.org/packages/ee/a6/94df9045ca1bac404c7b394094cd06713f63f49c7a4d54d99b773ae81737/graphql-core-3.2.3.tar.gz"
"hash": "acbe2e800980d0e39b4685dd058c2f4042660b89ebca38af83020fd872ff1264",
"url": "https://files.pythonhosted.org/packages/66/9e/aa527fb09a9d7399d5d7d2aa2da490e4580707652d3b4fc156996ae88a5b/graphql-core-3.2.4.tar.gz"
}
],
"project_name": "graphql-core",
"requires_dists": [
"typing-extensions<5,>=4.2; python_version < \"3.8\""
],
"requires_python": "<4,>=3.6",
"version": "3.2.3"
"version": "3.2.4"
},
{
"artifacts": [
{
"algorithm": "sha256",
"hash": "4e4e8b362cdf99ba00c2b218036002bdcdf1e0de085cdb296a49df03fb31dfc4",
"url": "https://files.pythonhosted.org/packages/a4/0b/3a30f50287e42a4230320fa2eac25eb3017d38a7c31f083d407ab627607c/mypy-1.1.1-py3-none-any.whl"
"hash": "71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a",
"url": "https://files.pythonhosted.org/packages/2b/ee/d53a3d4792a09b6cd757978951d6dcf8b10825a8b8522b68e9b5eb53b9a1/mypy-1.10.1-py3-none-any.whl"
},
{
"algorithm": "sha256",
"hash": "9401e33814cec6aec8c03a9548e9385e0e228fc1b8b0a37b9ea21038e64cdd8a",
"url": "https://files.pythonhosted.org/packages/30/da/808ceaf2bcf23a9e90156c7b11b41add8dd5a009ee48159ec820d04d97bd/mypy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
"hash": "c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf",
"url": "https://files.pythonhosted.org/packages/33/b0/20c9f6dcbfb312d1804a81f4a39e0b401fe614dc0de580249b6deb07d053/mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl"
},
{
"algorithm": "sha256",
"hash": "59bbd71e5c58eed2e992ce6523180e03c221dcd92b52f0e792f291d67b15a71c",
"url": "https://files.pythonhosted.org/packages/47/9f/34f6a2254f7d39b8c4349b8ac480c233d37c377faf2c67c6ef925b3af0ab/mypy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl"
"hash": "fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3",
"url": "https://files.pythonhosted.org/packages/50/00/86bb2f6c5b58fc6f360dd4cb5c0666dc67c05007c2cddcc694528a59a604/mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl"
},
{
"algorithm": "sha256",
"hash": "ae9ceae0f5b9059f33dbc62dea087e942c0ccab4b7a003719cb70f9b8abfa32f",
"url": "https://files.pythonhosted.org/packages/62/54/be80f8d01f5cf72f774a77f9f750527a6fa733f09f78b1da30e8fa3914e6/mypy-1.1.1.tar.gz"
"hash": "6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531",
"url": "https://files.pythonhosted.org/packages/aa/87/ec65c45b2e5160203a680b0f79e459fbe9c192f9eff501c3fec82bef3be5/mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
},
{
"algorithm": "sha256",
"hash": "19ba15f9627a5723e522d007fe708007bae52b93faab00f95d72f03e1afa9598",
"url": "https://files.pythonhosted.org/packages/b8/72/385f3aeaaf262325454ac7f569eb81ac623464871df23d9778c864d04c6c/mypy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl"
"hash": "2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3",
"url": "https://files.pythonhosted.org/packages/c5/5c/f61c876647036d572a1434f0251257a04f2a7bd038c718b28fa5ca699515/mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl"
},
{
"algorithm": "sha256",
"hash": "4b398d8b1f4fba0e3c6463e02f8ad3346f71956b92287af22c9b12c3ec965a9f",
"url": "https://files.pythonhosted.org/packages/be/d5/5588a2ee0d77189626a57b555b6b006dda6d5b0083f16c6be0c2d761cd7b/mypy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl"
"hash": "1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0",
"url": "https://files.pythonhosted.org/packages/c7/b9/81e4c6dbb1ec1e72503de3ff2c5fe4b7f224e04613b670f8b9004cd8a4dd/mypy-1.10.1.tar.gz"
}
],
"project_name": "mypy",
Expand All @@ -88,13 +89,12 @@
"mypy-extensions>=1.0.0",
"pip; extra == \"install-types\"",
"psutil>=4.0; extra == \"dmypy\"",
"setuptools>=50; extra == \"mypyc\"",
"tomli>=1.1.0; python_version < \"3.11\"",
"typed-ast<2,>=1.4.0; extra == \"python2\"",
"typed-ast<2,>=1.4.0; python_version < \"3.8\"",
"typing-extensions>=3.10"
"typing-extensions>=4.1.0"
],
"requires_python": ">=3.7",
"version": "1.1.1"
"requires_python": ">=3.8",
"version": "1.10.1"
},
{
"artifacts": [
Expand Down Expand Up @@ -174,42 +174,46 @@
"artifacts": [
{
"algorithm": "sha256",
"hash": "f16c3efcb3b33e8f35ddbbe640e61e67efeeeb05d313416ae10336b8d2c7a69b",
"url": "https://files.pythonhosted.org/packages/a2/cf/abbb0f44c059f61a562d386e79d1b8adb4def370a6e99f26033002caf2e2/strawberry_graphql-0.159.1-py3-none-any.whl"
"hash": "ebedacbf943463b222e15e628142fbf9121ef89a7c31176271f5a3ea2491fa4c",
"url": "https://files.pythonhosted.org/packages/4d/4c/fb5783b2bb45e614712d30bce2b771e6ef41c0e91cc4805d033c77033c38/strawberry_graphql-0.240.4-py3-none-any.whl"
},
{
"algorithm": "sha256",
"hash": "25b56e294ed032e69c066fe0ac802a724f4364c2d70d903e6a9b41d8c62f5add",
"url": "https://files.pythonhosted.org/packages/2b/49/90df8aca12c7e213ccb70712391b19b5bdc0607bef3ced15e2664acac0f2/strawberry_graphql-0.159.1.tar.gz"
"hash": "50c6436e02b3028b6fdcdd62e2756f7c5ec9a92f0dfc5ecf7fba00a6ce280eeb",
"url": "https://files.pythonhosted.org/packages/ab/0b/6b3504a9b5a9fdcc3ab3fee67741ae26c8494f02d7d8cbe57ec526ac8915/strawberry_graphql-0.240.4.tar.gz"
}
],
"project_name": "strawberry-graphql",
"requires_dists": [
"Django>=3.2; extra == \"django\"",
"aiohttp<4.0.0,>=3.7.4.post0; extra == \"aiohttp\"",
"asgiref<4.0,>=3.2; extra == \"django\" or extra == \"channels\"",
"backports.cached-property<2.0.0,>=1.0.2; python_version < \"3.8\"",
"astunparse<2.0.0,>=1.6.3; python_version < \"3.9\"",
"chalice<2.0,>=1.22; extra == \"chalice\"",
"channels>=3.0.5; extra == \"channels\"",
"click<9.0,>=7.0; extra == \"debug-server\" or extra == \"cli\"",
"fastapi>=0.65.2; extra == \"fastapi\"",
"flask>=1.1; extra == \"flask\"",
"graphql-core<3.3.0,>=3.2.0",
"graphlib_backport; python_version < \"3.9\" and extra == \"cli\"",
"graphql-core<3.4.0,>=3.2.0",
"libcst>=0.4.7; extra == \"debug\" or extra == \"debug-server\" or extra == \"cli\"",
"litestar>=2; python_version >= \"3.8\" and extra == \"litestar\"",
"opentelemetry-api<2; extra == \"opentelemetry\"",
"opentelemetry-sdk<2; extra == \"opentelemetry\"",
"pydantic<2; extra == \"pydantic\"",
"pydantic>1.6.1; extra == \"pydantic\"",
"pygments<3.0,>=2.3; extra == \"debug-server\" or extra == \"cli\"",
"pyinstrument>=4.0.0; extra == \"pyinstrument\"",
"python-dateutil<3.0.0,>=2.7.0",
"python-multipart<0.0.6,>=0.0.5; extra == \"asgi\" or extra == \"debug-server\" or extra == \"fastapi\"",
"python-multipart>=0.0.7; extra == \"asgi\" or extra == \"debug-server\" or extra == \"fastapi\"",
"quart>=0.19.3; extra == \"quart\"",
"rich>=12.0.0; extra == \"debug\" or extra == \"debug-server\" or extra == \"cli\"",
"sanic>=20.12.2; extra == \"sanic\"",
"starlette>=0.13.6; extra == \"asgi\" or extra == \"debug-server\"",
"typing_extensions<5.0.0,>=3.7.4",
"uvicorn<0.21.0,>=0.11.6; extra == \"debug-server\""
"starlette>=0.18.0; extra == \"asgi\" or extra == \"debug-server\"",
"typer>=0.7.0; extra == \"debug-server\" or extra == \"cli\"",
"typing-extensions>=4.5.0",
"uvicorn>=0.11.6; extra == \"debug-server\""
],
"requires_python": "<4.0,>=3.7",
"version": "0.159.1"
"requires_python": "<4.0,>=3.8",
"version": "0.240.4"
},
{
"artifacts": [
Expand Down Expand Up @@ -253,14 +257,15 @@
],
"only_builds": [],
"only_wheels": [],
"overridden": [],
"path_mappings": {},
"pex_version": "2.3.1",
"pip_version": "24.0",
"pex_version": "2.16.2",
"pip_version": "24.2",
"prefer_older_binary": false,
"requirements": [
"mypy-typing-asserts",
"mypy==1.1.1",
"strawberry-graphql==0.159.1"
"mypy==1.10.1",
"strawberry-graphql==0.240.4"
],
"requires_python": [
"==3.9.*"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ def from_data(cls, data: TargetData) -> Target:
address = json.pop("address")
target_type = json.pop("target_type")
fields = json
return cls(address=address, target_type=target_type, fields=fields)
return cls(address=address, target_type=target_type, fields=fields) # type: ignore[call-arg]


@strawberry.input(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ class ProfileTestCase:
]


@pytest.mark.parametrize("case", _TEST_CASES, ids=lambda c: c.name) # type: ignore[no-any-return]
@pytest.mark.parametrize("case", _TEST_CASES, ids=lambda c: c.name)
def test_parse_go_coverage_profiles(case) -> None:
try:
profiles = parse_go_coverage_profiles(case.input.encode(), description_of_origin="test")
Expand Down
6 changes: 5 additions & 1 deletion src/python/pants/backend/nfpm/util_rules/sandbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,11 @@ async def populate_nfpm_content_sandbox(
):
for entry in digest_entries:
if isinstance(entry, FileEntry) and entry.path == source.value:
moved_entries.append(dataclasses.replace(entry, path=src.value))
new_path = src.value
if new_path is None:
raise ValueError("unexpected None")

moved_entries.append(dataclasses.replace(entry, path=new_path))
else:
moved_entries.append(entry)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ def generate_tgt(
normalized_proj_name = canonicalize_project_name(project_name)
tgt_overrides = overrides.pop(normalized_proj_name, {})
if Dependencies.alias in tgt_overrides:
tgt_overrides = tgt_overrides | {
tgt_overrides = tgt_overrides | { # type: ignore[operator]
Dependencies.alias: list(tgt_overrides[Dependencies.alias]) + req_deps
}

Expand Down
11 changes: 7 additions & 4 deletions src/python/pants/backend/python/packaging/pyoxidizer/rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
)
from pants.engine.unions import UnionRule
from pants.util.docutil import doc_url
from pants.util.frozendict import FrozenDict
from pants.util.logging import LogLevel
from pants.util.strutil import softwrap

Expand Down Expand Up @@ -188,10 +189,12 @@ async def package_pyoxidizer_binary(
process_with_caching = dataclasses.replace(
pex_process,
argv=(bash.path, runner_script.path, *pex_process.argv),
append_only_caches={
**pex_process.append_only_caches,
"pyoxidizer": runner_script.CACHE_PATH,
},
append_only_caches=FrozenDict(
{
**pex_process.append_only_caches,
"pyoxidizer": runner_script.CACHE_PATH,
}
),
)

result = await Get(ProcessResult, Process, process_with_caching)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ def _from_json_dict(
) -> PythonLockfileMetadataV3:
v2_metadata = super()._from_json_dict(json_dict, lockfile_description, error_suffix)
metadata = _get_metadata(json_dict, lockfile_description, error_suffix)
manylinux = metadata("manylinux", str, lambda l: l) # type: ignore[no-any-return]
manylinux = metadata("manylinux", str, lambda l: l)
requirement_constraints = metadata(
"requirement_constraints",
Set[PipRequirement],
Expand Down
2 changes: 1 addition & 1 deletion src/python/pants/backend/python/util_rules/pex_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ async def setup_pex_cli_process(
env = {
**complete_pex_env.environment_dict(python=bootstrap_python),
**python_native_code.subprocess_env_vars,
**(request.extra_env or {}),
**(request.extra_env or {}), # type: ignore[dict-item]
# If a subcommand is used, we need to use the `pex3` console script.
**({"PEX_SCRIPT": "pex3"} if request.subcommand else {}),
}
Expand Down
2 changes: 1 addition & 1 deletion src/python/pants/backend/shell/util_rules/shell_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ async def _prepare_process_request_from_target(

append_only_caches = {
**merged_extras.append_only_caches,
**(shell_command.get(ShellCommandNamedCachesField).value or {}),
**(shell_command.get(ShellCommandNamedCachesField).value or {}), # type: ignore[dict-item]
}

cache_scope = env_target.default_cache_scope
Expand Down
2 changes: 1 addition & 1 deletion src/python/pants/backend/terraform/hcl2_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def resolve_pure_path(base: PurePath, relative_path: PurePath) -> PurePath:
def extract_module_source_paths(path: PurePath, raw_content: bytes) -> Set[str]:
# Import here so we can still test this file with pytest (since `hcl2` is not present in
# normal Pants venv.)
import hcl2 # type: ignore[import] # pants: no-infer-dep
import hcl2 # type: ignore[import-not-found] # pants: no-infer-dep

content = raw_content.decode("utf-8")
parsed_content = hcl2.loads(content)
Expand Down
9 changes: 6 additions & 3 deletions src/python/pants/bsp/protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
from concurrent.futures import Future
from typing import Any, BinaryIO, ClassVar, Protocol

from pylsp_jsonrpc.endpoint import Endpoint # type: ignore[import]
from pylsp_jsonrpc.exceptions import ( # type: ignore[import]
from pylsp_jsonrpc.endpoint import Endpoint # type: ignore[import-untyped]
from pylsp_jsonrpc.exceptions import ( # type: ignore[import-untyped]
JsonRpcException,
JsonRpcInvalidRequest,
JsonRpcMethodNotFound,
)
from pylsp_jsonrpc.streams import JsonRpcStreamReader, JsonRpcStreamWriter # type: ignore[import]
from pylsp_jsonrpc.streams import ( # type: ignore[import-untyped]
JsonRpcStreamReader,
JsonRpcStreamWriter,
)

from pants.bsp.context import BSPContext
from pants.bsp.spec.notification import BSPNotification
Expand Down
2 changes: 1 addition & 1 deletion src/python/pants/bsp/protocol_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from urllib.parse import urlparse

import pytest
from pylsp_jsonrpc.exceptions import JsonRpcException # type: ignore[import]
from pylsp_jsonrpc.exceptions import JsonRpcException # type: ignore[import-untyped]

from internal_plugins.test_lockfile_fixtures.lockfile_fixture import (
JVMLockfileFixture,
Expand Down
7 changes: 5 additions & 2 deletions src/python/pants/bsp/testutil.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@
from threading import Thread
from typing import Any, BinaryIO, Dict, Iterable, Tuple

from pylsp_jsonrpc.endpoint import Endpoint # type: ignore[import]
from pylsp_jsonrpc.streams import JsonRpcStreamReader, JsonRpcStreamWriter # type: ignore[import]
from pylsp_jsonrpc.endpoint import Endpoint # type: ignore[import-untyped]
from pylsp_jsonrpc.streams import ( # type: ignore[import-untyped]
JsonRpcStreamReader,
JsonRpcStreamWriter,
)

from pants.bsp.context import BSPContext
from pants.bsp.protocol import BSPConnection
Expand Down
6 changes: 3 additions & 3 deletions src/python/pants/core/goals/multi_tool_goal_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class OnlyOption(StrListOption):

def __new__(cls, tool_description: str, example1: str, example2: str):
return super().__new__(
cls, # type: ignore[arg-type]
cls,
"--only",
help=lambda cls: softwrap(
f"""
Expand All @@ -47,10 +47,10 @@ class BatchSizeOption(IntOption):

def __new__(cls, uppercase: str, lowercase: str):
return super().__new__(
cls, # type: ignore[arg-type]
cls,
"--batch-size",
advanced=True,
default=128, # type: ignore[arg-type]
default=128,
help=softwrap(
f"""
The target number of files to be included in each {lowercase} batch.
Expand Down
4 changes: 2 additions & 2 deletions src/python/pants/core/goals/tailor.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ def restrict_sources(self) -> PutativeTarget:
return dataclasses.replace(
self,
owned_sources=owned_sources,
kwargs={**self.kwargs, "sources": owned_sources},
kwargs=FrozenDict({**self.kwargs, "sources": owned_sources}),
)

def add_comments(self, comments: Iterable[str]) -> PutativeTarget:
Expand All @@ -246,7 +246,7 @@ def fmt_val(v) -> str:
if self.kwargs or has_name:
_kwargs = {
**({"name": self.name} if has_name else {}),
**self.kwargs, # type: ignore[arg-type]
**self.kwargs,
}
_kwargs_str_parts = [f"\n{indent}{k}={fmt_val(v)}" for k, v in _kwargs.items()]
kwargs_str = ",".join(_kwargs_str_parts) + ",\n"
Expand Down
2 changes: 1 addition & 1 deletion src/python/pants/core/goals/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1013,7 +1013,7 @@ async def run_tests(
}
coverage_collections = []
for data_cls, data in itertools.groupby(all_coverage_data, lambda data: type(data)):
collection_cls = coverage_types_to_collection_types[data_cls]
collection_cls = coverage_types_to_collection_types[data_cls] # type: ignore[index]
coverage_collections.append(collection_cls(data))
# We can create multiple reports for each coverage data (e.g., console, xml, html)
coverage_reports_collections = await MultiGet(
Expand Down
2 changes: 1 addition & 1 deletion src/python/pants/core/util_rules/adhoc_process_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ async def create_tool_runner(

append_only_caches = {
**merged_extras.append_only_caches,
**(request.named_caches or {}),
**(request.named_caches or {}), # type: ignore[dict-item]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's this or construct that's causing the issues, likely because the {} becomes dict[Never, Never] and that apparently doesn't satisfy SupportsKeysAndGetItem[K, V] with the specific K and V types.

def direct_splat_frozen_only(fd: FrozenDict[str, int]) -> dict[str, int]:
    return {**fd} # okay

def direct_splat_dict_too(fd: FrozenDict[str, int] | dict[str, int]) -> dict[str, int]:
    return {**fd} # okay
    
def or_splat_explicit(fd: FrozenDict[str, int]) -> dict[str, int]:
    empty: dict[str, int] = {}
    return {**(fd or empty)} # okay

def or_splat_implicit(fd: None | FrozenDict[str, int]) -> dict[str, int]:
    return {**(fd or {})} # error: Unpacked dict entry 0 has incompatible type "FrozenDict[str, int] | dict[Never, Never]"; expected "SupportsKeysAndGetItem[str, int]"  [dict-item]

https://mypy-play.net/?mypy=latest&python=3.12&gist=661f39bc47fc9b1b4f8a80fe0814d1c1

I filed python/mypy#17790

Happy to go with what you've got for now.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting. Yeah, let's ignore it for now. If and when it gets fixed upstream, we should get a "unused type ignore" error once the ignore is no longer necessary.

}

return ToolRunner(
Expand Down
Loading
Loading