# CHANGES

## 4.13.1

- Remove use of ABCMeta for formatters

- Run mypy from tox

## 4.13.0

- Deprecate CommandManager namespace argument

- Warn on duplicate commands in the same namespace

- Revert “Implement conflict resolution”

- Implement conflict resolution

- typing: Fixups for typed stevedore

## 4.12.0

- typing: Clarify behavior of _run_after_hooks method

- Remove pkg_resources remnants

- ruff: Enable E5 rules

- typing: Update for latest docutils type hints

## 4.11.0

- mypy: Enable strict mode

- pre-commit: Bump versions

- Migrate setup configuration to pyproject.toml

## 4.10.0

- Bump Python version used for linters to 3.10

- Drop support for Python 3.9

## 4.9.1

- hooks: Update type hints to reflect reality

- command: Filter on empty epilog, not empty hooks

## 4.9.0

- typing: Enable basic typing for tests

- typing: Add typing to cliff.formatters

- typing: Add typing to cliff.sphinxext

- typing: Add typing to cliff.hooks

- typing: Add typing to cliff.help

- typing: Add typing to cliff.complete

- typing: Add typing to cliff.command

- typing: Add typing to cliff.commandmanager

- typing: Add typing to cliff._argparse

- typing: Add typing to cliff.columns

- typing: Add typing to cliff.interactive

- typing: Add typing to cliff.app

- pre-commit: Enable mypy

- typing: Fix initial typing issues

- pre-commit: Bump versions

## 4.8.0

- Remove unnecessary shebangs

- ruff: Enable pyupgrade rules

- Migrate to ruff, ruff-format

- Drop support for Python 3.8, add Python 3.12

- pre-commit: Bump versions

- Normalize columns given by ‘-c’/’–columns’

## 4.7.0

- Add fixtures explicitly in test requirements

- tox: Use pre-commit for linter checks

- Blacken code base

- requirements: Bump minimums

## 4.6.0

- Test python 3.10 and 3.11

## 4.5.0

- Use importlib.metadata on Python 3.10+

## 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

- Removing modindex link from docs

## 3.10.0

- Add Python3 yoga unit tests

## 3.9.0

- 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

## 3.8.0

- 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

## 3.7.0

- requirements: Uncap PrettyTable

- Add ‘–sort-ascending’, ‘–sort-descending’ parameters

- Make ‘FormattableColumn’ comparable

- Handle null values when sorting

- Remove unicode from code

- gitignore: Ignore reno artefacts

- Remove lower-constraints

## 3.6.0

- trivial: Remove references to Python 2.7

## 3.5.0

- columns: Make ‘FormattableColumn’ comparable

- Update requirements URLs in tox config

- Remove six

- Update requirements

- doc: Update bug tracker to storyboard

- Remove references to setuptools

- Add py38 package metadata

- Remove Babel from lower-constraints.txt

- Bump py37 to py38 in tox.ini

- List setuptools under install_requires

- Document KeyboardInterrupt exit code

- Exit gracefully on Ctrl-C

- change help action to use its own exception for exit

- Add Python3 wallaby unit tests

- Capturing argparse errors due to problem with cmd2

## 3.4.0

- switch to stevedore for loading entry points

## 3.3.0

- Remove cap on cmd2

- Fix compatibility with new cmd2

## 3.2.0

- drop mock from lower-constraints and requirements

- Import command group support from osc-lib

- Remove unneeded tests

- Migrate to stestr

- Remove python3.5

- Stop to use the __future__ module

- Switch to newer openstackdocstheme version

- Use unittest.mock instead of third party mock

- Add Python3 victoria unit tests

## 3.1.0

- Re-add support for python 3.5

- Fix nested argument groups with ignore conflict handler

- adding missing releasenote for the drop of py27 support

## 3.0.0

- [ussuri][goal] Drop python 2.7 support and testing

## 2.18.0

