Let ModelProvider load modelProviders

Model providers do not need to be services.
They do not have behaviour, only provider data to other services.
This commit is contained in:
Arjan Molenaar
2020-04-14 20:55:17 +02:00
parent 9f5b02cd9a
commit b1dd9d093e
3 changed files with 62 additions and 1 deletions

View File

@ -0,0 +1,51 @@
from typing import Dict
from gaphor.abc import ModelProvider, Service
from gaphor.entrypoint import initialize
class ModelProviderService(Service, ModelProvider):
DEFAULT_PROFILE = "UML"
def __init__(self, properties={}):
"""
Create a new Model Provider. It will provide all models defined
as entrypoints under `[gaphor.modelproviders]`.
Te `properties` argument is optional, in which case the service will
default to UML.
"""
self.model_providers: Dict[str, ModelProvider] = initialize(
"gaphor.modelproviders"
)
self.properties = properties
def shutdown(self):
pass
@property
def active_provider(self):
profile = self.properties.get("profile", default=self.DEFAULT_PROFILE)
if profile not in self.model_providers:
profile = self.DEFAULT_PROFILE
return self.model_providers[profile]
@property
def name(self):
return self.active_provider.name
def lookup_element(self, name):
return self.first(lambda provider: provider.lookup_element(name))
def lookup_diagram_item(self, name):
return self.first(lambda provider: provider.lookup_diagram_item(name))
def toolbox_definition(self):
return self.active_provider.toolbox_definition
def first(self, predicate):
for _, provider in self.model_providers.items():
type = predicate(provider)
if type:
return type

View File

@ -0,0 +1,7 @@
from gaphor.services.modelprovider import ModelProviderService
def test_loading_of_model_providers():
model_provider = ModelProviderService(properties={})
assert "UML" in model_provider.model_providers

View File

@ -71,7 +71,7 @@ gaphorconvert = 'gaphor.tools.gaphorconvert:main'
"properties" = "gaphor.services.properties:Properties"
"undo_manager" = "gaphor.services.undomanager:UndoManager"
"element_factory" = "gaphor.core.modeling:ElementFactory"
"model_provider" = "gaphor.UML.modelprovider:UMLModelProvider"
"model_provider" = "gaphor.services.modelprovider:ModelProviderService"
"uml_model_provider" = "gaphor.UML.modelprovider:UMLModelProvider"
"file_manager" = "gaphor.ui.filemanager:FileManager"
"recent_files" = "gaphor.ui.recentfiles:RecentFiles"
@ -89,6 +89,9 @@ gaphorconvert = 'gaphor.tools.gaphorconvert:main'
"diagram_export" = "gaphor.plugins.diagramexport:DiagramExport"
"xmi_export" = "gaphor.plugins.xmiexport:XMIExport"
[tool.poetry.plugins."gaphor.modelproviders"]
"UML" = "gaphor.UML.modelprovider:UMLModelProvider"
[tool.isort]
multi_line_output = 3
include_trailing_comma = true