cmd2 3.0.0b1__tar.gz → 3.0.0b2__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 (362) hide show
  1. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/CHANGELOG.md +1 -0
  2. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/Makefile +0 -1
  3. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/PKG-INFO +1 -1
  4. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/cmd2.py +1 -1
  5. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/PKG-INFO +1 -1
  6. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/SOURCES.txt +5 -23
  7. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/codecov.yml +0 -1
  8. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/modular_commands.md +11 -9
  9. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/plugins/index.md +1 -1
  10. cmd2-3.0.0b2/docs/plugins/plugin_template.md +7 -0
  11. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/testing.md +4 -3
  12. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/upgrades.md +8 -0
  13. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/mkdocs.yml +1 -1
  14. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/tasks.py +9 -14
  15. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/pyproject.toml +10 -15
  16. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tasks.py +3 -13
  17. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/conftest.py +85 -0
  18. {cmd2-3.0.0b1/tests_isolated/test_commandset → cmd2-3.0.0b2/tests}/test_commandset.py +128 -127
  19. cmd2-3.0.0b1/docs/plugins/external_test.md +0 -74
  20. cmd2-3.0.0b1/plugins/ext_test/CHANGELOG.md +0 -22
  21. cmd2-3.0.0b1/plugins/ext_test/README.md +0 -82
  22. cmd2-3.0.0b1/plugins/ext_test/cmd2_ext_test/__init__.py +0 -18
  23. cmd2-3.0.0b1/plugins/ext_test/cmd2_ext_test/cmd2_ext_test.py +0 -67
  24. cmd2-3.0.0b1/plugins/ext_test/cmd2_ext_test/py.typed +0 -1
  25. cmd2-3.0.0b1/plugins/ext_test/examples/example.py +0 -37
  26. cmd2-3.0.0b1/plugins/ext_test/noxfile.py +0 -7
  27. cmd2-3.0.0b1/plugins/ext_test/pyproject.toml +0 -180
  28. cmd2-3.0.0b1/plugins/ext_test/setup.py +0 -49
  29. cmd2-3.0.0b1/plugins/ext_test/tasks.py +0 -209
  30. cmd2-3.0.0b1/plugins/ext_test/tests/test_ext_test.py +0 -74
  31. cmd2-3.0.0b1/plugins/template/build-pyenvs.sh +0 -53
  32. cmd2-3.0.0b1/plugins/template/cmd2_myplugin/pylintrc +0 -10
  33. cmd2-3.0.0b1/plugins/template/tests/__init__.py +0 -2
  34. cmd2-3.0.0b1/plugins/template/tests/pylintrc +0 -19
  35. cmd2-3.0.0b1/tests_isolated/__init__.py +0 -0
  36. cmd2-3.0.0b1/tests_isolated/test_commandset/__init__.py +0 -0
  37. cmd2-3.0.0b1/tests_isolated/test_commandset/conftest.py +0 -144
  38. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/.pre-commit-config.yaml +0 -0
  39. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/.prettierignore +0 -0
  40. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/.prettierrc +0 -0
  41. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/GEMINI.md +0 -0
  42. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/LICENSE +0 -0
  43. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/MANIFEST.in +0 -0
  44. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/README.md +0 -0
  45. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/__init__.py +0 -0
  46. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/argparse_completer.py +0 -0
  47. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/argparse_custom.py +0 -0
  48. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/clipboard.py +0 -0
  49. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/colors.py +0 -0
  50. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/command_definition.py +0 -0
  51. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/constants.py +0 -0
  52. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/decorators.py +0 -0
  53. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/exceptions.py +0 -0
  54. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/history.py +0 -0
  55. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/parsing.py +0 -0
  56. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/plugin.py +0 -0
  57. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/py.typed +0 -0
  58. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/py_bridge.py +0 -0
  59. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/rich_utils.py +0 -0
  60. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/rl_utils.py +0 -0
  61. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/string_utils.py +0 -0
  62. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/styles.py +0 -0
  63. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/terminal_utils.py +0 -0
  64. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/transcript.py +0 -0
  65. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/utils.py +0 -0
  66. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/dependency_links.txt +0 -0
  67. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/requires.txt +0 -0
  68. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/top_level.txt +0 -0
  69. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.png +0 -0
  70. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/argparse_completer.md +0 -0
  71. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/argparse_custom.md +0 -0
  72. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/clipboard.md +0 -0
  73. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/cmd.md +0 -0
  74. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/colors.md +0 -0
  75. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/command_definition.md +0 -0
  76. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/constants.md +0 -0
  77. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/decorators.md +0 -0
  78. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/exceptions.md +0 -0
  79. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/history.md +0 -0
  80. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/index.md +0 -0
  81. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/parsing.md +0 -0
  82. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/plugin.md +0 -0
  83. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/py_bridge.md +0 -0
  84. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/rich_utils.md +0 -0
  85. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/rl_utils.md +0 -0
  86. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/string_utils.md +0 -0
  87. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/styles.md +0 -0
  88. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/terminal_utils.md +0 -0
  89. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/transcript.md +0 -0
  90. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/utils.md +0 -0
  91. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/doc_conventions.md +0 -0
  92. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/examples/alternate_event_loops.md +0 -0
  93. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/examples/examples.md +0 -0
  94. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/examples/getting_started.md +0 -0
  95. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/examples/index.md +0 -0
  96. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/argument_processing.md +0 -0
  97. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/builtin_commands.md +0 -0
  98. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/clipboard.md +0 -0
  99. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/commands.md +0 -0
  100. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/completion.md +0 -0
  101. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/disable_commands.md +0 -0
  102. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/embedded_python_shells.md +0 -0
  103. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/generating_output.md +0 -0
  104. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/help.md +0 -0
  105. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/history.md +0 -0
  106. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/hooks.md +0 -0
  107. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/index.md +0 -0
  108. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/initialization.md +0 -0
  109. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/misc.md +0 -0
  110. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/multiline_commands.md +0 -0
  111. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/os.md +0 -0
  112. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/packaging.md +0 -0
  113. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/plugins.md +0 -0
  114. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/prompt.md +0 -0
  115. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/redirection.md +0 -0
  116. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/scripting.md +0 -0
  117. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/settings.md +0 -0
  118. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/shortcuts_aliases_macros.md +0 -0
  119. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/startup_commands.md +0 -0
  120. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/table_creation.md +0 -0
  121. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/theme.md +0 -0
  122. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/transcripts.md +0 -0
  123. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/index.md +0 -0
  124. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/javascripts/readthedocs.js +0 -0
  125. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/incompatibilities.md +0 -0
  126. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/index.md +0 -0
  127. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/minimum.md +0 -0
  128. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/next_steps.md +0 -0
  129. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/why.md +0 -0
  130. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overrides/main.html +0 -0
  131. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/alternatives.md +0 -0
  132. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/index.md +0 -0
  133. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/installation.md +0 -0
  134. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/integrating.md +0 -0
  135. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/resources.md +0 -0
  136. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/stylesheets/cmd2.css +0 -0
  137. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/stylesheets/readthedocs.css +0 -0
  138. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.cmd2rc +0 -0
  139. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/@plugins_snapshot.json +0 -0
  140. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_ast.data.json +0 -0
  141. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_ast.meta.json +0 -0
  142. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_codecs.data.json +0 -0
  143. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_codecs.meta.json +0 -0
  144. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_collections_abc.data.json +0 -0
  145. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_collections_abc.meta.json +0 -0
  146. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_typeshed/__init__.data.json +0 -0
  147. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_typeshed/__init__.meta.json +0 -0
  148. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_typeshed/importlib.data.json +0 -0
  149. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_typeshed/importlib.meta.json +0 -0
  150. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/abc.data.json +0 -0
  151. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/abc.meta.json +0 -0
  152. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/argparse.data.json +0 -0
  153. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/argparse.meta.json +0 -0
  154. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/builtins.data.json +0 -0
  155. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/builtins.meta.json +0 -0
  156. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/codecs.data.json +0 -0
  157. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/codecs.meta.json +0 -0
  158. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/collections/__init__.data.json +0 -0
  159. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/collections/__init__.meta.json +0 -0
  160. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/collections/abc.data.json +0 -0
  161. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/collections/abc.meta.json +0 -0
  162. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/contextlib.data.json +0 -0
  163. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/contextlib.meta.json +0 -0
  164. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/dataclasses.data.json +0 -0
  165. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/dataclasses.meta.json +0 -0
  166. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/__init__.data.json +0 -0
  167. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/__init__.meta.json +0 -0
  168. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/_policybase.data.json +0 -0
  169. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/_policybase.meta.json +0 -0
  170. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/charset.data.json +0 -0
  171. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/charset.meta.json +0 -0
  172. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/contentmanager.data.json +0 -0
  173. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/contentmanager.meta.json +0 -0
  174. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/errors.data.json +0 -0
  175. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/errors.meta.json +0 -0
  176. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/header.data.json +0 -0
  177. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/header.meta.json +0 -0
  178. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/message.data.json +0 -0
  179. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/message.meta.json +0 -0
  180. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/policy.data.json +0 -0
  181. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/policy.meta.json +0 -0
  182. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/enum.data.json +0 -0
  183. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/enum.meta.json +0 -0
  184. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/genericpath.data.json +0 -0
  185. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/genericpath.meta.json +0 -0
  186. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/__init__.data.json +0 -0
  187. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/__init__.meta.json +0 -0
  188. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/_abc.data.json +0 -0
  189. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/_abc.meta.json +0 -0
  190. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/abc.data.json +0 -0
  191. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/abc.meta.json +0 -0
  192. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/machinery.data.json +0 -0
  193. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/machinery.meta.json +0 -0
  194. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/metadata/__init__.data.json +0 -0
  195. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/metadata/__init__.meta.json +0 -0
  196. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/metadata/_meta.data.json +0 -0
  197. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/metadata/_meta.meta.json +0 -0
  198. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/readers.data.json +0 -0
  199. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/readers.meta.json +0 -0
  200. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/resources/__init__.data.json +0 -0
  201. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/resources/__init__.meta.json +0 -0
  202. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/resources/abc.data.json +0 -0
  203. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/resources/abc.meta.json +0 -0
  204. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/io.data.json +0 -0
  205. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/io.meta.json +0 -0
  206. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/os/__init__.data.json +0 -0
  207. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/os/__init__.meta.json +0 -0
  208. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/os/path.data.json +0 -0
  209. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/os/path.meta.json +0 -0
  210. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/pathlib.data.json +0 -0
  211. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/pathlib.meta.json +0 -0
  212. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/posixpath.data.json +0 -0
  213. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/posixpath.meta.json +0 -0
  214. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/re.data.json +0 -0
  215. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/re.meta.json +0 -0
  216. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/resource.data.json +0 -0
  217. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/resource.meta.json +0 -0
  218. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_compile.data.json +0 -0
  219. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_compile.meta.json +0 -0
  220. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_constants.data.json +0 -0
  221. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_constants.meta.json +0 -0
  222. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_parse.data.json +0 -0
  223. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_parse.meta.json +0 -0
  224. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/subprocess.data.json +0 -0
  225. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/subprocess.meta.json +0 -0
  226. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sys/__init__.data.json +0 -0
  227. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sys/__init__.meta.json +0 -0
  228. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sys/_monitoring.data.json +0 -0
  229. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sys/_monitoring.meta.json +0 -0
  230. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/types.data.json +0 -0
  231. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/types.meta.json +0 -0
  232. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/typing.data.json +0 -0
  233. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/typing.meta.json +0 -0
  234. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/typing_extensions.data.json +0 -0
  235. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/typing_extensions.meta.json +0 -0
  236. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/zipfile/__init__.data.json +0 -0
  237. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/zipfile/__init__.meta.json +0 -0
  238. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/zipfile/_path.data.json +0 -0
  239. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/zipfile/_path.meta.json +0 -0
  240. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/CACHEDIR.TAG +0 -0
  241. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/README.md +0 -0
  242. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/argparse_completion.py +0 -0
  243. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/argparse_example.py +0 -0
  244. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/async_printing.py +0 -0
  245. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/basic_completion.py +0 -0
  246. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/cmd2_history.dat +0 -0
  247. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/cmd_as_argument.py +0 -0
  248. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/color.py +0 -0
  249. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/command_sets.py +0 -0
  250. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/custom_parser.py +0 -0
  251. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/default_categories.py +0 -0
  252. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/dynamic_commands.py +0 -0
  253. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/environment.py +0 -0
  254. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/event_loops.py +0 -0
  255. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/exit_code.py +0 -0
  256. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/getting_started.py +0 -0
  257. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/hello_cmd2.py +0 -0
  258. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/help_categories.py +0 -0
  259. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/hooks.py +0 -0
  260. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/migrating.py +0 -0
  261. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands/__init__.py +0 -0
  262. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands/commandset_basic.py +0 -0
  263. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands/commandset_complex.py +0 -0
  264. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands/commandset_custominit.py +0 -0
  265. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands.py +0 -0
  266. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/paged_output.py +0 -0
  267. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/persistent_history.py +0 -0
  268. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/pretty_print.py +0 -0
  269. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/python_scripting.py +0 -0
  270. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/read_input.py +0 -0
  271. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/remove_builtin_commands.py +0 -0
  272. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/remove_settable.py +0 -0
  273. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/rich_tables.py +0 -0
  274. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/rich_theme.py +0 -0
  275. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/arg_printer.py +0 -0
  276. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/conditional.py +0 -0
  277. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/nested.txt +0 -0
  278. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/quit.txt +0 -0
  279. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/save_help_text.py +0 -0
  280. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/script.py +0 -0
  281. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/script.txt +0 -0
  282. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/tmux_launch.sh +0 -0
  283. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/tmux_split.sh +0 -0
  284. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcript_example.py +0 -0
  285. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcripts/exampleSession.txt +0 -0
  286. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcripts/pirate.transcript +0 -0
  287. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcripts/quit.txt +0 -0
  288. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcripts/transcript_regex.txt +0 -0
  289. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/unicode_commands.py +0 -0
  290. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/package.json +0 -0
  291. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/README.txt +0 -0
  292. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/CHANGELOG.md +0 -0
  293. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/LICENSE +0 -0
  294. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/README.md +0 -0
  295. {cmd2-3.0.0b1/plugins/ext_test → cmd2-3.0.0b2/plugins/template}/build-pyenvs.sh +0 -0
  296. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/cmd2_myplugin/__init__.py +0 -0
  297. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/cmd2_myplugin/myplugin.py +0 -0
  298. {cmd2-3.0.0b1/plugins/ext_test/cmd2_ext_test → cmd2-3.0.0b2/plugins/template/cmd2_myplugin}/pylintrc +0 -0
  299. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/examples/example.py +0 -0
  300. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/noxfile.py +0 -0
  301. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/setup.py +0 -0
  302. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/tasks.py +0 -0
  303. {cmd2-3.0.0b1/plugins/ext_test → cmd2-3.0.0b2/plugins/template}/tests/__init__.py +0 -0
  304. {cmd2-3.0.0b1/plugins/ext_test → cmd2-3.0.0b2/plugins/template}/tests/pylintrc +0 -0
  305. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/tests/test_myplugin.py +0 -0
  306. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/setup.cfg +0 -0
  307. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/.cmd2rc +0 -0
  308. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/__init__.py +0 -0
  309. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/echo.py +0 -0
  310. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/environment.py +0 -0
  311. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/help.py +0 -0
  312. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/py_locals.py +0 -0
  313. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/pyscript_dir.py +0 -0
  314. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/raises_exception.py +0 -0
  315. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/recursive.py +0 -0
  316. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/self_in_py.py +0 -0
  317. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/stdout_capture.py +0 -0
  318. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/stop.py +0 -0
  319. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/relative_multiple.txt +0 -0
  320. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/script.py +0 -0
  321. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/script.txt +0 -0
  322. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/binary.bin +0 -0
  323. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/empty.txt +0 -0
  324. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/help.txt +0 -0
  325. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/nested.txt +0 -0
  326. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/one_down.txt +0 -0
  327. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/postcmds.txt +0 -0
  328. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/precmds.txt +0 -0
  329. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/utf8.txt +0 -0
  330. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_argparse.py +0 -0
  331. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_argparse_completer.py +0 -0
  332. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_argparse_custom.py +0 -0
  333. {cmd2-3.0.0b1/tests_isolated/test_commandset → cmd2-3.0.0b2/tests}/test_argparse_subcommands.py +0 -0
  334. {cmd2-3.0.0b1/tests_isolated/test_commandset → cmd2-3.0.0b2/tests}/test_categories.py +0 -0
  335. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_cmd2.py +0 -0
  336. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_completion.py +0 -0
  337. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_future_annotations.py +0 -0
  338. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_history.py +0 -0
  339. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_parsing.py +0 -0
  340. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_plugin.py +0 -0
  341. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_rich_utils.py +0 -0
  342. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_run_pyscript.py +0 -0
  343. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_string_utils.py +0 -0
  344. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_terminal_utils.py +0 -0
  345. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_transcript.py +0 -0
  346. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_utils.py +0 -0
  347. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_utils_defining_class.py +0 -0
  348. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/bol_eol.txt +0 -0
  349. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/characterclass.txt +0 -0
  350. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/dotstar.txt +0 -0
  351. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/extension_notation.txt +0 -0
  352. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/failure.txt +0 -0
  353. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/from_cmdloop.txt +0 -0
  354. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/multiline_no_regex.txt +0 -0
  355. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/multiline_regex.txt +0 -0
  356. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/no_output.txt +0 -0
  357. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/no_output_last.txt +0 -0
  358. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/singleslash.txt +0 -0
  359. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/slashes_escaped.txt +0 -0
  360. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/slashslash.txt +0 -0
  361. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/spaces.txt +0 -0
  362. {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/word_boundaries.txt +0 -0
@@ -24,6 +24,7 @@ time reading the [rich documentation](https://rich.readthedocs.io/).
24
24
  `value` property
25
25
  - Removed redundant setting of a parser's `prog` value in the `with_argparser()` decorator, as
26
26
  this is now handled centrally in `Cmd._build_parser()`
27
+ - The `auto_load_commands` argument to `cmd2.Cmd.__init__` now defaults to `False`
27
28
 
28
29
  - Enhancements
29
30
  - Enhanced all print methods (`poutput()`, `perror()`, `ppaged()`, etc.) to natively render
@@ -34,7 +34,6 @@ typecheck: ## Perform type checking
34
34
  test: ## Test the code with pytest.
35
35
  @echo "🚀 Testing code: Running pytest"
36
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
37
 
39
38
  .PHONY: docs-test
40
39
  docs-test: ## Test if documentation can be built without warnings or errors
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmd2
3
- Version: 3.0.0b1
3
+ Version: 3.0.0b2
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
@@ -323,7 +323,7 @@ class Cmd(cmd.Cmd):
323
323
  terminators: list[str] | None = None,
324
324
  shortcuts: dict[str, str] | None = None,
325
325
  command_sets: Iterable[CommandSet] | None = None,
326
- auto_load_commands: bool = True,
326
+ auto_load_commands: bool = False,
327
327
  allow_clipboard: bool = True,
328
328
  suggest_similar_command: bool = False,
329
329
  ) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmd2
3
- Version: 3.0.0b1
3
+ Version: 3.0.0b2
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
@@ -109,8 +109,8 @@ docs/overview/index.md
109
109
  docs/overview/installation.md
110
110
  docs/overview/integrating.md
111
111
  docs/overview/resources.md
112
- docs/plugins/external_test.md
113
112
  docs/plugins/index.md
113
+ docs/plugins/plugin_template.md
114
114
  docs/stylesheets/cmd2.css
115
115
  docs/stylesheets/readthedocs.css
116
116
  examples/.cmd2rc
@@ -267,21 +267,6 @@ examples/transcripts/quit.txt
267
267
  examples/transcripts/transcript_regex.txt
268
268
  plugins/README.txt
269
269
  plugins/tasks.py
270
- plugins/ext_test/CHANGELOG.md
271
- plugins/ext_test/README.md
272
- plugins/ext_test/build-pyenvs.sh
273
- plugins/ext_test/noxfile.py
274
- plugins/ext_test/pyproject.toml
275
- plugins/ext_test/setup.py
276
- plugins/ext_test/tasks.py
277
- plugins/ext_test/cmd2_ext_test/__init__.py
278
- plugins/ext_test/cmd2_ext_test/cmd2_ext_test.py
279
- plugins/ext_test/cmd2_ext_test/py.typed
280
- plugins/ext_test/cmd2_ext_test/pylintrc
281
- plugins/ext_test/examples/example.py
282
- plugins/ext_test/tests/__init__.py
283
- plugins/ext_test/tests/pylintrc
284
- plugins/ext_test/tests/test_ext_test.py
285
270
  plugins/template/CHANGELOG.md
286
271
  plugins/template/LICENSE
287
272
  plugins/template/README.md
@@ -305,7 +290,10 @@ tests/script.txt
305
290
  tests/test_argparse.py
306
291
  tests/test_argparse_completer.py
307
292
  tests/test_argparse_custom.py
293
+ tests/test_argparse_subcommands.py
294
+ tests/test_categories.py
308
295
  tests/test_cmd2.py
296
+ tests/test_commandset.py
309
297
  tests/test_completion.py
310
298
  tests/test_future_annotations.py
311
299
  tests/test_history.py
@@ -350,10 +338,4 @@ tests/transcripts/singleslash.txt
350
338
  tests/transcripts/slashes_escaped.txt
351
339
  tests/transcripts/slashslash.txt
352
340
  tests/transcripts/spaces.txt
353
- tests/transcripts/word_boundaries.txt
354
- tests_isolated/__init__.py
355
- tests_isolated/test_commandset/__init__.py
356
- tests_isolated/test_commandset/conftest.py
357
- tests_isolated/test_commandset/test_argparse_subcommands.py
358
- tests_isolated/test_commandset/test_categories.py
359
- tests_isolated/test_commandset/test_commandset.py
341
+ tests/transcripts/word_boundaries.txt
@@ -14,4 +14,3 @@ component_management:
14
14
  ignore:
15
15
  - "examples" # ignore example code folder
16
16
  - "tests" # ignore unit test code folder
17
- - "tests_isolated" # ignore integration test code folder
@@ -4,18 +4,20 @@
4
4
 
5
5
  Cmd2 also enables developers to modularize their command definitions into
6
6
  [CommandSet][cmd2.CommandSet] objects. CommandSets represent a logical grouping of commands within a
7
- `cmd2` application. By default, all `CommandSet` objects will be discovered and loaded automatically
8
- when the [cmd2.Cmd][] class is instantiated with this mixin. This also enables the developer to
9
- dynamically add/remove commands from the cmd2 application. This could be useful for loadable plugins
10
- that add additional capabilities. Additionally, it allows for object-oriented encapsulation and
11
- garbage collection of state that is specific to a CommandSet.
7
+ `cmd2` application. By default, `CommandSet` objects need to be manually registered. However, it is
8
+ possible for all `CommandSet` objects to be discovered and loaded automatically when the
9
+ [cmd2.Cmd][] class is instantiated with this mixin by setting `auto_load_commands=True`. This also
10
+ enables the developer to dynamically add/remove commands from the `cmd2` application. This could be
11
+ useful for loadable plugins that add additional capabilities. Additionally, it allows for
12
+ object-oriented encapsulation and garbage collection of state that is specific to a CommandSet.
12
13
 
13
14
  ### Features
14
15
 
15
16
  - Modular Command Sets - Commands can be broken into separate modules rather than in one god class
16
17
  holding all commands.
17
18
  - Automatic Command Discovery - In your application, merely defining and importing a CommandSet is
18
- sufficient for `cmd2` to discover and load your command. No manual registration is necessary.
19
+ sufficient for `cmd2` to discover and load your command if you set `auto_load_commands=True`. No
20
+ manual registration is necessary.
19
21
  - Dynamically Loadable/Unloadable Commands - Command functions and CommandSets can both be loaded
20
22
  and unloaded dynamically during application execution. This can enable features such as
21
23
  dynamically loaded modules that add additional commands.
@@ -71,7 +73,7 @@ class ExampleApp(cmd2.Cmd):
71
73
  CommandSets are automatically loaded. Nothing needs to be done.
72
74
  """
73
75
  def __init__(self, *args, **kwargs):
74
- super().__init__(*args, **kwargs)
76
+ super().__init__(*args, auto_load_commands=True, **kwargs)
75
77
 
76
78
  def do_something(self, arg):
77
79
  self.poutput('this is the something command')
@@ -106,7 +108,7 @@ class ExampleApp(cmd2.Cmd):
106
108
  """
107
109
  def __init__(self, *args, **kwargs):
108
110
  # gotta have this or neither the plugin or cmd2 will initialize
109
- super().__init__(*args, **kwargs)
111
+ super().__init__(*args, auto_load_commands=True, **kwargs)
110
112
 
111
113
  def do_something(self, arg):
112
114
  self.last_result = 5
@@ -289,7 +291,7 @@ class LoadableVegetables(CommandSet):
289
291
 
290
292
  class ExampleApp(cmd2.Cmd):
291
293
  """
292
- CommandSets are automatically loaded. Nothing needs to be done.
294
+ CommandSets are loaded dynamically at runtime via other commands.
293
295
  """
294
296
 
295
297
  def __init__(self, *args, **kwargs):
@@ -2,6 +2,6 @@
2
2
 
3
3
  <!--intro-start-->
4
4
 
5
- - [External Test Plugin](external_test.md)
5
+ - [cmd2 Plugin Template](plugin_template.md)
6
6
 
7
7
  <!--intro-end-->
@@ -0,0 +1,7 @@
1
+ # cmd2 Plugin Template
2
+
3
+ ## Overview
4
+
5
+ The [cmd2 Plugin Template](https://github.com/python-cmd2/cmd2/tree/main/plugins/template) is a
6
+ general example that shows you how you can develop a plugin for `cmd2`. Plugins are generally mixin
7
+ classes that add some extra functionality to your class which inherits from [cmd2.Cmd][].
@@ -6,9 +6,10 @@ This covers special considerations when writing unit or integration tests for a
6
6
 
7
7
  ## Testing Commands
8
8
 
9
- The [External Test Plugin](plugins/external_test.md) provides a mixin class with a function that
10
- allows external calls to application commands. The `cmd2_ext_test.ExternalTestMixin.app_cmd`
11
- function captures and returns stdout, stderr, and the command-specific result data.
9
+ We encourage `cmd2` application developers to look at the
10
+ [cmd2 tests](https://github.com/python-cmd2/cmd2/tree/main/tests) for examples of how to perform
11
+ unit and integration testing of `cmd2` commands. There are various helpers that will do things like
12
+ capture and return stdout, stderr, and command-specific result data.
12
13
 
13
14
  ## Mocking
14
15
 
@@ -106,3 +106,11 @@ however it now inherits from `argparse.HelpFormatter`. If you want RawText behav
106
106
  The benefit is that your `cmd2` applications now have more aesthetically pleasing help which
107
107
  includes color to make it quicker and easier to visually parse help text. This works for all
108
108
  supported versions of Python.
109
+
110
+ ### Other Changes
111
+
112
+ - The `auto_load_commands` argument to `cmd2.Cmd.__init__` now defaults to `False`
113
+ - Replaced `Settable.get_value()` and `Settable.set_value()` methods with a more Pythonic `value`
114
+ property
115
+ - Removed redundant setting of a parser's `prog` value in the `with_argparser()` decorator, as this
116
+ is now handled centrally in `Cmd._build_parser()`
@@ -195,7 +195,7 @@ nav:
195
195
  - examples/examples.md
196
196
  - Plugins:
197
197
  - plugins/index.md
198
- - plugins/external_test.md
198
+ - plugins/plugin_template.md
199
199
  - Testing:
200
200
  - testing.md
201
201
  - API Reference:
@@ -10,16 +10,12 @@ import pathlib
10
10
 
11
11
  import invoke
12
12
 
13
- from plugins.ext_test import (
14
- tasks as ext_test_tasks,
15
- )
16
13
  from plugins.template import (
17
14
  tasks as template_tasks,
18
15
  )
19
16
 
20
17
  # create namespaces
21
18
  namespace = invoke.Collection(
22
- ext_test=ext_test_tasks,
23
19
  template=template_tasks,
24
20
  )
25
21
  namespace_clean = invoke.Collection('clean')
@@ -35,7 +31,6 @@ TASK_ROOT = pathlib.Path(__file__).resolve().parent
35
31
  TASK_ROOT_STR = str(TASK_ROOT)
36
32
 
37
33
 
38
- @invoke.task(pre=[ext_test_tasks.pytest])
39
34
  @invoke.task()
40
35
  def pytest(_) -> None:
41
36
  """Run tests and code coverage using pytest."""
@@ -44,7 +39,7 @@ def pytest(_) -> None:
44
39
  namespace.add_task(pytest)
45
40
 
46
41
 
47
- @invoke.task(pre=[ext_test_tasks.pytest_clean])
42
+ @invoke.task()
48
43
  def pytest_clean(_) -> None:
49
44
  """Remove pytest cache and code coverage files and directories."""
50
45
 
@@ -52,7 +47,7 @@ def pytest_clean(_) -> None:
52
47
  namespace_clean.add_task(pytest_clean, 'pytest')
53
48
 
54
49
 
55
- @invoke.task(pre=[ext_test_tasks.mypy])
50
+ @invoke.task()
56
51
  def mypy(_) -> None:
57
52
  """Run mypy optional static type checker."""
58
53
 
@@ -60,7 +55,7 @@ def mypy(_) -> None:
60
55
  namespace.add_task(mypy)
61
56
 
62
57
 
63
- @invoke.task(pre=[ext_test_tasks.mypy_clean])
58
+ @invoke.task()
64
59
  def mypy_clean(_) -> None:
65
60
  """Remove mypy cache directory."""
66
61
  # pylint: disable=unused-argument
@@ -78,7 +73,7 @@ BUILDDIR = 'build'
78
73
  DISTDIR = 'dist'
79
74
 
80
75
 
81
- @invoke.task(pre=[ext_test_tasks.build_clean])
76
+ @invoke.task()
82
77
  def build_clean(_) -> None:
83
78
  """Remove the build directory."""
84
79
 
@@ -86,7 +81,7 @@ def build_clean(_) -> None:
86
81
  namespace_clean.add_task(build_clean, 'build')
87
82
 
88
83
 
89
- @invoke.task(pre=[ext_test_tasks.dist_clean])
84
+ @invoke.task()
90
85
  def dist_clean(_) -> None:
91
86
  """Remove the dist directory."""
92
87
 
@@ -107,7 +102,7 @@ def clean_all(_) -> None:
107
102
  namespace_clean.add_task(clean_all, 'all')
108
103
 
109
104
 
110
- @invoke.task(pre=[clean_all], post=[ext_test_tasks.sdist])
105
+ @invoke.task(pre=[clean_all])
111
106
  def sdist(_) -> None:
112
107
  """Create a source distribution."""
113
108
 
@@ -115,7 +110,7 @@ def sdist(_) -> None:
115
110
  namespace.add_task(sdist)
116
111
 
117
112
 
118
- @invoke.task(pre=[clean_all], post=[ext_test_tasks.wheel])
113
+ @invoke.task(pre=[clean_all])
119
114
  def wheel(_) -> None:
120
115
  """Build a wheel distribution."""
121
116
 
@@ -124,7 +119,7 @@ namespace.add_task(wheel)
124
119
 
125
120
 
126
121
  # ruff linter
127
- @invoke.task(pre=[ext_test_tasks.lint])
122
+ @invoke.task()
128
123
  def lint(context) -> None:
129
124
  with context.cd(TASK_ROOT_STR):
130
125
  context.run("ruff check")
@@ -134,7 +129,7 @@ namespace.add_task(lint)
134
129
 
135
130
 
136
131
  # ruff formatter
137
- @invoke.task(pre=[ext_test_tasks.format])
132
+ @invoke.task()
138
133
  def format(context) -> None: # noqa: A001
139
134
  """Run formatter."""
140
135
  with context.cd(TASK_ROOT_STR):
@@ -66,7 +66,6 @@ docs = [
66
66
  "setuptools>=64",
67
67
  "setuptools_scm>=8",
68
68
  ]
69
- plugins = ["cmd2-ext-test"]
70
69
  quality = ["pre-commit>=2.20.0"]
71
70
  test = [
72
71
  "codecov>=2",
@@ -84,17 +83,16 @@ disallow_untyped_defs = true
84
83
  exclude = [
85
84
  "^.git/",
86
85
  "^.venv/",
87
- "^build/", # .build directory
88
- "^docs/", # docs directory
86
+ "^build/", # .build directory
87
+ "^docs/", # docs directory
89
88
  "^dist/",
90
- "^examples/", # examples directory
91
- "^plugins/*", # plugins directory
92
- "^noxfile\\.py$", # nox config file
93
- "setup\\.py$", # any files named setup.py
89
+ "^examples/", # examples directory
90
+ "^plugins/*", # plugins directory
91
+ "^noxfile\\.py$", # nox config file
92
+ "setup\\.py$", # any files named setup.py
94
93
  "^site/",
95
- "^tasks\\.py$", # tasks.py invoke config file
96
- "^tests/", # tests directory
97
- "^tests_isolated/", # tests_isolated directory
94
+ "^tasks\\.py$", # tasks.py invoke config file
95
+ "^tests/", # tests directory
98
96
  ]
99
97
  files = ['.']
100
98
  show_column_numbers = true
@@ -271,7 +269,7 @@ mccabe.max-complexity = 49
271
269
  "plugins/*.py" = ["INP001"] # Module is part of an implicit namespace
272
270
 
273
271
  # Ingore various rulesets in test and plugins directories
274
- "{plugins,tests,tests_isolated}/*.py" = [
272
+ "{plugins,tests}/*.py" = [
275
273
  "ANN", # Ignore all type annotation rules in test folders
276
274
  "ARG", # Ignore all unused argument warnings in test folders
277
275
  "D", # Ignore all pydocstyle rules in test folders
@@ -315,7 +313,4 @@ packages = ["cmd2"]
315
313
  [tool.setuptools_scm]
316
314
 
317
315
  [tool.uv]
318
- default-groups = ["build", "dev", "plugins"]
319
-
320
- [tool.uv.sources]
321
- cmd2-ext-test = { path = "plugins/ext_test", editable = true }
316
+ default-groups = ["build", "dev"]
@@ -52,28 +52,18 @@ namespace.add_collection(namespace_clean, 'clean')
52
52
 
53
53
 
54
54
  @invoke.task()
55
- def pytest(context: Context, junit: bool = False, pty: bool = True, base: bool = False, isolated: bool = False) -> None:
55
+ def pytest(context: Context, junit: bool = False, pty: bool = True) -> None:
56
56
  """Run tests and code coverage using pytest."""
57
57
  with context.cd(TASK_ROOT_STR):
58
58
  command_str = 'pytest '
59
59
  command_str += ' --cov=cmd2 '
60
60
  command_str += ' --cov-append --cov-report=term --cov-report=html '
61
61
 
62
- if not base and not isolated:
63
- base = True
64
- isolated = True
65
-
66
62
  if junit:
67
63
  command_str += ' --junitxml=junit/test-results.xml '
68
64
 
69
- if base:
70
- tests_cmd = command_str + ' tests'
71
- context.run(tests_cmd, pty=pty)
72
- if isolated:
73
- for _root, dirnames, _ in os.walk(str(TASK_ROOT / 'tests_isolated')):
74
- for dir_name in dirnames:
75
- if dir_name.startswith('test_'):
76
- context.run(command_str + ' tests_isolated/' + dir_name)
65
+ tests_cmd = command_str + ' tests'
66
+ context.run(tests_cmd, pty=pty)
77
67
 
78
68
 
79
69
  namespace.add_task(pytest)
@@ -5,6 +5,7 @@ import sys
5
5
  from collections.abc import Callable
6
6
  from contextlib import redirect_stderr
7
7
  from typing import (
8
+ TYPE_CHECKING,
8
9
  ParamSpec,
9
10
  TextIO,
10
11
  TypeVar,
@@ -164,3 +165,87 @@ def find_subcommand(action: argparse.ArgumentParser, subcmd_names: list[str]) ->
164
165
  return find_subcommand(choice, subcmd_names)
165
166
  break
166
167
  raise ValueError(f"Could not find subcommand '{subcmd_names}'")
168
+
169
+
170
+ if TYPE_CHECKING:
171
+ _Base = cmd2.Cmd
172
+ else:
173
+ _Base = object
174
+
175
+
176
+ class ExternalTestMixin(_Base):
177
+ """A cmd2 plugin (mixin class) that exposes an interface to execute application commands from python"""
178
+
179
+ def __init__(self, *args, **kwargs):
180
+ """Initializes the ExternalTestMixin.
181
+
182
+ This class is intended to be used in multiple inheritance alongside `cmd2.Cmd` for an application class.
183
+ When doing this multiple inheritance, it is imperative that this mixin class come first.
184
+
185
+ :type self: cmd2.Cmd
186
+ :param args: arguments to pass to the superclass
187
+ :param kwargs: keyword arguments to pass to the superclass
188
+ """
189
+ # code placed here runs before cmd2 initializes
190
+ super().__init__(*args, **kwargs)
191
+ if not isinstance(self, cmd2.Cmd):
192
+ raise TypeError('The ExternalTestMixin class is intended to be used in multiple inheritance with cmd2.Cmd')
193
+ # code placed here runs after cmd2 initializes
194
+ self._pybridge = cmd2.py_bridge.PyBridge(self)
195
+
196
+ def app_cmd(self, command: str, echo: bool | None = None) -> cmd2.CommandResult:
197
+ """
198
+ Run the application command
199
+
200
+ :param command: The application command as it would be written on the cmd2 application prompt
201
+ :param echo: Flag whether the command's output should be echoed to stdout/stderr
202
+ :return: A CommandResult object that captures stdout, stderr, and the command's result object
203
+ """
204
+ try:
205
+ self._in_py = True
206
+ return self._pybridge(command, echo=echo)
207
+
208
+ finally:
209
+ self._in_py = False
210
+
211
+ def fixture_setup(self):
212
+ """Replicates the behavior of `cmdloop()` to prepare the application state for testing.
213
+
214
+ This method runs all preloop hooks and the preloop method to ensure the
215
+ application is in the correct state before running a test.
216
+
217
+ :type self: cmd2.Cmd
218
+ """
219
+
220
+ for func in self._preloop_hooks:
221
+ func()
222
+ self.preloop()
223
+
224
+ def fixture_teardown(self):
225
+ """Replicates the behavior of `cmdloop()` to tear down the application after a test.
226
+
227
+ This method runs all postloop hooks and the postloop method to clean up
228
+ the application state and ensure test isolation.
229
+
230
+ :type self: cmd2.Cmd
231
+ """
232
+ for func in self._postloop_hooks:
233
+ func()
234
+ self.postloop()
235
+
236
+
237
+ class WithCommandSets(ExternalTestMixin, cmd2.Cmd):
238
+ """Class for testing custom help_* methods which override docstring help."""
239
+
240
+ def __init__(self, *args, **kwargs) -> None:
241
+ super().__init__(*args, **kwargs)
242
+
243
+
244
+ @pytest.fixture
245
+ def autoload_command_sets_app():
246
+ return WithCommandSets(auto_load_commands=True)
247
+
248
+
249
+ @pytest.fixture
250
+ def manual_command_sets_app():
251
+ return WithCommandSets(auto_load_commands=False)