cmd2 3.2.0__tar.gz → 3.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. {cmd2-3.2.0 → cmd2-3.2.2}/CHANGELOG.md +14 -0
  2. {cmd2-3.2.0 → cmd2-3.2.2}/PKG-INFO +1 -1
  3. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/cmd2.py +2 -0
  4. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/rich_utils.py +5 -2
  5. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/string_utils.py +4 -1
  6. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2.egg-info/PKG-INFO +1 -1
  7. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2.egg-info/SOURCES.txt +1 -0
  8. cmd2-3.2.2/tests/test_async_alert.py +50 -0
  9. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_string_utils.py +38 -5
  10. {cmd2-3.2.0 → cmd2-3.2.2}/.pre-commit-config.yaml +0 -0
  11. {cmd2-3.2.0 → cmd2-3.2.2}/.prettierignore +0 -0
  12. {cmd2-3.2.0 → cmd2-3.2.2}/.prettierrc +0 -0
  13. {cmd2-3.2.0 → cmd2-3.2.2}/GEMINI.md +0 -0
  14. {cmd2-3.2.0 → cmd2-3.2.2}/LICENSE +0 -0
  15. {cmd2-3.2.0 → cmd2-3.2.2}/MANIFEST.in +0 -0
  16. {cmd2-3.2.0 → cmd2-3.2.2}/Makefile +0 -0
  17. {cmd2-3.2.0 → cmd2-3.2.2}/README.md +0 -0
  18. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/__init__.py +0 -0
  19. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/argparse_completer.py +0 -0
  20. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/argparse_custom.py +0 -0
  21. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/clipboard.py +0 -0
  22. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/colors.py +0 -0
  23. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/command_definition.py +0 -0
  24. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/constants.py +0 -0
  25. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/decorators.py +0 -0
  26. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/exceptions.py +0 -0
  27. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/history.py +0 -0
  28. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/parsing.py +0 -0
  29. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/plugin.py +0 -0
  30. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/py.typed +0 -0
  31. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/py_bridge.py +0 -0
  32. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/rl_utils.py +0 -0
  33. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/styles.py +0 -0
  34. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/terminal_utils.py +0 -0
  35. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/transcript.py +0 -0
  36. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2/utils.py +0 -0
  37. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2.egg-info/dependency_links.txt +0 -0
  38. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2.egg-info/requires.txt +0 -0
  39. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2.egg-info/top_level.txt +0 -0
  40. {cmd2-3.2.0 → cmd2-3.2.2}/cmd2.png +0 -0
  41. {cmd2-3.2.0 → cmd2-3.2.2}/codecov.yml +0 -0
  42. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/argparse_completer.md +0 -0
  43. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/argparse_custom.md +0 -0
  44. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/clipboard.md +0 -0
  45. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/cmd.md +0 -0
  46. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/colors.md +0 -0
  47. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/command_definition.md +0 -0
  48. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/constants.md +0 -0
  49. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/decorators.md +0 -0
  50. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/exceptions.md +0 -0
  51. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/history.md +0 -0
  52. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/index.md +0 -0
  53. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/parsing.md +0 -0
  54. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/plugin.md +0 -0
  55. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/py_bridge.md +0 -0
  56. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/rich_utils.md +0 -0
  57. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/rl_utils.md +0 -0
  58. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/string_utils.md +0 -0
  59. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/styles.md +0 -0
  60. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/terminal_utils.md +0 -0
  61. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/transcript.md +0 -0
  62. {cmd2-3.2.0 → cmd2-3.2.2}/docs/api/utils.md +0 -0
  63. {cmd2-3.2.0 → cmd2-3.2.2}/docs/doc_conventions.md +0 -0
  64. {cmd2-3.2.0 → cmd2-3.2.2}/docs/examples/alternate_event_loops.md +0 -0
  65. {cmd2-3.2.0 → cmd2-3.2.2}/docs/examples/examples.md +0 -0
  66. {cmd2-3.2.0 → cmd2-3.2.2}/docs/examples/getting_started.md +0 -0
  67. {cmd2-3.2.0 → cmd2-3.2.2}/docs/examples/index.md +0 -0
  68. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/argument_processing.md +0 -0
  69. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/builtin_commands.md +0 -0
  70. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/clipboard.md +0 -0
  71. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/commands.md +0 -0
  72. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/completion.md +0 -0
  73. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/disable_commands.md +0 -0
  74. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/embedded_python_shells.md +0 -0
  75. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/generating_output.md +0 -0
  76. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/help.md +0 -0
  77. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/history.md +0 -0
  78. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/hooks.md +0 -0
  79. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/index.md +0 -0
  80. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/initialization.md +0 -0
  81. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/misc.md +0 -0
  82. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/modular_commands.md +0 -0
  83. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/multiline_commands.md +0 -0
  84. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/os.md +0 -0
  85. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/packaging.md +0 -0
  86. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/plugins.md +0 -0
  87. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/prompt.md +0 -0
  88. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/redirection.md +0 -0
  89. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/scripting.md +0 -0
  90. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/settings.md +0 -0
  91. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/shortcuts_aliases_macros.md +0 -0
  92. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/startup_commands.md +0 -0
  93. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/table_creation.md +0 -0
  94. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/theme.md +0 -0
  95. {cmd2-3.2.0 → cmd2-3.2.2}/docs/features/transcripts.md +0 -0
  96. {cmd2-3.2.0 → cmd2-3.2.2}/docs/index.md +0 -0
  97. {cmd2-3.2.0 → cmd2-3.2.2}/docs/javascripts/readthedocs.js +0 -0
  98. {cmd2-3.2.0 → cmd2-3.2.2}/docs/migrating/incompatibilities.md +0 -0
  99. {cmd2-3.2.0 → cmd2-3.2.2}/docs/migrating/index.md +0 -0
  100. {cmd2-3.2.0 → cmd2-3.2.2}/docs/migrating/minimum.md +0 -0
  101. {cmd2-3.2.0 → cmd2-3.2.2}/docs/migrating/next_steps.md +0 -0
  102. {cmd2-3.2.0 → cmd2-3.2.2}/docs/migrating/why.md +0 -0
  103. {cmd2-3.2.0 → cmd2-3.2.2}/docs/mixins/index.md +0 -0
  104. {cmd2-3.2.0 → cmd2-3.2.2}/docs/mixins/mixin_template.md +0 -0
  105. {cmd2-3.2.0 → cmd2-3.2.2}/docs/overrides/main.html +0 -0
  106. {cmd2-3.2.0 → cmd2-3.2.2}/docs/overview/alternatives.md +0 -0
  107. {cmd2-3.2.0 → cmd2-3.2.2}/docs/overview/index.md +0 -0
  108. {cmd2-3.2.0 → cmd2-3.2.2}/docs/overview/installation.md +0 -0
  109. {cmd2-3.2.0 → cmd2-3.2.2}/docs/overview/integrating.md +0 -0
  110. {cmd2-3.2.0 → cmd2-3.2.2}/docs/overview/resources.md +0 -0
  111. {cmd2-3.2.0 → cmd2-3.2.2}/docs/stylesheets/cmd2.css +0 -0
  112. {cmd2-3.2.0 → cmd2-3.2.2}/docs/testing.md +0 -0
  113. {cmd2-3.2.0 → cmd2-3.2.2}/docs/upgrades.md +0 -0
  114. {cmd2-3.2.0 → cmd2-3.2.2}/examples/.cmd2rc +0 -0
  115. {cmd2-3.2.0 → cmd2-3.2.2}/examples/README.md +0 -0
  116. {cmd2-3.2.0 → cmd2-3.2.2}/examples/argparse_completion.py +0 -0
  117. {cmd2-3.2.0 → cmd2-3.2.2}/examples/argparse_example.py +0 -0
  118. {cmd2-3.2.0 → cmd2-3.2.2}/examples/async_call.py +0 -0
  119. {cmd2-3.2.0 → cmd2-3.2.2}/examples/async_printing.py +0 -0
  120. {cmd2-3.2.0 → cmd2-3.2.2}/examples/basic_completion.py +0 -0
  121. {cmd2-3.2.0 → cmd2-3.2.2}/examples/cmd_as_argument.py +0 -0
  122. {cmd2-3.2.0 → cmd2-3.2.2}/examples/color.py +0 -0
  123. {cmd2-3.2.0 → cmd2-3.2.2}/examples/command_sets.py +0 -0
  124. {cmd2-3.2.0 → cmd2-3.2.2}/examples/custom_parser.py +0 -0
  125. {cmd2-3.2.0 → cmd2-3.2.2}/examples/custom_types.py +0 -0
  126. {cmd2-3.2.0 → cmd2-3.2.2}/examples/default_categories.py +0 -0
  127. {cmd2-3.2.0 → cmd2-3.2.2}/examples/dynamic_commands.py +0 -0
  128. {cmd2-3.2.0 → cmd2-3.2.2}/examples/environment.py +0 -0
  129. {cmd2-3.2.0 → cmd2-3.2.2}/examples/event_loops.py +0 -0
  130. {cmd2-3.2.0 → cmd2-3.2.2}/examples/exit_code.py +0 -0
  131. {cmd2-3.2.0 → cmd2-3.2.2}/examples/getting_started.py +0 -0
  132. {cmd2-3.2.0 → cmd2-3.2.2}/examples/hello_cmd2.py +0 -0
  133. {cmd2-3.2.0 → cmd2-3.2.2}/examples/help_categories.py +0 -0
  134. {cmd2-3.2.0 → cmd2-3.2.2}/examples/hooks.py +0 -0
  135. {cmd2-3.2.0 → cmd2-3.2.2}/examples/migrating.py +0 -0
  136. {cmd2-3.2.0 → cmd2-3.2.2}/examples/mixin.py +0 -0
  137. {cmd2-3.2.0 → cmd2-3.2.2}/examples/modular_commands/__init__.py +0 -0
  138. {cmd2-3.2.0 → cmd2-3.2.2}/examples/modular_commands/commandset_basic.py +0 -0
  139. {cmd2-3.2.0 → cmd2-3.2.2}/examples/modular_commands/commandset_complex.py +0 -0
  140. {cmd2-3.2.0 → cmd2-3.2.2}/examples/modular_commands/commandset_custominit.py +0 -0
  141. {cmd2-3.2.0 → cmd2-3.2.2}/examples/modular_commands.py +0 -0
  142. {cmd2-3.2.0 → cmd2-3.2.2}/examples/paged_output.py +0 -0
  143. {cmd2-3.2.0 → cmd2-3.2.2}/examples/persistent_history.py +0 -0
  144. {cmd2-3.2.0 → cmd2-3.2.2}/examples/pretty_print.py +0 -0
  145. {cmd2-3.2.0 → cmd2-3.2.2}/examples/python_scripting.py +0 -0
  146. {cmd2-3.2.0 → cmd2-3.2.2}/examples/read_input.py +0 -0
  147. {cmd2-3.2.0 → cmd2-3.2.2}/examples/remove_builtin_commands.py +0 -0
  148. {cmd2-3.2.0 → cmd2-3.2.2}/examples/remove_settable.py +0 -0
  149. {cmd2-3.2.0 → cmd2-3.2.2}/examples/rich_tables.py +0 -0
  150. {cmd2-3.2.0 → cmd2-3.2.2}/examples/rich_theme.py +0 -0
  151. {cmd2-3.2.0 → cmd2-3.2.2}/examples/scripts/arg_printer.py +0 -0
  152. {cmd2-3.2.0 → cmd2-3.2.2}/examples/scripts/conditional.py +0 -0
  153. {cmd2-3.2.0 → cmd2-3.2.2}/examples/scripts/nested.txt +0 -0
  154. {cmd2-3.2.0 → cmd2-3.2.2}/examples/scripts/quit.txt +0 -0
  155. {cmd2-3.2.0 → cmd2-3.2.2}/examples/scripts/save_help_text.py +0 -0
  156. {cmd2-3.2.0 → cmd2-3.2.2}/examples/scripts/script.py +0 -0
  157. {cmd2-3.2.0 → cmd2-3.2.2}/examples/scripts/script.txt +0 -0
  158. {cmd2-3.2.0 → cmd2-3.2.2}/examples/tmux_launch.sh +0 -0
  159. {cmd2-3.2.0 → cmd2-3.2.2}/examples/tmux_split.sh +0 -0
  160. {cmd2-3.2.0 → cmd2-3.2.2}/examples/transcript_example.py +0 -0
  161. {cmd2-3.2.0 → cmd2-3.2.2}/examples/transcripts/exampleSession.txt +0 -0
  162. {cmd2-3.2.0 → cmd2-3.2.2}/examples/transcripts/pirate.transcript +0 -0
  163. {cmd2-3.2.0 → cmd2-3.2.2}/examples/transcripts/quit.txt +0 -0
  164. {cmd2-3.2.0 → cmd2-3.2.2}/examples/transcripts/transcript_regex.txt +0 -0
  165. {cmd2-3.2.0 → cmd2-3.2.2}/examples/unicode_commands.py +0 -0
  166. {cmd2-3.2.0 → cmd2-3.2.2}/mkdocs.yml +0 -0
  167. {cmd2-3.2.0 → cmd2-3.2.2}/package.json +0 -0
  168. {cmd2-3.2.0 → cmd2-3.2.2}/pyproject.toml +0 -0
  169. {cmd2-3.2.0 → cmd2-3.2.2}/ruff.toml +0 -0
  170. {cmd2-3.2.0 → cmd2-3.2.2}/scripts/validate_tag.py +0 -0
  171. {cmd2-3.2.0 → cmd2-3.2.2}/setup.cfg +0 -0
  172. {cmd2-3.2.0 → cmd2-3.2.2}/tests/.cmd2rc +0 -0
  173. {cmd2-3.2.0 → cmd2-3.2.2}/tests/__init__.py +0 -0
  174. {cmd2-3.2.0 → cmd2-3.2.2}/tests/conftest.py +0 -0
  175. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/echo.py +0 -0
  176. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/environment.py +0 -0
  177. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/help.py +0 -0
  178. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/py_locals.py +0 -0
  179. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/pyscript_dir.py +0 -0
  180. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/raises_exception.py +0 -0
  181. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/recursive.py +0 -0
  182. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/self_in_py.py +0 -0
  183. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/stdout_capture.py +0 -0
  184. {cmd2-3.2.0 → cmd2-3.2.2}/tests/pyscript/stop.py +0 -0
  185. {cmd2-3.2.0 → cmd2-3.2.2}/tests/relative_multiple.txt +0 -0
  186. {cmd2-3.2.0 → cmd2-3.2.2}/tests/script.py +0 -0
  187. {cmd2-3.2.0 → cmd2-3.2.2}/tests/script.txt +0 -0
  188. {cmd2-3.2.0 → cmd2-3.2.2}/tests/scripts/binary.bin +0 -0
  189. {cmd2-3.2.0 → cmd2-3.2.2}/tests/scripts/empty.txt +0 -0
  190. {cmd2-3.2.0 → cmd2-3.2.2}/tests/scripts/help.txt +0 -0
  191. {cmd2-3.2.0 → cmd2-3.2.2}/tests/scripts/nested.txt +0 -0
  192. {cmd2-3.2.0 → cmd2-3.2.2}/tests/scripts/one_down.txt +0 -0
  193. {cmd2-3.2.0 → cmd2-3.2.2}/tests/scripts/postcmds.txt +0 -0
  194. {cmd2-3.2.0 → cmd2-3.2.2}/tests/scripts/precmds.txt +0 -0
  195. {cmd2-3.2.0 → cmd2-3.2.2}/tests/scripts/utf8.txt +0 -0
  196. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_argparse.py +0 -0
  197. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_argparse_completer.py +0 -0
  198. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_argparse_custom.py +0 -0
  199. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_argparse_subcommands.py +0 -0
  200. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_categories.py +0 -0
  201. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_cmd2.py +0 -0
  202. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_commandset.py +0 -0
  203. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_completion.py +0 -0
  204. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_future_annotations.py +0 -0
  205. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_history.py +0 -0
  206. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_parsing.py +0 -0
  207. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_plugin.py +0 -0
  208. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_rich_utils.py +0 -0
  209. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_run_pyscript.py +0 -0
  210. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_terminal_utils.py +0 -0
  211. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_transcript.py +0 -0
  212. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_utils.py +0 -0
  213. {cmd2-3.2.0 → cmd2-3.2.2}/tests/test_utils_defining_class.py +0 -0
  214. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/bol_eol.txt +0 -0
  215. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/characterclass.txt +0 -0
  216. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/dotstar.txt +0 -0
  217. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/extension_notation.txt +0 -0
  218. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/failure.txt +0 -0
  219. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/from_cmdloop.txt +0 -0
  220. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/multiline_no_regex.txt +0 -0
  221. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/multiline_regex.txt +0 -0
  222. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/no_output.txt +0 -0
  223. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/no_output_last.txt +0 -0
  224. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/singleslash.txt +0 -0
  225. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/slashes_escaped.txt +0 -0
  226. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/slashslash.txt +0 -0
  227. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/spaces.txt +0 -0
  228. {cmd2-3.2.0 → cmd2-3.2.2}/tests/transcripts/word_boundaries.txt +0 -0
@@ -1,3 +1,17 @@
1
+ ## 3.2.2 (February 21, 2026)
2
+
3
+ - Bug Fixes
4
+ - Updated `rich_utils.ANSI_STYLE_SEQUENCE_RE` to only match ANSI SGR (Select Graphic Rendition)
5
+ sequences for text styling. It previously also matched DEC Private Mode sequences.
6
+
7
+ ## 3.2.1 (February 21, 2026)
8
+
9
+ - Bug Fixes
10
+ - The `async_alert` and `async_prompt_update` methods of `cmd2.Cmd` now respect the current
11
+ value of the `allow_style` settable
12
+ - If `allow_style` is `NEVER`, all style-related ANSI escape codes will be stripped to
13
+ ensure plain text output
14
+
1
15
  ## 3.2.0 (February 5, 2026)
2
16
 
3
17
  - Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmd2
3
- Version: 3.2.0
3
+ Version: 3.2.2
4
4
  Summary: cmd2 - quickly build feature-rich and user-friendly interactive command line applications in Python
5
5
  Author: cmd2 Contributors
6
6
  License-Expression: MIT
@@ -5744,6 +5744,8 @@ class Cmd:
5744
5744
  update_terminal = False
5745
5745
 
5746
5746
  if alert_msg:
5747
+ if self.allow_style == ru.AllowStyle.NEVER:
5748
+ alert_msg = su.strip_style(alert_msg)
5747
5749
  alert_msg += '\n'
