示例#1
0
    def test_resolve_with_return_reference_true(self):
        mock_value = mock.Mock(spec=dsl_types.MuranoTypeReference)
        mock_scope_type = mock.Mock(spec=dsl_types.MuranoTypeReference)
        result = helpers.resolve_type(mock_value, mock_scope_type, True)
        self.assertEqual(mock_value, result)

        mock_value = mock.Mock()
        mock_value.get_reference.return_value = mock.sentinel.foo_reference
        mock_scope_type = mock.Mock()
        mock_scope_type.package.find_class.return_value = mock_value
        result = helpers.resolve_type(mock_value, mock_scope_type, True)
        self.assertEqual(mock.sentinel.foo_reference, result)
示例#2
0
    def __init__(self, definition, target, scope_type):
        scope_type = weakref.ref(scope_type)
        definition = helpers.list_value(definition)
        factories = []
        used_types = set()
        for d in definition:
            if isinstance(d, dict):
                if len(d) != 1:
                    raise ValueError('Invalid Meta format')
                name = next(iter(d.keys()))
                props = d[name] or {}
            else:
                name = d
                props = {}
            type_obj = helpers.resolve_type(name, scope_type())
            if type_obj.usage != dsl_types.ClassUsages.Meta:
                raise ValueError('Only Meta classes can be attached')
            if target not in type_obj.targets:
                raise ValueError(
                    u'Meta class {} is not applicable here'.format(
                        type_obj.name))
            if type_obj in used_types and (
                    type_obj.cardinality != dsl_types.MetaCardinality.Many):
                raise ValueError('Cannot attach several Meta instances '
                                 'with cardinality One')

            used_types.add(type_obj)
            factory_maker = lambda template: \
                lambda context: helpers.get_object_store().load(
                    template, owner=None,
                    context=context, scope_type=scope_type())

            factories.append(factory_maker({type_obj: props}))
        self._meta_factories = factories
        self._meta = None
示例#3
0
    def __init__(self, definition, target, scope_type):
        scope_type = weakref.ref(scope_type)
        definition = helpers.list_value(definition)
        factories = []
        used_types = set()
        for d in definition:
            if isinstance(d, dict):
                if len(d) != 1:
                    raise ValueError('Invalid Meta format')
                name = next(iter(d.keys()))
                props = d[name] or {}
            else:
                name = d
                props = {}
            type_obj = helpers.resolve_type(name, scope_type())
            if type_obj.usage != dsl_types.ClassUsages.Meta:
                raise ValueError('Only Meta classes can be attached')
            if target not in type_obj.targets:
                raise ValueError(
                    u'Meta class {} is not applicable here'.format(
                        type_obj.name))
            if type_obj in used_types and (
                    type_obj.cardinality != dsl_types.MetaCardinality.Many):
                raise ValueError('Cannot attach several Meta instances '
                                 'with cardinality One')

            used_types.add(type_obj)
            factory_maker = lambda template: \
                lambda context, store: helpers.instantiate(
                    template, owner=None, object_store=store,
                    context=context, scope_type=scope_type())

            factories.append(factory_maker({type_obj: props}))
        self._meta_factories = factories
        self._meta = None
示例#4
0
 def _resolve_imports(self, imports):
     seen = {self.name}
     for imp in helpers.list_value(imports):
         if imp in seen:
             continue
         type = helpers.resolve_type(imp, self)
         if type in seen:
             continue
         seen.add(imp)
         seen.add(type)
         yield type
示例#5
0
 def _resolve_imports(self, imports):
     seen = {self.name}
     for imp in helpers.list_value(imports):
         if imp in seen:
             continue
         type = helpers.resolve_type(imp, self)
         if type in seen:
             continue
         seen.add(imp)
         seen.add(type)
         yield type
示例#6
0
 def test_resolve_type_with_null_value(self):
     self.assertIsNone(helpers.resolve_type(None, None))