def test_extension_deletion_with_2_metaclasses(self):
        factory = self.element_factory
        create = factory.create

        # Set the stage
        metaklass = create(uml2.Class)
        metaklass.name = 'Class'
        metaiface = create(uml2.Class)
        metaiface.name = 'Interface'
        klass = create(uml2.Class)
        iface = create(uml2.Interface)
        stereotype = create(uml2.Stereotype)
        st_attr = self.element_factory.create(uml2.Property)
        stereotype.ownedAttribute = st_attr
        ext1 = modelfactory.create_extension(factory, metaklass, stereotype)
        ext2 = modelfactory.create_extension(factory, metaiface, stereotype)

        # Apply stereotype to class and create slot
        instspec1 = modelfactory.apply_stereotype(factory, klass, stereotype)
        instspec2 = modelfactory.apply_stereotype(factory, iface, stereotype)
        slot = modelfactory.add_slot(factory, instspec1, st_attr)

        self.assertTrue(stereotype in klass.appliedStereotype[:].classifier)
        self.assertTrue(klass in self.element_factory)

        ext1.unlink()

        self.assertEquals([], list(klass.appliedStereotype))
        self.assertTrue(klass in self.element_factory)
        self.assertEquals([instspec2], list(iface.appliedStereotype))
    def test_stereotype_attributes_status_saving(self):
        """Test stereotype attributes status saving
        """
        factory = self.element_factory
        c = self.create(ComponentItem, uml2.Component)

        c.show_stereotypes_attrs = True
        modelfactory.apply_stereotype(factory, c.subject, self.st1)
        obj = modelfactory.apply_stereotype(factory, c.subject, self.st2)

        # change attribute of 2nd stereotype
        attr = self.st2.ownedAttribute[0]
        slot = modelfactory.add_slot(self.element_factory, obj, attr)
        slot.value = 'st2 test21'

        data = self.save()
        self.load(data)

        item = self.diagram.canvas.select(
            lambda e: isinstance(e, ComponentItem))[0]
        self.assertTrue(item.show_stereotypes_attrs)
        self.assertEqual(2, len(item._compartments))
        # first stereotype has no attributes changed, so compartment
        # invisible
        self.assertFalse(item._compartments[0].visible)
        self.assertTrue(item._compartments[1].visible)
    def test_applying_stereotype(self):
        """Test if stereotype compartment is created when stereotype is applied
        """
        factory = self.element_factory
        c = self.create(ComponentItem, uml2.Component)

        # test precondition
        self.assertEqual(0, len(c._compartments))

        c.show_stereotypes_attrs = True

        modelfactory.apply_stereotype(factory, c.subject, self.st1)
        self.assertEqual(1, len(c._compartments))
        self.assertFalse(c._compartments[0].visible)
    def test_removing_stereotype(self):
        """Test if stereotype compartment is destroyed when stereotype is removed
        """
        factory = self.element_factory
        c = self.create(ComponentItem, uml2.Component)

        c.show_stereotypes_attrs = True

        modelfactory.apply_stereotype(factory, c.subject, self.st1)

        # test precondition
        self.assertEqual(1, len(c._compartments))

        modelfactory.remove_stereotype(c.subject, self.st1)
        self.assertEqual(0, len(c._compartments))
    def test_stereotype_attribute_delete(self):
        """
        This test was applicable to the Sanitizer service, but is now resolved
        by a tweak in the data model (Instances diagram).
        """
        factory = self.element_factory
        create = factory.create

        # Set the stage
        # metaklass = create(uml2.Class)
        # metaklass.name = 'Class'
        klass = create(uml2.Class)
        stereotype = create(uml2.Stereotype)
        st_attr = self.element_factory.create(uml2.Property)
        stereotype.ownedAttribute = st_attr
        # ext = modelfactory.create_extension(factory, metaklass, stereotype)

        # Apply stereotype to class and create slot
        instspec = modelfactory.apply_stereotype(factory, klass, stereotype)
        slot = modelfactory.add_slot(factory, instspec, st_attr)

        # Now, what happens if the attribute is deleted:
        self.assertTrue(st_attr in stereotype.ownedMember)
        self.assertTrue(slot in instspec.slot)

        st_attr.unlink()

        self.assertEquals([], list(stereotype.ownedMember))
        self.assertEquals([], list(instspec.slot))
    def test_removing_stereotype_attribute(self):
        """Test if stereotype instance specification is destroyed when stereotype attribute is removed
        """
        factory = self.element_factory
        c = self.create(ComponentItem, uml2.Component)

        c.show_stereotypes_attrs = True

        # test precondition
        self.assertEqual(0, len(c._compartments))
        obj = modelfactory.apply_stereotype(factory, c.subject, self.st1)
        # test precondition
        self.assertEqual(1, len(c._compartments))

        self.assertEqual(0, len(self.kindof(uml2.Slot)))

        attr = self.st1.ownedAttribute[0]
        slot = modelfactory.add_slot(factory, obj, attr)
        self.assertEqual(1, len(obj.slot))
        self.assertEqual(1, len(self.kindof(uml2.Slot)))
        self.assertTrue(slot.definingFeature)

        compartment = c._compartments[0]
        self.assertTrue(compartment.visible)

        attr.unlink()
        self.assertEqual(0, len(obj.slot))
        self.assertEqual(0, len(self.kindof(uml2.Slot)))
        self.assertFalse(compartment.visible)
    def test_saving_stereotype_attributes(self):
        """Test stereotype attributes saving
        """
        factory = self.element_factory
        c = self.create(ComponentItem, uml2.Component)

        c.show_stereotypes_attrs = True

        modelfactory.apply_stereotype(factory, c.subject, self.st1)
        modelfactory.apply_stereotype(factory, c.subject, self.st2)

        self.assertEqual(3, len(self.st1.ownedAttribute))
        attr1, attr2, attr3 = self.st1.ownedAttribute
        self.assertEqual(attr1.name, 'st1_attr_1', attr1.name)
        self.assertEqual(attr2.name, 'st1_attr_2', attr2.name)
        self.assertEqual(attr3.name, 'baseClass', attr3.name)

        obj = c.subject.appliedStereotype[0]
        slot = modelfactory.add_slot(self.element_factory, obj, attr1)
        slot.value = 'st1 test1'
        slot = modelfactory.add_slot(self.element_factory, obj, attr2)
        slot.value = 'st1 test2'

        data = self.save()
        self.load(data)

        item = self.diagram.canvas.select(
            lambda e: isinstance(e, ComponentItem))[0]
        el = item.subject
        self.assertEqual(2, len(el.appliedStereotype))

        # check if stereotypes are properly applied
        names = sorted(obj.classifier[0].name for obj in el.appliedStereotype)
        self.assertEqual(['st1', 'st2'], names)

        # two attributes were changed for stereotype st1, so 2 slots
        obj = el.appliedStereotype[0]
        self.assertEqual(2, len(obj.slot))
        self.assertEqual('st1_attr_1', obj.slot[0].definingFeature.name)
        self.assertEqual('st1 test1', obj.slot[0].value)
        self.assertEqual('st1_attr_2', obj.slot[1].definingFeature.name)
        self.assertEqual('st1 test2', obj.slot[1].value)

        # no stereotype st2 attribute changes, no slots
        obj = el.appliedStereotype[1]
        self.assertEqual(0, len(obj.slot))
    def test_deleting_stereotype(self):
        """Test if stereotype is removed when stereotype is deleted
        """
        factory = self.element_factory
        c = self.create(ComponentItem, uml2.Component)

        c.show_stereotypes_attrs = True

        st1 = self.st1
        modelfactory.apply_stereotype(factory, c.subject, st1)

        # test precondition
        self.assertEqual(1, len(c._compartments))
        self.assertEqual(1, len(c.subject.appliedStereotype))

        st1.unlink()
        self.assertEqual(0, len(c.subject.appliedStereotype))
        self.assertEqual(0, len(c._compartments))
    def select_stereotype(self, iter):
        """
        Select the stereotype.
        """
        path = self.get_path(iter)
        row = self[path]
        name, old_value, is_applied, stereotype, _, _ = row
        value = not is_applied

        log.debug('selecting %s' % list(row))

        subject = self.subject
        if value:
            modelfactory.apply_stereotype(self.element_factory, subject,
                                          stereotype)
        else:
            modelfactory.remove_stereotype(subject, stereotype)

        row[2] = value

        # TODO: change refresh in a refresh of the data model, rather than a clear-refresh
        self.refresh()
    def test_removing_last_slot(self):
        """Test removing last slot
        """
        factory = self.element_factory
        c = self.create(ComponentItem, uml2.Component)

        c.show_stereotypes_attrs = True
        obj = modelfactory.apply_stereotype(factory, c.subject, self.st1)

        slot = modelfactory.add_slot(factory, obj, self.st1.ownedAttribute[0])

        compartment = c._compartments[0]
        # test precondition
        self.assertTrue(compartment.visible)

        del obj.slot[slot]
        self.assertFalse(compartment.visible)
    def test_adding_slot(self):
        """Test if stereotype attribute information is added when slot is added
        """
        factory = self.element_factory
        c = self.create(ComponentItem, uml2.Component)

        c.show_stereotypes_attrs = True
        obj = modelfactory.apply_stereotype(factory, c.subject, self.st1)

        # test precondition
        self.assertFalse(c._compartments[0].visible)

        slot = modelfactory.add_slot(factory, obj, self.st1.ownedAttribute[0])

        compartment = c._compartments[0]
        self.assertTrue(compartment.visible)
        self.assertEqual(1, len(compartment), slot)
    def test_stereotypes_conversion(self):
        """Test stereotypes conversion
        """
        s1 = self.factory.create(uml2.Stereotype)
        s2 = self.factory.create(uml2.Stereotype)
        s3 = self.factory.create(uml2.Stereotype)
        s1.name = 's1'
        s2.name = 's2'
        s3.name = 's3'

        cls = self.factory.create(uml2.Class)
        modelfactory.apply_stereotype(self.factory, cls, s1)
        modelfactory.apply_stereotype(self.factory, cls, s2)
        modelfactory.apply_stereotype(self.factory, cls, s3)

        self.assertEquals(fmt % 's1, s2, s3', modelfactory.stereotypes_str(cls))
    def test_stereotype_deletion(self):
        factory = self.element_factory
        create = factory.create

        # Set the stage
        metaklass = create(uml2.Class)
        metaklass.name = 'Class'
        klass = create(uml2.Class)
        stereotype = create(uml2.Stereotype)
        st_attr = self.element_factory.create(uml2.Property)
        stereotype.ownedAttribute = st_attr
        ext = modelfactory.create_extension(factory, metaklass, stereotype)

        # Apply stereotype to class and create slot
        instspec = modelfactory.apply_stereotype(factory, klass, stereotype)
        slot = modelfactory.add_slot(factory, instspec, st_attr)

        self.assertTrue(stereotype in klass.appliedStereotype[:].classifier)

        stereotype.unlink()

        self.assertEquals([], list(klass.appliedStereotype))
    def test_additional_stereotypes(self):
        """Test additional stereotypes conversion
        """
        s1 = self.factory.create(uml2.Stereotype)
        s2 = self.factory.create(uml2.Stereotype)
        s3 = self.factory.create(uml2.Stereotype)
        s1.name = 's1'
        s2.name = 's2'
        s3.name = 's3'

        cls = self.factory.create(uml2.Class)
        modelfactory.apply_stereotype(self.factory, cls, s1)
        modelfactory.apply_stereotype(self.factory, cls, s2)
        modelfactory.apply_stereotype(self.factory, cls, s3)

        result = modelfactory.stereotypes_str(cls, ('test',))
        self.assertEquals(fmt % 'test, s1, s2, s3', result)
    def test_finding_stereotype_instances(self):
        """Test finding stereotype instances
        """
        s1 = self.factory.create(uml2.Stereotype)
        s2 = self.factory.create(uml2.Stereotype)
        s1.name = 's1'
        s2.name = 's2'

        c1 = self.factory.create(uml2.Class)
        c2 = self.factory.create(uml2.Class)
        modelfactory.apply_stereotype(self.factory, c1, s1)
        modelfactory.apply_stereotype(self.factory, c1, s2)
        modelfactory.apply_stereotype(self.factory, c2, s1)

        result = [e.classifier[0].name for e in modelfactory.find_instances(self.factory, s1)]
        self.assertEquals(2, len(result))
        self.assertTrue('s1' in result, result)
        self.assertFalse('s2' in result, result)
