home / tils / til

Menu
  • GraphQL API

til: datasette_register-new-plugin-hooks.md

This data as json

path topic title url body html shot created created_utc updated updated_utc shot_hash slug
datasette_register-new-plugin-hooks.md datasette Registering new Datasette plugin hooks by defining them in other plugins https://github.com/simonw/til/blob/main/datasette/register-new-plugin-hooks.md I'm experimenting with a Datasette plugin that itself adds new plugin hooks which other plugins can then interact with. It's called [datasette-low-disk-space-hook](https://github.com/simonw/datasette-low-disk-space-hook), and it adds a new plugin hook called `low_disk_space(datasette)`, defined in the [datasette_low_disk_space_hook/hookspecs.py](https://github.com/simonw/datasette-low-disk-space-hook/blob/0.1a0/datasette_low_disk_space_hook/hookspecs.py) module. The hook is registered by this code in [datasette_low_disk_space_hook/\_\_init\_\_.py](https://github.com/simonw/datasette-low-disk-space-hook/blob/0.1a0/datasette_low_disk_space_hook/__init__.py) ```python from datasette.utils import await_me_maybe from datasette.plugins import pm from . import hookspecs pm.add_hookspecs(hookspecs) ``` This imports the plugin manager directly from Datasette and uses it to add the new hooks. I was worried that the `pm.add_hookspects(hookspecs)` line was not guaranteed to be executed if that module had not been imported. It turns out that having this `entrpoints=` line in [setup.py](https://github.com/simonw/datasette-low-disk-space-hook/blob/0.1a0/setup.py) is enough to ensure that the module is imported and the `pm.add_hookspecs()` line is executed: ```python from setuptools import setup setup( name="datasette-low-disk-space-hook", # ... entry_points={"datasette": ["low_disk_space_hook = datasette_low_disk_space_hook"]}, # ... ) ``` <p>I'm experimenting with a Datasette plugin that itself adds new plugin hooks which other plugins can then interact with.</p> <p>It's called <a href="https://github.com/simonw/datasette-low-disk-space-hook">datasette-low-disk-space-hook</a>, and it adds a new plugin hook called <code>low_disk_space(datasette)</code>, defined in the <a href="https://github.com/simonw/datasette-low-disk-space-hook/blob/0.1a0/datasette_low_disk_space_hook/hookspecs.py">datasette_low_disk_space_hook/hookspecs.py</a> module.</p> <p>The hook is registered by this code in <a href="https://github.com/simonw/datasette-low-disk-space-hook/blob/0.1a0/datasette_low_disk_space_hook/__init__.py">datasette_low_disk_space_hook/__init__.py</a></p> <div class="highlight highlight-source-python"><pre><span class="pl-k">from</span> <span class="pl-s1">datasette</span>.<span class="pl-s1">utils</span> <span class="pl-k">import</span> <span class="pl-s1">await_me_maybe</span> <span class="pl-k">from</span> <span class="pl-s1">datasette</span>.<span class="pl-s1">plugins</span> <span class="pl-k">import</span> <span class="pl-s1">pm</span> <span class="pl-k">from</span> . <span class="pl-k">import</span> <span class="pl-s1">hookspecs</span> <span class="pl-s1">pm</span>.<span class="pl-en">add_hookspecs</span>(<span class="pl-s1">hookspecs</span>)</pre></div> <p>This imports the plugin manager directly from Datasette and uses it to add the new hooks.</p> <p>I was worried that the <code>pm.add_hookspects(hookspecs)</code> line was not guaranteed to be executed if that module had not been imported.</p> <p>It turns out that having this <code>entrpoints=</code> line in <a href="https://github.com/simonw/datasette-low-disk-space-hook/blob/0.1a0/setup.py">setup.py</a> is enough to ensure that the module is imported and the <code>pm.add_hookspecs()</code> line is executed:</p> <div class="highlight highlight-source-python"><pre><span class="pl-k">from</span> <span class="pl-s1">setuptools</span> <span class="pl-k">import</span> <span class="pl-s1">setup</span> <span class="pl-en">setup</span>( <span class="pl-s1">name</span><span class="pl-c1">=</span><span class="pl-s">"datasette-low-disk-space-hook"</span>, <span class="pl-c"># ...</span> <span class="pl-s1">entry_points</span><span class="pl-c1">=</span>{<span class="pl-s">"datasette"</span>: [<span class="pl-s">"low_disk_space_hook = datasette_low_disk_space_hook"</span>]}, <span class="pl-c"># ...</span> )</pre></div> <Binary: 64,078 bytes> 2022-06-17T13:04:35-07:00 2022-06-17T20:04:35+00:00 2022-06-17T13:04:35-07:00 2022-06-17T20:04:35+00:00 38c23e5679fa88c44f7e14038ea1b4ae register-new-plugin-hooks
Powered by Datasette · How this site works · Code of conduct