5748
5750
  update_terminal = True
5749
5751
 
@@ -30,8 +30,11 @@ from rich_argparse import RichHelpFormatter
30
30
 
31
31
  from .styles import DEFAULT_CMD2_STYLES
32
32
 
33
- # A compiled regular expression to detect ANSI style sequences.
34
- ANSI_STYLE_SEQUENCE_RE = re.compile(r"\x1b\[[0-9;?]*m")
33
+ # Matches ANSI SGR (Select Graphic Rendition) sequences for text styling.
34
+ # \x1b[ - the CSI (Control Sequence Introducer)
35
+ # [0-9;]* - zero or more digits or semicolons (parameters for the style)
36
+ # m - the SGR final character
37
+ ANSI_STYLE_SEQUENCE_RE = re.compile(r"\x1b\[[0-9;]*m")
35
38
 
36
39
 
37
40
  class AllowStyle(Enum):
@@ -95,7 +95,10 @@ def stylize(val: str, style: StyleType) -> str:
95
95
 
96
96
 
97
97
  def strip_style(val: str) -> str:
98
- """Strip all ANSI style sequences from a string.
98
+ """Strip all ANSI style sequences (colors, bold, etc.) from a string.
99
+
100
+ This targets SGR sequences specifically and leaves other terminal
101
+ control codes intact.
99
102
 
