Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-cliff for openSUSE:Factory 
checked in at 2024-01-05 21:45:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-cliff (Old)
 and      /work/SRC/openSUSE:Factory/.python-cliff.new.28375 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-cliff"

Fri Jan  5 21:45:37 2024 rev:41 rq:1137085 version:4.4.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-cliff/python-cliff.changes        
2022-05-14 22:52:39.031027520 +0200
+++ /work/SRC/openSUSE:Factory/.python-cliff.new.28375/python-cliff.changes     
2024-01-05 21:47:00.634566202 +0100
@@ -2 +2 @@
-Sat May 14 12:26:14 UTC 2022 - [email protected]
+Thu Jan  4 23:04:20 UTC 2024 - Dirk Müller <[email protected]>
@@ -4,21 +4,36 @@
-- update to version 3.10.1
-  - Removing modindex link from docs
-  - Automatically page interactive root help output
-
--------------------------------------------------------------------
-Fri May 13 22:33:11 UTC 2022 - Dirk Müller <[email protected]>
-
-- remove six dependency 
-
--------------------------------------------------------------------
-Tue Oct 26 22:13:33 UTC 2021 - [email protected]
-
-- update to version 3.9.0
-  - Add Python3 xena unit tests
-  - Replace getargspec with getfullargspec
-  - Handle SIGPIPE exit gracefully
-  - setup.cfg: Replace dashes with underscores
-  - Update unit test to satisfy python3.10+
-  - Add conflict_handler parameter as attribut in Command class
-  - Use py3 as the default runtime for tox
-  - Colourise and automatically page help output
+- update to 4.4.0:
+  * Handle complex objects in yaml formatter better
+  * Fix pre-commit issues
+  * Autofit table output if stdout is a tty
+  * Fix flake8 violation E721
+  * Use upper-constraint in doc generation
+  * Removing helper functions providing Python < 3.3
+    compatibility
+  * Strip trailing periods when getting description
+  * Clarification of the algorithm used
+  * columns: Useful \_\_str\_\_, \_\_repr\_\_ implementation
+  * Add Python3 antelope unit tests
+  * Removing brackets around tested conditional
+  * Replace abc.abstractproperty with property and
+    abc.abstractmethod
+  * Remove final use of pkg\_resources
+  * Defer loading PyYAML
+  * Defer loading cmd2
+  * requirements: Remove explicit python-subunit dependency
+  * requirements: Remove explicit pbr dependency
+  * requirements: Remove explicit pyparsing dependency
+  * Update Python testing per Zed cycle testing runtime
+  * Migrate Python 3.6/7 jobs to Python 3.8
+  * Removing modindex link from docs
+  * Add Python3 yoga unit tests
+  * Automatically page interactive root help output
+  * Colourise and automatically page help output
+  * Update unit test to satisfy python3.10+
+  * Handle SIGPIPE exit gracefully
+  * Add conflict\_handler parameter as attribut in Command class
+  * setup.cfg: Replace dashes with underscores
+  * Replace getargspec with getfullargspec
+  * setup.cfg: Replace dashes with underscores
+  * Use py3 as the default runtime for tox
+  * Add Python3 xena unit tests
+- switch to singlespec

Old:
----
  _service
  cliff-3.10.1.tar.gz

New:
----
  cliff-4.4.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-cliff.spec ++++++
--- /var/tmp/diff_new_pack.YkJavD/_old  2024-01-05 21:47:01.102583329 +0100
+++ /var/tmp/diff_new_pack.YkJavD/_new  2024-01-05 21:47:01.102583329 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-cliff
 #
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,86 +17,61 @@
 
 
 Name:           python-cliff
-Version:        3.10.1
+Version:        4.4.0
 Release:        0
 Summary:        Command Line Interface Formulation Framework
 License:        Apache-2.0
-Group:          Development/Languages/Python
-URL:            https://docs.openstack.org/cliff
-Source0:        
https://files.pythonhosted.org/packages/source/c/cliff/cliff-3.10.1.tar.gz
-BuildRequires:  openstack-macros
-BuildRequires:  python3-PrettyTable
-BuildRequires:  python3-PyYAML
-BuildRequires:  python3-autopage
-BuildRequires:  python3-cmd2
-BuildRequires:  python3-docutils
-BuildRequires:  python3-fixtures
-BuildRequires:  python3-pbr
-BuildRequires:  python3-pytest
-BuildRequires:  python3-python-subunit
-BuildRequires:  python3-stevedore
-BuildRequires:  python3-testscenarios
-BuildRequires:  python3-testtools
+URL:            https://docs.openstack.org/cliff/latest/
+Source:         
https://files.pythonhosted.org/packages/source/c/cliff/cliff-%{version}.tar.gz
+BuildRequires:  %{python_module pip}
+BuildRequires:  %{python_module setuptools}
+BuildRequires:  %{python_module wheel}
+BuildRequires:  python-rpm-macros
+# SECTION test requirements
+BuildRequires:  %{python_module autopage >= 0.4.0}
+BuildRequires:  %{python_module PrettyTable >= 0.7.2}
+BuildRequires:  %{python_module PyYAML >= 3.12}
+BuildRequires:  %{python_module Sphinx >= 2.0.0}
+BuildRequires:  %{python_module cmd2 >= 1.0.0}
+BuildRequires:  %{python_module coverage >= 4.0}
+BuildRequires:  %{python_module fixtures}
+BuildRequires:  %{python_module importlib_metadata >= 4.4}
+BuildRequires:  %{python_module pytest}
+BuildRequires:  %{python_module stevedore >= 2.0.1}
+BuildRequires:  %{python_module testscenarios >= 0.4}
+BuildRequires:  %{python_module testtools >= 2.2.0}
+# /SECTION
+BuildRequires:  fdupes
+Requires:       python-PrettyTable >= 0.7.2
+Requires:       python-PyYAML >= 3.12
+Requires:       python-autopage >= 0.4.0
+Requires:       python-cmd2 >= 1.0.0
+Requires:       python-importlib_metadata >= 4.4
+Requires:       python-stevedore >= 2.0.1
 BuildArch:      noarch
