Skip to content

Commit b566fed

Browse files
woodruffwhugovk
andauthored
PEP 763: add an appendix comparing ecosystems (#4091)
Signed-off-by: William Woodruff <[email protected]> Co-authored-by: Hugo van Kemenade <[email protected]>
1 parent 13d6ca8 commit b566fed

File tree

1 file changed

+116
-2
lines changed

1 file changed

+116
-2
lines changed

peps/pep-0763.rst

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,13 @@ The Python ecosystem is continuing to grow,
106106
meaning that future deletions of projects can be reasonably assumed to
107107
be *just, as if not more,* disruptive than the deletions sampled above.
108108

109-
Given the above, this PEP concludes that deletions now present a greater risk
110-
and detriment to the Python ecosystem than a benefit.
109+
Given all of the above, this PEP concludes that deletions now present a greater
110+
risk and detriment to the Python ecosystem than a benefit.
111+
112+
In addition to these technical arguments, there is also precedent
113+
from other packaging ecosystems for limiting the ability of users to delete
114+
projects and their constituent releases. This precedent is documented in
115+
:ref:`Appendix A <pep763-appendix-a>`.
111116

112117
Specification
113118
=============
@@ -264,6 +269,115 @@ usage, this PEP identifies several limitations to this approach:
264269
PyPI is not straightforward, and there is limited possibility to gather a
265270
project's download statistics from mirrors or other distributions systems.
266271

272+
.. _pep763-appendix-a:
273+
274+
Appendix A: Precedent in other ecosystems
275+
=========================================
276+
277+
The following is a table of support for deletion in different packaging
278+
ecosystems. An ecosystem is considered to **not** support deletion
279+
if it restrict's a user's ability to perform deletions in a manner similar
280+
to this PEP.
281+
282+
An earlier version of this table, showing only deletion, was
283+
compiled by Donald Stufft and others on the Python discussion forum in
284+
`July 2022 <https://discuss.python.org/t/17227/59>`__.
285+
286+
.. list-table::
287+
:header-rows: 1
288+
289+
* - Ecosystem (Index)
290+
- Deletion
291+
- Yanking
292+
- Notes
293+
* - Python (PyPI)
294+
- ✅ [#f1]_
295+
- ✅ [#f2]_
296+
- Deletion currently completely unrestricted.
297+
* - Rust (crates.io)
298+
- ❌
299+
- ✅ [#f3]_
300+
- Deletion by users not allowed at all.
301+
* - JavaScript (npm)
302+
- ❌ [#f4]_
303+
- ✅ [#f5]_
304+
- Deletion is limited by criteria similar to this PEP.
305+
* - Ruby (RubyGems)
306+
- ✅ [#f6]_
307+
- ❌
308+
- RubyGems calls deletion "yanking." Yanking in PyPI's terms is not supported at all.
309+
* - Java (Maven Central)
310+
- ❌ [#f7]_
311+
- ❌
312+
- Deletion by users not allowed at all.
313+
* - PHP (Packagist)
314+
- ❌
315+
- ❌
316+
- Deletion restricted after an undocumented number of installs [#f8]_.
317+
* - .NET (NuGet)
318+
- ❌ [#f9]_
319+
- ✅ [#f10]_
320+
- NuGet calls yanking "unlisting."
321+
* - Elixir (Hex)
322+
- ❌ [#f11]_
323+
- ✅ [#f11]_
324+
- Hex calls yanking "retiring."
325+
* - R (CRAN)
326+
- ❌ [#f12]_
327+
- ✅ [#f12]_
328+
- Deletion is limited to within 24 hours of initial release or
329+
60 minutes for subsequent versions. CRAN calls yanking "archiving."
330+
* - Perl (CPAN)
331+
- ✅
332+
- ❌
333+
- Yanking is not supported at all. Deletion seemingly encouraged,
334+
at least as of 2021 [#f13]_.
335+
* - Lua (LuaRocks)
336+
- ✅ [#f14]_
337+
- ✅ [#f14]_
338+
- LuaRocks calls yanking "archiving."
339+
340+
The following trends are present:
341+
342+
* A strong majority of indices **do not** support deletion (7 vs. 4)
343+
* A strong majority of indices **do** support yanking (7 vs. 4)
344+
* The overwhelming majority of indices support one or the other or neither,
345+
but **not** both (13 vs. 2)
346+
347+
* PyPI and LuaRocks are notable outliers in supporting **both** deletion and
348+
yanking.
349+
350+
Footnotes
351+
=========
352+
353+
.. [#f1] https://pypi.org/help/#deletion
354+
355+
.. [#f2] https://pypi.org/help/#yanked
356+
357+
.. [#f3] https://doc.rust-lang.org/cargo/commands/cargo-yank.html
358+
359+
.. [#f4] https://docs.npmjs.com/unpublishing-packages-from-the-registry
360+
361+
.. [#f5] https://docs.npmjs.com/deprecating-and-undeprecating-packages-or-package-versions
362+
363+
.. [#f6] https://guides.rubygems.org/removing-a-published-gem/
364+
365+
.. [#f7] https://central.sonatype.org/faq/can-i-change-a-component/
366+
367+
.. [#f8] https://github.com/composer/packagist/issues/875
368+
369+
.. [#f9] https://learn.microsoft.com/en-us/nuget/nuget-org/policies/deleting-packages
370+
371+
.. [#f10] https://learn.microsoft.com/en-us/nuget/nuget-org/policies/deleting-packages#unlisting-a-package
372+
373+
.. [#f11] https://hex.pm/docs/faq#can-packages-be-removed-from-the-repository
374+
375+
.. [#f12] https://cran.r-project.org/web/packages/policies.html
376+
377+
.. [#f13] https://neilb.org/2021/05/10/delete-your-old-releases.html
378+
379+
.. [#f14] https://luarocks.org/changes
380+
267381
Copyright
268382
=========
269383

0 commit comments

Comments
 (0)