peps/pep-0390/index.html

352 lines
30 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!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 390 Static metadata for Distutils | peps.python.org</title>
<link rel="shortcut icon" href="../_static/py.png">
<link rel="canonical" href="https://peps.python.org/pep-0390/">
<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 390 Static metadata for Distutils | peps.python.org'>
<meta property="og:type" content="website">
<meta property="og:url" content="https://peps.python.org/pep-0390/">
<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="Python Enhancement Proposals (PEPs)">
<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> &raquo; </li>
<li><a href="../pep-0000/">PEP Index</a> &raquo; </li>
<li>PEP 390</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 390 Static metadata for Distutils</h1>
<dl class="rfc2822 field-list simple">
<dt class="field-odd">Author<span class="colon">:</span></dt>
<dd class="field-odd">Tarek Ziadé &lt;tarek&#32;&#97;t&#32;ziade.org&gt;</dd>
<dt class="field-even">BDFL-Delegate<span class="colon">:</span></dt>
<dd class="field-even">Alyssa Coghlan</dd>
<dt class="field-odd">Discussions-To<span class="colon">:</span></dt>
<dd class="field-odd"><a class="reference external" href="https://mail.python.org/archives/list/distutils-sig&#64;python.org/">Distutils-SIG list</a></dd>
<dt class="field-even">Status<span class="colon">:</span></dt>
<dd class="field-even"><abbr title="Formally declined and will not be accepted">Rejected</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">10-Oct-2009</dd>
<dt class="field-even">Python-Version<span class="colon">:</span></dt>
<dd class="field-even">2.7, 3.2</dd>
<dt class="field-odd">Post-History<span class="colon">:</span></dt>
<dd class="field-odd"><p></p></dd>
<dt class="field-even">Resolution<span class="colon">:</span></dt>
<dd class="field-even"><a class="reference external" href="https://mail.python.org/pipermail/distutils-sig/2013-April/020597.html">Distutils-SIG message</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="#rejection-notice">Rejection Notice</a></li>
<li><a class="reference internal" href="#rationale">Rationale</a></li>
<li><a class="reference internal" href="#adding-a-metadata-section-in-setup-cfg">Adding a <code class="docutils literal notranslate"><span class="pre">metadata</span></code> section in <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code></a></li>
<li><a class="reference internal" href="#multi-lines-values">Multi-lines values</a></li>
<li><a class="reference internal" href="#context-dependant-sections">Context-dependant sections</a></li>
<li><a class="reference internal" href="#impact-on-pkg-info-generation-and-pep-314">Impact on PKG-INFO generation and PEP 314</a></li>
<li><a class="reference internal" href="#compatibility">Compatibility</a></li>
<li><a class="reference internal" href="#limitations">Limitations</a></li>
<li><a class="reference internal" href="#acknowledgments">Acknowledgments</a></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 describes a new section and a new format for the <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code> file,
that allows describing the Metadata of a package without using <code class="docutils literal notranslate"><span class="pre">setup.py</span></code>.</p>
</section>
<section id="rejection-notice">
<h2><a class="toc-backref" href="#rejection-notice" role="doc-backlink">Rejection Notice</a></h2>
<p>As distutils2 is no longer going to be incorporated into the standard
library, this PEP was rejected by Alyssa Coghlan in late April, 2013.</p>
<p>A replacement PEP based on <a class="pep reference internal" href="../pep-0426/" title="PEP 426 Metadata for Python Software Packages 2.0">PEP 426</a> (metadata 2.0) will be created that
defines the minimum amount of information needed to generate an sdist
archive given a source tarball or VCS checkout.</p>
</section>
<section id="rationale">
<h2><a class="toc-backref" href="#rationale" role="doc-backlink">Rationale</a></h2>
<p>Today, if you want to list all the Metadata of a distribution (see <a class="pep reference internal" href="../pep-0314/" title="PEP 314 Metadata for Python Software Packages 1.1">PEP 314</a>)
that is not installed, you need to use the <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> command line interface.</p>
<p>So, basically, you download it, and run:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ python setup.py --name
Distribute
$ python setup.py --version
0.6.4
</pre></div>
</div>
<p>Where <code class="docutils literal notranslate"><span class="pre">name</span></code> and <code class="docutils literal notranslate"><span class="pre">version</span></code> are metadata fields. This is working fine but
as soon as the developers add more code in <code class="docutils literal notranslate"><span class="pre">setup.py</span></code>, this feature might
break or in worst cases might do unwanted things on the target system.</p>
<p>Moreover, when an OS packager wants to get the metadata of a distribution
he is re-packaging, he might encounter some problems to understand
the <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> file hes working with.</p>
<p>So the rationale of this PEP is to provide a way to declare the metadata
in a static configuration file alongside <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> that doesnt require
any third party code to run.</p>
</section>
<section id="adding-a-metadata-section-in-setup-cfg">
<h2><a class="toc-backref" href="#adding-a-metadata-section-in-setup-cfg" role="doc-backlink">Adding a <code class="docutils literal notranslate"><span class="pre">metadata</span></code> section in <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code></a></h2>
<p>The first thing we want to introduce is a <code class="docutils literal notranslate"><span class="pre">[metadata]</span></code> section, in the
<code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code> file, that may contain any field from the Metadata:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">metadata</span><span class="p">]</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">Distribute</span>
<span class="n">version</span> <span class="o">=</span> <span class="mf">0.6.4</span>
</pre></div>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code> file is used to avoid adding yet another configuration
file to work with in Distutils.</p>
<p>This file is already read by Distutils when a command is executed, and
if the <code class="docutils literal notranslate"><span class="pre">metadata</span></code> section is found, it will be used to fill the metadata
fields. If an option that corresponds to a Metadata field is given to
<code class="docutils literal notranslate"><span class="pre">setup()</span></code>, it will override the value that was possibly present in
<code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code>.</p>
<p>Notice that <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> is still used and can be required to define some
options that are not part of the Metadata fields. For instance, the
<code class="docutils literal notranslate"><span class="pre">sdist</span></code> command can use options like <code class="docutils literal notranslate"><span class="pre">packages</span></code> or <code class="docutils literal notranslate"><span class="pre">scripts</span></code>.</p>
</section>
<section id="multi-lines-values">
<h2><a class="toc-backref" href="#multi-lines-values" role="doc-backlink">Multi-lines values</a></h2>
<p>Some Metadata fields can have multiple values. To keep <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code> compatible
with <code class="docutils literal notranslate"><span class="pre">ConfigParser</span></code> and the <span class="target" id="index-0"></span><a class="rfc reference external" href="https://datatracker.ietf.org/doc/html/rfc822.html"><strong>RFC 822</strong></a> <code class="docutils literal notranslate"><span class="pre">LONG</span> <span class="pre">HEADER</span> <span class="pre">FIELDS</span></code> (see section 3.1.1),
these are expressed with <code class="docutils literal notranslate"><span class="pre">,</span></code>-separated values:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">requires</span> <span class="o">=</span> <span class="n">pywin32</span><span class="p">,</span> <span class="n">bar</span> <span class="o">&gt;</span> <span class="mf">1.0</span><span class="p">,</span> <span class="n">foo</span>
</pre></div>
</div>
<p>When this variable is read, the values are parsed and transformed into a list:
<code class="docutils literal notranslate"><span class="pre">['pywin32',</span> <span class="pre">'bar</span> <span class="pre">&gt;</span> <span class="pre">1.0',</span> <span class="pre">'foo']</span></code>.</p>
</section>
<section id="context-dependant-sections">
<h2><a class="toc-backref" href="#context-dependant-sections" role="doc-backlink">Context-dependant sections</a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">metadata</span></code> section will also be able to use context-dependant sections.</p>
<p>A context-dependant section is a section with a condition about the execution
environment. Heres some examples:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="n">metadata</span><span class="p">]</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">Distribute</span>
<span class="n">version</span> <span class="o">=</span> <span class="mf">0.6.4</span>
<span class="p">[</span><span class="n">metadata</span><span class="p">:</span><span class="n">sys_platform</span> <span class="o">==</span> <span class="s1">&#39;win32&#39;</span><span class="p">]</span>
<span class="n">requires</span> <span class="o">=</span> <span class="n">pywin32</span><span class="p">,</span> <span class="n">bar</span> <span class="o">&gt;</span> <span class="mf">1.0</span>
<span class="n">obsoletes</span> <span class="o">=</span> <span class="n">pywin31</span>
<span class="p">[</span><span class="n">metadata</span><span class="p">:</span><span class="n">os_machine</span> <span class="o">==</span> <span class="s1">&#39;i386&#39;</span><span class="p">]</span>
<span class="n">requires</span> <span class="o">=</span> <span class="n">foo</span>
<span class="p">[</span><span class="n">metadata</span><span class="p">:</span><span class="n">python_version</span> <span class="o">==</span> <span class="s1">&#39;2.4&#39;</span> <span class="ow">or</span> <span class="n">python_version</span> <span class="o">==</span> <span class="s1">&#39;2.5&#39;</span><span class="p">]</span>
<span class="n">requires</span> <span class="o">=</span> <span class="n">bar</span>
<span class="p">[</span><span class="n">metadata</span><span class="p">:</span><span class="s1">&#39;linux&#39;</span> <span class="ow">in</span> <span class="n">sys_platform</span><span class="p">]</span>
<span class="n">requires</span> <span class="o">=</span> <span class="n">baz</span>
</pre></div>
</div>
<p>Every <code class="docutils literal notranslate"><span class="pre">[metadata:condition]</span></code> section will be used only if the condition
is met when the file is read. The background motivation for these
context-dependant sections is to be able to define requirements that varies
depending on the platform the distribution might be installed on.
(see <a class="pep reference internal" href="../pep-0314/" title="PEP 314 Metadata for Python Software Packages 1.1">PEP 314</a>).</p>
<p>The micro-language behind this is the simplest possible: it compares only
strings, with the <code class="docutils literal notranslate"><span class="pre">==</span></code> and <code class="docutils literal notranslate"><span class="pre">in</span></code> operators (and their opposites), and
with the ability to combine expressions. It makes it also easy to understand
to non-pythoneers.</p>
<p>The pseudo-grammar is</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">EXPR</span> <span class="p">[</span><span class="ow">in</span><span class="o">|==|!=|</span><span class="ow">not</span> <span class="ow">in</span><span class="p">]</span> <span class="n">EXPR</span> <span class="p">[</span><span class="ow">or</span><span class="o">|</span><span class="ow">and</span><span class="p">]</span> <span class="o">...</span>
</pre></div>
</div>
<p>where <code class="docutils literal notranslate"><span class="pre">EXPR</span></code> belongs to any of those:</p>
<ul class="simple">
<li>python_version = %s.%s % (sys.version_info[0], sys.version_info[1])</li>
<li>os_name = os.name</li>
<li>sys_platform = sys.platform</li>
<li>platform_version = platform.version()</li>
<li>platform_machine = platform.machine()</li>
<li>a free string, like <code class="docutils literal notranslate"><span class="pre">2.4</span></code>, or <code class="docutils literal notranslate"><span class="pre">win32</span></code></li>
</ul>
<p>Notice that <code class="docutils literal notranslate"><span class="pre">in</span></code> is restricted to strings, meaning that it is not possible
to use other sequences like tuples or lists on the right side.</p>
<p>Distutils will provide a function that is able to generate the metadata
of a distribution, given a <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code> file, for the execution environment:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">distutils.util</span> <span class="kn">import</span> <span class="n">local_metadata</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">local_metadata</span><span class="p">(</span><span class="s1">&#39;setup.cfg&#39;</span><span class="p">)</span>
<span class="go">&lt;DistributionMetadata instance&gt;</span>
</pre></div>
</div>
<p>This means that a vanilla Python will be able to read the metadata of a
package without running any third party code.</p>
<p>Notice that this feature is not restricted to the <code class="docutils literal notranslate"><span class="pre">metadata</span></code> namespace.
Consequently, any other section can be extended with such context-dependant
sections.</p>
</section>
<section id="impact-on-pkg-info-generation-and-pep-314">
<h2><a class="toc-backref" href="#impact-on-pkg-info-generation-and-pep-314" role="doc-backlink">Impact on PKG-INFO generation and PEP 314</a></h2>
<p>When <code class="docutils literal notranslate"><span class="pre">PKG-INFO</span></code> is generated by Distutils, every field that relies on a
condition will have that condition written at the end of the line, after a
<code class="docutils literal notranslate"><span class="pre">;</span></code> separator:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Metadata</span><span class="o">-</span><span class="n">Version</span><span class="p">:</span> <span class="mf">1.2</span>
<span class="n">Name</span><span class="p">:</span> <span class="n">distribute</span>
<span class="n">Version</span><span class="p">:</span> <span class="mf">0.6.4</span>
<span class="o">...</span>
<span class="n">Requires</span><span class="p">:</span> <span class="n">pywin32</span><span class="p">,</span> <span class="n">bar</span> <span class="o">&gt;</span> <span class="mf">1.0</span><span class="p">;</span> <span class="n">sys_platform</span> <span class="o">==</span> <span class="s1">&#39;win32&#39;</span>
<span class="n">Requires</span><span class="p">:</span> <span class="n">foo</span><span class="p">;</span> <span class="n">os_machine</span> <span class="o">==</span> <span class="s1">&#39;i386&#39;</span>
<span class="n">Requires</span><span class="p">:</span> <span class="n">bar</span><span class="p">;</span> <span class="n">python_version</span> <span class="o">==</span> <span class="s1">&#39;2.4&#39;</span> <span class="ow">or</span> <span class="n">python_version</span> <span class="o">==</span> <span class="s1">&#39;2.5&#39;</span>
<span class="n">Requires</span><span class="p">:</span> <span class="n">baz</span><span class="p">;</span> <span class="s1">&#39;linux&#39;</span> <span class="ow">in</span> <span class="n">sys_platform</span>
<span class="n">Obsoletes</span> <span class="o">=</span> <span class="n">pywin31</span><span class="p">;</span> <span class="n">sys_platform</span> <span class="o">==</span> <span class="s1">&#39;win32&#39;</span>
<span class="o">...</span>
<span class="n">Classifier</span><span class="p">:</span> <span class="n">Development</span> <span class="n">Status</span> <span class="p">::</span> <span class="mi">5</span> <span class="o">-</span> <span class="n">Production</span><span class="o">/</span><span class="n">Stable</span>
<span class="n">Classifier</span><span class="p">:</span> <span class="n">Intended</span> <span class="n">Audience</span> <span class="p">::</span> <span class="n">Developers</span>
<span class="n">Classifier</span><span class="p">:</span> <span class="n">License</span> <span class="p">::</span> <span class="n">OSI</span> <span class="n">Approved</span> <span class="p">::</span> <span class="n">Python</span> <span class="n">Software</span> <span class="n">Foundation</span> <span class="n">License</span>
</pre></div>
</div>
<p>Notice that this file can be opened with the <code class="docutils literal notranslate"><span class="pre">DistributionMetadata</span></code> class.
This class will be able to use the micro-language using the execution
environment.</p>
<p>Lets run in on a <code class="docutils literal notranslate"><span class="pre">Python</span> <span class="pre">2.5</span> <span class="pre">i386</span> <span class="pre">Linux</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">distutils.dist</span> <span class="kn">import</span> <span class="n">DistributionMetadata</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">metadata</span> <span class="o">=</span> <span class="n">DistributionMetadata</span><span class="p">(</span><span class="s1">&#39;PKG_INFO&#39;</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">metadata</span><span class="o">.</span><span class="n">get_requires</span><span class="p">()</span>
<span class="go">[&#39;foo&#39;, &#39;bar&#39;, &#39;baz&#39;]</span>
</pre></div>
</div>
<p>The execution environment can be overridden in case we want to get the metadata
for another environment:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">env</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;python_version&#39;</span><span class="p">:</span> <span class="s1">&#39;2.4&#39;</span><span class="p">,</span>
<span class="gp">... </span> <span class="s1">&#39;os_name&#39;</span><span class="p">:</span> <span class="s1">&#39;nt&#39;</span><span class="p">,</span>
<span class="gp">... </span> <span class="s1">&#39;sys_platform&#39;</span><span class="p">:</span> <span class="s1">&#39;win32&#39;</span><span class="p">,</span>
<span class="gp">... </span> <span class="s1">&#39;platform_version&#39;</span><span class="p">:</span> <span class="s1">&#39;MVCC++ 6.0&#39;</span>
<span class="gp">... </span> <span class="s1">&#39;platform_machine&#39;</span><span class="p">:</span> <span class="s1">&#39;i386&#39;</span><span class="p">}</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">metadata</span> <span class="o">=</span> <span class="n">DistributionMetadata</span><span class="p">(</span><span class="s1">&#39;PKG_INFO&#39;</span><span class="p">,</span> <span class="n">environment</span><span class="o">=</span><span class="n">env</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">metadata</span><span class="o">.</span><span class="n">get_requires</span><span class="p">()</span>
<span class="go">[&#39;bar &gt; 1.0&#39;, &#39;foo&#39;, &#39;bar&#39;]</span>
</pre></div>
</div>
<p><a class="pep reference internal" href="../pep-0314/" title="PEP 314 Metadata for Python Software Packages 1.1">PEP 314</a> is changed accordingly, meaning that each field will be able to
have that extra condition marker.</p>
</section>
<section id="compatibility">
<h2><a class="toc-backref" href="#compatibility" role="doc-backlink">Compatibility</a></h2>
<p>This change is based on a new metadata <code class="docutils literal notranslate"><span class="pre">1.2</span></code> format meaning that
Distutils will be able to distinguish old PKG-INFO files from new ones.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code> file change will stay <code class="docutils literal notranslate"><span class="pre">ConfigParser</span></code>-compatible and
will not break existing <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code> files.</p>
</section>
<section id="limitations">
<h2><a class="toc-backref" href="#limitations" role="doc-backlink">Limitations</a></h2>
<p>We are not providing <code class="docutils literal notranslate"><span class="pre">&lt;</span></code> and <code class="docutils literal notranslate"><span class="pre">&gt;</span></code> operators at this time, and
<code class="docutils literal notranslate"><span class="pre">python_version</span></code> is a regular string. This implies using <code class="docutils literal notranslate"><span class="pre">or</span></code> operators
when a section needs to be restricted to a couple of Python versions.
Although, if <a class="pep reference internal" href="../pep-0386/" title="PEP 386 Changing the version comparison module in Distutils">PEP 386</a> is accepted, <code class="docutils literal notranslate"><span class="pre">python_version</span></code> could be changed
internally into something comparable with strings, and
<code class="docutils literal notranslate"><span class="pre">&lt;</span></code> and <code class="docutils literal notranslate"><span class="pre">&gt;</span></code> operators introduced.</p>
<p>Last, if a distribution is unable to set all metadata fields in <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code>,
thats fine, the fields will be set to <code class="docutils literal notranslate"><span class="pre">UNKNOWN</span></code> when <code class="docutils literal notranslate"><span class="pre">local_metadata</span></code> is
called. Getting <code class="docutils literal notranslate"><span class="pre">UNKNOWN</span></code> values will mean that it might be necessary to
run the <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> command line interface to get the whole set of metadata.</p>
</section>
<section id="acknowledgments">
<h2><a class="toc-backref" href="#acknowledgments" role="doc-backlink">Acknowledgments</a></h2>
<p>The Distutils-SIG.</p>
</section>
<section id="copyright">
<h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2>
<p>This document has been placed in the public domain.</p>
</section>
</section>
<hr class="docutils" />
<p>Source: <a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0390.rst">https://github.com/python/peps/blob/main/peps/pep-0390.rst</a></p>
<p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0390.rst">2023-10-11 12:05:51 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="#rejection-notice">Rejection Notice</a></li>
<li><a class="reference internal" href="#rationale">Rationale</a></li>
<li><a class="reference internal" href="#adding-a-metadata-section-in-setup-cfg">Adding a <code class="docutils literal notranslate"><span class="pre">metadata</span></code> section in <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code></a></li>
<li><a class="reference internal" href="#multi-lines-values">Multi-lines values</a></li>
<li><a class="reference internal" href="#context-dependant-sections">Context-dependant sections</a></li>
<li><a class="reference internal" href="#impact-on-pkg-info-generation-and-pep-314">Impact on PKG-INFO generation and PEP 314</a></li>
<li><a class="reference internal" href="#compatibility">Compatibility</a></li>
<li><a class="reference internal" href="#limitations">Limitations</a></li>
<li><a class="reference internal" href="#acknowledgments">Acknowledgments</a></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-0390.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>