diff --git a/CHANGELOG.md b/CHANGELOG.md
index cb81ab17..6d91aaca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-## 0.10.1 (TBD)
+## 0.10.1 (February TBD, 2020)
 * 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.
@@ -19,6 +19,7 @@
 * Other
     * Removed undocumented `py run` command since it was replaced by `run_pyscript` a while ago
     * Renamed `AutoCompleter` to `ArgparseCompleter` for clarity
+    * Custom `EmptyStatement` exception is no longer part of the documented public API
 
 ## 0.10.0 (February 7, 2020)
 * Enhancements
diff --git a/cmd2/__init__.py b/cmd2/__init__.py
index 73d70821..63e27812 100644
--- a/cmd2/__init__.py
+++ b/cmd2/__init__.py
@@ -22,7 +22,7 @@ if cmd2_parser_module is not None:
 
 # Get the current value for argparse_custom.DEFAULT_ARGUMENT_PARSER
 from .argparse_custom import DEFAULT_ARGUMENT_PARSER
-from .cmd2 import Cmd, EmptyStatement
+from .cmd2 import Cmd
 from .constants import COMMAND_NAME, DEFAULT_SHORTCUTS
 from .decorators import categorize, with_argument_list, with_argparser, with_argparser_and_unknown_args, with_category
 from .parsing import Statement
diff --git a/cmd2/cmd2.py b/cmd2/cmd2.py
index 0bb4921e..7b88eaf8 100644
--- a/cmd2/cmd2.py
+++ b/cmd2/cmd2.py
@@ -50,6 +50,7 @@ from . import utils
 from .argparse_custom import CompletionItem, DEFAULT_ARGUMENT_PARSER
 from .clipboard import can_clip, get_paste_buffer, write_to_paste_buffer
 from .decorators import with_argparser
+from .exceptions import EmbeddedConsoleExit, EmptyStatement
 from .history import History, HistoryItem
 from .parsing import StatementParser, Statement, Macro, MacroArg, shlex_split
 from .rl_utils import rl_type, RlType, rl_get_point, rl_set_prompt, vt100_support, rl_make_safe_prompt, rl_warning
@@ -106,16 +107,6 @@ class _SavedCmd2Env:
         self.sys_stdin = None
 
 
-class EmbeddedConsoleExit(SystemExit):
-    """Custom exception class for use with the py command."""
-    pass
-
-
-class EmptyStatement(Exception):
-    """Custom exception class for handling behavior when the user just presses <Enter>."""
-    pass
-
-
 # Contains data about a disabled command which is used to restore its original functions when the command is enabled
 DisabledCommand = namedtuple('DisabledCommand', ['command_function', 'help_function', 'completer_function'])
 
diff --git a/cmd2/exceptions.py b/cmd2/exceptions.py
new file mode 100644
index 00000000..747e2368
--- /dev/null
+++ b/cmd2/exceptions.py
@@ -0,0 +1,12 @@
+# coding=utf-8
+"""Custom exceptions for cmd2.  These are NOT part of the public API and are intended for internal use only."""
+
+
+class EmbeddedConsoleExit(SystemExit):
+    """Custom exception class for use with the py command."""
+    pass
+
+
+class EmptyStatement(Exception):
+    """Custom exception class for handling behavior when the user just presses <Enter>."""
+    pass
diff --git a/docs/api/exceptions.rst b/docs/api/exceptions.rst
deleted file mode 100644
index 400993aa..00000000
--- a/docs/api/exceptions.rst
+++ /dev/null
@@ -1,4 +0,0 @@
-Exceptions
-==========
-
-.. autoexception:: cmd2.EmptyStatement
diff --git a/docs/api/index.rst b/docs/api/index.rst
index f0324eab..346fc274 100644
--- a/docs/api/index.rst
+++ b/docs/api/index.rst
@@ -6,7 +6,6 @@ API Reference
 
    cmd
    decorators
-   exceptions
    ansi
    utility_classes
    utility_functions
