summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com>2017-02-01 16:42:42 +0100
committerJuergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com>2017-02-01 16:42:42 +0100
commit31d1871d884de09b1fb376c3450d872898698a7d (patch)
tree4fcbe1e2ad4dbdb301e3a3ba42440b9724df6aa0
parent7f319df43cd23ccb97cc390b3529a61d14714485 (diff)
downloadqtivi-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.py33
-rw-r--r--tests/test_lookup.py6
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'