def test_struct_with_custom_annotations(self): # type: () -> None ns = ApiNamespace('files') annotation_type = AnnotationType('MyAnnotationType', ns, None, [ AnnotationTypeParam('test_param', Int32(), None, False, None, None) ]) ns.add_annotation_type(annotation_type) annotation = CustomAnnotation('MyAnnotation', ns, None, 'MyAnnotationType', None, [], {'test_param': 42}) annotation.set_attributes(annotation_type) ns.add_annotation(annotation) struct = Struct('MyStruct', ns, None) struct.set_attributes(None, [ StructField('annotated_field', Int32(), None, None), StructField('unannotated_field', Int32(), None, None), ]) struct.fields[0].set_annotations([annotation]) struct.recursive_custom_annotations = set([annotation]) result = self._evaluate_struct(ns, struct) expected = textwrap.dedent('''\ class MyStruct(bb.Struct): __slots__ = [ '_annotated_field_value', '_unannotated_field_value', ] _has_required_fields = True def __init__(self, annotated_field=None, unannotated_field=None): self._annotated_field_value = bb.NOT_SET self._unannotated_field_value = bb.NOT_SET if annotated_field is not None: self.annotated_field = annotated_field if unannotated_field is not None: self.unannotated_field = unannotated_field # Instance attribute type: int (validator is set below) annotated_field = bb.Attribute("annotated_field") # Instance attribute type: int (validator is set below) unannotated_field = bb.Attribute("unannotated_field") def _process_custom_annotations(self, annotation_type, field_path, processor): super(MyStruct, self)._process_custom_annotations(annotation_type, field_path, processor) if annotation_type is MyAnnotationType: self.annotated_field = bb.partially_apply(processor, MyAnnotationType(test_param=42))('{}.annotated_field'.format(field_path), self.annotated_field) MyStruct_validator = bv.Struct(MyStruct) ''') # noqa self.maxDiff = None self.assertEqual(result, expected)
def test_struct_with_custom_annotations(self): # type: () -> None ns = ApiNamespace('files') annotation_type = AnnotationType('MyAnnotationType', ns, None, [ AnnotationTypeParam('test_param', Int32(), None, False, None, None) ]) ns.add_annotation_type(annotation_type) annotation = CustomAnnotation('MyAnnotation', ns, None, 'MyAnnotationType', None, [], {'test_param': 42}) annotation.set_attributes(annotation_type) ns.add_annotation(annotation) struct = Struct('MyStruct', ns, None) struct.set_attributes(None, [ StructField('annotated_field', Int32(), None, None), StructField('unannotated_field', Int32(), None, None), ]) struct.fields[0].set_annotations([annotation]) result = self._evaluate_struct(ns, struct) expected = textwrap.dedent('''\ class MyStruct(bb.Struct): __slots__ = [ '_annotated_field_value', '_annotated_field_present', '_unannotated_field_value', '_unannotated_field_present', ] _has_required_fields = True def __init__(self, annotated_field=None, unannotated_field=None): self._annotated_field_value = None self._annotated_field_present = False self._unannotated_field_value = None self._unannotated_field_present = False if annotated_field is not None: self.annotated_field = annotated_field if unannotated_field is not None: self.unannotated_field = unannotated_field @property def annotated_field(self): """ :rtype: int """ if self._annotated_field_present: return self._annotated_field_value else: raise AttributeError("missing required field 'annotated_field'") @annotated_field.setter def annotated_field(self, val): val = self._annotated_field_validator.validate(val) self._annotated_field_value = val self._annotated_field_present = True @annotated_field.deleter def annotated_field(self): self._annotated_field_value = None self._annotated_field_present = False @property def unannotated_field(self): """ :rtype: int """ if self._unannotated_field_present: return self._unannotated_field_value else: raise AttributeError("missing required field 'unannotated_field'") @unannotated_field.setter def unannotated_field(self, val): val = self._unannotated_field_validator.validate(val) self._unannotated_field_value = val self._unannotated_field_present = True @unannotated_field.deleter def unannotated_field(self): self._unannotated_field_value = None self._unannotated_field_present = False def _process_custom_annotations(self, annotation_type, field_path, processor): super(MyStruct, self)._process_custom_annotations(annotation_type, field_path, processor) if annotation_type is MyAnnotationType: self.annotated_field = bb.partially_apply(processor, MyAnnotationType(test_param=42))('{}.annotated_field'.format(field_path), self.annotated_field) def __repr__(self): return 'MyStruct(annotated_field={!r}, unannotated_field={!r})'.format( self._annotated_field_value, self._unannotated_field_value, ) MyStruct_validator = bv.Struct(MyStruct) ''') # noqa self.maxDiff = None self.assertEqual(result, expected)
def test_struct_with_custom_annotations(self): # type: () -> None ns = ApiNamespace('files') annotation_type = AnnotationType('MyAnnotationType', ns, None, [ AnnotationTypeParam('test_param', Int32(), None, False, None, None) ]) ns.add_annotation_type(annotation_type) annotation = CustomAnnotation('MyAnnotation', ns, None, 'MyAnnotationType', None, [], {'test_param': 42}) annotation.set_attributes(annotation_type) ns.add_annotation(annotation) struct = Struct('MyStruct', ns, None) struct.set_attributes(None, [ StructField('annotated_field', Int32(), None, None), StructField('unannotated_field', Int32(), None, None), ]) struct.fields[0].set_annotations([annotation]) result = self._evaluate_struct(ns, struct) expected = textwrap.dedent('''\ class MyStruct(bb.Struct): __slots__ = [ '_annotated_field_value', '_annotated_field_present', '_unannotated_field_value', '_unannotated_field_present', ] _has_required_fields = True def __init__(self, annotated_field=None, unannotated_field=None): self._annotated_field_value = None self._annotated_field_present = False self._unannotated_field_value = None self._unannotated_field_present = False if annotated_field is not None: self.annotated_field = annotated_field if unannotated_field is not None: self.unannotated_field = unannotated_field @property def annotated_field(self): """ :rtype: long """ if self._annotated_field_present: return self._annotated_field_value else: raise AttributeError("missing required field 'annotated_field'") @annotated_field.setter def annotated_field(self, val): val = self._annotated_field_validator.validate(val) self._annotated_field_value = val self._annotated_field_present = True @annotated_field.deleter def annotated_field(self): self._annotated_field_value = None self._annotated_field_present = False @property def unannotated_field(self): """ :rtype: long """ if self._unannotated_field_present: return self._unannotated_field_value else: raise AttributeError("missing required field 'unannotated_field'") @unannotated_field.setter def unannotated_field(self, val): val = self._unannotated_field_validator.validate(val) self._unannotated_field_value = val self._unannotated_field_present = True @unannotated_field.deleter def unannotated_field(self): self._unannotated_field_value = None self._unannotated_field_present = False def _process_custom_annotations(self, annotation_type, processor): super(MyStruct, self)._process_custom_annotations(annotation_type, processor) if annotation_type is MyAnnotationType: self.annotated_field = bb.partially_apply(processor, MyAnnotationType(test_param=42))(self.annotated_field) def __repr__(self): return 'MyStruct(annotated_field={!r}, unannotated_field={!r})'.format( self._annotated_field_value, self._unannotated_field_value, ) MyStruct_validator = bv.Struct(MyStruct) ''') # noqa self.assertEqual(result, expected)