Plugin author guide
A SpectroChemPy plugin is a Python package that exposes an entry point in the
spectrochempy.plugins group and returns declarative contributions.
Minimal structure
myplugin/
pyproject.toml
src/myplugin/__init__.py
src/myplugin/readers.py
The entry point points to a plugin class:
[project.entry-points."spectrochempy.plugins"]
myplugin = "myplugin:MyPlugin"
The plugin declares contributions:
from spectrochempy.api.plugins import SpectroChemPyPlugin
from .readers import read_myformat
class MyPlugin(SpectroChemPyPlugin):
name = "myplugin"
version = "0.1.0"
def register_readers(self) -> list[dict]:
return [
{
"name": "myformat",
"func": read_myformat,
"description": "Read MyFormat files",
"extensions": [".myf"],
},
]
Readers and writers
Readers create datasets and belong under scp.<plugin> or compatibility
scp.read_<format> aliases. They should not be dataset accessors.
Use plugin handlers for format-specific filename inference:
def register_handlers(self) -> dict:
return {
"importer.resolve_directory_target": resolve_directory_target,
"importer.infer_filetype_key": infer_filetype_key,
}
Accessors
Dataset accessors are for operations that act on an existing
NDDataset:
def register_accessors(self) -> list[dict]:
return [
{
"namespace": "myplugin",
"name": "normalize",
"func": normalize_dataset,
"description": "Normalize a dataset using MyPlugin rules",
},
]
Handlers
Handlers are named extension points used when the core must delegate behavior without importing plugin-specific types or conventions:
def register_handlers(self) -> dict:
return {
"ndmath.execution_branch": execution_branch,
"ndmath.execute": execute_numeric_branch,
"importer.remote_download_target": remote_download_target,
}
Numeric backends and unit contexts
Use numeric backend handlers when plugin data needs a non-standard execution path, such as quaternion arrays. Use unit contexts when unit conversion needs domain metadata, such as an acquisition frequency.
Official and third-party plugins
Official plugins are maintained with SpectroChemPy and may receive coordinated
docs, examples, tests, and temporary compatibility aliases. Third-party plugins
use the same public API but should document their own namespaces and avoid
depending on private spectrochempy.plugins internals.
See also Plugin architecture, Plugin accessors, Numeric backends, and Unit contexts.