diff --git a/src/nxvalidate/validate.py b/src/nxvalidate/validate.py index 0ae6d00..2b5e68b 100644 --- a/src/nxvalidate/validate.py +++ b/src/nxvalidate/validate.py @@ -1068,8 +1068,14 @@ def validate_group(self, xml_dict, nxgroup, indent=0): for key, value in xml_dict.items(): if key == 'group': for group in value: + recommended = False if '@minOccurs' in value[group]: minOccurs = int(value[group]['@minOccurs']) + elif value[group].get('@optional') == 'true': + minOccurs = 0 + elif value[group].get('@recommended') == 'true': + minOccurs = 0 + recommended = True else: minOccurs = 1 if '@type' in value[group]: @@ -1090,7 +1096,11 @@ def validate_group(self, xml_dict, nxgroup, indent=0): f'{len(nxgroups)} {group} group(s) ' f'are in the NeXus file. At least {minOccurs} ' 'are required', level='error') - elif minOccurs == 0: + elif len(nxgroups) == 0 and recommended: + self.log( + 'This recommended group is not in the NeXus file', + level='warning') + elif len(nxgroups) == 0: self.log( 'This optional group is not in the NeXus file') for i, nxsubgroup in enumerate(nxgroups): @@ -1110,8 +1120,14 @@ def validate_group(self, xml_dict, nxgroup, indent=0): self.output_log() elif key == 'field' or key == 'link': for field in value: + recommended = False if '@minOccurs' in value[field]: minOccurs = int(value[field]['@minOccurs']) + elif value[field].get('@optional') == 'true': + minOccurs = 0 + elif value[field].get('@recommended') == 'true': + minOccurs = 0 + recommended = True else: minOccurs = 1 if field in nxgroup.entries: @@ -1128,6 +1144,9 @@ def validate_group(self, xml_dict, nxgroup, indent=0): if minOccurs > 0: self.log(f'This required {key} is not ' 'in the NeXus file', level='error') + elif recommended: + self.log(f'This recommended {key} is not ' + 'in the NeXus file', level='warning') else: self.log(f'This optional {key}) is not ' 'in the NeXus file')