コード例 #1
0
  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))
コード例 #2
0
  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)
コード例 #3
0
    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)
コード例 #4
0
    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.*')
コード例 #5
0
  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 {})