100
103
  :param val: string to be stripped
101
104
  :return: the stripped string
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmd2
3
- Version: 3.2.0
3
+ Version: 3.2.2
4
4
  Summary: cmd2 - quickly build feature-rich and user-friendly interactive command line applications in Python
5
5
  Author: cmd2 Contributors
6
6
  License-Expression: MIT
@@ -175,6 +175,7 @@ tests/test_argparse.py
175
175
  tests/test_argparse_completer.py
176
176
  tests/test_argparse_custom.py
177
177
  tests/test_argparse_subcommands.py
178
+ tests/test_async_alert.py
178
179
  tests/test_categories.py
179
180
  tests/test_cmd2.py
180
181
  tests/test_commandset.py
@@ -0,0 +1,50 @@
1
+ import unittest
2
+ from unittest.mock import MagicMock, patch
3
+
4
+ import cmd2
5
+ import cmd2.cmd2 # to patch vt100_support
6
+ from cmd2 import rich_utils as ru
7
+
8
+
9
+ class TestAsyncAlert(unittest.TestCase):
10
+ def test_async_alert_strips_ansi_when_allow_style_is_never(self):
11
+ app = cmd2.Cmd()
12
+
13
+ # Patch vt100_support to True
14
+ with patch('cmd2.cmd2.vt100_support', True):
15
+ # Patch threading functions
16
+ mock_current_thread = MagicMock()
17
+ mock_current_thread.name = "NotMainThread"
18
+
19
+ with (
20
+ patch('threading.current_thread', return_value=mock_current_thread),
21
+ patch('threading.main_thread', return_value=MagicMock()),
22
+ patch('cmd2.cmd2.rl_get_display_prompt', return_value='(Cmd) '),
23
+ patch('cmd2.cmd2.readline.get_line_buffer', return_value=''),
24
+ patch('cmd2.cmd2.rl_get_point', return_value=0),
25
+ patch('cmd2.cmd2.rl_force_redisplay'),
26
+ patch('sys.stdout', new_callable=MagicMock) as mock_stdout,
27
+ ):
28
+ # Set allow_style to NEVER
29
+ app.allow_style = ru.AllowStyle.NEVER
30
+
31
+ # Styled message
32
+ msg = "\033[31mError\033[0m"
33
+
34
+ # Call async_alert
35
+ app.async_alert(msg)
36
+
37
+ # Capture calls to write
38
+ # mock_stdout.write.call_args_list -> [call(str), call(str)...]
39
+ # We look at all written strings
40
+ written_content = "".join([call.args[0] for call in mock_stdout.write.call_args_list])
41
+
42
+ # Check that ANSI codes for color are NOT present
43
+ if "\033[31m" in written_content:
44
+ raise AssertionError(f"Found ANSI color code in output: {written_content!r}")
45
+ if "Error" not in written_content:
46
+ raise AssertionError(f"Message 'Error' not found in output: {written_content!r}")
47
+
48
+
49
+ if __name__ == '__main__':
50
+ unittest.main()
@@ -126,11 +126,44 @@ def test_stylize() -> None:
126
126
  assert restyled_string == "\x1b[1;4;9;32;44mHello, world!\x1b[0m"
