11PEP: 792
22Title: Project status markers in the simple index
33Author: William Woodruff <william@yossarian.net>,
4- Facundo Tuesca <facundo.tuesca@trailofbits.com>
4+ Facundo Tuesca <facundo.tuesca@trailofbits.com>,
55Sponsor: Donald Stufft <donald@stufft.io>
66PEP-Delegate: Donald Stufft <donald@stufft.io>
7- Discussions-To: https://discuss.python.org/t/79356
7+ Discussions-To: Pending
88Status: Draft
99Type: Standards Track
1010Topic: Packaging
1111Created: 08-Apr-2025
12- Post-History: `03-Feb-2025 <https://discuss.python.org/t/79356/ >`__
12+ Post-History: `03-Feb-2025 <https://discuss.python.org/t/79356/ >`__,
1313
1414Abstract
1515========
@@ -23,9 +23,8 @@ Rationale and Motivation
2323
2424The "status" of a project is an important piece of metadata, made more important
2525by growth in both the breadth and depth of the Python packaging ecosystem.
26- Both humans and tools use project statuses (or proxies for status,
27- such as recent activity) to determine whether the project is maintained or
28- otherwise suitable for consumption.
26+ Project status (or proxies such as recent activity) is useful to know in
27+ determining whether a project is maintained or otherwise suitable for consumption.
2928
3029Python packaging has at least three different mechanisms for communicating
3130the "status" of a project:
@@ -55,8 +54,10 @@ the "status" of a project:
5554 and will render them with a notice when the user navigates directly to them.
5655
5756 Yanking is machine-readable like trove classifiers, but is single-purpose
58- rather than general-purpose: users can specify a free-form "yank reason,"
59- but the semantics of yanking are fixed.
57+ rather than general-purpose: users can specify a free-text reason for
58+ yanking a given distribution package, but the semantics of yanking are
59+ fixed, and no reliable inference of project status can be made by a machine
60+ based upon that free-text reason.
6061
61623. PyPI itself has *project statuses *, which apply to the entire project
6263 (i.e., all releases and distributions). Project statuses have both
@@ -66,25 +67,27 @@ the "status" of a project:
6667 a strengthened yank: the project remains entirely uninstallable while
6768 quarantined.
6869
69- * Project maintainers can "archive" a project. Archiving a project
70+ * Project owners can "archive" a project. Archiving a project
7071 disables new release and distribution uploads to that project,
71- but otherwise has no effect on the project's downloadability .
72+ but otherwise has no effect on the ability to download a project .
7273
7374 Project statuses are machine-readable *in principle *, but are not currently
7475 exposed via any of PyPI's APIs. Instead, PyPI renders project statuses on
75- each project's user-facing (i.e. non-index) HTML.
76-
77- In summary: there are multiple ways to communicate the "status" of a project in
78- Python packaging, but none of these mechanisms are *simultaneously * (1)
79- machine-readable, (2) general, (3) index-agnostic, and (4) updatable across
80- the entire project (instead of per-release or per-distribution).
81-
82- .. csv-table ::
83- :header: "Mechanism", "Machine-readable?", "General?", "Index-agnostic?", "Project updatable?"
84-
85- "Trove classifiers", "✅", "✅", "✅", "❌"
86- "Yanking", "✅", "❌", "✅", "✅"
87- "Project statuses", "✅", "✅", "❌", "✅"
76+ each project's user-facing (i.e. non-index) webpage.
77+
78+ In summary, there are multiple ways to communicate the "status" of a project in
79+ Python packaging. However, none of them satisfy the four characteristics we desire.
80+ There is no current project status indicator that is machine-readable, general,
81+ index-agnostic, and applies to the entire project, instead of per-release or
82+ per-distribution.
83+
84+ ================= ================ ======= ============== ============
85+ Mechanism Machine-readable General Index-agnostic Project-wide
86+ ================= ================ ======= ============== ============
87+ Trove classifiers ✅ ✅ ✅ ❌
88+ Yanking ✅ ❌ ✅ ✅
89+ Project statuses ✅ ✅ ❌ ✅
90+ ================= ================ ======= ============== ============
8891
8992This PEP proposes adopting PyPI's project statuses as an index-agnostic
9093mechanism, satisfying all four conditions.
@@ -183,7 +186,7 @@ For example, the following would be a valid HTML index response for
183186``sampleproject `` after is has been marked as ``quarantined ``:
184187
185188.. code-block :: html
186- :emphasize-lines: 5
189+ :emphasize-lines: 5
187190
188191 <!DOCTYPE html>
189192 <html >
@@ -215,7 +218,7 @@ For example, the following would be a valid JSON index response for
215218``sampleproject `` after is has been marked as ``quarantined ``:
216219
217220.. code-block :: json
218- :emphasize-lines: 5
221+ :emphasize-lines: 5
219222
220223 {
221224 "meta" : {
0 commit comments