diff --git a/pbr/packaging.py b/pbr/packaging.py index 01774373..38b4982f 100644 --- a/pbr/packaging.py +++ b/pbr/packaging.py @@ -46,6 +46,8 @@ from pbr import testr_command from pbr import version REQUIREMENTS_FILES = ('requirements.txt', 'tools/pip-requires') +PY_REQUIREMENTS_FILES = [x % sys.version_info[0] for x in ( + 'requirements-py%d.txt', 'tools/pip-requires-py%d')] TEST_REQUIREMENTS_FILES = ('test-requirements.txt', 'tools/test-requires') @@ -57,9 +59,8 @@ def get_requirements_files(): # - REQUIREMENTS_FILES with -py2 or -py3 in the name # (e.g. requirements-py3.txt) # - REQUIREMENTS_FILES - return (list(map(('-py' + str(sys.version_info[0])).join, - map(os.path.splitext, REQUIREMENTS_FILES))) - + list(REQUIREMENTS_FILES)) + + return PY_REQUIREMENTS_FILES + list(REQUIREMENTS_FILES) def append_text_list(config, key, text_list): @@ -78,9 +79,20 @@ def _any_existing(file_list): # Get requirements from the first file that exists def get_reqs_from_files(requirements_files): - for requirements_file in _any_existing(requirements_files): + existing = _any_existing(requirements_files) + + deprecated = [f for f in existing if f in PY_REQUIREMENTS_FILES] + if deprecated: + warnings.warn('Support for \'-pyN\'-suffixed requirements files is ' + 'deprecated in pbr 4.0 and will be removed in 5.0. ' + 'Use environment markers instead. Conflicting files: ' + '%r' % deprecated, + DeprecationWarning) + + for requirements_file in existing: with open(requirements_file, 'r') as fil: return fil.read().split('\n') + return [] diff --git a/pbr/tests/test_packaging.py b/pbr/tests/test_packaging.py index 526e12d3..da221d71 100644 --- a/pbr/tests/test_packaging.py +++ b/pbr/tests/test_packaging.py @@ -549,14 +549,17 @@ class ParseRequirementsTest(base.BaseTestCase): result = packaging.parse_requirements([requirements]) self.assertEqual(['pbr'], result) - def test_python_version(self): + @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) - def test_python_version_multiple_options(self): + @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], @@ -564,6 +567,9 @@ class ParseRequirementsTest(base.BaseTestCase): 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): diff --git a/releasenotes/notes/deprecate-pyN-requirements-364655c38fa5b780.yaml b/releasenotes/notes/deprecate-pyN-requirements-364655c38fa5b780.yaml new file mode 100644 index 00000000..3ed9bc70 --- /dev/null +++ b/releasenotes/notes/deprecate-pyN-requirements-364655c38fa5b780.yaml @@ -0,0 +1,5 @@ +--- +deprecations: + - | + Support for ``pyN``-suffixed requirement files has been deprecated: + environment markers should be used instead.