Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-heatclient for
openSUSE:Factory checked in at 2026-06-15 19:44:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-heatclient (Old)
and /work/SRC/openSUSE:Factory/.python-heatclient.new.1981 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-heatclient"
Mon Jun 15 19:44:48 2026 rev:43 rq:1359330 version:5.2.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-heatclient/python-heatclient.changes
2026-03-10 17:53:25.987845929 +0100
+++
/work/SRC/openSUSE:Factory/.python-heatclient.new.1981/python-heatclient.changes
2026-06-15 19:48:12.991420618 +0200
@@ -1,0 +2,10 @@
+Sun Jun 14 21:28:42 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 5.2.0:
+ * tox: Use new constraints option
+ * tox: Use new constraints option
+ * Fix: Add event ID to default stack event list output
+ * Fix: Python 3.14 compatibility for file URL construction
+ * Update master for stable/2026.1
+
+-------------------------------------------------------------------
Old:
----
python_heatclient-5.1.0.tar.gz
New:
----
python_heatclient-5.2.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-heatclient.spec ++++++
--- /var/tmp/diff_new_pack.CTmsGV/_old 2026-06-15 19:48:13.731451715 +0200
+++ /var/tmp/diff_new_pack.CTmsGV/_new 2026-06-15 19:48:13.743452219 +0200
@@ -18,7 +18,7 @@
%global pythons %{primary_python}
Name: python-heatclient
-Version: 5.1.0
+Version: 5.2.0
Release: 0
Summary: Python API and CLI for OpenStack Heat
License: Apache-2.0
++++++ python_heatclient-5.1.0.tar.gz -> python_heatclient-5.2.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_heatclient-5.1.0/AUTHORS
new/python_heatclient-5.2.0/AUTHORS
--- old/python_heatclient-5.1.0/AUTHORS 2026-02-26 10:16:09.000000000 +0100
+++ new/python_heatclient-5.2.0/AUTHORS 2026-05-18 11:31:28.000000000 +0200
@@ -157,6 +157,7 @@
chenhaiq <[email protected]>
chenxiao <[email protected]>
dengzhaosen <[email protected]>
+dhrusing <[email protected]>
dixiaoli <[email protected]>
gong yong sheng <[email protected]>
huang.zhiping <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_heatclient-5.1.0/ChangeLog
new/python_heatclient-5.2.0/ChangeLog
--- old/python_heatclient-5.1.0/ChangeLog 2026-02-26 10:16:09.000000000
+0100
+++ new/python_heatclient-5.2.0/ChangeLog 2026-05-18 11:31:28.000000000
+0200
@@ -1,6 +1,15 @@
CHANGES
=======
+5.2.0
+-----
+
+* tox: Use new constraints option
+* tox: Use new constraints option
+* Fix: Add event ID to default stack event list output
+* Fix: Python 3.14 compatibility for file URL construction
+* Update master for stable/2026.1
+
5.1.0
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_heatclient-5.1.0/PKG-INFO
new/python_heatclient-5.2.0/PKG-INFO
--- old/python_heatclient-5.1.0/PKG-INFO 2026-02-26 10:16:09.577836300
+0100
+++ new/python_heatclient-5.2.0/PKG-INFO 2026-05-18 11:31:28.276383400
+0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: python-heatclient
-Version: 5.1.0
+Version: 5.2.0
Summary: OpenStack Orchestration API Client Library
Home-page: https://docs.openstack.org/python-heatclient/latest
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_heatclient-5.1.0/heatclient/common/utils.py
new/python_heatclient-5.2.0/heatclient/common/utils.py
--- old/python_heatclient-5.1.0/heatclient/common/utils.py 2026-02-26
10:15:43.000000000 +0100
+++ new/python_heatclient-5.2.0/heatclient/common/utils.py 2026-05-18
11:30:38.000000000 +0200
@@ -16,6 +16,7 @@
import base64
import logging
import os
+from pathlib import Path
import textwrap
import uuid
@@ -238,8 +239,8 @@
def event_log_formatter(events, event_log_context=None):
"""Return the events in log format."""
event_log = []
- log_format = ("%(event_time)s "
- "[%(rsrc_name)s]: %(rsrc_status)s %(rsrc_status_reason)s")
+ log_format = ("%(event_time)s %(event_id)s [%(rsrc_name)s]: "
+ "%(rsrc_status)s %(rsrc_status_reason)s")
# It is preferable for a context to be passed in, but there might be enough
# events in this call to build a better resource name, so create a context
@@ -251,12 +252,15 @@
rsrc_name = event_log_context.build_resource_name(event)
event_time = getattr(event, 'event_time', '')
- log = log_format % {
+ log_data = {
'event_time': event_time.replace('T', ' '),
'rsrc_name': rsrc_name,
'rsrc_status': getattr(event, 'resource_status', ''),
- 'rsrc_status_reason': getattr(event, 'resource_status_reason', '')
+ 'rsrc_status_reason': getattr(event, 'resource_status_reason', ''),
+ 'event_id': getattr(event, 'id', '')
}
+
+ log = log_format % log_data
event_log.append(log)
return "\n".join(event_log)
@@ -426,8 +430,7 @@
def normalise_file_path_to_url(path):
if parse.urlparse(path).scheme:
return path
- path = os.path.abspath(path)
- return parse.urljoin('file:', request.pathname2url(path))
+ return Path(path).resolve().as_uri()
def get_response_body(resp):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_heatclient-5.1.0/heatclient/tests/unit/osc/v1/test_event.py
new/python_heatclient-5.2.0/heatclient/tests/unit/osc/v1/test_event.py
--- old/python_heatclient-5.1.0/heatclient/tests/unit/osc/v1/test_event.py
2026-02-26 10:15:43.000000000 +0100
+++ new/python_heatclient-5.2.0/heatclient/tests/unit/osc/v1/test_event.py
2026-05-18 11:30:38.000000000 +0200
@@ -237,9 +237,9 @@
sleep.side_effect = [None, KeyboardInterrupt()]
arglist = ['--follow', 'my_stack']
expected = (
- '2015-11-13 10:02:17 [resource1]: '
+ '2015-11-13 10:02:17 1234 [resource1]: '
'CREATE_COMPLETE state changed\n'
- '2015-11-13 10:02:17 [resource1]: '
+ '2015-11-13 10:02:17 1234 [resource1]: '
'CREATE_COMPLETE state changed\n'
)
parsed_args = self.check_parser(self.cmd, arglist, [])
@@ -259,8 +259,8 @@
def test_event_list_log_format(self):
arglist = ['my_stack']
- expected = ('2015-11-13 10:02:17 [resource1]: CREATE_COMPLETE '
- 'state changed\n')
+ expected = ('2015-11-13 10:02:17 1234 [resource1]: '
+ 'CREATE_COMPLETE state changed\n')
parsed_args = self.check_parser(self.cmd, arglist, [])
self.cmd.run(parsed_args)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_heatclient-5.1.0/heatclient/tests/unit/test_shell.py
new/python_heatclient-5.2.0/heatclient/tests/unit/test_shell.py
--- old/python_heatclient-5.1.0/heatclient/tests/unit/test_shell.py
2026-02-26 10:15:43.000000000 +0100
+++ new/python_heatclient-5.2.0/heatclient/tests/unit/test_shell.py
2026-05-18 11:30:38.000000000 +0200
@@ -12,6 +12,7 @@
# limitations under the License.
import os
+from pathlib import Path
import sys
import tempfile
from unittest import mock
@@ -1224,8 +1225,8 @@
self.useFixture(fixtures.MockPatchObject(utils, 'read_url_content',
return_value='xxxxxx'))
- url = 'file://' + request.pathname2url(
- '%s/private_key.env' % TEST_VAR_DIR)
+
+ url = Path(TEST_VAR_DIR, 'private_key.env').as_uri()
template_file = os.path.join(TEST_VAR_DIR, 'minimal.template')
create_text = self.shell(
@@ -1255,8 +1256,7 @@
self.useFixture(fixtures.MockPatchObject(utils, 'read_url_content',
return_value='xxxxxx'))
- url = 'file://' + request.pathname2url(
- '%s/private_key.env' % TEST_VAR_DIR)
+ url = Path(TEST_VAR_DIR, 'private_key.env').as_uri()
template_file = os.path.join(TEST_VAR_DIR, 'minimal.template')
create_text = self.shell(
@@ -2641,10 +2641,11 @@
event_list_text = self.shell('event-list {} --format log'.format(
stack_id))
- expected = ('2013-12-05 14:14:31 [aResource]: '
+ expected = ('2013-12-05 14:14:31 {} [aResource]: '
'CREATE_IN_PROGRESS state changed\n'
- '2013-12-05 14:14:32 [aResource]: CREATE_COMPLETE '
- 'state changed\n')
+ '2013-12-05 14:14:32 {} [aResource]: CREATE_COMPLETE '
+ 'state changed\n').format(self.event_id_one,
+ self.event_id_two)
self.assertEqual(expected, event_list_text)
@@ -2903,12 +2904,17 @@
self.mock_request_get(url, ev_resp_dict)
list_text = self.shell('event-list %s --nested-depth 1 --format log'
% stack_id)
- self.assertEqual('''\
-2014-01-06 16:14:00Z [the_stack]: CREATE_IN_PROGRESS Stack CREATE started
-2014-01-06 16:15:00Z [nested_stack]: CREATE_IN_PROGRESS Stack CREATE started
-2014-01-06 16:16:00Z [nested_stack]: CREATE_COMPLETE Stack CREATE completed
-2014-01-06 16:17:00Z [the_stack]: CREATE_COMPLETE Stack CREATE completed
-''', list_text)
+ expected = (
+ '2014-01-06 16:14:00Z p_eventid1 [the_stack]: '
+ 'CREATE_IN_PROGRESS Stack CREATE started\n'
+ '2014-01-06 16:15:00Z n_eventid1 [nested_stack]: '
+ 'CREATE_IN_PROGRESS Stack CREATE started\n'
+ '2014-01-06 16:16:00Z n_eventid2 [nested_stack]: '
+ 'CREATE_COMPLETE Stack CREATE completed\n'
+ '2014-01-06 16:17:00Z p_eventid2 [the_stack]: '
+ 'CREATE_COMPLETE Stack CREATE completed\n'
+ )
+ self.assertEqual(expected, list_text)
def test_shell_nested_depth_marker(self):
self.register_keystone_auth_fixture()
@@ -2922,11 +2928,15 @@
list_text = self.shell('event-list %s --nested-depth 1 --format log '
'--marker n_eventid1'
% stack_id)
- self.assertEqual('''\
-2014-01-06 16:15:00Z [nested_stack]: CREATE_IN_PROGRESS Stack CREATE started
-2014-01-06 16:16:00Z [nested_stack]: CREATE_COMPLETE Stack CREATE completed
-2014-01-06 16:17:00Z [the_stack]: CREATE_COMPLETE Stack CREATE completed
-''', list_text)
+ expected = (
+ '2014-01-06 16:15:00Z n_eventid1 [nested_stack]: '
+ 'CREATE_IN_PROGRESS Stack CREATE started\n'
+ '2014-01-06 16:16:00Z n_eventid2 [nested_stack]: '
+ 'CREATE_COMPLETE Stack CREATE completed\n'
+ '2014-01-06 16:17:00Z p_eventid2 [the_stack]: '
+ 'CREATE_COMPLETE Stack CREATE completed\n'
+ )
+ self.assertEqual(expected, list_text)
def test_shell_nested_depth_limit(self):
self.register_keystone_auth_fixture()
@@ -2940,10 +2950,13 @@
list_text = self.shell('event-list %s --nested-depth 1 --format log '
'--limit 2'
% stack_id)
- self.assertEqual('''\
-2014-01-06 16:14:00Z [the_stack]: CREATE_IN_PROGRESS Stack CREATE started
-2014-01-06 16:15:00Z [nested_stack]: CREATE_IN_PROGRESS Stack CREATE started
-''', list_text)
+ expected = (
+ '2014-01-06 16:14:00Z p_eventid1 [the_stack]: '
+ 'CREATE_IN_PROGRESS Stack CREATE started\n'
+ '2014-01-06 16:15:00Z n_eventid1 [nested_stack]: '
+ 'CREATE_IN_PROGRESS Stack CREATE started\n'
+ )
+ self.assertEqual(expected, list_text)
class ShellTestHookFunctions(ShellBase):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_heatclient-5.1.0/heatclient/tests/unit/test_utils.py
new/python_heatclient-5.2.0/heatclient/tests/unit/test_utils.py
--- old/python_heatclient-5.1.0/heatclient/tests/unit/test_utils.py
2026-02-26 10:15:43.000000000 +0100
+++ new/python_heatclient-5.2.0/heatclient/tests/unit/test_utils.py
2026-05-18 11:30:38.000000000 +0200
@@ -14,8 +14,8 @@
# under the License.
import os
+from pathlib import Path
from unittest import mock
-from urllib import request
import testtools
@@ -185,9 +185,9 @@
events_list = [hc_res.Resource(manager=None, info=event1),
hc_res.Resource(manager=None, info=event2)]
- expected = ('2015-09-28 12:12:12 [res_name]: '
+ expected = ('2015-09-28 12:12:12 123456789 [res_name]: '
'CREATE_IN_PROGRESS CREATE started\n'
- '2015-09-28 12:12:22 [res_name]: '
+ '2015-09-28 12:12:22 123456789 [res_name]: '
'CREATE_COMPLETE CREATE completed')
self.assertEqual(expected, utils.event_log_formatter(events_list))
self.assertEqual('', utils.event_log_formatter([]))
@@ -252,15 +252,18 @@
events_list = [hc_res.Resource(manager=None, info=event)
for event in events]
- expected = '''\
-2016-09-05 04:10:24Z [nested]: \
-CREATE_IN_PROGRESS Stack CREATE started
-2016-09-05 04:10:24Z [nested.rg1]: \
-CREATE_IN_PROGRESS state changed
-2016-09-05 04:10:24Z [nested-rg1-m4zxcs4pra6t]: \
-CREATE_IN_PROGRESS Stack CREATE started
-2016-09-05 04:10:24Z [nested-rg1-m4zxcs4pra6t.1]: \
-CREATE_IN_PROGRESS state changed'''
+ expected = (
+ '2016-09-05 04:10:24Z [nested]: '
+ 'CREATE_IN_PROGRESS Stack CREATE started\n'
+ '2016-09-05 04:10:24Z 375c49ae-cefb-4fb3-8f4d-1d5f1b9e3e5d '
+ '[nested.rg1]: CREATE_IN_PROGRESS state changed\n'
+ '2016-09-05 04:10:24Z 7e521c84-cd35-4f4c-b0de-962bd3cc40a8 '
+ '[nested-rg1-m4zxcs4pra6t]: '
+ 'CREATE_IN_PROGRESS Stack CREATE started\n'
+ '2016-09-05 04:10:24Z c6186c16-94ef-4214-a11a-7e3cc8a17f82 '
+ '[nested-rg1-m4zxcs4pra6t.1]: '
+ 'CREATE_IN_PROGRESS state changed'
+ )
self.assertEqual(expected, utils.event_log_formatter(events_list))
def test_event_log_formatter_resource_path(self):
@@ -323,15 +326,16 @@
events_list = [hc_res.Resource(manager=None, info=event)
for event in events]
- expected = '''\
-2016-09-05 04:10:24Z [nested]: \
-CREATE_IN_PROGRESS Stack CREATE started
-2016-09-05 04:10:24Z [nested.rg1]: \
-CREATE_IN_PROGRESS state changed
-2016-09-05 04:10:24Z [nested.rg1]: \
-CREATE_IN_PROGRESS Stack CREATE started
-2016-09-05 04:10:24Z [nested.rg1.1]: \
-CREATE_IN_PROGRESS state changed'''
+ expected = (
+ '2016-09-05 04:10:24Z [nested]: '
+ 'CREATE_IN_PROGRESS Stack CREATE started\n'
+ '2016-09-05 04:10:24Z 375c49ae-cefb-4fb3-8f4d-1d5f1b9e3e5d '
+ '[nested.rg1]: CREATE_IN_PROGRESS state changed\n'
+ '2016-09-05 04:10:24Z 7e521c84-cd35-4f4c-b0de-962bd3cc40a8 '
+ '[nested.rg1]: CREATE_IN_PROGRESS Stack CREATE started\n'
+ '2016-09-05 04:10:24Z c6186c16-94ef-4214-a11a-7e3cc8a17f82 '
+ '[nested.rg1.1]: CREATE_IN_PROGRESS state changed'
+ )
self.assertEqual(expected, utils.event_log_formatter(events_list))
@@ -387,7 +391,7 @@
def test_normalise_file_path_to_url_relative(self):
self.assertEqual(
- 'file://' + request.pathname2url('%s/foo' % os.getcwd()),
+ Path(os.getcwd(), 'foo').as_uri(),
utils.normalise_file_path_to_url(
'foo'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_heatclient-5.1.0/python_heatclient.egg-info/PKG-INFO
new/python_heatclient-5.2.0/python_heatclient.egg-info/PKG-INFO
--- old/python_heatclient-5.1.0/python_heatclient.egg-info/PKG-INFO
2026-02-26 10:16:09.000000000 +0100
+++ new/python_heatclient-5.2.0/python_heatclient.egg-info/PKG-INFO
2026-05-18 11:31:28.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: python-heatclient
-Version: 5.1.0
+Version: 5.2.0
Summary: OpenStack Orchestration API Client Library
Home-page: https://docs.openstack.org/python-heatclient/latest
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_heatclient-5.1.0/python_heatclient.egg-info/SOURCES.txt
new/python_heatclient-5.2.0/python_heatclient.egg-info/SOURCES.txt
--- old/python_heatclient-5.1.0/python_heatclient.egg-info/SOURCES.txt
2026-02-26 10:16:09.000000000 +0100
+++ new/python_heatclient-5.2.0/python_heatclient.egg-info/SOURCES.txt
2026-05-18 11:31:28.000000000 +0200
@@ -140,6 +140,7 @@
python_heatclient.egg-info/requires.txt
python_heatclient.egg-info/top_level.txt
releasenotes/notes/add-converge-in-osc-stack-update-10f256589f628d13.yaml
+releasenotes/notes/add-event-id-to-event-list-c0ae7769e7a4a6dd.yaml
releasenotes/notes/add-files-container-stack-create-update-324b931f8f474b3d.yaml
releasenotes/notes/bug-1643492-2d7537b55f347722.yaml
releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml
@@ -154,6 +155,7 @@
releasenotes/source/2024.2.rst
releasenotes/source/2025.1.rst
releasenotes/source/2025.2.rst
+releasenotes/source/2026.1.rst
releasenotes/source/conf.py
releasenotes/source/index.rst
releasenotes/source/queens.rst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_heatclient-5.1.0/python_heatclient.egg-info/pbr.json
new/python_heatclient-5.2.0/python_heatclient.egg-info/pbr.json
--- old/python_heatclient-5.1.0/python_heatclient.egg-info/pbr.json
2026-02-26 10:16:09.000000000 +0100
+++ new/python_heatclient-5.2.0/python_heatclient.egg-info/pbr.json
2026-05-18 11:31:28.000000000 +0200
@@ -1 +1 @@
-{"git_version": "7fe7663", "is_release": true}
\ No newline at end of file
+{"git_version": "6fb3333", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_heatclient-5.1.0/releasenotes/notes/add-event-id-to-event-list-c0ae7769e7a4a6dd.yaml
new/python_heatclient-5.2.0/releasenotes/notes/add-event-id-to-event-list-c0ae7769e7a4a6dd.yaml
---
old/python_heatclient-5.1.0/releasenotes/notes/add-event-id-to-event-list-c0ae7769e7a4a6dd.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/python_heatclient-5.2.0/releasenotes/notes/add-event-id-to-event-list-c0ae7769e7a4a6dd.yaml
2026-05-18 11:30:38.000000000 +0200
@@ -0,0 +1,7 @@
+---
+ features:
+ - |
+ The ``openstack stack event list`` command now displays the event ID
+ in the default log format output. The default listing
+ should show it to enable users to easily retrieve detailed information
+ about specific events.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_heatclient-5.1.0/releasenotes/source/2026.1.rst
new/python_heatclient-5.2.0/releasenotes/source/2026.1.rst
--- old/python_heatclient-5.1.0/releasenotes/source/2026.1.rst 1970-01-01
01:00:00.000000000 +0100
+++ new/python_heatclient-5.2.0/releasenotes/source/2026.1.rst 2026-05-18
11:30:38.000000000 +0200
@@ -0,0 +1,6 @@
+===========================
+2026.1 Series Release Notes
+===========================
+
+.. release-notes::
+ :branch: stable/2026.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python_heatclient-5.1.0/releasenotes/source/index.rst
new/python_heatclient-5.2.0/releasenotes/source/index.rst
--- old/python_heatclient-5.1.0/releasenotes/source/index.rst 2026-02-26
10:15:43.000000000 +0100
+++ new/python_heatclient-5.2.0/releasenotes/source/index.rst 2026-05-18
11:30:38.000000000 +0200
@@ -7,6 +7,7 @@
:caption: Contents:
unreleased
+ 2026.1
2025.2
2025.1
2024.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python_heatclient-5.1.0/tox.ini
new/python_heatclient-5.2.0/tox.ini
--- old/python_heatclient-5.1.0/tox.ini 2026-02-26 10:15:43.000000000 +0100
+++ new/python_heatclient-5.2.0/tox.ini 2026-05-18 11:30:38.000000000 +0200
@@ -1,11 +1,12 @@
[tox]
envlist = py3,pep8
-minversion = 3.18.0
+minversion = 4.28.0
[testenv]
usedevelop = True
+constraints =
+
{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
deps =
-
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands =
@@ -44,7 +45,6 @@
[testenv:docs]
deps =
-
-c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/doc/requirements.txt
commands = sphinx-build -W -b html doc/source doc/build/html