127
127
 
128
128
 
129
- def test_strip_style() -> None:
130
- base_str = HELLO_WORLD
131
- styled_str = su.stylize(base_str, style=Color.GREEN)
132
- assert base_str != styled_str
133
- assert base_str == su.strip_style(styled_str)
129
+ def test_strip_basic_styles() -> None:
130
+ # Test bold, colors, and resets
131
+ assert su.strip_style("\x1b[1mBold\x1b[0m") == "Bold"
132
+ assert su.strip_style("\x1b[31mRed\x1b[0m") == "Red"
133
+ assert su.strip_style("\x1b[4;32mUnderline Green\x1b[0m") == "Underline Green"
134
+
135
+
136
+ def test_strip_complex_colors() -> None:
137
+ # Test 256-color and RGB (TrueColor) sequences
138
+ # These use semicolons as separators and end in 'm'
139
+ assert su.strip_style("\x1b[38;5;208mOrange\x1b[0m") == "Orange"
140
+ assert su.strip_style("\x1b[38;2;255;87;51mCustom RGB\x1b[0m") == "Custom RGB"
141
+
142
+
143
+ def test_preserve_non_style_csi() -> None:
144
+ # Test that cursor movements and other CSI codes are not stripped
145
+ # Cursor Up (\x1b[A) and Cursor Position (\x1b[10;5H)
146
+ cursor_up = "\x1b[A"
147
+ cursor_pos = "\x1b[10;5H"
148
+ assert su.strip_style(cursor_up) == cursor_up
149
+ assert su.strip_style(cursor_pos) == cursor_pos
150
+
151
+
152
+ def test_preserve_private_modes() -> None:
153
+ # Test that DEC Private Modes (containing '?') are not stripped
154
+ # Hide cursor (\x1b[?25l) and Show cursor (\x1b[?25h)
155
+ hide_cursor = "\x1b[?25l"
156
+ show_cursor = "\x1b[?25h"
157
+ assert su.strip_style(hide_cursor) == hide_cursor
158
+ assert su.strip_style(show_cursor) == show_cursor
159
+
160
+
161
+ def test_mixed_content() -> None:
162
+ # Test a string that has both style and control sequences
163
+ # Red text + Hide Cursor
164
+ mixed = "\x1b[31mRed Text\x1b[0m\x1b[?25l"
165
+ # Only the red style should be removed
166
+ assert su.strip_style(mixed) == "Red Text\x1b[?25l"
134
167
 
135
168
 
136
169
  def test_str_width() -> None:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes