diff options
-rw-r--r-- | .zuul.yaml | 14 | ||||
-rw-r--r-- | doc/source/contributor/index.rst | 2 | ||||
-rw-r--r-- | doc/source/user/features.rst | 14 | ||||
-rw-r--r-- | doc/source/user/using.rst | 12 | ||||
-rw-r--r-- | lower-constraints.txt | 2 | ||||
-rw-r--r-- | pbr/core.py | 12 | ||||
-rw-r--r-- | pbr/packaging.py | 6 | ||||
-rw-r--r-- | pbr/tests/test_hooks.py | 3 | ||||
-rw-r--r-- | pbr/tests/test_packaging.py | 31 | ||||
-rw-r--r-- | releasenotes/notes/long-descr-content-type-f9a1003acbb8740f.yaml | 6 | ||||
-rw-r--r-- | setup.cfg | 2 | ||||
-rw-r--r-- | test-requirements.txt | 4 | ||||
-rw-r--r-- | tox.ini | 8 |
13 files changed, 60 insertions, 56 deletions
@@ -105,24 +105,20 @@ - project: templates: + - lib-forward-testing + - lib-forward-testing-python3 + - openstack-cover-jobs + - openstack-lower-constraints-jobs - openstack-python-jobs - openstack-python35-jobs - openstack-python36-jobs - - lib-forward-testing - - lib-forward-testing-python3 - - openstack-pypy-jobs-nonvoting - - publish-openstack-docs-pti - periodic-stable-jobs + - publish-openstack-docs-pti check: jobs: - - openstack-tox-lower-constraints - pbr-installation-devstack - pbr-installation-upstream-devstack gate: jobs: - - openstack-tox-lower-constraints - pbr-installation-devstack - pbr-installation-upstream-devstack - post: - jobs: - - openstack-tox-cover diff --git a/doc/source/contributor/index.rst b/doc/source/contributor/index.rst index b7b4a75..95daead 100644 --- a/doc/source/contributor/index.rst +++ b/doc/source/contributor/index.rst @@ -27,7 +27,7 @@ are listed in ``requirements.txt`` and the requirements for testing are in pip install -r requirements.txt -r test-requirements.txt -In you go this route, you can interact with the testr command directly. +If you go this route, you can interact with the testr command directly. Running ``testr run`` will run the entire test suite. ``testr run --parallel`` will run it in parallel (this is the default incantation tox uses). More information about testr can be found at: http://wiki.openstack.org/testr diff --git a/doc/source/user/features.rst b/doc/source/user/features.rst index 80339df..46c9d03 100644 --- a/doc/source/user/features.rst +++ b/doc/source/user/features.rst @@ -181,6 +181,10 @@ probably a good long_description. So we'll just inject the contents of your You can also specify the exact file you want to use using the ``description-file`` parameter. +You can set the ``description-content-type`` to a MIME type that may +help rendering of the description; for example ``text/markdown`` or +``text/x-rst; charset=UTF-8``. + Requirements ~~~~~~~~~~~~ @@ -200,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 ``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 :ref:`"extra" requirements <extra-requirements>`, in your ``setup.cfg`` rather 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 ------------------------- diff --git a/doc/source/user/using.rst b/doc/source/user/using.rst index 2917e92..2e58fee 100644 --- a/doc/source/user/using.rst +++ b/doc/source/user/using.rst @@ -389,20 +389,18 @@ Requirements Requirements files are used in place of the ``install_requires`` and ``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 -(where ``N`` is the Python major version number used to install the package): +below names. This order is also the order that the requirements are tried in: -* ``requirements-pyN.txt`` -* ``tools/pip-requires-py3`` * ``requirements.txt`` * ``tools/pip-requires`` 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`` - should be universal. You can use `Environment markers`_ for this purpose. + Previously you could specify requirements for a given major version of + 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: diff --git a/lower-constraints.txt b/lower-constraints.txt index 44956ce..173a299 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -26,7 +26,7 @@ six==1.10.0 snowballstemmer==1.2.1 Sphinx==1.6.5 sphinxcontrib-websupport==1.0.1 -stestr==2.0.0 +stestr==2.1.0 testrepository==0.0.18 testresources==2.0.0 testscenarios==0.4 diff --git a/pbr/core.py b/pbr/core.py index a93253b..0760ab9 100644 --- a/pbr/core.py +++ b/pbr/core.py @@ -103,6 +103,16 @@ def pbr(dist, attr, value): raise errors.DistutilsSetupError( 'Error parsing %s: %s: %s' % (path, e.__class__.__name__, e)) + + # There are some metadata fields that are only supported by + # setuptools and not distutils, and hence are not in + # dist.metadata. We are OK to write these in. For gory details + # see + # https://github.com/pypa/setuptools/pull/1343 + _DISTUTILS_UNSUPPORTED_METADATA = ( + 'long_description_content_type', 'project_urls', 'provides_extras' + ) + # Repeat some of the Distribution initialization code with the newly # provided attrs if attrs: @@ -115,6 +125,8 @@ def pbr(dist, attr, value): setattr(dist.metadata, key, val) elif hasattr(dist, key): setattr(dist, key, val) + elif key in _DISTUTILS_UNSUPPORTED_METADATA: + setattr(dist.metadata, key, val) else: msg = 'Unknown distribution option: %s' % repr(key) warnings.warn(msg) diff --git a/pbr/packaging.py b/pbr/packaging.py index 210fe95..77a4b22 100644 --- a/pbr/packaging.py +++ b/pbr/packaging.py @@ -81,14 +81,16 @@ def _any_existing(file_list): def get_reqs_from_files(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] if deprecated: 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: ' '%r' % deprecated, DeprecationWarning) + existing = [f for f in existing if f not in PY_REQUIREMENTS_FILES] for requirements_file in existing: with open(requirements_file, 'r') as fil: return fil.read().split('\n') @@ -312,8 +314,6 @@ if __name__ == "__main__": import sys import wsgiref.simple_server as wss - my_ip = socket.gethostbyname(socket.gethostname()) - parser = argparse.ArgumentParser( description=%(import_target)s.__doc__, formatter_class=argparse.ArgumentDefaultsHelpFormatter, diff --git a/pbr/tests/test_hooks.py b/pbr/tests/test_hooks.py index 0fcf96c..3f74790 100644 --- a/pbr/tests/test_hooks.py +++ b/pbr/tests/test_hooks.py @@ -41,7 +41,9 @@ import os from testtools import matchers +from testtools import skipUnless +from pbr import testr_command from pbr.tests import base from pbr.tests import util @@ -66,6 +68,7 @@ class TestHooks(base.BaseTestCase): assert 'test_hook_1\ntest_hook_2' in stdout assert return_code == 0 + @skipUnless(testr_command.have_testr, "testrepository not available") def test_custom_commands_known(self): stdout, _, return_code = self.run_setup('--help-commands') self.assertFalse(return_code) diff --git a/pbr/tests/test_packaging.py b/pbr/tests/test_packaging.py index 9bd91ae..d19dd05 100644 --- a/pbr/tests/test_packaging.py +++ b/pbr/tests/test_packaging.py @@ -43,7 +43,6 @@ import email.errors import imp import os import re -import sys import sysconfig import tempfile import textwrap @@ -56,7 +55,7 @@ import testscenarios import testtools from testtools import matchers import virtualenv -import wheel.install +from wheel import wheelfile from pbr import git from pbr import packaging @@ -372,13 +371,13 @@ class TestPackagingWheels(base.BaseTestCase): relative_wheel_filename = os.listdir(dist_dir)[0] absolute_wheel_filename = os.path.join( dist_dir, relative_wheel_filename) - wheel_file = wheel.install.WheelFile(absolute_wheel_filename) + wheel_file = wheelfile.WheelFile(absolute_wheel_filename) wheel_name = wheel_file.parsed_filename.group('namever') # Create a directory path to unpack the wheel to self.extracted_wheel_dir = os.path.join(dist_dir, wheel_name) # Extract the wheel contents to the directory we just created - wheel_file.zipfile.extractall(self.extracted_wheel_dir) - wheel_file.zipfile.close() + wheel_file.extractall(self.extracted_wheel_dir) + wheel_file.close() def test_data_directory_has_wsgi_scripts(self): # Build the path to the scripts directory @@ -549,28 +548,6 @@ class ParseRequirementsTest(base.BaseTestCase): result = packaging.parse_requirements([requirements]) 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): diff --git a/releasenotes/notes/long-descr-content-type-f9a1003acbb8740f.yaml b/releasenotes/notes/long-descr-content-type-f9a1003acbb8740f.yaml new file mode 100644 index 0000000..5912332 --- /dev/null +++ b/releasenotes/notes/long-descr-content-type-f9a1003acbb8740f.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + The ``description-content-type`` was not being set correctly. It + will now be correctly populated when using ``setuptools`` 39.2.0 + and beyond. @@ -53,5 +53,5 @@ build-dir = doc/build source-dir = doc/source warning-is-error = 1 -[wheel] +[bdist_wheel] universal = 1 diff --git a/test-requirements.txt b/test-requirements.txt index 8fdcb83..70e4ca0 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,15 +1,17 @@ # The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. +wheel>=0.32.0 # MIT fixtures>=3.0.0 # Apache-2.0/BSD hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0 mock>=2.0.0 # BSD six>=1.10.0 # MIT -stestr>=2.0.0 # Apache-2.0 +stestr>=2.1.0 # Apache-2.0 testresources>=2.0.0 # Apache-2.0/BSD testscenarios>=0.4 # Apache-2.0/BSD testtools>=2.2.0 # MIT virtualenv>=14.0.6 # MIT +coverage!=4.4,>=4.0 # Apache-2.0 # optionally exposed by distutils commands sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD @@ -5,11 +5,15 @@ envlist = py{27,35,36},pep8,docs [testenv] usedevelop = True install_command = pip install {opts} {packages} -passenv = PBR_INTEGRATION PIPFLAGS PIPVERSION PBRVERSION REPODIR WHEELHOUSE PROJECTS OS_TEST_TIMEOUT OS_STDOUT_CAPTURE OS_STDERR_CAPTURE +passenv = PBR_INTEGRATION PIPFLAGS PIPVERSION PBRVERSION REPODIR WHEELHOUSE PROJECTS +setenv = + OS_STDOUT_CAPTURE={env:OS_STDOUT_CAPTURE:1} + OS_STDERR_CAPTURE={env:OS_STDERR_CAPTURE:1} + OS_TEST_TIMEOUT={env:OS_TEST_TIMEOUT:60} deps = -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} -r{toxinidir}/test-requirements.txt -commands = stestr run {posargs} +commands = stestr run --suppress-attachments {posargs} [testenv:pep8] basepython = python3 |