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.
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/CHANGELOG.md +1 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/Makefile +0 -1
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/PKG-INFO +1 -1
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/cmd2.py +1 -1
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/PKG-INFO +1 -1
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/SOURCES.txt +5 -23
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/codecov.yml +0 -1
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/modular_commands.md +11 -9
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/plugins/index.md +1 -1
- cmd2-3.0.0b2/docs/plugins/plugin_template.md +7 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/testing.md +4 -3
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/upgrades.md +8 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/mkdocs.yml +1 -1
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/tasks.py +9 -14
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/pyproject.toml +10 -15
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tasks.py +3 -13
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/conftest.py +85 -0
- {cmd2-3.0.0b1/tests_isolated/test_commandset → cmd2-3.0.0b2/tests}/test_commandset.py +128 -127
- cmd2-3.0.0b1/docs/plugins/external_test.md +0 -74
- cmd2-3.0.0b1/plugins/ext_test/CHANGELOG.md +0 -22
- cmd2-3.0.0b1/plugins/ext_test/README.md +0 -82
- cmd2-3.0.0b1/plugins/ext_test/cmd2_ext_test/__init__.py +0 -18
- cmd2-3.0.0b1/plugins/ext_test/cmd2_ext_test/cmd2_ext_test.py +0 -67
- cmd2-3.0.0b1/plugins/ext_test/cmd2_ext_test/py.typed +0 -1
- cmd2-3.0.0b1/plugins/ext_test/examples/example.py +0 -37
- cmd2-3.0.0b1/plugins/ext_test/noxfile.py +0 -7
- cmd2-3.0.0b1/plugins/ext_test/pyproject.toml +0 -180
- cmd2-3.0.0b1/plugins/ext_test/setup.py +0 -49
- cmd2-3.0.0b1/plugins/ext_test/tasks.py +0 -209
- cmd2-3.0.0b1/plugins/ext_test/tests/test_ext_test.py +0 -74
- cmd2-3.0.0b1/plugins/template/build-pyenvs.sh +0 -53
- cmd2-3.0.0b1/plugins/template/cmd2_myplugin/pylintrc +0 -10
- cmd2-3.0.0b1/plugins/template/tests/__init__.py +0 -2
- cmd2-3.0.0b1/plugins/template/tests/pylintrc +0 -19
- cmd2-3.0.0b1/tests_isolated/__init__.py +0 -0
- cmd2-3.0.0b1/tests_isolated/test_commandset/__init__.py +0 -0
- cmd2-3.0.0b1/tests_isolated/test_commandset/conftest.py +0 -144
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/.pre-commit-config.yaml +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/.prettierignore +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/.prettierrc +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/GEMINI.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/LICENSE +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/MANIFEST.in +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/README.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/__init__.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/argparse_completer.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/argparse_custom.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/clipboard.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/colors.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/command_definition.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/constants.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/decorators.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/exceptions.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/history.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/parsing.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/plugin.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/py.typed +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/py_bridge.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/rich_utils.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/rl_utils.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/string_utils.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/styles.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/terminal_utils.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/transcript.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2/utils.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/dependency_links.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/requires.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.egg-info/top_level.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/cmd2.png +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/argparse_completer.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/argparse_custom.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/clipboard.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/cmd.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/colors.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/command_definition.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/constants.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/decorators.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/exceptions.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/history.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/index.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/parsing.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/plugin.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/py_bridge.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/rich_utils.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/rl_utils.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/string_utils.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/styles.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/terminal_utils.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/transcript.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/api/utils.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/doc_conventions.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/examples/alternate_event_loops.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/examples/examples.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/examples/getting_started.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/examples/index.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/argument_processing.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/builtin_commands.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/clipboard.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/commands.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/completion.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/disable_commands.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/embedded_python_shells.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/generating_output.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/help.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/history.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/hooks.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/index.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/initialization.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/misc.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/multiline_commands.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/os.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/packaging.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/plugins.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/prompt.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/redirection.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/scripting.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/settings.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/shortcuts_aliases_macros.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/startup_commands.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/table_creation.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/theme.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/features/transcripts.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/index.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/javascripts/readthedocs.js +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/incompatibilities.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/index.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/minimum.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/next_steps.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/migrating/why.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overrides/main.html +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/alternatives.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/index.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/installation.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/integrating.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/overview/resources.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/stylesheets/cmd2.css +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/docs/stylesheets/readthedocs.css +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.cmd2rc +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/@plugins_snapshot.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_ast.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_ast.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_codecs.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_codecs.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_collections_abc.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_collections_abc.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_typeshed/__init__.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_typeshed/__init__.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_typeshed/importlib.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/_typeshed/importlib.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/abc.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/abc.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/argparse.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/argparse.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/builtins.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/builtins.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/codecs.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/codecs.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/collections/__init__.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/collections/__init__.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/collections/abc.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/collections/abc.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/contextlib.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/contextlib.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/dataclasses.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/dataclasses.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/__init__.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/__init__.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/_policybase.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/_policybase.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/charset.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/charset.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/contentmanager.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/contentmanager.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/errors.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/errors.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/header.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/header.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/message.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/message.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/policy.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/email/policy.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/enum.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/enum.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/genericpath.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/genericpath.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/__init__.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/__init__.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/_abc.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/_abc.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/abc.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/abc.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/machinery.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/machinery.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/metadata/__init__.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/metadata/__init__.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/metadata/_meta.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/metadata/_meta.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/readers.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/readers.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/resources/__init__.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/resources/__init__.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/resources/abc.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/importlib/resources/abc.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/io.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/io.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/os/__init__.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/os/__init__.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/os/path.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/os/path.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/pathlib.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/pathlib.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/posixpath.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/posixpath.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/re.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/re.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/resource.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/resource.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_compile.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_compile.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_constants.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_constants.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_parse.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sre_parse.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/subprocess.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/subprocess.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sys/__init__.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sys/__init__.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sys/_monitoring.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/sys/_monitoring.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/types.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/types.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/typing.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/typing.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/typing_extensions.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/typing_extensions.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/zipfile/__init__.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/zipfile/__init__.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/zipfile/_path.data.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/3.12/zipfile/_path.meta.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/.mypy_cache/CACHEDIR.TAG +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/README.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/argparse_completion.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/argparse_example.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/async_printing.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/basic_completion.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/cmd2_history.dat +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/cmd_as_argument.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/color.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/command_sets.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/custom_parser.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/default_categories.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/dynamic_commands.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/environment.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/event_loops.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/exit_code.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/getting_started.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/hello_cmd2.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/help_categories.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/hooks.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/migrating.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands/__init__.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands/commandset_basic.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands/commandset_complex.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands/commandset_custominit.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/modular_commands.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/paged_output.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/persistent_history.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/pretty_print.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/python_scripting.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/read_input.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/remove_builtin_commands.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/remove_settable.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/rich_tables.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/rich_theme.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/arg_printer.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/conditional.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/nested.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/quit.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/save_help_text.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/script.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/scripts/script.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/tmux_launch.sh +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/tmux_split.sh +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcript_example.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcripts/exampleSession.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcripts/pirate.transcript +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcripts/quit.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/transcripts/transcript_regex.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/examples/unicode_commands.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/package.json +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/README.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/CHANGELOG.md +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/LICENSE +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/README.md +0 -0
- {cmd2-3.0.0b1/plugins/ext_test → cmd2-3.0.0b2/plugins/template}/build-pyenvs.sh +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/cmd2_myplugin/__init__.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/cmd2_myplugin/myplugin.py +0 -0
- {cmd2-3.0.0b1/plugins/ext_test/cmd2_ext_test → cmd2-3.0.0b2/plugins/template/cmd2_myplugin}/pylintrc +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/examples/example.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/noxfile.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/setup.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/tasks.py +0 -0
- {cmd2-3.0.0b1/plugins/ext_test → cmd2-3.0.0b2/plugins/template}/tests/__init__.py +0 -0
- {cmd2-3.0.0b1/plugins/ext_test → cmd2-3.0.0b2/plugins/template}/tests/pylintrc +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/plugins/template/tests/test_myplugin.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/setup.cfg +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/.cmd2rc +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/__init__.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/echo.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/environment.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/help.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/py_locals.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/pyscript_dir.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/raises_exception.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/recursive.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/self_in_py.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/stdout_capture.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/pyscript/stop.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/relative_multiple.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/script.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/script.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/binary.bin +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/empty.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/help.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/nested.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/one_down.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/postcmds.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/precmds.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/scripts/utf8.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_argparse.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_argparse_completer.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_argparse_custom.py +0 -0
- {cmd2-3.0.0b1/tests_isolated/test_commandset → cmd2-3.0.0b2/tests}/test_argparse_subcommands.py +0 -0
- {cmd2-3.0.0b1/tests_isolated/test_commandset → cmd2-3.0.0b2/tests}/test_categories.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_cmd2.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_completion.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_future_annotations.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_history.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_parsing.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_plugin.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_rich_utils.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_run_pyscript.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_string_utils.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_terminal_utils.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_transcript.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_utils.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/test_utils_defining_class.py +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/bol_eol.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/characterclass.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/dotstar.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/extension_notation.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/failure.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/from_cmdloop.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/multiline_no_regex.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/multiline_regex.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/no_output.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/no_output_last.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/singleslash.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/slashes_escaped.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/slashslash.txt +0 -0
- {cmd2-3.0.0b1 → cmd2-3.0.0b2}/tests/transcripts/spaces.txt +0 -0
- {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
|
|
@@ -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 =
|
|
326
|
+
auto_load_commands: bool = False,
|
|
327
327
|
allow_clipboard: bool = True,
|
|
328
328
|
suggest_similar_command: bool = False,
|
|
329
329
|
) -> None:
|
|
@@ -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
|
|
@@ -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,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
294
|
+
CommandSets are loaded dynamically at runtime via other commands.
|
|
293
295
|
"""
|
|
294
296
|
|
|
295
297
|
def __init__(self, *args, **kwargs):
|
|
@@ -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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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()`
|
|
@@ -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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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]
|
|
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]
|
|
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(
|
|
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(
|
|
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/",
|
|
88
|
-
"^docs/",
|
|
86
|
+
"^build/", # .build directory
|
|
87
|
+
"^docs/", # docs directory
|
|
89
88
|
"^dist/",
|
|
90
|
-
"^examples/",
|
|
91
|
-
"^plugins/*",
|
|
92
|
-
"^noxfile\\.py$",
|
|
93
|
-
"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$",
|
|
96
|
-
"^tests/",
|
|
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
|
|
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"
|
|
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
|
|
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
|
-
|
|
70
|
-
|
|
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)
|