- Add autoprogram_cliff_app_dist_name config opt

- Switch to Ussuri jobs

- Add contributors link to readme

## 2.16.0

- Pin cmd2 back to <0.9 on all versions

- Modify the help message of `-c`/`–column` parameter

- Add Python 3 Train unit tests

- Stop wildcard importing argparse

## 2.15.0

- Add an errexit attribute to InteractiveApp to exit on command errors

- Dropping the py35 testing

- Updates for OpenDev transition

- OpenDev Migration Patch

- add python 3.7 unit test job

- Missing carriage return in some cases, using -f json

## 2.14.1

- Use template for lower-constraints

- Change openstack-dev to openstack-discuss

## 2.14.0

- Don’t try to run issubclass on non-classes

- Removed unused err variable

- Remove dead files

- add lib-forward-testing-python3 test job

- add python 3.6 unit test job

- switch documentation job to new PTI

- import zuul job settings from project-config

## 2.13.0

- Assure executable name is kept when app is called as module

## 2.12.1

- Build universal wheels

- fix tox python3 overrides

- support cmd2 0.9.1 in interactive mode

## 2.12.0

- update cmd2 dependency to handle py3 only versions

- Remove travis.yml

- exclude cmd2 0.8.3 and update to 0.8.4

- add lower-constraints job

- fix typos in documentation

## 2.17.0

- Allow finding command by partial name

- Updated from global requirements

- Remove the warning of getargspec removal

- Align parsed() call with cmd2 versions >= 0.7.3

- Fix cmd2 doc URL

- add argparse conflict handler “ignore”

- sphinxext: Warn if namespace or command pattern invalid

- Zuul: Remove project name

- Updated from global requirements

## 2.11.0

- remove -s alias for –sort-columns

## 2.10.0

- Remove empty files

- Add ability to sort data by columns for list commands

- Updated from global requirements

- Remove tox_install.sh and just pass -c in tox

- Replace legacy tips jobs with shiny new versions

- Move doc requirements to doc/requirements.txt

- do not require installing demo app to build docs

- add support for legacy command name translation

- Use in-tree cliffdemo app for docs build

- Updated from global requirements

- add bandit to pep8 job

- sphinxext: Support cliff application

- Fix PEP8 in gate

- doc: Cleanup of demoapp doc

- Generate demoapp CLI refernece

- Fix codec error when format=csv

## 2.9.1

- handle more varied top_level.txt files in distributions

## 2.9.0

- show the distribution providing the command in help output

- Update .gitignore

- Docs update for more-hooks

- Updates for stestr

- Allow command hooks to make changes

- Updated from global requirements

- add actual column names to error msg Closes-Bug: 1712876

- Alias exit to cmd2’s quit command to exit interactive shell

- Updated from global requirements

- Update doc on Sphinx integration process

- Fix regexp for detecting long options

- sphinxext: Correct issues with usage formatting

- Move comments up in [extras] section of setup.cfg

- Updated from global requirements

- Make openstackdocstheme an optional doc dependency

- Updated from global requirements

- doc: minor cleanup

- Update and replace http with https for doc links

- doc: Remove blank lines between term and definition

- trivial: Fix comments in sphinxext module

- Use assertIsNone(…) instead of assertIs(None,…)

- Updated from global requirements

## 2.8.0

- add tests for display command classes and hooks

- Run hooks for DisplayCommandBase

- add –fit-width option to table formatter

- sphinxext: Add ‘application’ option to the autoprogram directive

- use openstackdocstheme html context

- switch from oslosphinx to openstackdocstheme

- Fix erroneous line in command hook test

- make smart help formatter test deterministic

- remove references to distribute in the docs

- add before and after hooks

- add hook for get_epilog

- add hook for manipulating the argument parser

- Updated from global requirements

- pass the command name from HelpCommand

- Adjust completenames tests for cmd2 0.7.3+

- rearrange existing content to follow new standard