Exemple #16
0
def version_0_15_0_post(elements, factory, gaphor_version):
    """
    Part two: create stereotypes and what more for the elements that have a
    taggedvalue property.
    """

    def update_elements(element):
        e = elements[element.id] = parser.element(element.id, element.__class__.__name__)
        e.element = element

    if version_lower_than(gaphor_version, (0, 14, 99)):
        stereotypes = {}
        profile = None
        for e in elements.values():
            if hasattr(e, 'taggedvalue'):
                if not profile:
                    profile = factory.create(uml2.Profile)
                    profile.name = 'version 0.15 conversion'
                    update_elements(profile)
                st = stereotypes.get(e.type)
                if not st:
                    st = stereotypes[e.type] = factory.create(uml2.Stereotype)
                    st.name = 'Tagged'
                    st.package = profile
                    update_elements(st)
                    cl = factory.create(uml2.Class)
                    cl.name = str(e.type)
                    cl.package = profile
                    update_elements(cl)
                    ext = modelfactory.extend_with_stereotype(factory, cl, st)
                    update_elements(ext)
                    for me in ext.memberEnd:
                        update_elements(me)
                # Create instance specification for the stereotype:
                instspec = modelfactory.apply_stereotype(factory, e.element, st)
                update_elements(instspec)

                def create_slot(key, val):
                    for attr in st.ownedAttribute:
                        if attr.name == key:
                            break
                    else:
                        attr = st.ownedAttribute = factory.create(uml2.Property)
                        attr.name = str(key)
                        update_elements(attr)
                    slot = modelfactory.add_slot(factory, instspec, attr)
                    slot.value.value = str(val)
                    update_elements(slot)

                tviter = iter(e.taggedvalue or [])
                for tv in tviter:
                    try:
                        try:
                            key, val = tv.split('=', 1)
                            key = key.strip()
                        except ValueError:
                            log.info('Tagged value "%s" has no key=value format, trying key_value ' % tv)
                            try:
                                key, val = tv.split(' ', 1)
                                key = key.strip()
                            except ValueError:
                                # Fallback, deal with it as if it were a boolean
                                key = tv.strip()
                                val = 'true'

                            # This syntax is used with the uml2 meta model:
                            if key in ('subsets', 'redefines'):
                                rest = ', '.join(tviter)
                                val = ', '.join([val, rest]) if rest else val
                                val = val.replace('\n', ' ')
                                log.info('Special case: UML metamodel "%s %s"' % (key, val))
                        create_slot(key, val)
                    except Exception as e:
                        log.warning('Unable to process tagged value "%s" as key=value pair' % tv, exc_info=True)

        def find(messages, attr):
            occurrences = set(getattr(m, attr) for m in messages
                              if hasattr(m, attr) and getattr(m, attr))
            assert len(occurrences) <= 1
            if occurrences:
                return occurrences.pop()
            else:
                return None

        def update_msg(msg, sl, rl):
            if sl:
                s = factory.create(uml2.MessageOccurrenceSpecification)
                s.covered = sl
                m.sendEvent = s
            if rl:
                r = factory.create(uml2.MessageOccurrenceSpecification)
                r.covered = rl
                m.receiveEvent = r

        for e in elements.values():
            if e.type == 'MessageItem':
                msg = e.element
                send = msg.subject.sendEvent
                receive = msg.subject.receiveEvent

                if not send:
                    send = find(list(msg._messages.keys()), 'sendEvent')
                if not receive:
                    receive = find(list(msg._messages.keys()), 'receiveEvent')
                if not send:
                    send = find(list(msg._inverted_messages.keys()), 'reveiveEvent')
                if not receive:
                    receive = find(list(msg._inverted_messages.keys()), 'sendEvent')

                sl = send.covered if send else None
                rl = receive.covered if receive else None

                for m in msg._messages:
                    update_msg(m, sl, rl)
                for m in msg._inverted_messages:
                    update_msg(m, rl, sl)
                msg.subject.sendEvent = send
                msg.subject.receiveEvent = receive