Skip to main content

dv_schema_models

Pydantic models for Dataverse metadata — parse the schema, load dataset exports, and validate field values against the schema.

[!CAUTION] This library is under active development and the API is not yet stable. Breaking changes may occur between releases. Please pin to a specific version in your pyproject.toml or requirements.txt if you want to avoid surprises.

Pre-requisites

  1. Python 3.10+

Installation

  1. With uv (recommended):
uv add dv_schema_models
  1. With pip:
pip install dv_schema_models

To export schemas to Excel (see usage #5), install with the spreadsheet extra:

uv add "dv_schema_models[spreadsheet]"   # or: pip install "dv_schema_models[spreadsheet]"

Concepts

Thing What it is
Schema /api/metadatablocks response — defines what fields can exist, their types, and rules
Dataset instance GET /api/datasets/:id response — the actual metadata values for one dataset
Record model A Pydantic model generated from the schema, used to validate instance values

Usage

1. Load and query the schema

import json
from dv_schema_models.dataverse_schema import load_schema

schema = load_schema(json.load(open("dv_schema.json")))

schema.block_names()                        # ['citation', 'geospatial', ...]
block = schema.get_block("citation")
block.fields.keys()                         # top-level field names
block.required_fields()                     # leaf fields where isRequired=True
block.all_leaf_fields()                     # flattened, including nested compound fields

field = block.get_field("keyword")
field.is_compound()                         # True — has childFields
field.iter_leaf_fields()                    # [keywordValue, keywordVocabulary, ...]

2. Load a dataset and read values

import json
from dv_schema_models.dataset_instance import load_dataset

dataset = load_dataset(json.load(open("ds_metadata.json")))

# Load the possible typeNames for a given block
dataset.field_names("citation")  # ['title', 'author', 'keyword', ...] 
dataset.data.latestVersion.metadataBlocks.get("citation").field_names() # same


# Shortcut from the top level
dataset.get_value("citation", "title")      # plain string

# Or drill down
block = dataset.data.latestVersion.metadataBlocks.get("citation")
block.get_value("keyword")                  # unwrapped Python value (str / list / dict)
block.get_field("author").simple_value()    # [{'authorName': 'Author1', 'authorAffiliation': 'Author1Aff'...} ... {'authorName': 'Author2', 'authorAffiliation': 'Author2Aff'...}]

# Pull one subfield out of a compound field
block.get_subfield_values("author", "authorName")  # ['Author1', 'Author2']

3. Validate instance values against the schema

import json
from dv_schema_models.dataverse_schema import load_schema
from dv_schema_models.dataset_instance import load_dataset
from dv_schema_models.schema_driven_records import build_record_model, flatten_instance


schema = load_schema(json.load(open("dv_schema.json")))
dataset = load_dataset(json.load(open("ds_metadata.json")))

citation_schema = schema.get_block("citation")
CitationRecord = build_record_model(citation_schema)   # dynamic Pydantic model

block = dataset.data.latestVersion.metadataBlocks.get("citation")
raw = flatten_instance(block)              # {typeName: value, ...}
record = CitationRecord.model_validate(raw)

The generated model enforces field names, required/optional status, list wrapping for multiple=True fields, and int/float types where declared by the schema.

4. Discover available fields

# Fields actually present in this dataset instance
block = dataset.data.latestVersion.metadataBlocks.get("citation")
block.field_names()                            # e.g. ['title', 'author', 'keyword', ...]

# All fields the schema defines (including absent/optional ones)
schema.get_block("citation").all_leaf_fields().keys()

# After validation, access as typed attributes
record = CitationRecord.model_validate(flatten_instance(block))
record.title          # str
record.author         # list[...] for multiple=True compound fields
record.keyword        # None if not present in this dataset (optional fields default to None)
# Note: field names with dots become underscores — e.g. 'resolution.Spatial' → record.resolution_Spatial

5. Export the schema to a spreadsheet

Requires the spreadsheet extra (see Installation).

import json
from dv_schema_models.dataverse_schema import load_schema
from dv_schema_models.schema_spreadsheet import SchemaSpreadsheet

schema = load_schema(json.load(open("dv_schema.json")))
SchemaSpreadsheet(schema).write("dv_schema.xlsx")

Writes an .xlsx workbook with one formatted worksheet per metadata block plus a combined All sheet. See docs/schema_spreadsheet/README.md for the output layout, column mapping, and architecture.

Input file shapes

Schema — output of Dataverse /api/metadatablocks:

{"status": "OK", "data": [{"id": 10, "name": "citation", "fields": {...}}]}

Dataset — output of Dataverse GET /api/datasets/:id:

{"status": "OK", "data": {"latestVersion": {"metadataBlocks": {"citation": {"fields": [...]}}}}}

Citation

If you use this library in your work, please cite according to CITATION

License

MIT

Metadata

Release files for dv_schema_models 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dv_schema_models 0.4.0
File Size Uploaded
dv_schema_models-0.4.0.tar.gz 12.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dv_schema_models 0.4.0
File Interpreter ABI Platform
dv_schema_models-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 24.0 kB

Release files / dv_schema_models-0.4.0.tar.gz

Download URL dv_schema_models-0.4.0.tar.gz
Size 12.0 kB
Tags Source
SHA-256 checksum
How to use checksums
504a7d7b40bdad382a8c9df6164d261fe7bfaff0729a4122f2e042e0d1758ed6
BLAKE2b-256 checksum
How to use checksums
f68f1dc372a2d3bf4014621c7f9981dc0bb336b7d702dce16c0355bded58d7c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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}

Release files / dv_schema_models-0.4.0-py3-none-any.whl

Download URL dv_schema_models-0.4.0-py3-none-any.whl
Size 12.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fb6385ad2bd010e5706699317801ff203a224577d1cc79aea9d89c60df3fa231
BLAKE2b-256 checksum
How to use checksums
e1c38973dcb87ea96d4480b178d387422d158c839a4bf481f0b676a688f3882b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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}
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page