- sphinext: Use metavar where possible

- sphinxext: Use ‘argparse.description’, ‘argparse.epilog’

- sphinxext: Allow configuration of ignorable options

- sphinxext: Generate better usage examples

- add cmd_name argument to CompleteCommand

- Ensure python standard argparse module is loaded

- Updated from global requirements

## 2.7.0

- covert test suite to use testrepository

## 2.6.0

- Updated from global requirements

- Add smart help formatter for command parser

- Add support for epilogs

- Add ‘autoprogram-cliff’ Sphinx directive

- .gitignore: Ignore eggs

## 2.5.0

- Use Sphinx 1.5 warning-is-error

- Update cmd2 fix to still work with 0.6.7

- Remove support for py34

- Fix broken test with cmd2 0.7.0

- Updated from global requirements

- Updated from global requirements

- Updated from global requirements

- Add newline if the output formatter is json

## 2.4.0

- Add Constraints support

- Remove tox environments that no longer work

- Fix command order

- Show team and repo badges on README

- Add print_empty parameter

## 2.3.0

- ignore Command docstring when looking for descriptions

- let the Command get its one-liner description from a class attribute

- flake8 fix

- Replace dashes and colons when using bash formatter

- Show entire command in error message

- Updated from global requirements

- Updated from global requirements

- Fix spelling mistake

- Add Python 3.5 classifier and venv

- Updated from global requirements

- Changed the home-page link

- Add Apache 2.0 license to source file

- Updated from global requirements

- Updated from global requirements

- Updated from global requirements

- Updated from global requirements

- Clean imports in code

- [doc]Fix URL for ‘setuptools entry points’

- Fix a typo in comment

## 2.2.0

- Avoid ASCII encoding errors when output is redirected

- Fix cliff URLs in doc and demoapp

- Remove announce.rst

- Fix Command class doc typo

- Updated from global requirements

- Fixed broken link

- add formattable columns concept

- Add tests, cover more cases

- Updated from global requirements

- pep8: fix F405 error

- command: make run() return take_action() value

## 2.1.0

- Updated from global requirements

- Update –max-width help

- Add more test coverage for shell formatter

- Add more test coverage for CSV formatter

- Support multiple sub commands in completion

- Factorize more test data

- Factorize some test data

- Factorize common test code

- Factorize argparse importing

- Updated from global requirements

- Updated from global requirements

- Add CLIFF_MAX_TERM_WIDTH envvar to complement –max-width

- Fix prettytable.PrettyTable().max_width wrong usage

- Fix AttributeError when entry point load failed

- Distinguish no existed columns in ShowOne

- Refactor HelpCommand

- Updated from global requirements

- Remove httplib2 from test-requirements.txt

- Sync help message for –help

## 2.0.0

- handle empty list in table formatter

## 1.17.0

- Drop Python 2.6 support

- Revert “app,command: disallow abbrev by default”

- Fixes terminal_width on Windows

## 1.16.0

- Updated from global requirements

- remove openstack-common.conf

- Add doc for deferred_help parameter

- Fix pep8 failure

- app,command: disallow abbrev by default

- app: work-around abbrev

- remove unnecessary dependency on argparse

- Make verbose and quiet mutually exclusive

- setup: fix Python versions classifiers

- Don’t import unused logging

- Don’t use non-existent method of Mock

- Replace dashes with underscores in bash completion

- Updated from global requirements

- Resize columns to fit screen width

- fix fuzzy search for same-distance case

- Correct path to docs

- only use unicodecsv for python 2.x

- Fix test class docstring for py 3.5

## 1.15.0

- Replace ‘r’ with ‘ ‘ for prettytable

- Implement a json formatter in cliff

- Implement a yaml formatter in cliff

- Updated from global requirements

- Improve help messages

## 1.14.0

- Add csv formatter test

- Fix encoding issue with the default python csv output

