Skip to content

Extend DataCoolie

Use the smallest extension boundary that owns the behavior. A source reads data, a destination writes it, a transformer changes the current DataFrame, an engine supplies DataFrame operations, a platform owns path/secret I/O, and a metadata provider hydrates metadata. Secret provider and resolver contracts are separate.

Start with run your first transformer plugin for a complete local installation, activation and output check. To solve an existing pipeline task, first check metadata patterns, including built-in transforms and Python function sources.

Choose the extension point

Need Guide
Read a new format or protocol Write a source
Write a new format or target Write a destination
Transform the current DataFrame Write a transformer
Add a DataFrame library Write an engine
Add filesystem, path or platform secret I/O Write a platform
Serve metadata from a new backend Write a metadata provider
Resolve a new secrets_ref prefix Write a secret resolver

Subclass the public base, implement its abstract methods and preserve its call signatures. Register only where the contract defines an entry point, and test the backend capabilities you advertise. Metadata providers are injected as instances. Project-owned runners and Python functions have their own packaging/import setup.

Registration and activation

Extension Discovery How it is used
Source / destination datacoolie.sources / datacoolie.destinations Driver factories select by connection format; custom names must also satisfy the metadata route's model/schema rules
Transformer datacoolie.transformers Runner adds the resolved instance to its transformer pipeline
Engine datacoolie.engines Runner calls create_engine and supplies the instance to the Driver
Platform datacoolie.platforms Runner calls create_platform and shares the instance with engine and Driver
Secret resolver datacoolie.resolvers Driver's default secret provider selects a resolver from a secrets_ref prefix
Metadata provider Constructor injection Runner passes a configured provider instance to the Driver

Entry points advertise installed Python classes; discovery does not install packages or prove backend support. A new format alias does not extend the metadata schema or an engine's file-format implementation. Source and destination guides explain the current boundaries. For exact group names and exports, see the entry-point reference.

Troubleshoot discovery and activation

Work through these checks in the Python environment that runs your runner:

Failure Check and next action
Alias absent Confirm the distribution is installed and its pyproject.toml declares the correct group/name; reinstall after changing package metadata
Alias resolves to an unexpected class Choose a unique alias: discovery skips names already registered, including built-ins such as csv and delta
Import fails Import the declared module:Class directly; check packaged modules and optional backend dependencies
Registry construction fails Preserve the base contract and constructor keywords passed by the caller; inspect the wrapped exception and its cause
Discovery succeeds but behavior is absent Check the activation route above, runner selection and plugin configuration; list_plugins() / is_available() do not construct or execute the plugin
Correct plugin runs but output differs Check advertised format/engine capabilities, transformer ordering, metadata and output assertions

Registries discover once per process. After installing or updating a package, start a fresh Python process or restart the notebook session before checking again. Secret resolvers are cached singleton instances; avoid putting per-run state in their constructors. Package installation belongs in environment setup before runner startup.

For advanced in-process integration, explicit registry.register(name, cls) replaces an existing registration, logs a warning and invalidates its singleton cache. Use this deliberately; an installed entry point with the same name does not override a registered built-in. See the registry API.

Read the Reference for exact contracts and the project testing strategy before publishing a plugin.