diff --git a/docs/features/hooks.rst b/docs/features/hooks.rst
index ee1d5fbc..ba9af573 100644
--- a/docs/features/hooks.rst
+++ b/docs/features/hooks.rst
@@ -102,12 +102,7 @@ called each time it was registered.
 Postparsing, precommand, and postcommand hook methods share some common ways to
 influence the command processing loop.
 
-If a hook raises a ``cmd2.EmptyStatement`` exception:
-- no more hooks (except command finalization hooks) of any kind will be called
-- if the command has not yet been executed, it will not be executed
-- no error message will be displayed to the user
-
-If a hook raises any other exception:
+If a hook raises an exception:
 - no more hooks (except command finalization hooks) of any kind will be called
 - if the command has not yet been executed, it will not be executed
 - the exception message will be displayed for the user.

diff --git a/tests/test_cmd2.py b/tests/test_cmd2.py
index dc9a3fa1..2db52d39 100755
--- a/tests/test_cmd2.py
+++ b/tests/test_cmd2.py
@@ -20,7 +20,7 @@ except ImportError:
     from unittest import mock
 
 import cmd2
-from cmd2 import ansi, clipboard, constants, plugin, utils, COMMAND_NAME
+from cmd2 import ansi, clipboard, constants, exceptions, plugin, utils, COMMAND_NAME
 from .conftest import (run_cmd, normalize, verify_help_text, HELP_HISTORY, SHORTCUTS_TXT, SHOW_TXT,
                        SHOW_LONG, complete_tester, odd_file_names)
 
@@ -1258,7 +1258,7 @@ def multiline_app():
     return app
 
 def test_multiline_complete_empty_statement_raises_exception(multiline_app):
-    with pytest.raises(cmd2.EmptyStatement):
+    with pytest.raises(exceptions.EmptyStatement):
         multiline_app._complete_statement('')
 
 def test_multiline_complete_statement_without_terminator(multiline_app):
diff --git a/tests/test_parsing.py b/tests/test_parsing.py
index 2114bfaa..435f22eb 100755
--- a/tests/test_parsing.py
+++ b/tests/test_parsing.py
@@ -7,7 +7,7 @@ import attr
 import pytest
 
 import cmd2
-from cmd2 import constants, utils
+from cmd2 import constants, exceptions, utils
 from cmd2.parsing import StatementParser, shlex_split
 
 @pytest.fixture
@@ -588,10 +588,10 @@ def test_parse_unclosed_quotes(parser):
 
 def test_empty_statement_raises_exception():
     app = cmd2.Cmd()
-    with pytest.raises(cmd2.EmptyStatement):
+    with pytest.raises(exceptions.EmptyStatement):
         app._complete_statement('')
 
