How to develop a source plugin for nvchecker¶
Source plugins enable nvchecker to discover software version strings in additional ways.
Where to put the plugins¶
They are Python modules put in any directories named nvchecker_source in
sys.path. This is called namespace packages introduced by PEP 420. For local use,
~/.local/lib/pythonX.Y/site-packages/nvchecker_source is a good place, or
you can define the PYTHONPATH environment variable and put nvchecker source
plugins there inside a nvchecker_source directory.
Plugins are referenced by their names in the configuration file (source = "xxx").
If multiple plugins have the same name, the first one in sys.path will be used.
How to write a simple plugin¶
For simple situations, you need to define an async function with the following signature:
async def get_version(
name: str, conf: Entry, *,
cache: AsyncCache, keymanager: KeyManager,
**kwargs,
) -> VersionResult:
...
Those types are imported from nvchecker.api.
name is the table keys in the configuration file, and conf is a dict of
the content of that table. You should not modify this dict.
cache is an AsyncCache object that
caches results for you. Every plugin has its own cache object so that cache
keys won’t conflict.
keymanager is a KeyManager object that
you can call .get_key(name) to get
the key (token) from the keyfile.
There may be additional keyword arguments in the future so **kwargs should be used.
If you want to send an HTTP request, it’s preferred to use :meth:
cache.get_json or the :data:
nvchecker.api.session object. It will use the auto-selected HTTP backend and
handle the proxy option automatically.
For details about these objects, see the API documentation,
or take existing source plugins as examples.
How to write a more powerful plugin¶
You may want more control in your source plugin, e.g. to do batch requests. To do this, you provide a class instead:
class Worker(BaseWorker):
async def run(self) -> None:
...
You will have the following in the attributes:
token_q: Queue[bool],
result_q: Queue[RawResult],
tasks: List[Tuple[str, Entry]],
keymanager: KeyManager,
You are expected to process tasks and
put results in result_q. See
nvchecker_source/none.py for the simplest example, and
nvchecker_source/aur.py for a complete, batching example.
For details about these objects, see the API documentation.
You can also receive a configuration section from the configuration as
__config__.source.SOURCE_NAME, where SOURCE_NAME is what your plugin is
called. This can be used to specify a mirror site for your plugin to use, e.g.
the npm plugin accepts the following config:
[__config__.source.npm]
registry = "https://registry.npm.taobao.org"
When such a configuration exists for your plugin, you need to define a function
named configure to receive it:
def configure(config):
'''use the "config" dict in some way'''
...