예제 #1
0
    def _map_dict(self, data, spec, context, path):
        if data is None or data is dsl.NO_VALUE:
            data = {}
        if not isinstance(data, utils.MappingType):
            raise exceptions.ContractViolationException(
                'Value {0} is not of a dictionary type'.format(
                    helpers.format_scalar(data)))
        if not spec:
            return data
        result = {}
        yaql_key = None
        for key, value in six.iteritems(spec):
            if isinstance(key, dsl_types.YaqlExpression):
                if yaql_key is not None:
                    raise exceptions.DslContractSyntaxError(
                        'Dictionary contract '
                        'cannot have more than one expression key')
                else:
                    yaql_key = key
            else:
                result[key] = self._map(
                    data.get(key), value, context,
                    '{0}[{1}]'.format(path, helpers.format_scalar(key)))

        if yaql_key is not None:
            yaql_value = spec[yaql_key]
            for key, value in six.iteritems(data):
                if key in result:
                    continue
                key = self._map(key, yaql_key, context, path)
                result[key] = self._map(
                    value, yaql_value, context,
                    '{0}[{1}]'.format(path, helpers.format_scalar(key)))

        return utils.FrozenDict(result)
예제 #2
0
 def _map_scalar(self, data, spec):
     if data != spec:
         raise exceptions.ContractViolationException(
             'Value {0} is not equal to {1}'.format(
                 helpers.format_scalar(data), spec))
     else:
         return data
예제 #3
0
 def transform(self):
     value = self.value
     object_store = helpers.get_object_store()
     if isinstance(self.value, contracts.ObjRef):
         value = self.value.object_id
     if value is None:
         return None
     if isinstance(value, dsl_types.MuranoObject):
         obj = value
     elif isinstance(value, dsl_types.MuranoObjectInterface):
         obj = value.object
     elif isinstance(value, utils.MappingType):
         obj = object_store.load(value,
                                 self.owner,
                                 context=self.root_context,
                                 default_type=self.default_type,
                                 scope_type=self.calling_type)
     elif isinstance(value, str):
         obj = object_store.get(value)
         if obj is None:
             if not object_store.initializing:
                 raise exceptions.NoObjectFoundError(value)
             else:
                 return contracts.ObjRef(value)
     else:
         raise exceptions.ContractViolationException(
             'Value {0} cannot be represented as class {1}'.format(
                 helpers.format_scalar(value), self.type))
     self.value = obj
     return self.validate()
예제 #4
0
 def transform(self):
     if self.value is None:
         return None
     try:
         return int(self.value)
     except Exception:
         raise exceptions.ContractViolationException(
             'Value {0} violates int() contract'.format(
                 helpers.format_scalar(self.value)))
예제 #5
0
 def validate(self):
     if isinstance(self.value, contracts.ObjRef) or self._call_predicate(
             self.value):
         return self.value
     else:
         msg = self.msg
         if not msg:
             msg = "Value {0} doesn't match predicate".format(
                 helpers.format_scalar(self.value))
         raise exceptions.ContractViolationException(msg)
예제 #6
0
 def transform(self):
     if self.value is None:
         return None
     if isinstance(self.value, six.text_type):
         return self.value
     if isinstance(self.value, six.string_types) or \
             isinstance(self.value, six.integer_types):
         return six.text_type(self.value)
     if isinstance(self.value, dsl_types.MuranoObject):
         return self.value.object_id
     if isinstance(self.value, dsl_types.MuranoObjectInterface):
         return self.value.id
     raise exceptions.ContractViolationException(
         'Value {0} violates string() contract'.format(
             helpers.format_scalar(self.value)))
예제 #7
0
 def transform(self):
     object_store = helpers.get_object_store()
     if self.value is None:
         return None
     if isinstance(self.value, dsl_types.MuranoObject):
         obj = self.value
     elif isinstance(self.value, dsl_types.MuranoObjectInterface):
         obj = self.value.object
     elif isinstance(self.value, utils.MappingType):
         passkey = utils.create_marker('<Contract Passkey>')
         if self.exclude_properties:
             parsed = helpers.parse_object_definition(
                 self.value, self.calling_type, self.context)
             props = dsl.to_mutable(parsed['properties'], self.engine)
             for p in self.exclude_properties:
                 helpers.patch_dict(props, p, passkey)
             parsed['properties'] = props
             value = helpers.assemble_object_definition(parsed)
         else:
             value = self.value
         with helpers.thread_local_attribute(constants.TL_CONTRACT_PASSKEY,
                                             passkey):
             with helpers.thread_local_attribute(
                     constants.TL_OBJECTS_DRY_RUN, True):
                 obj = object_store.load(value,
                                         self.owner,
                                         context=self.context,
                                         default_type=self.default_type,
                                         scope_type=self.calling_type)
                 obj.__passkey__ = passkey
     else:
         raise exceptions.ContractViolationException(
             'Value {0} cannot be represented as class {1}'.format(
                 helpers.format_scalar(self.value), self.type))
     self.value = obj
     return self.validate()