CINXE.COM
PEP 714 – Rename dist-info-metadata in the Simple API | peps.python.org
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="color-scheme" content="light dark"> <title>PEP 714 – Rename dist-info-metadata in the Simple API | peps.python.org</title> <link rel="shortcut icon" href="../_static/py.png"> <link rel="canonical" href="https://peps.python.org/pep-0714/"> <link rel="stylesheet" href="../_static/style.css" type="text/css"> <link rel="stylesheet" href="../_static/mq.css" type="text/css"> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" media="(prefers-color-scheme: light)" id="pyg-light"> <link rel="stylesheet" href="../_static/pygments_dark.css" type="text/css" media="(prefers-color-scheme: dark)" id="pyg-dark"> <link rel="alternate" type="application/rss+xml" title="Latest PEPs" href="https://peps.python.org/peps.rss"> <meta property="og:title" content='PEP 714 – Rename dist-info-metadata in the Simple API | peps.python.org'> <meta property="og:description" content="This PEP renames the metadata provided by PEP 658 in both HTML and JSON formats of the Simple API and provides guidelines for both clients and servers in how to handle the renaming."> <meta property="og:type" content="website"> <meta property="og:url" content="https://peps.python.org/pep-0714/"> <meta property="og:site_name" content="Python Enhancement Proposals (PEPs)"> <meta property="og:image" content="https://peps.python.org/_static/og-image.png"> <meta property="og:image:alt" content="Python PEPs"> <meta property="og:image:width" content="200"> <meta property="og:image:height" content="200"> <meta name="description" content="This PEP renames the metadata provided by PEP 658 in both HTML and JSON formats of the Simple API and provides guidelines for both clients and servers in how to handle the renaming."> <meta name="theme-color" content="#3776ab"> </head> <body> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <symbol id="svg-sun-half" viewBox="0 0 24 24" pointer-events="all"> <title>Following system colour scheme</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="9"></circle> <path d="M12 3v18m0-12l4.65-4.65M12 14.3l7.37-7.37M12 19.6l8.85-8.85"></path> </svg> </symbol> <symbol id="svg-moon" viewBox="0 0 24 24" pointer-events="all"> <title>Selected dark colour scheme</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z"></path> </svg> </symbol> <symbol id="svg-sun" viewBox="0 0 24 24" pointer-events="all"> <title>Selected light colour scheme</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="5"></circle> <line x1="12" y1="1" x2="12" y2="3"></line> <line x1="12" y1="21" x2="12" y2="23"></line> <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line> <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line> <line x1="1" y1="12" x2="3" y2="12"></line> <line x1="21" y1="12" x2="23" y2="12"></line> <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line> <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line> </svg> </symbol> </svg> <script> document.documentElement.dataset.colour_scheme = localStorage.getItem("colour_scheme") || "auto" </script> <section id="pep-page-section"> <header> <h1>Python Enhancement Proposals</h1> <ul class="breadcrumbs"> <li><a href="https://www.python.org/" title="The Python Programming Language">Python</a> » </li> <li><a href="../pep-0000/">PEP Index</a> » </li> <li>PEP 714</li> </ul> <button id="colour-scheme-cycler" onClick="setColourScheme(nextColourScheme())"> <svg aria-hidden="true" class="colour-scheme-icon-when-auto"><use href="#svg-sun-half"></use></svg> <svg aria-hidden="true" class="colour-scheme-icon-when-dark"><use href="#svg-moon"></use></svg> <svg aria-hidden="true" class="colour-scheme-icon-when-light"><use href="#svg-sun"></use></svg> <span class="visually-hidden">Toggle light / dark / auto colour theme</span> </button> </header> <article> <section id="pep-content"> <h1 class="page-title">PEP 714 – Rename dist-info-metadata in the Simple API</h1> <dl class="rfc2822 field-list simple"> <dt class="field-odd">Author<span class="colon">:</span></dt> <dd class="field-odd">Donald Stufft <donald at stufft.io></dd> <dt class="field-even">PEP-Delegate<span class="colon">:</span></dt> <dd class="field-even">Paul Moore <p.f.moore at gmail.com></dd> <dt class="field-odd">Discussions-To<span class="colon">:</span></dt> <dd class="field-odd"><a class="reference external" href="https://discuss.python.org/t/27471">Discourse thread</a></dd> <dt class="field-even">Status<span class="colon">:</span></dt> <dd class="field-even"><abbr title="Normative proposal accepted for implementation">Accepted</abbr></dd> <dt class="field-odd">Type<span class="colon">:</span></dt> <dd class="field-odd"><abbr title="Normative PEP with a new feature for Python, implementation change for CPython or interoperability standard for the ecosystem">Standards Track</abbr></dd> <dt class="field-even">Topic<span class="colon">:</span></dt> <dd class="field-even"><a class="reference external" href="../topic/packaging/">Packaging</a></dd> <dt class="field-odd">Created<span class="colon">:</span></dt> <dd class="field-odd">06-Jun-2023</dd> <dt class="field-even">Post-History<span class="colon">:</span></dt> <dd class="field-even"><a class="reference external" href="https://discuss.python.org/t/27471" title="Discourse thread">06-Jun-2023</a></dd> <dt class="field-odd">Resolution<span class="colon">:</span></dt> <dd class="field-odd"><a class="reference external" href="https://discuss.python.org/t/27471/19">27-Jun-2023</a></dd> </dl> <hr class="docutils" /> <section id="contents"> <details><summary>Table of Contents</summary><ul class="simple"> <li><a class="reference internal" href="#abstract">Abstract</a></li> <li><a class="reference internal" href="#motivation">Motivation</a></li> <li><a class="reference internal" href="#rationale">Rationale</a></li> <li><a class="reference internal" href="#specification">Specification</a><ul> <li><a class="reference internal" href="#servers">Servers</a></li> <li><a class="reference internal" href="#clients">Clients</a></li> </ul> </li> <li><a class="reference internal" href="#backwards-compatibility">Backwards Compatibility</a></li> <li><a class="reference internal" href="#rejected-ideas">Rejected Ideas</a><ul> <li><a class="reference internal" href="#leave-the-spec-unchanged-and-cope-with-fixing-in-pypi-and-or-pip">Leave the spec unchanged, and cope with fixing in PyPI and/or pip</a><ul> <li><a class="reference internal" href="#mitigation-special-case-pip">Mitigation: Special Case pip</a></li> <li><a class="reference internal" href="#mitigation-have-the-server-use-user-agent-detection">Mitigation: Have the server use User-Agent Detection</a></li> </ul> </li> <li><a class="reference internal" href="#only-change-the-json-key">Only change the JSON key</a></li> </ul> </li> <li><a class="reference internal" href="#recommendations">Recommendations</a><ul> <li><a class="reference internal" href="#id1">Servers</a></li> <li><a class="reference internal" href="#id2">Clients</a></li> </ul> </li> <li><a class="reference internal" href="#copyright">Copyright</a></li> </ul> </details></section> <section id="abstract"> <h2><a class="toc-backref" href="#abstract" role="doc-backlink">Abstract</a></h2> <p>This PEP renames the metadata provided by <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> in both HTML and JSON formats of the Simple API and provides guidelines for both clients and servers in how to handle the renaming.</p> </section> <section id="motivation"> <h2><a class="toc-backref" href="#motivation" role="doc-backlink">Motivation</a></h2> <p><a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> specified a mechanism to host the core metadata files from an artifact available through the Simple API such that a client could fetch the metadata and use it without having to download the entire artifact. Later <a class="pep reference internal" href="../pep-0691/" title="PEP 691 – JSON-based Simple API for Python Package Indexes">PEP 691</a> was written to add the ability to use JSON rather than HTML on the Simple API, which included support for the <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata.</p> <p>Unfortunately, PyPI did not support <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> until just <a class="reference external" href="https://github.com/pypi/warehouse/pull/13649">recently</a>, which released with a <a class="reference external" href="https://github.com/pypi/warehouse/issues/13705">bug</a> where the <code class="docutils literal notranslate"><span class="pre">dist-info-metadata</span></code> key from <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> was incorrectly named in the JSON representation, to be <code class="docutils literal notranslate"><span class="pre">data-dist-info-metadata</span></code>. However, when attempting to fix that bug, it was discovered that pip <em>also</em> had a <a class="reference external" href="https://github.com/pypa/pip/issues/12042">bug</a>, where any use of <code class="docutils literal notranslate"><span class="pre">dist-info-metadata</span></code> in the JSON representation would cause pip to hard fail with an exception.</p> <p>The bug in pip has existed since at least <code class="docutils literal notranslate"><span class="pre">v22.3</span></code>, which means that it has been released for approximately 8 months, long enough to have been pulled into Python releases, downstream Linux releases, baked into containers, virtual environments, etc.</p> <p>This puts us in an awkward position of having a bug on PyPI that cannot be fixed without breaking pip, due to a bug in pip, but that version of pip is old enough to have been widely deployed. To make matters worse, a version of pip that is broken in this way cannot install <em>anything</em> from PyPI once it fixes its bug, including installing a new, fixed version of pip.</p> </section> <section id="rationale"> <h2><a class="toc-backref" href="#rationale" role="doc-backlink">Rationale</a></h2> <p>There are 3 main options for a path forward for fixing these bugs:</p> <ol class="arabic simple"> <li>Do not change the spec, fix the bug in pip, wait some amount of time, then fix the bug in PyPI, breaking anyone using an unfixed pip such that they cannot even install a new pip from PyPI.</li> <li>Do the same as (1), but special case PyPI so it does not emit the <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata for pip, even if it is available. This allows people to upgrade pip if they’re on a broken version, but nothing else.</li> <li>Change the spec to avoid the key that pip can’t handle currently, allowing PyPI to emit that key and a new version of pip to be released to take advantage of that key.</li> </ol> <p>This PEP chooses (3), but goes a little further and also renames the key in the HTML representation.</p> <p>Typically we do not change specs because of bugs that only affect one particular implementation, unless the spec itself is at fault, which isn’t the case here: the spec is fine and these are just genuine bugs in pip and PyPI.</p> <p>However, we choose to do this for 4 reasons:</p> <ol class="arabic simple"> <li>Bugs that affect pip and PyPI together represent an outsized amount of impact compared to any other client or repository combination.</li> <li>The impact of being broken is that installs do not function, at all, rather than degrading gracefully in some way.</li> <li>The feature that is being blocked by these bugs is of large importance to the ability to quickly and efficiently resolve dependencies from PyPI with pip, and having to delay it for a long period of time while we wait for the broken versions of pip to fall out of use would be of detriment to the entire ecosystem.</li> <li>The downsides of changing the spec are fairly limited, given that we do not believe that support for this is widespread, so it affects only a limited number of projects.</li> </ol> </section> <section id="specification"> <h2><a class="toc-backref" href="#specification" role="doc-backlink">Specification</a></h2> <p>The keywords “<strong>MUST</strong>”, “<strong>MUST NOT</strong>”, “<strong>REQUIRED</strong>”, “<strong>SHALL</strong>”, “<strong>SHALL NOT</strong>”, “<strong>SHOULD</strong>”, “<strong>SHOULD NOT</strong>”, “<strong>RECOMMENDED</strong>”, “<strong>MAY</strong>”, and “<strong>OPTIONAL</strong>”” in this document are to be interpreted as described in <span class="target" id="index-0"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc2119.html"><strong>RFC 2119</strong></a>.</p> <section id="servers"> <h3><a class="toc-backref" href="#servers" role="doc-backlink">Servers</a></h3> <p>The <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata, when used in the HTML representation of the Simple API, <strong>MUST</strong> be emitted using the attribute name <code class="docutils literal notranslate"><span class="pre">data-core-metadata</span></code>, with the supported values remaining the same.</p> <p>The <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata, when used in the <a class="pep reference internal" href="../pep-0691/" title="PEP 691 – JSON-based Simple API for Python Package Indexes">PEP 691</a> JSON representation of the Simple API, <strong>MUST</strong> be emitted using the key <code class="docutils literal notranslate"><span class="pre">core-metadata</span></code>, with the supported values remaining the same.</p> <p>To support clients that used the previous key names, the HTML representation <strong>MAY</strong> also be emitted using the <code class="docutils literal notranslate"><span class="pre">data-dist-info-metadata</span></code>, and if it does so it <strong>MUST</strong> match the value of <code class="docutils literal notranslate"><span class="pre">data-core-metadata</span></code>.</p> </section> <section id="clients"> <h3><a class="toc-backref" href="#clients" role="doc-backlink">Clients</a></h3> <p>Clients consuming any of the HTML representations of the Simple API <strong>MUST</strong> read the <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata from the key <code class="docutils literal notranslate"><span class="pre">data-core-metadata</span></code> if it is present. They <strong>MAY</strong> optionally use the legacy <code class="docutils literal notranslate"><span class="pre">data-dist-info-metadata</span></code> if it is present but <code class="docutils literal notranslate"><span class="pre">data-core-metadata</span></code> is not.</p> <p>Clients consuming the JSON representation of the Simple API <strong>MUST</strong> read the <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata from the key <code class="docutils literal notranslate"><span class="pre">core-metadata</span></code> if it is present. They <strong>MAY</strong> optionally use the legacy <code class="docutils literal notranslate"><span class="pre">dist-info-metadata</span></code> key if it is present but <code class="docutils literal notranslate"><span class="pre">core-metadata</span></code> is not.</p> </section> </section> <section id="backwards-compatibility"> <h2><a class="toc-backref" href="#backwards-compatibility" role="doc-backlink">Backwards Compatibility</a></h2> <p>There is a minor compatibility break in this PEP, in that clients that currently correctly handle the existing metadata keys will not automatically understand the newer metadata keys, but they should degrade gracefully, and simply act as if the <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata does not exist.</p> <p>Otherwise there should be no compatibility problems with this PEP.</p> </section> <section id="rejected-ideas"> <h2><a class="toc-backref" href="#rejected-ideas" role="doc-backlink">Rejected Ideas</a></h2> <section id="leave-the-spec-unchanged-and-cope-with-fixing-in-pypi-and-or-pip"> <h3><a class="toc-backref" href="#leave-the-spec-unchanged-and-cope-with-fixing-in-pypi-and-or-pip" role="doc-backlink">Leave the spec unchanged, and cope with fixing in PyPI and/or pip</a></h3> <p>We believe that the improvements brought by <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> are very important to improving the performance of resolving dependencies from PyPI, and would like to be able to deploy it as quickly as we can.</p> <p>Unfortunately the nature of these bugs is that we cannot deploy them as is without breaking widely deployed and used versions of pip. The breakages in this case would be bad enough that affected users would not even be able to directly upgrade their version of pip to fix it, but would have to manually fetch pip another way first (e.g. <code class="docutils literal notranslate"><span class="pre">get-pip.py</span></code>).</p> <p>This is something that PyPI would be unwilling to do without some way to mitigate those breakages for those users. Without some reasonable mitigation strategy, we would have to wait until those versions of pip are no longer in use on PyPI, which would likely be 5+ years from now.</p> <p>There are a few possible mitigation strategies that we could use, but we’ve rejected them as well.</p> <section id="mitigation-special-case-pip"> <h4><a class="toc-backref" href="#mitigation-special-case-pip" role="doc-backlink">Mitigation: Special Case pip</a></h4> <p>The breakages are particularly bad in that it prevents users from even upgrading pip to get an unbroken version of pip, so a command like <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">--upgrade</span> <span class="pre">pip</span></code> would fail. We could mitigate this by having PyPI special case pip itself, so that the JSON endpoint never returns the <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata and the above still works.</p> <p>This PEP rejects this idea because while the simple command that only upgrades pip would work, if the user included <em>anything</em> else in that command to upgrade then the command would go back to failing, which we consider to be still too large of a breakage.</p> <p>Additionally, while this bug happens to be getting exposed right now with PyPI, it is really a bug that would happen with any <a class="pep reference internal" href="../pep-0691/" title="PEP 691 – JSON-based Simple API for Python Package Indexes">PEP 691</a> repository that correctly exposed the <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata. This would mean that every repository would have to carry this special case for pip.</p> </section> <section id="mitigation-have-the-server-use-user-agent-detection"> <h4><a class="toc-backref" href="#mitigation-have-the-server-use-user-agent-detection" role="doc-backlink">Mitigation: Have the server use User-Agent Detection</a></h4> <p>pip puts its version number into its <code class="docutils literal notranslate"><span class="pre">User-Agent</span></code>, which means that the server could detect the version number and serve different responses based on that version number so that we don’t serve the <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> metadata to versions of pip that are broken.</p> <p>This PEP rejects this idea because supporting <code class="docutils literal notranslate"><span class="pre">User-Agent</span></code> detection is too difficult to implement in a reasonable way.</p> <ol class="arabic simple"> <li>On PyPI we rely heavily on caching the Simple API in our CDN. If we varied the responses based on <code class="docutils literal notranslate"><span class="pre">User-Agent</span></code>, then our CDN cache would have an explosion of cache keys for the same content, which would make it more likely that any particular request would not be cached and fall back to hitting our backend servers, which would have to scale much higher to support the load.</li> <li>PyPI <em>could</em> support the <code class="docutils literal notranslate"><span class="pre">User-Agent</span></code> detection idea by mutating the <code class="docutils literal notranslate"><span class="pre">Accept</span></code> header of the request so that those versions appear to only accept the HTML version, allowing us to maintain the CDNs cache keys. This doesn’t affect any downstream caches of PyPI though, including pip’s HTTP cache which would possibly have JSON versions cached for those requests and we wouldn’t emit a <code class="docutils literal notranslate"><span class="pre">Vary</span></code> on <code class="docutils literal notranslate"><span class="pre">User-Agent</span></code> for them to know that it isn’t acceptable to share those caches, and adding a <code class="docutils literal notranslate"><span class="pre">Vary:</span> <span class="pre">User-Agent</span></code> for downstream caches would have the same problem as (1), but for downstream caches instead of our CDN cache.</li> <li>The pip bug ultimately isn’t PyPI specific, it affects any repository that implements <a class="pep reference internal" href="../pep-0691/" title="PEP 691 – JSON-based Simple API for Python Package Indexes">PEP 691</a> and <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> together. This would mean that workarounds that rely on implementation specific fixes have to be replicated for each repository that implements both, which may not be easy or possible in all cases (static mirrors may not be able to do this <code class="docutils literal notranslate"><span class="pre">User-Agent</span></code> detection for instance).</li> </ol> </section> </section> <section id="only-change-the-json-key"> <h3><a class="toc-backref" href="#only-change-the-json-key" role="doc-backlink">Only change the JSON key</a></h3> <p>The bug in pip only affects the JSON representation of the Simple API, so we only <em>need</em> to actually change the key in the JSON, and we could leave the existing HTML keys alone.</p> <p>This PEP rejects doing that because we believe that in the long term, having the HTML and JSON key names diverge would make mistakes like this more likely and make implementing and understanding the spec more confusing.</p> <p>The main reason that we would want to not change the HTML keys is to not lose <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> support in any HTML only clients or repositories that might already support it. This PEP mitigates that breakage by allowing both clients and servers to continue to support both keys, with a recommendation of when and how to do that.</p> </section> </section> <section id="recommendations"> <h2><a class="toc-backref" href="#recommendations" role="doc-backlink">Recommendations</a></h2> <p>The recommendations in this section, other than this notice itself, are non-normative, and represent what the PEP authors believe to be the best default implementation decisions for something implementing this PEP, but it does not represent any sort of requirement to match these decisions.</p> <section id="id1"> <h3><a class="toc-backref" href="#id1" role="doc-backlink">Servers</a></h3> <p>We recommend that servers <em>only</em> emit the newer keys, particularly for the JSON representation of the Simple API since the bug itself only affected JSON.</p> <p>Servers that wish to support <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> in clients that use HTML and have it implemented, can safely emit both keys <em>only</em> in HTML.</p> <p>Servers should not emit the old keys in JSON unless they know that no broken versions of pip will be used to access their server.</p> </section> <section id="id2"> <h3><a class="toc-backref" href="#id2" role="doc-backlink">Clients</a></h3> <p>We recommend that clients support both keys, for both HTML and JSON, preferring the newer key as this PEP requires. This will allow clients to support repositories that already have correctly implemented <a class="pep reference internal" href="../pep-0658/" title="PEP 658 – Serve Distribution Metadata in the Simple Repository API">PEP 658</a> and <a class="pep reference internal" href="../pep-0691/" title="PEP 691 – JSON-based Simple API for Python Package Indexes">PEP 691</a> but have not implemented this PEP.</p> </section> </section> <section id="copyright"> <h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2> <p>This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.</p> </section> </section> <hr class="docutils" /> <p>Source: <a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0714.rst">https://github.com/python/peps/blob/main/peps/pep-0714.rst</a></p> <p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0714.rst">2024-10-17 12:49:39 GMT</a></p> </article> <nav id="pep-sidebar"> <h2>Contents</h2> <ul> <li><a class="reference internal" href="#abstract">Abstract</a></li> <li><a class="reference internal" href="#motivation">Motivation</a></li> <li><a class="reference internal" href="#rationale">Rationale</a></li> <li><a class="reference internal" href="#specification">Specification</a><ul> <li><a class="reference internal" href="#servers">Servers</a></li> <li><a class="reference internal" href="#clients">Clients</a></li> </ul> </li> <li><a class="reference internal" href="#backwards-compatibility">Backwards Compatibility</a></li> <li><a class="reference internal" href="#rejected-ideas">Rejected Ideas</a><ul> <li><a class="reference internal" href="#leave-the-spec-unchanged-and-cope-with-fixing-in-pypi-and-or-pip">Leave the spec unchanged, and cope with fixing in PyPI and/or pip</a><ul> <li><a class="reference internal" href="#mitigation-special-case-pip">Mitigation: Special Case pip</a></li> <li><a class="reference internal" href="#mitigation-have-the-server-use-user-agent-detection">Mitigation: Have the server use User-Agent Detection</a></li> </ul> </li> <li><a class="reference internal" href="#only-change-the-json-key">Only change the JSON key</a></li> </ul> </li> <li><a class="reference internal" href="#recommendations">Recommendations</a><ul> <li><a class="reference internal" href="#id1">Servers</a></li> <li><a class="reference internal" href="#id2">Clients</a></li> </ul> </li> <li><a class="reference internal" href="#copyright">Copyright</a></li> </ul> <br> <a id="source" href="https://github.com/python/peps/blob/main/peps/pep-0714.rst">Page Source (GitHub)</a> </nav> </section> <script src="../_static/colour_scheme.js"></script> <script src="../_static/wrap_tables.js"></script> <script src="../_static/sticky_banner.js"></script> </body> </html>