cmd2 2.6.2__tar.gz → 3.0.0b1__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 (398) hide show
  1. {cmd2-2.6.2 → cmd2-3.0.0b1}/.pre-commit-config.yaml +4 -4
  2. {cmd2-2.6.2 → cmd2-3.0.0b1}/CHANGELOG.md +82 -29
  3. cmd2-3.0.0b1/GEMINI.md +38 -0
  4. {cmd2-2.6.2 → cmd2-3.0.0b1}/Makefile +2 -2
  5. {cmd2-2.6.2 → cmd2-3.0.0b1}/PKG-INFO +23 -44
  6. {cmd2-2.6.2 → cmd2-3.0.0b1}/README.md +17 -17
  7. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/__init__.py +41 -38
  8. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/argparse_completer.py +80 -81
  9. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/argparse_custom.py +359 -151
  10. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/clipboard.py +1 -1
  11. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/cmd2.py +1272 -845
  12. cmd2-3.0.0b1/cmd2/colors.py +270 -0
  13. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/command_definition.py +13 -5
  14. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/constants.py +0 -6
  15. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/decorators.py +41 -104
  16. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/exceptions.py +1 -1
  17. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/history.py +7 -11
  18. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/parsing.py +12 -17
  19. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/plugin.py +1 -2
  20. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/py_bridge.py +15 -10
  21. cmd2-3.0.0b1/cmd2/rich_utils.py +451 -0
  22. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/rl_utils.py +12 -8
  23. cmd2-3.0.0b1/cmd2/string_utils.py +166 -0
  24. cmd2-3.0.0b1/cmd2/styles.py +72 -0
  25. cmd2-3.0.0b1/cmd2/terminal_utils.py +144 -0
  26. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/transcript.py +7 -9
  27. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/utils.py +88 -508
  28. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2.egg-info/PKG-INFO +23 -44
  29. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2.egg-info/SOURCES.txt +131 -26
  30. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2.egg-info/requires.txt +5 -1
  31. cmd2-3.0.0b1/cmd2.png +0 -0
  32. cmd2-3.0.0b1/docs/api/clipboard.md +3 -0
  33. cmd2-3.0.0b1/docs/api/colors.md +3 -0
  34. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/index.md +12 -6
  35. cmd2-3.0.0b1/docs/api/rich_utils.md +3 -0
  36. cmd2-3.0.0b1/docs/api/rl_utils.md +3 -0
  37. cmd2-3.0.0b1/docs/api/string_utils.md +3 -0
  38. cmd2-3.0.0b1/docs/api/styles.md +3 -0
  39. cmd2-3.0.0b1/docs/api/terminal_utils.md +3 -0
  40. cmd2-3.0.0b1/docs/api/transcript.md +3 -0
  41. cmd2-3.0.0b1/docs/api/utils.md +3 -0
  42. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/doc_conventions.md +15 -11
  43. cmd2-3.0.0b1/docs/examples/alternate_event_loops.md +73 -0
  44. cmd2-2.6.2/docs/examples/first_app.md → cmd2-3.0.0b1/docs/examples/getting_started.md +46 -45
  45. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/examples/index.md +1 -1
  46. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/argument_processing.md +115 -53
  47. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/builtin_commands.md +23 -25
  48. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/clipboard.md +5 -11
  49. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/commands.md +35 -32
  50. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/completion.md +35 -34
  51. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/disable_commands.md +17 -7
  52. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/embedded_python_shells.md +11 -10
  53. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/generating_output.md +76 -39
  54. cmd2-3.0.0b1/docs/features/help.md +203 -0
  55. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/history.md +18 -17
  56. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/hooks.md +36 -35
  57. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/index.md +1 -0
  58. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/initialization.md +8 -76
  59. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/misc.md +13 -11
  60. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/modular_commands.md +47 -46
  61. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/multiline_commands.md +5 -5
  62. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/os.md +32 -23
  63. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/packaging.md +15 -22
  64. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/plugins.md +17 -13
  65. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/prompt.md +16 -19
  66. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/redirection.md +7 -5
  67. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/scripting.md +76 -76
  68. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/settings.md +20 -23
  69. cmd2-3.0.0b1/docs/features/shortcuts_aliases_macros.md +106 -0
  70. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/startup_commands.md +8 -6
  71. cmd2-3.0.0b1/docs/features/table_creation.md +12 -0
  72. cmd2-3.0.0b1/docs/features/theme.md +10 -0
  73. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/features/transcripts.md +6 -6
  74. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/index.md +5 -5
  75. cmd2-3.0.0b1/docs/migrating/incompatibilities.md +45 -0
  76. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/migrating/index.md +2 -2
  77. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/migrating/minimum.md +5 -3
  78. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/migrating/next_steps.md +16 -15
  79. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/migrating/why.md +21 -17
  80. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/overview/alternatives.md +10 -7
  81. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/overview/index.md +4 -4
  82. cmd2-3.0.0b1/docs/overview/installation.md +123 -0
  83. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/overview/integrating.md +10 -9
  84. cmd2-3.0.0b1/docs/overview/resources.md +7 -0
  85. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/plugins/external_test.md +4 -4
  86. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/testing.md +7 -7
  87. cmd2-3.0.0b1/docs/upgrades.md +108 -0
  88. cmd2-3.0.0b1/examples/.mypy_cache/3.12/@plugins_snapshot.json +1 -0
  89. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_ast.data.json +1 -0
  90. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_ast.meta.json +1 -0
  91. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_codecs.data.json +1 -0
  92. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_codecs.meta.json +1 -0
  93. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_collections_abc.data.json +1 -0
  94. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_collections_abc.meta.json +1 -0
  95. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_typeshed/__init__.data.json +1 -0
  96. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_typeshed/__init__.meta.json +1 -0
  97. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_typeshed/importlib.data.json +1 -0
  98. cmd2-3.0.0b1/examples/.mypy_cache/3.12/_typeshed/importlib.meta.json +1 -0
  99. cmd2-3.0.0b1/examples/.mypy_cache/3.12/abc.data.json +1 -0
  100. cmd2-3.0.0b1/examples/.mypy_cache/3.12/abc.meta.json +1 -0
  101. cmd2-3.0.0b1/examples/.mypy_cache/3.12/argparse.data.json +1 -0
  102. cmd2-3.0.0b1/examples/.mypy_cache/3.12/argparse.meta.json +1 -0
  103. cmd2-3.0.0b1/examples/.mypy_cache/3.12/builtins.data.json +1 -0
  104. cmd2-3.0.0b1/examples/.mypy_cache/3.12/builtins.meta.json +1 -0
  105. cmd2-3.0.0b1/examples/.mypy_cache/3.12/codecs.data.json +1 -0
  106. cmd2-3.0.0b1/examples/.mypy_cache/3.12/codecs.meta.json +1 -0
  107. cmd2-3.0.0b1/examples/.mypy_cache/3.12/collections/__init__.data.json +1 -0
  108. cmd2-3.0.0b1/examples/.mypy_cache/3.12/collections/__init__.meta.json +1 -0
  109. cmd2-3.0.0b1/examples/.mypy_cache/3.12/collections/abc.data.json +1 -0
  110. cmd2-3.0.0b1/examples/.mypy_cache/3.12/collections/abc.meta.json +1 -0
  111. cmd2-3.0.0b1/examples/.mypy_cache/3.12/contextlib.data.json +1 -0
  112. cmd2-3.0.0b1/examples/.mypy_cache/3.12/contextlib.meta.json +1 -0
  113. cmd2-3.0.0b1/examples/.mypy_cache/3.12/dataclasses.data.json +1 -0
  114. cmd2-3.0.0b1/examples/.mypy_cache/3.12/dataclasses.meta.json +1 -0
  115. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/__init__.data.json +1 -0
  116. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/__init__.meta.json +1 -0
  117. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/_policybase.data.json +1 -0
  118. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/_policybase.meta.json +1 -0
  119. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/charset.data.json +1 -0
  120. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/charset.meta.json +1 -0
  121. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/contentmanager.data.json +1 -0
  122. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/contentmanager.meta.json +1 -0
  123. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/errors.data.json +1 -0
  124. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/errors.meta.json +1 -0
  125. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/header.data.json +1 -0
  126. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/header.meta.json +1 -0
  127. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/message.data.json +1 -0
  128. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/message.meta.json +1 -0
  129. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/policy.data.json +1 -0
  130. cmd2-3.0.0b1/examples/.mypy_cache/3.12/email/policy.meta.json +1 -0
  131. cmd2-3.0.0b1/examples/.mypy_cache/3.12/enum.data.json +1 -0
  132. cmd2-3.0.0b1/examples/.mypy_cache/3.12/enum.meta.json +1 -0
  133. cmd2-3.0.0b1/examples/.mypy_cache/3.12/genericpath.data.json +1 -0
  134. cmd2-3.0.0b1/examples/.mypy_cache/3.12/genericpath.meta.json +1 -0
  135. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/__init__.data.json +1 -0
  136. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/__init__.meta.json +1 -0
  137. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/_abc.data.json +1 -0
  138. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/_abc.meta.json +1 -0
  139. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/abc.data.json +1 -0
  140. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/abc.meta.json +1 -0
  141. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/machinery.data.json +1 -0
  142. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/machinery.meta.json +1 -0
  143. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/metadata/__init__.data.json +1 -0
  144. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/metadata/__init__.meta.json +1 -0
  145. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/metadata/_meta.data.json +1 -0
  146. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/metadata/_meta.meta.json +1 -0
  147. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/readers.data.json +1 -0
  148. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/readers.meta.json +1 -0
  149. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/resources/__init__.data.json +1 -0
  150. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/resources/__init__.meta.json +1 -0
  151. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/resources/abc.data.json +1 -0
  152. cmd2-3.0.0b1/examples/.mypy_cache/3.12/importlib/resources/abc.meta.json +1 -0
  153. cmd2-3.0.0b1/examples/.mypy_cache/3.12/io.data.json +1 -0
  154. cmd2-3.0.0b1/examples/.mypy_cache/3.12/io.meta.json +1 -0
  155. cmd2-3.0.0b1/examples/.mypy_cache/3.12/os/__init__.data.json +1 -0
  156. cmd2-3.0.0b1/examples/.mypy_cache/3.12/os/__init__.meta.json +1 -0
  157. cmd2-3.0.0b1/examples/.mypy_cache/3.12/os/path.data.json +1 -0
  158. cmd2-3.0.0b1/examples/.mypy_cache/3.12/os/path.meta.json +1 -0
  159. cmd2-3.0.0b1/examples/.mypy_cache/3.12/pathlib.data.json +1 -0
  160. cmd2-3.0.0b1/examples/.mypy_cache/3.12/pathlib.meta.json +1 -0
  161. cmd2-3.0.0b1/examples/.mypy_cache/3.12/posixpath.data.json +1 -0
  162. cmd2-3.0.0b1/examples/.mypy_cache/3.12/posixpath.meta.json +1 -0
  163. cmd2-3.0.0b1/examples/.mypy_cache/3.12/re.data.json +1 -0
  164. cmd2-3.0.0b1/examples/.mypy_cache/3.12/re.meta.json +1 -0
  165. cmd2-3.0.0b1/examples/.mypy_cache/3.12/resource.data.json +1 -0
  166. cmd2-3.0.0b1/examples/.mypy_cache/3.12/resource.meta.json +1 -0
  167. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sre_compile.data.json +1 -0
  168. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sre_compile.meta.json +1 -0
  169. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sre_constants.data.json +1 -0
  170. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sre_constants.meta.json +1 -0
  171. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sre_parse.data.json +1 -0
  172. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sre_parse.meta.json +1 -0
  173. cmd2-3.0.0b1/examples/.mypy_cache/3.12/subprocess.data.json +1 -0
  174. cmd2-3.0.0b1/examples/.mypy_cache/3.12/subprocess.meta.json +1 -0
  175. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sys/__init__.data.json +1 -0
  176. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sys/__init__.meta.json +1 -0
  177. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sys/_monitoring.data.json +1 -0
  178. cmd2-3.0.0b1/examples/.mypy_cache/3.12/sys/_monitoring.meta.json +1 -0
  179. cmd2-3.0.0b1/examples/.mypy_cache/3.12/types.data.json +1 -0
  180. cmd2-3.0.0b1/examples/.mypy_cache/3.12/types.meta.json +1 -0
  181. cmd2-3.0.0b1/examples/.mypy_cache/3.12/typing.data.json +1 -0
  182. cmd2-3.0.0b1/examples/.mypy_cache/3.12/typing.meta.json +1 -0
  183. cmd2-3.0.0b1/examples/.mypy_cache/3.12/typing_extensions.data.json +1 -0
  184. cmd2-3.0.0b1/examples/.mypy_cache/3.12/typing_extensions.meta.json +1 -0
  185. cmd2-3.0.0b1/examples/.mypy_cache/3.12/zipfile/__init__.data.json +1 -0
  186. cmd2-3.0.0b1/examples/.mypy_cache/3.12/zipfile/__init__.meta.json +1 -0
  187. cmd2-3.0.0b1/examples/.mypy_cache/3.12/zipfile/_path.data.json +1 -0
  188. cmd2-3.0.0b1/examples/.mypy_cache/3.12/zipfile/_path.meta.json +1 -0
  189. cmd2-3.0.0b1/examples/.mypy_cache/CACHEDIR.TAG +3 -0
  190. cmd2-3.0.0b1/examples/README.md +93 -0
  191. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/argparse_completion.py +32 -8
  192. cmd2-3.0.0b1/examples/argparse_example.py +176 -0
  193. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/async_printing.py +9 -9
  194. cmd2-3.0.0b1/examples/cmd2_history.dat +0 -0
  195. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/cmd_as_argument.py +1 -1
  196. cmd2-3.0.0b1/examples/color.py +51 -0
  197. cmd2-3.0.0b1/examples/command_sets.py +162 -0
  198. cmd2-3.0.0b1/examples/custom_parser.py +55 -0
  199. cmd2-2.6.2/examples/initialization.py → cmd2-3.0.0b1/examples/getting_started.py +50 -16
  200. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/help_categories.py +10 -8
  201. cmd2-2.6.2/examples/modular_commands_main.py → cmd2-3.0.0b1/examples/modular_commands.py +6 -5
  202. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/python_scripting.py +9 -5
  203. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/remove_builtin_commands.py +1 -1
  204. cmd2-3.0.0b1/examples/rich_tables.py +123 -0
  205. cmd2-3.0.0b1/examples/rich_theme.py +51 -0
  206. cmd2-2.6.2/examples/example.py → cmd2-3.0.0b1/examples/transcript_example.py +3 -3
  207. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/transcripts/exampleSession.txt +1 -1
  208. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/transcripts/transcript_regex.txt +1 -1
  209. {cmd2-2.6.2 → cmd2-3.0.0b1}/mkdocs.yml +12 -3
  210. cmd2-3.0.0b1/package.json +6 -0
  211. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/README.md +2 -2
  212. {cmd2-2.6.2/plugins/template → cmd2-3.0.0b1/plugins/ext_test}/build-pyenvs.sh +2 -2
  213. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/cmd2_ext_test/cmd2_ext_test.py +1 -2
  214. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/noxfile.py +1 -1
  215. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/pyproject.toml +18 -32
  216. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/setup.py +2 -3
  217. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/README.md +13 -17
  218. {cmd2-2.6.2/plugins/ext_test → cmd2-3.0.0b1/plugins/template}/build-pyenvs.sh +2 -2
  219. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/noxfile.py +1 -1
  220. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/setup.py +1 -2
  221. {cmd2-2.6.2 → cmd2-3.0.0b1}/pyproject.toml +7 -12
  222. {cmd2-2.6.2 → cmd2-3.0.0b1}/tasks.py +2 -3
  223. cmd2-3.0.0b1/tests/conftest.py +166 -0
  224. cmd2-3.0.0b1/tests/pyscript/stdout_capture.py +4 -0
  225. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_argparse.py +47 -50
  226. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_argparse_completer.py +52 -45
  227. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_argparse_custom.py +10 -33
  228. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_cmd2.py +616 -348
  229. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_completion.py +107 -13
  230. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_future_annotations.py +1 -1
  231. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_history.py +25 -37
  232. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_parsing.py +2 -2
  233. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_plugin.py +1 -1
  234. cmd2-3.0.0b1/tests/test_rich_utils.py +331 -0
  235. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_run_pyscript.py +35 -31
  236. cmd2-3.0.0b1/tests/test_string_utils.py +215 -0
  237. cmd2-3.0.0b1/tests/test_terminal_utils.py +81 -0
  238. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_transcript.py +2 -3
  239. cmd2-3.0.0b1/tests/test_utils.py +376 -0
  240. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/from_cmdloop.txt +1 -1
  241. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests_isolated/test_commandset/conftest.py +2 -44
  242. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests_isolated/test_commandset/test_argparse_subcommands.py +20 -20
  243. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests_isolated/test_commandset/test_commandset.py +19 -19
  244. cmd2-2.6.2/cmd2/ansi.py +0 -1093
  245. cmd2-2.6.2/cmd2/table_creator.py +0 -1122
  246. cmd2-2.6.2/cmd2.png +0 -0
  247. cmd2-2.6.2/docs/api/ansi.md +0 -3
  248. cmd2-2.6.2/docs/api/table_creator.md +0 -3
  249. cmd2-2.6.2/docs/api/utils.md +0 -57
  250. cmd2-2.6.2/docs/examples/alternate_event_loops.md +0 -72
  251. cmd2-2.6.2/docs/features/help.md +0 -187
  252. cmd2-2.6.2/docs/features/shortcuts_aliases_macros.md +0 -94
  253. cmd2-2.6.2/docs/features/table_creation.md +0 -33
  254. cmd2-2.6.2/docs/migrating/incompatibilities.md +0 -46
  255. cmd2-2.6.2/docs/overview/installation.md +0 -109
  256. cmd2-2.6.2/docs/overview/resources.md +0 -11
  257. cmd2-2.6.2/docs/requirements.txt +0 -7
  258. cmd2-2.6.2/examples/README.md +0 -114
  259. cmd2-2.6.2/examples/alias_startup.py +0 -27
  260. cmd2-2.6.2/examples/arg_decorators.py +0 -60
  261. cmd2-2.6.2/examples/arg_print.py +0 -67
  262. cmd2-2.6.2/examples/basic.py +0 -51
  263. cmd2-2.6.2/examples/colors.py +0 -89
  264. cmd2-2.6.2/examples/custom_parser.py +0 -37
  265. cmd2-2.6.2/examples/decorator_example.py +0 -113
  266. cmd2-2.6.2/examples/first_app.py +0 -58
  267. cmd2-2.6.2/examples/modular_commands_basic.py +0 -35
  268. cmd2-2.6.2/examples/modular_commands_dynamic.py +0 -88
  269. cmd2-2.6.2/examples/modular_subcommands.py +0 -116
  270. cmd2-2.6.2/examples/override_parser.py +0 -23
  271. cmd2-2.6.2/examples/pirate.py +0 -100
  272. cmd2-2.6.2/examples/subcommands.py +0 -116
  273. cmd2-2.6.2/examples/table_creation.py +0 -274
  274. cmd2-2.6.2/package.json +0 -6
  275. cmd2-2.6.2/tests/conftest.py +0 -199
  276. cmd2-2.6.2/tests/pyscript/stdout_capture.py +0 -25
  277. cmd2-2.6.2/tests/test_ansi.py +0 -298
  278. cmd2-2.6.2/tests/test_table_creator.py +0 -725
  279. cmd2-2.6.2/tests/test_utils.py +0 -935
  280. cmd2-2.6.2/tests/transcripts/regex_set.txt +0 -28
  281. {cmd2-2.6.2 → cmd2-3.0.0b1}/.prettierignore +0 -0
  282. {cmd2-2.6.2 → cmd2-3.0.0b1}/.prettierrc +0 -0
  283. {cmd2-2.6.2 → cmd2-3.0.0b1}/LICENSE +0 -0
  284. {cmd2-2.6.2 → cmd2-3.0.0b1}/MANIFEST.in +0 -0
  285. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2/py.typed +0 -0
  286. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2.egg-info/dependency_links.txt +0 -0
  287. {cmd2-2.6.2 → cmd2-3.0.0b1}/cmd2.egg-info/top_level.txt +0 -0
  288. {cmd2-2.6.2 → cmd2-3.0.0b1}/codecov.yml +0 -0
  289. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/argparse_completer.md +0 -0
  290. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/argparse_custom.md +0 -0
  291. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/cmd.md +0 -0
  292. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/command_definition.md +0 -0
  293. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/constants.md +0 -0
  294. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/decorators.md +0 -0
  295. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/exceptions.md +0 -0
  296. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/history.md +0 -0
  297. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/parsing.md +0 -0
  298. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/plugin.md +0 -0
  299. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/api/py_bridge.md +0 -0
  300. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/examples/examples.md +0 -0
  301. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/javascripts/readthedocs.js +0 -0
  302. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/overrides/main.html +0 -0
  303. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/plugins/index.md +0 -0
  304. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/stylesheets/cmd2.css +0 -0
  305. {cmd2-2.6.2 → cmd2-3.0.0b1}/docs/stylesheets/readthedocs.css +0 -0
  306. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/.cmd2rc +0 -0
  307. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/basic_completion.py +0 -0
  308. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/default_categories.py +0 -0
  309. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/dynamic_commands.py +0 -0
  310. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/environment.py +0 -0
  311. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/event_loops.py +0 -0
  312. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/exit_code.py +0 -0
  313. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/hello_cmd2.py +0 -0
  314. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/hooks.py +0 -0
  315. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/migrating.py +0 -0
  316. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/modular_commands/__init__.py +0 -0
  317. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/modular_commands/commandset_basic.py +0 -0
  318. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/modular_commands/commandset_complex.py +0 -0
  319. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/modular_commands/commandset_custominit.py +0 -0
  320. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/paged_output.py +0 -0
  321. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/persistent_history.py +0 -0
  322. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/pretty_print.py +0 -0
  323. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/read_input.py +0 -0
  324. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/remove_settable.py +0 -0
  325. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/scripts/arg_printer.py +0 -0
  326. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/scripts/conditional.py +0 -0
  327. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/scripts/nested.txt +0 -0
  328. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/scripts/quit.txt +0 -0
  329. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/scripts/save_help_text.py +0 -0
  330. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/scripts/script.py +0 -0
  331. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/scripts/script.txt +0 -0
  332. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/tmux_launch.sh +0 -0
  333. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/tmux_split.sh +0 -0
  334. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/transcripts/pirate.transcript +0 -0
  335. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/transcripts/quit.txt +0 -0
  336. {cmd2-2.6.2 → cmd2-3.0.0b1}/examples/unicode_commands.py +0 -0
  337. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/README.txt +0 -0
  338. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/CHANGELOG.md +0 -0
  339. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/cmd2_ext_test/__init__.py +0 -0
  340. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/cmd2_ext_test/py.typed +0 -0
  341. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/cmd2_ext_test/pylintrc +0 -0
  342. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/examples/example.py +0 -0
  343. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/tasks.py +0 -0
  344. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/tests/__init__.py +0 -0
  345. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/tests/pylintrc +0 -0
  346. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/ext_test/tests/test_ext_test.py +0 -0
  347. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/tasks.py +0 -0
  348. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/CHANGELOG.md +0 -0
  349. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/LICENSE +0 -0
  350. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/cmd2_myplugin/__init__.py +0 -0
  351. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/cmd2_myplugin/myplugin.py +0 -0
  352. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/cmd2_myplugin/pylintrc +0 -0
  353. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/examples/example.py +0 -0
  354. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/tasks.py +0 -0
  355. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/tests/__init__.py +0 -0
  356. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/tests/pylintrc +0 -0
  357. {cmd2-2.6.2 → cmd2-3.0.0b1}/plugins/template/tests/test_myplugin.py +0 -0
  358. {cmd2-2.6.2 → cmd2-3.0.0b1}/setup.cfg +0 -0
  359. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/.cmd2rc +0 -0
  360. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/__init__.py +0 -0
  361. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/pyscript/echo.py +0 -0
  362. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/pyscript/environment.py +0 -0
  363. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/pyscript/help.py +0 -0
  364. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/pyscript/py_locals.py +0 -0
  365. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/pyscript/pyscript_dir.py +0 -0
  366. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/pyscript/raises_exception.py +0 -0
  367. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/pyscript/recursive.py +0 -0
  368. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/pyscript/self_in_py.py +0 -0
  369. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/pyscript/stop.py +0 -0
  370. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/relative_multiple.txt +0 -0
  371. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/script.py +0 -0
  372. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/script.txt +0 -0
  373. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/scripts/binary.bin +0 -0
  374. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/scripts/empty.txt +0 -0
  375. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/scripts/help.txt +0 -0
  376. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/scripts/nested.txt +0 -0
  377. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/scripts/one_down.txt +0 -0
  378. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/scripts/postcmds.txt +0 -0
  379. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/scripts/precmds.txt +0 -0
  380. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/scripts/utf8.txt +0 -0
  381. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/test_utils_defining_class.py +0 -0
  382. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/bol_eol.txt +0 -0
  383. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/characterclass.txt +0 -0
  384. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/dotstar.txt +0 -0
  385. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/extension_notation.txt +0 -0
  386. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/failure.txt +0 -0
  387. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/multiline_no_regex.txt +0 -0
  388. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/multiline_regex.txt +0 -0
  389. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/no_output.txt +0 -0
  390. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/no_output_last.txt +0 -0
  391. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/singleslash.txt +0 -0
  392. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/slashes_escaped.txt +0 -0
  393. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/slashslash.txt +0 -0
  394. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/spaces.txt +0 -0
  395. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests/transcripts/word_boundaries.txt +0 -0
  396. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests_isolated/__init__.py +0 -0
  397. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests_isolated/test_commandset/__init__.py +0 -0
  398. {cmd2-2.6.2 → cmd2-3.0.0b1}/tests_isolated/test_commandset/test_categories.py +0 -0
@@ -1,6 +1,6 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: "v5.0.0"
3
+ rev: "v6.0.0"
4
4
  hooks:
5
5
  - id: check-case-conflict
6
6
  - id: check-merge-conflict
@@ -9,7 +9,7 @@ repos:
9
9
  - id: trailing-whitespace
10
10
 
11
11
  - repo: https://github.com/astral-sh/ruff-pre-commit
12
- rev: "v0.12.0"
12
+ rev: "v0.13.0"
13
13
  hooks:
14
14
  - id: ruff-format
15
15
  args: [--config=pyproject.toml]
@@ -21,5 +21,5 @@ repos:
21
21
  hooks:
22
22
  - id: prettier
23
23
  additional_dependencies:
24
- - prettier@3.5.3
25
- - prettier-plugin-toml@2.0.5
24
+ - prettier@3.6.2
25
+ - prettier-plugin-toml@2.0.6
@@ -1,7 +1,64 @@
1
+ ## 3.0.0 (TBD, 2025)
2
+
3
+ ### Summary
4
+
5
+ `cmd2` now has a dependency on [rich](https://github.com/Textualize/rich) for rich text and pretty
6
+ formatting in the terminal. Previously, `cmd2` had a large amount of custom code for this purpose
7
+ that predated the existence of `rich`. This opens the door to even more beautiful `cmd2`
8
+ applications. To get the most out of the new capabilities, we encourage you to spend a little bit of
9
+ time reading the [rich documentation](https://rich.readthedocs.io/).
10
+
11
+ ### Details
12
+
13
+ - Breaking Changes
14
+ - Refactored and modernized styling and utility modules:
15
+ - Removed the legacy `table_creator.py` module in favor of `rich` tables (see the
16
+ [rich_tables.py](https://github.com/python-cmd2/cmd2/blob/main/examples/rich_tables.py)
17
+ example for more info)
18
+ - Moved all string-related functions from `utils.py` to a new `string_utils.py` module
19
+ - Consolidated all string styling functions from `ansi.py` into `string_utils.py`
20
+ - Replaced all text style enums from `ansi.py` with modern `rich` styles
21
+ - Renamed `ansi.py` to `terminal_utils.py` to better reflect its purpose
22
+ - Dropped support for Python 3.9. `cmd2` now requires Python 3.10 or later
23
+ - Replaced `Settable.get_value()` and `Settable.set_value()` methods with a more Pythonic
24
+ `value` property
25
+ - Removed redundant setting of a parser's `prog` value in the `with_argparser()` decorator, as
26
+ this is now handled centrally in `Cmd._build_parser()`
27
+
28
+ - Enhancements
29
+ - Enhanced all print methods (`poutput()`, `perror()`, `ppaged()`, etc.) to natively render
30
+ `rich` objects, enabling beautiful and complex output
31
+ - Simplified the process for setting a custom parser for `cmd2`'s built-in commands. See the
32
+ [custom_parser.py](https://github.com/python-cmd2/cmd2/blob/main/examples/custom_parser.py)
33
+ example for an updated guide
34
+ - Introduced `Cmd.macro_arg_complete()` for tab-completing macro arguments, with default path
35
+ completion that can be easily customized
36
+ - Added `colors.py` and `styles.py` to provide easy access to `rich` color names and manage
37
+ `cmd2`-specific style definitions using `StrEnum` (see the
38
+ [colors.py](https://github.com/python-cmd2/cmd2/blob/main/examples/color.py) example for a
39
+ demonstration of all colors available to your `cmd2` application)
40
+ - Added ability to create a custom theme for a `cmd2` application using `rich_utils.set_theme`
41
+ (see the [rich_theme.py](https://github.com/python-cmd2/cmd2/blob/main/examples/rich_theme.py)
42
+ example for more info)
43
+ - Consolidated multiple redundant examples into a few more comprehensive ones, see:
44
+ - [argparse_example.py](https://github.com/python-cmd2/cmd2/blob/main/examples/argparse_example.py)
45
+ - [command_sets.py](https://github.com/python-cmd2/cmd2/blob/main/examples/command_sets.py)
46
+ - [getting_started.py](https://github.com/python-cmd2/cmd2/blob/main/examples/getting_started.py)
47
+ - Optimized performance of terminal fixup during command finalization by replacing `stty sane`
48
+ with `termios.tcsetattr`
49
+
50
+ - Bug Fixes
51
+ - Fixed a redirection bug where `cmd2` could unintentionally overwrite an application's
52
+ `sys.stdout`
53
+
54
+ ## 2.7.0 (June 30, 2025)
55
+
56
+ - Enhancements
57
+ - Integrated rich-argparse with cmd2's default argparse help formatter (`Cmd2HelpFormatter`).
58
+
1
59
  ## 2.6.2 (June 26, 2025)
2
60
 
3
61
  - Enhancements
4
-
5
62
  - Added explicit support for free-threaded versions of Python, starting with version 3.14
6
63
 
7
64
  - Bug Fixes
@@ -96,7 +153,7 @@
96
153
  prompts.
97
154
  - This fix introduces behavior where an updated prompt won't display after an aborted search
98
155
  until a user presses Enter. See
99
- [async_printing.py](https://github.com/python-cmd2/cmd2/blob/master/examples/async_printing.py)
156
+ [async_printing.py](https://github.com/python-cmd2/cmd2/blob/main/examples/async_printing.py)
100
157
  example for how to handle this case using `Cmd.need_prompt_refresh()` and
101
158
  `Cmd.async_refresh_prompt()`.
102
159
  - Enhancements
@@ -316,8 +373,8 @@
316
373
  persistent history files created with versions older than 2.0.0 are not compatible.
317
374
  - Enhancements
318
375
  - Added support for custom tab completion and up-arrow input history to `cmd2.Cmd2.read_input`.
319
- See [read_input.py](https://github.com/python-cmd2/cmd2/blob/master/examples/read_input.py)
320
- for an example.
376
+ See [read_input.py](https://github.com/python-cmd2/cmd2/blob/main/examples/read_input.py) for
377
+ an example.
321
378
  - Added `cmd2.exceptions.PassThroughException` to raise unhandled command exceptions instead of
322
379
  printing them.
323
380
  - Added support for ANSI styles and newlines in tab completion results using
@@ -529,7 +586,7 @@
529
586
  - See [table_creation](https://cmd2.readthedocs.io/en/latest/features/table_creation.html)
530
587
  documentation for an overview.
531
588
  - See
532
- [table_creation.py](https://github.com/python-cmd2/cmd2/blob/master/examples/table_creation.py)
589
+ [table_creation.py](https://github.com/python-cmd2/cmd2/blob/main/examples/table_creation.py)
533
590
  for an example.
534
591
  - Added the following exceptions to the public API
535
592
  - `SkipPostcommandHooks` - Custom exception class for when a command has a failure bad
@@ -781,7 +838,7 @@
781
838
  - Greatly simplified using argparse-based tab completion. The new interface is a complete
782
839
  overhaul that breaks the previous way of specifying completion and choices functions. See
783
840
  header of
784
- [argparse_custom.py](https://github.com/python-cmd2/cmd2/blob/master/cmd2/argparse_custom.py)
841
+ [argparse_custom.py](https://github.com/python-cmd2/cmd2/blob/main/cmd2/argparse_custom.py)
785
842
  for more information.
786
843
  - Enabled tab completion on multiline commands
787
844
  - **Renamed Commands Notice**
@@ -1104,7 +1161,7 @@
1104
1161
  - Added `async_alert`, `async_update_prompt`, and `set_window_title` functions
1105
1162
  - These allow you to provide feedback to the user in an asynchronous fashion, meaning alerts
1106
1163
  can display when the user is still entering text at the prompt. See
1107
- [async_printing.py](https://github.com/python-cmd2/cmd2/blob/master/examples/async_printing.py)
1164
+ [async_printing.py](https://github.com/python-cmd2/cmd2/blob/main/examples/async_printing.py)
1108
1165
  for an example.
1109
1166
  - Cross-platform colored output support
1110
1167
  - `colorama` gets initialized properly in `Cmd.__init()`
@@ -1142,7 +1199,7 @@
1142
1199
  - New dependency on `attrs` third party module
1143
1200
  - Added `matches_sorted` member to support custom sorting of tab completion matches
1144
1201
  - Added
1145
- [tab_autocomp_dynamic.py](https://github.com/python-cmd2/cmd2/blob/master/examples/tab_autocomp_dynamic.py)
1202
+ [tab_autocomp_dynamic.py](https://github.com/python-cmd2/cmd2/blob/main/examples/tab_autocomp_dynamic.py)
1146
1203
  example
1147
1204
  - Demonstrates updating the argparse object during init instead of during class construction
1148
1205
  - Deprecations
@@ -1185,7 +1242,7 @@
1185
1242
  - If `chop` is `False`, then `self.pager` is used as the pager
1186
1243
  - Otherwise `self.pager_chop` is used as the pager
1187
1244
  - Greatly improved the
1188
- [table_display.py](https://github.com/python-cmd2/cmd2/blob/master/examples/table_display.py)
1245
+ [table_display.py](https://github.com/python-cmd2/cmd2/blob/main/examples/table_display.py)
1189
1246
  example
1190
1247
  - Now uses the new [tableformatter](https://github.com/python-tableformatter/tableformatter)
1191
1248
  module which looks better than `tabulate`
@@ -1219,7 +1276,7 @@
1219
1276
  - Enhancements
1220
1277
  - Automatic completion of `argparse` arguments via `cmd2.argparse_completer.AutoCompleter`
1221
1278
  - See the
1222
- [tab_autocompletion.py](https://github.com/python-cmd2/cmd2/blob/master/examples/tab_autocompletion.py)
1279
+ [tab_autocompletion.py](https://github.com/python-cmd2/cmd2/blob/main/examples/tab_autocompletion.py)
1223
1280
  example for a demonstration of how to use this feature
1224
1281
  - `cmd2` no longer depends on the `six` module
1225
1282
  - `cmd2` is now a multi-file Python package instead of a single-file module
@@ -1257,7 +1314,7 @@
1257
1314
  [Argument Processing](http://cmd2.readthedocs.io/en/latest/argument_processing.html)
1258
1315
  section of the documentation for more information on these decorators
1259
1316
  - Alternatively, see the
1260
- [argparse_example.py](https://github.com/python-cmd2/cmd2/blob/master/examples/argparse_example.py)
1317
+ [argparse_example.py](https://github.com/python-cmd2/cmd2/blob/main/examples/argparse_example.py)
1261
1318
  - Deleted `cmd_with_subs_completer`, `get_subcommands`, and `get_subcommand_completer`
1262
1319
  - Replaced by default AutoCompleter implementation for all commands using argparse
1263
1320
  - Deleted support for old method of calling application commands with `cmd()` and `self`
@@ -1287,12 +1344,10 @@
1287
1344
  ## 0.8.5 (April 15, 2018)
1288
1345
 
1289
1346
  - Bug Fixes
1290
-
1291
1347
  - Fixed a bug with all argument decorators where the wrapped function wasn't returning a value
1292
1348
  and thus couldn't cause the cmd2 app to quit
1293
1349
 
1294
1350
  - Enhancements
1295
-
1296
1351
  - Added support for verbose help with -v where it lists a brief summary of what each command
1297
1352
  does
1298
1353
  - Added support for categorizing commands into groups within the help menu
@@ -1300,7 +1355,7 @@
1300
1355
  [Grouping Commands](http://cmd2.readthedocs.io/en/latest/argument_processing.html?highlight=verbose#grouping-commands)
1301
1356
  section of the docs for more info
1302
1357
  - See
1303
- [help_categories.py](https://github.com/python-cmd2/cmd2/blob/master/examples/help_categories.py)
1358
+ [help_categories.py](https://github.com/python-cmd2/cmd2/blob/main/examples/help_categories.py)
1304
1359
  for an example
1305
1360
  - Tab completion of paths now supports ~user user path expansion
1306
1361
  - Simplified implementation of various tab completion functions so they no longer require
@@ -1324,12 +1379,10 @@
1324
1379
  ## 0.8.3 (April 09, 2018)
1325
1380
 
1326
1381
  - Bug Fixes
1327
-
1328
1382
  - Fixed `help` command not calling functions for help topics
1329
1383
  - Fixed not being able to use quoted paths when redirecting with `<` and `>`
1330
1384
 
1331
1385
  - Enhancements
1332
-
1333
1386
  - Tab completion has been overhauled and now supports completion of strings with quotes and
1334
1387
  spaces.
1335
1388
  - Tab completion will automatically add an opening quote if a string with a space is completed.
@@ -1352,8 +1405,8 @@
1352
1405
  - `cmd_with_subs_completer()` no longer takes an argument called `base`. Adding tab completion
1353
1406
  to subcommands has been simplified to declaring it in the subcommand parser's default
1354
1407
  settings. This easily allows arbitrary completers like path_complete to be used. See
1355
- [subcommands.py](https://github.com/python-cmd2/cmd2/blob/master/examples/subcommands.py) for
1356
- an example of how to use tab completion in subcommands. In addition, the docstring for
1408
+ [subcommands.py](https://github.com/python-cmd2/cmd2/blob/main/examples/subcommands.py) for an
1409
+ example of how to use tab completion in subcommands. In addition, the docstring for
1357
1410
  `cmd_with_subs_completer()` offers more details.
1358
1411
 
1359
1412
  ## 0.8.2 (March 21, 2018)
@@ -1371,12 +1424,12 @@
1371
1424
  attribute to enable canceling current line instead of quitting when Ctrl+C is typed
1372
1425
  - Added possibility of having readline history preservation in a SubMenu
1373
1426
  - Added
1374
- [table_display.py](https://github.com/python-cmd2/cmd2/blob/master/examples/table_display.py)
1427
+ [table_display.py](https://github.com/python-cmd2/cmd2/blob/main/examples/table_display.py)
1375
1428
  example to demonstrate how to display tabular data
1376
1429
  - Added command aliasing with `alias` and `unalias` commands
1377
1430
  - Added the ability to load an initialization script at startup
1378
1431
  - See
1379
- [alias_startup.py](https://github.com/python-cmd2/cmd2/blob/master/examples/alias_startup.py)
1432
+ [alias_startup.py](https://github.com/python-cmd2/cmd2/blob/main/examples/alias_startup.py)
1380
1433
  for an example
1381
1434
  - Added a default SIGINT handler which terminates any open pipe subprocesses and re-raises a
1382
1435
  KeyboardInterrupt
@@ -1389,14 +1442,14 @@
1389
1442
  - Fixed a bug in a unit test which would fail if your home directory was empty on a Linux system
1390
1443
  - Fixed outdated help text for the **edit** command
1391
1444
  - Fixed outdated
1392
- [remove_unused.py](https://github.com/python-cmd2/cmd2/blob/master/examples/remove_unused.py)
1445
+ [remove_unused.py](https://github.com/python-cmd2/cmd2/blob/main/examples/remove_unused.py)
1393
1446
  - Enhancements
1394
1447
  - Added support for sub-menus.
1395
- - See [submenus.py](https://github.com/python-cmd2/cmd2/blob/master/examples/submenus.py)
1396
- for an example of how to use it
1448
+ - See [submenus.py](https://github.com/python-cmd2/cmd2/blob/main/examples/submenus.py) for
1449
+ an example of how to use it
1397
1450
  - Added option for persistent readline history
1398
1451
  - See
1399
- [persistent_history.py](https://github.com/python-cmd2/cmd2/blob/master/examples/persistent_history.py)
1452
+ [persistent_history.py](https://github.com/python-cmd2/cmd2/blob/main/examples/persistent_history.py)
1400
1453
  for an example
1401
1454
  - See the
1402
1455
  [Searchable command history](http://cmd2.readthedocs.io/en/latest/freefeatures.html#searchable-command-history)
@@ -1407,10 +1460,10 @@
1407
1460
  - `exclude_from_help` and `excludeFromHistory` are now instance instead of class attributes
1408
1461
  - Added flag and index based tab completion helper functions
1409
1462
  - See
1410
- [tab_completion.py](https://github.com/python-cmd2/cmd2/blob/master/examples/tab_completion.py)
1463
+ [tab_completion.py](https://github.com/python-cmd2/cmd2/blob/main/examples/tab_completion.py)
1411
1464
  - Added support for displaying output which won't fit on the screen via a pager using `ppaged()`
1412
1465
  - See
1413
- [paged_output.py](https://github.com/python-cmd2/cmd2/blob/master/examples/paged_output.py)
1466
+ [paged_output.py](https://github.com/python-cmd2/cmd2/blob/main/examples/paged_output.py)
1414
1467
  - Attributes Removed (**can cause breaking changes**)
1415
1468
  - `abbrev` - Removed support for abbreviated commands
1416
1469
  - Good tab completion makes this unnecessary and its presence could cause harmful unintended
@@ -1437,13 +1490,13 @@
1437
1490
  - See the [Argument Processing](http://cmd2.readthedocs.io/en/latest/argument_processing.html)
1438
1491
  section of the documentation for more information on these decorators
1439
1492
  - Alternatively, see the
1440
- [argparse_example.py](https://github.com/python-cmd2/cmd2/blob/master/examples/argparse_example.py)
1441
- and [arg_print.py](https://github.com/python-cmd2/cmd2/blob/master/examples/arg_print.py)
1493
+ [argparse_example.py](https://github.com/python-cmd2/cmd2/blob/main/examples/argparse_example.py)
1494
+ and [arg_print.py](https://github.com/python-cmd2/cmd2/blob/main/examples/arg_print.py)
1442
1495
  examples
1443
1496
  - Added support for Argparse subcommands when using the **with_argument_parser** or \*
1444
1497
  \*with_argparser_and_unknown_args\*\* decorators
1445
1498
  - See
1446
- [subcommands.py](https://github.com/python-cmd2/cmd2/blob/master/examples/subcommands.py)
1499
+ [subcommands.py](https://github.com/python-cmd2/cmd2/blob/main/examples/subcommands.py)
1447
1500
  for an example of how to use subcommands
1448
1501
  - Tab completion of subcommand names is automatically supported
1449
1502
  - The **\_\_relative_load** command is now hidden from the help menu by default
cmd2-3.0.0b1/GEMINI.md ADDED
@@ -0,0 +1,38 @@
1
+ # Instructions for Gemini CLI in a `uv` Python project
2
+
3
+ This `GEMINI.md` file provides context and instructions for the Gemini CLI when working with this
4
+ Python project, which utilizes `uv` for environment and package management.
5
+
6
+ ## General Instructions
7
+
8
+ - **Environment Management:** Prefer using `uv` for all Python environment management tasks.
9
+ - **Package Installation:** Always use `uv` to install packages and ensure they are installed within
10
+ the project's virtual environment.
11
+ - **Running Scripts/Commands:**
12
+ - To run Python scripts within the project's virtual environment, use `uv run ...`.
13
+ - To run programs directly from a PyPI package (installing it on the fly if necessary), use
14
+ `uvx ...` (shortcut for `uv tool run`).
15
+ - **New Dependencies:** If a new dependency is required, please state the reason for its inclusion.
16
+
17
+ ## Python Code Standards
18
+
19
+ To ensure Python code adheres to required standards, the following commands **must** be run before
20
+ creating or modifying any `.py` files:
21
+
22
+ ```bash
23
+ make check
24
+ ```
25
+
26
+ To run unit tests use the following command:
27
+
28
+ ```bash
29
+ make test
30
+ ```
31
+
32
+ To make sure the documentation builds properly, use the following command:
33
+
34
+ ```bash
35
+ make docs-test
36
+ ```
37
+
38
+ All 3 of the above commands should be run prior to committing code.
@@ -33,8 +33,8 @@ typecheck: ## Perform type checking
33
33
  .PHONY: test
34
34
  test: ## Test the code with pytest.
35
35
  @echo "🚀 Testing code: Running pytest"
36
- @uv run python -m pytest --cov --cov-config=pyproject.toml --cov-report=xml tests
37
- @uv run python -m pytest --cov --cov-config=pyproject.toml --cov-report=xml tests_isolated
36
+ @uv run python -Xutf8 -m pytest --cov --cov-config=pyproject.toml --cov-report=xml tests
37
+ @uv run python -Xutf8 -m pytest --cov --cov-config=pyproject.toml --cov-report=xml tests_isolated
38
38
 
39
39
  .PHONY: docs-test
40
40
  docs-test: ## Test if documentation can be built without warnings or errors
@@ -1,39 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmd2
3
- Version: 2.6.2
3
+ Version: 3.0.0b1
4
4
  Summary: cmd2 - quickly build feature-rich and user-friendly interactive command line applications in Python
5
5
  Author: cmd2 Contributors
6
- License: The MIT License (MIT)
7
-
8
- Copyright (c) 2008-2025 Catherine Devlin and others
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in
18
- all copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26
- THE SOFTWARE.
27
-
6
+ License-Expression: MIT
28
7
  Keywords: CLI,cmd,command,interactive,prompt,Python
29
8
  Classifier: Development Status :: 5 - Production/Stable
30
9
  Classifier: Environment :: Console
31
10
  Classifier: Operating System :: OS Independent
32
11
  Classifier: Intended Audience :: Developers
33
12
  Classifier: Intended Audience :: System Administrators
34
- Classifier: License :: OSI Approved :: MIT License
35
13
  Classifier: Programming Language :: Python :: 3 :: Only
36
- Classifier: Programming Language :: Python :: 3.9
37
14
  Classifier: Programming Language :: Python :: 3.10
38
15
  Classifier: Programming Language :: Python :: 3.11
39
16
  Classifier: Programming Language :: Python :: 3.12
@@ -41,20 +18,22 @@ Classifier: Programming Language :: Python :: 3.13
41
18
  Classifier: Programming Language :: Python :: 3.14
42
19
  Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
43
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
44
- Requires-Python: >=3.9
21
+ Requires-Python: >=3.10
45
22
  Description-Content-Type: text/markdown
46
23
  License-File: LICENSE
24
+ Requires-Dist: backports.strenum; python_version == "3.10"
47
25
  Requires-Dist: gnureadline>=8; platform_system == "Darwin"
48
26
  Requires-Dist: pyperclip>=1.8
49
27
  Requires-Dist: pyreadline3>=3.4; platform_system == "Windows"
50
- Requires-Dist: wcwidth>=0.2.10
28
+ Requires-Dist: rich>=14.1.0
29
+ Requires-Dist: rich-argparse>=1.7.1
51
30
  Dynamic: license-file
52
31
 
53
32
  <h1 align="center">cmd2 : immersive interactive command line applications</h1>
54
33
 
55
34
  [![Latest Version](https://img.shields.io/pypi/v/cmd2.svg?style=flat-square&label=latest%20stable%20version)](https://pypi.python.org/pypi/cmd2/)
56
35
  [![GitHub Actions](https://github.com/python-cmd2/cmd2/workflows/CI/badge.svg)](https://github.com/python-cmd2/cmd2/actions?query=workflow%3ACI)
57
- [![codecov](https://codecov.io/gh/python-cmd2/cmd2/branch/master/graph/badge.svg)](https://codecov.io/gh/python-cmd2/cmd2)
36
+ [![codecov](https://codecov.io/gh/python-cmd2/cmd2/branch/main/graph/badge.svg)](https://codecov.io/gh/python-cmd2/cmd2)
58
37
  [![Documentation Status](https://readthedocs.org/projects/cmd2/badge/?version=latest)](http://cmd2.readthedocs.io/en/latest/?badge=latest)
59
38
  <a href="https://discord.gg/RpVG6tk"><img src="https://img.shields.io/badge/chat-on%20discord-7289da.svg" alt="Chat"></a>
60
39
 
@@ -68,7 +47,7 @@ Dynamic: license-file
68
47
  <a href="#projects-using-cmd2">Projects using cmd2</a> •
69
48
  </p>
70
49
 
71
- [![Screenshot](https://raw.githubusercontent.com/python-cmd2/cmd2/master/cmd2.png)](https://youtu.be/DDU_JH6cFsA)
50
+ [![Screenshot](https://raw.githubusercontent.com/python-cmd2/cmd2/main/cmd2.png)](https://youtu.be/DDU_JH6cFsA)
72
51
 
73
52
  cmd2 is a tool for building interactive command line applications in Python. Its goal is to make it
74
53
  quick and easy for developers to build feature-rich and user-friendly interactive command line
@@ -77,9 +56,13 @@ applications. It provides a simple API which is an extension of Python's built-i
77
56
  of cmd to make your life easier and eliminates much of the boilerplate code which would be necessary
78
57
  when using cmd.
79
58
 
59
+ > :warning: **cmd2 is now "feature complete" for the `2.x` branch and is actively working on the
60
+ > 3.0.0 release on the `main` branch. New features will only be addressed in 3.x moving forwards. If
61
+ > need be, we will still fix bugs in 2.x.**
62
+
80
63
  ## The developers toolbox
81
64
 
82
- ![system schema](https://raw.githubusercontent.com/python-cmd2/cmd2/master/.github/images/graph.drawio.png)
65
+ ![system schema](https://raw.githubusercontent.com/python-cmd2/cmd2/main/.github/images/graph.drawio.png)
83
66
 
84
67
  When creating solutions developers have no shortage of tools to create rich and smart user
85
68
  interfaces. System administrators have long been duct taping together brittle workflows based on a
@@ -87,7 +70,7 @@ menagerie of simple command line tools created by strangers on github and the gu
87
70
  Unfortunately, when CLIs become significantly complex the ease of command discoverability tends to
88
71
  fade quickly. On the other hand, Web and traditional desktop GUIs are first in class when it comes
89
72
  to easily discovering functionality. The price we pay for beautifully colored displays is complexity
90
- required to aggregate disperate applications into larger systems. `cmd2` fills the niche between
73
+ required to aggregate disparate applications into larger systems. `cmd2` fills the niche between
91
74
  high [ease of command discovery](https://clig.dev/#ease-of-discovery) applications and smart
92
75
  workflow automation systems.
93
76
 
@@ -135,7 +118,7 @@ On all operating systems, the latest stable version of `cmd2` can be installed u
135
118
  pip install -U cmd2
136
119
  ```
137
120
 
138
- cmd2 works with Python 3.9+ on Windows, macOS, and Linux. It is pure Python code with few 3rd-party
121
+ cmd2 works with Python 3.10+ on Windows, macOS, and Linux. It is pure Python code with few 3rd-party
139
122
  dependencies. It works with both conventional CPython and free-threaded variants.
140
123
 
141
124
  For information on other installation options, see
@@ -153,20 +136,16 @@ examples.
153
136
 
154
137
  ## Tutorials
155
138
 
156
- - PyOhio 2019 presentation:
157
- - [video](https://www.youtube.com/watch?v=pebeWrTqIIw)
158
- - [slides](https://github.com/python-cmd2/talks/blob/master/PyOhio_2019/cmd2-PyOhio_2019.pdf)
159
- - [example code](https://github.com/python-cmd2/talks/tree/master/PyOhio_2019/examples)
139
+ - [cmd2 example applications](https://github.com/python-cmd2/cmd2/tree/main/examples)
140
+ - Basic cmd2 examples to demonstrate how to use various features
141
+ - [Advanced Examples](https://github.com/jayrod/cmd2-example-apps)
142
+ - More complex examples that demonstrate more featuers about how to put together a complete
143
+ application
160
144
  - [Cookiecutter](https://github.com/cookiecutter/cookiecutter) Templates from community
161
145
  - Basic cookiecutter template for cmd2 application :
162
146
  https://github.com/jayrod/cookiecutter-python-cmd2
163
147
  - Advanced cookiecutter template with external plugin support :
164
148
  https://github.com/jayrod/cookiecutter-python-cmd2-ext-plug
165
- - [cmd2 example applications](https://github.com/python-cmd2/cmd2/tree/master/examples)
166
- - Basic cmd2 examples to demonstrate how to use various features
167
- - [Advanced Examples](https://github.com/jayrod/cmd2-example-apps)
168
- - More complex examples that demonstrate more featuers about how to put together a complete
169
- application
170
149
 
171
150
  ## Hello World
172
151
 
@@ -179,9 +158,8 @@ import cmd2
179
158
  class FirstApp(cmd2.Cmd):
180
159
  """A simple cmd2 application."""
181
160
 
182
-
183
- def do_hello_world(self, _: cmd2.Statement):
184
- self.poutput('Hello World')
161
+ def do_hello_world(self, _: cmd2.Statement):
162
+ self.poutput('Hello World')
185
163
 
186
164
 
187
165
  if __name__ == '__main__':
@@ -223,6 +201,7 @@ reproduce the bug. At a minimum, please state the following:
223
201
  | [tomcatmanager](https://github.com/tomcatmanager/tomcatmanager) | A command line tool and python library for managing a tomcat server | [tomcatmanager](https://github.com/tomcatmanager) |
224
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) |
225
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) |
226
205
 
227
206
  Possibly defunct but still good examples
228
207
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Latest Version](https://img.shields.io/pypi/v/cmd2.svg?style=flat-square&label=latest%20stable%20version)](https://pypi.python.org/pypi/cmd2/)
4
4
  [![GitHub Actions](https://github.com/python-cmd2/cmd2/workflows/CI/badge.svg)](https://github.com/python-cmd2/cmd2/actions?query=workflow%3ACI)
5
- [![codecov](https://codecov.io/gh/python-cmd2/cmd2/branch/master/graph/badge.svg)](https://codecov.io/gh/python-cmd2/cmd2)
5
+ [![codecov](https://codecov.io/gh/python-cmd2/cmd2/branch/main/graph/badge.svg)](https://codecov.io/gh/python-cmd2/cmd2)
6
6
  [![Documentation Status](https://readthedocs.org/projects/cmd2/badge/?version=latest)](http://cmd2.readthedocs.io/en/latest/?badge=latest)
7
7
  <a href="https://discord.gg/RpVG6tk"><img src="https://img.shields.io/badge/chat-on%20discord-7289da.svg" alt="Chat"></a>
8
8
 
@@ -16,7 +16,7 @@
16
16
  <a href="#projects-using-cmd2">Projects using cmd2</a> •
17
17
  </p>
18
18
 
19
- [![Screenshot](https://raw.githubusercontent.com/python-cmd2/cmd2/master/cmd2.png)](https://youtu.be/DDU_JH6cFsA)
19
+ [![Screenshot](https://raw.githubusercontent.com/python-cmd2/cmd2/main/cmd2.png)](https://youtu.be/DDU_JH6cFsA)
20
20
 
21
21
  cmd2 is a tool for building interactive command line applications in Python. Its goal is to make it
22
22
  quick and easy for developers to build feature-rich and user-friendly interactive command line
@@ -25,9 +25,13 @@ applications. It provides a simple API which is an extension of Python's built-i
25
25
  of cmd to make your life easier and eliminates much of the boilerplate code which would be necessary
26
26
  when using cmd.
27
27
 
28
+ > :warning: **cmd2 is now "feature complete" for the `2.x` branch and is actively working on the
29
+ > 3.0.0 release on the `main` branch. New features will only be addressed in 3.x moving forwards. If
30
+ > need be, we will still fix bugs in 2.x.**
31
+
28
32
  ## The developers toolbox
29
33
 
30
- ![system schema](https://raw.githubusercontent.com/python-cmd2/cmd2/master/.github/images/graph.drawio.png)
34
+ ![system schema](https://raw.githubusercontent.com/python-cmd2/cmd2/main/.github/images/graph.drawio.png)
31
35
 
32
36
  When creating solutions developers have no shortage of tools to create rich and smart user
33
37
  interfaces. System administrators have long been duct taping together brittle workflows based on a
@@ -35,7 +39,7 @@ menagerie of simple command line tools created by strangers on github and the gu
35
39
  Unfortunately, when CLIs become significantly complex the ease of command discoverability tends to
36
40
  fade quickly. On the other hand, Web and traditional desktop GUIs are first in class when it comes
37
41
  to easily discovering functionality. The price we pay for beautifully colored displays is complexity
38
- required to aggregate disperate applications into larger systems. `cmd2` fills the niche between
42
+ required to aggregate disparate applications into larger systems. `cmd2` fills the niche between
39
43
  high [ease of command discovery](https://clig.dev/#ease-of-discovery) applications and smart
40
44
  workflow automation systems.
41
45
 
@@ -83,7 +87,7 @@ On all operating systems, the latest stable version of `cmd2` can be installed u
83
87
  pip install -U cmd2
84
88
  ```
85
89
 
86
- cmd2 works with Python 3.9+ on Windows, macOS, and Linux. It is pure Python code with few 3rd-party
90
+ cmd2 works with Python 3.10+ on Windows, macOS, and Linux. It is pure Python code with few 3rd-party
87
91
  dependencies. It works with both conventional CPython and free-threaded variants.
88
92
 
89
93
  For information on other installation options, see
@@ -101,20 +105,16 @@ examples.
101
105
 
102
106
  ## Tutorials
103
107
 
104
- - PyOhio 2019 presentation:
105
- - [video](https://www.youtube.com/watch?v=pebeWrTqIIw)
106
- - [slides](https://github.com/python-cmd2/talks/blob/master/PyOhio_2019/cmd2-PyOhio_2019.pdf)
107
- - [example code](https://github.com/python-cmd2/talks/tree/master/PyOhio_2019/examples)
108
+ - [cmd2 example applications](https://github.com/python-cmd2/cmd2/tree/main/examples)
109
+ - Basic cmd2 examples to demonstrate how to use various features
110
+ - [Advanced Examples](https://github.com/jayrod/cmd2-example-apps)
111
+ - More complex examples that demonstrate more featuers about how to put together a complete
112
+ application
108
113
  - [Cookiecutter](https://github.com/cookiecutter/cookiecutter) Templates from community
109
114
  - Basic cookiecutter template for cmd2 application :
110
115
  https://github.com/jayrod/cookiecutter-python-cmd2
111
116
  - Advanced cookiecutter template with external plugin support :
112
117
  https://github.com/jayrod/cookiecutter-python-cmd2-ext-plug
113
- - [cmd2 example applications](https://github.com/python-cmd2/cmd2/tree/master/examples)
114
- - Basic cmd2 examples to demonstrate how to use various features
115
- - [Advanced Examples](https://github.com/jayrod/cmd2-example-apps)
116
- - More complex examples that demonstrate more featuers about how to put together a complete
117
- application
118
118
 
119
119
  ## Hello World
120
120
 
@@ -127,9 +127,8 @@ import cmd2
127
127
  class FirstApp(cmd2.Cmd):
128
128
  """A simple cmd2 application."""
129
129
 
130
-
131
- def do_hello_world(self, _: cmd2.Statement):
132
- self.poutput('Hello World')
130
+ def do_hello_world(self, _: cmd2.Statement):
131
+ self.poutput('Hello World')
133
132
 
134
133
 
135
134
  if __name__ == '__main__':
@@ -171,6 +170,7 @@ reproduce the bug. At a minimum, please state the following:
171
170
  | [tomcatmanager](https://github.com/tomcatmanager/tomcatmanager) | A command line tool and python library for managing a tomcat server | [tomcatmanager](https://github.com/tomcatmanager) |
172
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) |
173
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) |
174
174
 
175
175
  Possibly defunct but still good examples
176
176