view docs/api/02_components/01_commands.md @ 661:2f780b191541

internal: Fix a bug with registering taxonomy terms that are not strings. Some objects, like the blog data provider's taxnonomy entries, can render as strings, but are objects themselves. When registering them as "used terms", we need to use their string representation.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 01 Mar 2016 22:26:09 -0800
parents dce482f7c62d
children
line wrap: on
line source

---
title: Chef Commands
---

To provide new `chef` commands, you need to override the `getCommands` method of
your plugin, and return command instances:


```python
class MyPlugin(PieCrustPlugin):
    name = 'myplugin'

    def getCommands(self):
        return [
                MyNewCommand()]
```


To create a command class, inherit from the `ChefCommand` base class:

```python
from piecrust.commands.base import ChefCommand

class MyNewCommand(ChefCommand):
    def __init__(self):
        super(MyNewCommand, self).__init__()
        self.name = 'foobar'
        self.description = "Does some foobar thing."

    def setupParser(self, parser, app):
        parser.add_argument('thing')

    def run(self, ctx):
        print("Doing %s" % ctx.args.thing)
```


* The `name` will be used for command line invocation, _i.e._ your new command
  will be invoked with `chef foobar`.
* The `description` will be used for help pages like `chef --help`.
* The `setupParser` method passes an `argparse.ArgumentParser` and a `PieCrust`
  application. You're supposed to setup the syntax for your commend there.
* The `run` method is called when your command is executed. The `ctx` object
  contains a couple useful things, among others:
    * `args` is the namespace obtained from running `parse_args`. It has all the
      values of the arguments for your command.
    * `app` is the instance of the current `PieCrust` application.
    * For the other things, check-out `piecrust.commands.base.CommandContext`.