junifer/docs/extending/extension.rst
2025-07-10 11:59:26 +02:00

51 lines
1.7 KiB
ReStructuredText

.. include:: ../links.inc
.. _extending_extension:
Creating a ``junifer`` extension
================================
``junifer`` is designed to be easily extensible. Through the use of data registries,
a component registry and decorators, you can easily add new functionality to ``junifer`` during
runtime. This is done by creating a new Python module and importing it before
running ``junifer``.
A special consideration has to be made when using the
:ref:`code-less configuration<codeless>`. In this case, the
``with`` statement can be used to import a module or run a Python file.
In the following example, we instruct ``junifer`` to first import ``my_module``
and then run the ``my_file.py`` file:
.. code-block:: yaml
with:
- my_module
- my_file.py
Thus, the code from ``my_file.py`` will be executed before running ``junifer``.
This is the ideal place to include ``junifer`` extensions.
.. important::
Some ``junifer`` commands will not consider files imported from files
included in the ``with`` statement, unless this is known to junifer. If
``my_file.py`` imports ``my_other_file.py``, the ``run`` command will work,
but ``queue`` will not create a proper job. This is because we need to
let junifer know that ``my_other_file.py`` is also part of the code. To do
so, we need to include a special function in ``my_file.py`` which tells
``junifer`` about the dependencies of the module:
.. code-block:: python
def junifer_module_deps() -> List[str]:
"""Return the dependencies of the module.
Returns
-------
list of str
The list of dependencies.
"""
return ["my_other_file.py"]