Rename Package.ownedClassifier to ownedType

And add upgrade for loading.
This commit is contained in:
Arjan Molenaar
2021-01-31 16:30:34 +01:00
parent e6fae83610
commit b12dd6d620
9 changed files with 40 additions and 17 deletions

View File

@ -11,9 +11,9 @@ A UML element can have two tags: references (`ref`) and values (`val`). Referenc
Diagram is a special case. All items on a canvas are embedded in the Diagram
element's.
Since many references are bi-directional, you'll find both ends defined in the file (e.g. `Package.ownedClassifier` - `Actor.package`, and `Diagram.ownedPresentation` and `UseCaseItem.diagram`).
Since many references are bi-directional, you'll find both ends defined in the file (e.g. `Package.ownedType` - `Actor.package`, and `Diagram.ownedPresentation` and `UseCaseItem.diagram`).
```xml
```xml
<?xml version="1.0" ?>
<Gaphor version="1.0" gaphor_version="0.3">
<Package id="1">

View File

@ -19,7 +19,7 @@ def activity_config(new_item):
package = diagram.namespace
activities = (
[i for i in package.ownedClassifier if isinstance(i, UML.Activity)]
[i for i in package.ownedType if isinstance(i, UML.Activity)]
if package
else diagram.model.lselect(
lambda e: isinstance(e, UML.Activity) and e.package is None

View File

@ -19,7 +19,7 @@ def interaction_config(new_item):
package = diagram.namespace
interactions = (
[i for i in package.ownedClassifier if isinstance(i, UML.Interaction)]
[i for i in package.ownedType if isinstance(i, UML.Interaction)]
if package
else diagram.model.lselect(
lambda e: isinstance(e, UML.Interaction) and e.package is None

View File

@ -29,7 +29,7 @@ def state_machine_config(new_item):
package = diagram.namespace
state_machines = (
[i for i in package.ownedClassifier if isinstance(i, UML.StateMachine)]
[i for i in package.ownedType if isinstance(i, UML.StateMachine)]
if package
else diagram.model.lselect(
lambda e: isinstance(e, UML.StateMachine) and e.package is None

View File

@ -260,7 +260,7 @@ def test_namedelement_qualifiedname(factory):
assert ["Class"] == c.qualifiedName
p.ownedClassifier = c
p.ownedType = c
assert ["Package", "Class"] == c.qualifiedName

View File

@ -373,7 +373,7 @@ class Package(Namespace, PackageableElement):
ownedDiagram: relation_many[Diagram]
nestedPackage: relation_many[Package]
package: relation_one[Package]
ownedClassifier: relation_many[Type]
ownedType: relation_many[Type]
packageMerge: relation_many[PackageMerge]
appliedProfile: relation_many[ProfileApplication]
packagedElement: relation_many[PackageableElement]
@ -869,10 +869,8 @@ Activity.group = association(
"group", ActivityGroup, composite=True, opposite="activity"
)
ActivityGroup.activity = association("activity", Activity, upper=1, opposite="group")
Package.ownedClassifier = association(
"ownedClassifier", Type, composite=True, opposite="package"
)
Type.package = association("package", Package, upper=1, opposite="ownedClassifier")
Package.ownedType = association("ownedType", Type, composite=True, opposite="package")
Type.package = association("package", Package, upper=1, opposite="ownedType")
Property.subsettedProperty = association("subsettedProperty", Property)
Property.classifier = association(
"classifier", Classifier, upper=1, opposite="attribute"
@ -1421,7 +1419,7 @@ Package.packagedElement = derivedunion(
PackageableElement,
0,
"*",
Package.ownedClassifier,
Package.ownedType,
Package.nestedPackage,
)
Namespace.ownedMember = derivedunion(

View File

@ -174,7 +174,7 @@ def load_elements_generator(elements, factory, modeling_language, gaphor_version
)
yield from _load_attributes_and_references(elements, update_status_queue)
ensure_style_sheet_is_present(factory)
upgrade_ensure_style_sheet_is_present(factory)
for id, elem in list(elements.items()):
yield from update_status_queue()
@ -207,7 +207,9 @@ def _load_elements_and_canvasitems(
yield from update_status_queue()
if isinstance(elem, parser.element):
if version_lower_than(gaphor_version, (2, 1, 0)):
elem = upgrade_element_to_2_1_0(elem)
elem = upgrade_element_owned_comment_to_comment(elem)
if version_lower_than(gaphor_version, (2, 3, 0)):
elem = upgrade_package_owned_classifier_to_owned_type(elem)
cls = modeling_language.lookup_element(elem.type)
assert cls, f"Type {elem.type} can not be loaded: no such element"
@ -368,7 +370,8 @@ def clone_canvasitem(item, subject_id):
return new_item
def ensure_style_sheet_is_present(factory):
# since 2.2.0
def upgrade_ensure_style_sheet_is_present(factory):
style_sheet = next(factory.select(StyleSheet), None)
if not style_sheet:
factory.create(StyleSheet)
@ -408,9 +411,21 @@ def upgrade_canvas_item_to_1_3_0(item):
return item
def upgrade_element_to_2_1_0(elem):
# since 2.1.0
def upgrade_element_owned_comment_to_comment(elem):
for name, refids in dict(elem.references).items():
if name == "ownedComment":
elem.references["comment"] = refids
del elem.references["ownedComment"]
break
return elem
# since 2.3.0
def upgrade_package_owned_classifier_to_owned_type(elem):
for name, refids in dict(elem.references).items():
if name == "ownedClassifier":
elem.references["ownedType"] = refids
del elem.references["ownedClassifier"]
break
return elem

View File

@ -25,3 +25,13 @@ def test_owned_comment_to_comment_upgrade(loader):
assert elem in comment.annotatedElement
assert comment in elem.comment
assert isinstance(style_sheet, StyleSheet)
def test_owned_classifier_to_owned_type(loader):
p = element(id="1", type="Package")
p.references["ownedClassifier"] = ["2"]
c = element(id="2", type="Class")
package, clazz, _ = loader(p, c)
assert clazz in package.ownedType
assert clazz.package is package

View File

@ -12487,7 +12487,7 @@
<ref refid="DCE:B445FB00-4695-11D7-B567-379CA7034986"/>
</class_>
<name>
<val>ownedClassifier</val>
<val>ownedType</val>
</name>
<type>
<ref refid="DCE:6B38D020-83D9-11D7-ADE2-4B1972AF3391"/>