-
Notifications
You must be signed in to change notification settings - Fork 2
Extract validators from pydantic models #12
Copy link
Copy link
Open
Labels
documentationImprovements or additions to documentationImprovements or additions to documentation
Description
Currently, there is no way to export field validators from pydantic to JSON schema.
E.g.: For assays there are two validators
- filename => Must start with 'a_'
- comments => At least one comment must be a valid target repository
class Assay(CommentedIsaBase):
id: Optional[str] = Field(alias="@id", default=None)
characteristicCategories: List[MaterialAttribute] = []
dataFiles: List[Data] = []
filename: Optional[str] = None
materials: Optional[AssayMaterialType] = None
measurementType: Optional[OntologyAnnotation] = None
processSequence: List[Process] = []
technologyPlatform: Optional[str] = None
technologyType: Optional[OntologyAnnotation] = None
unitCategories: List[OntologyAnnotation] = []
@field_validator("filename")
def validate_filename(cls, v: str) -> Union[str, None]:
if v is None:
return v
elif re.match(r"^a_", v):
return v
else:
raise ValueError("'filename' should start with 'a_'")
@field_validator("comments")
def detect_target_repo_comments(cls, v: List[Comment]) -> Optional[List[Comment]]:
target_repo_comments = [
comment for comment in v if comment.name == TARGET_REPO_KEY
]
if len(target_repo_comments) == 0:
raise ValueError(f"'{TARGET_REPO_KEY}' comment is missing")
elif len(target_repo_comments) > 1:
raise ValueError(f"Multiple '{TARGET_REPO_KEY}' comments found")
else:
if target_repo_comments[0].value in [
item.value for item in TargetRepository
]:
return v
else:
raise ValueError(
f"Invalid '{TARGET_REPO_KEY}' value: '{target_repo_comments[0].value}'"
)Pydantic is not able to export these contstraints to json schema:
{
"additionalProperties": false,
"properties": {
"comments": {
"default": [],
"items": {
"$ref": "#/$defs/Comment"
},
"title": "Comments",
"type": "array"
},
"@id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "@Id"
},
"characteristicCategories": {
"default": [],
"items": {
"$ref": "#/$defs/MaterialAttribute"
},
"title": "Characteristiccategories",
"type": "array"
},
"dataFiles": {
"default": [],
"items": {
"$ref": "#/$defs/Data"
},
"title": "Datafiles",
"type": "array"
},
"filename": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Filename"
},
"materials": {
"anyOf": [
{
"$ref": "#/$defs/AssayMaterialType"
},
{
"type": "null"
}
],
"default": null
},
"measurementType": {
"anyOf": [
{
"$ref": "#/$defs/OntologyAnnotation"
},
{
"type": "null"
}
],
"default": null
},
"processSequence": {
"default": [],
"items": {
"$ref": "#/$defs/Process"
},
"title": "Processsequence",
"type": "array"
},
"technologyPlatform": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Technologyplatform"
},
"technologyType": {
"anyOf": [
{
"$ref": "#/$defs/OntologyAnnotation"
},
{
"type": "null"
}
],
"default": null
},
"unitCategories": {
"default": [],
"items": {
"$ref": "#/$defs/OntologyAnnotation"
},
"title": "Unitcategories",
"type": "array"
}
},
"title": "Assay",
"type": "object"
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
documentationImprovements or additions to documentationImprovements or additions to documentation
Type
Projects
Status
Backlog