To write a plugin, you simply create a new file in the libbe/command/ directory. Take a look at one of the simpler plugins (e.g. libbe.command.remove) for an example of how that looks, and to start getting a feel for the libbe interface.
See libbe.command.base for the definition of the important classes Option, Argument, Command, InputOutput, StorageCallbacks, and UserInterface. You’ll be subclassing Command for your command, but all those classes will be important.
BE implements a general framework to make it easy to support command completion for arbitrary plugins. In order to support this system, any of your completable Argument instances (in your command’s .options or .args) should be initialized with some valid completion_callback function. Some common cases are defined in libbe.command.util. If you need more flexibility, see libbe.command.list‘s --sort option for an example of extensions via libbe.command.util.Completer, or write a custom completion function from scratch.
Take a look at libbe.ui.command_line for an example. Basically you’ll need to setup a UserInterface instance for running commands. More details to come after I write an HTML UI...
Run any tests in your module with:
be$ python test.py <python.module.name>
for example:
be$ python test.py libbe.command.merge
For a definition of “any tests”, see test.py‘s add_module_tests() function.
Note that you will need to run make before testing a clean BE branch to auto-generate required files like libbe/_version.py.
Find out which 20 calls take the most cumulative time (time of execution + childrens’ times):
$ python -m cProfile -o profile be [command] [args]
$ python -c "import pstats; p=pstats.Stats('profile'); p.sort_stats('cumulative').print_stats(20)"
If you want to find out who’s calling your expensive function (e.g. libbe.util.subproc.invoke()), try:
$ python -c "import pstats; p=pstats.Stats('profile'); p.sort_stats('cumulative').print_callers(20)"
You can also toss:
import sys, traceback
print >> sys.stderr, '-'*60, '\n', '\n'.join(traceback.format_stack()[-10:])
into the function itself for a depth-first caller list.
For a more top-down approach, try:
$ python -c "import pstats; p=pstats.Stats('profile'); p.sort_stats('cumulative').print_callees(20)"