flaschengeist/doc/plugin.md

2.1 KiB

Example on Plugin Development

File Structure

- root
  - flaschengeist_example
    - __init__.py
    - plugin.py
    [- migrations]
  - setup.cfg

In a minimal example, you would only need two python source files and your setup configuration. If you also use custom database tables, you would also need a directory containing your alembic-migration files.

Source code

Code is seperated in two locations, the meta data of your plugin goes into the __init__.py and all logic goes into the plugin.py, of cause you could add more files, but make sure to not depend on some external packages in the __init__.py.

Project data / setuptools

For Flaschengeist to find your plugin, you have to install it corretly, especially the entry points have to be set.

[metadata]
license = MIT
version = 1.0.0
name = flaschengeist-example
description = Example plugin for Flaschengeist
# ...

[options]
packages =
    flaschengeist_example
install_requires =
    flaschengeist == 2.0.*

[options.entry_points]
    # Path to your meta data instance
    flaschengeist.plugins =
        example = flaschengeist_example:plugin

Metadata

The __init__.py contains the plugin meta data.

# __init__.py
from flaschengeist.plugins import PluginMetadata
plugin = PluginMetadata(
    id="com.example.plugin", # unique, recommend FQN
    name="Example Plugin", # Human readable name
    version="1.0.0", # Optional
    module="flaschengeist_example.plugin.ExamplePlugin" # module and class of your plugin
)

version is optional, if not provided the version of your distribution (set in setup.cfg) is used.

Implementation

You plugin implementation goes into the plugin.py. Here you define your Plugin class, make sure it inheritates from flaschengeist.plugins.Plugin or flaschengeist.plugins.AuthPlugin respectivly.

It will get initalized with the meta data you defined in the __init__.py and the configuration object.

from flaschengeist.plugins import Plugin
from flask import Blueprint

bp = Blueprint(...)

class ExamplePlugin(Plugin):
    blueprint = bp
    ...

@bp.route("/example")
def get_example():
    ...