bods-fixtures
Canonical BODS v0.4 fixtures and edge-case conformance suite, shared across the BODS adapter and query-engine ecosystem.
Why this exists
The BODS adapter suite (OpenCorporates, ICIJ, Kyckr, BrightQuery, FtM, AML AI, Lance, Neo4j, GQL…) currently ships per-repo fixtures. That means each repo decides independently what "anonymous person" or "circular ownership" looks like, and nothing validates that an entity observed in two sources produces equivalent BODS.
bods-fixtures is the single source of truth:
- a small, curated set of BODS v0.4 statement bundles, each targeting a specific semantic edge case
- a co-located
.expected.mdspec per fixture describing what a correct adapter / query engine should do with it - a thin Python loader so adapters can parametrize their test suites against the shared pack
Install
pip install bods-v04-fixtures
The PyPI distribution is bods-v04-fixtures — the name makes the version
scope explicit and leaves the generic bods-fixtures name available for
future ecosystem-wide tooling. The Python import path is unchanged:
from bods_fixtures import ....
Usage
from bods_fixtures import load, list_cases
fixture = load("core/01-direct-ownership")
fixture.statements # parsed BODS v0.4 statements
fixture.statement_ids # all statementIds
fixture.record_ids # all recordIds
fixture.by_record_type("person") # filter by recordType: entity|person|relationship
fixture.find_record("rec-jane-smith-1975") # look up a record by recordId
fixture.description # rendered .expected.md spec
list_cases() # all fixtures
list_cases("edge-cases") # one category
BODS v0.4 only. Fixtures use the canonical
recordType/recordDetailsenvelope and string-basedrecordIdreferences for relationships, per the official 0.4 schema. Adapters built against the olderstatementType/describedByEntityStatementshape (BODS v0.3) will need updating before they can consume this pack — which is one of the things this pack exists to surface.
Parametrised tests
import pytest
from bods_fixtures import list_cases, load
@pytest.mark.parametrize("name", list_cases())
def test_my_adapter_round_trips(name):
fixture = load(name)
result = my_adapter.convert(fixture.statements)
assert ...
What's in the pack
Today (v0.1):
| Category | Case | Tests |
|---|---|---|
core |
01-direct-ownership |
baseline: one person, 75% shareholding + voting |
edge-cases |
10-circular-ownership |
A owns B owns A — UBO resolver termination |
edge-cases |
11-anonymous-person |
declared-unknown UBO, reason code preserved |
Planned (see CHANGELOG for target versions):
core: person-with-control, entity-owns-entity, multiple-interest-typesedge-cases: indirect chain, threshold boundaries, trust/nominee, joint ownership, historical interest, replaced statementcross-border: multi-jurisdiction chains, bearer sharescross-source: same entity from ≥2 source adapters, for consistency testsscale: synthetic 1k / 100k statement bundles for query-engine benchmarksinvalid: deliberately malformed, for negative tests
Governance
- Versioning: semver. A fixture rename, removal, or semantic change bumps major. Field additions inside a fixture bump minor. Pure documentation edits bump patch.
- Adding a fixture: the
.expected.mdis reviewed like a spec change. It is the durable record of what the fixture is testing and what correct behaviour looks like. - Removing a fixture: requires a deprecation cycle — mark in CHANGELOG one major version before removal.
Validation
The shipped tests are structural (references resolve, IDs unique, BODS version declared). For full schema validation against the BODS v0.4 JSON schema:
pip install 'bods-v04-fixtures[validate]'
(schema validation suite is a v0.2 deliverable.)
License
MIT. Fixture content is CC-BY-SA 4.0 to match BODS licensing conventions.
Metadata
Release files for bods-v04-fixtures 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| bods_v04_fixtures-0.1.1.tar.gz | 13.1 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bods_v04_fixtures-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.0 kB
Release files / bods_v04_fixtures-0.1.1.tar.gz
| Download URL | bods_v04_fixtures-0.1.1.tar.gz |
|---|---|
| Size | 13.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
061a0ff22c1c21b355303a75b6529ae4b46b483badd23b8f2fc0742a71962826
|
|
BLAKE2b-256 checksum How to use checksums |
c89cae1562b40c9bcdfd0fdb69c7979c7692bcc954ebdb16aaee718511edb456
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 20, 2026.
Transparency logRelease files / bods_v04_fixtures-0.1.1-py3-none-any.whl
| Download URL | bods_v04_fixtures-0.1.1-py3-none-any.whl |
|---|---|
| Size | 13.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1d751709b3e7e5584f413b146fc7fa75e6e62d2061e1bf78f7ca9c2850bf1910
|
|
BLAKE2b-256 checksum How to use checksums |
c7c5ebc6053bf5923ada4b7d878c84544b87e4b60af244e19c4c29c23d9e26e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 20, 2026.
Transparency logSecurity for bods-v04-fixtures 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for bods_v04_fixtures-0.1.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.