- 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
- - 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
CHANGES
=======
+5.0.0
+-----
+
+* Use templates for cover and lower-constraints
+* Special case long\_description\_content\_type
+* tox: Suppress output
+* Support wheel 0.32.0+
+
4.3.0
-----
* Remove my\_ip from generated wsgi script
+* docs: Add docs for reno integration
+* Skip test for testr hook being installed when testr is not available
* Fix typo in contribution instructions
* Add release note for fix to bug 1786306
* Move pbr-installation jobs in-tree
* switch documentation job to new PTI
* import zuul job settings from project-config
* Ignore Zuul when generating AUTHORS
+* packaging: Remove support for pyN requirement files
* tox: Re-add cover target
4.2.0
Metadata-Version: 2.1
Name: pbr
-Version: 4.3.0
+Version: 5.0.0
Summary: Python Build Reasonableness
Home-page: https://docs.openstack.org/pbr/latest/
Author: OpenStack
Author-email: openstack-dev@lists.openstack.org
License: UNKNOWN
+Project-URL: Source Code, https://git.openstack.org/cgit/openstack-dev/pbr/
Project-URL: Documentation, https://docs.openstack.org/pbr/
Project-URL: Bug Tracker, https://bugs.launchpad.net/pbr/
-Project-URL: Source Code, https://git.openstack.org/cgit/openstack-dev/pbr/
Description: Introduction
============
* **ChangeLog**: Generate ChangeLog from git log
* **Manifest**: Generate a sensible manifest from git files and some standard
files
+* **Release Notes**: Generate a release notes file using reno
* **Requirements**: Store your dependencies in a pip requirements file
* **long_description**: Use your README file as a long_description
* **Smart find_packages**: Smartly find packages under your root package
- Extensive use of ``setup.cfg`` for configuration
- Automatic package metadata generation (``version``)
- Automatic metadata file generation (``AUTHOR``, ``ChangeLog``,
- ``MANIFEST.in``)
+ ``MANIFEST.in``, ``RELEASENOTES.txt``)
In addition, there are other things that you don't see here but which *pbr*
will do for you:
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
~~~~~~~~~~~~
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
-------------------------
__ https://packaging.python.org/tutorials/distributing-packages/#manifest-in
+Release Notes
+~~~~~~~~~~~~~
+
+.. admonition:: Summary
+
+ *pbr* will automatically use *reno* \'s ``build_reno`` setuptools command
+ to generate a release notes file, if reno is available and configured.
+
+If using *reno*, you may wish to include a copy of the release notes in your
+packages. *reno* provides a ``build_reno`` `setuptools command`__ and, if reno
+is present and configured, *pbr* will automatically call this to generate a
+release notes file for inclusion in your package.
+
+__ https://docs.openstack.org/reno/latest/user/setuptools.html
+
Setup Commands
--------------
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:
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
Metadata-Version: 2.1
Name: pbr
-Version: 4.3.0
+Version: 5.0.0
Summary: Python Build Reasonableness
Home-page: https://docs.openstack.org/pbr/latest/
Author: OpenStack
Author-email: openstack-dev@lists.openstack.org
License: UNKNOWN
+Project-URL: Source Code, https://git.openstack.org/cgit/openstack-dev/pbr/
Project-URL: Documentation, https://docs.openstack.org/pbr/
Project-URL: Bug Tracker, https://bugs.launchpad.net/pbr/
-Project-URL: Source Code, https://git.openstack.org/cgit/openstack-dev/pbr/
Description: Introduction
============
playbooks/legacy/pbr-installation-upstream-devstack/run.yaml
releasenotes/notes/deprecate-pyN-requirements-364655c38fa5b780.yaml
releasenotes/notes/deprecate-testr-nose-integration-56e3e11248d946fc.yaml
+releasenotes/notes/long-descr-content-type-f9a1003acbb8740f.yaml
releasenotes/notes/remove-command-hooks-907d9c2325f306ca.yaml
releasenotes/notes/support-vcs-uris-with-subdirectories-20ad68b6138f72ca.yaml
releasenotes/notes/v_version-457b38c8679c5868.yaml
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:
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)
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')
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
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)
import imp
import os
import re
-import sys
import sysconfig
import tempfile
import textwrap
import testtools
from testtools import matchers
import virtualenv
-import wheel.install
+from wheel import wheelfile
from pbr import git
from pbr import packaging
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
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):
--- /dev/null
+---
+fixes:
+ - |
+ The ``description-content-type`` was not being set correctly. It
+ will now be correctly populated when using ``setuptools`` 39.2.0
+ and beyond.
source-dir = doc/source
warning-is-error = 1
-[wheel]
+[bdist_wheel]
universal = 1
[egg_info]
# 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
[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