kiwi-el8/doc/source/contributing/kiwi_plugin_architecture.rst
Marcus Schäfer caf1b633fe
Update documentation in content and structure
This commit adds a documentation for the KIWI XML description.
In contrast to the former auto generated code from the XML
schema this document can now finally be used as a reference.
Along with that new chapter all auto generated and static
html content as been deleted. Also all helper scripts around
the proprietary oxygen tool and our schema doc generator
has been deleted. Auto generating this information does not
lead to a reference guide people can really work with.
As a consequence to these changes this commit also includes
some changes of the structure such that no information written
by other people in the past gets lost. This Fixes #1421
and Fixes #1474
2020-07-01 10:42:51 +02:00

114 lines
3.4 KiB
ReStructuredText

Plugin Architecture
===================
Each command provided by {kiwi} is written as a task plugin under
the **kiwi.tasks** namespace. As a developer you can extend {kiwi}
with custom task plugins if the following conventions are taken
into account:
Naming Conventions
------------------
Task Plugin File Name
The file name of a task plugin must follow the pattern
:file:`<service>_<command>.py`. This allows to invoke the task
with :command:`kiwi-ng service command ...`
Task Plugin Option Handling
{kiwi} uses the docopt module to handle options. Each task plugin
must use docopt to allow option handling.
Task Plugin Class
The implementation of the plugin must be a class that matches
the naming convention: :class:`<Service><Command>Task`. The class
must inherit from the :class:`CliTask` base class. On startup of
the plugin, {kiwi} expects an implementation of the
:file:`process` method.
Task Plugin Entry Point
Registration of the plugin must be done in :file:`setup.py`
using the ``entry_points`` concept from Python's setuptools.
.. code:: python
'packages': ['kiwi_plugin'],
'entry_points': {
'kiwi.tasks': [
'service_command=kiwi_plugin.tasks.service_command'
]
}
Example Plugin
--------------
.. note::
The following example assumes an existing Python project
which was set up according to the Python project rules
and standards.
1. Assuming the project namespace is **kiwi_relax_plugin**.
Create the task plugin directory :file:`kiwi_relax_plugin/tasks`
2. Create the entry point in :command:`setup.py`.
Assuming we want to create the service named **relax** providing
the command **justdoit** this would be the following entry point
definition in :file:`setup.py`:
.. code:: python
'packages': ['kiwi_relax_plugin'],
'entry_points': {
'kiwi.tasks': [
'relax_justdoit=kiwi_relax_plugin.tasks.relax_justdoit'
]
}
3. Create the plugin code in the file
:file:`kiwi_relax_plugin/tasks/relax_justdoit.py` with the following
content:
.. code:: python
"""
usage: kiwi-ng relax justdoit -h | --help
kiwi-ng relax justdoit --now
commands:
justdoit
time to relax
options:
--now
right now. For more details about docopt
see: http://docopt.org
"""
# These imports requires kiwi to be part of your environment
# It can be either installed from pip into a virtual development
# environment or from the distribution package manager
from kiwi.tasks.base import CliTask
from kiwi.help import Help
class RelaxJustdoitTask(CliTask):
def process(self):
self.manual = Help()
if self.command_args.get('help') is True:
# The following will invoke man to show the man page
# for the requested command. Thus for the call to
# succeed a manual page needs to be written and
# installed by the plugin
return self.manual.show('kiwi::relax::justdoit')
print(
'https://genius.com/Frankie-goes-to-hollywood-relax-lyrics'
)
4. Test the plugin
.. code:: bash
$ ./setup.py develop
$ kiwi-ng relax justdoit --now