- Remove py26 as a default test from tox.ini

- Set demo app up with deferred help

- Add command fuzzy matching

- Updated from global requirements

- Remove requirements.txt from tox.ini

- Updated from global requirements

- Updated from global requirements

- Allow subcommands to accept –help when using ‘deferred_help’

- Updated from global requirements

- Fix logging config in demo app

- Use base command for help test

- Updated from global requirements

- Include the automatically-generated changelog

- Updated from global requirements

## 1.13.0

- Fix object has no attribute debug error

- Add some docs for list value formatter

- Add value format for list command

- Updated from global requirements

- Remove run_cross_tests.sh

- fix author contact details

- Print help on help command

## 1.12.0

- Do not check requirements when loading plugins

## 1.11.0

- Catch and ignore error when locale can not be set

- Uncap library requirements for liberty

- Add documentation for the value formatter

- Sort the fuzzy matches

- Defer interactive import

- Updated from global requirements

- Update links to setuptools doc

## 1.10.1

- Pass user command text to the Command object

- Document print_help_if_requested method

## 1.10.0

- Allow to call initialize_app when running –help

- Hide prompt in batch/pipe mode

- Correct completion in interactive mode

- Change the argument passed to __init__ for help

- Fix pep8 tests for lambda

- Updated from global requirements

- Fix git repo urls in tox.ini

- Add deprecated attribute to commands

- Workflow documentation is now in infra-manual

## 1.9.0

- print the real error cmd argument

- Updated from global requirements

## 1.8.0

- Update link to docs in README

- Bring doc build up to standard

- Add pbr to installation requirements

- Add more detail to the README

- Updated from global requirements

- Add docs environment to tox.ini

- mock.assert_called_once() is not a valid method

- Work toward Python 3.4 support and testing

- warn against sorting requirements

## 1.7.0

- Add release notes for 1.7.0

- Fix stable integration tests

- Updated from global requirements

- Clean up default tox environment list

- Do not allow wheels for stable tests

- Set the main logger name to match the application

- CSV formatter should use system-dependent line ending

- Make show option compatible with Python 2.6

- Use six.add_metaclass instead of __metaclass__

- fixed typos found by RETF rules

- The –variable option to shell format is redundant

- Expose load_commands publicly

- Fix wrong method name assert_called_once

- Updated from global requirements

- Fix pep8 failures on rule E265

## 1.6.1

- Remove PrettyTable from documentation requirements

- Fix a bug in ShellFormatter’s escaping of double quotes in strings

- Import run_cross_tests.sh from oslo-incubator

- add doc requirements to venv

## 1.6.0

- Add max-width support for table formatter

- Add value only output formattter

- Update readme with links to bug tracker and source

- Move pep8 dependency into pep8 tox test

- Fix doc build with Python 2.6.x

- Fix interactive mode with command line args

- Update .gitreview after repo rename

- Escape double quotes in shell formatter

- Add unit test for shell formatter

- Rename private attribute to avoid conflict

- Sync with global requirements

- Add integration tests with known consumers

- update history for previous change

- Make the formatters a private part of the command

## 1.5.2

- move to pbr for packaging

## 1.5.1

- add venv environ to tox config

## 1.5.0

- Update history for next release

- Move to stackforge

- update history for stevedore change

- Use stevedore to load formatter plugins

- use entry points for completion plugins

- Clean up recursive data handling

- Always install complete command

- attribution for bash completion work in history

- code style fixes

- code style fixes

- various python code optimizations; shuffle I/O to shell classes

- add bash complete

- Enable debug in help mode

- Pass the right args when pulling help from commands

- prepare for 1.4.5 release

- add pypy test env configuration

- Update pyparsing dependency to 2.0.1

## 1.4.4

- update for release 1.4.4

- Re-raise Exception on debug mode

- Add test to check if return code is 2 on unknown command

- Return code 1 is already use, use code 2 instead

- Reraise error on debug

