Merge "packaging: Remove support for pyN requirement files"
This commit is contained in:
commit
32bfe7808f
|
@ -204,14 +204,16 @@ for your project and will then parse these files, split them up appropriately,
|
||||||
and inject them into the ``install_requires``, ``tests_require`` and/or
|
and inject them into the ``install_requires``, ``tests_require`` and/or
|
||||||
``dependency_links`` arguments to ``setup``. Voila!
|
``dependency_links`` arguments to ``setup``. Voila!
|
||||||
|
|
||||||
You can also have a requirement file for each specific major version of Python.
|
|
||||||
If you want to have a different package list for Python 3 then just drop a
|
|
||||||
``requirements-py3.txt`` and it will be used instead.
|
|
||||||
|
|
||||||
Finally, it is possible to specify groups of optional dependencies, or
|
Finally, it is possible to specify groups of optional dependencies, or
|
||||||
:ref:`"extra" requirements <extra-requirements>`, in your ``setup.cfg`` rather
|
:ref:`"extra" requirements <extra-requirements>`, in your ``setup.cfg`` rather
|
||||||
than ``setup.py``.
|
than ``setup.py``.
|
||||||
|
|
||||||
|
.. versionchanged:: 5.0
|
||||||
|
|
||||||
|
Previously you could specify requirements for a given major version of
|
||||||
|
Python using requirments files with a ``-pyN`` suffix. This was deprecated
|
||||||
|
in 4.0 and removed in 5.0 in favour of environment markers.
|
||||||
|
|
||||||
Automatic File Generation
|
Automatic File Generation
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
|
|
|
@ -382,20 +382,18 @@ Requirements
|
||||||
|
|
||||||
Requirements files are used in place of the ``install_requires`` and
|
Requirements files are used in place of the ``install_requires`` and
|
||||||
``extras_require`` attributes. Requirement files should be given one of the
|
``extras_require`` attributes. Requirement files should be given one of the
|
||||||
below names. This order is also the order that the requirements are tried in
|
below names. This order is also the order that the requirements are tried in:
|
||||||
(where ``N`` is the Python major version number used to install the package):
|
|
||||||
|
|
||||||
* ``requirements-pyN.txt``
|
|
||||||
* ``tools/pip-requires-py3``
|
|
||||||
* ``requirements.txt``
|
* ``requirements.txt``
|
||||||
* ``tools/pip-requires``
|
* ``tools/pip-requires``
|
||||||
|
|
||||||
Only the first file found is used to install the list of packages it contains.
|
Only the first file found is used to install the list of packages it contains.
|
||||||
|
|
||||||
.. note::
|
.. versionchanged:: 5.0
|
||||||
|
|
||||||
The ``requirements-pyN.txt`` file is deprecated - ``requirements.txt``
|
Previously you could specify requirements for a given major version of
|
||||||
should be universal. You can use `Environment markers`_ for this purpose.
|
Python using requirements files with a ``-pyN`` suffix. This was deprecated
|
||||||
|
in 4.0 and removed in 5.0 in favour of environment markers.
|
||||||
|
|
||||||
.. _extra-requirements:
|
.. _extra-requirements:
|
||||||
|
|
||||||
|
|
|
@ -81,14 +81,16 @@ def _any_existing(file_list):
|
||||||
def get_reqs_from_files(requirements_files):
|
def get_reqs_from_files(requirements_files):
|
||||||
existing = _any_existing(requirements_files)
|
existing = _any_existing(requirements_files)
|
||||||
|
|
||||||
|
# TODO(stephenfin): Remove this in pbr 6.0+
|
||||||
deprecated = [f for f in existing if f in PY_REQUIREMENTS_FILES]
|
deprecated = [f for f in existing if f in PY_REQUIREMENTS_FILES]
|
||||||
if deprecated:
|
if deprecated:
|
||||||
warnings.warn('Support for \'-pyN\'-suffixed requirements files is '
|
warnings.warn('Support for \'-pyN\'-suffixed requirements files is '
|
||||||
'deprecated in pbr 4.0 and will be removed in 5.0. '
|
'removed in pbr 5.0 and these files are now ignored. '
|
||||||
'Use environment markers instead. Conflicting files: '
|
'Use environment markers instead. Conflicting files: '
|
||||||
'%r' % deprecated,
|
'%r' % deprecated,
|
||||||
DeprecationWarning)
|
DeprecationWarning)
|
||||||
|
|
||||||
|
existing = [f for f in existing if f not in PY_REQUIREMENTS_FILES]
|
||||||
for requirements_file in existing:
|
for requirements_file in existing:
|
||||||
with open(requirements_file, 'r') as fil:
|
with open(requirements_file, 'r') as fil:
|
||||||
return fil.read().split('\n')
|
return fil.read().split('\n')
|
||||||
|
|
|
@ -43,7 +43,6 @@ import email.errors
|
||||||
import imp
|
import imp
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
|
||||||
import sysconfig
|
import sysconfig
|
||||||
import tempfile
|
import tempfile
|
||||||
import textwrap
|
import textwrap
|
||||||
|
@ -549,28 +548,6 @@ class ParseRequirementsTest(base.BaseTestCase):
|
||||||
result = packaging.parse_requirements([requirements])
|
result = packaging.parse_requirements([requirements])
|
||||||
self.assertEqual(['pbr'], result)
|
self.assertEqual(['pbr'], result)
|
||||||
|
|
||||||
@mock.patch('warnings.warn')
|
|
||||||
def test_python_version(self, mock_warn):
|
|
||||||
with open("requirements-py%d.txt" % sys.version_info[0],
|
|
||||||
"w") as fh:
|
|
||||||
fh.write("# this is a comment\nfoobar\n# and another one\nfoobaz")
|
|
||||||
self.assertEqual(['foobar', 'foobaz'],
|
|
||||||
packaging.parse_requirements())
|
|
||||||
mock_warn.assert_called_once_with(mock.ANY, DeprecationWarning)
|
|
||||||
|
|
||||||
@mock.patch('warnings.warn')
|
|
||||||
def test_python_version_multiple_options(self, mock_warn):
|
|
||||||
with open("requirements-py1.txt", "w") as fh:
|
|
||||||
fh.write("thisisatrap")
|
|
||||||
with open("requirements-py%d.txt" % sys.version_info[0],
|
|
||||||
"w") as fh:
|
|
||||||
fh.write("# this is a comment\nfoobar\n# and another one\nfoobaz")
|
|
||||||
self.assertEqual(['foobar', 'foobaz'],
|
|
||||||
packaging.parse_requirements())
|
|
||||||
# even though we have multiple offending files, this should only be
|
|
||||||
# called once
|
|
||||||
mock_warn.assert_called_once_with(mock.ANY, DeprecationWarning)
|
|
||||||
|
|
||||||
|
|
||||||
class ParseRequirementsTestScenarios(base.BaseTestCase):
|
class ParseRequirementsTestScenarios(base.BaseTestCase):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue