def link_resource(self, resource): """Link and initialize an nwv object. Args: resource: Uninitialized resource objcet """ vendor = self.get_vendor(resource.desc.full_name) vendor.resource_list.append(resource) resource.device_kind_name = resource.desc.name resource.device_kind_code = None options = resource.desc.options.Extensions[wdl_options_pb2.resource] resource.stability = schema.Stability(options.stability) if options.HasField('version'): resource.version = options.version resource.version_map = schema.VersionMap(options.version_map) for field_desc in resource.desc.fields.values(): resource.component_list.append(self.get_obj(field_desc.full_name)) for nested_msg_desc in resource.desc.messages.values(): for implements_desc in nested_msg_desc.fields.values(): resource.group_list.append(self.get_obj(implements_desc.full_name))
def link_typespace(self, typespace): """Links and initializes a given schema typespace. Args: typespace: Uninitialized typespace object Raises: InvalidType: MissingArgument: """ if not isinstance(typespace, schema.Typespace): raise exception.InvalidType('Expecting an typespace') if typespace.desc.fields: raise exception.InvalidType( 'Typespace {} contains properties, typespaces should not contain ' 'properties.'.format(typespace.full_name)) options = typespace.desc.options.Extensions[wdl_options_pb2.typespace] vendor = self.get_vendor(typespace.desc.full_name) vendor.typespace_list.append(typespace) # Used to set the file descriptor in dev_* typespace.nwv_pb_desc = text_encoding.CEscape( typespace.desc.SerializeToString(), False) typespace.stability = schema.Stability(options.stability) typespace.version = options.version typespace.version_map = schema.VersionMap(options.version_map) for nested_msg_desc in _order_messages_by_dependency( typespace.desc.messages.values(), typespace.full_name): if nested_msg_desc.is_map_entry: continue # ignore map entries nested_msg = self.get_obj(nested_msg_desc.full_name) if nested_msg: if isinstance(nested_msg, schema.Command): typespace.command_list.append(nested_msg) elif isinstance(nested_msg, schema.Event): typespace.event_list.append(nested_msg) elif isinstance(nested_msg, schema.Struct): typespace.struct_list.append(nested_msg) else: raise exception.InvalidType('Unexpected type in typespace') for nested_enum_desc in typespace.desc.enums.values(): nested_enum = self.get_obj(nested_enum_desc.full_name) constant_type = nested_enum_desc.options.Extensions[ wdl_options_pb2.enumopts].constant_type if constant_type: typespace.constant_group_list.append(nested_enum) else: typespace.enum_list.append(nested_enum)
def test_resource_referencing_old_trait_valid(self): self.get_test_resource().stability = schema.Stability.BETA self.get_test_iface().stability = schema.Stability.BETA self.get_test_trait().stability = schema.Stability.ALPHA version_map = schema.VersionMap() version_map._parsed_map = {2: {'TestTrait': 1}} # pylint: disable=protected-access self.get_test_resource().version_map = version_map self.assert_valid( stability_reference_validator.StabilityReferenceValidator)
def test_trait_referencing_current_trait(self): trait = schema.Trait('Test2Trait', 2, '') trait.version = 2 self.get_test_vendor().trait_list.append(trait) struct = schema.Struct('Test2Struct', 2, '') trait.struct_list.append(struct) field = schema.Field('field', 1000, '') field.struct_type = struct self.get_test_trait().state_list.append(field) self.get_test_trait().version_map = schema.VersionMap() self.get_test_trait().version_map._parsed_map = {2: {'Test2Trait': 2}} # pylint: disable=protected-access trait.stability = schema.Stability.ALPHA self.get_test_trait().stability = schema.Stability.BETA self.assert_invalid( stability_reference_validator.StabilityReferenceValidator, r'.*Traits can only reference Traits.*')
def link_trait(self, trait): """Links a given trait and inserts it into the schema. Args: trait: An uninitialized schema trait object Raises: InvalidType: MissingArgument: """ if not isinstance(trait, schema.Trait): raise exception.InvalidType('Expecting an trait') options = trait.desc.options.Extensions[wdl_options_pb2.trait] vendor = self.get_vendor(trait.desc.full_name) vendor.trait_list.append(trait) # Used to set the file descriptor in dev_* trait.nwv_pb_desc = text_encoding.CEscape(trait.desc.SerializeToString(), False) trait.stability = schema.Stability(options.stability) trait.version = options.version trait.version_map = schema.VersionMap(options.version_map) for field_desc in trait.desc.fields.values(): trait.state_list.append(self.get_obj(field_desc.full_name)) for nested_msg_desc in _order_messages_by_dependency( trait.desc.messages.values(), trait.full_name): if nested_msg_desc.is_map_entry: continue # ignore map entries nested_msg = self.get_obj(nested_msg_desc.full_name) if isinstance(nested_msg, schema.Command): trait.command_list.append(nested_msg) elif isinstance(nested_msg, schema.Event): trait.event_list.append(nested_msg) elif isinstance(nested_msg, schema.CommandResponse): pass # ignore, it will be handled inside link_command elif isinstance(nested_msg, schema.Struct): trait.struct_list.append(nested_msg) else: raise exception.InvalidType('Unexpected nested type in trait') for nested_enum_desc in trait.desc.enums.values(): nested_enum = self.get_obj(nested_enum_desc.full_name) constant_type = nested_enum_desc.options.Extensions[ wdl_options_pb2.enumopts].constant_type if constant_type: trait.constant_group_list.append(nested_enum) else: trait.enum_list.append(nested_enum) trait.extends = self.get_extends( trait.desc.options.Extensions[wdl_options_pb2.properties].extends.trait) self.validate_extendable( trait.desc.options.Extensions[wdl_options_pb2.properties], trait.state_list, trait.extends.desc.fields if trait.extends else {})