HCA Schema Validator
HCA-specific extensions for cellxgene schema validation.
Installation
From PyPI (Recommended)
pip install hca-schema-validator
From Source (Development)
Install uv by whichever method you prefer — see the
official installation guide.
On macOS brew install uv and pipx install uv are both auditable alternatives
to the piped install script. Any method works; uv's version is what matters, not
how it got there.
# Clone the repository
git clone https://github.com/clevercanary/hca-validation-tools.git
cd hca-validation-tools/packages/hca-schema-validator
# Install dependencies and package
uv sync
# Run tests
uv run pytest tests/
Usage
from hca_schema_validator import HCAValidator
# Create validator instance
validator = HCAValidator()
# Validate an h5ad file
is_valid = validator.validate_adata("path/to/file.h5ad")
# Check results
if is_valid:
print("✅ Validation passed!")
else:
print("❌ Validation failed:")
for error in validator.errors:
print(f" - {error}")
Development Status
Current Version: 0.1.0 - Minimal passthrough implementation
Currently a passthrough wrapper around cellxgene-schema Validator. HCA-specific validation rules will be added incrementally.
Testing
cd hca_schema_validator
uv run pytest tests/
Project Structure
hca_schema_validator/
├── src/
│ └── hca_schema_validator/
│ ├── __init__.py # Package exports
│ └── validator.py # HCAValidator class
├── tests/
│ └── test_validator.py # Unit tests
├── pyproject.toml # uv/PEP 621 configuration & dependencies
└── README.md # This file
Ontology Data Overlay
The validator depends on cellxgene-ontology-guide for ontology term lookups. When that
package is missing terms we need (e.g., newly added CL or EFO terms), we generate updated
ontology data files and overlay them at runtime.
How it works
_vendored/cellxgene_schema/ontology_parser.py monkey-patches two functions from
cellxgene_ontology_guide.supported_versions:
load_supported_versions()loads upstream version data and patches only the ontology versions listed in_ONTOLOGY_VERSION_OVERRIDES— all other ontologies and any new entries added by future package releases are preserved unchanged.load_ontology_file(file_name)checksontology_data/first for a.json.zstfile, falling back to the package's bundled data.
Current overlays
| Ontology | Overlay Version | Bundled Version | Why |
|---|---|---|---|
| CL | v2025-12-17 | v2025-07-30 | Missing salivary gland cell types (CL:4052065-4052069) |
How to add/update an ontology overlay
Prerequisites: Python 3.10+, Docker, ~1GB disk for OWL files.
-
Clone CZI's ontology-guide repo (contains the build pipeline):
cd /tmp && mkdir ontology-guide-build && cd ontology-guide-build git clone --depth 1 https://github.com/chanzuckerberg/cellxgene-ontology-guide.git
-
Set up build environment:
python3 -m venv venv && source venv/bin/activate pip install owlready2==0.48 zstandard jsonschema semantic-version referencing cellxgene-ontology-guide docker pull obolibrary/robot:v1.9.8
-
Create a targeted ontology_info JSON with only the ontology to build. Save as
cellxgene-ontology-guide/ontology-assets/ontology_info_custom.json:{ "7.0.0": { "ontologies": { "EFO": { "version": "v3.86.0", "source": "https://github.com/EBISPOT/efo/releases/download/{version}/{filename}", "filename": "efo.owl" } } } }
Find the latest release version on the ontology's GitHub releases page (e.g., CL releases, EFO releases).
Copy the ontology entry from the existing
ontology_info.jsoninontology-assets/and update theversionfield. Keepsource,filename, and any other fields (likecross_ontology_mapping) the same. -
Run the build script:
#!/usr/bin/env python3 import json, logging, os, sys logging.basicConfig(level=logging.INFO) REPO_DIR = "/tmp/ontology-guide-build/cellxgene-ontology-guide" sys.path.insert(0, os.path.join(REPO_DIR, "tools/ontology-builder/src")) import env env.ONTOLOGY_INFO_FILE = os.path.join(REPO_DIR, "ontology-assets/ontology_info_custom.json") env.ONTOLOGY_ASSETS_DIR = os.path.join(REPO_DIR, "ontology-assets") from all_ontology_generator import _download_ontologies, _parse_ontologies, get_ontology_info_file onto_info = get_ontology_info_file(env.ONTOLOGY_INFO_FILE)["7.0.0"]["ontologies"] _download_ontologies(onto_info) for f in _parse_ontologies(onto_info): logging.info(f"Generated: {f}")
-
Copy the
.json.zstoutput intosrc/hca_schema_validator/ontology_data/. -
Add an entry to
_ONTOLOGY_VERSION_OVERRIDESinontology_parser.py:_ONTOLOGY_VERSION_OVERRIDES = { ("7.0.0", "CL"): "v2025-12-17", ("7.0.0", "EFO"): "v3.86.0", # new }
-
Verify and test:
uv run python -c " from hca_schema_validator._vendored.cellxgene_schema.ontology_parser import ONTOLOGY_PARSER print(ONTOLOGY_PARSER.is_valid_term_id('CL:4052065')) # True " uv run pytest tests/ -v
-
Clean up:
rm -rf /tmp/ontology-guide-build
Removing the overlay
Once cellxgene-ontology-guide publishes a version that includes all the terms we need:
- Delete the overlay files from
ontology_data/(keep only__init__.py) - Revert
ontology_parser.pyto its original form:from cellxgene_ontology_guide.ontology_parser import OntologyParser ONTOLOGY_PARSER = OntologyParser(schema_version="v7.0.0")
- Bump
cellxgene-ontology-guideversion inpyproject.toml
License
MIT
Metadata
Release files for hca-schema-validator 0.15.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 | |
|---|---|---|---|
| hca_schema_validator-0.15.1.tar.gz | 6.4 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hca_schema_validator-0.15.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 12.7 MB
Release files / hca_schema_validator-0.15.1.tar.gz
| Download URL | hca_schema_validator-0.15.1.tar.gz |
|---|---|
| Size | 6.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6000c36db4f95aba569b588939a8904f042c8dbd0148d1ba7c644a46897f7795
|
|
BLAKE2b-256 checksum How to use checksums |
93e47d1cb6dfda95b952ad25f48917f48467a6ec7a8a7dff2dfaad949997bb84
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 30, 2026.
Transparency logRelease files / hca_schema_validator-0.15.1-py3-none-any.whl
| Download URL | hca_schema_validator-0.15.1-py3-none-any.whl |
|---|---|
| Size | 6.2 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6419b2b1d381fedd66ffc288bb01fa7761ff041ea69850c63b1d55be3551d862
|
|
BLAKE2b-256 checksum How to use checksums |
c2b02dbf555a9fbcfd036fc057c2fc5e7fb78e5fa635f2d1fbca64fcaed4b4c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 30, 2026.
Transparency log