diff --git a/scripts/stubsabot.py b/scripts/stubsabot.py index a9a19e333..8153fb11f 100644 --- a/scripts/stubsabot.py +++ b/scripts/stubsabot.py @@ -170,8 +170,13 @@ async def release_contains_py_typed(release_to_download: PypiReleaseDownload, *, raise AssertionError(f"Unknown package type: {packagetype!r}") -async def find_first_release_with_py_typed(pypi_info: PypiInfo, *, session: aiohttp.ClientSession) -> PypiReleaseDownload: +async def find_first_release_with_py_typed(pypi_info: PypiInfo, *, session: aiohttp.ClientSession) -> PypiReleaseDownload | None: release_iter = pypi_info.releases_in_descending_order() + # If the latest release is not py.typed, assume none are. + if not (await release_contains_py_typed(release := next(release_iter), session=session)): + return None + + first_release_with_py_typed: PypiReleaseDownload | None = None while await release_contains_py_typed(release := next(release_iter), session=session): if not release.version.is_prerelease: first_release_with_py_typed = release @@ -418,12 +423,8 @@ async def determine_action(stub_path: Path, session: aiohttp.ClientSession) -> U if latest_version in spec: return NoUpdate(stub_info.distribution, "up to date") - is_obsolete = await release_contains_py_typed(latest_release, session=session) - if is_obsolete: - first_release_with_py_typed = await find_first_release_with_py_typed(pypi_info, session=session) - relevant_version = version_obsolete_since = first_release_with_py_typed.version - else: - relevant_version = latest_version + obsolete_since = await find_first_release_with_py_typed(pypi_info, session=session) + relevant_version = obsolete_since.version if obsolete_since else latest_version project_urls = pypi_info.info["project_urls"] or {} maybe_links: dict[str, str | None] = { @@ -435,15 +436,14 @@ async def determine_action(stub_path: Path, session: aiohttp.ClientSession) -> U diff_info = await get_diff_info(session, stub_info, pypi_info, relevant_version) if diff_info is not None: - github_repo_path, old_tag, new_tag, diff_url = diff_info - links["Diff"] = diff_url + links["Diff"] = diff_info.diff_url - if is_obsolete: + if obsolete_since: return Obsolete( stub_info.distribution, stub_path, - obsolete_since_version=str(version_obsolete_since), - obsolete_since_date=first_release_with_py_typed.upload_date, + obsolete_since_version=str(obsolete_since.version), + obsolete_since_date=obsolete_since.upload_date, links=links, ) @@ -451,7 +451,11 @@ async def determine_action(stub_path: Path, session: aiohttp.ClientSession) -> U diff_analysis: DiffAnalysis | None = None else: diff_analysis = await analyze_diff( - github_repo_path=github_repo_path, stub_path=stub_path, old_tag=old_tag, new_tag=new_tag, session=session + github_repo_path=diff_info.repo_path, + stub_path=stub_path, + old_tag=diff_info.old_tag, + new_tag=diff_info.new_tag, + session=session, ) return Update(