cmd2 now has a dependency on
prompt-toolkit which serves as a
pure-Python cross-platform replacement for
GNU Readline. Previously, cmd2 had used
different readline dependencies on each Operating System (OS) which was at times a very
frustrating developer and user experience due to small inconsistencies in these different readline
libraries. Now we have consistent cross-platform support for tab-completion, user terminal input,
and history. Additionally, this opens up some cool advanced features such as support for syntax
highlighting of user input while typing, auto-suggestions similar to those provided by the fish
shell, and the option for a persistent bottom bar that can display realtime status updates while the
prompt is displayed.
- Breaking Changes
- Removed all use of
readlinebuilt-in module and underlying platform libraries - Deleted
cmd2.rl_utilsmodule which dealt with importing the properreadlinemodule for each platform and provided utility functions related toreadline - Added a dependency on
prompt-toolkitand a newcmd2.pt_utilsmodule with supporting utilities - Removed Transcript Testing feature set along with the
history -toption for generating transcript files and thecmd2.transcriptmodule- This was an extremely brittle regression testing framework which should never have been built into cmd2
- We recommend using pytest for unit and integration tests and Robot Framework for acceptance tests. Both of these frameworks can be used to create tests which are far more reliable and less brittle.
- Async specific:
prompt-toolkitstarts its ownasyncioevent loop in everycmd2application- Removed
cmd2.Cmd.terminal_lockas it is no longer required to support things likecmd2.Cmd.async_alert - Removed
cmd2.Cmd.async_refresh_promptandcmd2.Cmd.need_prompt_refreshas they are no longer needed
- Removed
completerfunctions must now return acmd2.Completionsobject instead oflist[str].choices_providerfunctions must now return acmd2.Choicesobject instead oflist[str].- An argparse argument's
descriptive_headersfield is now calledtable_header. CompletionItem.descriptive_datais now calledCompletionItem.table_row.Cmd.default_sort_keymoved toutils.DEFAULT_STR_SORT_KEY.- Moved completion state data, which previously resided in
Cmd, into other classes.Cmd.matches_sorted->Completions.is_sortedandChoices.is_sortedCmd.completion_hint->Completions.completion_hintCmd.formatted_completions->Completions.completion_tableCmd.allow_appended_space/allow_closing_quote->Completions.allow_finalization
- Removed
Cmd.matches_delimitedsince it's no longer used. - Removed
flag_based_completeandindex_based_completefunctions since their functionality is already provided in arpgarse-based completion. - Changed
Statement.multiline_commandfrom a string to a bool. - Made
Statement.arg_lista property which generates the list on-demand. - Renamed
Statement.outputtoStatement.redirector. - Renamed
Statement.output_totoStatement.redirect_to. - Removed
Statement.pipe_tosince it can be handled byStatement.redirectorandStatement.redirect_to. - Changed
StatementParser.parse_command_only()to return aPartialStatementobject. - Renamed
Macro.arg_listtoMacro.args. - Removed
terminal_utils.pysinceprompt-toolkitprovides this functionality. - Replaced
async_alert()andasync_update_prompt()with a single function calledadd_alert(). This new function is thread-safe and does not require you to acquire a mutex before calling it like the previous functions did. - Removed
Cmd.default_to_shell.
- Removed all use of
- Enhancements
- New
cmd2.Cmdparameters- auto_suggest: (boolean) if
True, provide fish shell style auto-suggestions. These are grayed-out hints based on history. User can press right-arrow key to accept the provided suggestion. - bottom toolbar: (boolean) if
True, present a persistent bottom toolbar capable of displaying realtime status information while the prompt is displayed, see thecmd2.Cmd2.get_bottom_toolbarmethod that can be overridden as well as the updatedgetting_started.pyexample
- auto_suggest: (boolean) if
- New
cmd2.Cmdmethods- get_bottom_toolbar: populates bottom toolbar if
bottom_toolbarisTrue - get_rprompt: override to populate right prompt
- pre_prompt: hook method that is called before the prompt is displayed, but after
prompt-toolkitevent loop has started - read_secret: read secrets like passwords without displaying them to the terminal
- get_bottom_toolbar: populates bottom toolbar if
- New settables:
- max_column_completion_results: (int) the maximum number of completion results to display in a single column
cmd2.Cmd.selecthas been revamped to use the choice function fromprompt-toolkitwhen both stdin and stdout are TTYs- Add support for Python 3.15 by fixing various bugs related to internal
argparsechanges - Added
common_prefixmethod tocmd2.string_utilsmodule as a replacement foros.path.commonprefixsince that is now deprecated in Python 3.15
- New
-
Enhancements
- Moved cmd2-specific printing logic from
Cmd.print_to()intoCmd2BaseConsole.print()andCmd2BaseConsole.log(). This removes need to pass a console object toCmd.print_to(). - Addressed a bug in
rich.console.Consolewhere complex renderables (likeTableandRule) may not receive formatting settings passed toconsole.print()andconsole.log().
- Moved cmd2-specific printing logic from
-
Breaking Changes
- Renamed the
destinationparameter ofCmd.print_to()back tofilesince you can no longer pass in a console.
- Renamed the
-
Enhancements
- Added ability to pass a console object to
Cmd.print_to(). This provides support for things like wrapping aprint_to()call in aconsole.status()orconsole.capture()context manager.
- Added ability to pass a console object to
-
Breaking Changes
- Renamed the
fileparameter ofCmd.print_to()todestinationto support file-like objects and console objects. Cmd2BaseConsole(file)argument is now a keyword-only argument to be consistent with therich.console.Consoleclass.
- Renamed the
- Bug Fixes
- Updated
rich_utils.ANSI_STYLE_SEQUENCE_REto only match ANSI SGR (Select Graphic Rendition) sequences for text styling. It previously also matched DEC Private Mode sequences.
- Updated
- Bug Fixes
- The
async_alertandasync_prompt_updatemethods ofcmd2.Cmdnow respect the current value of theallow_stylesettable- If
allow_styleisNEVER, all style-related ANSI escape codes will be stripped to ensure plain text output
- If
- The
-
Bug Fixes
- Fixed incompatibilities with Python 3.14.3.
-
Potentially Breaking Changes
- To avoid future incompatibilities with argparse, we removed most of our overridden help functions. This should not break an application, but it could affect unit tests which parse help text.
- Bug Fixes
- Fixed issue where
delimiter_complete()could cause more matches than display matches - Fixed issue where
CommandSetregistration did not respect disabled categories
- Fixed issue where
- Bug Fixes
- Fixed missing
typing-extensionsdependency for Python 3.10
- Fixed missing
- Bug Fixes
- Fixed bug where
rich-argparsewas not coloring cmd2's customnargsformatting
- Fixed bug where
- Potentially Breaking Changes
cmd2no longer has a dependency oncmdandcmd2.Cmdno longer inherits fromcmd.Cmd- We don't think this should impact users, but there is theoretically a possibility
- This opens the door for more impactful changes in the next major release
cmd2 now has a dependency on rich for rich text and pretty
formatting in the terminal. Previously, cmd2 had a large amount of custom code for this purpose
that predated the existence of rich. This opens the door to even more beautiful cmd2
applications. To get the most out of the new capabilities, we encourage you to spend a little bit of
time reading the rich documentation.
-
Breaking Changes
- Refactored and modernized styling and utility modules:
- Removed the legacy
table_creator.pymodule in favor ofrichtables (see the rich_tables.py example for more info) - Moved all string-related functions from
utils.pyto a newstring_utils.pymodule- Removed redundant
stringfrom some of the names soquote_stringis now justquoteandquote_string_if_neededis nowquote_if_needed
- Removed redundant
- Consolidated all string styling functions from
ansi.pyintostring_utils.py - Replaced all text style enums from
ansi.pywith modernrichstyles - Renamed
ansi.pytoterminal_utils.pyto better reflect its purpose
- Removed the legacy
- Dropped support for Python 3.9.
cmd2now requires Python 3.10 or later - Replaced
Settable.get_value()andSettable.set_value()methods with a more Pythonicvalueproperty - Removed redundant setting of a parser's
progvalue in thewith_argparser()decorator, as this is now handled centrally inCmd._build_parser() - The
auto_load_commandsargument tocmd2.Cmd.__init__now defaults toFalse argparse_custommodule breaking changes:descriptive_header: strreplaced withdescriptive_headers: Sequence[str | rich.Column]- Applies to parameter name when adding an argument to a parser as well as
set_descriptive_headersandget_descriptive_headers
- Applies to parameter name when adding an argument to a parser as well as
CompletionItem.description: strchanged toCompletionItem.descriptive_data: Sequence[str | rich.Column]
decoratorsmodule breaking changes:_set_parser_progrenamed toset_parser_prog(without the leading underscore) and moved toargparse_custommodule
- Renamed history
--output_fileto--output-fileto follow common command-line practices cmd2.Cmd.pprettymethod removed -richhas more and better options for pretty printing, see the pretty_print.py example for a demonstration of pretty-printing JSON data
- Refactored and modernized styling and utility modules:
-
Enhancements
- Enhanced all print methods (
poutput(),perror(),ppaged(), etc.) to natively renderrichobjects, enabling beautiful and complex output - Simplified the process for setting a custom parser for
cmd2's built-in commands. See the custom_parser.py example for an updated guide - Introduced
Cmd.macro_arg_complete()for tab-completing macro arguments, with default path completion that can be easily customized - Added
colors.pyandstyles.pyto provide easy access torichcolor names and managecmd2-specific style definitions usingStrEnum(see the colors.py example for a demonstration of all colors available to yourcmd2application) - Added ability to create a custom theme for a
cmd2application usingrich_utils.set_theme(see the rich_theme.py example for more info) - Consolidated multiple redundant examples into a few more comprehensive ones, see:
- Optimized performance of terminal fixup during command finalization by replacing
stty sanewithtermios.tcsetattr
- Enhanced all print methods (
-
Bug Fixes
- Fixed a redirection bug where
cmd2could unintentionally overwrite an application'ssys.stdout
- Fixed a redirection bug where
-
Migration Aids - these will help you iteratively migrate to
cmd23.x in stages- Published new cmd2-ansi module which is a backport of
the
cmd2.ansimodule present incmd22.7.0 - Published new cmd2-table module which is a backport of
the
cmd2.table_creatormodule present incmd22.7.0
- Published new cmd2-ansi module which is a backport of
the
- Enhancements
- Integrated rich-argparse with cmd2's default argparse help formatter (
Cmd2HelpFormatter).
- Integrated rich-argparse with cmd2's default argparse help formatter (
-
Enhancements
- Added explicit support for free-threaded versions of Python, starting with version 3.14
-
Bug Fixes
- Restored code to set a parser's
progvalue in thewith_argparserdecorator. This is to preserve backward compatibility in thecmd22.0 family. This functionality will be removed incmd23.0.0.
- Restored code to set a parser's
- Bug Fixes
- Fixed bug that prevented
cmd2from working withfrom __future__ import annotations
- Fixed bug that prevented
- Breaking Change
cmd22.6 supports Python 3.9+ (removed support for Python 3.8)
- Enhancements
- Added support for Python 3.14
- Added new
Cmd.ppretty()method for pretty printing arbitrary Python data structures - Clarified help text for
-t/--transcriptargument to thehistorycommand
- Bug Fixes
- Fixed duplicated parameter tables in API documentation.
- Bug Fixes
- Fixed docstring style for MkDocs API documentation so parameters are displayed properly.
- Bug Fixes
- Fixed 'index out of range' error when passing no arguments to an argparse-based command function.
- Bug Fixes
- Rolled back undocumented changes to printing functions introduced in 2.5.0.
- Bug Fixes
- Fixed issue where argument parsers for overridden commands were not being created.
- Fixed issue where
Cmd.ppaged()was not writing to the passed in destination.
- Bug Fixes
- Fixed type hint for
with_default_categorydecorator which caused type checkers to mistype a subclass ofCommandSetas a plainCommandSet.
- Fixed type hint for
- Bug Fixes
- Fixed type hints for passing a class method to
with_argparserandas_subcommand_to. - Fixed issue where
setcommand was not always printing a settable's current value.
- Fixed type hints for passing a class method to
- Bug Fixes
- Fixed
ZeroDivisionErrorinasync_alert()whenshutil.get_terminal_size().columnsis 0.
- Fixed
- Enhancements
- Changed
CommandSet._cmdto a read-only property which never returnsNonebecause it is meant to be called after theCommandSetis registered. This addresses type checker errors that occurred ifCommandSet._cmdwasn't cast or checked ifNonebefore use.
- Changed
- Bug Fixes
- Fixed default
pytestexecution when not using cmd2's custominvokecommand viainv pytest
- Fixed default
- Bug Fixes
- Fixed readline bug when using
ipycommand withgnureadlineand Python 3.13
- Fixed readline bug when using
- Breaking Change
cmd22.5 supports Python 3.8+ (removed support for Python 3.6 and 3.7)
- Bug Fixes
- Fixed issue where persistent history file was not saved upon SIGHUP and SIGTERM signals.
- Multiline commands are no longer fragmented in up-arrow history.
- Fixed bug where
async_alert()overwrites readline's incremental and non-incremental search prompts.- This fix introduces behavior where an updated prompt won't display after an aborted search
until a user presses Enter. See
async_printing.py
example for how to handle this case using
Cmd.need_prompt_refresh()andCmd.async_refresh_prompt().
- This fix introduces behavior where an updated prompt won't display after an aborted search
until a user presses Enter. See
async_printing.py
example for how to handle this case using
- Enhancements
- Removed dependency on
attrsand replaced with dataclasses - add
allow_clipboardinitialization parameter and attribute to disable ability to add output to the operating system clipboard - Updated unit tests to be Python 3.13 compliant.
- Fall back to bz2 compression of history file when lzma is not installed.
- Added settable called
scripts_add_to_historywhich determines whether scripts and pyscripts add commands to history.
- Removed dependency on
- Deletions (potentially breaking changes)
- Removed
apply_stylefromCmd.pwarning().
- Removed
- Bug Fixes
- Fixed ValueError caused when passing
Cmd.columnize()strings wider thandisplay_width.
- Fixed ValueError caused when passing
- Enhancements
- Renamed
utils.str_to_bool()->utils.to_bool(). - Enhanced
utils.to_bool()so that it accepts and convertsbool,int, andfloatin addition tostr.
- Renamed
- Enhancements
- Updated argparse decorator to remove annotations when the docstring is used for a command's help text.
- Updated unit test to be Python 3.11 compliant.
- Bug Fixes
- Fixed value for
ansi.Bg.YELLOW. - Fixed unit tests for
ansi.allow_style.
- Fixed value for
- Enhancements
async_alert()raises aRuntimeErrorif called from the main thread.
- Bug Fixes
- Fixed issue in
ansi.async_alert_str()which would raiseIndexErrorif prompt was blank. - Fixed issue where tab completion was quoting argparse flags in some cases.
- Fixed issue in
- Enhancements
- Added broader exception handling when enabling clipboard functionality via
pyperclip. - Added
PassThroughExceptionto__init__.pyimports. - cmd2 now uses pyreadline3 when running any version of Python on Windows
- Improved memory usage in certain use cases of tables (e.g. nested colored tables)
- Added broader exception handling when enabling clipboard functionality via
- Deletions (potentially breaking changes)
- Deleted
cmd2.fgandcmd2.bgwhich were deprecated in 2.3.0. Usecmd2.Fgandcmd2.Bginstead.
- Deleted
- Enhancements
- Added clearer exception handling to
BorderedTableandSimpleTable.
- Added clearer exception handling to
- Bug Fixes
- Fixed issue where a
ns_providercould be passedNoneinstead of its correctcmd2.CmdorCommandSetvalue.
- Fixed issue where a
- Bug Fixes
- Fixed issue introduced in 2.3.0 with
AlternatingTable,BorderedTable, andSimpleTablethat caused header alignment settings to be overridden by data alignment settings.
- Fixed issue introduced in 2.3.0 with
- Enhancements
CompletionItemsnow saves the original object from which it creates a string.- Using
CompletionItemsas argparse choices is fully supported.cmd2patchedargparseto compare input to the original value instead of theCompletionItemsinstance. ArgparseCompleternow does the following if a list ofCompletionItemswas created with numerical types:- Sorts completion hints numerically
- Right-aligns the left-most column in completion hint table
- Bug Fixes
- Fixed
AttributeErrorinrl_get_prompt()when prompt isNone. - Fixed bug where using choices on a Settable didn't verify that a valid choice had been entered.
- Fixed bug introduced in cmd2 2.0.0 in which
select()converts return values to strings. It should never have converted return values.
- Fixed
- Enhancements
- Added settings to Column class which prevent a table from overriding existing styles in header and/or data text. This allows for things like nesting an AlternatingTable in another AlternatingTable.
- AlternatingTable no longer automatically applies background color to borders. This was done to improve appearance since the background color extended beyond the borders of the table.
- Added ability to colorize all aspects of
AlternatingTable,BorderedTable, andSimpleTable. - Added support for 8-bit/256-colors with the
cmd2.EightBitFgandcmd2.EightBitBgclasses. - Added support for 24-bit/RGB colors with the
cmd2.RgbFgandcmd2.RgbBgclasses. - Removed dependency on colorama.
- Changed type of
ansi.allow_stylefrom a string to anansi.AllowStyleEnum class.
- Deprecations
- Deprecated
cmd2.fg. Usecmd2.Fginstead. - Deprecated
cmd2.bg. Usecmd2.Bginstead.
- Deprecated
- Breaking Changes
- To support the color upgrade, all cmd2 colors now inherit from either
ansi.FgColororansi.BgColor. Therefore,ansi.style()no longer accepts colors as strings.
- To support the color upgrade, all cmd2 colors now inherit from either
- Bug Fixes
- Fixed extra space appended to each alias by "alias list" command
- Enhancements
- New function
set_default_ap_completer_type()allows developer to extend and modify the behavior ofArgparseCompleter. - Added
ArgumentParser.get_ap_completer_type()andArgumentParser.set_ap_completer_type(). These methods allow developers to enable custom tab completion behavior for a given parser by using a customArgparseCompleter-based class. - Added
ap_completer_typekeyword arg toCmd2ArgumentParser.__init__()which saves a call toset_ap_completer_type(). This keyword will also work withadd_parser()when creating subcommands if the base command's parser is aCmd2ArgumentParser. - New function
register_argparse_argument_parameter()allows developers to specify custom parameters to be passed to the argparse parser'sadd_argument()method. These parameters will become accessible in the resulting argparse Action object when modifyingArgparseCompleterbehavior. - Using
SimpleTablein the output for the following commands to improve appearance.- help
- set (command and tab completion of Settables)
- alias tab completion
- macro tab completion
- Tab completion of
CompletionItemsnow includes divider row comprised ofCmd.rulercharacter. - Removed
--verboseflag from set command since descriptions always show now. - All cmd2 built-in commands now populate
self.last_result. - Argparse tab completer will complete remaining flag names if there are no more positionals to complete.
- Updated
async_alert()to account forself.promptnot matching Readline's current prompt.
- New function
- Deletions (potentially breaking changes)
- Deleted
set_choices_provider()andset_completer()which were deprecated in 2.1.2
- Deleted
- Breaking Changes
- Renamed
set_default_argument_parser()toset_default_argument_parser_type()
- Renamed
- Enhancements
- Added the following accessor methods for cmd2-specific attributes to the
argparse.Actionclassget_choices_callable()set_choices_provider()set_completer()get_descriptive_header()set_descriptive_header()get_nargs_range()set_nargs_range()get_suppress_tab_hint()set_suppress_tab_hint()
- Added the following accessor methods for cmd2-specific attributes to the
- Deprecations
- Now that
set_choices_provider()andset_completer()have been added as methods to theargparse.Actionclass, the standalone functions of the same name will be removed in version 2.2.0. To update to the new convention, do the following:- Change
set_choices_provider(action, provider)toaction.set_choices_provider(provider) - Change
set_completer(action, completer)toaction.set_completer(completer)
- Change
- Now that
- Bug Fixes
- Fixed handling of argparse's default options group name which was changed in Python 3.10
- Enhancements
- Restored
pluginsandtests_isolateddirectories to tarball published to PyPI forcmd2release
- Restored
- Enhancements
- Converted persistent history files from pickle to compressed JSON
- Bug Fixes
- Exclude
pluginsandtests_isolateddirectories from tarball published to PyPI forcmd2release
- Exclude
- Bug Fixes
- Fixed issue where history indexes could get repeated
- Fixed issue where TableCreator was tossing blank last line
- Corrected help text for alias command
- Breaking Changes
cmd22.0 supports Python 3.6+ (removed support for Python 3.5)- Argparse Completion / Settables
- Replaced
choices_function/choices_methodwithchoices_provider. - Replaced
completer_function/completer_methodwithcompleter. - ArgparseCompleter now always passes
cmd2.CmdorCommandSetinstance as the first positional argument to choices_provider and completer functions.
- Replaced
- Moved
basic_completefrom utils intocmd2.Cmdclass. - Moved
CompletionErrorto exceptions.py Namespace.__statement__has been removed. UseNamespace.cmd2_statement.get()instead.- Removed
--silentflag fromalias/macro createsince startup scripts can be run silently. - Removed
--with_silentflag fromalias/macro listsince startup scripts can be run silently. - Removed
with_argparser_and_unknown_argssince it was deprecated in 1.3.0. - Renamed
silent_startup_scripttosilence_startup_scriptfor clarity. - Replaced
cmd2.Cmd.completion_headerwithcmd2.Cmd.formatted_completions. See Enhancements for description of this new class member. - Settables now have new initialization parameters. It is now a required parameter to supply the
reference to the object that holds the settable attribute.
cmd2.Cmd.settablesis no longer a public dict attribute - it is now a property that aggregates all Settables across all registered CommandSets. - Failed transcript testing now sets self.exit_code to 1 instead of -1.
- Renamed
use_ipythonkeyword parameter ofcmd2.Cmd.__init__()toinclude_ipy. pycommand is only enabled ifinclude_pyparameter isTrue. See Enhancements for a description of this parameter.- Removed ability to run Python commands from the command line with
py. Nowpytakes no arguments and just opens an interactive Python shell. - Changed default behavior of
runcmds_plus_hooks()to not stop when Ctrl-C is pressed and instead run the next command in its list. - Removed
cmd2.Cmd.quit_on_sigintflag, which whenTrue, quit the application when Ctrl-C was pressed at the prompt. - The history bug fix resulted in structure changes to the classes in
cmd2.history. Therefore, persistent history files created with versions older than 2.0.0 are not compatible.
- Enhancements
- Added support for custom tab completion and up-arrow input history to
cmd2.Cmd2.read_input. See read_input.py for an example. - Added
cmd2.exceptions.PassThroughExceptionto raise unhandled command exceptions instead of printing them. - Added support for ANSI styles and newlines in tab completion results using
cmd2.Cmd.formatted_completions.cmd2provides this capability automatically if you return argparse completion matches asCompletionItems. - Settables enhancements:
- Settables may be optionally scoped to a CommandSet. Settables added to CommandSets will appear when a CommandSet is registered and disappear when a CommandSet is unregistered. Optionally, scoped Settables may have a prepended prefix.
- Settables now allow changes to be applied to any arbitrary object attribute. It no longer needs to match an attribute added to the cmd2 instance itself.
- Raising
SystemExitor callingsys.exit()in a command or hook function will setself.exit_codeto the exit code used in those calls. It will also result in the command loop stopping. - ipy command now includes all of
self.py_localsin the IPython environment - Added
include_pykeyword parameter tocmd2.Cmd.__init__(). IfFalse, then thepycommand will not be available. Defaults toFalse.run_pyscriptis not affected by this parameter. - Made the amount of space between columns in a SimpleTable configurable
- On POSIX systems, shell commands and processes being piped to are now run in the user's preferred shell instead of /bin/sh. The preferred shell is obtained by reading the SHELL environment variable. If that doesn't exist or is empty, then /bin/sh is used.
- Changed
cmd2.Cmd._run_editor()to the public methodcmd2.Cmd.run_editor()
- Added support for custom tab completion and up-arrow input history to
- Bug Fixes
- Fixed bug where setting
always_show_hint=Truedid not show a hint when completingSettables - Fixed bug in editor detection logic on Linux systems that do not have
which - Fixed bug in table creator where column headers with tabs would result in an incorrect width calculation
- Fixed
FileNotFoundErrorwhich occurred when runninghistory --clearand no history file existed.
- Fixed bug where setting
- Enhancements
- Added
silent_startup_scriptoption tocmd2.Cmd.__init__(). IfTrue, then the startup script's output will be suppressed. Anything written to stderr will still display. - cmd2 now uses pyreadline3 when running Python 3.8 or greater on Windows
- Added
- Notes
- This is the last release planned to support Python 3.5
- Bug Fixes
- Fixed tab completion crash on Windows
- Enhancements
- Changed how multiline doc string help is formatted to match style of other help messages
- Bug Fixes
- Fixed issue where quoted redirectors and terminators in aliases and macros were not being restored when read from a startup script.
- Fixed issue where instantiating more than one cmd2-based class which uses the
@as_subcommand_todecorator resulted in duplicated help text in the base command the subcommands belong to.
- Enhancements
- Added user-settable option called
always_show_hint. If True, then tab completion hints will always display even when tab completion suggestions print. Arguments whose help or hint text is suppressed will not display hints even when this setting is True. - argparse tab completion now groups flag names which run the same action. Optional flags are wrapped in brackets like it is done in argparse usage text.
- default category decorators are now heritable by default and will propagate the category down the class hierarchy until overridden. There's a new optional flag to set heritable to false.
- Added
--silentflag toalias/macro create. If used, then no confirmation message will be printed when aliases and macros are created or overwritten. - Added
--with_silentflag toalias/macro list. Use this option when saving to a startup script that should silently create aliases and macros.
- Added user-settable option called
- Bug Fixes
- Fixed issue where flag names weren't always sorted correctly in argparse tab completion
- Breaking Changes
CommandSet.on_unregister()is now called as first step in unregistering aCommandSetand not the last.CommandSet.on_unregistered()is now the last step.
- Enhancements
- Added
CommandSet.on_registered(). This is called bycmd2.Cmdafter aCommandSetis registered and all its commands have been added to the CLI. - Added
CommandSet.on_unregistered(). This is called bycmd2.Cmdafter aCommandSetis unregistered and all its commands have been removed from the CLI.
- Added
- Bug Fixes
- Fixed issue where subcommand added with
@as_subcommand_todecorator did not display help when called with-h/--help.
- Fixed issue where subcommand added with
- Enhancements
add_help=Falseno longer has to be passed to parsers used in@as_subcommand_todecorator. Only pass this if your subcommand should not have the-h/--helphelp option (as stated in argparse documentation).
- Bug Fixes
- Fixes an issue introduced in 1.3.0 with processing command strings containing terminator/separator character(s) that are manually passed to a command that uses argparse.
- Breaking changes
- The functions cmd2 adds to Namespaces (
get_statement()andget_handler()) are nowCmd2AttributeWrapperobjects namedcmd2_statementandcmd2_handler. This makes it easy to filter out which attributes in anargparse.Namespacewere added bycmd2.
- The functions cmd2 adds to Namespaces (
- Deprecations
Namespace.__statement__will be removed incmd22.0.0. UseNamespace.cmd2_statement.get()going forward.
- Bug Fixes
- Fixed
RecursionErrorwhen printing anargparse.Namespacecaused by custom attribute cmd2 was adding
- Fixed
- Enhancements
- Added
get_statement()function toargparse.Namespacewhich returns__statement__attribute
- Added
- Bug Fixes
- Fixed
AttributeErrorwhenCommandSetthat usesas_subcommand_todecorator is loaded duringcmd2.Cmd.__init__().
- Fixed
- Enhancements
- Improved exception messages when using mock without
spec=True. See testing documentation for more details on testing cmd2-based applications with mock.
- Improved exception messages when using mock without
- Breaking changes
- CommandSet command functions (do*, complete*, help_) will no longer have the cmd2 app passed
in as the first parameter after
selfsince this is already a class member. - Renamed
install_command_set()anduninstall_command_set()toregister_command_set()andunregister_command_set()for better name consistency.
- CommandSet command functions (do*, complete*, help_) will no longer have the cmd2 app passed
in as the first parameter after
- Bug Fixes
- Fixed help formatting bug in
Cmd2ArgumentParserwhenmetavaris a tuple - Fixed tab completion bug when using
CompletionItemon an argument whosemetavaris a tuple - Added explicit testing against python 3.5.2 for Ubuntu 16.04, and 3.5.3 for Debian 9
- Added fallback definition of typing.Deque (taken from 3.5.4)
- Removed explicit type hints that fail due to a bug in 3.5.2 favoring comment-based hints instead
- When passing a ns_provider to an argparse command, will now attempt to resolve the correct CommandSet instance for self. If not, it'll fall back and pass in the cmd2 app
- Fixed help formatting bug in
- Other
- Added missing doc-string for new cmd2.Cmd init parameters introduced by CommandSet enhancement
- Bug Fixes
- Fixed
progvalue of subcommands added withas_subcommand_to()decorator. - Fixed missing settings in subcommand parsers created with
as_subcommand_to()decorator. These settings include things like description and epilog text. - Fixed issue with CommandSet auto-discovery only searching direct sub-classes
- Fixed
- Enhancements
- Added functions to fetch registered CommandSets by type and command name
- Bug Fixes
- Fixed issue determining whether an argparse completer function required a reference to a
containing CommandSet. Also resolves issues determining the correct CommandSet instance when
calling the argparse argument completer function. Manifested as a TypeError when using
cmd2.Cmd.path_completeas a completer for an argparse-based command defined in a CommandSet
- Fixed issue determining whether an argparse completer function required a reference to a
containing CommandSet. Also resolves issues determining the correct CommandSet instance when
calling the argparse argument completer function. Manifested as a TypeError when using
- Enhancements
- Added CommandSet - Enables defining a separate loadable module of commands to register/unregister with your cmd2 application.
- Other
- Marked with_argparser_and_unknown_args pending deprecation and consolidated implementation into with_argparser
- Bug Fixes
- Relax minimum version of
importlib-metadatato >= 1.6.0 when using Python < 3.8
- Relax minimum version of
- Bug Fixes
- Fixed
typingmodule compatibility issue with Python 3.5 prior to 3.5.4
- Fixed
- Enhancements
- Switched to getting version using
importlib.metadatainstead of usingpkg_resources- Improves
cmd2application launch time on systems that have a lot of Python packages onsys.path - Added dependency on
importlib_metadatawhen running on versions of Python prior to 3.8
- Improves
- Switched to getting version using
- Bug Fixes
- Fixed issue where subcommand usage text could contain a subcommand alias instead of the actual name
- Fixed bug in
ArgparseCompleterwherefill_widthcould become negative iftoken_widthwas large relative to the terminal width.
- Enhancements
- Made
ipyconsistent withpyin the following waysipyreturns whether any of the commands run in it returned True to stop command loopCmd.in_pyscript()returns True while inipy.- Starting
ipywhenCmd.in_pyscript()is already True is not allowed.
with_argument_list,with_argparser, andwith_argparser_and_unknown_argswrappers now passkwargsthrough to their wrapped command function.- Added
table_creatormodule for creating richly formatted tables. This module is in beta and subject to change.- See table_creation documentation for an overview.
- See table_creation.py for an example.
- Added the following exceptions to the public API
SkipPostcommandHooks- Custom exception class for when a command has a failure bad enough to skip post command hooks, but not bad enough to print the exception to the user.Cmd2ArgparseError- ASkipPostcommandHooksexception for when a command fails to parse its arguments. Normally argparse raises aSystemExitexception in these cases. To avoid stopping the command loop, catch theSystemExitand raise this instead. If you still need to run post command hooks after parsing fails, just return instead of raising an exception.
- Added explicit handling of
SystemExit. If a command raises this exception, the command loop will be gracefully stopped.
- Made
- Bug Fixes
- Ctrl-C now stops a running text script instead of just the current
run_scriptcommand
- Ctrl-C now stops a running text script instead of just the current
- Enhancements
do_shell()now saves the return code of the command it runs inself.last_resultfor use in pyscripts
- Bug Fixes
- Fixed issue where postcmd hooks were running after an
argparseexception in a command.
- Fixed issue where postcmd hooks were running after an
- Enhancements
- The documentation at cmd2.rftd.io received a major overhaul
- Other
- Moved categorize utility function from * *decorators** module to **utils** module
- Notes
- Now that the 1.0 release is out,
cmd2intends to follow Semantic Versioning
- Now that the 1.0 release is out,
- Bug Fixes
- Corrected issue where the actual new value was not always being printed in do_set. This occurred in cases where the typed value differed from what the setter had converted it to.
- Fixed bug where ANSI style sequences were not correctly handled in
utils.truncate_line(). - Fixed bug where pyscripts could edit
cmd2.Cmd.py_localsdictionary. - Fixed bug where cmd2 set
sys.path[0]for a pyscript to cmd2's working directory instead of the script file's directory. - Fixed bug where
sys.pathwas not being restored after a pyscript ran.
- Enhancements
- Renamed set command's
-l/--longflag to-v/--verbosefor consistency with help and history commands. - Setting the following pyscript variables:
__name__: main__file__: script path (as typed, ~ will be expanded)
- Only tab complete after redirection tokens if redirection is allowed
- Made
CompletionErrorexception available to non-argparse tab completion - Added
apply_styletoCompletionErrorinitializer. It defaults to True, but can be set to False if you don't want the error text to haveansi.style_error()applied to it when printed.
- Renamed set command's
- Other
- Removed undocumented
py runcommand since it was replaced byrun_pyscripta while ago - Renamed
AutoCompletertoArgparseCompleterfor clarity - Custom
EmptyStatementexception is no longer part of the documented public API
- Removed undocumented
- Notes
- This is a beta release leading up to the 1.0.0 release
- We intend no more breaking changes prior to 1.0.0
- Just bug fixes, documentation updates, and enhancements
- Enhancements
- Changed the default help text to make
help -vmore discoverable - set command now supports tab completion of values
- Added
add_settable()andremove_settable()convenience methods to updateself.settabledictionary - Added convenience
ansi.fgandansi.bgenums of foreground and background colorsansi.style()fgargument can now either be of typestroransi.fgansi.style()bgargument can now either be of typestroransi.bg- This supports IDE auto-completion of color names
- The enums also support
f-stringsandformat()calls (e.g."{}hello{}".format(fg.blue, fg.reset))- string concatenation (e.g.
fg.blue + "hello" + fg.reset)
- Changed the default help text to make
- Breaking changes
- Renamed
locals_in_pyattribute ofcmd2.Cmdtoself_in_py - The following public attributes of
cmd2.Cmdare no longer settable at runtime by default:continuation_promptself_in_pyprompt
self.settablechanged toself.settables- It is now a Dict[str, Settable] instead of Dict[str, str]
- setting onchange callbacks have a new method signature and must be added to the Settable instance in order to be called
- Removed
cast()utility function - Removed
ansi.FG_COLORSandansi.BG_COLORSdictionaries- Replaced with
ansi.fgandansi.bgenums providing similar but improved functionality
- Replaced with
- Renamed
- Notes
- This is an alpha release leading up to the 1.0.0 release
- We intend no more breaking changes prior to 1.0.0
- Just bug fixes, documentation updates, and enhancements
- Enhancements
- Reduced what gets put in package downloadable from PyPI (removed irrelevant CI config files and such)
- Enhancements
- Flushing stderr when setting the window title and printing alerts for better responsiveness in cases where stderr is not unbuffered.
- Added function to truncate a single line to fit within a given display width.
cmd2.utils.truncate_linesupports characters with display widths greater than 1 and ANSI style sequences. - Added line truncation support to
cmd2.utilstext alignment functions. - Added support for Python 3.9 alpha
- Bug Fixes
- Fixed bug where startup script containing a single quote in its file name was incorrectly quoted
- Added missing implicit dependency on
setuptoolsdue to build withsetuptools_scm
- Enhancements
- Added dim text style support via
style()function andansi.INTENSITY_DIMsetting.
- Added dim text style support via
- Breaking changes
- Renamed the following
ansimembers for accuracy in what types of ANSI escape sequences are handledansi.allow_ansi->ansi.allow_styleansi.ansi_safe_wcswidth()->ansi.style_aware_wcswidth()ansi.ansi_aware_write()->ansi.style_aware_write()
- Renamed the following
ansimembers for clarificationansi.BRIGHT->ansi.INTENSITY_BRIGHTansi.NORMAL->ansi.INTENSITY_NORMAL
- Renamed the following
- Bug Fixes
- Fixed bug where a redefined
ansi.style_errorwas not being used in allcmd2files
- Fixed bug where a redefined
- Enhancements
- Enabled line buffering when redirecting output to a file
- Added
align_left(),align_center(), andalign_right()to utils.py. All 3 of these functions support ANSI escape sequences and characters with display widths greater than 1. They wrapalign_text()which is also in utils.py.
- Bug Fixes
- Fixed bug where pipe processes were not being stopped by Ctrl-C
- Added exception handling to account for non-standard Python environments in which readline is not loaded dynamically from a shared library file
- Enhancements
- Added
read_input()function that is used to read from stdin. Unlike the Python built-ininput(), it also has an argument to disable tab completion while input is being entered. - Added capability to override the argument parser class used by cmd2 built-in commands. See override_parser.py example for more details.
- Added
endargument topfeedback()to be consistent with the other print functions likepoutput(). - Added
apply_styletopwarning().
- Added
- Breaking changes
- For consistency between all the print functions:
- Made
endandchopkeyword-only arguments ofppaged() endis always added to message inppaged()
- Made
- For consistency between all the print functions:
- Bug Fixes
- Fixed bug where setting
use_ipythonto False removed ipy command from the entirecmd2.Cmdclass instead of just the instance being created - Fix bug where cmd2 ran 'stty sane' command when stdin was not a terminal
- Fixed bug where setting
- Enhancements
- Send all startup script paths to run_script. Previously we didn't do this if the file was empty, but that showed no record of the run_script command in history.
- Made it easier for developers to override
editcommand by havingdo_historyno longer calldo_edit. This also removes the need to excludeeditcommand from history list. - It is no longer necessary to set the
progattribute of an argparser with subcommands. cmd2 now automatically sets the prog value of it and all its subparsers so that all usage statements contain the top level command name and not sys.argv[0].
- Breaking changes
- Some constants were moved from cmd2.py to constants.py
- cmd2 command decorators were moved to decorators.py. If you were importing them via cmd2's __init__.py, then there will be no issues.
- Bug Fixes
- Fixed
ValueErrorexception which could occur when an old format persistent history file is loaded with newcmd2
- Fixed
- Enhancements
- Improved displaying multiline CompletionErrors by indenting all lines
- Bug Fixes
- Fixed bug introduced in 0.9.17 where help functions for hidden and disabled commands were not being filtered out as help topics
- Enhancements
AutoCompleternow handles argparse's mutually exclusive groups. It will not tab complete flag names or positionals for already completed groups. It also will print an error if you try tab completing a flag's value if the flag belongs to a completed group.AutoCompleternow uses the passed-in parser's help formatter to generate hint text. This gives help and hint text for an argument consistent formatting.
- Bug Fixes
- Fixed a bug when using WSL when all Windows paths have been removed from $PATH
- Fixed a bug when running a cmd2 application on Linux without Gtk libraries installed
- Enhancements
- No longer treating empty text scripts as an error condition
- Allow dynamically extending a
cmd2.Cmdobject instance with ado_xxxmethod at runtime - Choices/Completer functions can now be passed a dictionary that maps command-line tokens to
their argparse argument. This is helpful when one argument determines what is tab completed
for another argument. If these functions have an argument called
arg_tokens, then AutoCompleter will automatically pass this dictionary to them. - Added CompletionError class that can be raised during argparse-based tab completion and printed to the user
- Added the following convenience methods
Cmd.in_script()- return whether a text script is runningCmd.in_pyscript()- return whether a pyscript is running
- Bug Fixes
- Fixed inconsistent parsing/tab completion behavior based on the value of
allow_redirection. This flag is only meant to be a security setting that prevents redirection of stdout and should not alter parsing logic.
- Fixed inconsistent parsing/tab completion behavior based on the value of
- Enhancements
- Raise
TypeErrorif trying to set choices/completions on argparse action that accepts no arguments - Create directory for the persistent history file if it does not already exist
- Added
set_choices_function(),set_choices_method(),set_completer_function(), andset_completer_method()to support cases where this functionality needs to be added to an argparse action outside of the normalparser.add_argument()call.
- Raise
- Breaking Changes
- Aliases and macros can no longer have the same name as a command
- Bug Fixes
- Fixed exception caused by tab completing after an invalid subcommand was entered
- Fixed bug where
history -vwas sometimes showing raw and expanded commands when they weren't different - Fixed bug where multiline commands were having leading and ending spaces stripped. This would mess up quoted strings that crossed multiple lines.
- Fixed a bug when appending to the clipboard where contents were in reverse order
- Fixed issue where run_pyscript failed if the script's filename had 2 or more consecutive spaces
- Fixed issue where completer function of disabled command would still run
- Enhancements
- Greatly simplified using argparse-based tab completion. The new interface is a complete overhaul that breaks the previous way of specifying completion and choices functions. See header of argparse_custom.py for more information.
- Enabled tab completion on multiline commands
- Renamed Commands Notice
- The following commands were renamed in the last release and have been removed in this release
load- replaced byrun_script_relative_load- replaced by_relative_run_scriptpyscript- replaced byrun_pyscript
- We apologize for any inconvenience, but the new names are more self-descriptive
- Lots of end users were confused particularly about what exactly
loadshould be loading
- Lots of end users were confused particularly about what exactly
- The following commands were renamed in the last release and have been removed in this release
- Breaking Changes
- Restored
cmd2.Cmd.statement_parserto be a public attribute (no underscore)- Since it can be useful for creating post-parsing hooks
- Completely overhauled the interface for adding tab completion to argparse arguments. See enhancements for more details.
ACArgumentParseris now calledCmd2ArgumentParser- Moved
basic_completeto utils.py - Made optional arguments on the following completer methods keyword-only:
delimiter_complete,flag_based_complete,index_based_complete,path_complete,shell_cmd_complete - Renamed history option from
--output-fileto--output_file - Renamed
matches_sort_keytodefault_sort_key. This value determines the default sort ordering of string results like alias, command, category, macro, settable, and shortcut names. Unsorted tab completion results also are sorted with this key. Its default value (ALPHABETICAL_SORT_KEY) performs a case-insensitive alphabetical sort, but it can be changed to a natural sort by setting the value to NATURAL_SORT_KEY. StatementParsernow expects shortcuts to be passed in as dictionary. This eliminates the step of converting the shortcuts dictionary into a tuple before creatingStatementParser.- Renamed
Cmd.pyscript_nametoCmd.py_bridge_name - Renamed
Cmd.pystatetoCmd.py_locals - Renamed
PyscriptBridgetoPyBridge
- Restored
- Enhancements
- Added support for and testing with Python 3.8, starting with 3.8 beta
- Improved information displayed during transcript testing
- Added
ansimodule with functions and constants to support ANSI escape sequences which are used for things like applying style to text - Added support for applying styles (color, bold, underline) to text via
style()function inansimodule - Added default styles to ansi.py for printing
success,warning. anderrortext. These are the styles used by cmd2 and can be overridden to match the color scheme of your application. - Added
ansi_aware_write()function toansimodule. This function takes into account the value ofallow_ansito determine if ANSI escape sequences should be stripped when not writing to a tty. See documentation for more information on theallow_ansisetting.
- Breaking Changes
- Python 3.4 reached its end of life on March 18,
2019 and is no longer supported by
cmd2- If you need to use Python 3.4, you should pin your requirements to use
cmd20.9.13
- If you need to use Python 3.4, you should pin your requirements to use
- Made lots of changes to minimize the public API of the
cmd2.Cmdclass- Attributes and methods we do not intend to be public now all begin with an underscore
- We make no API stability guarantees about these internal functions
- Split
perrorinto 2 functions:perror- print a message to sys.stderrpexcept- print Exception message to sys.stderr. If debug is true, print exception traceback if one exists
- Signature of
poutputandperrorsignificantly changed- Removed color parameters
color,err_color, andwar_colorfrompoutputandperror- See the docstrings of these methods or the cmd2 docs for more info on applying styles to output messages
endargument is now keyword-only and cannot be specified positionallytraceback_warno longer exists as an argument since it isn't needed now thatperrorandpexceptexist
- Removed color parameters
- Moved
cmd2.Cmd.colorsto ansi.py and renamed it toallow_ansi. This is now an application-wide setting. - Renamed the following constants and moved them to ansi.py
COLORS_ALWAYS-->ANSI_ALWAYSCOLORS_NEVER-->ANSI_NEVERCOLORS_TERMINAL-->ANSI_TERMINAL
- Python 3.4 reached its end of life on March 18,
2019 and is no longer supported by
- Renamed Commands Notice
- The following commands have been renamed. The old names will be supported until the next
release.
load-->run_script_relative_load-->_relative_run_scriptpyscript-->run_pyscript
- The following commands have been renamed. The old names will be supported until the next
release.
- Bug Fixes
- Fixed issue where the wrong terminator was being appended by
Statement.expanded_command_line() - Fixed issue where aliases and macros could not contain terminator characters in their values
- History now shows what was typed for macros and not the resolved value by default. This is
consistent with the behavior of aliases. Use the
expandedorverbosearguments tohistoryto see the resolved value for the macro. - Fixed parsing issue in case where output redirection appears before a pipe. In that case, the pipe was given precedence even though it appeared later in the command.
- Fixed issue where quotes around redirection file paths were being lost in
Statement.expanded_command_line() - Fixed a bug in how line numbers were calculated for transcript testing
- Fixed issue where
_cmdloop()suppressed exceptions by returning from within itsfinallycode - Fixed UnsupportedOperation on fileno error when a shell command was one of the commands run while generating a transcript
- Fixed bug where history was displaying expanded multiline commands when -x was not specified
- Fixed issue where the wrong terminator was being appended by
- Enhancements
- Added capability to chain pipe commands and redirect their output (e.g. !ls -l | grep user | wc -l > out.txt)
pyscriptlimits a command's stdout capture to the same period that redirection does. Therefore output from a command's postparsing and finalization hooks isn't saved in the StdSim object.StdSim.buffer.write()now flushes when the wrapped stream uses line buffering and the bytes being written contain a newline or carriage return. This helps whenpyscriptis echoing the output of a shell command since the output will print at the same frequency as when the command is run in a terminal.- ACArgumentParser no longer prints complete help text when a parsing error occurs since long help messages scroll the actual error message off the screen.
- Exceptions occurring in tab completion functions are now printed to stderr before returning control back to readline. This makes debugging a lot easier since readline suppresses these exceptions.
- Added support for custom Namespaces in the argparse decorators. See description of
ns_providerargument for more information. - Transcript testing now sets the
exit_codereturned fromcmdloopbased on Success/Failure - The history of entered commands previously was saved using the readline persistence mechanism,
and only persisted if you had readline installed. Now history is persisted independent of
readline; user input from previous invocations of
cmd2based apps now shows in thehistorycommand. - Text scripts now run immediately instead of adding their commands to
cmdqueue. This allows easy capture of the entire script's output. - Added member to
CommandResultcalledstopwhich is the return value ofonecmd_plus_hooksafter it runs the given command line.
- Breaking changes
- Replaced
unquote_redirection_tokens()withunquote_specific_tokens(). This was to support the fix that allows terminators in alias and macro values. - Changed
Statement.pipe_toto a string instead of a list preserve_quotesis now a keyword-only argument in the argparse decorators- Refactored so that
cmd2.Cmd.cmdloop()returns theexit_codeinstead of a call tosys.exit()It is now application developer's responsibility to treat the return value fromcmdloop()accordingly - Only valid commands are persistent in history between invocations of
cmd2based apps. Previously all user input was persistent in history. If readline is installed, the history available with the up and down arrow keys (readline history) may not match that shown in thehistorycommand, becausehistoryonly tracks valid input, while readline history captures all input. - History is now persisted in a binary format, not plain text format. Previous history files are
destroyed on first launch of a
cmd2based app of version 0.9.13 or higher. - HistoryItem class is no longer a subclass of
str. If you are directly accessing the.historyattribute of acmd2based app, you will need to update your code to use.history.get(1).statement.rawinstead. - Removed internally used
eoscommand that was used to keep track of when a text script's commands ended - Removed
cmd2member called_STOP_AND_EXITsince it was just a boolean value that should always be True - Removed
cmd2member called_should_quitsincePyBridgenow handles this logic - Removed support for
cmd.cmdqueue allow_cli_argsis now an argument to init instead of acmd2class member
- Replaced
- Python 3.4 EOL notice
- Python 3.4 reached its end of life on March 18, 2019
- This is the last release of
cmd2which will support Python 3.4
- Bug Fixes
- Fixed a bug in how redirection and piping worked inside
pyorpyscriptcommands - Fixed bug in
async_alertwhere it didn't account for prompts that contained newline characters - Fixed path completion case when CWD is just a slash. Relative path matches were incorrectly prepended with a slash.
- Fixed a bug in how redirection and piping worked inside
- Enhancements
- Added ability to include command name placeholders in the message printed when trying to run a
disabled command.
- See docstring for
disable_command()ordisable_category()for more details.
- See docstring for
- Added instance attributes to customize error messages without having to override methods.
These messages can also be colored. _
help_error- the error that prints when no help information can be found _default_error- the error that prints when a non-existent command is run - The
with_argparserdecorators now add the Statement object created when parsing the command line to theargparse.Namespaceobject they pass to thedo_*methods. It is stored in an attribute called__statement__. This can be useful if a command function needs to know the command line for things like logging. - Added a
-toption to theloadcommand for automatically generating a transcript based on a script file - When in a pyscript, the stdout and stderr streams of shell commands and processes being
piped to are now captured and included in the
CommandResultstructure.
- Added ability to include command name placeholders in the message printed when trying to run a
disabled command.
- Potentially breaking changes
- The following commands now write to stderr instead of stdout when printing an error. This will
make catching errors easier in pyscript. _
do_help()- when no help information can be found _default()- in all cases since this is called when an invalid command name is run *_report_disabled_command_usage()- in all cases since this is called when a disabled command is run - Removed *** from beginning of error messages printed by
do_help()anddefault() - Significantly refactored
cmd.Cmdclass so that all class attributes got converted to instance attributes, also:- Added
allow_redirection,terminators,multiline_commands, andshortcutsas optional arguments tocmd2.Cmd.__init__() - A few instance attributes were moved inside
StatementParserand properties were created for accessing them
- Added
self.pipe_procis now calledself.cur_pipe_proc_readerand is aProcReaderclass.- Shell commands and commands being piped to while in a pyscript will function as if their output is going to a pipe and not a tty. This was necessary to be able to capture their output.
- Removed
reserved_wordsclass attribute due to lack of use - Removed
keywordsinstance attribute due to lack of use
- The following commands now write to stderr instead of stdout when printing an error. This will
make catching errors easier in pyscript. _
- Bug Fixes
- Fixed bug in how history command deals with multiline commands when output to a script
- Fixed a bug when the
with_argument_listdecorator is called with the optionalpreserve_quotesargument - Fix bug in
perror()where it would try to print an exception Traceback even if none existed
- Enhancements
- Improvements to the history command
- Simplified the display format and made it more similar to bash
- Added -x, --expanded flag
- output expanded commands instead of entered command (expands aliases, macros, and shortcuts)
- Added -v, --verbose flag
- display history and include expanded commands if they differ from the typed command
- Added support for negative indices
- Added
matches_sort_keyto override the default way tab completion matches are sorted - Added
StdSim.pause_storagemember which when True will causeStdSimto not save the output sent to it. See documentation forCommandResultinpyscript_bridge.pyfor reasons pausing the storage can be useful. - Added ability to disable/enable individual commands and entire categories of commands. When a
command is disabled, it will not show up in the help menu or tab complete. If a user tries to
run the command or call help on it, a command-specific message supplied by the developer will
be printed. The following commands were added to support this feature.
enable_command()enable_category()disable_command()disable_category()
- Improvements to the history command
- Potentially breaking changes
- Made
cmd2_appa positional and required argument ofAutoCompletersince certain functionality now requires that it can't beNone. AutoCompleterno longer assumesCompletionItemresults are sorted. Therefore you should follow thecmd2convention of settingself.matches_sortedto True before returning the results if you have already sorted theCompletionItemlist. Otherwise it will be sorted usingself.matches_sort_key.- Removed support for bash completion since this feature had slow performance. Also it relied on
AutoCompleterwhich has since developed a dependency oncmd2methods. - Removed ability to call commands in
pyscriptas if they were functions (e.g.app.help()) in favor of only supporting onepyscriptinterface. This simplifies future maintenance. - No longer supporting C-style comments. Hash (#) is the only valid comment marker.
- No longer supporting comments embedded in a command. Only command line input where the first non-whitespace character is a # will be treated as a comment. This means any # character appearing later in the command will be treated as a literal. The same applies to a # in the middle of a multiline command, even if it is the first character on a line. _ # this is a comment _ this # is not a comment
- Made
- Bug Fixes
- Fixed unit test that hangs on Windows
- Bug Fixes
- Fixed bug where the
setcommand was not tab completing from the currentsettabledictionary.
- Fixed bug where the
- Enhancements
- Changed edit command to use do_shell() instead of calling os.system()
- Bug Fixes
- Fixed issue with echoing strings in StdSim. Because they were being sent to a binary buffer, line buffering was being ignored.
- Enhancements
- Made quit() and exit() functions available to scripts run with pyscript. This allows those scripts to exit back to the console's prompt instead of exiting the whole application.
- Bug Fixes
- Fixed bug when user chooses a zero or negative index when calling
Cmd.select() - Restored behavior where
cmd_echoalways starts as False in a py script. This was broken in 0.9.5.
- Fixed bug when user chooses a zero or negative index when calling
- Enhancements
- cmdloop now only attempts to register a custom signal handler for SIGINT if running in the main thread
- commands run as a result of
default_to_shellbeing True now run viado_shell()and are saved to history. - Added more tab completion to pyscript command.
- Deletions (potentially breaking changes)
- Deleted
Cmd.colorize()andCmd._colorcodeswhich were deprecated in 0.9.5 - Replaced
dir_exe_onlyanddir_onlyflags inpath_completewith optionalpath_filterfunction that is used to filter paths out of completion results. perror()no longer prepends "ERROR: " to the error message being printed
- Deleted
- Bug Fixes
- Fixed bug introduced in 0.9.5 caused by backing up and restoring
self.promptinpseudo_raw_input. As part of this fix, continuation prompts will not be redrawn withasync_update_promptorasync_alert.
- Fixed bug introduced in 0.9.5 caused by backing up and restoring
- Enhancements
- All platforms now depend on wcwidth to assist with asynchronous alerts.
- Macros now accept extra arguments when called. These will be tacked onto the resolved command.
- All cmd2 commands run via
pynow go throughonecmd_plus_hooks.
- Bug Fixes
- Fixed bug where
get_all_commandscould return non-callable attributes - Fixed bug where alias command was dropping quotes around arguments
- Fixed bug where running help on argparse commands didn't work if they didn't support -h
- Fixed transcript testing bug where last command in transcript has no expected output
- Fixed bugs with how AutoCompleter and ArgparseFunctor handle argparse arguments with nargs=argparse.REMAINDER. Tab completion now correctly matches how argparse will parse the values. Command strings generated by ArgparseFunctor should now be compliant with how argparse expects REMAINDER arguments to be ordered.
- Fixed bugs with how AutoCompleter handles flag prefixes. It is no longer hard-coded to use '-' and will check against the prefix_chars in the argparse object. Also, single-character tokens that happen to be a prefix char are not treated as flags by argparse and AutoCompleter now matches that behavior.
- Fixed bug where AutoCompleter was not distinguishing between a negative number and a flag
- Fixed bug where AutoCompleter did not handle -- the same way argparse does (all args after -- are non-options)
- Fixed bug where
- Enhancements
- Added
exit_codeattribute ofcmd2.Cmdclass- Enables applications to return a non-zero exit code when exiting from
cmdloop
- Enables applications to return a non-zero exit code when exiting from
ACHelpFormatternow inherits fromargparse.RawTextHelpFormatterto make it easier for formatting help/description text- Aliases are now sorted alphabetically
- The set command now tab completes settable parameter names
- Added
async_alert,async_update_prompt, andset_window_titlefunctions- These allow you to provide feedback to the user in an asynchronous fashion, meaning alerts can display when the user is still entering text at the prompt. See async_printing.py for an example.
- Cross-platform colored output support
coloramagets initialized properly inCmd.__init()- The
Cmd.colorssetting is no longer platform dependent and now has three values:- Terminal (default) - output methods do not strip any ANSI escape sequences when output is a terminal, but if the output is a pipe or a file the escape sequences are stripped
- Always - output methods never strip ANSI escape sequences, regardless of the output destination
- Never - output methods strip all ANSI escape sequences
- Added
macrocommand to create macros, which are similar to aliases, but can take arguments when called - All cmd2 command functions have been converted to use argparse.
- Renamed argparse_example.py to decorator_example.py to help clarify its intent
- Added
- Deprecations
- Deprecated the built-in
cmd2support for colors includingCmd.colorize()andCmd._colorcodes
- Deprecated the built-in
- Deletions (potentially breaking changes)
- The
preparse,postparsing_precmd, andpostparsing_postcmdmethods deprecated in the previous release have been deleted * The new application lifecycle hook system allows for registration of callbacks to be called at various points in the lifecycle and is more powerful and flexible than the previous system aliasis now a command with subcommands to create, list, and delete aliases. Therefore its syntax has changed. All current alias commands in startup scripts or transcripts will break with this release.unaliaswas deleted sincealias deletereplaced it
- The
- Bug Fixes
- Fixed bug where
preparsewas not getting called - Fixed bug in parsing of multiline commands where matching quote is on another line
- Fixed bug where
- Enhancements
- Improved implementation of lifecycle hooks to support a plugin framework, see
docs/hooks.rstfor details. - New dependency on
attrsthird party module - Added
matches_sortedmember to support custom sorting of tab completion matches - Added
tab_autocomp_dynamic.py
example
- Demonstrates updating the argparse object during init instead of during class construction
- Improved implementation of lifecycle hooks to support a plugin framework, see
- Deprecations
- Deprecated the following hook methods, see
hooks.rstfor full details:cmd2.Cmd.preparse()- equivalent functionality available viacmd2.Cmd.register_postparsing_hook()cmd2.Cmd.postparsing_precmd()- equivalent functionality available viacmd2.Cmd.register_postparsing_hook()cmd2.Cmd.postparsing_postcmd()- equivalent functionality available viacmd2.Cmd.register_postcmd_hook()
- Deprecated the following hook methods, see
- Bug Fixes
- Fixed extra slash that could print when tab completing users on Windows
- Bug Fixes
- Fixed bug when StatementParser
__init__()was called withterminatorsequal toNone - Fixed bug when
Cmd.onecmd()was called with a rawstr
- Fixed bug when StatementParser
- Enhancements
- Added
--clearflag tohistorycommand that clears both the command and readline history.
- Added
- Deletions
- The
CmdResulthelper class which was deprecated in the previous release has now been deleted- It has been replaced by the improved
CommandResultclass
- It has been replaced by the improved
- The
- Bug Fixes
- Fixed issue where piping and redirecting did not work correctly with paths that had spaces
- Enhancements
- Added ability to print a header above tab completion suggestions using
completion_headermember - Added
pagerandpager_chopattributes to thecmd2.Cmdclasspagerdefaults to less -RXF on POSIX and more on Windowspager_chopdefaults to less -SRXF on POSIX and more on Windows
- Added
chopargument tocmd2.Cmd.ppaged()method for displaying output using a pager- If
chopisFalse, thenself.pageris used as the pager - Otherwise
self.pager_chopis used as the pager
- If
- Greatly improved the
table_display.py
example
- Now uses the new tableformatter
module which looks better than
tabulate
- Now uses the new tableformatter
module which looks better than
- Added ability to print a header above tab completion suggestions using
- Deprecations
- The
CmdResulthelper class is deprecated and replaced by the improvedCommandResultclassCommandResulthas the following attributes: stdout, stderr, and dataCmdResulthad attributes of: out, err, war
CmdResultwill be deleted in the next release
- The
- Bug Fixes
- Prevent crashes that could occur attempting to open a file in non-existent directory or with very long filename
- Enhancements
display_matchesis no longer restricted to delimited strings
- Bug Fixes
- fix packaging error for 0.8.x versions (yes we had to deploy a new version of the 0.9.x series to fix a packaging error with the 0.8.x version)
- Bug Fixes
- If self.default_to_shell is true, then redirection and piping are now properly passed to the shell. Previously it was truncated.
- Submenus now call all hooks, it used to just call precmd and postcmd.
- Enhancements
- Automatic completion of
argparsearguments viacmd2.argparse_completer.AutoCompleter- See the tab_autocompletion.py example for a demonstration of how to use this feature
cmd2no longer depends on thesixmodulecmd2is now a multi-file Python package instead of a single-file module- New pyscript approach that provides a pythonic interface to commands in the cmd2 application.
- Switch command parsing from pyparsing to custom code which utilizes shlex.
- The object passed to do** methods has changed. It no longer is the pyparsing object, it's
a new Statement object, which is a subclass of
str. The statement object has many attributes which give you access to various components of the parsed input. If you were using anything but the string in your do** methods, this change will require you to update your code. commentGrammarsis no longer supported or available. Comments are C-style or python style.- Input redirection no longer supported. Use the load command instead.
multilineCommandattribute isnow multiline_commandidentcharsis now ignored. The standardlibrary cmd uses those characters to split the first "word" of the input, but cmd2 hasn't used those for a while, and the new parsing logic parses on whitespace, which has the added benefit of full unicode support, unlike cmd or prior versions of cmd2.set_posix_shlexfunction andPOSIX_SHLEXvariable have been removed. Parsing behavior is now always the more forgivingposix=false.set_strip_quotesfunction andSTRIP_QUOTES_FOR_NON_POSIXhave been removed. Quotes are stripped from arguments when presented as a list (a lasys.argv), and present when arguments are presented as a string ( like the string passed to do_*).
- The object passed to do** methods has changed. It no longer is the pyparsing object, it's
a new Statement object, which is a subclass of
- Automatic completion of
- Changes
strip_ansi()andstrip_quotes()functions have moved to new utils module- Several constants moved to new constants module
- Submenu support has been moved to a new cmd2-submenu plugin. If you use submenus, you will need to update your dependencies and modify your imports.
- Deletions (potentially breaking changes)
- Deleted all
optparsecode which had previously been deprecated in release 0.8.0- The
optionsdecorator no longer exists - All
cmd2code should be ported to use the newargparse-based decorators - See the Argument Processing section of the documentation for more information on these decorators
- Alternatively, see the argparse_example.py
- The
- Deleted
cmd_with_subs_completer,get_subcommands, andget_subcommand_completer- Replaced by default AutoCompleter implementation for all commands using argparse
- Deleted support for old method of calling application commands with
cmd()andself cmd2.redirectoris no longer supported. Output redirection can only be done with '>' or '>>'- Deleted
postparse()hook since it was redundant withpostparsing_precmd
- Deleted all
- Python 2 no longer supported
cmd2now supports Python 3.4+
- Known Issues
- Some developers have noted very slow performance when importing the
cmd2module. The issue it intermittent, and investigation of the root cause is ongoing.
- Some developers have noted very slow performance when importing the
- Bug Fixes
- Commands using the @with_argparser_and_unknown_args were not correctly recognized when tab completing
- Fixed issue where completion display function was overwritten when a submenu quits
- Fixed
AttributeErroron Windows when running aselectcommand cause by pyreadline not implementingremove_history_item
- Enhancements
- Added warning about libedit variant of readline not being supported on macOS
- Added tab completion of alias names in value field of alias command
- Enhanced the
pyconsole in the following ways- Added tab completion of Python identifiers instead of cmd2 commands
- Separated the
pyconsole history from the cmd2 history
-
Bug Fixes
- Fixed a bug with all argument decorators where the wrapped function wasn't returning a value and thus couldn't cause the cmd2 app to quit
-
Enhancements
- Added support for verbose help with -v where it lists a brief summary of what each command does
- Added support for categorizing commands into groups within the help menu
- See the Grouping Commands section of the docs for more info
- See help_categories.py for an example
- Tab completion of paths now supports ~user user path expansion
- Simplified implementation of various tab completion functions so they no longer require
ctypes - Expanded documentation of
display_matcheslist to clarify its purpose. See cmd2.py for this documentation. - Adding opening quote to tab completion if any of the completion suggestions have a space.
-
Python 2 EOL notice
- This is the last release where new features will be added to
cmd2for Python 2.7 - The 0.9.0 release of
cmd2will support Python 3.4+ only - Additional 0.8.x releases may be created to supply bug fixes for Python 2.7 up until August 31, 2018
- After August 31, 2018 not even bug fixes will be provided for Python 2.7
- This is the last release where new features will be added to
- Bug Fixes
- Fixed conditional dependency issue in setup.py that was in 0.8.3.
-
Bug Fixes
- Fixed
helpcommand not calling functions for help topics - Fixed not being able to use quoted paths when redirecting with
<and>
- Fixed
-
Enhancements
- Tab completion has been overhauled and now supports completion of strings with quotes and spaces.
- Tab completion will automatically add an opening quote if a string with a space is completed.
- Added
delimiter_completefunction for tab completing delimited strings - Added more control over tab completion behavior including the following flags. The use of
these flags is documented in cmd2.py
allow_appended_spaceallow_closing_quote
- Due to the tab completion changes, non-Windows platforms now depend on wcwidth.
- An alias name can now match a command name.
- An alias can now resolve to another alias.
-
Attribute Changes (Breaks backward compatibility)
exclude_from_helpis now calledhidden_commandssince these commands are hidden from things other than help, including tab completion- This list also no longer takes the function names of commands (
do_history), but instead uses the command names themselves (history)
- This list also no longer takes the function names of commands (
excludeFromHistoryis now calledexclude_from_historycmd_with_subs_completer()no longer takes an argument calledbase. Adding tab completion to subcommands has been simplified to declaring it in the subcommand parser's default settings. This easily allows arbitrary completers like path_complete to be used. See subcommands.py for an example of how to use tab completion in subcommands. In addition, the docstring forcmd_with_subs_completer()offers more details.
- Bug Fixes
- Fixed a bug in tab completion of command names within sub-menus
- Fixed a bug when using persistent readline history in Python 2.7
- Fixed a bug where the
AddSubmenudecorator didn't work with a default value forshared_attributes - Added a check to
ppaged()to only use a pager when running in a real fully functional terminal
- Enhancements
- Added quit_on_sigint attribute to enable canceling current line instead of quitting when Ctrl+C is typed
- Added possibility of having readline history preservation in a SubMenu
- Added table_display.py example to demonstrate how to display tabular data
- Added command aliasing with
aliasandunaliascommands - Added the ability to load an initialization script at startup
- See alias_startup.py for an example
- Added a default SIGINT handler which terminates any open pipe subprocesses and re-raises a KeyboardInterrupt
- For macOS, will load the
gnureadlinemodule if available andreadlineif not
- Bug Fixes
- Fixed a bug if a non-existent do_* method was added to the
exclude_from_helplist - Fixed a bug in a unit test which would fail if your home directory was empty on a Linux system
- Fixed outdated help text for the edit command
- Fixed outdated remove_unused.py
- Fixed a bug if a non-existent do_* method was added to the
- Enhancements
- Added support for sub-menus.
- See submenus.py for an example of how to use it
- Added option for persistent readline history
- See persistent_history.py for an example
- See the Searchable command history section of the documentation for more info
- Improved PyPI packaging by including unit tests and examples in the tarball
- Improved documentation to make it more obvious that poutput() should be used instead of print()
exclude_from_helpandexcludeFromHistoryare now instance instead of class attributes- Added flag and index based tab completion helper functions
- Added support for displaying output which won't fit on the screen via a pager using
ppaged()- See paged_output.py
- Added support for sub-menus.
- Attributes Removed (can cause breaking changes)
abbrev- Removed support for abbreviated commands- Good tab completion makes this unnecessary and its presence could cause harmful unintended actions
case_insensitive- Removed support for case-insensitive command parsing- Its presence wasn't very helpful and could cause harmful unintended actions
- Bug Fixes
- Fixed unit tests on Python 3.7 due to changes in how re.escape() behaves in Python 3.7
- Fixed a bug where unknown commands were getting saved in the history
- Enhancements
- Three new decorators for do_* commands to make argument parsing easier
- with_argument_list decorator to change argument type from str to List[str]
- do_* commands get a single argument which is a list of strings, as pre-parsed by shlex.split()
- with_arparser decorator for strict argparse-based argument parsing of command
arguments
- do_* commands get a single argument which is the output of argparse.parse_args()
- with_argparser_and_unknown_args decorator for argparse-based argument parsing, but
allows unknown args
- do_* commands get two arguments, the output of argparse.parse_known_args()
- with_argument_list decorator to change argument type from str to List[str]
- See the Argument Processing
section of the documentation for more information on these decorators
- Alternatively, see the argparse_example.py and arg_print.py examples
- Added support for Argparse subcommands when using the with_argument_parser or *
*with_argparser_and_unknown_args** decorators
- See subcommands.py for an example of how to use subcommands
- Tab completion of subcommand names is automatically supported
- The __relative_load command is now hidden from the help menu by default
- This command is not intended to be called from the command line, only from within scripts
- The set command now has an additional -a/--all option to also display read-only settings
- The history command can now run, edit, and save prior commands, in addition to displaying prior commands.
- The history command can now automatically generate a transcript file for regression
testing
- This makes creating regression tests for your
cmd2application trivial
- This makes creating regression tests for your
- Three new decorators for do_* commands to make argument parsing easier
- Commands Removed
- The cmdenvironment has been removed and its functionality incorporated into the -a/--all argument to **set **
- The show command has been removed. Its functionality has always existing within set and continues to do so
- The save command has been removed. The capability to save commands is now part of the history command.
- The run command has been removed. The capability to run prior commands is now part of the history command.
- Other changes
- The edit command no longer allows you to edit prior commands. The capability to edit prior commands is now part of the history command. The edit command still allows you to edit arbitrary files.
- the autorun_on_edit setting has been removed.
- For Python 3.4 and earlier,
cmd2now has an additional dependency on thecontextlib2module
- Deprecations
- The old options decorator for optparse-based argument parsing is now deprecated
- The old decorator is still present for now, but will be removed in a future release
cmd2no longer includes optparse.make_option, so if your app needs it import directly from optparse
- The old options decorator for optparse-based argument parsing is now deprecated
- Bug Fixes
- Fixed a couple broken examples
- Enhancements
- Improved documentation for modifying shortcuts (command aliases)
- Made
pyreadlinea dependency on Windows to ensure tab completion works
- Other changes
- Abandoned official support for Python 3.3. It should still work, just don't have an easy way to test it anymore.
- Bug Fixes
- Fixed
poutput()so it can print an integer zero and other falsy things - Fixed a bug which was causing autodoc to fail for building docs on Readthedocs
- Fixed bug due to
pyperclipdependency radically changing its project structure in latest version
- Fixed
- Enhancements
- Improved documentation for user-settable environment parameters
- Improved documentation for overriding the default supported comment styles
- Added
runcmds_plus_hooks()method to run multiple commands w/o a cmdloop
- Bug Fixes
- Added workaround for bug which occurs in Python 2.7 on Linux when
pygtkis installed pfeedback()now honors feedback_to_output setting and won't redirect when it isFalse- For
editcommand, both editor and filename can now have spaces in the name/path - Fixed a bug which occurred when stdin was a pipe instead of a tty due to input redirection
- Added workaround for bug which occurs in Python 2.7 on Linux when
- Enhancements
feedback_to_outputnow defaults toFalseso info like command timing won't redirect- Transcript regular expressions now have predictable, tested, and documented behavior
- This makes a breaking change to the format and expectations of transcript testing
- The prior behavior removed whitespace before making the comparison, now whitespace must match exactly
- Prior version did not allow regexes with whitespace, new version allows any regex
- Improved display for
loadcommand and input redirection when echo isTrue
- Bug Fixes
- Case-sensitive command parsing was completely broken and has been fixed
<Ctrl>+dnow properly quits when case-sensitive command parsing is enabled- Fixed some pyperclip clipboard interaction bugs on Linux
- Fixed some timing bugs when running unit tests in parallel by using monkeypatch
- Enhancements
- Enhanced tab completion of cmd2 command names to support case-insensitive completion
- Added an example showing how to remove unused commands
- Improved how transcript testing handles prompts with ANSI escape codes by stripping them
- Greatly improved implementation for how command output gets piped to a shell command
- Bug Fixes
case_insensitiveis no longer a runtime-settable parameter, but it was still listed as such- Fixed a recursive loop bug when abbreviated commands are enabled and it could get stuck in the
editor forever
- Added additional command abbreviations to the "exclude from history" list
- Fixed argparse_example.py and pirate.py examples and transcript_regex.txt transcript
- Fixed a bug in a unit test which occurred under unusual circumstances
- Enhancements
- Organized all attributes used to configure the ParserManager into a single location
- Set the default value of
abbrevtoFalse(which controls whether or not abbreviated commands are allowed)- With good tab completion of command names, using abbreviated commands isn't particularly useful
- And it can create complications if you are't careful
- Improved implementation of
loadto use command queue instead of nested inner loop
- Bug fixes
- Fixed a couple bugs in interacting with pastebuffer/clipboard on macOS and Linux
- Fixed a couple bugs in edit and save commands if called when history is empty
- Ability to pipe
cmd2command output to a shell command is now more reliable, particularly on Windows - Fixed a bug in
pyscriptcommand on Windows related to\being interpreted as an escape
- Enhancements
- Ensure that path and shell command tab completion results are alphabetically sorted
- Removed feature for load command to load scripts from URLS
- It didn't work, there were no unit tests, and it felt out of place
- Removed presence of a default file name and default file extension
- These also strongly felt out of place
loadand_relative_loadnow require a file patheditandsavenow use a temporary file if a file path isn't provided
loadcommand has better error checking and reporting- Clipboard copy and paste functionality is now handled by the pyperclip module
shellcommand now supports redirection and piping of output- Added a lot of unit tests
- Other changes
- Removed pause command
- Added a dependency on the pyperclip module
- Bug fixes
- Fixed a bug in displaying a span of history items when only an end index is supplied
- Fixed a bug which caused transcript test failures to display twice
- Enhancements
- Added the ability to exclude commands from the help menu (eof included by default)
- Redundant list command removed and features merged into history command
- Added pyscript command which supports tab completion and running Python scripts with arguments
- Improved tab completion of file system paths, command names, and shell commands
- Thanks to Kevin Van Brunt for all of the help with debugging and testing this
- Changed default value of USE_ARG_LIST to True - this affects the beavhior of all @options
commands
- WARNING: This breaks backwards compatibility, to restore backwards compatibility, add
this to the ** **init**()** method in your custom class derived from cmd2.Cmd:
- cmd2.set_use_arg_list(False)
- This change improves argument parsing for all new applications
- WARNING: This breaks backwards compatibility, to restore backwards compatibility, add
this to the ** **init**()** method in your custom class derived from cmd2.Cmd:
- Refactored code to encapsulate most of the pyparsing logic into a ParserManager class
- Added a MANIFEST.ini file to make sure a few extra files get included in the PyPI source distribution
- Bug fixes
-wasn't being treated as a legal character- The allow_cli_args attribute wasn't properly disabling parsing of args at invocation when False
- py command wasn't allowing scripts which used cmd function prior to entering an interactive Python session
- Don't throw exception when piping output to a shell command
- Transcript testing now properly calls
preloopbefore andpostloopafter - Fixed readline bug related to ANSI color escape codes in the prompt
- Added CONTRIBUTING.md and CODE_OF_CONDUCT.md files
- Added unicode parsing unit tests and listed unicode support as a feature when using Python 3
- Added more examples and improved documentation
- Example for how use cmd2 in a way where it doesn't own the main loop so it can integrate with external event loops
- Example for how to use argparse for parsing command-line args at invocation
- Example for how to use the py command to run Python scripts which use conditional control flow
- Example of how to use regular expressions in a transcript test
- Added CmdResult namedtumple for returning and storing results
- Added local file system path completion for
edit,load,save, andshellcommands - Add shell command completion for
shellcommand or!shortcut - Abbreviated multiline commands are no longer allowed (they never worked correctly anyways)
- Refactored to use six module for a unified codebase which supports both Python 2 and Python 3
- Stabilized on all platforms (Windows, Mac, Linux) and all supported Python versions (2.7, 3.3, 3.4, 3.5, 3.6, PyPy)
- Added lots of unit tests and fixed a number of bugs
- Improved documentation and moved it to cmd2.readthedocs.io
- Support Python 3 input()
- Fix subprocess.mswindows bug
- Add Python3.6 support
- Drop distutils from setup.py
- better editor checking (by Ian Cordascu)
- No changes to code trunk. Generated sdist from Python 2.7 to avoid 2to3 changes being applied to source. ( Issue https://bitbucket.org/catherinedevlin/cmd2/issue/6/packaging-bug)
- Added fix by bitbucket.org/desaintmartin to silence the editor check. bitbucket.org/catherinedevlin/cmd2/issue/1/silent-editor-check
- Bugfix for setup.py version check for Python 2.6, contributed by Tomaz Muraus (https://bitbucket.org/kami)
- Belatedly began a NEWS.txt
- Changed pyparsing requirement for compatibility with Python version (2 vs 3)