cmd2 4.0.0rc2__tar.gz → 4.1.0__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 (222) hide show
  1. {cmd2-4.0.0rc2 → cmd2-4.1.0}/.pre-commit-config.yaml +2 -2
  2. {cmd2-4.0.0rc2 → cmd2-4.1.0}/CHANGELOG.md +72 -1
  3. {cmd2-4.0.0rc2 → cmd2-4.1.0}/GEMINI.md +2 -0
  4. {cmd2-4.0.0rc2 → cmd2-4.1.0}/PKG-INFO +21 -19
  5. {cmd2-4.0.0rc2 → cmd2-4.1.0}/README.md +20 -18
  6. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/__init__.py +6 -1
  7. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/annotated.py +933 -149
  8. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/cmd2.py +61 -46
  9. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/pt_utils.py +9 -0
  10. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/styles.py +4 -1
  11. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2.egg-info/PKG-INFO +21 -19
  12. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2.egg-info/SOURCES.txt +3 -0
  13. cmd2-4.1.0/cmd2.egg-info/scm_file_list.json +228 -0
  14. cmd2-4.1.0/cmd2.egg-info/scm_version.json +8 -0
  15. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/index.md +3 -0
  16. cmd2-4.1.0/docs/api/theme.md +3 -0
  17. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/annotated.md +344 -27
  18. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/initialization.md +0 -1
  19. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/prompt.md +14 -6
  20. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/migrating/index.md +4 -3
  21. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/overview/installation.md +1 -1
  22. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/upgrades.md +2 -3
  23. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/annotated_example.py +198 -9
  24. cmd2-4.1.0/examples/getting_started.py +228 -0
  25. {cmd2-4.0.0rc2 → cmd2-4.1.0}/mkdocs.yml +2 -1
  26. {cmd2-4.0.0rc2 → cmd2-4.1.0}/pyproject.toml +1 -1
  27. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_annotated.py +2139 -78
  28. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_cmd2.py +68 -45
  29. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_pt_utils.py +30 -0
  30. cmd2-4.0.0rc2/examples/getting_started.py +0 -138
  31. {cmd2-4.0.0rc2 → cmd2-4.1.0}/.prettierignore +0 -0
  32. {cmd2-4.0.0rc2 → cmd2-4.1.0}/.prettierrc +0 -0
  33. {cmd2-4.0.0rc2 → cmd2-4.1.0}/.typos.toml +0 -0
  34. {cmd2-4.0.0rc2 → cmd2-4.1.0}/LICENSE +0 -0
  35. {cmd2-4.0.0rc2 → cmd2-4.1.0}/MANIFEST.in +0 -0
  36. {cmd2-4.0.0rc2 → cmd2-4.1.0}/Makefile +0 -0
  37. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/argparse_completer.py +0 -0
  38. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/argparse_utils.py +0 -0
  39. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/clipboard.py +0 -0
  40. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/colors.py +0 -0
  41. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/command_set.py +0 -0
  42. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/completion.py +0 -0
  43. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/constants.py +0 -0
  44. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/decorators.py +0 -0
  45. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/exceptions.py +0 -0
  46. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/history.py +0 -0
  47. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/parsing.py +0 -0
  48. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/plugin.py +0 -0
  49. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/py.typed +0 -0
  50. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/py_bridge.py +0 -0
  51. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/rich_utils.py +0 -0
  52. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/string_utils.py +0 -0
  53. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/theme.py +12 -12
  54. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/types.py +0 -0
  55. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2/utils.py +0 -0
  56. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2.egg-info/dependency_links.txt +0 -0
  57. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2.egg-info/requires.txt +0 -0
  58. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2.egg-info/top_level.txt +0 -0
  59. {cmd2-4.0.0rc2 → cmd2-4.1.0}/cmd2.png +0 -0
  60. {cmd2-4.0.0rc2 → cmd2-4.1.0}/codecov.yml +0 -0
  61. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/annotated.md +0 -0
  62. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/argparse_completer.md +0 -0
  63. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/argparse_utils.md +0 -0
  64. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/clipboard.md +0 -0
  65. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/cmd.md +0 -0
  66. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/colors.md +0 -0
  67. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/command_set.md +0 -0
  68. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/completion.md +0 -0
  69. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/constants.md +0 -0
  70. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/decorators.md +0 -0
  71. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/exceptions.md +0 -0
  72. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/history.md +0 -0
  73. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/parsing.md +0 -0
  74. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/plugin.md +0 -0
  75. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/pt_utils.md +0 -0
  76. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/py_bridge.md +0 -0
  77. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/rich_utils.md +0 -0
  78. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/string_utils.md +0 -0
  79. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/styles.md +0 -0
  80. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/api/utils.md +0 -0
  81. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/doc_conventions.md +0 -0
  82. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/examples/alternate_event_loops.md +0 -0
  83. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/examples/examples.md +0 -0
  84. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/examples/getting_started.md +0 -0
  85. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/examples/index.md +0 -0
  86. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/argument_processing.md +0 -0
  87. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/async_commands.md +0 -0
  88. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/builtin_commands.md +0 -0
  89. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/clipboard.md +0 -0
  90. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/commands.md +0 -0
  91. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/completion.md +0 -0
  92. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/disable_commands.md +0 -0
  93. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/embedded_python_shells.md +0 -0
  94. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/generating_output.md +0 -0
  95. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/help.md +0 -0
  96. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/history.md +0 -0
  97. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/hooks.md +0 -0
  98. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/index.md +0 -0
  99. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/misc.md +0 -0
  100. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/modular_commands.md +0 -0
  101. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/multiline_commands.md +0 -0
  102. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/os.md +0 -0
  103. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/packaging.md +0 -0
  104. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/plugins.md +0 -0
  105. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/redirection.md +0 -0
  106. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/scripting.md +0 -0
  107. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/settings.md +0 -0
  108. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/shortcuts_aliases_macros.md +0 -0
  109. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/startup_commands.md +0 -0
  110. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/table_creation.md +0 -0
  111. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/features/theme.md +0 -0
  112. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/index.md +0 -0
  113. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/javascripts/readthedocs.js +0 -0
  114. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/migrating/incompatibilities.md +0 -0
  115. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/migrating/minimum.md +0 -0
  116. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/migrating/next_steps.md +0 -0
  117. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/migrating/why.md +0 -0
  118. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/mixins/index.md +0 -0
  119. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/mixins/mixin_template.md +0 -0
  120. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/overrides/main.html +0 -0
  121. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/overview/alternatives.md +0 -0
  122. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/overview/index.md +0 -0
  123. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/overview/integrating.md +0 -0
  124. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/overview/resources.md +0 -0
  125. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/stylesheets/cmd2.css +0 -0
  126. {cmd2-4.0.0rc2 → cmd2-4.1.0}/docs/testing.md +0 -0
  127. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/.cmd2rc +0 -0
  128. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/README.md +0 -0
  129. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/argparse_completion.py +0 -0
  130. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/argparse_example.py +0 -0
  131. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/async_call.py +0 -0
  132. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/async_commands.py +0 -0
  133. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/async_printing.py +0 -0
  134. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/basic_completion.py +0 -0
  135. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/cmd2_history.dat +0 -0
  136. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/cmd_as_argument.py +0 -0
  137. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/color.py +0 -0
  138. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/command_sets.py +0 -0
  139. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/completion_item_choices.py +0 -0
  140. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/custom_parser.py +0 -0
  141. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/custom_types.py +0 -0
  142. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/default_categories.py +0 -0
  143. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/dynamic_commands.py +0 -0
  144. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/environment.py +0 -0
  145. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/event_loops.py +0 -0
  146. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/exit_code.py +0 -0
  147. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/hello_cmd2.py +0 -0
  148. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/help_categories.py +0 -0
  149. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/hooks.py +0 -0
  150. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/migrating.py +0 -0
  151. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/mixin.py +0 -0
  152. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/modular_commands/__init__.py +0 -0
  153. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/modular_commands/commandset_basic.py +0 -0
  154. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/modular_commands/commandset_complex.py +0 -0
  155. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/modular_commands/commandset_custominit.py +0 -0
  156. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/modular_commandsets.py +0 -0
  157. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/paged_output.py +0 -0
  158. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/persistent_history.py +0 -0
  159. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/pretty_print.py +0 -0
  160. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/python_scripting.py +0 -0
  161. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/read_input.py +0 -0
  162. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/remove_builtin_commands.py +0 -0
  163. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/remove_settable.py +0 -0
  164. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/rich_tables.py +0 -0
  165. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/rich_theme.py +0 -0
  166. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/scripts/arg_printer.py +0 -0
  167. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/scripts/conditional.py +0 -0
  168. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/scripts/nested.txt +0 -0
  169. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/scripts/quit.txt +0 -0
  170. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/scripts/save_help_text.py +0 -0
  171. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/scripts/script.py +0 -0
  172. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/scripts/script.txt +0 -0
  173. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/tmux_launch.sh +0 -0
  174. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/tmux_split.sh +0 -0
  175. {cmd2-4.0.0rc2 → cmd2-4.1.0}/examples/unicode_commands.py +0 -0
  176. {cmd2-4.0.0rc2 → cmd2-4.1.0}/package.json +0 -0
  177. {cmd2-4.0.0rc2 → cmd2-4.1.0}/ruff.toml +0 -0
  178. {cmd2-4.0.0rc2 → cmd2-4.1.0}/scripts/validate_tag.py +0 -0
  179. {cmd2-4.0.0rc2 → cmd2-4.1.0}/setup.cfg +0 -0
  180. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/.cmd2rc +0 -0
  181. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/__init__.py +0 -0
  182. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/conftest.py +0 -0
  183. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/echo.py +0 -0
  184. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/environment.py +0 -0
  185. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/help.py +0 -0
  186. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/py_locals.py +0 -0
  187. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/pyscript_dir.py +0 -0
  188. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/raises_exception.py +0 -0
  189. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/recursive.py +0 -0
  190. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/self_in_py.py +0 -0
  191. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/stop.py +0 -0
  192. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/pyscript/test_print.py +0 -0
  193. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/relative_multiple.txt +0 -0
  194. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/script.py +0 -0
  195. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/script.txt +0 -0
  196. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/scripts/binary.bin +0 -0
  197. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/scripts/empty.txt +0 -0
  198. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/scripts/help.txt +0 -0
  199. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/scripts/nested.txt +0 -0
  200. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/scripts/one_down.txt +0 -0
  201. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/scripts/postcmds.txt +0 -0
  202. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/scripts/precmds.txt +0 -0
  203. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/scripts/utf8.txt +0 -0
  204. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_argparse.py +0 -0
  205. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_argparse_completer.py +0 -0
  206. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_argparse_subcommands.py +0 -0
  207. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_argparse_utils.py +0 -0
  208. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_categories.py +0 -0
  209. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_commandset.py +0 -0
  210. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_completion.py +0 -0
  211. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_dynamic_complete_style.py +0 -0
  212. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_future_annotations.py +0 -0
  213. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_history.py +0 -0
  214. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_parsing.py +0 -0
  215. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_plugin.py +0 -0
  216. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_py_completion.py +0 -0
  217. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_rich_utils.py +0 -0
  218. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_run_pyscript.py +0 -0
  219. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_string_utils.py +0 -0
  220. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_theme.py +0 -0
  221. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_utils.py +0 -0
  222. {cmd2-4.0.0rc2 → cmd2-4.1.0}/tests/test_utils_defining_class.py +0 -0
