ancpBIDS is a modular Python library for reading, querying, validating, and writing BIDS datasets. Its architecture is designed for extensibility and maintainability.
Key Features
-
BIDS Dataset Loading
Load BIDS datasets of any size or complexity, with support for multiple BIDS schema versions. -
Flexible Query Engine
Query files, folders, and metadata using a powerful, Pythonic API. Supports entity-based, scope-based, and custom queries. -
Validation
Validate datasets against the BIDS specification and custom rules using a plugin-based validation system. -
Writing and Derivatives
Write and update BIDS datasets, including support for creating and saving BIDS derivatives. -
Lazy Loading
Efficiently handle large datasets with optional lazy loading, reducing memory usage and speeding up initial access. -
Plugin Architecture
Extend or customize core functionality (validation, file handling, schema, etc.) via a robust plugin system. -
PyBIDS Compatibility Layer
Drop-in compatibility for manypybidsAPI calls, easing migration from or integration with existing codebases. -
Synthetic and Real Data Support
Works with both synthetic test datasets and real-world BIDS datasets. -
CI/CD Ready
Includes a comprehensive suite of automated and manual tests, with synthetic datasets for reproducibility. -
Extensible and Versioned Schema
Supports multiple BIDS schema versions and allows for easy extension as the BIDS standard evolves.
Architecture
-
Core Models:
The in-memory graph is hand-maintained inancpbids/model_base.py. Versioned enums are loaded at runtime from official BIDSschema.jsonfiles vendored inancpbids/schema/. -
Plugin System:
The plugin mechanism (seeancpbids/plugin.py) allows for dynamic extension of core functionality. Plugins can hook into schema modification, dataset processing, file handling, writing, and validation. Graph methods (query,get_schema, …) live on the model classes;SchemaPluginremains an extension point. -
Query Engine:
The query logic is implemented inancpbids/query.py, providing flexible access to dataset contents and metadata. -
Compatibility Layer:
ancpbids/pybids_compat.pyprovides compatibility with the pybids API for easier migration and integration. -
Utilities:
Helper functions and utilities are inancpbids/utils.py. -
Testing:
Thetests/directory is organized intoauto(CI-safe) andmanual(non-deterministic or performance) tests, with synthetic datasets undertests/data/.
Plugin and mixin system
Extensibility comes in two shapes:
- Plugins — hook into load / write / validate / schema / file I/O (
executemethods). - Mixins — add methods to a host class such as
BIDSLayoutvia@mixin(target=...).
Built-in plugins/mixins are registered the same way: decorated with
@plugin(ranking=0, system=True) / @mixin(...) and listed under
ancpbids.plugins / ancpbids.mixins in this project's pyproject.toml.
Third-party packages add their own entries to those groups.
Registering an external plugin
-
Decorate a plugin subclass:
from ancpbids.plugin import ValidationPlugin, plugin @plugin(ranking=1000) class SiteRulesPlugin(ValidationPlugin): def execute(self, dataset, report: ValidationPlugin.ValidationReport): pass
-
In your package’s
pyproject.toml:[project.entry-points."ancpbids.plugins"] site_rules = "lab_bids_extensions.validation:SiteRulesPlugin"
-
Install alongside ancpBIDS; importing
ancpbidsloads the plugin.
Registering an external mixin
-
Decorate a mixin with a target (live class or
"module:Class"string):from ancpbids import BIDSLayout from ancpbids.plugin import mixin @mixin(target=BIDSLayout, ranking=1000) class MyExportMixin: def to_custom(self): ...
-
Advertise under
ancpbids.mixins:[project.entry-points."ancpbids.mixins"] my_export = "lab_bids_extensions.exports:MyExportMixin"
Built-in DataFrameMixin lives in ancpbids.mixins.mixin_dataframe, uses @mixin(target=BIDSLayout, ranking=0), and is listed as to_df under the ancpbids.mixins entry-point group in this project's pyproject.toml.
Full guide: docs/source/plugins.rst.
Versioning and Schema Evolution
- The codebase supports multiple BIDS schema versions via vendored
schema.jsonfiles. - The schema is loaded dynamically based on the dataset version, allowing for forward compatibility.
Testing and CI
- Unit Tests:
Located intests/auto/, these are run automatically in CI. - Manual/Performance Tests:
Located intests/manual/, these are for benchmarking or non-deterministic checks. - Synthetic Data:
All tests use synthetic datasets intests/data/to ensure reproducibility.
Developer Guidelines
- Extending the Model:
Add a newancpbids/schema/schema_v<version>.json(see Model Generation Utility). Type stubs andmodel_latestupdate from the vendored JSON files. - Adding Plugins:
Follow the plugin system described above (including external entry points). - Testing:
Add new tests totests/auto/for CI-safe code, and totests/manual/for performance or integration tests. - Documentation:
UpdateREADME.mdand docstrings for any new features or changes.
Code Quality
- The codebase uses type hints and docstrings for clarity.
- Contributions should follow PEP8 and include tests and documentation.
Model Generation Utility
The in-memory graph (ancpbids/model_base.py) is hand-maintained. tools/generatemodel.py fetches an official BIDS schema.json into ancpbids/schema/ and writes version-specific type stubs (v1_X_Y.pyi) so IDEs can see enum literals such as SuffixEnum.bold. Enums are still built from JSON at runtime.
Usage:
uv run --with requests python tools/generatemodel.py [--schema-version <version>]
uv run python tools/generatemodel.py --stubs-only
- If
--schema-versionis omitted, the latest available schema version is used. --stubs-onlyregenerates stubs from JSON files already inancpbids/schema/.- Output:
ancpbids/schema/schema_v<version>.json,ancpbids/schema/v1_X_Y.pyi, andancpbids/schema/aliases.pyi.
Further Reading
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ancpbids-0.4.2.tar.gz.
File metadata
- Download URL: ancpbids-0.4.2.tar.gz
- Upload date:
- Size: 662.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6207110a41c7d98ae42b3be880d231dc65d8e25a9abef44631dc8bc6f8e300c5
|
|
| MD5 |
622c9880980c1397decdd2ca5ed1f89c
|
|
| BLAKE2b-256 |
44dc90a067bb2333365a5383cf2b204371bf974d0b38eee00d9b8a62d20fa529
|
File details
Details for the file ancpbids-0.4.2-py3-none-any.whl.
File metadata
- Download URL: ancpbids-0.4.2-py3-none-any.whl
- Upload date:
- Size: 660.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a267b6500cc710cc415059d82b4c68974a1ccee47e6886a9e71fd6a8d2a9ae55
|
|
| MD5 |
7a0149777adf75107a034ec51be7b4ad
|
|
| BLAKE2b-256 |
ac405fef2bcc8afe143ad0245354b37c816c11d736ce946a875e7fdaeda480d6
|