diff options
author | Juergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com> | 2017-02-01 16:42:42 +0100 |
---|---|---|
committer | Juergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com> | 2017-02-01 16:42:42 +0100 |
commit | 31d1871d884de09b1fb376c3450d872898698a7d (patch) | |
tree | 4fcbe1e2ad4dbdb301e3a3ba42440b9724df6aa0 | |
parent | 7f319df43cd23ccb97cc390b3529a61d14714485 (diff) | |
download | qtivi-qface-31d1871d884de09b1fb376c3450d872898698a7d.tar.gz |
Added initial support fragment lookup e.g. org.example.tuner.Tuner#scan the part after the # identifies a property/operation/signal
-rw-r--r-- | qface/idl/domain.py | 33 | ||||
-rw-r--r-- | tests/test_lookup.py | 6 |
2 files changed, 29 insertions, 10 deletions
diff --git a/qface/idl/domain.py b/qface/idl/domain.py index a325b55..3d08e19 100644 --- a/qface/idl/domain.py +++ b/qface/idl/domain.py @@ -25,6 +25,7 @@ input for the code generation templates. ''' from collections import OrderedDict, ChainMap +import click import logging log = logging.getLogger(__name__) @@ -53,21 +54,29 @@ class System(object): if name in self._moduleMap: return self._moduleMap[name] # <module>.<Symbol> - (module_name, type_name) = self.split_typename(name) + (module_name, type_name, fragment_name) = self.split_typename(name) if not module_name and type_name: click.secho('not able to lookup symbol: {0}'.format(name), fg='red') return None module = self._moduleMap[module_name] - return module.lookup(type_name) + return module.lookup(type_name, fragment_name) @staticmethod def split_typename(name): + parts = name.rsplit('#', 1) + fragment_name = None + module_name = None + type_name = None + if len(parts) == 2: + fragment_name = parts[1] + name = parts[0] parts = name.rsplit('.', 1) if len(parts) == 1: - return ('', parts[0]) - if len(parts) == 2: - return parts - return ('', '') + type_name = parts[0] + elif len(parts) == 2: + module_name = parts[0] + type_name = parts[1] + return (module_name, type_name, fragment_name) class Symbol(object): @@ -80,7 +89,7 @@ class Symbol(object): self.comment = '' """comment which appeared in QFace right before symbol""" self._tags = OrderedDict() - + self._definitionMap = ChainMap() @property @@ -242,7 +251,7 @@ class Module(Symbol): def checkType(self, type: str): if type.is_primitive: return True - (module_name, type_name) = System.split_typename(type.name) + (module_name, type_name, fragment_name) = System.split_typename(type.name) if module_name and module_name not in self._importMap: return False return True @@ -256,11 +265,14 @@ class Module(Symbol): def module_name(self): return self.name.split('.')[-1].capitalize() - def lookup(self, name: str): + def lookup(self, name: str, fragment: str = None): '''lookup a symbol by name. If symbol is not local it will be looked up system wide''' if name in self._definitionMap: - return self._definitionMap[name] + symbol = self._definitionMap[name] + if fragment: + return symbol._definitionMap[fragment] + return symbol return self.system.lookup(name) @@ -273,6 +285,7 @@ class Interface(Symbol): self._propertyMap = OrderedDict() # type: dict[str, Property] self._operationMap = OrderedDict() # type: dict[str, Operation] self._eventMap = OrderedDict() # type: dict[str, Operation] + self._definitionMap = ChainMap(self._propertyMap, self._operationMap, self._eventMap) @property def properties(self): diff --git a/tests/test_lookup.py b/tests/test_lookup.py index af29ee9..47184c0 100644 --- a/tests/test_lookup.py +++ b/tests/test_lookup.py @@ -34,3 +34,9 @@ def test_lookup(): # lookup enum enum = system.lookup('com.pelagicore.ivi.tuner.Waveband') assert enum is module.lookup('Waveband') + + property = system.lookup('com.pelagicore.ivi.tuner.Tuner#currentStation') + assert property.name == 'currentStation' + + operation = system.lookup('com.pelagicore.ivi.tuner.Tuner#nextStation') + assert operation.name == 'nextStation' |