@@ -14,7 +14,7 @@ repos:
14
14
  - id: trailing-whitespace
15
15
 
16
16
  - repo: https://github.com/astral-sh/ruff-pre-commit
17
- rev: "v0.15.15"
17
+ rev: "v0.15.17"
18
18
  hooks:
19
19
  - id: ruff-format
20
20
  args: [--config=ruff.toml]
@@ -30,7 +30,7 @@ repos:
30
30
  - prettier-plugin-toml@2.0.6
31
31
 
32
32
  - repo: https://github.com/crate-ci/typos
33
- rev: v1.47.0
33
+ rev: v1.47.2
34
34
  hooks:
35
35
  - id: typos
36
36
  exclude: |
@@ -1,4 +1,75 @@
1
- ## 4.0.0 (June TBD, 2026)
1
+ ## 4.1.0 (July 7, 2026)
2
+
3
+ - Breaking Changes
4
+ - Renamed the `bottom_toolbar` argument in `Cmd.__init__()` to `enable_bottom_toolbar`. It is
5
+ also now strictly an `__init__` parameter and not an instance attribute.
6
+ - `complete_in_thread` is now strictly an `__init__` parameter and not an instance attribute of
7
+ `Cmd`.
8
+ - `get_rprompt()` is now only called if the `enable_rprompt` argument in `Cmd.__init__()` is set
9
+ to `True`.
10
+ - Bug Fixes
11
+ - Fixed type hinting so that methods decorated with `with_annotated` no longer trigger spurious
12
+ mypy errors and preserve their original signature.
13
+ - Fixed cmd2 bypassing NO_COLOR and allow_style when setting prompt-toolkit's color depth.
14
+ - Enhancements
15
+ - New `cmd2.Cmd` parameters
16
+ - **complete_in_thread**: (boolean) if `True`, then completion will run in a separate
17
+ thread. If `False` then completion runs in the main thread and causes it to block if slow.
18
+ Defaults to `True`.
19
+ - **refresh_interval**: (float) How often, in seconds, to automatically refresh the UI.
20
+ Defaults to 0.0. This is used for bottom toolbars and right prompts which have dynamic
21
+ content needing to be refreshed at regular intervals and not just when a key is pressed.
22
+ - Improved
23
+ [getting_started.py](https://github.com/python-cmd2/cmd2/blob/main/examples/getting_started.py)
24
+ example
25
+ - Shows how to properly and safely use a background thread to update the bottom toolbar with
26
+ dynamic content
27
+ - Demonstrates how to use the `@with_argparser` and `@with_argument_block` decorators for
28
+ parsing command arguments
29
+ - Experimental features
30
+ - `@with_annotated` now supports `frozenset[T]` collection parameters, alongside the existing
31
+ `list[T]`, `set[T]`, and `tuple[T, ...]` collection types.
32
+ - `@with_annotated` mutually exclusive groups now accept a `title`/`description` to render the
33
+ group as a titled help section (argparse's one supported nesting, a mutex inside an argument
34
+ group), declared in one place with no paired `groups=` entry.
35
+ - `@with_annotated` now validates `groups` / `mutually_exclusive_groups` specs eagerly at
36
+ decoration time, so a misconfigured group (a member that names no parameter, a parameter
37
+ placed in two groups, a mutex group spanning or partially overlapping argument groups, a
38
+ titled section declared in two places, or `Group(required=True)` on a plain group) hard-fails
39
+ when the class is defined instead of being deferred to first command use where the error was
40
+ swallowed. The checks read parameter names only, so forward-referenced annotations still
41
+ decorate cleanly.
42
+ - `Argument`/`Option` accept a new `allow_unknown_entry` flag for `Enum` parameters. When set, a
43
+ command-line token matched by neither a member value nor name is routed through the enum's own
44
+ [`_missing_`](https://docs.python.org/3/library/enum.html#enum.Enum._missing_) hook, so an
45
+ enum can resolve aliases, alternate spellings, or special keywords. A token that `_missing_`
46
+ declines (returns `None`) is still rejected.
47
+ - `@with_annotated` now supports a union of `Enum` subclasses (e.g. `EnumA | EnumB`). Each
48
+ member keeps its own converter and a token resolves to the first member that accepts it, so
49
+ when two members share a representation the earlier one in the union wins. A member whose
50
+ `_missing_` raises on a token declines it (the next member is still tried) rather than
51
+ aborting the union, and a merged "choose from ..." error is raised only when every member
52
+ declines. Unions containing a `Literal` or any non-`Enum` member are still rejected as
53
+ ambiguous.
54
+ - `Argument`/`Option` accept new `converter` and `preprocess` hooks for custom string
55
+ conversion, giving `@with_annotated` parity with a hand-built `add_argument(type=...)` (a raw
56
+ `type=` in the metadata is still rejected). `converter` is a `Callable[[str], Any]` that
57
+ replaces the inferred `type=` converter; because it owns the conversion, the annotation may be
58
+ any type (an otherwise unsupported type like `datetime`, or an otherwise-ambiguous
59
+ multi-member union like `int | str`, becomes legal) and the inferred `choices`/completer are
60
+ dropped. `preprocess` is a `Callable[[str], str]` that runs before the inferred converter,
61
+ transforming the raw token while keeping the inferred `type=`/`choices`/completer (e.g.
62
+ `preprocess=str.lower` on an `Enum`). The two are mutually exclusive on one parameter and
63
+ neither may be combined with a value-less action.
64
+ - `@with_annotated` now supports reusable argument blocks: a parameter typed with a `@dataclass`
65
+ that subclasses the new `cmd2.ArgumentBlock` trait expands each field into a flat command-line
66
+ argument, and the parsed values are reconstructed into a dataclass instance passed to the
67
+ command, letting several commands reuse the same fields without duplication. See the
68
+ [annotated](docs/features/annotated.md) documentation.
69
+ - A command can share an argument block with its subcommands via `cmd2_base_args` /
70
+ `cmd2_parent_args` parameters, passing parent-level options down without redeclaring them.
71
+
72
+ ## 4.0.0 (June 5, 2026)
2
73
 
3
74
  ### Summary
4
75
 
@@ -13,6 +13,8 @@ Python project, which utilizes `uv` for environment and package management.
13
13
  - To run programs directly from a PyPI package (installing it on the fly if necessary), use
14
14
  `uvx ...` (shortcut for `uv tool run`).
15
15
  - **New Dependencies:** If a new dependency is required, please state the reason for its inclusion.
16
+ - Do not commit spec, plan, or markdown documents to git without asking first.
17
+ - Save plans to `~/.superpowers/plans/` instead of the project directory.
16
18
 
17
19
  ## Python Code Standards
18
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmd2
3
- Version: 4.0.0rc2
3
+ Version: 4.1.0
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
@@ -55,7 +55,7 @@ of cmd to make your life easier and eliminates much of the boilerplate code whic
55
55
  when using cmd.
56
56
 
57
57
  > :warning: **If you are upgrading from an older version of `cmd2`, both `3.x` and `4.x` have some
58
- > significant backwards incompatibilities from version `2.x`. Please see the
58
+ > significant backwards incompatibilities from previous versions. Please see the
59
59
  > [CHANGELOG](./CHANGELOG.md) for info on what has changed and the
60
60
  > [Migration Guide](https://cmd2.readthedocs.io/en/latest/upgrades/) for tips on upgrading from an
61
61
  > older version of `cmd2` to `4.x`**
@@ -183,23 +183,25 @@ reproduce the bug. At a minimum, please state the following:
183
183
 
184
184
  ## Projects using cmd2
185
185
 
186
- | Application Name | Description | Organization or Author |
187
- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
188
- | [CephFS Shell](https://github.com/ceph/ceph) | The Ceph File System, or CephFS, is a POSIX-compliant file system built on top of Ceph’s distributed object store | [ceph](https://ceph.com/) |
189
- | [garak](https://github.com/NVIDIA/garak) | LLM vulnerability scanner that checks if an LLM can be made to fail in a way we don't want | [NVIDIA](https://github.com/NVIDIA) |
190
- | [medusa](https://github.com/Ch0pin/medusa) | Binary instrumentation framework that that automates processes for the dynamic analysis of Android and iOS Applications | [Ch0pin](https://github.com/Ch0pin) |
191
- | [InternalBlue](https://github.com/seemoo-lab/internalblue) | Bluetooth experimentation framework for Broadcom and Cypress chips | [Secure Mobile Networking Lab](https://github.com/seemoo-lab) |
192
- | [SCCMHunter](https://github.com/garrettfoster13/sccmhunter) | A post-ex tool built to streamline identifying, profiling, and attacking SCCM related assets in an Active Directory domain | [Garret Foster](https://github.com/garrettfoster13) |
193
- | [Unipacker](https://github.com/unipacker/unipacker) | Automatic and platform-independent unpacker for Windows binaries based on emulation | [unipacker](https://github.com/unipacker) |
194
- | [Frankenstein](https://github.com/seemoo-lab/frankenstein) | Broadcom and Cypress firmware emulation for fuzzing and further full-stack debugging | [Secure Mobile Networking Lab](https://github.com/seemoo-lab) |
195
- | [Poseidon](https://github.com/faucetsdn/poseidon) | Leverages software-defined networks (SDNs) to acquire and then feed network traffic to a number of machine learning techniques. | [Faucet SDN](https://github.com/faucetsdn) |
196
- | [DFTimewolf](https://github.com/log2timeline/dftimewolf) | A framework for orchestrating forensic collection, processing and data export | [log2timeline](https://github.com/log2timeline) |
197
- | [GAP SDK](https://github.com/GreenWaves-Technologies/gap_sdk) | SDK for Greenwaves Technologies' GAP8 IoT Application Processor | [GreenWaves Technologies](https://github.com/GreenWaves-Technologies) |
198
- | [REW Sploit](https://github.com/REW-sploit/REW-sploit) | Emulate and Dissect Metasploit Framework (MSF) and other attacks | [REW-sploit](https://github.com/REW-sploit) |
199
- | [tomcatmanager](https://github.com/tomcatmanager/tomcatmanager) | A command line tool and python library for managing a tomcat server | [tomcatmanager](https://github.com/tomcatmanager) |
200
- | [Falcon Toolkit](https://github.com/CrowdStrike/Falcon-Toolkit) | Unleash the power of the CrowdStrike Falcon Platform at the CLI | [CrowdStrike](https://github.com/CrowdStrike) |
201
- | [EXPLIoT](https://gitlab.com/expliot_framework/expliot) | Internet of Things Security Testing and Exploitation framework | [expliot_framework](https://gitlab.com/expliot_framework/) |
202
- | [Pobshell](https://github.com/pdalloz/pobshell) | A Bash‑like shell for live Python objects: `cd`, `ls`, `cat`, `find` and _CLI piping_ for object code, str values & more | [Peter Dalloz](https://www.linkedin.com/in/pdalloz) |
186
+ | Application Name | Description | Organization or Author |
187
+ | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
188
+ | [CephFS Shell](https://github.com/ceph/ceph) | The Ceph File System, or CephFS, is a POSIX-compliant file system built on top of Ceph’s distributed object store | [ceph](https://ceph.com/) |
189
+ | [garak](https://github.com/NVIDIA/garak) | LLM vulnerability scanner that checks if an LLM can be made to fail in a way we don't want | [NVIDIA](https://github.com/NVIDIA) |
190
+ | [Argus](https://github.com/jasonxtn/argus) | The Ultimate Information Gathering Toolkit | [JASON13](https://github.com/jasonxtn) |
191
+ | [medusa](https://github.com/Ch0pin/medusa) | Binary instrumentation framework that that automates processes for the dynamic analysis of Android and iOS Applications | [Ch0pin](https://github.com/Ch0pin) |
192
+ | [InternalBlue](https://github.com/seemoo-lab/internalblue) | Bluetooth experimentation framework for Broadcom and Cypress chips | [Secure Mobile Networking Lab](https://github.com/seemoo-lab) |
193
+ | [SCCMHunter](https://github.com/garrettfoster13/sccmhunter) | A post-ex tool built to streamline identifying, profiling, and attacking SCCM related assets in an Active Directory domain | [Garret Foster](https://github.com/garrettfoster13) |
194
+ | [Unipacker](https://github.com/unipacker/unipacker) | Automatic and platform-independent unpacker for Windows binaries based on emulation | [unipacker](https://github.com/unipacker) |
195
+ | [Frankenstein](https://github.com/seemoo-lab/frankenstein) | Broadcom and Cypress firmware emulation for fuzzing and further full-stack debugging | [Secure Mobile Networking Lab](https://github.com/seemoo-lab) |
196
+ | [Poseidon](https://github.com/faucetsdn/poseidon) | Leverages software-defined networks (SDNs) to acquire and then feed network traffic to a number of machine learning techniques. | [Faucet SDN](https://github.com/faucetsdn) |
197
+ | [DFTimewolf](https://github.com/log2timeline/dftimewolf) | A framework for orchestrating forensic collection, processing and data export | [log2timeline](https://github.com/log2timeline) |
198
+ | [LazyOwn](https://github.com/grisuno/LazyOwn) | The first RedTeam/APT Framework with an AI-powered C&C, featuring rootkits to conceal campaigns, undetectable malleable implants | [Grisuno](https://github.com/grisuno) |
199
+ | [GAP SDK](https://github.com/GreenWaves-Technologies/gap_sdk) | SDK for Greenwaves Technologies' GAP8 IoT Application Processor | [GreenWaves Technologies](https://github.com/GreenWaves-Technologies) |
200
+ | [REW Sploit](https://github.com/REW-sploit/REW-sploit) | Emulate and Dissect Metasploit Framework (MSF) and other attacks | [REW-sploit](https://github.com/REW-sploit) |
201
+ | [tomcatmanager](https://github.com/tomcatmanager/tomcatmanager) | A command line tool and python library for managing a tomcat server | [tomcatmanager](https://github.com/tomcatmanager) |
202
+ | [Falcon Toolkit](https://github.com/CrowdStrike/Falcon-Toolkit) | Unleash the power of the CrowdStrike Falcon Platform at the CLI | [CrowdStrike](https://github.com/CrowdStrike) |
203
+ | [EXPLIoT](https://gitlab.com/expliot_framework/expliot) | Internet of Things Security Testing and Exploitation framework | [expliot_framework](https://gitlab.com/expliot_framework/) |
204
+ | [Pobshell](https://github.com/pdalloz/pobshell) | A Bash‑like shell for live Python objects: `cd`, `ls`, `cat`, `find` and _CLI piping_ for object code, str values & more | [Peter Dalloz](https://www.linkedin.com/in/pdalloz) |
203
205
 
204
206
  Possibly defunct but still good examples
205
207
 
@@ -26,7 +26,7 @@ of cmd to make your life easier and eliminates much of the boilerplate code whic
26
26
  when using cmd.
27
27
 
28
28
  > :warning: **If you are upgrading from an older version of `cmd2`, both `3.x` and `4.x` have some
29
- > significant backwards incompatibilities from version `2.x`. Please see the
29
+ > significant backwards incompatibilities from previous versions. Please see the
30
30
  > [CHANGELOG](./CHANGELOG.md) for info on what has changed and the
31
31
  > [Migration Guide](https://cmd2.readthedocs.io/en/latest/upgrades/) for tips on upgrading from an
32
32
  > older version of `cmd2` to `4.x`**
@@ -154,23 +154,25 @@ reproduce the bug. At a minimum, please state the following:
154
154
 
155
155
  ## Projects using cmd2
156
156
 
157
- | Application Name | Description | Organization or Author |
158
- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
159
- | [CephFS Shell](https://github.com/ceph/ceph) | The Ceph File System, or CephFS, is a POSIX-compliant file system built on top of Ceph’s distributed object store | [ceph](https://ceph.com/) |
160
- | [garak](https://github.com/NVIDIA/garak) | LLM vulnerability scanner that checks if an LLM can be made to fail in a way we don't want | [NVIDIA](https://github.com/NVIDIA) |
161
- | [medusa](https://github.com/Ch0pin/medusa) | Binary instrumentation framework that that automates processes for the dynamic analysis of Android and iOS Applications | [Ch0pin](https://github.com/Ch0pin) |
162
- | [InternalBlue](https://github.com/seemoo-lab/internalblue) | Bluetooth experimentation framework for Broadcom and Cypress chips | [Secure Mobile Networking Lab](https://github.com/seemoo-lab) |
163
- | [SCCMHunter](https://github.com/garrettfoster13/sccmhunter) | A post-ex tool built to streamline identifying, profiling, and attacking SCCM related assets in an Active Directory domain | [Garret Foster](https://github.com/garrettfoster13) |
164
- | [Unipacker](https://github.com/unipacker/unipacker) | Automatic and platform-independent unpacker for Windows binaries based on emulation | [unipacker](https://github.com/unipacker) |
165
- | [Frankenstein](https://github.com/seemoo-lab/frankenstein) | Broadcom and Cypress firmware emulation for fuzzing and further full-stack debugging | [Secure Mobile Networking Lab](https://github.com/seemoo-lab) |
166
- | [Poseidon](https://github.com/faucetsdn/poseidon) | Leverages software-defined networks (SDNs) to acquire and then feed network traffic to a number of machine learning techniques. | [Faucet SDN](https://github.com/faucetsdn) |
167
- | [DFTimewolf](https://github.com/log2timeline/dftimewolf) | A framework for orchestrating forensic collection, processing and data export | [log2timeline](https://github.com/log2timeline) |
168
- | [GAP SDK](https://github.com/GreenWaves-Technologies/gap_sdk) | SDK for Greenwaves Technologies' GAP8 IoT Application Processor | [GreenWaves Technologies](https://github.com/GreenWaves-Technologies) |
169
- | [REW Sploit](https://github.com/REW-sploit/REW-sploit) | Emulate and Dissect Metasploit Framework (MSF) and other attacks | [REW-sploit](https://github.com/REW-sploit) |
170
- | [tomcatmanager](https://github.com/tomcatmanager/tomcatmanager) | A command line tool and python library for managing a tomcat server | [tomcatmanager](https://github.com/tomcatmanager) |
171
- | [Falcon Toolkit](https://github.com/CrowdStrike/Falcon-Toolkit) | Unleash the power of the CrowdStrike Falcon Platform at the CLI | [CrowdStrike](https://github.com/CrowdStrike) |
172
- | [EXPLIoT](https://gitlab.com/expliot_framework/expliot) | Internet of Things Security Testing and Exploitation framework | [expliot_framework](https://gitlab.com/expliot_framework/) |
173
- | [Pobshell](https://github.com/pdalloz/pobshell) | A Bash‑like shell for live Python objects: `cd`, `ls`, `cat`, `find` and _CLI piping_ for object code, str values & more | [Peter Dalloz](https://www.linkedin.com/in/pdalloz) |
157
+ | Application Name | Description | Organization or Author |
158
+ | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
159
+ | [CephFS Shell](https://github.com/ceph/ceph) | The Ceph File System, or CephFS, is a POSIX-compliant file system built on top of Ceph’s distributed object store | [ceph](https://ceph.com/) |
160
+ | [garak](https://github.com/NVIDIA/garak) | LLM vulnerability scanner that checks if an LLM can be made to fail in a way we don't want | [NVIDIA](https://github.com/NVIDIA) |
161
+ | [Argus](https://github.com/jasonxtn/argus) | The Ultimate Information Gathering Toolkit | [JASON13](https://github.com/jasonxtn) |
162
+ | [medusa](https://github.com/Ch0pin/medusa) | Binary instrumentation framework that that automates processes for the dynamic analysis of Android and iOS Applications | [Ch0pin](https://github.com/Ch0pin) |
163
+ | [InternalBlue](https://github.com/seemoo-lab/internalblue) | Bluetooth experimentation framework for Broadcom and Cypress chips | [Secure Mobile Networking Lab](https://github.com/seemoo-lab) |
164
+ | [SCCMHunter](https://github.com/garrettfoster13/sccmhunter) | A post-ex tool built to streamline identifying, profiling, and attacking SCCM related assets in an Active Directory domain | [Garret Foster](https://github.com/garrettfoster13) |
165
+ | [Unipacker](https://github.com/unipacker/unipacker) | Automatic and platform-independent unpacker for Windows binaries based on emulation | [unipacker](https://github.com/unipacker) |
166
+ | [Frankenstein](https://github.com/seemoo-lab/frankenstein) | Broadcom and Cypress firmware emulation for fuzzing and further full-stack debugging | [Secure Mobile Networking Lab](https://github.com/seemoo-lab) |
167
+ | [Poseidon](https://github.com/faucetsdn/poseidon) | Leverages software-defined networks (SDNs) to acquire and then feed network traffic to a number of machine learning techniques. | [Faucet SDN](https://github.com/faucetsdn) |
168
+ | [DFTimewolf](https://github.com/log2timeline/dftimewolf) | A framework for orchestrating forensic collection, processing and data export | [log2timeline](https://github.com/log2timeline) |
169
+ | [LazyOwn](https://github.com/grisuno/LazyOwn) | The first RedTeam/APT Framework with an AI-powered C&C, featuring rootkits to conceal campaigns, undetectable malleable implants | [Grisuno](https://github.com/grisuno) |
170
+ | [GAP SDK](https://github.com/GreenWaves-Technologies/gap_sdk) | SDK for Greenwaves Technologies' GAP8 IoT Application Processor | [GreenWaves Technologies](https://github.com/GreenWaves-Technologies) |
171
+ | [REW Sploit](https://github.com/REW-sploit/REW-sploit) | Emulate and Dissect Metasploit Framework (MSF) and other attacks | [REW-sploit](https://github.com/REW-sploit) |
172
+ | [tomcatmanager](https://github.com/tomcatmanager/tomcatmanager) | A command line tool and python library for managing a tomcat server | [tomcatmanager](https://github.com/tomcatmanager) |
173
+ | [Falcon Toolkit](https://github.com/CrowdStrike/Falcon-Toolkit) | Unleash the power of the CrowdStrike Falcon Platform at the CLI | [CrowdStrike](https://github.com/CrowdStrike) |
174
+ | [EXPLIoT](https://gitlab.com/expliot_framework/expliot) | Internet of Things Security Testing and Exploitation framework | [expliot_framework](https://gitlab.com/expliot_framework/) |
175
+ | [Pobshell](https://github.com/pdalloz/pobshell) | A Bash‑like shell for live Python objects: `cd`, `ls`, `cat`, `find` and _CLI piping_ for object code, str values & more | [Peter Dalloz](https://www.linkedin.com/in/pdalloz) |
174
176
 
175
177
  Possibly defunct but still good examples
176
178
 
@@ -11,7 +11,10 @@ from . import (
11
11
  rich_utils,
12
12
  string_utils,
13
13
  )
14
- from .annotated import with_annotated
14
+ from .annotated import (
15
+ ArgumentBlock,
16
+ with_annotated,
17
+ )
15
18
  from .argparse_completer import set_default_argparse_completer
16
19
  from .argparse_utils import (
17
20
  Cmd2ArgumentParser,
@@ -88,6 +91,8 @@ __all__: list[str] = [ # noqa: RUF022
88
91
  "Choices",
89
92
  "CompletionItem",
90
93
  "Completions",
94
+ # Annotated commands
95
+ "ArgumentBlock",
91
96
  # Decorators
92
97
  "with_annotated",
93
98
  "with_argument_list",