cmd2 3.2.1__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 (229) hide show
  1. {cmd2-3.2.1 → cmd2-3.2.2}/CHANGELOG.md +8 -2
  2. {cmd2-3.2.1 → cmd2-3.2.2}/PKG-INFO +1 -1
  3. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/rich_utils.py +5 -2
  4. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/string_utils.py +4 -1
  5. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2.egg-info/PKG-INFO +1 -1
  6. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2.egg-info/SOURCES.txt +0 -1
  7. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_string_utils.py +38 -5
  8. cmd2-3.2.1/examples/cmd2_history.dat +0 -0
  9. {cmd2-3.2.1 → cmd2-3.2.2}/.pre-commit-config.yaml +0 -0
  10. {cmd2-3.2.1 → cmd2-3.2.2}/.prettierignore +0 -0
  11. {cmd2-3.2.1 → cmd2-3.2.2}/.prettierrc +0 -0
  12. {cmd2-3.2.1 → cmd2-3.2.2}/GEMINI.md +0 -0
  13. {cmd2-3.2.1 → cmd2-3.2.2}/LICENSE +0 -0
  14. {cmd2-3.2.1 → cmd2-3.2.2}/MANIFEST.in +0 -0
  15. {cmd2-3.2.1 → cmd2-3.2.2}/Makefile +0 -0
  16. {cmd2-3.2.1 → cmd2-3.2.2}/README.md +0 -0
  17. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/__init__.py +0 -0
  18. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/argparse_completer.py +0 -0
  19. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/argparse_custom.py +0 -0
  20. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/clipboard.py +0 -0
  21. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/cmd2.py +0 -0
  22. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/colors.py +0 -0
  23. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/command_definition.py +0 -0
  24. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/constants.py +0 -0
  25. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/decorators.py +0 -0
  26. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/exceptions.py +0 -0
  27. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/history.py +0 -0
  28. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/parsing.py +0 -0
  29. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/plugin.py +0 -0
  30. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/py.typed +0 -0
  31. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/py_bridge.py +0 -0
  32. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/rl_utils.py +0 -0
  33. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/styles.py +0 -0
  34. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/terminal_utils.py +0 -0
  35. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/transcript.py +0 -0
  36. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2/utils.py +0 -0
  37. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2.egg-info/dependency_links.txt +0 -0
  38. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2.egg-info/requires.txt +0 -0
  39. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2.egg-info/top_level.txt +0 -0
  40. {cmd2-3.2.1 → cmd2-3.2.2}/cmd2.png +0 -0
  41. {cmd2-3.2.1 → cmd2-3.2.2}/codecov.yml +0 -0
  42. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/argparse_completer.md +0 -0
  43. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/argparse_custom.md +0 -0
  44. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/clipboard.md +0 -0
  45. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/cmd.md +0 -0
  46. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/colors.md +0 -0
  47. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/command_definition.md +0 -0
  48. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/constants.md +0 -0
  49. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/decorators.md +0 -0
  50. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/exceptions.md +0 -0
  51. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/history.md +0 -0
  52. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/index.md +0 -0
  53. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/parsing.md +0 -0
  54. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/plugin.md +0 -0
  55. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/py_bridge.md +0 -0
  56. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/rich_utils.md +0 -0
  57. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/rl_utils.md +0 -0
  58. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/string_utils.md +0 -0
  59. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/styles.md +0 -0
  60. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/terminal_utils.md +0 -0
  61. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/transcript.md +0 -0
  62. {cmd2-3.2.1 → cmd2-3.2.2}/docs/api/utils.md +0 -0
  63. {cmd2-3.2.1 → cmd2-3.2.2}/docs/doc_conventions.md +0 -0
  64. {cmd2-3.2.1 → cmd2-3.2.2}/docs/examples/alternate_event_loops.md +0 -0
  65. {cmd2-3.2.1 → cmd2-3.2.2}/docs/examples/examples.md +0 -0
  66. {cmd2-3.2.1 → cmd2-3.2.2}/docs/examples/getting_started.md +0 -0
  67. {cmd2-3.2.1 → cmd2-3.2.2}/docs/examples/index.md +0 -0
  68. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/argument_processing.md +0 -0
  69. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/builtin_commands.md +0 -0
  70. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/clipboard.md +0 -0
  71. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/commands.md +0 -0
  72. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/completion.md +0 -0
  73. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/disable_commands.md +0 -0
  74. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/embedded_python_shells.md +0 -0
  75. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/generating_output.md +0 -0
  76. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/help.md +0 -0
  77. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/history.md +0 -0
  78. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/hooks.md +0 -0
  79. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/index.md +0 -0
  80. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/initialization.md +0 -0
  81. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/misc.md +0 -0
  82. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/modular_commands.md +0 -0
  83. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/multiline_commands.md +0 -0
  84. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/os.md +0 -0
  85. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/packaging.md +0 -0
  86. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/plugins.md +0 -0
  87. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/prompt.md +0 -0
  88. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/redirection.md +0 -0
  89. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/scripting.md +0 -0
  90. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/settings.md +0 -0
  91. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/shortcuts_aliases_macros.md +0 -0
  92. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/startup_commands.md +0 -0
  93. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/table_creation.md +0 -0
  94. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/theme.md +0 -0
  95. {cmd2-3.2.1 → cmd2-3.2.2}/docs/features/transcripts.md +0 -0
  96. {cmd2-3.2.1 → cmd2-3.2.2}/docs/index.md +0 -0
  97. {cmd2-3.2.1 → cmd2-3.2.2}/docs/javascripts/readthedocs.js +0 -0
  98. {cmd2-3.2.1 → cmd2-3.2.2}/docs/migrating/incompatibilities.md +0 -0
  99. {cmd2-3.2.1 → cmd2-3.2.2}/docs/migrating/index.md +0 -0
  100. {cmd2-3.2.1 → cmd2-3.2.2}/docs/migrating/minimum.md +0 -0
  101. {cmd2-3.2.1 → cmd2-3.2.2}/docs/migrating/next_steps.md +0 -0
  102. {cmd2-3.2.1 → cmd2-3.2.2}/docs/migrating/why.md +0 -0
  103. {cmd2-3.2.1 → cmd2-3.2.2}/docs/mixins/index.md +0 -0
  104. {cmd2-3.2.1 → cmd2-3.2.2}/docs/mixins/mixin_template.md +0 -0
  105. {cmd2-3.2.1 → cmd2-3.2.2}/docs/overrides/main.html +0 -0
  106. {cmd2-3.2.1 → cmd2-3.2.2}/docs/overview/alternatives.md +0 -0
  107. {cmd2-3.2.1 → cmd2-3.2.2}/docs/overview/index.md +0 -0
  108. {cmd2-3.2.1 → cmd2-3.2.2}/docs/overview/installation.md +0 -0
  109. {cmd2-3.2.1 → cmd2-3.2.2}/docs/overview/integrating.md +0 -0
  110. {cmd2-3.2.1 → cmd2-3.2.2}/docs/overview/resources.md +0 -0
  111. {cmd2-3.2.1 → cmd2-3.2.2}/docs/stylesheets/cmd2.css +0 -0
  112. {cmd2-3.2.1 → cmd2-3.2.2}/docs/testing.md +0 -0
  113. {cmd2-3.2.1 → cmd2-3.2.2}/docs/upgrades.md +0 -0
  114. {cmd2-3.2.1 → cmd2-3.2.2}/examples/.cmd2rc +0 -0
  115. {cmd2-3.2.1 → cmd2-3.2.2}/examples/README.md +0 -0
  116. {cmd2-3.2.1 → cmd2-3.2.2}/examples/argparse_completion.py +0 -0
  117. {cmd2-3.2.1 → cmd2-3.2.2}/examples/argparse_example.py +0 -0
  118. {cmd2-3.2.1 → cmd2-3.2.2}/examples/async_call.py +0 -0
  119. {cmd2-3.2.1 → cmd2-3.2.2}/examples/async_printing.py +0 -0
  120. {cmd2-3.2.1 → cmd2-3.2.2}/examples/basic_completion.py +0 -0
  121. {cmd2-3.2.1 → cmd2-3.2.2}/examples/cmd_as_argument.py +0 -0
  122. {cmd2-3.2.1 → cmd2-3.2.2}/examples/color.py +0 -0
  123. {cmd2-3.2.1 → cmd2-3.2.2}/examples/command_sets.py +0 -0
  124. {cmd2-3.2.1 → cmd2-3.2.2}/examples/custom_parser.py +0 -0
  125. {cmd2-3.2.1 → cmd2-3.2.2}/examples/custom_types.py +0 -0
  126. {cmd2-3.2.1 → cmd2-3.2.2}/examples/default_categories.py +0 -0
  127. {cmd2-3.2.1 → cmd2-3.2.2}/examples/dynamic_commands.py +0 -0
  128. {cmd2-3.2.1 → cmd2-3.2.2}/examples/environment.py +0 -0
  129. {cmd2-3.2.1 → cmd2-3.2.2}/examples/event_loops.py +0 -0
  130. {cmd2-3.2.1 → cmd2-3.2.2}/examples/exit_code.py +0 -0
  131. {cmd2-3.2.1 → cmd2-3.2.2}/examples/getting_started.py +0 -0
  132. {cmd2-3.2.1 → cmd2-3.2.2}/examples/hello_cmd2.py +0 -0
  133. {cmd2-3.2.1 → cmd2-3.2.2}/examples/help_categories.py +0 -0
  134. {cmd2-3.2.1 → cmd2-3.2.2}/examples/hooks.py +0 -0
  135. {cmd2-3.2.1 → cmd2-3.2.2}/examples/migrating.py +0 -0
  136. {cmd2-3.2.1 → cmd2-3.2.2}/examples/mixin.py +0 -0
  137. {cmd2-3.2.1 → cmd2-3.2.2}/examples/modular_commands/__init__.py +0 -0
  138. {cmd2-3.2.1 → cmd2-3.2.2}/examples/modular_commands/commandset_basic.py +0 -0
  139. {cmd2-3.2.1 → cmd2-3.2.2}/examples/modular_commands/commandset_complex.py +0 -0
  140. {cmd2-3.2.1 → cmd2-3.2.2}/examples/modular_commands/commandset_custominit.py +0 -0
  141. {cmd2-3.2.1 → cmd2-3.2.2}/examples/modular_commands.py +0 -0
  142. {cmd2-3.2.1 → cmd2-3.2.2}/examples/paged_output.py +0 -0
  143. {cmd2-3.2.1 → cmd2-3.2.2}/examples/persistent_history.py +0 -0
  144. {cmd2-3.2.1 → cmd2-3.2.2}/examples/pretty_print.py +0 -0
  145. {cmd2-3.2.1 → cmd2-3.2.2}/examples/python_scripting.py +0 -0
  146. {cmd2-3.2.1 → cmd2-3.2.2}/examples/read_input.py +0 -0
  147. {cmd2-3.2.1 → cmd2-3.2.2}/examples/remove_builtin_commands.py +0 -0
  148. {cmd2-3.2.1 → cmd2-3.2.2}/examples/remove_settable.py +0 -0
  149. {cmd2-3.2.1 → cmd2-3.2.2}/examples/rich_tables.py +0 -0
  150. {cmd2-3.2.1 → cmd2-3.2.2}/examples/rich_theme.py +0 -0
  151. {cmd2-3.2.1 → cmd2-3.2.2}/examples/scripts/arg_printer.py +0 -0
  152. {cmd2-3.2.1 → cmd2-3.2.2}/examples/scripts/conditional.py +0 -0
  153. {cmd2-3.2.1 → cmd2-3.2.2}/examples/scripts/nested.txt +0 -0
  154. {cmd2-3.2.1 → cmd2-3.2.2}/examples/scripts/quit.txt +0 -0
  155. {cmd2-3.2.1 → cmd2-3.2.2}/examples/scripts/save_help_text.py +0 -0
  156. {cmd2-3.2.1 → cmd2-3.2.2}/examples/scripts/script.py +0 -0
  157. {cmd2-3.2.1 → cmd2-3.2.2}/examples/scripts/script.txt +0 -0
  158. {cmd2-3.2.1 → cmd2-3.2.2}/examples/tmux_launch.sh +0 -0
  159. {cmd2-3.2.1 → cmd2-3.2.2}/examples/tmux_split.sh +0 -0
  160. {cmd2-3.2.1 → cmd2-3.2.2}/examples/transcript_example.py +0 -0
  161. {cmd2-3.2.1 → cmd2-3.2.2}/examples/transcripts/exampleSession.txt +0 -0
  162. {cmd2-3.2.1 → cmd2-3.2.2}/examples/transcripts/pirate.transcript +0 -0
  163. {cmd2-3.2.1 → cmd2-3.2.2}/examples/transcripts/quit.txt +0 -0
  164. {cmd2-3.2.1 → cmd2-3.2.2}/examples/transcripts/transcript_regex.txt +0 -0
  165. {cmd2-3.2.1 → cmd2-3.2.2}/examples/unicode_commands.py +0 -0
  166. {cmd2-3.2.1 → cmd2-3.2.2}/mkdocs.yml +0 -0
  167. {cmd2-3.2.1 → cmd2-3.2.2}/package.json +0 -0
  168. {cmd2-3.2.1 → cmd2-3.2.2}/pyproject.toml +0 -0
  169. {cmd2-3.2.1 → cmd2-3.2.2}/ruff.toml +0 -0
  170. {cmd2-3.2.1 → cmd2-3.2.2}/scripts/validate_tag.py +0 -0
  171. {cmd2-3.2.1 → cmd2-3.2.2}/setup.cfg +0 -0
  172. {cmd2-3.2.1 → cmd2-3.2.2}/tests/.cmd2rc +0 -0
  173. {cmd2-3.2.1 → cmd2-3.2.2}/tests/__init__.py +0 -0
  174. {cmd2-3.2.1 → cmd2-3.2.2}/tests/conftest.py +0 -0
  175. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/echo.py +0 -0
  176. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/environment.py +0 -0
  177. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/help.py +0 -0
  178. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/py_locals.py +0 -0
  179. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/pyscript_dir.py +0 -0
  180. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/raises_exception.py +0 -0
  181. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/recursive.py +0 -0
  182. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/self_in_py.py +0 -0
  183. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/stdout_capture.py +0 -0
  184. {cmd2-3.2.1 → cmd2-3.2.2}/tests/pyscript/stop.py +0 -0
  185. {cmd2-3.2.1 → cmd2-3.2.2}/tests/relative_multiple.txt +0 -0
  186. {cmd2-3.2.1 → cmd2-3.2.2}/tests/script.py +0 -0
  187. {cmd2-3.2.1 → cmd2-3.2.2}/tests/script.txt +0 -0
  188. {cmd2-3.2.1 → cmd2-3.2.2}/tests/scripts/binary.bin +0 -0
  189. {cmd2-3.2.1 → cmd2-3.2.2}/tests/scripts/empty.txt +0 -0
  190. {cmd2-3.2.1 → cmd2-3.2.2}/tests/scripts/help.txt +0 -0
  191. {cmd2-3.2.1 → cmd2-3.2.2}/tests/scripts/nested.txt +0 -0
  192. {cmd2-3.2.1 → cmd2-3.2.2}/tests/scripts/one_down.txt +0 -0
  193. {cmd2-3.2.1 → cmd2-3.2.2}/tests/scripts/postcmds.txt +0 -0
  194. {cmd2-3.2.1 → cmd2-3.2.2}/tests/scripts/precmds.txt +0 -0
  195. {cmd2-3.2.1 → cmd2-3.2.2}/tests/scripts/utf8.txt +0 -0
  196. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_argparse.py +0 -0
  197. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_argparse_completer.py +0 -0
  198. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_argparse_custom.py +0 -0
  199. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_argparse_subcommands.py +0 -0
  200. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_async_alert.py +0 -0
  201. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_categories.py +0 -0
  202. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_cmd2.py +0 -0
  203. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_commandset.py +0 -0
  204. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_completion.py +0 -0
  205. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_future_annotations.py +0 -0
  206. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_history.py +0 -0
  207. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_parsing.py +0 -0
  208. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_plugin.py +0 -0
  209. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_rich_utils.py +0 -0
  210. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_run_pyscript.py +0 -0
  211. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_terminal_utils.py +0 -0
  212. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_transcript.py +0 -0
  213. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_utils.py +0 -0
  214. {cmd2-3.2.1 → cmd2-3.2.2}/tests/test_utils_defining_class.py +0 -0
  215. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/bol_eol.txt +0 -0
  216. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/characterclass.txt +0 -0
  217. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/dotstar.txt +0 -0
  218. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/extension_notation.txt +0 -0
  219. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/failure.txt +0 -0
  220. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/from_cmdloop.txt +0 -0
  221. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/multiline_no_regex.txt +0 -0
  222. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/multiline_regex.txt +0 -0
  223. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/no_output.txt +0 -0
  224. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/no_output_last.txt +0 -0
  225. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/singleslash.txt +0 -0
  226. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/slashes_escaped.txt +0 -0
  227. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/slashslash.txt +0 -0
  228. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/spaces.txt +0 -0
  229. {cmd2-3.2.1 → cmd2-3.2.2}/tests/transcripts/word_boundaries.txt +0 -0
@@ -1,10 +1,16 @@
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
+
1
7
  ## 3.2.1 (February 21, 2026)
2
8
 
3
9
  - Bug Fixes
4
10
  - The `async_alert` and `async_prompt_update` methods of `cmd2.Cmd` now respect the current
5
11
  value of the `allow_style` settable
6
- - If `allow_style` is `NEVER`, all ANSI escape codes will be stripped to ensure plain text
7
- output
12
+ - If `allow_style` is `NEVER`, all style-related ANSI escape codes will be stripped to
13
+ ensure plain text output
8
14
 
9
15
  ## 3.2.0 (February 5, 2026)
10
16
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmd2
3
- Version: 3.2.1
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
@@ -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.1
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
@@ -119,7 +119,6 @@ examples/argparse_example.py
119
119
  examples/async_call.py
120
120
  examples/async_printing.py
121
121
  examples/basic_completion.py
122
- examples/cmd2_history.dat
123
122
  examples/cmd_as_argument.py
124
123
  examples/color.py
125
124
  examples/command_sets.py
@@ -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:
Binary file
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
File without changes
File without changes