+%python_subpackages
 
 %description
-cliff is a framework for building command line programs. It uses
-setuptools entry points to provide subcommands, output formatters, and
-other extensions.
-
-%package -n python3-cliff
-Summary:        Command Line Interface Formulation Framework
-Requires:       python3-PrettyTable
-Requires:       python3-PyYAML
-Requires:       python3-autopage
-Requires:       python3-cmd2
-Requires:       python3-pyparsing
-Requires:       python3-stevedore
-
-%description -n python3-cliff
-cliff is a framework for building command line programs. It uses
-setuptools entry points to provide subcommands, output formatters, and
-other extensions.
-
-This package contains the Python 3.x module.
-
-%package -n python-cliff-doc
-Summary:        %{summary} - Documentation
-Group:          Documentation/HTML
-BuildRequires:  python3-Sphinx
-BuildRequires:  python3-openstackdocstheme
-
-%description -n python-cliff-doc
-cliff is a framework for building command line programs. It uses
-setuptools entry points to provide subcommands, output formatters, and
-other extensions.
-
-This package contains documentation files for %{name}.
+Command Line Interface Formulation Framework
 
 %prep
-%autosetup -p1 -n cliff-3.10.1
-%py_req_cleanup
+%autosetup -p1 -n cliff-%{version}
 
 %build
-%py3_build
-PBR_VERSION=3.10.1 PYTHONPATH=. %sphinx_build -b html doc/source doc/build/html
-rm -rf doc/build/html/.{doctrees,buildinfo}
+%pyproject_wheel
 
 %install
-%py3_install
+%pyproject_install
+%python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
 # doesn't work with pytest atm
 rm -v cliff/tests/test_commandmanager.py
-python3 -m pytest cliff/tests
-
-%files -n python3-cliff
-%license LICENSE
-%doc ChangeLog README.rst
-%{python3_sitelib}/cliff
-%{python3_sitelib}/*.egg-info
+%pytest cliff/tests
 
-%files -n python-cliff-doc
+%files %{python_files}
+%doc AUTHORS ChangeLog README.rst
 %license LICENSE
-%doc doc/build/html
+%{python_sitelib}/cliff
+%{python_sitelib}/cliff-%{version}.dist-info
 

++++++ cliff-3.10.1.tar.gz -> cliff-4.4.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/.pre-commit-config.yaml 
new/cliff-4.4.0/.pre-commit-config.yaml
--- old/cliff-3.10.1/.pre-commit-config.yaml    1970-01-01 01:00:00.000000000 
+0100
+++ new/cliff-4.4.0/.pre-commit-config.yaml     2023-11-14 11:07:31.000000000 
+0100
@@ -0,0 +1,33 @@
+---
+default_language_version:
+  # force all unspecified python hooks to run python3
+  python: python3
+repos:
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.4.0
+    hooks:
+      - id: trailing-whitespace
+      - id: mixed-line-ending
+        args: ['--fix', 'lf']
+        exclude: '.*\.(svg)$'
+      - id: check-byte-order-marker
+      - id: check-executables-have-shebangs
+      - id: check-merge-conflict
+      - id: debug-statements
+      - id: check-yaml
+        files: .*\.(yaml|yml)$
+        exclude: '^zuul.d/.*$'
+  - repo: https://github.com/PyCQA/bandit
+    rev: 1.7.5
+    hooks:
+      - id: bandit
+        args: ['-c', 'bandit.yaml']
+#  - repo: https://github.com/psf/black
+#    rev: 23.3.0
+#    hooks:
+#      - id: black
+#        args: ['-S', '-l', '79']
+  - repo: https://github.com/pycqa/flake8
+    rev: 6.1.0
+    hooks:
+      - id: flake8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/.zuul.yaml new/cliff-4.4.0/.zuul.yaml
--- old/cliff-3.10.1/.zuul.yaml 2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/.zuul.yaml  2023-11-14 11:07:31.000000000 +0100
@@ -1,6 +1,6 @@
 - job:
-    name: cliff-tox-py37-neutronclient-tip
-    parent: openstack-tox-py37
+    name: cliff-tox-py38-neutronclient-tip
+    parent: openstack-tox-py38
     description: |
       Run unit tests for neutronclient with master branch of cliff
 
@@ -23,15 +23,15 @@
     templates:
       - check-requirements
       - lib-forward-testing-python3
-      - openstack-python3-xena-jobs
+      - openstack-python3-antelope-jobs
       - publish-openstack-docs-pti
     check:
       jobs:
-        - cliff-tox-py37-neutronclient-tip
-        - osc-tox-py36-tips:
+        - cliff-tox-py38-neutronclient-tip
+        - osc-tox-py38-tips:
             branches: ^master$
     gate:
       jobs:
-        - cliff-tox-py37-neutronclient-tip
-        - osc-tox-py36-tips:
+        - cliff-tox-py38-neutronclient-tip
+        - osc-tox-py38-tips:
             branches: ^master$
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/AUTHORS new/cliff-4.4.0/AUTHORS
--- old/cliff-3.10.1/AUTHORS    2022-02-18 16:45:43.000000000 +0100
+++ new/cliff-4.4.0/AUTHORS     2023-11-14 11:08:01.000000000 +0100
@@ -62,6 +62,7 @@
 Nguyen Hung Phuong <[email protected]>
 Nicola Soranzo <[email protected]>
 OpenStack Release Bot <[email protected]>
+Pavlo Shchelokovskyy <[email protected]>
 Pierre-André MOREY <[email protected]>
 Qiu Yu <[email protected]>
 Rajath Agasthya <[email protected]>
@@ -77,6 +78,7 @@
 Stephen Finucane <[email protected]>
 Steve Baker <[email protected]>
 Steve Martinelli <[email protected]>
+Takashi Kajinami <[email protected]>
 Terry Howe <[email protected]>
 TerryHowe <[email protected]>
 Thiago Paiva Brito <[email protected]>
@@ -88,6 +90,7 @@
 Vincent Legoll <[email protected]>
 Vitalii Kulanov <[email protected]>
 Yalei Wang <[email protected]>
+Yandong Xuan <[email protected]>
 Yossi Ovadia <[email protected]>
 Yushiro FURUKAWA <[email protected]>
 Zane Bitter <[email protected]>
@@ -103,6 +106,7 @@
 likui <[email protected]>
 lingyongxu <[email protected]>
 liyingjun <[email protected]>
+ljhuang <[email protected]>
 markmcclain <[email protected]>
 matbu <[email protected]>
 melissaml <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/ChangeLog new/cliff-4.4.0/ChangeLog
--- old/cliff-3.10.1/ChangeLog  2022-02-18 16:45:43.000000000 +0100
+++ new/cliff-4.4.0/ChangeLog   2023-11-14 11:08:01.000000000 +0100
@@ -1,6 +1,47 @@
 CHANGES
 =======
 
+4.4.0
+-----
+
+* Handle complex objects in yaml formatter better
+* Add pre-commit
+* Fix pre-commit issues
+* Autofit table output if stdout is a tty
+* Fix flake8 violation E721
+* Use upper-constraint in doc generation
+
+4.3.0
+-----
+
+* Removing helper functions providing Python < 3.3 compatibility
+
+4.2.0
+-----
+
+* Strip trailing periods when getting description
+* Clarification of the algorithm used
+
+4.1.0
+-----
+
+* columns: Useful \_\_str\_\_, \_\_repr\_\_ implementation
+* Add Python3 antelope unit tests
+
+4.0.0
+-----
+
+* Removing brackets around tested conditional
+* Replace abc.abstractproperty with property and abc.abstractmethod
+* Remove final use of pkg\_resources
+* Defer loading PyYAML
+* Defer loading cmd2
+* requirements: Remove explicit python-subunit dependency
+* requirements: Remove explicit pbr dependency
+* requirements: Remove explicit pyparsing dependency
+* Update Python testing per Zed cycle testing runtime
+* Migrate Python 3.6/7 jobs to Python 3.8
+
 3.10.1
 ------
 
@@ -9,6 +50,7 @@
 3.10.0
 ------
 
+* Add Python3 yoga unit tests
 
 3.9.0
 -----
@@ -24,6 +66,7 @@
 
 * setup.cfg: Replace dashes with underscores
 * Replace getargspec with getfullargspec
+* setup.cfg: Replace dashes with underscores
 * Use py3 as the default runtime for tox
 * Add Python3 xena unit tests
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/PKG-INFO new/cliff-4.4.0/PKG-INFO
--- old/cliff-3.10.1/PKG-INFO   2022-02-18 16:45:43.983875300 +0100
+++ new/cliff-4.4.0/PKG-INFO    2023-11-14 11:08:01.258277400 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: cliff
-Version: 3.10.1
+Version: 4.4.0
 Summary: Command Line Interface Formulation Framework
 Home-page: https://docs.openstack.org/cliff/latest/
 Author: OpenStack
@@ -37,11 +37,10 @@
 Classifier: License :: OSI Approved :: Apache Software License
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Intended Audience :: Developers
 Classifier: Environment :: Console
-Requires-Python: >=3.6
+Requires-Python: >=3.8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/bandit.yaml new/cliff-4.4.0/bandit.yaml
--- old/cliff-3.10.1/bandit.yaml        2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/bandit.yaml 2023-11-14 11:07:31.000000000 +0100
@@ -1,2 +1,4 @@
 skips:
   - B110
+exclude_dirs:
+  - tests
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/app.py 
new/cliff-4.4.0/cliff/app.py
--- old/cliff-3.10.1/cliff/app.py       2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/app.py        2023-11-14 11:07:31.000000000 +0100
@@ -20,8 +20,6 @@
 import os
 import sys
 
-import cmd2
-
 from cliff import _argparse
 from . import complete
 from . import help
@@ -403,7 +401,12 @@
             try:
                 parsed_args = cmd_parser.parse_args(sub_argv)
             except SystemExit as ex:
-                raise cmd2.exceptions.Cmd2ArgparseError from ex
+                if self.interactive_mode:
+                    # Defer importing cmd2 as it is a slow import
+                    import cmd2
+                    raise cmd2.exceptions.Cmd2ArgparseError from ex
+                else:
+                    raise ex
             result = cmd.run(parsed_args)
         except BrokenPipeError as err1:
             result = _SIGPIPE_EXIT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/columns.py 
new/cliff-4.4.0/cliff/columns.py
--- old/cliff-3.10.1/cliff/columns.py   2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/columns.py    2023-11-14 11:07:31.000000000 +0100
@@ -31,6 +31,12 @@
             self.__class__ == other.__class__ and self._value < other._value
         )
 
+    def __str__(self):
+        return self.human_readable()
+
+    def __repr__(self):
+        return '%s(%r)' % (self.__class__.__name__, self.machine_readable())
+
     @abc.abstractmethod
     def human_readable(self):
         """Return a basic human readable version of the data."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/command.py 
new/cliff-4.4.0/cliff/command.py
--- old/cliff-3.10.1/cliff/command.py   2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/command.py    2023-11-14 11:07:31.000000000 +0100
@@ -13,6 +13,7 @@
 import abc
 import inspect
 
+import importlib_metadata
 from stevedore import extension
 
 from cliff import _argparse
@@ -27,26 +28,15 @@
     distribution name (the name used with pip and PyPI) do not
     always match. We want to report which distribution caused the
     command to be installed, so we need to look up the values.
-
     """
-    import pkg_resources
     global _dists_by_mods
     if _dists_by_mods is None:
-        results = {}
-        for dist in pkg_resources.working_set:
-            try:
-                mod_names = dist.get_metadata('top_level.txt').strip()
-            except Exception:
-                # Could not retrieve metadata. Either the file is not
-                # present or we cannot read it. Ignore the
-                # distribution.
-                pass
-            else:
-                # Distributions may include multiple top-level
-                # packages (see setuptools for an example).
-                for mod_name in mod_names.splitlines():
-                    results[mod_name] = dist.project_name
-        _dists_by_mods = results
+        # There can be multiple distribution in the case of namespace packages
+        # so we'll just grab the first one
+        _dists_by_mods = {
+            k: v[0] for k, v in
+            importlib_metadata.packages_distributions().items()
+        }
     return _dists_by_mods
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/display.py 
new/cliff-4.4.0/cliff/display.py
--- old/cliff-3.10.1/cliff/display.py   2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/display.py    2023-11-14 11:07:31.000000000 +0100
@@ -29,11 +29,13 @@
                                                  cmd_name=cmd_name)
         self._formatter_plugins = self._load_formatter_plugins()
 
-    @abc.abstractproperty
+    @property
+    @abc.abstractmethod
     def formatter_namespace(self):
         "String specifying the namespace to use for loading formatter plugins."
 
-    @abc.abstractproperty
+    @property
+    @abc.abstractmethod
     def formatter_default(self):
         "String specifying the name of the default formatter."
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/formatters/table.py 
new/cliff-4.4.0/cliff/formatters/table.py
--- old/cliff-3.10.1/cliff/formatters/table.py  2022-02-18 16:44:27.000000000 
+0100
+++ new/cliff-4.4.0/cliff/formatters/table.py   2023-11-14 11:07:31.000000000 
+0100
@@ -13,6 +13,7 @@
 """Output formatters using prettytable."""
 
 import os
+import sys
 
 import prettytable
 
@@ -32,6 +33,14 @@
     return new_row
 
 
+def _do_fit(fit_width):
+    if os.name == 'nt':
+        # NOTE(pas-ha) the isatty is not reliable enough on Windows,
+        # so do not try to auto-fit
+        return fit_width
+    return sys.stdout.isatty() or fit_width
+
+
 class TableFormatter(base.ListFormatter, base.SingleFormatter):
 
     ALIGNMENTS = {
@@ -100,7 +109,7 @@
         # preference to wrapping columns smaller than 8 characters.
         min_width = 8
         self._assign_max_widths(
-            stdout, x, int(parsed_args.max_width), min_width,
+            x, int(parsed_args.max_width), min_width,
             parsed_args.fit_width)
 
         formatted = x.get_string()
@@ -125,7 +134,7 @@
         # the Field column readable.
         min_width = 16
         self._assign_max_widths(
-            stdout, x, int(parsed_args.max_width), min_width,
+            x, int(parsed_args.max_width), min_width,
             parsed_args.fit_width)
 
         formatted = x.get_string()
@@ -170,14 +179,18 @@
         return shrink_fields, shrink_remaining
 
     @staticmethod
-    def _assign_max_widths(stdout, x, max_width, min_width=0, fit_width=False):
+    def _assign_max_widths(x, max_width, min_width=0, fit_width=False):
+        """Set maximum widths for columns of table `x`,
+        with the last column recieving either leftover columns
+        or `min_width`, depending on what offers more space.
+        """
         if max_width > 0:
             term_width = max_width
-        elif not fit_width:
+        elif not _do_fit(fit_width):
             # Fitting is disabled
             return
         else:
-            term_width = utils.terminal_width(stdout)
+            term_width = utils.terminal_width()
             if not term_width:
                 # not a tty, so do not set any max widths
                 return
@@ -204,6 +217,6 @@
             x.max_width[field] = max(min_width, shrink_to)
             shrink_remaining -= shrink_to
 
-        # give the last shrinkable column shrink_to plus any remaining
+        # give the last shrinkable column any remaining shrink or min_width
         field = shrink_fields[-1]
         x.max_width[field] = max(min_width, shrink_remaining)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/formatters/yaml_format.py 
new/cliff-4.4.0/cliff/formatters/yaml_format.py
--- old/cliff-3.10.1/cliff/formatters/yaml_format.py    2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/formatters/yaml_format.py     2023-11-14 
11:07:31.000000000 +0100
@@ -13,33 +13,41 @@
 """Output formatters using PyYAML.
 """
 
-import yaml
-
 from . import base
 from cliff import columns
 
 
+def _yaml_friendly(value):
+    if isinstance(value, columns.FormattableColumn):
+        return value.machine_readable()
+    elif hasattr(value, "toDict"):
+        return value.toDict()
+    elif hasattr(value, "to_dict"):
+        return value.to_dict()
+    else:
+        return value
+
+
 class YAMLFormatter(base.ListFormatter, base.SingleFormatter):
 
     def add_argument_group(self, parser):
         pass
 
     def emit_list(self, column_names, data, stdout, parsed_args):
+        # the yaml import is slow, so defer loading until we know we want it
+        import yaml
+
         items = []
         for item in data:
             items.append(
-                {n: (i.machine_readable()
-                     if isinstance(i, columns.FormattableColumn)
-                     else i)
-                 for n, i in zip(column_names, item)}
+                {n: _yaml_friendly(i) for n, i in zip(column_names, item)}
             )
         yaml.safe_dump(items, stream=stdout, default_flow_style=False)
 
     def emit_one(self, column_names, data, stdout, parsed_args):
+        # the yaml import is slow, so defer loading until we know we want it
+        import yaml
+
         for key, value in zip(column_names, data):
-            dict_data = {
-                key: (value.machine_readable()
-                      if isinstance(value, columns.FormattableColumn)
-                      else value)
-            }
+            dict_data = {key: _yaml_friendly(value)}
             yaml.safe_dump(dict_data, stream=stdout, default_flow_style=False)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/help.py 
new/cliff-4.4.0/cliff/help.py
--- old/cliff-3.10.1/cliff/help.py      2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/help.py       2023-11-14 11:07:31.000000000 +0100
@@ -75,7 +75,7 @@
                     if namespace.debug:
                         traceback.print_exc(file=out)
                     continue
-                one_liner = cmd.get_description().split('\n')[0]
+                one_liner = cmd.get_description().split('\n')[0].rstrip('.')
                 dist_name = dist_for_obj(factory)
                 if dist_name and dist_name != app_dist:
                     dist_info = ' (' + dist_name + ')'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/tests/test_app.py 
new/cliff-4.4.0/cliff/tests/test_app.py
--- old/cliff-3.10.1/cliff/tests/test_app.py    2022-02-18 16:44:27.000000000 
+0100
+++ new/cliff-4.4.0/cliff/tests/test_app.py     2023-11-14 11:07:31.000000000 
+0100
@@ -321,7 +321,7 @@
                 return parser
 
             def take_action(self, parsed_args):
-                assert(parsed_args.end == '123')
+                assert parsed_args.end == '123'
 
         class MyCommandManager(commandmanager.CommandManager):
             def load_commands(self, namespace):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/tests/test_columns.py 
new/cliff-4.4.0/cliff/tests/test_columns.py
--- old/cliff-3.10.1/cliff/tests/test_columns.py        2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/tests/test_columns.py 2023-11-14 11:07:31.000000000 
+0100
@@ -23,17 +23,31 @@
 
 class TestColumns(unittest.TestCase):
 
-    def test_faux_column_machine(self):
+    def test_machine_readable(self):
         c = FauxColumn(['list', 'of', 'values'])
         self.assertEqual(['list', 'of', 'values'], c.machine_readable())
 
-    def test_faux_column_human(self):
+    def test_human_readable(self):
         c = FauxColumn(['list', 'of', 'values'])
         self.assertEqual(
-            u"I made this string myself: ['list', 'of', 'values']",
+            "I made this string myself: ['list', 'of', 'values']",
             c.human_readable(),
         )
 
+    def test_str(self):
+        c = FauxColumn(['list', 'of', 'values'])
+        self.assertEqual(
+            "I made this string myself: ['list', 'of', 'values']",
+            str(c),
+        )
+
+    def test_repr(self):
+        c = FauxColumn(['list', 'of', 'values'])
+        self.assertEqual(
+            "FauxColumn(['list', 'of', 'values'])",
+            repr(c),
+        )
+
     def test_sorting(self):
         cols = [
             FauxColumn('foo'),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/tests/test_formatters_table.py 
new/cliff-4.4.0/cliff/tests/test_formatters_table.py
--- old/cliff-3.10.1/cliff/tests/test_formatters_table.py       2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/tests/test_formatters_table.py        2023-11-14 
11:07:31.000000000 +0100
@@ -50,7 +50,7 @@
     if extra_args is None:
         # Default to no CLI arguments
         parsed_args = args()
-    elif type(extra_args) == args:
+    elif isinstance(extra_args, args):
         # Use the given CLI arguments
         parsed_args = extra_args
     else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/tests/test_formatters_yaml.py 
new/cliff-4.4.0/cliff/tests/test_formatters_yaml.py
--- old/cliff-3.10.1/cliff/tests/test_formatters_yaml.py        2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/tests/test_formatters_yaml.py 2023-11-14 
11:07:31.000000000 +0100
@@ -22,6 +22,23 @@
 from cliff.tests import test_columns
 
 
+class _toDict:
+
+    def __init__(self, **kwargs):
+        self._data = kwargs
+
+    def toDict(self):
+        return self._data
+
+
+class _to_Dict:
+    def __init__(self, **kwargs):
+        self._data = kwargs
+
+    def to_dict(self):
+        return self._data
+
+
 class TestYAMLFormatter(base.TestBase):
 
     def test_format_one(self):
@@ -98,3 +115,39 @@
         sf.emit_list(c, d, output, args)
         actual = yaml.safe_load(output.getvalue())
         self.assertEqual(expected, actual)
+
+    def test_one_custom_object(self):
+        sf = yaml_format.YAMLFormatter()
+        c = ('a', 'b', 'toDict', 'to_dict')
+        d = ('A', 'B', _toDict(spam="ham"), _to_Dict(ham="eggs"))
+        expected = {
+            'a': 'A',
+            'b': 'B',
+            'toDict': {"spam": "ham"},
+            'to_dict': {"ham": "eggs"}
+        }
+        output = StringIO()
+        args = mock.Mock()
+        sf.emit_one(c, d, output, args)
+        actual = yaml.safe_load(output.getvalue())
+        self.assertEqual(expected, actual)
+
+    def test_list_custom_object(self):
+        sf = yaml_format.YAMLFormatter()
+        c = ('a', 'toDict', 'to_dict')
+        d = (
+            ('A1', _toDict(B=1), _to_Dict(C=1)),
+            ('A2', _toDict(B=2), _to_Dict(C=2)),
+            ('A3', _toDict(B=3), _to_Dict(C=3))
+        )
+        expected = [
+            {'a': 'A1', 'toDict': {'B': 1}, 'to_dict': {'C': 1}},
+            {'a': 'A2', 'toDict': {'B': 2}, 'to_dict': {'C': 2}},
+            {'a': 'A3', 'toDict': {'B': 3}, 'to_dict': {'C': 3}}
+        ]
+        output = StringIO()
+        args = mock.Mock()
+        sf.add_argument_group(args)
+        sf.emit_list(c, d, output, args)
+        actual = yaml.safe_load(output.getvalue())
+        self.assertEqual(expected, actual)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/tests/test_help.py 
new/cliff-4.4.0/cliff/tests/test_help.py
--- old/cliff-3.10.1/cliff/tests/test_help.py   2022-02-18 16:44:27.000000000 
+0100
+++ new/cliff-4.4.0/cliff/tests/test_help.py    2023-11-14 11:07:31.000000000 
+0100
@@ -103,8 +103,8 @@
         self.assertIn('usage: %s [--version]' % basecommand, help_text)
         self.assertRegex(help_text, 'option(s|al arguments):\n  --version')
         expected = (
-            '  one            Test command.\n'
-            '  three word command  Test command.\n'
+            '  one            Test command\n'
+            '  three word command  Test command\n'
         )
         self.assertIn(expected, help_text)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/tests/test_utils.py 
new/cliff-4.4.0/cliff/tests/test_utils.py
--- old/cliff-3.10.1/cliff/tests/test_utils.py  2022-02-18 16:44:27.000000000 
+0100
+++ new/cliff-4.4.0/cliff/tests/test_utils.py   2023-11-14 11:07:31.000000000 
+0100
@@ -13,7 +13,6 @@
 #  under the License.
 
 import os
-import sys
 from unittest import mock
 
 from cliff.tests import base
@@ -23,7 +22,7 @@
 class TestTerminalWidth(base.TestBase):
 
     def test(self):
-        width = utils.terminal_width(sys.stdout)
+        width = utils.terminal_width()
         # Results are specific to the execution environment, so only assert
         # that no error is raised.
         if width is not None:
@@ -33,8 +32,8 @@
     def test_get_terminal_size(self, mock_os):
         ts = os.terminal_size((10, 5))
         mock_os.get_terminal_size.return_value = ts
-        width = utils.terminal_width(sys.stdout)
+        width = utils.terminal_width()
         self.assertEqual(10, width)
         mock_os.get_terminal_size.side_effect = OSError()
-        width = utils.terminal_width(sys.stdout)
+        width = utils.terminal_width()
         self.assertIs(None, width)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff/utils.py 
new/cliff-4.4.0/cliff/utils.py
--- old/cliff-3.10.1/cliff/utils.py     2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/cliff/utils.py      2023-11-14 11:07:31.000000000 +0100
@@ -11,10 +11,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import ctypes
 import os
-import struct
-import sys
 
 # Each edit operation is assigned different cost, such as:
 #  'w' means swap operation, the cost is 0;
@@ -28,9 +25,9 @@
 def damerau_levenshtein(s1, s2, cost):
     """Calculates the Damerau-Levenshtein distance between two strings.
 
-    The Levenshtein distance says the minimum number of single-character edits
-    (i.e. insertions, deletions, swap or substitution) required to change one
-    string to the other.
+    The Damerau-Levenshtein distance says the minimum number of single
+    character edits (i.e. insertions, deletions, swap or substitution)
+    required to change one string to the other.
     The idea is to reserve a matrix to hold the Levenshtein distances between
     all prefixes of the first string and all prefixes of the second, then we
     can compute the values in the matrix in a dynamic programming fashion. To
@@ -39,7 +36,7 @@
     the row before that.)
 
     More details:
-        https://en.wikipedia.org/wiki/Levenshtein_distance
+        https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
         
https://github.com/git/git/commit/8af84dadb142f7321ff0ce8690385e99da8ede2f
     """
 
@@ -93,63 +90,15 @@
     return row1[-1]
 
 
-def terminal_width(stdout):
-    if hasattr(os, 'get_terminal_size'):
-        # python 3.3 onwards has built-in support for getting terminal size
-        try:
-            return os.get_terminal_size().columns
-        except OSError:
-            return None
-
-    if sys.platform == 'win32':
-        return _get_terminal_width_windows(stdout)
-    else:
-        return _get_terminal_width_ioctl(stdout)
-
-
-def _get_terminal_width_windows(stdout):
-    STD_INPUT_HANDLE = -10
-    STD_OUTPUT_HANDLE = -11
-    STD_ERROR_HANDLE = -12
-
-    std_to_win_handle = {
-        sys.stdin: STD_INPUT_HANDLE,
-        sys.stdout: STD_OUTPUT_HANDLE,
-        sys.stderr: STD_ERROR_HANDLE}
+def terminal_width():
+    """Return terminal width in columns
 
-    std_handle = std_to_win_handle.get(stdout)
-    if not std_handle:
-        return None
-
-    handle = ctypes.windll.kernel32.GetStdHandle(std_handle)
-    csbi = ctypes.create_string_buffer(22)
-
-    res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, csbi)
-    if res:
-        (size_x, size_y, cur_pos_x, cur_pos_y, attr,
-         left, top, right, bottom, max_size_x, max_size_y) = struct.unpack(
-            "hhhhHhhhhhh", csbi.raw)
-        return size_x
-
-
-def _get_terminal_width_ioctl(stdout):
-    from fcntl import ioctl
-    import termios
+    Uses `os.get_terminal_size` function
 
+    :returns: terminal width
+    :rtype: int or None
+    """
     try:
-        # winsize structure has 4 unsigned short fields
-        winsize = b'\0' * struct.calcsize('hhhh')
-        try:
-            winsize = ioctl(stdout, termios.TIOCGWINSZ, winsize)
-        except IOError:
-            return None
-        except TypeError:
-            # this is raised in unit tests as stdout is sometimes a StringIO
-            return None
-        winsize = struct.unpack('hhhh', winsize)
-        columns = winsize[1]
-        if not columns:
-            return None
-        return columns
-    except IOError:
+        return os.get_terminal_size().columns
+    except OSError:
         return None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff.egg-info/PKG-INFO 
new/cliff-4.4.0/cliff.egg-info/PKG-INFO
--- old/cliff-3.10.1/cliff.egg-info/PKG-INFO    2022-02-18 16:45:43.000000000 
+0100
+++ new/cliff-4.4.0/cliff.egg-info/PKG-INFO     2023-11-14 11:08:01.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: cliff
-Version: 3.10.1
+Version: 4.4.0
 Summary: Command Line Interface Formulation Framework
 Home-page: https://docs.openstack.org/cliff/latest/
 Author: OpenStack
@@ -37,11 +37,10 @@
 Classifier: License :: OSI Approved :: Apache Software License
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Intended Audience :: Developers
 Classifier: Environment :: Console
-Requires-Python: >=3.6
+Requires-Python: >=3.8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff.egg-info/SOURCES.txt 
new/cliff-4.4.0/cliff.egg-info/SOURCES.txt
--- old/cliff-3.10.1/cliff.egg-info/SOURCES.txt 2022-02-18 16:45:43.000000000 
+0100
+++ new/cliff-4.4.0/cliff.egg-info/SOURCES.txt  2023-11-14 11:08:01.000000000 
+0100
@@ -1,3 +1,4 @@
+.pre-commit-config.yaml
 .stestr.conf
 .zuul.yaml
 AUTHORS
@@ -95,4 +96,5 @@
 releasenotes/notes/command-group-8c00f260340a130c.yaml
 releasenotes/notes/comparable-FormattableColumn-31c0030ced70b7fb.yaml
 releasenotes/notes/drop-python27-support-b16c9e5a9e2000ef.yaml
-releasenotes/notes/handle-none-values-when-sorting-de40e36c66ad95ca.yaml
\ No newline at end of file
+releasenotes/notes/handle-none-values-when-sorting-de40e36c66ad95ca.yaml
+releasenotes/notes/strip-period-from-help-strings-be368e5cf5bd5269.yaml
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff.egg-info/pbr.json 
new/cliff-4.4.0/cliff.egg-info/pbr.json
--- old/cliff-3.10.1/cliff.egg-info/pbr.json    2022-02-18 16:45:43.000000000 
+0100
+++ new/cliff-4.4.0/cliff.egg-info/pbr.json     2023-11-14 11:08:01.000000000 
+0100
@@ -1 +1 @@
-{"git_version": "a04a48f", "is_release": true}
\ No newline at end of file
+{"git_version": "3ee0725", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/cliff.egg-info/requires.txt 
new/cliff-4.4.0/cliff.egg-info/requires.txt
--- old/cliff-3.10.1/cliff.egg-info/requires.txt        2022-02-18 
16:45:43.000000000 +0100
+++ new/cliff-4.4.0/cliff.egg-info/requires.txt 2023-11-14 11:08:01.000000000 
+0100
@@ -2,6 +2,5 @@
 PyYAML>=3.12
 autopage>=0.4.0
 cmd2>=1.0.0
-pbr!=2.1.0,>=2.0.0
-pyparsing>=2.1.0
+importlib_metadata>=4.4
 stevedore>=2.0.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/demoapp/README.rst 
new/cliff-4.4.0/demoapp/README.rst
--- old/cliff-3.10.1/demoapp/README.rst 2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/demoapp/README.rst  2023-11-14 11:07:31.000000000 +0100
@@ -12,7 +12,7 @@
   $ pip install virtualenv
   $ virtualenv .venv
   $ . .venv/bin/activate
-  (.venv)$ 
+  (.venv)$
 
 Next, install ``cliff`` in the environment.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/doc/source/user/complete.rst 
new/cliff-4.4.0/doc/source/user/complete.rst
--- old/cliff-3.10.1/doc/source/user/complete.rst       2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/doc/source/user/complete.rst        2023-11-14 
11:07:31.000000000 +0100
@@ -29,7 +29,7 @@
       local cur prev words
       COMPREPLY=()
       _get_comp_words_by_ref -n : cur prev words
-    
+
       # Command data:
       cmds='agent aggregate backup'
       cmds_agent='--name'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/doc/source/user/interactive_mode.rst 
new/cliff-4.4.0/doc/source/user/interactive_mode.rst
--- old/cliff-3.10.1/doc/source/user/interactive_mode.rst       2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/doc/source/user/interactive_mode.rst        2023-11-14 
11:07:31.000000000 +0100
@@ -23,16 +23,16 @@
 
     (.venv)$ cliffdemo
     (cliffdemo) help
-    
+
     Shell commands (type help <topic>):
     ===================================
     cmdenvironment  edit  hi       l   list  pause  r    save  shell      show
     ed              help  history  li  load  py     run  set   shortcuts
-    
+
     Undocumented commands:
     ======================
     EOF  eof  exit  q  quit
-    
+
     Application commands (type help <topic>):
     =========================================
     files  help  simple  file  error  two part
@@ -41,12 +41,12 @@
 ``help`` command:
 
 ::
-    
+
     (cliffdemo) help simple
     usage: simple [-h]
-    
+
     A simple command that prints a message.
-    
+
     optional arguments:
       -h, --help  Show help message and exit.
 
@@ -54,7 +54,7 @@
 regular command line:
 
 ::
-    
+
     (cliffdemo) simple
     sending greeting
     hi!
@@ -89,4 +89,4 @@
     | tox.ini              |    76 |
     | tox.ini~             |   421 |
     +----------------------+-------+
-    (cliffdemo) 
+    (cliffdemo)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/doc/source/user/introduction.rst 
new/cliff-4.4.0/doc/source/user/introduction.rst
--- old/cliff-3.10.1/doc/source/user/introduction.rst   2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/doc/source/user/introduction.rst    2023-11-14 
11:07:31.000000000 +0100
@@ -4,7 +4,7 @@
 
 The cliff framework is meant to be used to create multi-level commands
 such as subversion and git, where the main program handles some basic
-argument parsing and then invokes a sub-command to do the work. 
+argument parsing and then invokes a sub-command to do the work.
 
 Command Plugins
 ===============
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/doc/source/user/list_commands.rst 
new/cliff-4.4.0/doc/source/user/list_commands.rst
--- old/cliff-3.10.1/doc/source/user/list_commands.rst  2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/doc/source/user/list_commands.rst   2023-11-14 
11:07:31.000000000 +0100
@@ -35,7 +35,7 @@
 further manipulation.
 
 ::
-    
+
     (.venv)$ cliffdemo files -f csv
     "Name","Size"
     "build",136
@@ -52,7 +52,7 @@
 .. _PrettyTable: https://pypi.org/project/prettytable/
 
 ::
-    
+
     (.venv)$ cliffdemo files
     +---------------+------+
     |      Name     | Size |
@@ -69,7 +69,7 @@
 The ``value`` formatter produces a space separated output with no headers.
 
 ::
-    
+
     (.venv)$ cliffdemo files -f value
     build 136
     cliffdemo.log 2690
@@ -80,7 +80,7 @@
 a script.
 
 ::
-    
+
     (.venv)$ cliffdemo files -f value | while read NAME SIZE
     do
       echo $NAME is $SIZE bytes
@@ -125,15 +125,15 @@
     (.venv)$ cliffdemo files -f json
     [
       {
-        "Name": "source", 
+        "Name": "source",
         "Size": 4096
-      }, 
+      },
       {
-        "Name": "Makefile", 
+        "Name": "Makefile",
         "Size": 5569
-      }, 
+      },
       {
-        "Name": "build", 
+        "Name": "build",
         "Size": 4096
       }
     ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/doc/source/user/show_commands.rst 
new/cliff-4.4.0/doc/source/user/show_commands.rst
--- old/cliff-3.10.1/doc/source/user/show_commands.rst  2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/doc/source/user/show_commands.rst   2023-11-14 
11:07:31.000000000 +0100
@@ -110,10 +110,10 @@
 
     (.venv)$ cliffdemo file -f json setup.py
     {
-      "Modified Time": 1438726433.8055942, 
-      "GID": 1000, 
-      "UID": 1000, 
-      "Name": "setup.py", 
+      "Modified Time": 1438726433.8055942,
+      "GID": 1000,
+      "UID": 1000,
+      "Name": "setup.py",
       "Size": 1028
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/doc/source/user/sphinxext.rst 
new/cliff-4.4.0/doc/source/user/sphinxext.rst
--- old/cliff-3.10.1/doc/source/user/sphinxext.rst      2022-02-18 
16:44:27.000000000 +0100
+++ new/cliff-4.4.0/doc/source/user/sphinxext.rst       2023-11-14 
11:07:31.000000000 +0100
@@ -7,6 +7,8 @@
 
 cliff supports integration with Sphinx by way of a `Sphinx directives`__.
 
+__ http://www.sphinx-doc.org/en/stable/extdev/markupapi.html
+
 Preparation
 -----------
 
@@ -68,6 +70,8 @@
 
      This option is effective only in the **command** mode.
 
+     __ https://docs.python.org/3/library/fnmatch.html
+
    `:arguments`
      The arguments to be passed when the cliff application is instantiated.
      Some cliff applications requires arguments when instantiated.
@@ -154,8 +158,8 @@
 Simple Example (`demoapp`)
 --------------------------
 
-`cliff` provides a sample application, :doc:`demoapp`, to demonstrate some of 
the
-features of `cliff`. This application :ref:`is documented <demoapp-sphinx>`
+`cliff` provides a sample application, :doc:`demoapp`, to demonstrate some of
+the features of `cliff`. This application :ref:`is documented <demoapp-sphinx>`
 using the `cliff.sphinxext` Sphinx extension.
 
 Advanced Example (`python-openstackclient`)
@@ -206,6 +210,4 @@
 
     autoprogram_cliff_application = 'openstack'
 
-__ http://www.sphinx-doc.org/en/stable/extdev/markupapi.html
-__ https://docs.python.org/3/library/fnmatch.html
 __ https://docs.openstack.org/python-openstackclient/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/cliff-3.10.1/releasenotes/notes/strip-period-from-help-strings-be368e5cf5bd5269.yaml
 
new/cliff-4.4.0/releasenotes/notes/strip-period-from-help-strings-be368e5cf5bd5269.yaml
--- 
old/cliff-3.10.1/releasenotes/notes/strip-period-from-help-strings-be368e5cf5bd5269.yaml
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/cliff-4.4.0/releasenotes/notes/strip-period-from-help-strings-be368e5cf5bd5269.yaml
     2023-11-14 11:07:31.000000000 +0100
@@ -0,0 +1,6 @@
+---
+features:
+  - |
+    Trailing periods will now be stripped from the oneline summary shown
+    for the help command. This better aligns with the format used by
+    argparse itself.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/requirements.txt 
new/cliff-4.4.0/requirements.txt
--- old/cliff-3.10.1/requirements.txt   2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/requirements.txt    2023-11-14 11:07:31.000000000 +0100
@@ -1,10 +1,7 @@
-# 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.
-pbr!=2.1.0,>=2.0.0 # Apache-2.0
 autopage>=0.4.0 # Apache 2.0
+# TODO: Drop this when Python 3.10 is our minimum supported version
+importlib_metadata>=4.4 # Apache-2.0
 cmd2>=1.0.0 # MIT
 PrettyTable>=0.7.2 # BSD
-pyparsing>=2.1.0 # MIT
 stevedore>=2.0.1 # Apache-2.0
 PyYAML>=3.12 # MIT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/setup.cfg new/cliff-4.4.0/setup.cfg
--- old/cliff-3.10.1/setup.cfg  2022-02-18 16:45:43.983875300 +0100
+++ new/cliff-4.4.0/setup.cfg   2023-11-14 11:08:01.258277400 +0100
@@ -5,15 +5,14 @@
 author_email = [email protected]
 summary = Command Line Interface Formulation Framework
 home_page = https://docs.openstack.org/cliff/latest/
-python_requires = >=3.6
+python_requires = >=3.8
 classifier = 
        Development Status :: 5 - Production/Stable
        License :: OSI Approved :: Apache Software License
        Programming Language :: Python
        Programming Language :: Python :: 3
-       Programming Language :: Python :: 3.6
-       Programming Language :: Python :: 3.7
        Programming Language :: Python :: 3.8
+       Programming Language :: Python :: 3.9
        Programming Language :: Python :: 3 :: Only
        Programming Language :: Python :: Implementation :: CPython
        Intended Audience :: Developers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/test-requirements.txt 
new/cliff-4.4.0/test-requirements.txt
--- old/cliff-3.10.1/test-requirements.txt      2022-02-18 16:44:27.000000000 
+0100
+++ new/cliff-4.4.0/test-requirements.txt       2023-11-14 11:07:31.000000000 
+0100
@@ -1,8 +1,3 @@
-# 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.
-
-python-subunit>=1.0.0 # Apache-2.0/BSD
 stestr>=1.0.0 # Apache-2.0
 testtools>=2.2.0 # MIT
 testscenarios>=0.4 # Apache-2.0/BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cliff-3.10.1/tox.ini new/cliff-4.4.0/tox.ini
--- old/cliff-3.10.1/tox.ini    2022-02-18 16:44:27.000000000 +0100
+++ new/cliff-4.4.0/tox.ini     2023-11-14 11:07:31.000000000 +0100
@@ -45,7 +45,9 @@
 commands = {toxinidir}/integration-tests/openstackclient-tip.sh {envdir}
 
 [testenv:docs]
-deps = -r{toxinidir}/doc/requirements.txt
+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
 
 [testenv:cover]

Reply via email to