rsm-schema#
This project defines the Research Software Management (RSM) Metadata Schema and its Python representation.
The package includes:
the JSON Schema itself
generated Pydantic v2 models for validating RSM documents
a small inspection API for traversing the JSON Schema
flowchart LR
S["rsm.schema.json<br/>source of truth"]
S -->|datamodel-code-generator| G["rsm_schema.generated<br/>Pydantic v2 models"]
S -->|loaded at import| I["rsm_schema.inspector<br/>Schema / SchemaNode"]
S -->|copied by the docs build| P["published at the $id URL"]
Start here#
API reference — validate documents and inspect the schema from Python.
Schema workflow — change, generate, test, archive, and publish the contract.
Package layers#
Layer |
Purpose |
|---|---|
|
The bundled JSON Schema file, also published at its |
|
Traversal, JSON Pointer lookup, local |
|
Pydantic v2 classes generated from the same JSON Schema |
Install#
pip install rsm-schema
Python 3.14 is required.
Validate a document#
RSMMetadata is the document root. Only project_slug is required; every other
property either defaults to an empty container or is left unset.
from rsm_schema import RSMMetadata, validate_document
document = {
"project_slug": "my-project",
"project_name": "My Project",
"development_status": "wip",
"topics": {
"entries": [
{
"term": "Data analysis",
"uri": "https://edamontology.org/topic_3474",
}
]
},
"contributors": {
"entries": [
{
"name": "Ada Lovelace",
"email": "ada@example.org",
"roles": ["Original author", "Maintainer"],
"affiliations": [
{"name": "Leiden University Medical Center"},
{"name": "Leiden University"},
],
}
]
},
}
validate_document(document)
metadata = RSMMetadata.model_validate(document)
print(metadata.contributors.entries[0].affiliations[0].name)
print(metadata.topics.entries[0].term)
validate_document() is the authoritative validation path and enforces JSON
Schema conditionals that generated Pydantic models cannot represent.
Inspect the schema#
from rsm_schema import schema
schema.validate_schema()
print(schema.title)
for field in schema.root.properties:
print(field.name, field.types, field.required)
person = schema.definition("person")
print([field.name for field in person.properties])