summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuergen Bocklage-Ryannel <jbocklage-ryannel@luxoft.com>2017-07-20 11:30:58 +0200
committerJuergen Bocklage-Ryannel <jbocklage-ryannel@luxoft.com>2017-07-20 11:30:58 +0200
commit715e32488635f82bf29e3ec96ec3ed82b1cd5176 (patch)
tree5bf853f4a225da5f5a0fd2d3b7763f409ed221a5
parent39f2a59098febbf128cc1ef52a75445ec8ed36e9 (diff)
parentda22c4cdaa0b85e8a019d88ec4942a2f39c67a51 (diff)
downloadqtivi-qface-715e32488635f82bf29e3ec96ec3ed82b1cd5176.tar.gz
Merge branch 'release/1.5'1.5
-rw-r--r--qface/__about__.py2
-rw-r--r--qface/filters.py7
-rw-r--r--qface/helper/qtcpp.py18
-rw-r--r--qface/helper/qtqml.py7
-rw-r--r--qface/idl/domain.py20
-rw-r--r--qface/templates/qface/qtcpp.j217
-rw-r--r--tests/in/com.pelagicore.ivi.tuner.qface4
-rw-r--r--tests/test_parser.py17
-rw-r--r--tests/test_qtcpp_helper.py24
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():