diff options
author | Juergen Bocklage-Ryannel <jbocklage-ryannel@luxoft.com> | 2017-07-20 11:30:58 +0200 |
---|---|---|
committer | Juergen Bocklage-Ryannel <jbocklage-ryannel@luxoft.com> | 2017-07-20 11:30:58 +0200 |
commit | 715e32488635f82bf29e3ec96ec3ed82b1cd5176 (patch) | |
tree | 5bf853f4a225da5f5a0fd2d3b7763f409ed221a5 | |
parent | 39f2a59098febbf128cc1ef52a75445ec8ed36e9 (diff) | |
parent | da22c4cdaa0b85e8a019d88ec4942a2f39c67a51 (diff) | |
download | qtivi-qface-715e32488635f82bf29e3ec96ec3ed82b1cd5176.tar.gz |
Merge branch 'release/1.5'1.5
-rw-r--r-- | qface/__about__.py | 2 | ||||
-rw-r--r-- | qface/filters.py | 7 | ||||
-rw-r--r-- | qface/helper/qtcpp.py | 18 | ||||
-rw-r--r-- | qface/helper/qtqml.py | 7 | ||||
-rw-r--r-- | qface/idl/domain.py | 20 | ||||
-rw-r--r-- | qface/templates/qface/qtcpp.j2 | 17 | ||||
-rw-r--r-- | tests/in/com.pelagicore.ivi.tuner.qface | 4 | ||||
-rw-r--r-- | tests/test_parser.py | 17 | ||||
-rw-r--r-- | tests/test_qtcpp_helper.py | 24 |
9 files changed, 80 insertions, 36 deletions
diff --git a/qface/__about__.py b/qface/__about__.py index 3252263..a9d62f6 100644 --- a/qface/__about__.py +++ b/qface/__about__.py @@ -9,7 +9,7 @@ except NameError: __title__ = "qface" __summary__ = "A generator framework based on a common modern IDL" __url__ = "https://pelagicore.github.io/qface/" -__version__ = "1.4" +__version__ = "1.5" __author__ = "JRyannel" __author_email__ = "qface-generator@googlegroups.com" __copyright__ = "2017 Pelagicore" diff --git a/qface/filters.py b/qface/filters.py index 9276d4c..af9fc1f 100644 --- a/qface/filters.py +++ b/qface/filters.py @@ -1,6 +1,7 @@ import json import hashlib + def jsonify(obj): try: # all symbols have a toJson method, try it @@ -9,11 +10,17 @@ def jsonify(obj): pass return json.dumps(obj, indent=' ') + def upper_first(s): s = str(s) return s[0].upper() + s[1:] + def hash(s, hash_type='sha1'): h = hashlib.new(hash_type) h.update(str(s).encode('utf-8')) return h.hexdigest() + + +def path(s): + return str(s).replace('.', '/') diff --git a/qface/helper/qtcpp.py b/qface/helper/qtcpp.py index 8310c4b..4a7178d 100644 --- a/qface/helper/qtcpp.py +++ b/qface/helper/qtcpp.py @@ -11,7 +11,7 @@ def upper_first(s): class Filters(object): """provides a set of filters to be used with the template engine""" - classPrefix = 'Qml' + classPrefix = '' @staticmethod def className(symbol): @@ -36,7 +36,7 @@ class Filters(object): elif t.is_void: return '' elif t.is_enum: - module_name = t.reference.module.module_name + module_name = upper_first(t.reference.module.module_name) value = next(iter(t.reference.members)) return '{0}{1}Module::{2}'.format(prefix, module_name, value) elif symbol.type.is_list: @@ -55,7 +55,7 @@ class Filters(object): @staticmethod def parameterType(symbol): prefix = Filters.classPrefix - module_name = symbol.module.module_name + module_name = upper_first(symbol.module.module_name) if symbol.type.is_enum: return '{0}{1}Module::{2} {3}'.format(prefix, module_name, symbol.type, symbol) if symbol.type.is_void or symbol.type.is_primitive: @@ -82,7 +82,7 @@ class Filters(object): @staticmethod def returnType(symbol): prefix = Filters.classPrefix - module_name = symbol.module.module_name + module_name = upper_first(symbol.module.module_name) if symbol.type.is_enum: return '{0}{1}Module::{2}'.format(prefix, module_name, symbol.type) if symbol.type.is_void or symbol.type.is_primitive: @@ -174,3 +174,13 @@ class Filters(object): @staticmethod def identifier(s): return str(s).lower().replace('.', '_') + + @staticmethod + def upper_first(s): + s = str(s) + return s[0].upper() + s[1:] + + @staticmethod + def path(s): + return str(s).replace('.', '/') + diff --git a/qface/helper/qtqml.py b/qface/helper/qtqml.py index 9e9c976..db070f5 100644 --- a/qface/helper/qtqml.py +++ b/qface/helper/qtqml.py @@ -3,6 +3,11 @@ Provides helper functionality specificially for Qt5 QML code generators """ +def upper_first(s): + s = str(s) + return s[0].upper() + s[1:] + + class Filters(object): """provides a set of filters to be used with the template engine""" classPrefix = '' @@ -14,7 +19,7 @@ class Filters(object): @staticmethod def defaultValue(symbol): - module = symbol.module.module_name + module = upper_first(symbol.module.module_name) t = symbol.type if t.is_primitive: if t.name == 'int': diff --git a/qface/idl/domain.py b/qface/idl/domain.py index 327472e..b8c611f 100644 --- a/qface/idl/domain.py +++ b/qface/idl/domain.py @@ -219,11 +219,21 @@ class TypeSymbol(NamedElement): return self.is_primitive and self.name == 'string' @property - def is_enum(self): - '''checks if type is complex and enum''' + def is_enumeration(self): + '''checks if type is complex and insytance of type Enum''' return self.is_complex and isinstance(self.reference, Enum) @property + def is_enum(self): + '''checks if type is an enumeration and reference is enum''' + return self.is_enumeration and self.reference.is_enum + + @property + def is_flag(self): + '''checks if type is an enumeration and reference is flag ''' + return self.is_enumeration and self.reference.is_flag + + @property def is_struct(self): '''checks if type is complex and struct''' return self.is_complex and isinstance(self.reference, Struct) @@ -334,8 +344,8 @@ class Module(Symbol): @property def module_name(self): - """ returns a capitalized name from the module name """ - return self.name.split('.')[-1].capitalize() + """ returns the last part of the module uri """ + return self.name.split('.')[-1] def lookup(self, name: str, fragment: str = None): '''lookup a symbol by name. If symbol is not local @@ -405,7 +415,7 @@ class Operation(Symbol): """ the interface the operation is part of """ self.interface._operationMap[name] = self self._parameterMap = self._contentMap = OrderedDict() # type: dict[Parameter] - self.is_const = False #type: bool + self.is_const = False # type: bool """reflects is the operation was declared as const operation""" @property diff --git a/qface/templates/qface/qtcpp.j2 b/qface/templates/qface/qtcpp.j2 index 81b7d7a..bf7824f 100644 --- a/qface/templates/qface/qtcpp.j2 +++ b/qface/templates/qface/qtcpp.j2 @@ -20,14 +20,10 @@ virtual void set{{property|upperfirst}}({{ property|parameterType }}); virtual {{property|returnType}} {{property}}() const; {%- endmacro %} -{% macro signal_decl(symbol) -%} -{% if symbol.is_property %} -void {{symbol}}Changed({{symbol|parameters}}); -{% else %} -void {{symbol}}({{symbol|parameters}}); -{%- endif %} - +{% macro signal_decl(symbol, postfix="") -%} +void {{symbol}}{{postfix}}({{symbol|parameters}}); {%- endmacro %} + {% macro property_member_decl(property) %} {{property|returnType}} m_{{property}}; {%- endmacro %} @@ -44,11 +40,10 @@ void {{symbol}}({{symbol|parameters}}); void {{class}}::set{{property|upperfirst}}({{ property|parameterType }}) { - if(m_{{property}} == {{property}}) { - return; + if (m_{{property}} != {{property}}) { + m_{{property}} = {{property}}; + emit {{property}}Changed({{property}}); } - m_{{property}} = {{property}}; - emit {{property}}Changed(); } {%- endmacro %} diff --git a/tests/in/com.pelagicore.ivi.tuner.qface b/tests/in/com.pelagicore.ivi.tuner.qface index aae8e0c..e8f53ae 100644 --- a/tests/in/com.pelagicore.ivi.tuner.qface +++ b/tests/in/com.pelagicore.ivi.tuner.qface @@ -34,6 +34,8 @@ interface Tuner extends BaseTuner { signal broadcastMessage(string message); TunerExtension extension; + + Feature feature; } interface TunerExtension { @@ -60,7 +62,7 @@ enum Waveband { AM=1 } -flag Features { +flag Feature { Mono = 0x1, Stereo = 0x2, } diff --git a/tests/test_parser.py b/tests/test_parser.py index 764a7b9..b2844fc 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -3,6 +3,7 @@ import logging.config from path import Path from qface.generator import FileSystem +import qface.idl.domain as domain # logging.config.fileConfig('logging.ini') logging.basicConfig() @@ -107,6 +108,7 @@ def test_enum(): def test_enum_counter(): system = load_test() enum = system.lookup('com.pelagicore.test.State') + assert type(enum) is domain.Enum assert enum assert enum._memberMap['Null'].value is 0 assert enum._memberMap['Failure'].value is 3 @@ -115,6 +117,7 @@ def test_enum_counter(): def test_flag_counter(): system = load_test() flag = system.lookup('com.pelagicore.test.Phase') + assert type(flag) is domain.Enum assert flag assert flag._memberMap['PhaseOne'].value is 1 assert flag._memberMap['PhaseTwo'].value is 2 @@ -123,20 +126,30 @@ def test_flag_counter(): def test_flag(): system = load_tuner() - symbol = system.lookup('com.pelagicore.ivi.tuner.Features') + symbol = system.lookup('com.pelagicore.ivi.tuner.Feature') + assert type(symbol) is domain.Enum assert symbol.is_flag + assert not symbol.is_enum + symbol = system.lookup('com.pelagicore.ivi.tuner.Tuner#feature') + assert type(symbol) is domain.Property + assert type(symbol.type.reference) is domain.Enum + + assert symbol.type.is_flag + assert symbol.type.is_enumeration def test_list(): system = load_tuner() interface = system.lookup('com.pelagicore.ivi.tuner.Tuner') property = interface._propertyMap['primitiveList'] + assert type(property) is domain.Property assert property.type.name == 'list' assert property.type.is_list is True assert property.type.nested.is_primitive assert property.type.nested.name == 'int' property = interface._propertyMap['complexList'] + assert type(property) is domain.Property assert property.type.name == 'list' assert property.type.is_list is True assert property.type.nested.is_complex @@ -147,12 +160,14 @@ def test_model(): system = load_tuner() interface = system.lookup('com.pelagicore.ivi.tuner.Tuner') property = interface._propertyMap['primitiveModel'] + assert type(property) is domain.Property assert property.type.name == 'model' assert property.type.is_model is True assert property.type.nested.is_primitive assert property.type.nested.name == 'int' property = interface._propertyMap['complexModel'] + assert type(property) is domain.Property assert property.type.name == 'model' assert property.type.is_model is True assert property.type.nested.is_complex diff --git a/tests/test_qtcpp_helper.py b/tests/test_qtcpp_helper.py index a25210e..a59e0d9 100644 --- a/tests/test_qtcpp_helper.py +++ b/tests/test_qtcpp_helper.py @@ -70,11 +70,11 @@ def test_return_type(): # check for struct prop = interface._propertyMap['message'] answer = qtcpp.Filters.returnType(prop) - assert answer == 'QmlMessage' + assert answer == 'Message' # check for enum prop = interface._propertyMap['status'] answer = qtcpp.Filters.returnType(prop) - assert answer == 'QmlExampleModule::Status' + assert answer == 'ExampleModule::Status' # check for list of primitive prop = interface._propertyMap['list001'] @@ -89,12 +89,12 @@ def test_return_type(): # check for model of primitive prop = interface._propertyMap['model001'] answer = qtcpp.Filters.returnType(prop) - assert answer == 'QmlVariantModel *' + assert answer == 'VariantModel *' # check for model of structs prop = interface._propertyMap['model002'] answer = qtcpp.Filters.returnType(prop) - assert answer == 'QmlMessageModel *' + assert answer == 'MessageModel *' def test_default_value(): @@ -121,11 +121,11 @@ def test_default_value(): # check for struct prop = interface._propertyMap['message'] answer = qtcpp.Filters.defaultValue(prop) - assert answer == 'QmlMessage()' + assert answer == 'Message()' # check for enum prop = interface._propertyMap['status'] answer = qtcpp.Filters.defaultValue(prop) - assert answer == 'QmlExampleModule::ON' + assert answer == 'ExampleModule::ON' # check for list of primitive prop = interface._propertyMap['list001'] @@ -140,12 +140,12 @@ def test_default_value(): # check for model of primitive prop = interface._propertyMap['model001'] answer = qtcpp.Filters.defaultValue(prop) - assert answer == 'new QmlVariantModel(this)' + assert answer == 'new VariantModel(this)' # check for model of structs prop = interface._propertyMap['model002'] answer = qtcpp.Filters.defaultValue(prop) - assert answer == 'new QmlMessageModel(this)' + assert answer == 'new MessageModel(this)' def test_parameter_type(): @@ -173,11 +173,11 @@ def test_parameter_type(): # check for struct prop = interface._propertyMap['message'] answer = qtcpp.Filters.parameterType(prop) - assert answer == 'const QmlMessage &{0}'.format(prop.name) + assert answer == 'const Message &{0}'.format(prop.name) # check for enum prop = interface._propertyMap['status'] answer = qtcpp.Filters.parameterType(prop) - assert answer == 'QmlExampleModule::Status {0}'.format(prop.name) + assert answer == 'ExampleModule::Status {0}'.format(prop.name) # check for list of primitive prop = interface._propertyMap['list001'] @@ -192,12 +192,12 @@ def test_parameter_type(): # check for model of primitive prop = interface._propertyMap['model001'] answer = qtcpp.Filters.parameterType(prop) - assert answer == 'QmlVariantModel *{0}'.format(prop.name) + assert answer == 'VariantModel *{0}'.format(prop.name) # check for model of structs prop = interface._propertyMap['model002'] answer = qtcpp.Filters.parameterType(prop) - assert answer == 'QmlMessageModel *{0}'.format(prop.name) + assert answer == 'MessageModel *{0}'.format(prop.name) def test_namespace(): |