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

Make it easier to see the available wheels per package release #15087

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 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
90 changes: 45 additions & 45 deletions warehouse/locale/messages.pot
Original file line number Diff line number Diff line change
Expand Up @@ -694,8 +694,8 @@ msgstr ""
#: warehouse/templates/manage/project/release.html:200
#: warehouse/templates/manage/project/releases.html:140
#: warehouse/templates/manage/project/releases.html:179
#: warehouse/templates/packaging/detail.html:370
#: warehouse/templates/packaging/detail.html:389
#: warehouse/templates/packaging/detail.html:379
#: warehouse/templates/packaging/detail.html:398
#: warehouse/templates/pages/classifiers.html:25
#: warehouse/templates/pages/help.html:20
#: warehouse/templates/pages/help.html:218
Expand Down Expand Up @@ -2779,7 +2779,7 @@ msgstr ""
#: warehouse/templates/manage/account.html:206
#: warehouse/templates/manage/account/recovery_codes-provision.html:58
#: warehouse/templates/manage/account/totp-provision.html:57
#: warehouse/templates/packaging/detail.html:160
#: warehouse/templates/packaging/detail.html:169
#: warehouse/templates/pages/classifiers.html:38
msgid "Copy to clipboard"
msgstr ""
Expand Down Expand Up @@ -6454,152 +6454,152 @@ msgstr ""
msgid "%(org)s has not uploaded any projects to PyPI, yet"
msgstr ""

#: warehouse/templates/packaging/detail.html:108
#: warehouse/templates/packaging/detail.html:117
msgid "view hashes"
msgstr ""

#: warehouse/templates/packaging/detail.html:128
#: warehouse/templates/packaging/detail.html:137
#, python-format
msgid "RSS: latest releases for %(project_name)s"
msgstr ""

#: warehouse/templates/packaging/detail.html:162
#: warehouse/templates/packaging/detail.html:171
msgid "Copy PIP instructions"
msgstr ""

#: warehouse/templates/packaging/detail.html:173
#: warehouse/templates/packaging/detail.html:182
msgid "This release has been yanked"
msgstr ""

#: warehouse/templates/packaging/detail.html:179
#: warehouse/templates/packaging/detail.html:188
#, python-format
msgid "Stable version available (%(version)s)"
msgstr ""

#: warehouse/templates/packaging/detail.html:183
#: warehouse/templates/packaging/detail.html:192
#, python-format
msgid "Newer version available (%(version)s)"
msgstr ""

#: warehouse/templates/packaging/detail.html:187
#: warehouse/templates/packaging/detail.html:196
msgid "Latest version"
msgstr ""

#: warehouse/templates/packaging/detail.html:192
#: warehouse/templates/packaging/detail.html:201
#, python-format
msgid "Released: %(release_date)s"
msgstr ""

#: warehouse/templates/packaging/detail.html:206
#: warehouse/templates/packaging/detail.html:215
msgid "No project description provided"
msgstr ""

#: warehouse/templates/packaging/detail.html:219
#: warehouse/templates/packaging/detail.html:228
msgid "Navigation"
msgstr ""

#: warehouse/templates/packaging/detail.html:220
#: warehouse/templates/packaging/detail.html:252
#: warehouse/templates/packaging/detail.html:229
#: warehouse/templates/packaging/detail.html:261
#, python-format
msgid "Navigation for %(project)s"
msgstr ""

#: warehouse/templates/packaging/detail.html:223
#: warehouse/templates/packaging/detail.html:255
#: warehouse/templates/packaging/detail.html:232
#: warehouse/templates/packaging/detail.html:264
msgid "Project description. Focus will be moved to the description."
msgstr ""

#: warehouse/templates/packaging/detail.html:225
#: warehouse/templates/packaging/detail.html:257
#: warehouse/templates/packaging/detail.html:291
#: warehouse/templates/packaging/detail.html:234
#: warehouse/templates/packaging/detail.html:266
#: warehouse/templates/packaging/detail.html:300
msgid "Project description"
msgstr ""

#: warehouse/templates/packaging/detail.html:229
#: warehouse/templates/packaging/detail.html:267
#: warehouse/templates/packaging/detail.html:238
#: warehouse/templates/packaging/detail.html:276
msgid "Release history. Focus will be moved to the history panel."
msgstr ""

#: warehouse/templates/packaging/detail.html:231
#: warehouse/templates/packaging/detail.html:269
#: warehouse/templates/packaging/detail.html:313
#: warehouse/templates/packaging/detail.html:240
#: warehouse/templates/packaging/detail.html:278
#: warehouse/templates/packaging/detail.html:322
msgid "Release history"
msgstr ""

#: warehouse/templates/packaging/detail.html:236
#: warehouse/templates/packaging/detail.html:274
#: warehouse/templates/packaging/detail.html:245
#: warehouse/templates/packaging/detail.html:283
msgid "Download files. Focus will be moved to the project files."
msgstr ""

#: warehouse/templates/packaging/detail.html:238
#: warehouse/templates/packaging/detail.html:276
#: warehouse/templates/packaging/detail.html:369
#: warehouse/templates/packaging/detail.html:247
#: warehouse/templates/packaging/detail.html:285
#: warehouse/templates/packaging/detail.html:378
msgid "Download files"
msgstr ""

