Source code for gypsum_client.validate_metadata
import json
from typing import Optional, Union
from jsonschema import validate as json_validate
__author__ = "Jayaram Kancherla"
__copyright__ = "Jayaram Kancherla"
__license__ = "MIT"
[docs]
def validate_metadata(
metadata: Union[str, dict], schema: str, stringify: Optional[bool] = None
) -> bool:
"""Validate metadata against a JSON schema for a SQLite database.
See Also:
:py:func:`~gypsum_client.fetch_metadata_schema.fetch_metadata_schema`, to get
the JSON schema.
:py:func:`~gypsum_client.fetch_metadata_database.fetch_metadata_database`,
to obtain the SQLite database of metadata.
Example:
.. code-block:: python
_cache_dir = tempfile.mkdtemp()
metadata = {
"title": "Fatherhood",
"description": "Luke ich bin dein Vater.",
"sources": [{"provider": "GEO", "id": "GSE12345"}],
"taxonomy_id": ["9606"],
"genome": ["GRCm38"],
"maintainer_name": "Darth Vader",
"maintainer_email": "vader@empire.gov",
"bioconductor_version": "3.10",
}
schema = fetch_metadata_schema(cache_dir=_cache_dir)
validate_metadata(metadata, schema)
Args:
metadata:
Metadata to be checked.
Usually a dictionary, but may also be a JSON-formatted string.
schema:
Path to a schema.
stringify:
Whether to convert ``metadata`` to a JSON-formatted string.
Defaults to True if ``metadata`` is not already a string.
Returns:
True if metadata conforms to schema.
"""
if stringify is None:
stringify = not isinstance(metadata, str)
if stringify:
metadata = json.dumps(metadata)
with open(schema) as f:
schema_data = json.load(f)
try:
json_validate(instance=json.loads(metadata), schema=schema_data)
except Exception as e:
raise ValueError(f"Metadata validation failed: {e}") from e
return True