diff --git a/pep-0631.rst b/pep-0631.rst new file mode 100644 index 000000000..962f1eb53 --- /dev/null +++ b/pep-0631.rst @@ -0,0 +1,139 @@ +PEP: 631 +Title: Dependency specification in pyproject.toml based on PEP 508 +Author: Ofek Lev +Sponsor: Paul Ganssle +Discussions-To: https://discuss.python.org/t/5018 +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 20-Aug-2020 +Post-History: 20-Aug-2020 + + +Abstract +======== + +This PEP specifies how to write a project's dependencies in a +``pyproject.toml`` file for packaging-related tools to consume +using the `fields defined in PEP 621`_. + +Entries +======= + +All dependency entries MUST be valid `PEP 508 strings`_. + +Build backends SHOULD abort at load time for any parsing errors. + +:: + + from packaging.requirements import InvalidRequirement, Requirement + + ... + + try: + Requirement(entry) + except InvalidRequirement: + # exit + +Specification +============= + +dependencies +------------ + +- Format: array of strings +- Related core metadata: + + - `Requires-Dist`_ + +Every element must be an `entry <#entries>`_. + +:: + + [project] + dependencies = [ + 'PyYAML ~= 5.0', + 'requests[security] < 3', + 'subprocess32; python_version < "3.2"', + ] + +optional-dependencies +--------------------- + +- Format: table +- Related core metadata: + + - `Provides-Extra`_ + - `Requires-Dist`_ + +Each key is the name of the provided option, with each value being the same type as +the `dependencies <#dependencies>`_ field i.e. an array of strings. + +:: + + [project.optional-dependencies] + tests = [ + 'coverage>=5.0.3', + 'pytest', + 'pytest-benchmark[histogram]>=3.2.1', + ] + +Example +======= + +This is a real-world example port of what `docker-compose`_ defines. + +:: + + [project] + dependencies = [ + 'cached-property >= 1.2.0, < 2', + 'distro >= 1.5.0, < 2', + 'docker[ssh] >= 4.2.2, < 5', + 'dockerpty >= 0.4.1, < 1', + 'docopt >= 0.6.1, < 1', + 'jsonschema >= 2.5.1, < 4', + 'PyYAML >= 3.10, < 6', + 'python-dotenv >= 0.13.0, < 1', + 'requests >= 2.20.0, < 3', + 'texttable >= 0.9.0, < 2', + 'websocket-client >= 0.32.0, < 1', + + # Conditional + 'backports.shutil_get_terminal_size == 1.0.0; python_version < "3.3"', + 'backports.ssl_match_hostname >= 3.5, < 4; python_version < "3.5"', + 'colorama >= 0.4, < 1; sys_platform == "win32"', + 'enum34 >= 1.0.4, < 2; python_version < "3.4"', + 'ipaddress >= 1.0.16, < 2; python_version < "3.3"', + 'subprocess32 >= 3.5.4, < 4; python_version < "3.2"', + ] + + [project.optional-dependencies] + socks = [ 'PySocks >= 1.5.6, != 1.5.7, < 2' ] + tests = [ + 'ddt >= 1.2.2, < 2', + 'pytest < 6', + 'mock >= 1.0.1, < 4; python_version < "3.4"', + ] + +Copyright +========= + +This document is placed in the public domain or under the +CC0-1.0-Universal license, whichever is more permissive. + + +.. _fields defined in PEP 621: https://www.python.org/dev/peps/pep-0621/#dependencies-optional-dependencies +.. _PEP 508 strings: https://www.python.org/dev/peps/pep-0508/ +.. _Requires-Dist: https://packaging.python.org/specifications/core-metadata/#requires-dist-multiple-use +.. _Provides-Extra: https://packaging.python.org/specifications/core-metadata/#provides-extra-multiple-use +.. _docker-compose: https://github.com/docker/compose/blob/789bfb0e8b2e61f15f423d371508b698c64b057f/setup.py#L28-L61 + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: