.. _extensions: Extension Packages ================== .. note:: For some additional discussion, see `YTEP-0029 <https://ytep.readthedocs.io/en/master/YTEPs/YTEP-0029.html>`_, where this plan was designed. As of version 3.3 of yt, we have put into place new methods for easing the process of developing "extensions" to yt. Extensions might be analysis packages, visualization tools, or other software projects that use yt as a base engine but that are versioned, developed and distributed separately. This brings with it the advantage of retaining control over the versioning, contribution guidelines, scope, etc, while also providing a mechanism for disseminating information about it, and potentially a method of interacting with other extensions. We have created a few pieces of infrastructure for developing extensions, making them discoverable, and distributing them to collaborators. If you have a module you would like to retain some external control over, or that you don't feel would fit into yt, we encourage you to build it as an extension module and distribute and version it independently. Hooks for Extensions -------------------- Starting with version 3.3 of yt, any package named with the prefix ``yt_`` is importable from the namespace ``yt.extensions``. For instance, the ``yt_interaction`` package ( https://bitbucket.org/data-exp-lab/yt_interaction ) is importable as ``yt.extensions.interaction``. In subsequent versions, we plan to include in yt a catalog of known extensions and where to find them; this will put discoverability directly into the code base. .. _frontends-as-extensions: Frontends as extensions ----------------------- Starting with version 4.2 of yt, any externally installed package that exports :class:`~yt.data_objects.static_output.Dataset` subclass as an entrypoint in ``yt.frontends`` namespace in ``setup.py`` or ``pyproject.toml`` will be automatically loaded and immediately available in :func:`~yt.loaders.load`. To add an entrypoint in an external project's ``setup.py``: .. code-block:: python setup( # ..., entry_points={ "yt.frontends": [ "myFrontend = my_frontend.api.MyFrontendDataset", "myOtherFrontend = my_frontend.api.MyOtherFrontendDataset", ] } ) or ``pyproject.toml``: .. code-block:: toml [project.entry-points."yt.frontends"] myFrontend = "my_frontend.api:MyFrontendDataset" myOtherFrontend = "my_frontend.api:MyOtherFrontendDataset" Extension Template ------------------ A template for starting an extension module (or converting an existing set of code to an extension module) can be found at https://github.com/yt-project/yt_extension_template . To get started, download a zipfile of the template ( https://codeload.github.com/yt-project/yt_extension_template/zip/master ) and follow the directions in ``README.md`` to modify the metadata. Distributing Extensions ----------------------- We encourage you to version on your choice of hosting platform (Bitbucket, GitHub, etc), and to distribute your extension widely. We are presently working on deploying a method for listing extension modules on the yt webpage.