#: warehouse/templates/packaging/detail.html:261
#: warehouse/templates/packaging/detail.html:270
msgid "Project details. Focus will be moved to the project details."
msgstr ""

#: warehouse/templates/packaging/detail.html:263
#: warehouse/templates/packaging/detail.html:305
#: warehouse/templates/packaging/detail.html:272
#: warehouse/templates/packaging/detail.html:314
msgid "Project details"
msgstr ""

#: warehouse/templates/packaging/detail.html:287
#: warehouse/templates/packaging/detail.html:296
msgid "Reason this release was yanked:"
msgstr ""

#: warehouse/templates/packaging/detail.html:298
#: warehouse/templates/packaging/detail.html:307
msgid "The author of this package has not provided a project description"
msgstr ""

#: warehouse/templates/packaging/detail.html:315
#: warehouse/templates/packaging/detail.html:324
msgid "Release notifications"
msgstr ""

#: warehouse/templates/packaging/detail.html:316
#: warehouse/templates/packaging/detail.html:325
msgid "RSS feed"
msgstr ""

#: warehouse/templates/packaging/detail.html:328
#: warehouse/templates/packaging/detail.html:337
msgid "This version"
msgstr ""

#: warehouse/templates/packaging/detail.html:348
#: warehouse/templates/packaging/detail.html:357
msgid "pre-release"
msgstr ""

#: warehouse/templates/packaging/detail.html:353
#: warehouse/templates/packaging/detail.html:362
msgid "yanked"
msgstr ""

#: warehouse/templates/packaging/detail.html:370
#: warehouse/templates/packaging/detail.html:379
#, python-format
msgid ""
"Download the file for your platform. If you're not sure which to choose, "
"learn more about <a href=\"%(href)s\" title=\"%(title)s\" "
"target=\"_blank\" rel=\"noopener\">installing packages</a>."
msgstr ""

#: warehouse/templates/packaging/detail.html:372
#: warehouse/templates/packaging/detail.html:381
msgid "Source Distribution"
msgid_plural "Source Distributions"
msgstr[0] ""
msgstr[1] ""

#: warehouse/templates/packaging/detail.html:388
#: warehouse/templates/packaging/detail.html:397
msgid "No source distribution files available for this release."
msgstr ""

#: warehouse/templates/packaging/detail.html:389
#: warehouse/templates/packaging/detail.html:398
#, python-format
msgid ""
"See tutorial on <a href=\"%(href)s\" title=\"%(title)s\" "
"target=\"_blank\" rel=\"noopener\">generating distribution archives</a>."
msgstr ""

#: warehouse/templates/packaging/detail.html:396
#: warehouse/templates/packaging/detail.html:405
msgid "Built Distribution"
msgid_plural "Built Distributions"
msgstr[0] ""
Expand Down
44 changes: 44 additions & 0 deletions warehouse/packaging/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,24 @@ def metadata_path(self):
def validates_requires_python(self, *args, **kwargs):
raise RuntimeError("Cannot set File.requires_python")

@property
def bdist_tags(self):
if self.packagetype == "sdist" or not self.filename:
# Don't parse source package file names or missing file names.
return None
return bdist_filename_tags(self.filename)

@property
def bdist_tags_collected(self):
interpreters = set()
abis = set()
platforms = set()
for tag in self.bdist_tags or []:
interpreters.add(tag.interpreter)
abis.add(tag.abi)
platforms.add(tag.platform)
return sorted(interpreters), sorted(abis), sorted(platforms)


class Filename(db.ModelBase):
__tablename__ = "file_registry"
Expand Down Expand Up @@ -786,3 +804,29 @@ class ProhibitedProjectName(db.Model):
)
prohibited_by: Mapped[User] = orm.relationship()
comment: Mapped[str] = mapped_column(server_default="")


def bdist_filename_tags(filename: str):
"""Parse a wheel file name to extract the tags."""
_, __, ___, tags = packaging.utils.parse_wheel_filename(filename)
return tags


def bdist_filenames_tags(available) -> dict[str, set]:
result = {
"interpreters": set(),
"abis": set(),
"platforms": set(),
}
for tags in available:
if not tags:
continue
for tag in tags:
result["interpreters"].add(tag.interpreter)
result["abis"].add(tag.abi)
result["platforms"].add(tag.platform)

result["interpreters"] = sorted(result["interpreters"])
result["abis"] = sorted(result["abis"])
result["platforms"] = sorted(result["platforms"])
return result
12 changes: 11 additions & 1 deletion warehouse/packaging/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,13 @@

from warehouse.accounts.models import User
from warehouse.cache.origin import origin_cache
from warehouse.packaging.models import File, Project, Release, Role
from warehouse.packaging.models import (
File,
Project,
Release,
Role,
bdist_filenames_tags,
)
from warehouse.utils import readme


Expand Down Expand Up @@ -138,6 +144,9 @@ def release_detail(release, request):
key=lambda f: f.filename,
)

# Collect all the available bdist details to enable building filters.
bdist_tags = bdist_filenames_tags([bdist.bdist_tags for bdist in bdists])

return {
"project": project,
"release": release,
Expand All @@ -149,6 +158,7 @@ def release_detail(release, request):
"all_versions": project.all_versions,
"maintainers": maintainers,
"license": license,
"bdist_tags": bdist_tags,
}


Expand Down
Loading