- Bug Fixes
- Fixed a bug in how redirection and piping worked inside
py
orpyscript
commands - Fixed bug in
async_alert
where 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. Theses messages can
also be colored.
help_error
- the error that prints when no help information can be founddefault_error
- the error that prints when a non-existent command is run
- The
with_argparser
decorators now add the Statement object created when parsing the command line to theargparse.Namespace
object 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
-t
option to theload
command 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
CommandResult
structure.
- 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 founddefault()
- 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.Cmd
class so that all class attributes got converted to instance attributes, also:- Added
allow_redirection
,terminators
,multiline_commands
, andshortcuts
as optional arguments to ``cmd.Cmd.init()` - A few instance attributes were moved inside
StatementParser
and properties were created for accessing them
- Added
self.pipe_proc
is now calledself.cur_pipe_proc_reader
and is aProcReader
class.- 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.
- 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_list
decorator is called with the optionalpreserve_quotes
argument - 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_key
to override the default way tab completion matches are sorted - Added
StdSim.pause_storage
member which when True will causeStdSim
to not save the output sent to it. See documentation forCommandResult
inpyscript_bridge.py
for 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_app
a positional and required argument ofAutoCompleter
since certain functionality now requires that it can't beNone
. AutoCompleter
no longer assumesCompletionItem
results are sorted. Therefore you should follow thecmd2
convention of settingself.matches_sorted
to True before returning the results if you have already sorted theCompletionItem
list. Otherwise it will be sorted usingself.matches_sort_key
.- Removed support for bash completion since this feature had slow performance. Also it relied on
AutoCompleter
which has since developed a dependency oncmd2
methods. - Removed ability to call commands in
pyscript
as if they were functions (e.gapp.help()
) in favor of only supporting onepyscript
interface. 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
set
command was not tab completing from the currentsettable
dictionary.
- 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_echo
always 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_shell
being 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._colorcodes
which were deprecated in 0.9.5 - Replaced
dir_exe_only
anddir_only
flags inpath_complete
with optionalpath_filter
function 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.prompt
inpseudo_raw_input
. As part of this fix, continuation prompts will not be redrawn withasync_update_prompt
orasync_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
py
now go throughonecmd_plus_hooks
.
- Bug Fixes
- Fixed bug where
get_all_commands
could 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_code
attribute ofcmd2.Cmd
class- 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
ACHelpFormatter
now inherits fromargparse.RawTextHelpFormatter
to 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_title
functions- These allow you to provide feedback to the user in an asychronous 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
colorama
gets initialized properly inCmd.__init()
- The
Cmd.colors
setting 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
macro
command 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
cmd2
support for colors includingCmd.colorize()
andCmd._colorcodes
- Deprecated the built-in
- Deletions (potentially breaking changes)
- The
preparse
,postparsing_precmd
, andpostparsing_postcmd
methods 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
alias
is now a command with sub-commands 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.unalias
was deleted sincealias delete
replaced it
- The
- Bug Fixes
- Fixed bug where
preparse
was 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.rst
for details. - New dependency on
attrs
third party module - Added
matches_sorted
member 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.rst
for 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 withterminators
equal toNone
- Fixed bug when
Cmd.onecmd()
was called with a rawstr
- Fixed bug when StatementParser
- Enhancements
- Added
--clear
flag tohistory
command that clears both the command and readline history.
- Added
- Deletions
- The
CmdResult
helper class which was deprecated in the previous release has now been deleted- It has been replaced by the improved
CommandResult
class
- 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_header
member - Added
pager
andpager_chop
attributes to thecmd2.Cmd
classpager
defaults to less -RXF on POSIX and more on Windowspager_chop
defaults to less -SRXF on POSIX and more on Windows
- Added
chop
argument tocmd2.Cmd.ppaged()
method for displaying output using a pager- If
chop
isFalse
, thenself.pager
is used as the pager - Otherwise
self.pager_chop
is 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
CmdResult
helper class is deprecated and replaced by the improvedCommandResult
classCommandResult
has the following attributes: stdout, stderr, and dataCmdResult
had attributes of: out, err, war
CmdResult
will 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_matches
is 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
argparse
arguments viacmd2.argparse_completer.AutoCompleter
- See the tab_autocompletion.py example for a demonstration of how to use this feature
cmd2
no longer depends on thesix
modulecmd2
is 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. commentGrammers
is no longer supported or available. Comments are C-style or python style.- Input redirection no longer supported. Use the load command instead.
multilineCommand
attribute isnow multiline_command
identchars
is 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_shlex
function andPOSIX_SHLEX
variable have been removed. Parsing behavior is now always the more forgivingposix=false
.set_strip_quotes
function andSTRIP_QUOTES_FOR_NON_POSIX
have 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
optparse
code which had previously been deprecated in release 0.8.0- The
options
decorator no longer exists - All
cmd2
code 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.redirector
is 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
cmd2
now supports Python 3.4+
- Known Issues
- Some developers have noted very slow performance when importing the
cmd2
module. The issue it intermittant, 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
AttributeError
on Windows when running aselect
command 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
py
console in the following ways- Added tab completion of Python identifiers instead of cmd2 commands
- Separated the
py
console 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_matches
list 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
cmd2
for Python 2.7 - The 0.9.0 release of
cmd2
will 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
help
command 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_complete
function 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_space
allow_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_help
is now calledhidden_commands
since 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 (
excludeFromHistory
is now calledexclude_from_history
cmd_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
AddSubmenu
decorator 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
alias
andunalias
commands - 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
gnureadline
module if available andreadline
if not
- Bug Fixes
- Fixed a bug if a non-existent do_* method was added to the
exclude_from_help
list - 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_help
andexcludeFromHistory
are 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 sub-commands 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 sub-command 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
cmd2
application 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,
cmd2
now has an additional dependency on thecontextlib2
module
- 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
cmd2
no 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
pyreadline
a 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
pyperclip
dependency 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
pygtk
is installed pfeedback()
now honors feedback_to_output setting and won't redirect when it isFalse
- For
edit
command, 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_output
now defaults toFalse
so 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
load
command and input redirection when echo isTrue
- Bug Fixes
- Case-sensitive command parsing was completely broken and has been fixed
<Ctrl>+d
now 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_insensitive
is 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
abbrev
toFalse
(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
load
to 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
cmd2
command output to a shell command is now more reliable, particularly on Windows - Fixed a bug in
pyscript
command 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
load
and_relative_load
now require a file pathedit
andsave
now use a temporary file if a file path isn't provided
load
command has better error checking and reporting- Clipboard copy and paste functionality is now handled by the pyperclip module
shell
command 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
preloop
before andpostloop
after - 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
, andshell
commands - Add shell command completion for
shell
command 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)