Plugins
Plugins are a way to extend the functionality of the render engine site.
Registering Plugins
Plugins are registered by using register_plugins
from render_engine import Site
from my_plugin import MyPlugin
app = Site()
app.register_plugins(MyPlugin, my_plugin={"foo":"bar"})
Alternatively, you can pass a list of plugins to the plugins
attribute of the Site
class.
Plugins are passed to collections and pages when the site.collection
and site.page
methods are called.
from render_engine import Site, Collection, Page
@my_site.page # plugins are ran on the page
class MyPage(Page):
pass
@site.collection # plugins are ran on each page in the collection
class MyCollection(Collection):
pass
my_site.route_list['mypage']._pm.list_name_plugin()
>>> ['MyPlugin']
When the site.collection
and site.page
methods are called the collection/page is populated with all currently
registered plugins. Additional calls to site.register_plugins
after the call to site.collection
or
site.page
will not register the new plugin with the collection/page.
from render_engine import Site, Collection, Page
from my_plugins import Plugin1, Plugin2
app = Site()
app.register_plugins(Plugin1)
@my_site.page # Plugin1 is registered here.
class MyPage(Page):
pass
@site.collection # Plugin1 is registered here.
class MyCollection(Collection):
pass
app.register_plugins(Plugin2) # Plugin2 is only registered for the site and not for MyPage or MyCollection
Single Page/Collection plugins
Plugins can be implemented on a case by case basis by adding them to the objects plugins
attribute.
app.register_plugins(MyPlugin1)
@app.page
class MyPage(Page):
plugins = [MyPlugin2]
my_.route_list['mypage']._pm.list_name_plugin()
>>> ['MyPlugin1', 'MyPlugin2']
Ignoring Plugins
Pages and collections can ignore plugins by passing a list of plugin names to the ignore_plugins
attribute.
app.register_plugins(MyPlugin1, MyPlugin2)
@app.page
class MyPage(Page):
ignore_plugins = [MyPlugin1]
my_site.route_list['mypage']._pm.list_name_plugin()
>>> ['MyPlugin2']
Overriding and Augmenting Plugin Settings
Plugins are implemented with a dictionary of default settings. These settings can be overridden and/or augmented when we register the plugin.
# Add a keyword parameter where the key is the plugin class name and the value is the new settings
app.register_plugins(MyPlugin1, MyPlugin2, MyPlugin1={'settings': 'overide'})
Alternatively when adding a plugin to a collection or page:
@app.page
class MyPage(Page):
plugins = [(MyPlugin, {'settings': 'override'})]
Note: Registering a plugin with settings will merge the default settings with the overridden settings. If you
register a plugin that has default settings of {'setting1': 'a'}
with settings {'setting2': 'b'}
the
settings sent to the plugin will be {'setting1': 'a', 'setting2': 'b'}
.
Implementing a plugin
Plugins are built with pluggy. See the pluggy documentation for more information.
Plugins use the entrypoints defined in render_engine.plugins
. These allow plugins to be called at different
points in the render engine lifecycle.
Currently supported hooks are:
Hook | Parameters |
---|---|
pre_build_site | site: Site, settings: dict |
post_build_site | site: Site, settings: dict |
pre_build_collection | collection: Collection, site: Site, settings: dict |
post_build_collection | collection: Collection, site: Site, settings: dict |
render_content | page: Page, settings: dict, site: Site |
post_render_content | page: Page, settings: dict, site: Site |
All plugin classes must include a dictionary of default_settings
. All of the hooks take a site: Site
and a settings: dict
parameter. The pre_build_collection
and post_build_collection
also take a
collection: Collection
parameter. The render_content
and post_render_content
take a
page: Page
parameter in addition to the
Plugin hooks must be staticmethod
and do not take self
as a parameter.
To access the settings in your plugin you need to use settings[<PluginClassName>]
:
class MyPlugin:
default_settings = {}
@staticmethod
@hook_impl
def pre_build_site(site; Site, settings: dict):
my_settings = settings['MyPlugin']
...