-    with pytest.raises(cmd2.EmptyStatement):
+    with pytest.raises(exceptions.EmptyStatement):
         app._complete_statement(' ')
 
 @pytest.mark.parametrize('line,command,args', [
diff --git a/tests/test_plugin.py b/tests/test_plugin.py
index f7065db5..c118b60d 100644
--- a/tests/test_plugin.py
+++ b/tests/test_plugin.py
@@ -14,7 +14,7 @@ except ImportError:
     from unittest import mock
 
 import cmd2
-from cmd2 import plugin
+from cmd2 import exceptions, plugin
 
 
 class Plugin:
@@ -81,7 +81,7 @@ class Plugin:
     def postparse_hook_emptystatement(self, data: cmd2.plugin.PostparsingData) -> cmd2.plugin.PostparsingData:
         """A postparsing hook with raises an EmptyStatement exception"""
         self.called_postparsing += 1
-        raise cmd2.EmptyStatement
+        raise exceptions.EmptyStatement
 
     def postparse_hook_exception(self, data: cmd2.plugin.PostparsingData) -> cmd2.plugin.PostparsingData:
         """A postparsing hook which raises an exception"""
@@ -126,7 +126,7 @@ class Plugin:
     def precmd_hook_emptystatement(self, data: plugin.PrecommandData) -> plugin.PrecommandData:
         """A precommand hook which raises an EmptyStatement exception"""
         self.called_precmd += 1
-        raise cmd2.EmptyStatement
+        raise exceptions.EmptyStatement
 
     def precmd_hook_exception(self, data: plugin.PrecommandData) -> plugin.PrecommandData:
         """A precommand hook which raises an exception"""

Re-evaluate visibility of EmptyStatement exception
In `cmd2.py` we define an `EmptyStatement` exception. In `__init__.py` we import that exception, making it available as `cmd2.EmptyStatement`. As far as I can tell, we only use this exception for internal purposes: no methods available as part of our public API throw this exception.

If this is true, then it seem like:

1. We shouldn't document `EmptyStatement` as part of our public API, and
2. We should remove the package level import of `EmptyStatement` from `__init__.py`.

What do you think?
tests/test_cmd2.py::test_version tests/test_cmd2.py::test_empty_statement tests/test_cmd2.py::test_base_help tests/test_cmd2.py::test_base_help_verbose tests/test_cmd2.py::test_base_argparse_help tests/test_cmd2.py::test_base_invalid_option tests/test_cmd2.py::test_base_shortcuts tests/test_cmd2.py::test_command_starts_with_shortcut tests/test_cmd2.py::test_base_show tests/test_cmd2.py::test_base_show_long tests/test_cmd2.py::test_set tests/test_cmd2.py::test_set_val_empty tests/test_cmd2.py::test_set_val_is_flag tests/test_cmd2.py::test_set_not_supported tests/test_cmd2.py::test_set_no_settables tests/test_cmd2.py::test_set_allow_style[Never-True-Never] tests/test_cmd2.py::test_set_allow_style[neVeR-True-Never] tests/test_cmd2.py::test_set_allow_style[Terminal-True-Terminal] tests/test_cmd2.py::test_set_allow_style[TeRMInal-True-Terminal] tests/test_cmd2.py::test_set_allow_style[Always-True-Always] tests/test_cmd2.py::test_set_allow_style[AlWaYs-True-Always] tests/test_cmd2.py::test_set_allow_style[invalid-False-Terminal] tests/test_cmd2.py::test_set_onchange_hook tests/test_cmd2.py::test_base_shell tests/test_cmd2.py::test_base_py tests/test_cmd2.py::test_base_error tests/test_cmd2.py::test_run_script tests/test_cmd2.py::test_run_script_with_empty_args tests/test_cmd2.py::test_run_script_with_nonexistent_file tests/test_cmd2.py::test_run_script_with_directory tests/test_cmd2.py::test_run_script_with_empty_file tests/test_cmd2.py::test_run_script_with_binary_file tests/test_cmd2.py::test_run_script_with_python_file tests/test_cmd2.py::test_run_script_with_utf8_file tests/test_cmd2.py::test_run_script_nested_run_scripts tests/test_cmd2.py::test_runcmds_plus_hooks tests/test_cmd2.py::test_relative_run_script tests/test_cmd2.py::test_relative_run_script_with_odd_file_names[nothingweird] tests/test_cmd2.py::test_relative_run_script_with_odd_file_names[has tests/test_cmd2.py::test_relative_run_script_with_odd_file_names["is_double_quoted"] tests/test_cmd2.py::test_relative_run_script_with_odd_file_names['is_single_quoted'] tests/test_cmd2.py::test_relative_run_script_requires_an_argument tests/test_cmd2.py::test_in_script tests/test_cmd2.py::test_output_redirection tests/test_cmd2.py::test_output_redirection_to_nonexistent_directory tests/test_cmd2.py::test_output_redirection_to_too_long_filename tests/test_cmd2.py::test_feedback_to_output_true tests/test_cmd2.py::test_feedback_to_output_false tests/test_cmd2.py::test_disallow_redirection tests/test_cmd2.py::test_pipe_to_shell tests/test_cmd2.py::test_pipe_to_shell_and_redirect tests/test_cmd2.py::test_pipe_to_shell_error tests/test_cmd2.py::test_base_timing tests/test_cmd2.py::test_base_debug tests/test_cmd2.py::test_debug_not_settable tests/test_cmd2.py::test_remove_settable_keyerror tests/test_cmd2.py::test_edit_file tests/test_cmd2.py::test_edit_file_with_odd_file_names[nothingweird] tests/test_cmd2.py::test_edit_file_with_odd_file_names[has tests/test_cmd2.py::test_edit_file_with_odd_file_names["is_double_quoted"] tests/test_cmd2.py::test_edit_file_with_odd_file_names['is_single_quoted'] tests/test_cmd2.py::test_edit_file_with_spaces tests/test_cmd2.py::test_edit_blank tests/test_cmd2.py::test_base_py_interactive tests/test_cmd2.py::test_base_cmdloop_with_startup_commands tests/test_cmd2.py::test_base_cmdloop_without_startup_commands tests/test_cmd2.py::test_cmdloop_without_rawinput tests/test_cmd2.py::test_stty_sane tests/test_cmd2.py::test_precmd_hook_success tests/test_cmd2.py::test_precmd_hook_failure tests/test_cmd2.py::test_interrupt_quit tests/test_cmd2.py::test_interrupt_noquit tests/test_cmd2.py::test_default_to_shell tests/test_cmd2.py::test_ansi_prompt_not_esacped tests/test_cmd2.py::test_ansi_prompt_escaped tests/test_cmd2.py::test_custom_command_help tests/test_cmd2.py::test_custom_help_menu tests/test_cmd2.py::test_help_undocumented tests/test_cmd2.py::test_help_overridden_method tests/test_cmd2.py::test_help_cat_base tests/test_cmd2.py::test_help_cat_verbose tests/test_cmd2.py::test_select_options tests/test_cmd2.py::test_select_invalid_option_too_big tests/test_cmd2.py::test_select_invalid_option_too_small tests/test_cmd2.py::test_select_list_of_strings tests/test_cmd2.py::test_select_list_of_tuples tests/test_cmd2.py::test_select_uneven_list_of_tuples tests/test_cmd2.py::test_select_eof tests/test_cmd2.py::test_select_ctrl_c tests/test_cmd2.py::test_help_with_no_docstring tests/test_cmd2.py::test_which_editor_good tests/test_cmd2.py::test_which_editor_bad tests/test_cmd2.py::test_multiline_complete_empty_statement_raises_exception tests/test_cmd2.py::test_multiline_complete_statement_without_terminator tests/test_cmd2.py::test_multiline_complete_statement_with_unclosed_quotes tests/test_cmd2.py::test_multiline_input_line_to_statement tests/test_cmd2.py::test_clipboard_failure tests/test_cmd2.py::test_commandresult_truthy tests/test_cmd2.py::test_commandresult_falsy tests/test_cmd2.py::test_is_text_file_bad_input tests/test_cmd2.py::test_eof tests/test_cmd2.py::test_echo tests/test_cmd2.py::test_read_input_rawinput_true tests/test_cmd2.py::test_read_input_rawinput_false tests/test_cmd2.py::test_read_command_line_eof tests/test_cmd2.py::test_poutput_string tests/test_cmd2.py::test_poutput_zero tests/test_cmd2.py::test_poutput_empty_string tests/test_cmd2.py::test_poutput_none tests/test_cmd2.py::test_poutput_ansi_always tests/test_cmd2.py::test_poutput_ansi_never tests/test_cmd2.py::test_get_alias_completion_items tests/test_cmd2.py::test_get_macro_completion_items tests/test_cmd2.py::test_get_settable_completion_items tests/test_cmd2.py::test_alias_no_subcommand tests/test_cmd2.py::test_alias_create tests/test_cmd2.py::test_alias_create_with_quoted_value tests/test_cmd2.py::test_alias_create_invalid_name[""] tests/test_cmd2.py::test_alias_create_invalid_name[#] tests/test_cmd2.py::test_alias_create_invalid_name[!no_shortcut] tests/test_cmd2.py::test_alias_create_invalid_name[">"] tests/test_cmd2.py::test_alias_create_invalid_name["no>pe"] tests/test_cmd2.py::test_alias_create_invalid_name["no tests/test_cmd2.py::test_alias_create_invalid_name["nopipe|"] tests/test_cmd2.py::test_alias_create_invalid_name["noterm;"] tests/test_cmd2.py::test_alias_create_invalid_name[noembedded"quotes] tests/test_cmd2.py::test_alias_create_with_command_name tests/test_cmd2.py::test_alias_create_with_macro_name tests/test_cmd2.py::test_alias_that_resolves_into_comment tests/test_cmd2.py::test_alias_list_invalid_alias tests/test_cmd2.py::test_alias_delete tests/test_cmd2.py::test_alias_delete_all tests/test_cmd2.py::test_alias_delete_non_existing tests/test_cmd2.py::test_alias_delete_no_name tests/test_cmd2.py::test_multiple_aliases tests/test_cmd2.py::test_macro_no_subcommand tests/test_cmd2.py::test_macro_create tests/test_cmd2.py::test_macro_create_with_quoted_value tests/test_cmd2.py::test_macro_create_invalid_name[""] tests/test_cmd2.py::test_macro_create_invalid_name[#] tests/test_cmd2.py::test_macro_create_invalid_name[!no_shortcut] tests/test_cmd2.py::test_macro_create_invalid_name[">"] tests/test_cmd2.py::test_macro_create_invalid_name["no>pe"] tests/test_cmd2.py::test_macro_create_invalid_name["no tests/test_cmd2.py::test_macro_create_invalid_name["nopipe|"] tests/test_cmd2.py::test_macro_create_invalid_name["noterm;"] tests/test_cmd2.py::test_macro_create_invalid_name[noembedded"quotes] tests/test_cmd2.py::test_macro_create_with_command_name tests/test_cmd2.py::test_macro_create_with_alias_name tests/test_cmd2.py::test_macro_create_with_args tests/test_cmd2.py::test_macro_create_with_escaped_args tests/test_cmd2.py::test_macro_usage_with_missing_args tests/test_cmd2.py::test_macro_usage_with_exta_args tests/test_cmd2.py::test_macro_create_with_missing_arg_nums tests/test_cmd2.py::test_macro_create_with_invalid_arg_num tests/test_cmd2.py::test_macro_create_with_unicode_numbered_arg tests/test_cmd2.py::test_macro_create_with_missing_unicode_arg_nums tests/test_cmd2.py::test_macro_that_resolves_into_comment tests/test_cmd2.py::test_macro_list_invalid_macro tests/test_cmd2.py::test_macro_delete tests/test_cmd2.py::test_macro_delete_all tests/test_cmd2.py::test_macro_delete_non_existing tests/test_cmd2.py::test_macro_delete_no_name tests/test_cmd2.py::test_multiple_macros tests/test_cmd2.py::test_nonexistent_macro tests/test_cmd2.py::test_perror_style tests/test_cmd2.py::test_perror_no_style tests/test_cmd2.py::test_pwarning_style tests/test_cmd2.py::test_pwarning_no_style tests/test_cmd2.py::test_ppaged tests/test_cmd2.py::test_ppaged_blank tests/test_cmd2.py::test_ppaged_none tests/test_cmd2.py::test_ppaged_strips_ansi_when_redirecting tests/test_cmd2.py::test_ppaged_strips_ansi_when_redirecting_if_always tests/test_cmd2.py::test_parseline_empty tests/test_cmd2.py::test_parseline tests/test_cmd2.py::test_onecmd_raw_str_continue tests/test_cmd2.py::test_onecmd_raw_str_quit tests/test_cmd2.py::test_onecmd_add_to_history tests/test_cmd2.py::test_get_all_commands tests/test_cmd2.py::test_get_help_topics tests/test_cmd2.py::test_get_help_topics_hidden tests/test_cmd2.py::test_exit_code_default tests/test_cmd2.py::test_exit_code_nonzero tests/test_cmd2.py::test_ansi_pouterr_always_tty tests/test_cmd2.py::test_ansi_pouterr_always_notty tests/test_cmd2.py::test_ansi_terminal_tty tests/test_cmd2.py::test_ansi_terminal_notty tests/test_cmd2.py::test_ansi_never_tty tests/test_cmd2.py::test_ansi_never_notty tests/test_cmd2.py::test_disable_and_enable_category tests/test_cmd2.py::test_enable_enabled_command tests/test_cmd2.py::test_disable_fake_command tests/test_cmd2.py::test_disable_command_twice tests/test_cmd2.py::test_disabled_command_not_in_history tests/test_cmd2.py::test_disabled_message_command_name tests/test_cmd2.py::test_startup_script tests/test_cmd2.py::test_startup_script_with_odd_file_names[nothingweird] tests/test_cmd2.py::test_startup_script_with_odd_file_names[has tests/test_cmd2.py::test_startup_script_with_odd_file_names["is_double_quoted"] tests/test_cmd2.py::test_startup_script_with_odd_file_names['is_single_quoted'] tests/test_cmd2.py::test_transcripts_at_init tests/test_parsing.py::test_parse_empty_string tests/test_parsing.py::test_parse_empty_string_default tests/test_parsing.py::test_tokenize_default[command-tokens0] tests/test_parsing.py::test_tokenize_default[#comment-tokens1] tests/test_parsing.py::test_tokenize_default[not tests/test_parsing.py::test_tokenize_default[termbare tests/test_parsing.py::test_tokenize_default[termbare; tests/test_parsing.py::test_tokenize_default[termbare& tests/test_parsing.py::test_tokenize_default[help|less-tokens7] tests/test_parsing.py::test_tokenize[command-tokens0] tests/test_parsing.py::test_tokenize[# tests/test_parsing.py::test_tokenize[not tests/test_parsing.py::test_tokenize[42 tests/test_parsing.py::test_tokenize[l-tokens4] tests/test_parsing.py::test_tokenize[termbare tests/test_parsing.py::test_tokenize[termbare; tests/test_parsing.py::test_tokenize[termbare& tests/test_parsing.py::test_tokenize[help|less-tokens9] tests/test_parsing.py::test_tokenize[l|less-tokens10] tests/test_parsing.py::test_tokenize_unclosed_quotes tests/test_parsing.py::test_command_and_args[tokens0--] tests/test_parsing.py::test_command_and_args[tokens1-command-] tests/test_parsing.py::test_command_and_args[tokens2-command-arg1 tests/test_parsing.py::test_parse_single_word[plainword] tests/test_parsing.py::test_parse_single_word["one tests/test_parsing.py::test_parse_single_word['one tests/test_parsing.py::test_parse_word_plus_terminator[termbare;-;] tests/test_parsing.py::test_parse_word_plus_terminator[termbare tests/test_parsing.py::test_parse_word_plus_terminator[termbare&-&] tests/test_parsing.py::test_parse_suffix_after_terminator[termbare; tests/test_parsing.py::test_parse_suffix_after_terminator[termbare tests/test_parsing.py::test_parse_suffix_after_terminator[termbare& tests/test_parsing.py::test_parse_command_with_args tests/test_parsing.py::test_parse_command_with_quoted_args tests/test_parsing.py::test_parse_command_with_args_terminator_and_suffix tests/test_parsing.py::test_parse_comment tests/test_parsing.py::test_parse_embedded_comment_char tests/test_parsing.py::test_parse_simple_pipe[simple tests/test_parsing.py::test_parse_simple_pipe[simple|piped] tests/test_parsing.py::test_parse_double_pipe_is_not_a_pipe tests/test_parsing.py::test_parse_complex_pipe tests/test_parsing.py::test_parse_redirect[help tests/test_parsing.py::test_parse_redirect[help>out.txt->] tests/test_parsing.py::test_parse_redirect[help>>out.txt->>] tests/test_parsing.py::test_parse_redirect_with_args tests/test_parsing.py::test_parse_redirect_with_dash_in_path tests/test_parsing.py::test_parse_redirect_append tests/test_parsing.py::test_parse_pipe_then_redirect tests/test_parsing.py::test_parse_multiple_pipes tests/test_parsing.py::test_redirect_then_pipe tests/test_parsing.py::test_append_then_pipe tests/test_parsing.py::test_append_then_redirect tests/test_parsing.py::test_redirect_then_append tests/test_parsing.py::test_redirect_to_quoted_string tests/test_parsing.py::test_redirect_to_single_quoted_string tests/test_parsing.py::test_redirect_to_empty_quoted_string tests/test_parsing.py::test_redirect_to_empty_single_quoted_string tests/test_parsing.py::test_parse_output_to_paste_buffer tests/test_parsing.py::test_parse_redirect_inside_terminator tests/test_parsing.py::test_parse_multiple_terminators[multiline tests/test_parsing.py::test_parse_unfinished_multiliine_command tests/test_parsing.py::test_parse_basic_multiline_command tests/test_parsing.py::test_parse_multiline_command_ignores_redirectors_within_it[multiline tests/test_parsing.py::test_parse_multiline_terminated_by_empty_line tests/test_parsing.py::test_parse_multiline_with_embedded_newline[multiline tests/test_parsing.py::test_parse_multiline_ignores_terminators_in_quotes tests/test_parsing.py::test_parse_command_with_unicode_args tests/test_parsing.py::test_parse_unicode_command tests/test_parsing.py::test_parse_redirect_to_unicode_filename tests/test_parsing.py::test_parse_unclosed_quotes tests/test_parsing.py::test_empty_statement_raises_exception tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[helpalias-help-] tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[helpalias tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[42-theanswer-] tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[42 tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[!ls-shell-ls] tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[!ls tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[l-shell-ls tests/test_parsing.py::test_parse_alias_on_multiline_command tests/test_parsing.py::test_parse_alias_redirection[helpalias tests/test_parsing.py::test_parse_alias_redirection[helpalias>out.txt->] tests/test_parsing.py::test_parse_alias_redirection[helpalias>>out.txt->>] tests/test_parsing.py::test_parse_alias_pipe[helpalias tests/test_parsing.py::test_parse_alias_pipe[helpalias|less] tests/test_parsing.py::test_parse_alias_terminator_no_whitespace[helpalias;] tests/test_parsing.py::test_parse_alias_terminator_no_whitespace[helpalias;;] tests/test_parsing.py::test_parse_alias_terminator_no_whitespace[helpalias;; tests/test_parsing.py::test_parse_alias_terminator_no_whitespace[helpalias tests/test_parsing.py::test_parse_command_only_command_and_args tests/test_parsing.py::test_parse_command_only_strips_line tests/test_parsing.py::test_parse_command_only_expands_alias tests/test_parsing.py::test_parse_command_only_expands_shortcuts tests/test_parsing.py::test_parse_command_only_quoted_args tests/test_parsing.py::test_parse_command_only_specialchars[helpalias tests/test_parsing.py::test_parse_command_only_specialchars[helpalias>out.txt->out.txt] tests/test_parsing.py::test_parse_command_only_specialchars[helpalias>>out.txt->>out.txt] tests/test_parsing.py::test_parse_command_only_specialchars[help|less-|less] tests/test_parsing.py::test_parse_command_only_specialchars[helpalias;-;] tests/test_parsing.py::test_parse_command_only_specialchars[help tests/test_parsing.py::test_parse_command_only_specialchars[help; tests/test_parsing.py::test_parse_command_only_empty[] tests/test_parsing.py::test_parse_command_only_empty[;] tests/test_parsing.py::test_parse_command_only_empty[;;] tests/test_parsing.py::test_parse_command_only_empty[;; tests/test_parsing.py::test_parse_command_only_empty[&] tests/test_parsing.py::test_parse_command_only_empty[& tests/test_parsing.py::test_parse_command_only_empty[ tests/test_parsing.py::test_parse_command_only_empty[>] tests/test_parsing.py::test_parse_command_only_empty['] tests/test_parsing.py::test_parse_command_only_empty["] tests/test_parsing.py::test_parse_command_only_empty[|] tests/test_parsing.py::test_parse_command_only_multiline tests/test_parsing.py::test_statement_initialization tests/test_parsing.py::test_statement_is_immutable tests/test_parsing.py::test_is_valid_command_invalid tests/test_parsing.py::test_is_valid_command_valid tests/test_parsing.py::test_macro_normal_arg_pattern tests/test_parsing.py::test_macro_escaped_arg_pattern tests/test_plugin.py::test_register_preloop_hook_too_many_parameters tests/test_plugin.py::test_register_preloop_hook_with_return_annotation tests/test_plugin.py::test_preloop_hook tests/test_plugin.py::test_preloop_hooks tests/test_plugin.py::test_register_postloop_hook_too_many_parameters tests/test_plugin.py::test_register_postloop_hook_with_wrong_return_annotation tests/test_plugin.py::test_postloop_hook tests/test_plugin.py::test_postloop_hooks tests/test_plugin.py::test_preparse tests/test_plugin.py::test_postparsing_hook_too_many_parameters tests/test_plugin.py::test_postparsing_hook_undeclared_parameter_annotation tests/test_plugin.py::test_postparsing_hook_wrong_parameter_annotation tests/test_plugin.py::test_postparsing_hook_undeclared_return_annotation tests/test_plugin.py::test_postparsing_hook_wrong_return_annotation tests/test_plugin.py::test_postparsing_hook tests/test_plugin.py::test_postparsing_hook_stop_first tests/test_plugin.py::test_postparsing_hook_stop_second tests/test_plugin.py::test_postparsing_hook_emptystatement_first tests/test_plugin.py::test_postparsing_hook_emptystatement_second tests/test_plugin.py::test_postparsing_hook_exception tests/test_plugin.py::test_register_precmd_hook_parameter_count tests/test_plugin.py::test_register_precmd_hook_no_parameter_annotation tests/test_plugin.py::test_register_precmd_hook_wrong_parameter_annotation tests/test_plugin.py::test_register_precmd_hook_no_return_annotation tests/test_plugin.py::test_register_precmd_hook_wrong_return_annotation tests/test_plugin.py::test_precmd_hook tests/test_plugin.py::test_precmd_hook_emptystatement_first tests/test_plugin.py::test_precmd_hook_emptystatement_second tests/test_plugin.py::test_register_postcmd_hook_parameter_count tests/test_plugin.py::test_register_postcmd_hook_no_parameter_annotation tests/test_plugin.py::test_register_postcmd_hook_wrong_parameter_annotation tests/test_plugin.py::test_register_postcmd_hook_no_return_annotation tests/test_plugin.py::test_register_postcmd_hook_wrong_return_annotation tests/test_plugin.py::test_postcmd tests/test_plugin.py::test_postcmd_exception_first tests/test_plugin.py::test_postcmd_exception_second tests/test_plugin.py::test_register_cmdfinalization_hook_parameter_count tests/test_plugin.py::test_register_cmdfinalization_hook_no_parameter_annotation tests/test_plugin.py::test_register_cmdfinalization_hook_wrong_parameter_annotation tests/test_plugin.py::test_register_cmdfinalization_hook_no_return_annotation tests/test_plugin.py::test_register_cmdfinalization_hook_wrong_return_annotation tests/test_plugin.py::test_cmdfinalization tests/test_plugin.py::test_cmdfinalization_stop_first tests/test_plugin.py::test_cmdfinalization_stop_second tests/test_plugin.py::test_cmdfinalization_hook_exception