- Display better error message on unknown command, and return code 1

- update announce file

## 1.4.3

- prepare for 1.4.3 release

- force python2.6 for that test env

- Provide a default output encoding

## 1.4.2

- prepare for release 1.4.2

## 1.4.1

- prepare for release 1.4.1

- Tighten requirements on cmd2

- remove use of distribute in demo app

- Fix default encoding issue with python 2.6

- move tests into cliff package

- add tests for dict2columns

- Add dict2columns()

- turn off distribute in tox

## 1.4

- prep for release 1.4

- fix flake8 issues with setup.py

- remove the other traces of distribute

- Remove explicit depend on distribute

- update history for recent contribution

- Expose instantiated interpreter instance and assign it to the ‘interpreter’ variable on the App instance

- Update announcement for release 1.3.3

## 1.3.3

- Prepare for release 1.3.3

- declare support for python 3.3

- cmd2 0.6.5.1 was released, and is compatible

- Restore compatibility with Prettytable < 0.7.2

## 1.3.2

- Prepare 1.3.2 release

- Bump prettytable version accepted

- add python 3.3 to tox

- add style checks to tests

- Add tests for underscore handling

- use flake8 for style checks

- update history.rst with convert_underscores change

- make converting underscores optional in CommandManager

- fix version in docs

## 1.3.1

- prepare for 1.3.1 release

- Fix PyParsing dependency

- Fix typo

- update history file for previous merge

- Make list of application commands lexicographically ordered for help command in interactive mode

## 1.3

- Prepare for 1.3 release

- clean up history file

- Document dependency on distribute

- fix rst formatting in docstring

- Update history file

- Add tests for new functionality

- Allow user to pass argparse_kwargs argument to the build_option_parser method. Those arguments gets passed to the ArgumentParser constructor

## 1.2.1

- Set up for 1.2.1 release

- Remove unused logging import

- Fix problem with missing izip import in lister.py

- Update announcement file for new release

## 1.2

- Set up release 1.2

- Add python2.6 support

- remove debug print

- remove tablib from test requirements

- Fix logging default behavior

- Fix interactive help command

## 1.1.2

- bumping version number for release

- remove the entry point data for the moved formatters

## 1.1.1

- bump the version number to release a clean build

## 1.1

- Update version and status values

- Remove tablib formatters from core

- fix version # in announcement

## 1.0

- Doc updates for API changes. Clean up docstrings. Bump version to 1.0

- merge API refactoring work

- yet more pep8 work

- fix help and tests for API change

- Move take_action() to Command

- more pep8 work

- Refactor DisplayBase.run() to make it easier to override separate parts in subclasses. Rename get_data() to take_action() so subclasses that do something other than query for values have a clear place to override

- pep8 cleanup

- add attribution to history for the previous merge

- Adding new line to tablib formatters

- fix tags declaration

- document updates for 0.7

- disable py26 tests since I do not have an environment for running them

## 0.7

- bump version

- fix interactive command processor to handle multi-part commands, including some that use the same first word as existing commands

- declare a couple of commands that use builtin command names but use multiple words

- update changelog

- set the interactive mode flag before initializing the app so subclasses can check it; handle initialization errors more cleanly

- add travis-ci status image to developer docs

- add travis-ci status image to README

- add a requirements file for travis-ci

- bogus commit to trigger ci build

- add travis-ci.org configuration file

- add version num to history file

## 0.6

- bump version number

- pass more details to initialize_app so subclasses can decide what sort of initialization to do

- enable to use in Python2.6

## 0.5.1

- remove hard version requirement to unbreak the OpenStack build

## 0.5

- prepare for 0.5 release

- document changes in history file

- make the organization of the classes page a little more clear

- update formatter documentation

- fix yaml, html, and json show formatters

- move the column option so it applies to “show” commands, too

- add yaml, json, and html formatters

- move the columns option out of the table formatter and into the lister base

