Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

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

Inhaltsverzeichnis

Wichtig

Diese PEP ist ein historisches Dokument. Die aktuelle, kanonische Spezifikation, Projektstatusmarker, wird auf der PyPA-Spezifikationsseite gepflegt.

×

Siehe den PyPA-Spezifikations-Update-Prozess, um Änderungen vorzuschlagen.

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

  1. 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 Klassifikator Development Status :: 7 - Inactive enthalten, 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.

  2. 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-yanked und im JSON-Index mit yanked: bool | str markiert. 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.

  3. 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-version als 1.4 definieren.
  • Der pro-Projekt-Index **SOLLTE** ein geeignetes pypi:project-status Meta-Tag hinzufügen, mit einem content des Projektstatusmarkers. Der Index **DARF** wählen, das Meta-Tag pypi:project-status wegzulassen, wenn das Projekt als aktiv markiert ist.
  • Der pro-Projekt-Index **DARF** ein pypi:project-status-reason Meta-Tag enthalten, mit einem content von Freitext, der den Status des Projekts kontextualisiert. Der Index **DARF** wählen, das Meta-Tag pypi:project-status-reason wegzulassen, wenn das Projekt als aktiv markiert 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-version als 1.4 definieren.
  • Der pro-Projekt-Index **SOLLTE** einen project-status.state Schlüssel in der JSON-Antwort enthalten, mit dem Wert des Projektstatusmarkers. Der Index **DARF** wählen, den project-status.state Schlüssel wegzulassen, wenn das Projekt als aktiv markiert ist.
  • Der pro-Projekt-Index **DARF** einen project-status.reason Schlüssel in der JSON-Antwort enthalten, mit dem Wert von Freitext, der den Status des Projekts kontextualisiert. Der Index **DARF** wählen, den project-status.reason Schlüssel wegzulassen, wenn das Projekt als aktiv markiert 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-audit und uv) 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).


Quelle: https://github.com/python/peps/blob/main/peps/pep-0792.rst

Zuletzt geändert: 2025-08-11 18:52:20 GMT