view docs/api/02_components/01_commands.md @ 1145:e94737572542

serve: Fix an issue where false positive matches were rendered as the requested page. Now we try to render the page, but also try to detect for the most common "empty" pages.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 05 Jun 2018 22:08:51 -0700
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`.