[kforge-dev] plugin packaging

John Bywater john.bywater at appropriatesoftwarefoundation.org
Mon Sep 19 15:25:01 UTC 2005


In general, I think this should follow the way, for example, a KForge 
package would be installed on a package-based distribution: the 
pre-installed files are put into various right places within the system.

A plugin may have:

plugin object (to receive system events): required
extensions to the domain model (ie persisted plugin specific domain objects)
presentation views, forms, and inserts for other views
presentation templates
plugin specific configuration


Rufus Pollock wrote:

> As more plugins get developed we want to start thinking about how 
> plugins get packaged and the related question of what files/info 
> plugins are expected to supply and where this is installed.
>
> Example: Plugin Config
> ======================
>
> Can't start adding all of plugin configuration to kforge.conf (as we 
> have started to with e.g. trac). as:
>
>   * wrong dependency direction: should have plugins -> core not core 
> -> plugins
>   * this goes back to a very early discussion about whether plugin 
> specific config need be available to other parts of the system
>     * if does not need to be available we can just put config in with 
> plugin and leave it there
>     * if it does need to be available then have to install 
> configuration into central system dictionary when you install the 
> plugin (an alternative is for plugin to support some kind of querying 
> interface)
>
> So where should plugin config and other stuff go?


In repository:

src/kforge/plugin/[plugin-name]/__init__.py (holding class called Plugin 
which derives from the PluginBase class)
src/kforge/plugin/[plugin-name]/command.py
src/kforge/plugin/[plugin-name]/django/templates/
src/kforge/plugin/[plugin-name]/docs/
src/kforge/plugin/[plugin-name]/dom.py
src/kforge/plugin/[plugin-name]/etc/[plugin-name].conf

or wherever the plugin is being developed.

In installed system:

kforge/plugin/[plugin-name]/__init__.py
etc/plugin/[plugin-name].conf
django/templates/plugin/[plugin-name]/

I think config should be defined in the same style throughout. So having 
plugins use a python module for configuration, when the core system 
doesn't seems wrong to me.

>
> Proposal
> ========
>
> Personally I have a great preference for keeping plugins as 
> self-contained and self-sufficient as possible. This means, for 
> example, keeping the config with the plugin. This way plugins and the 
> core system are as independent as possible.
>
> Suggestion for files:
>
> 1. docs:
>   * README.txt
>   * INSTALL.txt (optional)
>   * LICENSE.txt if different from main license
> 2. code modules supplying at minimum:
>   kforge.plugin.<plugin-name>.Plugin
> 3. config.py file so that you have plugin config in module (how does 
> this work with single module plugins?)
>   kforge.plugin.<plugin_name>.config


It doesn't work. But we make things really flexible and search through 
the loaded plugin package for classes which extend PluginBase, 
DomainObject, (a future ConfigBase?) etc. and deal with them appropriately.

This would mean that a plugin implementor would just need to define 
objects, rather than also conform to strange requirements to load them 
onto the core (by naming convention, such as Plugin above, or by method, 
such as how the Trac plugin registers the TracProject domain object). 
The KForge core could go through the attributes of the package, and use 
the first PluginBase extension it finds as the plugin system, register 
all DomainObject extensions with the domain model, and place any Config 
extension in the system dictionary. That would make the plugin 
implementors task much simpler than at present.

>
> Extra Questions
> ===============
>
> QU: Should plugins outside of the kforge namespace be allowed?
> ANS: Current position is no.

I think we should stay with 'no'.

As above, KForge plugins are Python packages that are installed to 
kforge.plugin.[name] which contain at least:

<python>
import kforge.plugin

class Plugin(kforge.plugin.PluginBase):
    pass

</python>

such that the following works:

<python>
import kforge.plugin.[name]

kforge.plugin.[name].Plugin()

</python>


Configuration could/should be made to appear in the system dictionary as 
plugin.name.variable. (The PluginBase class holds a reference to the 
system dictionary.)
Templates could/should be loaded from path with prefix: plugin/name/
etc.

John.






More information about the kforge-dev mailing list