Mercurial > piecrust2
view docs/pages/code.md @ 440:32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
* Make use of `collections.abc.Mapping` to better identify things that are
supposed to look like dictionaries.
* Instead of handling "overlay" of data in a dict tree in each different data
object, make all objects `Mapping`s and handle merging at a higher level
with the new `MergedMapping` object.
* Since this new object is read-only, remove the need for deep-copying of
app and page configurations.
* Split data classes into separate modules.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 28 Jun 2015 08:22:39 -0700 |
parents | 9188b362069e |
children |
line wrap: on
line source
--- title: Code header_class: code --- ## PieCrust plugins To create a PieCrust plugin, you need to do a few things: * Create a correct `setuptools` package. * Implement a sub-class of `PieCrustPlugin`. * Write a couple lines of boilerplate code. ### Packaging plugins PieCrust plugins are expected to be available on [Pypi][] for better integration with `chef` commands. For instance, the `chef plugins list -a` will list all PieCrust plugins from Pypi. A PieCrust plugin package must: * Be named `PieCrust-FooBar`, where `FooBar` is the name of the plugin. * Have a module named `piecrust_foobar`, which is basically the lower-case version of the package name, with an underscore instead of a dash. You can refer to the [`setuptools` documentation][st] for more information. ### The plugin class A PieCrust plugin is an instance of a class that derives from `PieCrustPlugin`. The only required thing you need to override is the name of the plugin: from piecrust.plugins.base import PieCrustPlugin class FooBarPlugin(PieCrustPlugin): name = 'FooBar' The plugin class has a whole bunch of functions returning whatever your plugin may want to extend: formatters, template engines, `chef` commands, sources, etc. Each one of those returns an array of instances or classes, depending on the situation. Check the `piecrust.plugins.builtin.BuiltInPlugin` to see how all PieCrust functionality is implemented. ### Boilerplate code Now we have a plugin class, and a Pypi package that PieCrust can find if needed. All we need is a way to tell PieCrust how to find your plugin class in that package. In the required `piecrust_foobar` module, you need to define a `__piecrust_plugin__` global variable that points to your plugin class: __piecrust_plugin__ = FooBarPlugin That's what PieCrust will use to instantiate your plugin. ### Loading the plugin Now you can add your plugin to a PieCrust website by adding this to the website configuration: site: plugins: foobar PieCrust will prepend `piecrust_` to each specified plugin name and attempt to load that as a module (`import piecrust_foobar`). If this succeeds, it will look for a `__piecrust_plugin__` in that module, and expect its value to be a class that inherits from `PieCrustPlugin`. If everything's OK, it will instantiate that class and query it for various services and components when necessary. [pypi]: https://pypi.python.org/pypi [st]: http://pythonhosted.org/setuptools/