mirror of
https://github.com/davidhalter/typeshed.git
synced 2025-12-06 20:24:30 +08:00
Typecheck typeshed's code with pyright (#9793)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
@@ -241,7 +241,7 @@ async def get_github_repo_info(session: aiohttp.ClientSession, pypi_info: PypiIn
|
||||
github_tags_info_url = f"https://api.github.com/repos/{url_path}/tags"
|
||||
async with session.get(github_tags_info_url, headers=get_github_api_headers()) as response:
|
||||
if response.status == 200:
|
||||
tags = await response.json()
|
||||
tags: list[dict[str, Any]] = await response.json()
|
||||
assert isinstance(tags, list)
|
||||
return GithubInfo(repo_path=url_path, tags=tags)
|
||||
return None
|
||||
@@ -266,7 +266,7 @@ async def get_diff_info(
|
||||
if github_info is None:
|
||||
return None
|
||||
|
||||
versions_to_tags = {}
|
||||
versions_to_tags: dict[packaging.version.Version, str] = {}
|
||||
for tag in github_info.tags:
|
||||
tag_name = tag["name"]
|
||||
# Some packages in typeshed (e.g. emoji) have tag names
|
||||
@@ -378,7 +378,7 @@ class DiffAnalysis:
|
||||
return analysis
|
||||
|
||||
def __str__(self) -> str:
|
||||
data_points = []
|
||||
data_points: list[str] = []
|
||||
if self.runtime_definitely_has_consistent_directory_structure_with_typeshed:
|
||||
data_points += [
|
||||
self.describe_public_files_added(),
|
||||
@@ -398,7 +398,7 @@ async def analyze_diff(
|
||||
url = f"https://api.github.com/repos/{github_repo_path}/compare/{old_tag}...{new_tag}"
|
||||
async with session.get(url, headers=get_github_api_headers()) as response:
|
||||
response.raise_for_status()
|
||||
json_resp = await response.json()
|
||||
json_resp: dict[str, list[FileInfo]] = await response.json()
|
||||
assert isinstance(json_resp, dict)
|
||||
# https://docs.github.com/en/rest/commits/commits#compare-two-commits
|
||||
py_files: list[FileInfo] = [file for file in json_resp["files"] if Path(file["filename"]).suffix == ".py"]
|
||||
@@ -581,7 +581,11 @@ def get_update_pr_body(update: Update, metadata: dict[str, Any]) -> str:
|
||||
if update.diff_analysis is not None:
|
||||
body += f"\n\n{update.diff_analysis}"
|
||||
|
||||
stubtest_will_run = not metadata.get("tool", {}).get("stubtest", {}).get("skip", False)
|
||||
# Loss of type due to infered [dict[Unknown, Unknown]]
|
||||
# scripts/stubsabot.py can't import tests/parse_metadata
|
||||
stubtest_will_run = (
|
||||
not metadata.get("tool", {}).get("stubtest", {}).get("skip", False) # pyright: ignore[reportUnknownMemberType]
|
||||
)
|
||||
if stubtest_will_run:
|
||||
body += textwrap.dedent(
|
||||
"""
|
||||
@@ -611,10 +615,13 @@ async def suggest_typeshed_update(update: Update, session: aiohttp.ClientSession
|
||||
branch_name = f"{BRANCH_PREFIX}/{normalize(update.distribution)}"
|
||||
subprocess.check_call(["git", "checkout", "-B", branch_name, "origin/main"])
|
||||
with open(update.stub_path / "METADATA.toml", "rb") as f:
|
||||
meta = tomlkit.load(f)
|
||||
# tomlkit.load has partially unknown IO type
|
||||
# https://github.com/sdispater/tomlkit/pull/272
|
||||
meta = tomlkit.load(f) # pyright: ignore[reportUnknownMemberType]
|
||||
meta["version"] = update.new_version_spec
|
||||
with open(update.stub_path / "METADATA.toml", "w", encoding="UTF-8") as f:
|
||||
tomlkit.dump(meta, f)
|
||||
# tomlkit.dump has partially unknown IO type
|
||||
tomlkit.dump(meta, f) # pyright: ignore[reportUnknownMemberType]
|
||||
body = get_update_pr_body(update, meta)
|
||||
subprocess.check_call(["git", "commit", "--all", "-m", f"{title}\n\n{body}"])
|
||||
if action_level <= ActionLevel.local:
|
||||
@@ -637,12 +644,15 @@ async def suggest_typeshed_obsolete(obsolete: Obsolete, session: aiohttp.ClientS
|
||||
branch_name = f"{BRANCH_PREFIX}/{normalize(obsolete.distribution)}"
|
||||
subprocess.check_call(["git", "checkout", "-B", branch_name, "origin/main"])
|
||||
with open(obsolete.stub_path / "METADATA.toml", "rb") as f:
|
||||
meta = tomlkit.load(f)
|
||||
# tomlkit.load has partially unknown IO type
|
||||
# https://github.com/sdispater/tomlkit/pull/272
|
||||
meta = tomlkit.load(f) # pyright: ignore[reportUnknownMemberType]
|
||||
obs_string = tomlkit.string(obsolete.obsolete_since_version)
|
||||
obs_string.comment(f"Released on {obsolete.obsolete_since_date.date().isoformat()}")
|
||||
meta["obsolete_since"] = obs_string
|
||||
with open(obsolete.stub_path / "METADATA.toml", "w", encoding="UTF-8") as f:
|
||||
tomlkit.dump(meta, f)
|
||||
# tomlkit.dump has partially unknown Mapping type
|
||||
tomlkit.dump(meta, f) # pyright: ignore[reportUnknownMemberType]
|
||||
body = "\n".join(f"{k}: {v}" for k, v in obsolete.links.items())
|
||||
subprocess.check_call(["git", "commit", "--all", "-m", f"{title}\n\n{body}"])
|
||||
if action_level <= ActionLevel.local:
|
||||
@@ -727,7 +737,8 @@ async def main() -> None:
|
||||
if isinstance(update, Update):
|
||||
await suggest_typeshed_update(update, session, action_level=args.action_level)
|
||||
continue
|
||||
if isinstance(update, Obsolete):
|
||||
# Redundant, but keeping for extra runtime validation
|
||||
if isinstance(update, Obsolete): # pyright: ignore[reportUnnecessaryIsInstance]
|
||||
await suggest_typeshed_obsolete(update, session, action_level=args.action_level)
|
||||
continue
|
||||
except RemoteConflict as e:
|
||||
|
||||
Reference in New Issue
Block a user