PEP 301 – Paketindex und Metadaten für Distutils
- Autor:
- Richard Jones <richard at python.org>
- Status:
- Final
- Typ:
- Standards Track
- Thema:
- Packaging
- Erstellt:
- 24-Okt-2002
- Python-Version:
- 2.3
- Post-History:
- 08-Nov-2002
Zusammenfassung
Dieser PEP schlägt mehrere Erweiterungen für das Distutils-Paketsystem vor [1]. Diese Verbesserungen umfassen einen zentralen Paketindex-Server, Werkzeuge zur Übermittlung von Paketinformationen an den Index und Erweiterungen der Paketmetadaten, um Trove [2]-Informationen aufzunehmen.
Dieser PEP befasst sich nicht mit Problemen der Paketabhängigkeit. Er befasst sich auch nicht mit der Speicherung und dem Download von Paketen, wie in PEP 243 beschrieben. Auch schlägt er keine lokale Datenbank von Paketen vor, wie in PEP 262 beschrieben.
Bestehende Paket-Repositories wie die Vaults of Parnassus [3], CPAN [4] und PAUSE [5] werden als Stand der Technik in diesem Bereich untersucht.
Begründung
Python-Programmierer benötigen seit langem eine einfache Methode, um vorhandene Module und Systeme zu entdecken, die ihnen zur Verfügung stehen. Man kann argumentieren, dass die Existenz dieser Systeme für andere Sprachen erheblich zu deren Popularität beigetragen hat. Die Existenz der Catalog-SIG und die vielen dort geführten Diskussionen zeigen, dass eine große Anzahl von Benutzern diesen Bedarf erkennt.
Die Einführung des Distutils-Paketsystems in Python vereinfachte den Prozess der Verteilung von teilbarem Code und enthielt Mechanismen zur Erfassung von Paketmetadaten, tat aber wenig mit den Metadaten, außer sie mit dem Paket zu versenden.
Eine Schnittstelle zum Index sollte im python.org-Domain gehostet werden, was ihr einen Anschein von Legitimität verleiht, den bestehende Katalogbemühungen nicht haben.
Die Schnittstelle zur Übermittlung von Informationen an den Katalog sollte so einfach wie möglich sein – hoffentlich nur ein Einzeiler für die meisten Benutzer.
Probleme der Paketabhängigkeit werden aufgrund der Komplexität eines solchen Systems nicht behandelt. PEP 262 schlägt ein solches System vor, aber zum Zeitpunkt der Abfassung ist der PEP noch unvollständig.
Probleme der Paketverteilung (Speicherung auf einem zentralen Server) werden nicht behandelt, da sie Annahmen über die Verfügbarkeit von Speicherplatz und Bandbreite erfordern, die ich nicht treffen kann. PEP 243, der noch entwickelt wird, befasst sich mit diesen und vielen weiteren Problemen. Dieser Vorschlag gilt als kompatibel und ergänzend zu dem Vorschlag in PEP 243.
Spezifikation
Die Spezifikation besteht aus drei Teilen: der Web-Schnittstelle, dem Distutils register Kommando und der Distutils Trove-Klassifizierung.
Web-Schnittstelle
Eine Web-Schnittstelle wird über einen einfachen Speicher implementiert. Die Schnittstelle ist über die Domain python.org verfügbar, entweder direkt oder als packages.python.org.
Der Speicher hat Spalten für alle Metadatenfelder. Das (name, version)-Doppel wird als Eindeutigkeitsschlüssel verwendet. Zusätzliche Übermittlungen für ein vorhandenes (name, version) führen zu einer Update-Operation.
Die Web-Schnittstelle implementiert die folgenden Kommandos/Schnittstellen
- index
- Listet bekannte Pakete auf, optional gefiltert. Eine zusätzliche HTML-Seite, search, präsentiert dem Benutzer ein Formular, das zur Anpassung der Indexansicht verwendet wird. Der Index wird eine Browsing-Oberfläche enthalten, ähnlich der im Abschnitt 4.3 des Trove-Schnittstellendesigns präsentierten. Die Ergebnisse werden paginiert, alphabetisch sortiert und zeigen nur die neueste Version. Die Information über die neueste Version wird mithilfe der Distutils LooseVersion-Klasse ermittelt.
- display
- Zeigt Informationen über das Paket an. Alle Felder werden als Klartext angezeigt. Das Feld "url" (oder "home_page") ist verlinkt.
- submit
- Akzeptiert eine POST-Übermittlung von Metadaten über ein Paket. Die Felder "name" und "version" sind obligatorisch, da sie einen Eintrag im Index eindeutig identifizieren. Submit ermittelt automatisch, ob ein neuer Eintrag erstellt oder ein bestehender aktualisiert werden soll. Die Metadaten werden, wo angebracht, auf Korrektheit geprüft – insbesondere werden die Trove-Diskriminatoren mit dem zulässigen Satz verglichen. Ein Update aktualisiert alle Informationen über das Paket auf Basis der neu übermittelten Informationen.
Es wird auch ein submit/edit-Formular geben, das manuelle Übermittlung und Aktualisierung für diejenigen ermöglicht, die Distutils nicht verwenden.
- submit_pkg_info
- Akzeptiert eine POST-Übermittlung einer PKG-INFO-Datei und führt dieselbe Funktion wie die submit-Schnittstelle aus.
- user
- Registriert einen neuen Benutzer beim Index. Benötigt Benutzername, Passwort und E-Mail-Adresse. Passwörter werden in der Indexdatenbank als SHA-Hashes gespeichert. Wenn der Benutzername bereits in der Datenbank existiert
- Wenn eine gültige HTTP Basic-Authentifizierung bereitgestellt wird, werden das Passwort und die E-Mail-Adresse mit den Übermittlungsinformationen aktualisiert, oder
- Wenn keine gültige Authentifizierung bereitgestellt wird, wird der Benutzer informiert, dass der Login bereits vergeben ist.
Die Registrierung wird ein dreistufiger Prozess sein, der Folgendes beinhaltet:
- Benutzerübermittlung von Details über das Distutils register-Kommando oder über das Web,
- Index-Server sendet eine E-Mail an die E-Mail-Adresse des Benutzers mit einer URL, die besucht werden muss, um die Registrierung mit einem zufälligen Einmal-Schlüssel zu bestätigen, und
- Benutzer besucht die URL mit dem Schlüssel und bestätigt die Registrierung.
- roles
- Eine Schnittstelle zum Ändern von Benutzerrollen-Zuweisungen.
- password_reset
- Unter Verwendung der bereitgestellten E-Mail-Adresse als Schlüssel wird das Passwort eines Benutzers zurückgesetzt und eine E-Mail mit dem neuen Passwort an den Benutzer gesendet.
Das submit-Kommando erfordert HTTP Basic-Authentifizierung, vorzugsweise über eine HTTPS-Verbindung.
Die Server-Schnittstelle wird Erfolg oder Misserfolg der Kommandos über eine Teilmenge der Standard-HTTP-Antwortcodes anzeigen
| Code | Bedeutung | Implikationen des Register-Kommandos |
|---|---|---|
| 200 | OK | Alles hat einwandfrei funktioniert |
| 400 | Schlechte Anfrage | Die für die Übermittlung bereitgestellten Daten waren fehlerhaft |
| 401 | Nicht autorisiert | Der angegebene Benutzername oder das Passwort waren falsch |
| 403 | Verboten | Der Benutzer hat keine Berechtigung, die Paketinformationen zu aktualisieren (nicht Besitzer oder Warteschreiber) |
Benutzerrollen
Drei Benutzerrollen können Benutzern zugewiesen werden
- Besitzer
- Besitzt einen Paketnamen, darf die Rolle des Warteschreibers für diesen Namen zuweisen. Der erste Benutzer, der Informationen über ein Paket registriert, gilt als Besitzer des Paketnamens. Der Admin-Benutzer kann dies bei Bedarf ändern. Darf Updates für den Paketnamen einreichen.
- Warteschreiber
- Kann Informationen für einen bestimmten Paketnamen einreichen und aktualisieren.
- Administrator
- Kann die Rolle des Besitzers zuweisen und Benutzerdetails bearbeiten. Nicht spezifisch für einen Paketnamen.
Index-Speicherung (Schema)
Der Index wird in einer Reihe von relationalen Datenbanktabellen gespeichert
- packages
- Listet Paketnamen auf und speichert Metadaten auf Paketebene (derzeit nur die stabile Release-Version)
- releases
- Jedes Paket hat einen Eintrag in releases für jede Version des Pakets, die veröffentlicht wurde. Eine Zeile enthält den Großteil der Informationen, die in der PKG-INFO-Datei des Pakets enthalten sind. Es gibt eine Zeile für jedes Paket (name, version).
- trove_discriminators
- Listet den Trove-Diskriminatortext auf und weist jedem eine eindeutige ID zu.
- release_discriminators
- Jeder Eintrag ordnet ein Paket (name, version) einer discriminator_id zu. Wir ordnen Releases statt Paketen zu, da die Menge der Diskriminatoren zwischen Releases variieren kann.
- journals
- Enthält Informationen über Änderungen an Paketinformationen im Index. Änderungen an den Tabellen packages, releases, roles und release_discriminators werden hier nach Paketname und version aufgelistet, wenn die Änderung release-spezifisch ist.
- users
- Enthält unsere Benutzerdatenbank – Benutzername, E-Mail-Adresse und Passwort.
- roles
- Ordnet user_name und role_name einem package_name zu.
Eine zusätzliche Tabelle, rego_otk, enthält die Einmal-Schlüssel, die während der Registrierung generiert werden, und ist für den Index selbst nicht von Interesse.
Distutils register Kommando
Ein zusätzliches Distutils-Kommando, register, wird implementiert, das die Paketmetadaten an den zentralen Index sendet. Das register-Kommando behandelt die Benutzerregistrierung automatisch; dem Benutzer werden drei Optionen angeboten
- Paketinformationen einloggen und übermitteln
- als neuer Packager registrieren
- Passwort-Erinnerungs-E-Mail senden
Auf Systemen, bei denen die Umgebungsvariable $HOME gesetzt ist, wird der Benutzer beim Beenden aufgefordert, seinen Benutzernamen/Passwort in einer Datei in seinem $HOME-Verzeichnis unter dem Namen .pypirc zu speichern.
Benachrichtigungen über Änderungen an einem Paketeintrag werden an alle Benutzer gesendet, die Informationen über das Paket übermittelt haben. Das heißt, der ursprüngliche Übermittler und alle nachfolgenden Aktualisierer.
Das register-Kommando wird eine Option --verify enthalten, die eine Testübermittlung an den Index durchführt, ohne die Daten tatsächlich zu committen. Der Index führt wie üblich seine Überprüfung der Übermittlung durch und meldet alle Fehler, die er bei einer normalen Übermittlung gemeldet hätte. Dies ist nützlich zur Überprüfung der Korrektheit von Trove-Diskriminatoren.
Distutils Trove-Klassifizierung
Das Trove-Konzept der Diskriminierung wird dem Metadatensatz hinzugefügt, der Paketautoren über das neue Attribut "classifiers" zur Verfügung steht. Die Liste der Klassifikatoren wird über das Web verfügbar sein und wie folgt zum Paket hinzugefügt
setup(
name = "roundup",
version = __version__,
classifiers = [
'Development Status :: 4 - Beta',
'Environment :: Console',
'Environment :: Web Environment',
'Intended Audience :: End Users/Desktop',
'Intended Audience :: Developers',
'Intended Audience :: System Administrators',
'License :: OSI Approved :: Python Software Foundation License',
'Operating System :: MacOS :: MacOS X',
'Operating System :: Microsoft :: Windows',
'Operating System :: POSIX',
'Programming Language :: Python',
'Topic :: Communications :: Email',
'Topic :: Office/Business',
'Topic :: Software Development :: Bug Tracking',
],
url = 'http://sourceforge.net/projects/roundup/',
...
)
Es wurde entschieden, dass Strings für die Klassifizierungseinträge verwendet werden, aufgrund der tiefen Verschachtelung, die bei einer formelleren Python-Struktur auftreten würde.
Die ursprüngliche Trove-Spezifikation, dass Klassifizierungs-Namensräume durch Schrägstriche („/“) getrennt werden, kollidiert leider mit vielen Namen, die Schrägstriche enthalten (z. B. „OS/2“). Die Doppelpunktlösung („ :: “), die von SourceForge und FreshMeat implementiert wurde, umgeht diese Einschränkung.
Die Liste der Klassifizierungswerte im Modulindex wurde von FreshMeat und SourceForge (mit deren Erlaubnis) übernommen. Diese Liste wird sowohl über die Web-Schnittstelle als auch über die Option --list-classifiers des register-Kommandos als Textliste zur Verfügung gestellt, die dann in die setup.py-Datei kopiert werden kann. Die Option --verify des register-Kommandos prüft die Klassifizierungswerte gegen die Liste des Servers.
Leider ist die Hinzufügung der Eigenschaft "classifiers" nicht abwärtskompatibel. Eine setup.py-Datei, die sie verwendet, funktioniert nicht unter Python 2.1.3. Es wird gehofft, dass eine Bugfix-Version von Python 2.2 (wahrscheinlich 2.2.3) die Argumentprüfung des setup()-Kommandos lockert, um neue Schlüsselwörter zuzulassen, auch wenn sie nicht tatsächlich verwendet werden. Es ist vorzuziehen, dass eine Warnung ausgegeben wird, anstatt eines schwerwiegenden Fehlers. Die Verwendung des neuen Schlüsselworts sollte in Situationen, in denen das Paket als kompatibel mit Python-Versionen früher als 2.2.3 oder 2.3 beworben wird, vermieden werden.
In der PKG-INFO erscheinen die Klassifizierungslisteinträge als einzelne Classifier:-Einträge
Name: roundup
Version: 0.5.2
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console (Text Based)
.
.
Classifier: Topic :: Software Development :: Bug Tracking
Url: http://sourceforge.net/projects/roundup/
Implementierung
Der Server ist verfügbar unter
Der Code ist über das SourceForge-Projekt erhältlich
Das register-Kommando wurde in Python 2.3 integriert.
Abgelehnte Vorschläge
Ursprünglich sollte der Indexserver benutzerdefinierte Header zurückgeben (inspiriert von PEP 243)
- X-Pypi-Status
- Entweder "success" oder "fail".
- X-Pypi-Reason
- Eine Beschreibung des Grundes für den Fehler oder zusätzliche Informationen im Erfolgsfall.
Es wurde jedoch darauf hingewiesen [6], dass dies ein schlechtes Schema ist.
Referenzen
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Danksagungen
Anthony Baxter, Martin v. Loewis und David Goodger für Ermutigung und Feedback während der ersten Entwurfsphase.
A.M. Kuchling für Unterstützung, einschließlich des Hostings des zweiten Prototyps.
Greg Stein für die Empfehlung, dass das Register-Kommando HTTP-Antwortcodes und nicht benutzerdefinierte X-PyPI-* Header interpretieren soll.
Die vielen Teilnehmer der Distutils und Catalog SIGs für ihre Ideen über die Jahre.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0301.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT