Skip to content

Commit d3228bb

Browse files
author
openMINDS pipeline
committed
build triggered by submodule version
1 parent 4d1bc02 commit d3228bb

5 files changed

Lines changed: 113 additions & 86 deletions

File tree

openminds/base.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,20 @@ def from_jsonld(cls, data):
106106
raise NameError(f"Unexpected arguments for {cls}: {tuple(data_copy.keys())}")
107107
return cls(**deserialized_data)
108108

109-
def validate(self):
109+
def validate(self, ignore=None):
110110
"""
111111
Check whether all constraints are satisfied.
112112
113+
Arguments:
114+
ignore: an optional list of check types that should be ignored
115+
("required", "type", "multiplicity")
116+
113117
Returns a dict containing information about any validation failures.
114118
"""
115119
failures = defaultdict(list)
116120
for property in self.properties:
117121
value = getattr(self, property.name, None)
118-
for key, values in property.validate(value).items():
122+
for key, values in property.validate(value, ignore=ignore).items():
119123
failures[key] += values
120124
return failures
121125

openminds/collection.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,14 @@ def _resolve_links(self):
181181
for node in self.nodes.values():
182182
node._resolve_links(self.nodes)
183183

184-
def validate(self):
184+
def validate(self, ignore=None):
185185
"""
186186
Check whether all constraints are satisfied.
187187
188+
Arguments:
189+
ignore: an optional list of check types that should be ignored
190+
("required", "type", "multiplicity")
191+
188192
Returns a dict containing information about any validation failures.
189193
"""
190194
all_failures = {}

openminds/latest/controlled_terms/unit_of_measurement.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,12 @@ def by_name(cls, name):
335335
preferred_ontology_identifier="http://purl.obolibrary.org/obo/UO_0010054",
336336
synonyms=["pA"],
337337
)
338+
UnitOfMeasurement.postnatal_day = UnitOfMeasurement(
339+
id="https://openminds.ebrains.eu/instances/unitOfMeasurement/postnatalDay",
340+
definition="'Postnatal day' is a specific unit to measure the age of an organism that is born live (viviparous animals), starting with the day of birth (postnatal day 0, or short: P0).",
341+
name="postnatal day",
342+
synonyms=["P"],
343+
)
338344
UnitOfMeasurement.radian = UnitOfMeasurement(
339345
id="https://openminds.ebrains.eu/instances/unitOfMeasurement/radian",
340346
definition="A 'radian' is the SI unit for measuring angles. One 'radian' defines the arc of a circle with the same length as the radius of that circle.",

openminds/latest/sands/atlas/brain_atlas.py

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -821,72 +821,72 @@ def by_name(cls, name):
821821
"@type": "https://openminds.ebrains.eu/sands/ParcellationTerminology",
822822
"dataLocation": None,
823823
"hasEntity": [
824-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_CAC-PoCi_0"},
825-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_CAC-PrCu_0"},
826-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_CMF-Op_0"},
827-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_CMF-PoC_0"},
828-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_CMF-PrC_0"},
829-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_CMF-PrC_1"},
830-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_CMF-RMF_0"},
831-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_CMF-SF_0"},
832-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_CMF-SF_1"},
833-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Cu-Li_0"},
834-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Fu-LO_0"},
835-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Fu-LO_1"},
836-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IC-PrCu_0"},
837-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IP-IT_0"},
838-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IP-LO_0"},
839-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IP-LO_1"},
840-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IP-MT_0"},
841-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IP-SM_0"},
842-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IP-SP_0"},
843-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IP-SP_1"},
844-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IT-MT_0"},
845-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IT-MT_1"},
846-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_IT-MT_2"},
847-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_LO-SP_0"},
848-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_LOF-MOF_0"},
849-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_LOF-Or_0"},
850-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_LOF-RMF_0"},
851-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_LOF-RMF_1"},
852-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_LOF-ST_0"},
853-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_MOF-ST_0"},
854-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_MT-SM_0"},
855-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_MT-ST_0"},
856-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Op-Ins_0"},
857-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Op-PrC_0"},
858-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Op-SF_0"},
859-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Op-Tr_0"},
860-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Or-Ins_0"},
861-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoC-Ins_0"},
862-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoC-PrC_0"},
863-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoC-PrC_1"},
864-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoC-PrC_2"},
865-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoC-PrC_3"},
866-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoC-SM_0"},
867-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoC-SM_1"},
868-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoC-SP_0"},
869-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoC-SP_1"},
870-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoCi-PrCu_0"},
871-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoCi-PrCu_1"},
872-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoCi-PrCu_2"},
873-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoCi-RAC_0"},
874-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PoCi-SF_0"},
875-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PrC-Ins_0"},
876-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PrC-SF_0"},
877-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PrC-SM_0"},
878-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_PrC-SP_0"},
879-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_RAC-SF_0"},
880-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_RAC-SF_1"},
881-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_RMF-SF_0"},
882-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_RMF-SF_1"},
883-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_SM-Ins_0"},
884-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_SP-SM_0"},
885-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_ST-Ins_0"},
886-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_ST-TT_0"},
887-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_superficialWhiteMatter"},
888-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Tr-Ins_0"},
889-
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntityVersion/SWMA_Tr-SF_0"},
824+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_CAC-PoCi_0"},
825+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_CAC-PrCu_0"},
826+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_CMF-Op_0"},
827+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_CMF-PoC_0"},
828+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_CMF-PrC_0"},
829+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_CMF-PrC_1"},
830+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_CMF-RMF_0"},
831+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_CMF-SF_0"},
832+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_CMF-SF_1"},
833+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Cu-Li_0"},
834+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Fu-LO_0"},
835+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Fu-LO_1"},
836+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IC-PrCu_0"},
837+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IP-IT_0"},
838+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IP-LO_0"},
839+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IP-LO_1"},
840+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IP-MT_0"},
841+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IP-SM_0"},
842+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IP-SP_0"},
843+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IP-SP_1"},
844+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IT-MT_0"},
845+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IT-MT_1"},
846+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_IT-MT_2"},
847+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_LO-SP_0"},
848+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_LOF-MOF_0"},
849+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_LOF-Or_0"},
850+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_LOF-RMF_0"},
851+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_LOF-RMF_1"},
852+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_LOF-ST_0"},
853+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_MOF-ST_0"},
854+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_MT-SM_0"},
855+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_MT-ST_0"},
856+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Op-Ins_0"},
857+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Op-PrC_0"},
858+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Op-SF_0"},
859+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Op-Tr_0"},
860+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Or-Ins_0"},
861+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoC-Ins_0"},
862+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoC-PrC_0"},
863+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoC-PrC_1"},
864+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoC-PrC_2"},
865+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoC-PrC_3"},
866+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoC-SM_0"},
867+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoC-SM_1"},
868+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoC-SP_0"},
869+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoC-SP_1"},
870+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoCi-PrCu_0"},
871+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoCi-PrCu_1"},
872+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoCi-PrCu_2"},
873+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoCi-RAC_0"},
874+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PoCi-SF_0"},
875+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PrC-Ins_0"},
876+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PrC-SF_0"},
877+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PrC-SM_0"},
878+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_PrC-SP_0"},
879+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_RAC-SF_0"},
880+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_RAC-SF_1"},
881+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_RMF-SF_0"},
882+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_RMF-SF_1"},
883+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_SM-Ins_0"},
884+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_SP-SM_0"},
885+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_ST-Ins_0"},
886+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_ST-TT_0"},
887+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_superficialWhiteMatter"},
888+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Tr-Ins_0"},
889+
{"@id": "https://openminds.ebrains.eu/instances/parcellationEntity/SWMA_Tr-SF_0"},
890890
],
891891
"ontologyIdentifier": None,
892892
},

openminds/properties.py

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -89,36 +89,46 @@ def types(self):
8989
self._resolved_types = True
9090
return self._types
9191

92-
def validate(self, value):
92+
def validate(self, value, ignore=None):
9393
"""
9494
Check whether `value` satisfies all constraints.
9595
96+
Arguments:
97+
value: the value to be checked
98+
ignore: an optional list of check types that should be ignored
99+
("required", "type", "multiplicity")
100+
96101
Returns a dict containing information about any validation failures.
97102
"""
103+
if ignore is None:
104+
ignore = []
105+
if not isinstance(ignore, (list, tuple)):
106+
raise TypeError("`ignore` must be a list or tuple")
98107
failures = defaultdict(list)
99108
if value is None:
100-
if self.required:
109+
if self.required and "required" not in ignore:
101110
failures["required"].append(f"{self.name} is required, but was not provided")
102111
else:
103112
if self.multiple:
104113
if not isinstance(value, (list, tuple)):
105114
value = [value]
106115
for item in value:
107116
if not isinstance(item, self.types):
108-
failures["type"].append(
109-
f"{self.name}: Expected {', '.join(t.__name__ for t in self.types)}, "
110-
f"value contains {type(item)}"
111-
)
117+
if "type" not in ignore:
118+
failures["type"].append(
119+
f"{self.name}: Expected {', '.join(t.__name__ for t in self.types)}, "
120+
f"value contains {type(item)}"
121+
)
112122
elif isinstance(item, Node):
113-
failures.update(item.validate())
123+
failures.update(item.validate(ignore=ignore))
114124
if self.min_items:
115-
if len(value) < self.min_items:
125+
if len(value) < self.min_items and "multiplicity" not in ignore:
116126
failures["multiplicity"].append(
117127
f"{self.name}: minimum {self.min_items} items required, "
118128
f"value only contains {len(value)}"
119129
)
120130
if self.max_items:
121-
if len(value) > self.max_items:
131+
if len(value) > self.max_items and "multiplicity" not in ignore:
122132
failures["multiplicity"].append(
123133
f"{self.name}: maximum {self.max_items} items allowed, " f"value contains {len(value)}"
124134
)
@@ -128,18 +138,21 @@ def validate(self, value):
128138
except TypeError: # unhashable, i.e. can't anyway check if items are unique
129139
pass
130140
else:
131-
if len(unique_items) < len(value):
141+
if len(unique_items) < len(value) and "multiplicity" not in ignore:
132142
failures["multiplicity"].append(f"{self.name}: items in array should be unique")
133143
elif isinstance(value, (list, tuple)):
134-
failures["multiplicity"].append(
135-
f"{self.name} does not accept multiple values, but contains {len(value)}"
136-
)
144+
if "multiplicity" not in ignore:
145+
failures["multiplicity"].append(
146+
f"{self.name} does not accept multiple values, but contains {len(value)}"
147+
)
137148
elif not isinstance(value, self.types):
138-
failures["type"].append(
139-
f"{self.name}: Expected {', '.join(t.__name__ for t in self.types)}, " f"value is {type(value)}"
140-
)
149+
if "type" not in ignore:
150+
failures["type"].append(
151+
f"{self.name}: Expected {', '.join(t.__name__ for t in self.types)}, "
152+
f"value is {type(value)}"
153+
)
141154
elif isinstance(value, Node):
142-
failures.update(value.validate())
155+
failures.update(value.validate(ignore=ignore))
143156
# todo: check formatting, multiline
144157
return failures
145158

0 commit comments

Comments
 (0)