Skip to content

Commit

Permalink
Merge pull request #298 from gaphor/feature/package-import
Browse files Browse the repository at this point in the history
Add Package Import to Toolbar
  • Loading branch information
amolenaar committed Apr 12, 2020
2 parents 0b87152 + b2915b6 commit 6a2f4ea
Show file tree
Hide file tree
Showing 6 changed files with 171 additions and 0 deletions.
9 changes: 9 additions & 0 deletions gaphor/diagram/diagramtoolbox_actions_uml.py
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,15 @@ def metaclass_config(new_item):
diagram.profiles.ExtensionItem
),
),
ToolDef(
"toolbox-import",
gettext("Import"),
"gaphor-import-symbolic",
"<Shift>M",
item_factory=PlacementTool.new_item_factory(
diagram.profiles.PackageImportItem
),
),
),
),
)
2 changes: 2 additions & 0 deletions gaphor/diagram/profiles/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from gaphor.diagram.profiles.extension import ExtensionItem
from gaphor.diagram.profiles.packageimport import PackageImportItem


def _load():
from gaphor.diagram.profiles import (
extensionconnect,
metaclasspropertypage,
packageimportconnect,
stereotypepropertypages,
)

Expand Down
22 changes: 22 additions & 0 deletions gaphor/diagram/profiles/packageimport.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
"""Profile Import dependency relationship."""

from gaphor import UML
from gaphor.diagram.presentation import LinePresentation
from gaphor.diagram.shapes import Text, draw_arrow_head
from gaphor.diagram.support import represents
from gaphor.UML.modelfactory import stereotypes_str


@represents(UML.PackageImport)
class PackageImportItem(LinePresentation):
"""Profile Import dependency relationship."""

def __init__(self, id=None, model=None):
super().__init__(id, model, style={"dash-style": (7.0, 5.0)})

self.shape_middle = Text(
text=lambda: stereotypes_str(self.subject, ("import",)),
style={"min-width": 0, "min-height": 0},
)
self.watch("subject.appliedStereotype.classifier.name")
self.draw_head = draw_arrow_head
44 changes: 44 additions & 0 deletions gaphor/diagram/profiles/packageimportconnect.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""Package Import connection adapters."""

from gaphor import UML
from gaphor.diagram.connectors import Connector, RelationshipConnect
from gaphor.diagram.presentation import Named
from gaphor.diagram.profiles.packageimport import PackageImportItem


@Connector.register(Named, PackageImportItem)
class PackageImportConnect(RelationshipConnect):
"""Connect an external model to a Package using an Import."""

def allow(self, handle, port):
line = self.line
element = self.element

# Element at the head should be a Package
if handle is line.head and not isinstance(element.subject, UML.Package):
return None

# Element at the tail should also be a Package
if handle is line.tail and not isinstance(element.subject, UML.Package):
return None

return super().allow(handle, port)

def reconnect(self, handle, port):
line = self.line
impl = line.subject
assert isinstance(impl, UML.Package)
self.reconnect_relationship(
handle,
UML.PackageImport.importedPackage,
UML.PackageImport.importingNamespace,
)

def connect_subject(self, handle):
"""Perform import package relationship connection."""
relation = self.relationship_or_new(
UML.PackageImport,
UML.PackageImport.importedPackage,
UML.PackageImport.importingNamespace,
)
self.line.subject = relation
47 changes: 47 additions & 0 deletions gaphor/diagram/profiles/tests/test_packageimportconnect.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"""Package Import Item connection adapter tests."""

from gaphor import UML
from gaphor.diagram.classes.klass import ClassItem
from gaphor.diagram.classes.package import PackageItem
from gaphor.diagram.profiles.packageimport import PackageImportItem
from gaphor.diagram.tests.fixtures import allow, connect


def test_glue(element_factory, diagram):
"""Test gluing package import item."""

pkg_import = diagram.create(PackageImportItem)
package1 = diagram.create(PackageItem, subject=element_factory.create(UML.Package))
package2 = diagram.create(PackageItem, subject=element_factory.create(UML.Package))

glued = allow(pkg_import, pkg_import.tail, package1)

assert glued

connect(pkg_import, pkg_import.tail, package1)

glued = allow(pkg_import, pkg_import.head, package2)

assert glued


def test_package_glue(element_factory, diagram):
"""Test package import item can't glue to a class."""

pkg_import = diagram.create(PackageImportItem)
import_class = diagram.create(ClassItem, subject=element_factory.create(UML.Class))

glued = allow(pkg_import, pkg_import.head, import_class)

assert not glued


def test_connection(element_factory, diagram):
"""Test package import item connection."""

pkg_import = diagram.create(PackageImportItem)
package1 = diagram.create(PackageItem, subject=element_factory.create(UML.Package))
package2 = diagram.create(PackageItem, subject=element_factory.create(UML.Package))

connect(pkg_import, pkg_import.tail, package1)
connect(pkg_import, pkg_import.head, package2)
47 changes: 47 additions & 0 deletions gaphor/ui/icons/gaphor-import-symbolic.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 6a2f4ea

Please sign in to comment.