- make help list commands if none match exactly; fixes #8

- require at least PrettyTable 0.6 for Python 3 support, fixes #7

- changes in the prettytable API rolled into the python 3 support update

- add a tox stage for pep8 testing

- python 3.2 does not have a unicode type so ignore the error if it is missing

- move todo list to github issues

- update todo list

- note about prettytable and python3

- refactor ShowOne and Lister to share a common base class

- more todo notes

- tests for cliff.help

- pass the App to the help action instead of passing just the command manager, since the app has the stout handle we want to use for printing the help

- 100% coverage of cliff.command

- 100% coverage for commandmanager.py

- 100% coverage of cliff.app module

- let the interactive app set its own prompt

- add tests for App and fix an issue with error handling and clean_up() in python 3

- use the stderr handle given to the app instead of assuming the default

## 0.4

- version number and release note updates for 0.4

- documentation improvements

- simplify packaging file for demo app

- ignore files generated by dev environment

- first pass at interactive app

- note to add more options to csv formatter

- add –prefix option for shell formatter; add docs for shell formatter

- clean up help text for the other formatters

- add shell output formatter for single items

- add longer docstring to show how it is printed by help

- update todo list

- fix typo in blog post

## 0.3

- update blog announcement

- bump the version number and update the release notes

- add ShowOne base class for commands that need to show properties of an individual object make the table formatter work as a single object formatter update the docs for the new features

- handle an empty data set

- correct the doctoring

- fix version # in doc build script

- 0.2 release announcement post

## 0.2

- bump version number

- start a release log

- update doc instructions for getting help

- only show the one-line description in the command list; add a description of “help”

- register a custom help action that knows how to print the list of commands available and a help command to generate help for the other commands

- provide an internal API for applications to register commands without going through setuptools (used for help handler)

- Use argparse for global arguments

- fix doc build instructions

- add some developer instructions and links ot the source repo and bug tracker

- add announcement blog post source

- advice from the distutils list was to stick with distribute for now

- add Makefile with some common release operations

- add example output to the list formatters

- add a requirements file for doc build on readthedocs.org

- add some real documentation

- Add get_data() to the Lister base class

- remove example that I was using as a syntax reminder

- Add a link to the docs

- while looking for documentation on entry points I realized distutils2 doesn’t seem to support them in the same way

- fill in a real description of the project

- start sphinx documentation

- Added a bit more to the README

- flesh out instructions for using the demo app

- add a few more ideas

- Added a README for the demo app

- Added download url to both setup.py files and updated the demo setup.py with the new url

## 0.1

- Added missing distribute setup file

- move repo link to the dreamhost project

- more to-do items

- add demoapp to release package and clean up files being distributed from the test directory

- notes about work still to be done

- require PrettyTable package for the table formatter

- improve error handling when loading formatter plugins

- add a csv formatter for list apps

- start creating a subclass of command for producing a list of output in different formats, using prettytable as an example formatter

- remove unused import

- better error handling of post-action hook in app

- Pass the I/O streams into the app

- add some error handling to App

- make the log messages slightly easier to parse

- tweak App api to make it easier to override and perform global actions before and after a command runs

- use logging for controlling console output verbosity

- clean up argv handling

- install nose for tox tests

- if no arguments are provided at all show the help message

- replace default –help processor with one that includes the list of subcommands available

- add debug option to nose

- clean up dead code

- include version info when configuring opt parse

- Sample program with command plugins

- first pass at an app class that can invoke commands

- save commands using the name representation to be used in help output; don’t modify the input arg list when searching for the command; return the name of the command found so the app can stuff it into the help text of the command

- start building command manager

- change to apache license

- add tox config file for tests

- add distribute_setup.py so install works

- add setup.py and package directory

- add a basic description to readme

- convert readme to rst

- initial commit

this page last updated: 2026-02-20 17:00:00

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.

found an error? report a bug