PEP 792 – Projektstatusmarker im Simple Index
- Autor:
- William Woodruff <william at yossarian.net>, Facundo Tuesca <facundo.tuesca at trailofbits.com>
- Sponsor:
- Donald Stufft <donald at stufft.io>
- PEP-Delegate:
- Donald Stufft <donald at stufft.io>
- Discussions-To:
- Discourse thread
- Status:
- Final
- Typ:
- Standards Track
- Thema:
- Packaging
- Erstellt:
- 21. Mai 2025
- Post-History:
- 03. Feb. 2025, 09. Juni 2025
- Resolution:
- 08. Juli 2025
Zusammenfassung
Diese PEP schlägt einen standardisierten Satz von index-gelieferten Projektstatusmarkern sowie einen Mechanismus zur Übermittlung dieser Marker in den HTML- und JSON-Simple-Indizes vor.
Rationale und Motivation
Der „Status“ eines Projekts ist ein wichtiges Metadatum, das durch das Wachstum der Größe und Komplexität des Python-Packaging-Ökosystems immer wichtiger wird. Der Projektstatus (oder Proxys wie die jüngste Aktivität) ist nützlich, um festzustellen, ob ein Projekt gepflegt wird oder anderweitig für den Konsum geeignet ist.
Python-Packaging hat mindestens drei verschiedene Mechanismen zur Kommunikation des „Status“ eines Projekts
- Distributionspakete können Trove-Klassifikatoren in ihren Metadaten enthalten, wie ursprünglich in PEP 301 spezifiziert. Die Liste der unterstützten Klassifikatoren wird von der PyPA gepflegt und enthält die Hierarchie der
Development Status. Zum Beispiel kann eine Distribution den KlassifikatorDevelopment Status :: 7 - Inactiveenthalten, um anzuzeigen, dass das Projekt der Distribution inaktiv ist.Trove-Klassifikatoren sind flexibel, aber sie haben auch erhebliche Einschränkungen: Sie sind maschinenlesbar und werden auf Indizes wie PyPI gerendert, erfordern aber auch, dass der Maintainer eine oder mehrere neue Distributionen hochlädt, jedes Mal, wenn er den Entwicklungsstatus seines Projekts aktualisieren möchte. Darüber hinaus können ältere Distributionen, da Distributionen im Python-Packaging-Ökosystem de facto unveränderlich sind, ihre Klassifikatoren nicht aktualisieren lassen, um den aktuellen Status des Projekts widerzuspiegeln.
- Indizes können Distributionen und Releases als „yanked“ markieren, wie ursprünglich in PEP 592 spezifiziert. Yanked-Distributionen werden bei der Abhängigkeitsauflösung nicht berücksichtigt.
Wenn eine Distribution yanked wurde, wird sie im HTML-Index mit
data-yankedund im JSON-Index mityanked: bool | strmarkiert. Zusätzlich werden Indizes wie PyPI yanked-Distributionen standardmäßig ausblenden und sie mit einem Hinweis rendern, wenn der Benutzer sie direkt aufruft.Yanking ist maschinenlesbar wie Trove-Klassifikatoren, aber zweckgebunden statt universell: Benutzer können einen Freitextgrund für das Yanking einer bestimmten Distributionsdatei angeben, aber die Semantik des Yankings ist festgelegt, und es kann keine zuverlässige Rückschließung des Projektstatus durch eine Maschine basierend auf diesem Freitextgrund erfolgen.
- PyPI selbst hat Projektstatus, die für das gesamte Projekt (d.h. alle Releases und Distributionen) gelten. Projektstatus haben sowohl vom Maintainer als auch vom Index-Administrator kontrollierbare Zustände
- PyPI-Administratoren können ein Projekt „unter Quarantäne stellen“. Quarantäne verhält sich wie ein verstärktes Yanking: Das gesamte Projekt bleibt während der Quarantäne deinstallierbar, und nur ein Administrator kann es wieder aus der Quarantäne entfernen.
- Projekteigentümer können ein Projekt „archivieren“. Das Archivieren eines Projekts deaktiviert das Hochladen neuer Releases und Distributionen für dieses Projekt, hat aber ansonsten keine Auswirkungen auf die Möglichkeit, ein Projekt herunterzuladen.
Projektstatus sind prinzipiell maschinenlesbar, werden aber derzeit nicht über PyPIs APIs verfügbar gemacht. Stattdessen rendert PyPI Projektstatus auf der benutzerorientierten (d.h. nicht-indexbezogenen) Webseite jedes Projekts.
Zusammenfassend lässt sich sagen, dass es mehrere Möglichkeiten gibt, den „Status“ eines Projekts im Python-Packaging zu kommunizieren. Keine davon erfüllt jedoch die vier gewünschten Eigenschaften. Es gibt keinen aktuellen Projektstatusindikator, der maschinenlesbar, allgemein (d.h. mehr als einen möglichen Zustand vermittelnd), index-agnostisch ist und für das gesamte Projekt gilt, anstatt pro Release oder pro Distribution.
| Mechanismus | Maschinenlesbar | Allgemein | Index-agnostisch | Projektweit |
|---|---|---|---|---|
| Trove-Klassifikatoren | ✅ | ✅ | ✅ | ❌ |
| Yanking | ✅ | ❌ | ✅ | ✅ |
| PyPI Projektstatus | ✅ | ✅ | ❌ | ✅ |
Diese PEP schlägt die Übernahme der PyPI-Projektstatus als index-agnostischen Mechanismus vor, der alle vier Bedingungen erfüllt.
Spezifikation
Diese PEP spezifiziert zwei Aspekte: einen Satz von Projektstatusmarkern und deren Darstellung in den standardmäßigen HTML- und JSON-Indizes.
Projektstatusmarker
Diese PEP schlägt die folgenden Projektstatusmarker vor.
Ein Projekt hat immer genau einen Status. Wenn kein Status explizit angegeben ist, gilt das Projekt als im Status aktiv.
Indizes **MÜSSEN** eine Teilmenge der in dieser PEP spezifizierten Statusmarker implementieren, je nach ihren Bedürfnissen.
Diese PEP schreibt nicht vor, welche Prinzipale (d.h. Projekt-Maintainer, Index-Administratoren usw.) welche Status setzen und aufheben dürfen.
aktiv
Beschreibung: Das Projekt ist aktiv. Dies ist der Standardstatus für ein Projekt.
Index-Semantik
- Der Index, der das Projekt hostet, **MUSS** den Upload neuer Distributionen in das Projekt zulassen.
- Der Index **MUSS** vorhandene Distributionen des Projekts zum Download anbieten.
Installer-Semantik: keine.
archiviert
Beschreibung: Das Projekt wird voraussichtlich in Zukunft nicht mehr aktualisiert.
Index-Semantik
- Der Index, der das Projekt hostet, **DARF NICHT** den Upload neuer Distributionen in das Projekt zulassen.
- Der Index **MUSS** vorhandene Distributionen des Projekts zum Download anbieten.
Installer-Semantik
- Installer **DÜRFEN** Warnungen bezüglich der Archivierung eines Projekts ausgeben.
unter Quarantäne gestellt
Beschreibung: Das Projekt gilt als generell unsicher für die Verwendung, z. B. aufgrund von Malware.
Index-Semantik
- Der Index, der das Projekt hostet, **DARF NICHT** den Upload neuer Distributionen in das Projekt zulassen.
- Der Index **DARF KEINE** Distributionen des Projekts zum Download anbieten.
Installer-Semantik
- Installer **DÜRFEN** Warnungen bezüglich der Quarantäne eines Projekts ausgeben, auch wenn dies praktisch irrelevant ist (da der Index keine Distributionen zur Installation anbieten wird).
veraltet
Beschreibung: Das Projekt gilt als veraltet und wurde möglicherweise durch ein anderes Projekt ersetzt.
Index-Semantik
- Dieser Status teilt die gleiche Semantik wie
aktiv.
Installer-Semantik
- Installer **DÜRFEN** Warnungen bezüglich der Veralterung eines Projekts ausgeben.
Statusmarker in den Index-APIs
Diese PEP definiert Version 1.4 der Index-APIs.
Alle Änderungen an den HTML- und JSON-Simple-Indizes erfolgen auf der Ebene pro Projekt, d.h. innerhalb der Index-Antwort jedes Projekts, und nicht in der Stamm-Index-Antwort. Keine Änderungen an der Stamm-Index-Antwort werden von dieser PEP vorgeschlagen.
HTML-Index
Die folgenden Änderungen werden am Simple Repository API vorgenommen
- Der pro-Projekt-Index **MUSS**
pypi:repository-versionals1.4definieren. - Der pro-Projekt-Index **SOLLTE** ein geeignetes
pypi:project-statusMeta-Tag hinzufügen, mit einemcontentdes Projektstatusmarkers. Der Index **DARF** wählen, das Meta-Tagpypi:project-statuswegzulassen, wenn das Projekt alsaktivmarkiert ist. - Der pro-Projekt-Index **DARF** ein
pypi:project-status-reasonMeta-Tag enthalten, mit einemcontentvon Freitext, der den Status des Projekts kontextualisiert. Der Index **DARF** wählen, das Meta-Tagpypi:project-status-reasonwegzulassen, wenn das Projekt alsaktivmarkiert ist oder wenn kein Grund angegeben wird.
Zum Beispiel wäre die folgende eine gültige HTML-Indexantwort für sampleproject, nachdem es als unter Quarantäne gestellt markiert wurde.
<!DOCTYPE html>
<html>
<head>
<meta name="pypi:repository-version" content="1.4">
<meta name="pypi:project-status" content="quarantined">
<meta name="pypi:project-status-reason" content="the project is haunted">
<title>Links for sampleproject</title>
</head>
<body>
<h1>Links for sampleproject</h1>
</body>
</html>
Beachten Sie, dass gemäß der unter Quarantäne gestellt Semantik oben, die Indexantwort keine Distributionslinks für das Projekt enthält.
JSON-Index
Die folgenden Änderungen werden am JSON Simple Index vorgenommen
- Der pro-Projekt-Index **MUSS**
meta.api-versionals1.4definieren. - Der pro-Projekt-Index **SOLLTE** einen
project-status.stateSchlüssel in der JSON-Antwort enthalten, mit dem Wert des Projektstatusmarkers. Der Index **DARF** wählen, denproject-status.stateSchlüssel wegzulassen, wenn das Projekt alsaktivmarkiert ist. - Der pro-Projekt-Index **DARF** einen
project-status.reasonSchlüssel in der JSON-Antwort enthalten, mit dem Wert von Freitext, der den Status des Projekts kontextualisiert. Der Index **DARF** wählen, denproject-status.reasonSchlüssel wegzulassen, wenn das Projekt alsaktivmarkiert ist oder wenn kein Grund angegeben wird.
Zum Beispiel wäre die folgende eine gültige JSON-Indexantwort für sampleproject, nachdem es als unter Quarantäne gestellt markiert wurde.
{
"meta": {
"api-version": "1.4"
},
"project-status": {
"status": "quarantined",
"reason": "the project is haunted"
},
"alternate-locations": [],
"files": [],
"name": "sampleproject",
"versions": [
"1.2.0",
"1.3.0",
"1.3.1",
"2.0.0",
"3.0.0",
"4.0.0"
]
}
Beachten Sie, dass, wie beim HTML-Index, die JSON-Antwort keine Distributionslinks für das unter Quarantäne gestellte Projekt enthält.
Zukünftige Überlegungen
Diese PEP definiert nur vier Projektstatusmarker: aktiv, archiviert, unter Quarantäne gestellt und veraltet.
Zukünftige PEPs (oder PyPA-Standardisierungsprozesse) können bei Bedarf zusätzliche Projektstatusmarker definieren. Zukünftige Statusmarker können eine Erhöhung der Metadatenversion erfordern, es sei denn, es wird eine zukünftige Metadatenänderung vorgenommen, um „offene“ Statusmarker zu ermöglichen (d.h. wo Indizes und Installer nicht unbedingt eine einzige gemeinsame Liste von zulässigen Status haben).
Wie in dieser PEP spezifiziert, sind Projektstatusmarker „nackt“, d.h. sie vermitteln keine zusätzlichen benutzergesteuerten Metadaten (wie z.B. eine Erklärung für die Archivierung eines Projekts).
Eine zukünftige PEP kann wählen, den Projektstatusmechanismus um benutzergesteuerte Metadaten zu erweitern, ähnlich dem Freitext, der während des Release-Yankings erlaubt ist.
Sicherheitsimplikationen
Diese PEP identifiziert keine positiven oder negativen Sicherheitsauswirkungen im Zusammenhang mit der Hinzufügung von Projektstatusmarkern.
Wie man das lehrt
Die Aufklärung der Python-Community über diese PEP hat zwei Aspekte
- Gewöhnliche Paket-Maintainer müssen über ihre Fähigkeit informiert werden, Projektstatusmarker zu setzen, z. B. um ihre Downstreams zu informieren, dass ein Projekt archiviert oder veraltet ist.
Wenn diese PEP angenommen wird, werden die Autoren dieser PEP mit PyPI über geeignete, auf den Maintainer ausgerichtete Dokumentation und Kommunikation koordinieren, einschließlich Blogbeiträgen zur Funktionsankündigung und Aktualisierungen der Benutzerdokumentation von PyPI.
- Installer- und Index-Maintainer müssen über die neuen Projektstatusmarker und deren Interpretation informiert werden.
Wenn diese PEP angenommen wird, werden die Autoren dieser PEP die Implementierung auf PyPI durchführen und als Referenzimplementierung für andere Indizes dienen.
Diese PEP schreibt keine Änderungen im Installer-Verhalten vor. Wenn diese PEP jedoch angenommen wird, werden die Autoren dieser PEP mit den Maintainern beliebter Installer (z. B.
pip) koordinieren, um ihnen zu helfen, zu bestimmen, inwieweit sie Projektstatus anzeigen möchten.
Abgelehnte Ideen
Verwendung von „reservierten“ Schlüsseln
Eine Alternative zu dieser PEP ist es, Projektstatusmarker nicht direkt zu standardisieren, sondern stattdessen bestehende Mechanismen innerhalb der Standards zu verwenden, um sie auf nicht standardmäßige Weise zu kommunizieren.
Zum Beispiel sagt der JSON Simple Index Folgendes
Schlüssel (auf jeder Ebene) mit einem führenden Unterstrich sind als privat für die Verwendung durch den Indexserver reserviert. Kein zukünftiger Standard wird einem solchen Schlüssel eine Bedeutung zuweisen.
Im Wesentlichen bedeutet dies, dass das Folgende standardkonform wäre
{
"meta": {
"api-version": "1.4"
},
"_project-status": "quarantined",
"alternate-locations": [],
"files": [],
"name": "sampleproject",
"versions": [
"1.2.0",
"1.3.0",
"1.3.1",
"2.0.0",
"3.0.0",
"4.0.0"
]
}
Dieser Ansatz hat jedoch mehrere Nachteile
- Standardskonforme Tools (wie
pip,pip-auditunduv) könnten es als inakzeptabel empfinden, einen „reservierten“ Schlüssel zu verwenden, da dieser Schlüssel keine standardmäßigen Semantiken oder Kompatibilitätseigenschaften hätte. - Der „reservierte“ Ansatz ist nur für den JSON Simple Index geeignet; für den HTML Simple Index existiert kein gleichwertiger Mechanismus. Dies würde Verbraucher des HTML Simple Index benachteiligen, ebenso wie Mirror-Implementierungen, die den JSON Index konsumieren, aber nur einen HTML Index bereitstellen.
Projektmarker in PyPIs nicht-standardmäßigem JSON-API
Eine weitere Alternative zur Standardisierung ist es, Projektstatusmarker nur in PyPIs nicht-standardmäßigem JSON-API verfügbar zu machen. PyPI hat die volle Kontrolle über das Layout dieser API und könnte einen project-status oder ähnlichen Schlüssel einfügen, ohne eine PEP oder einen Unterstrichpräfix zu benötigen.
Dies hat ähnliche Nachteile wie der „reservierte“ Schlüsselansatz oben und vertieft im Allgemeinen die Unterschiede zwischen den Standard- und Nicht-Standard-APIs.
Mehrere Projektstatusmarker gleichzeitig
Eine frühere Version dieser PEP erwog, die Unterstützung für mehrere Projektmarker gleichzeitig vorzuschlagen. Zum Beispiel könnte ein Projekt sowohl als archiviert als auch als unter Quarantäne gestellt markiert werden.
Nach Überlegung wurde dies aus Komplexitätsgründen abgelehnt: Mehrere Projektstatusmarker zu haben, erfordert, dass die PEP einen Konfliktlösungsmechanismus beim Zusammenführen ihrer Semantiken spezifiziert, sowie einen Zustandsautomaten dafür, welche Marker exklusiv sind (z.B. ist aktiv konzeptionell exklusiv zu allen anderen Markern, während archiviert und unter Quarantäne gestellt konzeptionell miteinander kompatibel sind).
Urheberrecht
Dieses Dokument wird in die Public Domain oder unter die CC0-1.0-Universal-Lizenz gestellt, je nachdem, welche Lizenz permissiver ist.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0792.rst
Zuletzt geändert: 2025-08-11 18:52:20 GMT