An dynamically extensible CMD based command shell.
An example for the bar command is presented at:
https://github.com/cloudmesh/cloudmesh.bar/blob/master/cloudmesh/bar/command/bar.py It shows how simple the command definition is (bar.py)::
from __future__ import print_function
from cloudmesh.shell.command import command
from cloudmesh.shell.command import PluginCommand
class BarCommand(PluginCommand):
@command
def do_bar(self, args, arguments):
"""
::
Usage:
command -f FILE
command FILE
command list
This command does some useful things.
Arguments:
FILE a file name
Options:
-f specify the file
"""
print(arguments)
An important difference to other CMD solutions is that our commands can leverage (besides the standrad definition), docopts as a way to define the manual page. This allows us to use arguments as dict and use simple if conditions to interpret the command. Using docopts has the advantage that contributors are forced to think about the command and its options and document them from the start. Previously we used not to use docopts and argparse was used. However we noticed that for some contributions the lead to commands that were either not properly documented or the developers delivered ambiguous commands that resulted in confusion and wrong ussage by the users. Hence, we do recommend that you use docopts.
The transformation is enabled by the @
command decorator that takes
also the manual page and creates a proper help message for the shell
automatically. Thus there is no need to introduce a sepaarte help
method as would normally be needed in CMD.