diff -Nru python-osc-lib-1.6.0/AUTHORS python-osc-lib-1.7.0/AUTHORS --- python-osc-lib-1.6.0/AUTHORS 2017-05-04 12:51:25.000000000 +0000 +++ python-osc-lib-1.7.0/AUTHORS 2017-07-10 18:39:10.000000000 +0000 @@ -1,5 +1,6 @@ Aaron Rosen Abhishek Chanda +Akihiro Motoki Akihiro Motoki Alessandro Pilotti Alessio Ababilov @@ -43,6 +44,7 @@ Huanxuan Ao Hugh Saunders Igor_Bolotin +Ilya Shakhat James E. Blair Jamie Lennox Jamie Lennox @@ -102,6 +104,7 @@ Tim Burke Tom Cocozzello Tony Breeds +Tovin Seven Ukesh Kumar Vasudevan Wenzhi Yu Xi Yang diff -Nru python-osc-lib-1.6.0/ChangeLog python-osc-lib-1.7.0/ChangeLog --- python-osc-lib-1.6.0/ChangeLog 2017-05-04 12:51:25.000000000 +0000 +++ python-osc-lib-1.7.0/ChangeLog 2017-07-10 18:39:10.000000000 +0000 @@ -1,6 +1,21 @@ CHANGES ======= +1.7.0 +----- + +* Add test methods to compare formattable column values +* Updated from global requirements +* use openstackdocstheme html context +* update links to docs in readme +* switch from oslosphinx to openstackdocstheme +* turn on warning-is-error for sphinx +* rearrange existing documentation to fit the new standard layout +* Optimize find\_resource: do not run the same query twice +* Make --os-profile load from environment variables +* Deprecate --profile and remove after Apr 2017 +* Updated from global requirements + 1.6.0 ----- @@ -13,6 +28,7 @@ ----- * Tell ClientManager when auth is required +* Add endpoint hook to BaseAPI 1.5.0 ----- @@ -32,6 +48,7 @@ * Change noauth strategy for plugin loading * Nit: Reorder some util methods in alphabetic order * Using assertIsNone() instead of assertEqual(None) +* Remove log translations * Fix find\_resource exception handling on numeric names with kwargs * Util methods for column name backward compatibility * The python 3.5 is added diff -Nru python-osc-lib-1.6.0/debian/changelog python-osc-lib-1.7.0/debian/changelog --- python-osc-lib-1.6.0/debian/changelog 2017-05-15 17:05:39.000000000 +0000 +++ python-osc-lib-1.7.0/debian/changelog 2017-07-28 18:13:11.000000000 +0000 @@ -1,3 +1,12 @@ +python-osc-lib (1.7.0-0ubuntu1) artful; urgency=medium + + * New upstream release. + * d/control: Align (Build-)Depends with upstream. + * d/p/drop-openstackdoctheme.patch: Temporarily drop openstackdocstheme + sphinx extension until sphinx>=1.6.2 is available. + + -- Corey Bryant Fri, 28 Jul 2017 14:13:11 -0400 + python-osc-lib (1.6.0-0ubuntu1) artful; urgency=medium * New upstream release for OpenStack Pike. diff -Nru python-osc-lib-1.6.0/debian/control python-osc-lib-1.7.0/debian/control --- python-osc-lib-1.6.0/debian/control 2017-05-15 17:05:39.000000000 +0000 +++ python-osc-lib-1.7.0/debian/control 2017-07-28 18:13:11.000000000 +0000 @@ -19,13 +19,13 @@ python-coverage (>= 4.0), python-fixtures (>= 3.0.0), python-hacking (>= 0.10.0), - python-keystoneauth1 (>= 2.20.0), + python-keystoneauth1 (>= 2.21.0), python-mock (>= 2.0), + python-openstackdocstheme (>= 1.11.0), python-os-client-config (>= 1.27.0), python-os-testr (>= 0.8.0), python-oslo.i18n (>= 2.1.0), python-oslo.utils (>= 3.20.0), - python-oslosphinx (>= 4.7.0), python-oslotest (>= 1.10.0), python-osprofiler (>= 1.4.0), python-requests-mock (>= 1.1), @@ -40,13 +40,13 @@ python3-coverage (>= 4.0), python3-fixtures (>= 3.0.0), python3-hacking (>= 0.10.0), - python3-keystoneauth1 (>= 2.20.0), + python3-keystoneauth1 (>= 2.21.0), python3-mock (>= 2.0), + python3-openstackdocstheme (>= 1.11.0), python3-os-client-config (>= 1.27.0), python3-os-testr (>= 0.8.0), python3-oslo.i18n (>= 2.1.0), python3-oslo.utils (>= 3.20.0), - python3-oslosphinx (>= 4.7.0), python3-oslotest (>= 1.10.0), python3-osprofiler (>= 1.4.0), python3-requests-mock (>= 1.1), @@ -66,7 +66,7 @@ Architecture: all Depends: python-babel (>= 2.3.4), python-cliff (>= 1.15.0), - python-keystoneauth1 (>= 2.20.0), + python-keystoneauth1 (>= 2.21.0), python-os-client-config (>= 1.27.0), python-oslo.i18n (>= 2.1.0), python-oslo.utils (>= 3.20.0), @@ -86,7 +86,7 @@ Architecture: all Depends: python3-babel (>= 2.3.4), python3-cliff (>= 1.15.0), - python3-keystoneauth1 (>= 2.20.0), + python3-keystoneauth1 (>= 2.21.0), python3-os-client-config (>= 1.27.0), python3-oslo.i18n (>= 2.1.0), python3-oslo.utils (>= 3.20.0), diff -Nru python-osc-lib-1.6.0/debian/patches/drop-openstackdoctheme.patch python-osc-lib-1.7.0/debian/patches/drop-openstackdoctheme.patch --- python-osc-lib-1.6.0/debian/patches/drop-openstackdoctheme.patch 1970-01-01 00:00:00.000000000 +0000 +++ python-osc-lib-1.7.0/debian/patches/drop-openstackdoctheme.patch 2017-07-28 18:13:11.000000000 +0000 @@ -0,0 +1,34 @@ +Description: Temporarily drop openstackdocstheme sphinx extension + until sphinx>=1.6.2 is available. +Author: Corey Bryant +Forwarded: no +Last-Update: 2017-07-28 + +--- a/doc/source/conf.py ++++ b/doc/source/conf.py +@@ -37,7 +37,6 @@ + extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.doctest', + 'sphinx.ext.todo', +- 'openstackdocstheme', + ] + + # openstackdocstheme options +@@ -114,7 +113,7 @@ + # a list of builtin themes. + #html_theme_path = ["."] + #html_theme = '_theme' +-html_theme = 'openstackdocs' ++#html_theme = 'openstackdocs' + + # Theme options are theme-specific and customize the look and feel of a theme + # further. For a list of options available for each theme, see the +@@ -123,7 +122,7 @@ + + # Add any paths that contain custom themes here, relative to this directory. + #html_theme_path = [] +-html_theme_path = [openstackdocstheme.get_html_theme_path()] ++#html_theme_path = [openstackdocstheme.get_html_theme_path()] + + # The name for this set of Sphinx documents. If None, it defaults to + # " v documentation". diff -Nru python-osc-lib-1.6.0/debian/patches/series python-osc-lib-1.7.0/debian/patches/series --- python-osc-lib-1.6.0/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ python-osc-lib-1.7.0/debian/patches/series 2017-07-28 18:13:11.000000000 +0000 @@ -0,0 +1 @@ +drop-openstackdoctheme.patch diff -Nru python-osc-lib-1.6.0/doc/source/change_log.rst python-osc-lib-1.7.0/doc/source/change_log.rst --- python-osc-lib-1.6.0/doc/source/change_log.rst 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/doc/source/change_log.rst 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -.. include:: ../../ChangeLog diff -Nru python-osc-lib-1.6.0/doc/source/conf.py python-osc-lib-1.7.0/doc/source/conf.py --- python-osc-lib-1.6.0/doc/source/conf.py 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/doc/source/conf.py 2017-07-10 18:36:28.000000000 +0000 @@ -15,6 +15,7 @@ import os import sys +import openstackdocstheme import pbr.version # If extensions (or modules to document with autodoc) are in another directory, @@ -36,10 +37,15 @@ extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', - 'oslosphinx', - 'ext.apidoc', + 'openstackdocstheme', ] +# openstackdocstheme options +repository_name = 'openstack/osc-lib' +bug_project = 'python-openstackclient' +bug_tag = 'osc-lib' +html_last_updated_fmt = '%Y-%m-%d %H:%M' + # Add any paths that contain templates here, relative to this directory. #templates_path = ['_templates'] @@ -108,6 +114,7 @@ # a list of builtin themes. #html_theme_path = ["."] #html_theme = '_theme' +html_theme = 'openstackdocs' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -116,6 +123,7 @@ # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] +html_theme_path = [openstackdocstheme.get_html_theme_path()] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". diff -Nru python-osc-lib-1.6.0/doc/source/contributor/index.rst python-osc-lib-1.7.0/doc/source/contributor/index.rst --- python-osc-lib-1.6.0/doc/source/contributor/index.rst 1970-01-01 00:00:00.000000000 +0000 +++ python-osc-lib-1.7.0/doc/source/contributor/index.rst 2017-07-10 18:36:28.000000000 +0000 @@ -0,0 +1,19 @@ +============== + Contributing +============== + +osc-lib utilizes all of the usual OpenStack processes and requirements for +contributions. The code is hosted `on OpenStack's Git server`_. `Bug reports`_ +and `blueprints`_ may be submitted to the :code:`python-openstackclient` project +on `Launchpad`_. Code may be submitted to the +:code:`openstack/osc-lib` project using `Gerrit`_. +Developers may also be found in the `IRC channel`_ ``#openstack-sdks``. + +.. _`on OpenStack's Git server`: https://git.openstack.org/cgit/openstack/python-openstackclient/tree +.. _Launchpad: https://launchpad.net/python-openstackclient +.. _Gerrit: http://docs.openstack.org/infra/manual/developers.html#development-workflow +.. _Bug reports: https://bugs.launchpad.net/python-openstackclient/+bugs +.. _blueprints: https://blueprints.launchpad.net/python-openstackclient +.. _PyPi: https://pypi.python.org/pypi/osc-lib +.. _tarball: http://tarballs.openstack.org/osc-lib +.. _IRC channel: https://wiki.openstack.org/wiki/IRC diff -Nru python-osc-lib-1.6.0/doc/source/index.rst python-osc-lib-1.7.0/doc/source/index.rst --- python-osc-lib-1.6.0/doc/source/index.rst 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/doc/source/index.rst 2017-07-10 18:36:28.000000000 +0000 @@ -8,39 +8,13 @@ Contents: .. toctree:: - :maxdepth: 1 + :maxdepth: 2 - transition + user/index + reference/index + contributor/index -Contributing -============ - -osc-lib utilizes all of the usual OpenStack processes and requirements for -contributions. The code is hosted `on OpenStack's Git server`_. `Bug reports`_ -and `blueprints`_ may be submitted to the :code:`python-openstackclient` project -on `Launchpad`_. Code may be submitted to the -:code:`openstack/osc-lib` project using `Gerrit`_. -Developers may also be found in the `IRC channel`_ ``#openstack-sdks``. - -.. _`on OpenStack's Git server`: https://git.openstack.org/cgit/openstack/python-openstackclient/tree -.. _Launchpad: https://launchpad.net/python-openstackclient -.. _Gerrit: http://docs.openstack.org/infra/manual/developers.html#development-workflow -.. _Bug reports: https://bugs.launchpad.net/python-openstackclient/+bugs -.. _blueprints: https://blueprints.launchpad.net/python-openstackclient -.. _PyPi: https://pypi.python.org/pypi/osc-lib -.. _tarball: http://tarballs.openstack.org/osc-lib -.. _IRC channel: https://wiki.openstack.org/wiki/IRC - -Change Log -========== - -.. toctree:: - :maxdepth: 1 - - change_log - -Indices and tables -================== +.. rubric:: Indices and tables * :ref:`genindex` * :ref:`modindex` diff -Nru python-osc-lib-1.6.0/doc/source/reference/index.rst python-osc-lib-1.7.0/doc/source/reference/index.rst --- python-osc-lib-1.6.0/doc/source/reference/index.rst 1970-01-01 00:00:00.000000000 +0000 +++ python-osc-lib-1.7.0/doc/source/reference/index.rst 2017-07-10 18:36:28.000000000 +0000 @@ -0,0 +1,8 @@ +======================= + Library API Reference +======================= + +.. toctree:: + :maxdepth: 2 + + api/autoindex diff -Nru python-osc-lib-1.6.0/doc/source/transition.rst python-osc-lib-1.7.0/doc/source/transition.rst --- python-osc-lib-1.6.0/doc/source/transition.rst 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/doc/source/transition.rst 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -=============================== -Transition from OpenStackClient -=============================== - -``osc-lib`` was extracted from the main OpenStackClient repo after the -OSC 2.4.0 release. During the migration all module names have changed -from ``openstackclient.*`` to ``osc_lib.*``. In addition, some re-arranging -has been done internally to better align modules. - -The complete list of public module name changes: - -* ``openstackclient.api.api`` -> ``osc_lib.api.api`` -* ``openstackclient.api.auth`` -> ``osc_lib.api.auth`` -* ``openstackclient.api.utils`` -> ``osc_lib.api.utils`` -* ``openstackclient.common.command`` -> ``osc_lib.command.command`` -* ``openstackclient.common.commandmanager`` -> ``osc_lib.command.commandmanager`` -* ``openstackclient.common.exceptions`` -> ``osc_lib.exceptions`` -* ``openstackclient.common.logs`` -> ``osc_lib.logs`` -* ``openstackclient.common.parseractions`` -> ``osc_lib.cli.parseractions`` -* ``openstackclient.common.session`` -> ``osc_lib.session`` -* ``openstackclient.common.utils`` -> ``osc_lib.utils`` -* ``openstackclient.tests.fakes`` -> ``osc_lib.tests.fakes`` -* ``openstackclient.tests.utils`` -> ``osc_lib.tests.utils`` - -Additional Changes -================== - -In addition to the existing public modules, other parts of OSC have been -extracted, including the base ``Command``, ``CommandManager``, ``ClientManager`` -and ``Session`` classes. - -ClientManager -------------- - -The OSC ``ClientManager`` is responsible for managing all of the handles to the -individual API client objects as well as coordinating session and authentication -objects. - -Plugins are encouraged to use the ClientManager interface for obtaining information -about global configuration. - -* ``openstackclient.common.clientmanager`` -> ``osc_lib.clientmanager`` -* All of the handling of the ``verify``/``insecure``/``cacert`` configuration - options has been consolidated into ``ClientManager``. This converts the ``--verify``, - ``--insecure`` and ``--os-cacert`` options into a ``Requests``-compatible - ``verify`` attribute and a ``cacert`` attribute for the legacy client libraries. - both are now public; the ``_insecure`` attribute has been removed. - -.. list-table:: Verify/Insecure/CACert - :header-rows: 1 - - * - --verify - - --insecure - - --cacert - - Result - * - None - - None - - - - ``verify=True``, ``cacert=None`` - * - True - - None - - None - - ``verify=True``, ``cacert=None`` - * - None - - True - - None - - ``verify=False``, ``cacert=None`` - * - None - - None - - - - ``verify=cacert``, ``cacert=`` - * - True - - None - - - - ``verify=cacert``, ``cacert=`` - * - None - - True - - - - ``verify=False``, ``cacert=None`` - -* A number of other ``ClientManager`` attributes have also been made public to - encourage their direct use rather than reaching in to the global options passed - in the ``ClientManager`` constructor: - - * ``_verify`` -> ``verify`` - * ``_cacert`` -> ``cacert`` - * ``_cert`` -> ``cert`` - * ``_insecure`` -> removed, use '`not verify'` - * ``_interface`` -> ``interface`` - * ``_region_name`` -> ``region_name`` - -Shell -===== - -* ``openstackclient.shell`` -> ``osc_lib.shell`` -* Break up ``OpenStackShell.initialize_app()`` - * leave all plugin initialization in OSC in ``_load_plugins()`` - * leave all command loading in OSC in ``_load_commands()`` - -API -=== - -The API base layer is the common point for all API subclasses. It is a -wrapper around ``keystoneauth1.session.Session`` that fixes the ``request()`` -interface and provides simple endpoint handling that is useful when a Service -Catalog is either not available or is insufficient. It also adds simple -implementations of the common API CRUD operations: create(), delete(), etc. - -* ``KeystoneSession`` -> merged into ``BaseAPI`` diff -Nru python-osc-lib-1.6.0/doc/source/user/change_log.rst python-osc-lib-1.7.0/doc/source/user/change_log.rst --- python-osc-lib-1.6.0/doc/source/user/change_log.rst 1970-01-01 00:00:00.000000000 +0000 +++ python-osc-lib-1.7.0/doc/source/user/change_log.rst 2017-07-10 18:36:28.000000000 +0000 @@ -0,0 +1 @@ +.. include:: ../../../ChangeLog diff -Nru python-osc-lib-1.6.0/doc/source/user/index.rst python-osc-lib-1.7.0/doc/source/user/index.rst --- python-osc-lib-1.6.0/doc/source/user/index.rst 1970-01-01 00:00:00.000000000 +0000 +++ python-osc-lib-1.7.0/doc/source/user/index.rst 2017-07-10 18:36:28.000000000 +0000 @@ -0,0 +1,9 @@ +=============== + Using osc-lib +=============== + +.. toctree:: + :maxdepth: 2 + + transition + change_log diff -Nru python-osc-lib-1.6.0/doc/source/user/transition.rst python-osc-lib-1.7.0/doc/source/user/transition.rst --- python-osc-lib-1.6.0/doc/source/user/transition.rst 1970-01-01 00:00:00.000000000 +0000 +++ python-osc-lib-1.7.0/doc/source/user/transition.rst 2017-07-10 18:36:28.000000000 +0000 @@ -0,0 +1,109 @@ +=============================== +Transition from OpenStackClient +=============================== + +``osc-lib`` was extracted from the main OpenStackClient repo after the +OSC 2.4.0 release. During the migration all module names have changed +from ``openstackclient.*`` to ``osc_lib.*``. In addition, some re-arranging +has been done internally to better align modules. + +The complete list of public module name changes: + +* ``openstackclient.api.api`` -> ``osc_lib.api.api`` +* ``openstackclient.api.auth`` -> ``osc_lib.api.auth`` +* ``openstackclient.api.utils`` -> ``osc_lib.api.utils`` +* ``openstackclient.common.command`` -> ``osc_lib.command.command`` +* ``openstackclient.common.commandmanager`` -> ``osc_lib.command.commandmanager`` +* ``openstackclient.common.exceptions`` -> ``osc_lib.exceptions`` +* ``openstackclient.common.logs`` -> ``osc_lib.logs`` +* ``openstackclient.common.parseractions`` -> ``osc_lib.cli.parseractions`` +* ``openstackclient.common.session`` -> ``osc_lib.session`` +* ``openstackclient.common.utils`` -> ``osc_lib.utils`` +* ``openstackclient.tests.fakes`` -> ``osc_lib.tests.fakes`` +* ``openstackclient.tests.utils`` -> ``osc_lib.tests.utils`` + +Additional Changes +================== + +In addition to the existing public modules, other parts of OSC have been +extracted, including the base ``Command``, ``CommandManager``, ``ClientManager`` +and ``Session`` classes. + +ClientManager +------------- + +The OSC ``ClientManager`` is responsible for managing all of the handles to the +individual API client objects as well as coordinating session and authentication +objects. + +Plugins are encouraged to use the ClientManager interface for obtaining information +about global configuration. + +* ``openstackclient.common.clientmanager`` -> ``osc_lib.clientmanager`` +* All of the handling of the ``verify``/``insecure``/``cacert`` configuration + options has been consolidated into ``ClientManager``. This converts the ``--verify``, + ``--insecure`` and ``--os-cacert`` options into a ``Requests``-compatible + ``verify`` attribute and a ``cacert`` attribute for the legacy client libraries. + both are now public; the ``_insecure`` attribute has been removed. + +.. list-table:: Verify/Insecure/CACert + :header-rows: 1 + + * - --verify + - --insecure + - --cacert + - Result + * - None + - None + - + - ``verify=True``, ``cacert=None`` + * - True + - None + - None + - ``verify=True``, ``cacert=None`` + * - None + - True + - None + - ``verify=False``, ``cacert=None`` + * - None + - None + - + - ``verify=cacert``, ``cacert=`` + * - True + - None + - + - ``verify=cacert``, ``cacert=`` + * - None + - True + - + - ``verify=False``, ``cacert=None`` + +* A number of other ``ClientManager`` attributes have also been made public to + encourage their direct use rather than reaching in to the global options passed + in the ``ClientManager`` constructor: + + * ``_verify`` -> ``verify`` + * ``_cacert`` -> ``cacert`` + * ``_cert`` -> ``cert`` + * ``_insecure`` -> removed, use '`not verify'` + * ``_interface`` -> ``interface`` + * ``_region_name`` -> ``region_name`` + +Shell +===== + +* ``openstackclient.shell`` -> ``osc_lib.shell`` +* Break up ``OpenStackShell.initialize_app()`` + * leave all plugin initialization in OSC in ``_load_plugins()`` + * leave all command loading in OSC in ``_load_commands()`` + +API +=== + +The API base layer is the common point for all API subclasses. It is a +wrapper around ``keystoneauth1.session.Session`` that fixes the ``request()`` +interface and provides simple endpoint handling that is useful when a Service +Catalog is either not available or is insufficient. It also adds simple +implementations of the common API CRUD operations: create(), delete(), etc. + +* ``KeystoneSession`` -> merged into ``BaseAPI`` diff -Nru python-osc-lib-1.6.0/osc_lib/api/api.py python-osc-lib-1.7.0/osc_lib/api/api.py --- python-osc-lib-1.6.0/osc_lib/api/api.py 2017-05-04 12:49:10.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib/api/api.py 2017-07-10 18:36:28.000000000 +0000 @@ -14,6 +14,7 @@ """Base API Library""" import simplejson as json +import six from keystoneauth1 import exceptions as ksa_exceptions from keystoneauth1 import session as ksa_session @@ -27,10 +28,13 @@ Encapsulate the translation between keystoneauth1.session.Session and requests.Session in a single layer: + * Restore some requests.session.Session compatibility; keystoneauth1.session.Session.request() has the method and url arguments swapped from the rest of the requests-using world. - * Provide basic endpoint handling when a Service Catalog is not available. + * Provide basic endpoint handling when a Service Catalog is not + available. + """ # Which service are we? Set in API-specific subclasses @@ -69,7 +73,28 @@ self.session = session self.service_type = service_type - self.endpoint = endpoint + self.endpoint = self._munge_endpoint(endpoint) + + def _munge_endpoint(self, endpoint): + """Hook to allow subclasses to massage the passed-in endpoint + + Hook to massage passed-in endpoints from arbitrary sources, + including direct user input. By default just remove trailing + '/' as all of our path info strings start with '/' and not all + services can handle '//' in their URLs. + + Some subclasses will override this to do additional work, most + likely with regard to API versions. + + :param string endpoint: The service endpoint, generally direct + from the service catalog. + :return: The modified endpoint + """ + + if isinstance(endpoint, six.string_types): + return endpoint.rstrip('/') + else: + return endpoint def _request(self, method, url, session=None, **kwargs): """Perform call into session @@ -99,6 +124,9 @@ if url: url = '/'.join([self.endpoint.rstrip('/'), url.lstrip('/')]) else: + # NOTE(dtroyer): This is left here after _munge_endpoint() is + # added because endpoint is public and there is + # no accounting for what may happen. url = self.endpoint.rstrip('/') else: # Pass on the lack of URL unmolested to maintain the same error diff -Nru python-osc-lib-1.6.0/osc_lib/i18n.py python-osc-lib-1.7.0/osc_lib/i18n.py --- python-osc-lib-1.6.0/osc_lib/i18n.py 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib/i18n.py 2017-07-10 18:36:28.000000000 +0000 @@ -19,13 +19,3 @@ # The primary translation function using the well-known name "_" _ = _translators.primary - -# Translators for log levels. -# -# The abbreviated names are meant to reflect the usual use of a short -# name like '_'. The "L" is for "log" and the other letter comes from -# the level. -_LI = _translators.log_info -_LW = _translators.log_warning -_LE = _translators.log_error -_LC = _translators.log_critical diff -Nru python-osc-lib-1.6.0/osc_lib/shell.py python-osc-lib-1.7.0/osc_lib/shell.py --- python-osc-lib-1.6.0/osc_lib/shell.py 2017-05-04 12:49:10.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib/shell.py 2017-07-10 18:36:28.000000000 +0000 @@ -16,7 +16,6 @@ """Command-line interface to the OpenStack APIs""" -import argparse import getpass import locale import logging @@ -148,16 +147,6 @@ self.log.info("END return value: %s", ret_val) def init_profile(self): - # NOTE(dtroyer): Remove this 'if' block when the --profile global - # option is removed - if osprofiler_profiler and self.options.old_profile: - self.log.warning( - 'The --profile option is deprecated, ' - 'please use --os-profile instead' - ) - if not self.options.profile: - self.options.profile = self.options.old_profile - self.do_profile = osprofiler_profiler and self.options.profile if self.do_profile: osprofiler_profiler.init(self.options.profile) @@ -283,18 +272,9 @@ '--os-profile', metavar='hmac-key', dest='profile', + default=utils.env('OS_PROFILE'), help=_('HMAC key for encrypting profiling context data'), ) - # NOTE(dtroyer): This global option should have been named - # --os-profile as --profile interferes with at - # least one existing command option. Deprecate - # --profile and remove after Apr 2017. - parser.add_argument( - '--profile', - metavar='hmac-key', - dest='old_profile', - help=argparse.SUPPRESS, - ) return parser # return clientmanager.build_plugin_option_parser(parser) diff -Nru python-osc-lib-1.6.0/osc_lib/tests/api/test_api.py python-osc-lib-1.7.0/osc_lib/tests/api/test_api.py --- python-osc-lib-1.6.0/osc_lib/tests/api/test_api.py 2017-05-04 12:49:10.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib/tests/api/test_api.py 2017-07-10 18:36:28.000000000 +0000 @@ -13,7 +13,7 @@ """Base API Library Tests""" -from keystoneauth1 import exceptions as ks_exceptions +from keystoneauth1 import exceptions as ksa_exceptions from keystoneauth1 import session from osc_lib.api import api @@ -27,6 +27,22 @@ super(TestBaseAPIDefault, self).setUp() self.api = api.BaseAPI() + def test_baseapi_request_no_url(self): + self.requests_mock.register_uri( + 'GET', + self.BASE_URL + '/qaz', + json=api_fakes.RESP_ITEM_1, + status_code=200, + ) + self.assertRaises( + ksa_exceptions.EndpointNotFound, + self.api._request, + 'GET', + '', + ) + self.assertIsNotNone(self.api.session) + self.assertNotEqual(self.sess, self.api.session) + def test_baseapi_request_url(self): self.requests_mock.register_uri( 'GET', @@ -47,7 +63,7 @@ status_code=200, ) self.assertRaises( - ks_exceptions.EndpointNotFound, + ksa_exceptions.EndpointNotFound, self.api._request, 'GET', '/qaz', @@ -72,6 +88,104 @@ self.assertNotEqual(self.sess, self.api.session) +class TestBaseAPIEndpointArg(api_fakes.TestSession): + + def test_baseapi_endpoint_no_endpoint(self): + x_api = api.BaseAPI( + session=self.sess, + ) + self.assertIsNotNone(x_api.session) + self.assertEqual(self.sess, x_api.session) + self.assertIsNone(x_api.endpoint) + + self.requests_mock.register_uri( + 'GET', + self.BASE_URL + '/qaz', + json=api_fakes.RESP_ITEM_1, + status_code=200, + ) + + # Normal url + self.assertRaises( + ksa_exceptions.EndpointNotFound, + x_api._request, + 'GET', + '/qaz', + ) + + # No leading '/' url + self.assertRaises( + ksa_exceptions.EndpointNotFound, + x_api._request, + 'GET', + 'qaz', + ) + + # Extra leading '/' url + self.assertRaises( + ksa_exceptions.connection.UnknownConnectionError, + x_api._request, + 'GET', + '//qaz', + ) + + def test_baseapi_endpoint_no_extra(self): + x_api = api.BaseAPI( + session=self.sess, + endpoint=self.BASE_URL, + ) + self.assertIsNotNone(x_api.session) + self.assertEqual(self.sess, x_api.session) + self.assertEqual(self.BASE_URL, x_api.endpoint) + + self.requests_mock.register_uri( + 'GET', + self.BASE_URL + '/qaz', + json=api_fakes.RESP_ITEM_1, + status_code=200, + ) + + # Normal url + ret = x_api._request('GET', '/qaz') + self.assertEqual(api_fakes.RESP_ITEM_1, ret.json()) + + # No leading '/' url + ret = x_api._request('GET', 'qaz') + self.assertEqual(api_fakes.RESP_ITEM_1, ret.json()) + + # Extra leading '/' url + ret = x_api._request('GET', '//qaz') + self.assertEqual(api_fakes.RESP_ITEM_1, ret.json()) + + def test_baseapi_endpoint_extra(self): + x_api = api.BaseAPI( + session=self.sess, + endpoint=self.BASE_URL + '/', + ) + self.assertIsNotNone(x_api.session) + self.assertEqual(self.sess, x_api.session) + self.assertEqual(self.BASE_URL, x_api.endpoint) + + self.requests_mock.register_uri( + 'GET', + self.BASE_URL + '/qaz', + json=api_fakes.RESP_ITEM_1, + status_code=200, + ) + + # Normal url + ret = x_api._request('GET', '/qaz') + self.assertEqual(api_fakes.RESP_ITEM_1, ret.json()) + + # No leading '/' url + ret = x_api._request('GET', 'qaz') + self.assertEqual(api_fakes.RESP_ITEM_1, ret.json()) + + # Extra leading '/' url + ret = x_api._request('GET', '//qaz') + self.assertEqual(api_fakes.RESP_ITEM_1, ret.json()) + + class TestBaseAPIArgs(api_fakes.TestSession): def setUp(self): diff -Nru python-osc-lib-1.6.0/osc_lib/tests/test_shell.py python-osc-lib-1.7.0/osc_lib/tests/test_shell.py --- python-osc-lib-1.6.0/osc_lib/tests/test_shell.py 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib/tests/test_shell.py 2017-07-10 18:36:28.000000000 +0000 @@ -112,7 +112,7 @@ '--os-default-domain': (DEFAULT_DOMAIN_NAME, True, True), '--os-cacert': ('/dev/null', True, True), '--timing': (True, True, False), - '--os-profile': ('SECRET_KEY', True, False), + '--os-profile': ('SECRET_KEY', True, True), '--os-interface': (DEFAULT_INTERFACE, True, True) } diff -Nru python-osc-lib-1.6.0/osc_lib/tests/test_utils.py python-osc-lib-1.7.0/osc_lib/tests/test_utils.py --- python-osc-lib-1.6.0/osc_lib/tests/test_utils.py 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib/tests/test_utils.py 2017-07-10 18:36:28.000000000 +0000 @@ -16,8 +16,10 @@ import time import uuid +from cliff import columns as cliff_columns import mock +from osc_lib.cli import format_columns from osc_lib import exceptions from osc_lib.tests import fakes from osc_lib.tests import utils as test_utils @@ -628,3 +630,59 @@ actual_unsorted = utils.format_list(['c', 'b', 'a'], separator='\n') self.assertEqual(expected, actual_pre_sorted) self.assertEqual(expected, actual_unsorted) + + +class TestAssertItemEqual(test_utils.TestCommand): + + def test_assert_normal_item(self): + expected = ['a', 'b', 'c'] + actual = ['a', 'b', 'c'] + self.assertItemEqual(expected, actual) + + def test_assert_item_with_formattable_columns(self): + expected = [format_columns.DictColumn({'a': 1, 'b': 2}), + format_columns.ListColumn(['x', 'y', 'z'])] + actual = [format_columns.DictColumn({'a': 1, 'b': 2}), + format_columns.ListColumn(['x', 'y', 'z'])] + self.assertItemEqual(expected, actual) + + def test_assert_item_different_length(self): + expected = ['a', 'b', 'c'] + actual = ['a', 'b'] + self.assertRaises(AssertionError, + self.assertItemEqual, expected, actual) + + def test_assert_item_formattable_columns_vs_legacy_formatter(self): + expected = [format_columns.DictColumn({'a': 1, 'b': 2}), + format_columns.ListColumn(['x', 'y', 'z'])] + actual = [utils.format_dict({'a': 1, 'b': 2}), + utils.format_list(['x', 'y', 'z'])] + self.assertRaises(AssertionError, + self.assertItemEqual, expected, actual) + + def test_assert_item_different_formattable_columns(self): + + class ExceptionColumn(cliff_columns.FormattableColumn): + def human_readable(self): + raise Exception('always fail') + + expected = [format_columns.DictColumn({'a': 1, 'b': 2})] + actual = [ExceptionColumn({'a': 1, 'b': 2})] + # AssertionError is a subclass of Exception + # so raising AssertionError ensures ExceptionColumn.human_readable() + # is not called. + self.assertRaises(AssertionError, + self.assertItemEqual, expected, actual) + + def test_assert_list_item(self): + expected = [ + ['a', 'b', 'c'], + [format_columns.DictColumn({'a': 1, 'b': 2}), + format_columns.ListColumn(['x', 'y', 'z'])] + ] + actual = [ + ['a', 'b', 'c'], + [format_columns.DictColumn({'a': 1, 'b': 2}), + format_columns.ListColumn(['x', 'y', 'z'])] + ] + self.assertListItemEqual(expected, actual) diff -Nru python-osc-lib-1.6.0/osc_lib/tests/utils.py python-osc-lib-1.7.0/osc_lib/tests/utils.py --- python-osc-lib-1.6.0/osc_lib/tests/utils.py 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib/tests/utils.py 2017-07-10 18:36:28.000000000 +0000 @@ -19,6 +19,7 @@ import mock import os +from cliff import columns as cliff_columns import fixtures from keystoneauth1 import loading from os_client_config import cloud_config @@ -130,6 +131,34 @@ self.assertEqual(value, getattr(parsed_args, attr)) return parsed_args + def assertItemEqual(self, expected, actual): + """Compare item considering formattable columns. + + This method compares an observed item to an expected item column by + column. If a column is a formattable column, observed and expected + columns are compared using human_readable() and machine_readable(). + """ + self.assertEqual(len(expected), len(actual)) + for col_expected, col_actual in zip(expected, actual): + if isinstance(col_expected, cliff_columns.FormattableColumn): + self.assertIsInstance(col_actual, col_expected.__class__) + self.assertEqual(col_expected.human_readable(), + col_actual.human_readable()) + self.assertEqual(col_expected.machine_readable(), + col_actual.machine_readable()) + else: + self.assertEqual(col_expected, col_actual) + + def assertListItemEqual(self, expected, actual): + """Compare a list of items considering formattable columns. + + Each pair of observed and expected items are compared + using assertItemEqual() method. + """ + self.assertEqual(len(expected), len(actual)) + for item_expected, item_actual in zip(expected, actual): + self.assertItemEqual(item_expected, item_actual) + class TestClientManager(TestCase): """ClientManager class test framework""" diff -Nru python-osc-lib-1.6.0/osc_lib/utils.py python-osc-lib-1.7.0/osc_lib/utils.py --- python-osc-lib-1.6.0/osc_lib/utils.py 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib/utils.py 2017-07-10 18:36:28.000000000 +0000 @@ -162,12 +162,13 @@ except Exception: pass - # Case 2: name_or_id is a name, but we have query args in kwargs - # for example: /projects/demo&domain_id=30524568d64447fbb3fa8b7891c10dd6 - try: - return manager.get(name_or_id, **kwargs) - except Exception: - pass + if kwargs: + # Case 2: name_or_id is a name, but we have query args in kwargs + # for example: /projects/demo&domain_id=30524568d64447fbb3fa8b7891c10dd + try: + return manager.get(name_or_id, **kwargs) + except Exception: + pass # Case 3: Try to get entity as integer id. Keystone does not have integer # IDs, they are UUIDs, but some things in nova do, like flavors. diff -Nru python-osc-lib-1.6.0/osc_lib.egg-info/pbr.json python-osc-lib-1.7.0/osc_lib.egg-info/pbr.json --- python-osc-lib-1.6.0/osc_lib.egg-info/pbr.json 2017-05-04 12:51:25.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib.egg-info/pbr.json 2017-07-10 18:39:10.000000000 +0000 @@ -1 +1 @@ -{"git_version": "361789f", "is_release": true} \ No newline at end of file +{"git_version": "7e7cecb", "is_release": true} \ No newline at end of file diff -Nru python-osc-lib-1.6.0/osc_lib.egg-info/PKG-INFO python-osc-lib-1.7.0/osc_lib.egg-info/PKG-INFO --- python-osc-lib-1.6.0/osc_lib.egg-info/PKG-INFO 2017-05-04 12:51:25.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib.egg-info/PKG-INFO 2017-07-10 18:39:10.000000000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: osc-lib -Version: 1.6.0 +Version: 1.7.0 Summary: OpenStackClient Library Home-page: http://docs.openstack.org/developer/osc-lib Author: OpenStack @@ -33,13 +33,13 @@ * License: Apache 2.0 .. _PyPi: https://pypi.python.org/pypi/osc-lib - .. _Online Documentation: http://docs.openstack.org/developer/osc-lib/ + .. _Online Documentation: http://docs.openstack.org/osc-lib/latest/ .. _Launchpad project: https://launchpad.net/python-openstackclient .. _Bugs: https://bugs.launchpad.net/python-openstackclient .. _Source: https://git.openstack.org/cgit/openstack/osc-lib .. _Developer: http://docs.openstack.org/project-team-guide/project-setup/python.html .. _Contributing: http://docs.openstack.org/infra/manual/developers.html - .. _Testing: http://docs.openstack.org/developer/osc-lib/developing.html#testing + .. _Testing: http://docs.openstack.org/osc-lib/latest/contributor/#testing Getting Started =============== diff -Nru python-osc-lib-1.6.0/osc_lib.egg-info/requires.txt python-osc-lib-1.7.0/osc_lib.egg-info/requires.txt --- python-osc-lib-1.6.0/osc_lib.egg-info/requires.txt 2017-05-04 12:51:25.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib.egg-info/requires.txt 2017-07-10 18:39:10.000000000 +0000 @@ -2,9 +2,9 @@ six>=1.9.0 Babel!=2.4.0,>=2.3.4 cliff>=2.6.0 -keystoneauth1>=2.20.0 +keystoneauth1>=2.21.0 os-client-config>=1.27.0 -oslo.i18n>=2.1.0 +oslo.i18n!=3.15.2,>=2.1.0 oslo.utils>=3.20.0 simplejson>=2.2.0 stevedore>=1.20.0 diff -Nru python-osc-lib-1.6.0/osc_lib.egg-info/SOURCES.txt python-osc-lib-1.7.0/osc_lib.egg-info/SOURCES.txt --- python-osc-lib-1.6.0/osc_lib.egg-info/SOURCES.txt 2017-05-04 12:51:26.000000000 +0000 +++ python-osc-lib-1.7.0/osc_lib.egg-info/SOURCES.txt 2017-07-10 18:39:11.000000000 +0000 @@ -14,10 +14,13 @@ doc/Makefile doc/ext/__init__.py doc/ext/apidoc.py -doc/source/change_log.rst doc/source/conf.py doc/source/index.rst -doc/source/transition.rst +doc/source/contributor/index.rst +doc/source/reference/index.rst +doc/source/user/change_log.rst +doc/source/user/index.rst +doc/source/user/transition.rst osc_lib/__init__.py osc_lib/clientmanager.py osc_lib/exceptions.py @@ -71,6 +74,7 @@ releasenotes/notes/arg-precedence-1ba9fd6929650830.yaml releasenotes/notes/bug-1558690-1528b637f2c0a449.yaml releasenotes/notes/bug-1630822-mask-password-on-debug-20dcdf1c54e84fa1.yaml +releasenotes/notes/os-profile-as-environment-variable-a5e232e9ca7c5171.yaml releasenotes/notes/shell-argv-decode-cdc13dc0c4ec07af.yaml releasenotes/source/conf.py releasenotes/source/index.rst diff -Nru python-osc-lib-1.6.0/PKG-INFO python-osc-lib-1.7.0/PKG-INFO --- python-osc-lib-1.6.0/PKG-INFO 2017-05-04 12:51:26.000000000 +0000 +++ python-osc-lib-1.7.0/PKG-INFO 2017-07-10 18:39:12.000000000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: osc-lib -Version: 1.6.0 +Version: 1.7.0 Summary: OpenStackClient Library Home-page: http://docs.openstack.org/developer/osc-lib Author: OpenStack @@ -33,13 +33,13 @@ * License: Apache 2.0 .. _PyPi: https://pypi.python.org/pypi/osc-lib - .. _Online Documentation: http://docs.openstack.org/developer/osc-lib/ + .. _Online Documentation: http://docs.openstack.org/osc-lib/latest/ .. _Launchpad project: https://launchpad.net/python-openstackclient .. _Bugs: https://bugs.launchpad.net/python-openstackclient .. _Source: https://git.openstack.org/cgit/openstack/osc-lib .. _Developer: http://docs.openstack.org/project-team-guide/project-setup/python.html .. _Contributing: http://docs.openstack.org/infra/manual/developers.html - .. _Testing: http://docs.openstack.org/developer/osc-lib/developing.html#testing + .. _Testing: http://docs.openstack.org/osc-lib/latest/contributor/#testing Getting Started =============== diff -Nru python-osc-lib-1.6.0/README.rst python-osc-lib-1.7.0/README.rst --- python-osc-lib-1.6.0/README.rst 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/README.rst 2017-07-10 18:36:28.000000000 +0000 @@ -25,13 +25,13 @@ * License: Apache 2.0 .. _PyPi: https://pypi.python.org/pypi/osc-lib -.. _Online Documentation: http://docs.openstack.org/developer/osc-lib/ +.. _Online Documentation: http://docs.openstack.org/osc-lib/latest/ .. _Launchpad project: https://launchpad.net/python-openstackclient .. _Bugs: https://bugs.launchpad.net/python-openstackclient .. _Source: https://git.openstack.org/cgit/openstack/osc-lib .. _Developer: http://docs.openstack.org/project-team-guide/project-setup/python.html .. _Contributing: http://docs.openstack.org/infra/manual/developers.html -.. _Testing: http://docs.openstack.org/developer/osc-lib/developing.html#testing +.. _Testing: http://docs.openstack.org/osc-lib/latest/contributor/#testing Getting Started =============== diff -Nru python-osc-lib-1.6.0/releasenotes/notes/os-profile-as-environment-variable-a5e232e9ca7c5171.yaml python-osc-lib-1.7.0/releasenotes/notes/os-profile-as-environment-variable-a5e232e9ca7c5171.yaml --- python-osc-lib-1.6.0/releasenotes/notes/os-profile-as-environment-variable-a5e232e9ca7c5171.yaml 1970-01-01 00:00:00.000000000 +0000 +++ python-osc-lib-1.7.0/releasenotes/notes/os-profile-as-environment-variable-a5e232e9ca7c5171.yaml 2017-07-10 18:36:28.000000000 +0000 @@ -0,0 +1,6 @@ +--- +features: + - | + ``--os-profile`` argument can be loaded from ``OS_PROFILE`` + environment variables to avoid repeating ``--os-profile`` + in openstack commands. \ No newline at end of file diff -Nru python-osc-lib-1.6.0/releasenotes/source/conf.py python-osc-lib-1.7.0/releasenotes/source/conf.py --- python-osc-lib-1.6.0/releasenotes/source/conf.py 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/releasenotes/source/conf.py 2017-07-10 18:36:28.000000000 +0000 @@ -27,6 +27,8 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. +import openstackdocstheme + # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ @@ -39,7 +41,6 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'oslosphinx', 'reno.sphinxext', 'sphinx.ext.extlinks', ] @@ -148,7 +149,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = 'openstackdocs' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -158,6 +159,7 @@ # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] +html_theme_path = [openstackdocstheme.get_html_theme_path()] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". diff -Nru python-osc-lib-1.6.0/requirements.txt python-osc-lib-1.7.0/requirements.txt --- python-osc-lib-1.6.0/requirements.txt 2017-05-04 12:49:10.000000000 +0000 +++ python-osc-lib-1.7.0/requirements.txt 2017-07-10 18:36:28.000000000 +0000 @@ -6,9 +6,9 @@ Babel!=2.4.0,>=2.3.4 # BSD cliff>=2.6.0 # Apache-2.0 -keystoneauth1>=2.20.0 # Apache-2.0 +keystoneauth1>=2.21.0 # Apache-2.0 os-client-config>=1.27.0 # Apache-2.0 -oslo.i18n>=2.1.0 # Apache-2.0 +oslo.i18n!=3.15.2,>=2.1.0 # Apache-2.0 oslo.utils>=3.20.0 # Apache-2.0 simplejson>=2.2.0 # MIT stevedore>=1.20.0 # Apache-2.0 diff -Nru python-osc-lib-1.6.0/setup.cfg python-osc-lib-1.7.0/setup.cfg --- python-osc-lib-1.6.0/setup.cfg 2017-05-04 12:51:26.000000000 +0000 +++ python-osc-lib-1.7.0/setup.cfg 2017-07-10 18:39:12.000000000 +0000 @@ -26,6 +26,13 @@ source-dir = doc/source build-dir = doc/build all_files = 1 +warning-is-error = 1 + +[pbr] +autodoc_index_modules = True +api_doc_dir = reference/api +autodoc_exclude_modules = + osc_lib.tests.* [egg_info] tag_build = diff -Nru python-osc-lib-1.6.0/test-requirements.txt python-osc-lib-1.7.0/test-requirements.txt --- python-osc-lib-1.6.0/test-requirements.txt 2017-05-04 12:49:09.000000000 +0000 +++ python-osc-lib-1.7.0/test-requirements.txt 2017-07-10 18:36:28.000000000 +0000 @@ -3,12 +3,12 @@ # process, which may cause wedges in the gate later. hacking<0.11,>=0.10.0 -coverage>=4.0 # Apache-2.0 +coverage!=4.4,>=4.0 # Apache-2.0 fixtures>=3.0.0 # Apache-2.0/BSD mock>=2.0 # BSD oslotest>=1.10.0 # Apache-2.0 requests-mock>=1.1 # Apache-2.0 -sphinx>=1.5.1 # BSD +sphinx>=1.6.2 # BSD os-testr>=0.8.0 # Apache-2.0 testrepository>=0.0.18 # Apache-2.0/BSD testtools>=1.4.0 # MIT @@ -16,5 +16,5 @@ bandit>=1.1.0 # Apache-2.0 # Documentation -oslosphinx>=4.7.0 # Apache-2.0 -reno>=1.8.0 # Apache-2.0 +openstackdocstheme>=1.11.0 # Apache-2.0 +reno!=2.3.1,>=1.8.0 # Apache-2.0