summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com>2017-02-15 18:04:38 +0100
committerJuergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com>2017-02-15 18:04:38 +0100
commitdb542436de9b6b4011fc1fe6ed5daa98e27b1e62 (patch)
tree03a46af004a63bea70b5420147ad7494d45caa11
parentf505226745af1ab2057eb8d322a34c1246207b84 (diff)
parenta41d19e8bdc9e12c7f1f637f6e2923d5abbd3909 (diff)
downloadqtivi-qface-db542436de9b6b4011fc1fe6ed5daa98e27b1e62.tar.gz
Merge branch 'develop' of github.com:Pelagicore/qface into develop
-rw-r--r--docs/api.rst11
-rw-r--r--docs/qtcpp.rst2
-rw-r--r--qface/idl/domain.py84
-rw-r--r--qface/idl/listener.py1
-rw-r--r--qface/shell.py16
-rw-r--r--qface/watch.py27
-rw-r--r--tests/test_parser.py2
7 files changed, 86 insertions, 57 deletions
diff --git a/docs/api.rst b/docs/api.rst
index e200730..a9a0d16 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -97,14 +97,21 @@ Struct Related Classes
Base Classes
------------
-.. autoclass:: qface.idl.domain.Symbol
+.. autoclass:: qface.idl.domain.NamedElement
:members:
:show-inheritance:
-.. autoclass:: qface.idl.domain.TypedSymbol
+.. autoclass:: qface.idl.domain.Symbol
:members:
:show-inheritance:
.. autoclass:: qface.idl.domain.TypeSymbol
:members:
:show-inheritance:
+
+Utility Modules
+---------------
+
+.. autofunction:: qface.watch.monitor
+
+.. autofunction:: qface.shell.sh
diff --git a/docs/qtcpp.rst b/docs/qtcpp.rst
index 5178eac..b475ffd 100644
--- a/docs/qtcpp.rst
+++ b/docs/qtcpp.rst
@@ -68,7 +68,7 @@ Code Generation
For each module the generator creates the qmake project files, the plugin code to register the types. A module singleton which contains the enums and factory functions for creating the structures. The structure has no signals and the values are copied over.
-.. code-block:: yml
+.. code-block:: yaml
for each module:
- qmldir
diff --git a/qface/idl/domain.py b/qface/idl/domain.py
index 1a8ca98..9fc553b 100644
--- a/qface/idl/domain.py
+++ b/qface/idl/domain.py
@@ -79,23 +79,21 @@ class System(object):
return (module_name, type_name, fragment_name)
-class Symbol(object):
- """A symbol represents a base class for names elements"""
- def __init__(self, name: str, module: 'Module'):
+class NamedElement(object):
+ def __init__(self, name, module: 'Module'):
self.name = name
"""symbol name"""
self.module = module
"""module the symbol belongs to"""
- self.comment = ''
- """comment which appeared in QFace right before symbol"""
- self._tags = OrderedDict()
- self._definitionMap = ChainMap()
+ def __unicode__(self):
+ return self.name
- @property
- def system(self):
- '''returns reference to system'''
- return self.module._system
+ def __str__(self):
+ return self.name
+
+ def __repr__(self):
+ return '<{0} name={1}>'.format(type(self), self.name)
@property
def qualified_name(self):
@@ -105,14 +103,22 @@ class Symbol(object):
else:
return '{0}.{1}'.format(self.module.name, self.name)
- def __unicode__(self):
- return self.name
- def __str__(self):
- return self.name
+class Symbol(NamedElement):
+ """A symbol represents a base class for names elements"""
+ def __init__(self, name: str, module: 'Module'):
+ super().__init__(name, module)
+ self.comment = ''
+ """comment which appeared in QFace right before symbol"""
+ self._tags = OrderedDict()
- def __repr__(self):
- return '<{0} name={1}>'.format(type(self), self.name)
+ self._contentMap = ChainMap()
+ self.type = TypeSymbol('', self)
+
+ @property
+ def system(self):
+ '''returns reference to system'''
+ return self.module._system
@property
def tags(self):
@@ -134,18 +140,15 @@ class Symbol(object):
if tag in self._tags:
return self._tags[tag][name]
+ @property
+ def contents(self):
+ return self._contentMap.values()
-class TypedSymbol(Symbol):
- """A symbol which has a type, like an operation or property."""
- def __init__(self, name: str, module: 'Module'):
- super().__init__(name, module)
- self.type = TypeSymbol("", self)
- """type object of the symbol"""
-class TypeSymbol(Symbol):
+class TypeSymbol(NamedElement):
"""Defines a type in the system"""
- def __init__(self, name: str, parent: Symbol):
+ def __init__(self, name: str, parent: NamedElement):
super().__init__(name, parent.module)
log.debug('TypeSymbol()')
self.parent = parent
@@ -160,6 +163,11 @@ class TypeSymbol(Symbol):
self.__is_resolved = False
@property
+ def is_valid(self):
+ '''checks if type is a valid type'''
+ return self.is_primitive or self.is_complex
+
+ @property
def is_bool(self):
'''checks if type is primitive and bool'''
return self.is_primitive and self.name == 'bool'
@@ -225,7 +233,7 @@ class Module(Symbol):
self._interfaceMap = OrderedDict() # type: dict[str, Interface]
self._structMap = OrderedDict() # type: dict[str, Struct]
self._enumMap = OrderedDict() # type: dict[str, Enum]
- self._definitionMap = ChainMap(self._interfaceMap, self._structMap, self._enumMap)
+ self._contentMap = ChainMap(self._interfaceMap, self._structMap, self._enumMap)
self._importMap = OrderedDict() # type: dict[str, Module]
@property
@@ -268,10 +276,10 @@ class Module(Symbol):
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:
- symbol = self._definitionMap[name]
+ if name in self._contentMap:
+ symbol = self._contentMap[name]
if fragment:
- return symbol._definitionMap[fragment]
+ return symbol._contentMap[fragment]
return symbol
return self.system.lookup(name)
@@ -285,7 +293,7 @@ class Interface(Symbol):
self._propertyMap = OrderedDict() # type: dict[str, Property]
self._operationMap = OrderedDict() # type: dict[str, Operation]
self._signalMap = OrderedDict() # type: dict[str, Signal]
- self._definitionMap = ChainMap(self._propertyMap, self._operationMap, self._signalMap)
+ self._contentMap = ChainMap(self._propertyMap, self._operationMap, self._signalMap)
@property
def properties(self):
@@ -303,14 +311,14 @@ class Interface(Symbol):
return self._signalMap.values()
-class Operation(TypedSymbol):
+class Operation(Symbol):
"""An operation inside a interface"""
def __init__(self, name: str, interface: Interface):
super().__init__(name, interface.module)
log.debug('Operation()')
self.interface = interface
self.interface._operationMap[name] = self
- self._parameterMap = OrderedDict() # type: dict[Parameter]
+ self._parameterMap = self._contentMap = OrderedDict() # type: dict[Parameter]
@property
def parameters(self):
@@ -325,7 +333,7 @@ class Signal(Symbol):
log.debug('Signal()')
self.interface = interface
self.interface._signalMap[name] = self
- self._parameterMap = OrderedDict() # type: dict[Parameter]
+ self._parameterMap = self._contentMap = OrderedDict() # type: dict[Parameter]
@property
def parameters(self):
@@ -333,7 +341,7 @@ class Signal(Symbol):
return self._parameterMap.values()
-class Parameter(TypedSymbol):
+class Parameter(Symbol):
"""An operation parameter"""
def __init__(self, name: str, operation: Operation):
super().__init__(name, operation.module)
@@ -342,7 +350,7 @@ class Parameter(TypedSymbol):
self.operation._parameterMap[name] = self
-class Property(TypedSymbol):
+class Property(Symbol):
"""A typed property inside a interface"""
def __init__(self, name: str, interface: Interface):
super().__init__(name, interface.module)
@@ -358,7 +366,7 @@ class Struct(Symbol):
super().__init__(name, module)
log.debug('Struct()')
self.module._structMap[name] = self
- self._fieldMap = OrderedDict() # type: dict[str, Field]
+ self._fieldMap = self._contentMap = OrderedDict() # type: dict[str, Field]
@property
def fields(self):
@@ -366,7 +374,7 @@ class Struct(Symbol):
return self._fieldMap.values()
-class Field(TypedSymbol):
+class Field(Symbol):
"""A member in a struct"""
def __init__(self, name: str, struct: Struct):
super().__init__(name, struct.module)
@@ -383,7 +391,7 @@ class Enum(Symbol):
self.is_enum = True
self.is_flag = False
self.module._enumMap[name] = self
- self._memberMap = OrderedDict() # type: dict[EnumMember]
+ self._memberMap = self._contentMap = OrderedDict() # type: dict[EnumMember]
@property
def members(self):
diff --git a/qface/idl/listener.py b/qface/idl/listener.py
index 925e908..826f44f 100644
--- a/qface/idl/listener.py
+++ b/qface/idl/listener.py
@@ -34,6 +34,7 @@ class DomainListener(TListener):
self.field = None # type:Field
def parse_type(self, ctx: ParserRuleContext, type: TypeSymbol):
+ assert type
if not ctx.typeSymbol():
type.is_void = True
type.name = 'void'
diff --git a/qface/shell.py b/qface/shell.py
new file mode 100644
index 0000000..3d34d89
--- /dev/null
+++ b/qface/shell.py
@@ -0,0 +1,16 @@
+import click
+from subprocess import call
+
+"""
+API for interacting with the system shell
+"""
+
+
+def sh(cmd, **kwargs):
+ """
+ runs the given cmd as shell command
+ """
+ if not cmd:
+ return
+ click.echo('$ {0}'.format(cmd))
+ return call(cmd, shell=True, **kwargs)
diff --git a/qface/watch.py b/qface/watch.py
index ca3ec73..4a8512f 100644
--- a/qface/watch.py
+++ b/qface/watch.py
@@ -1,21 +1,18 @@
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer
import click
-from subprocess import call
from path import Path
import time
-import sys
-
-
-def sh(cmd, all=False, **kwargs):
- click.secho('$ {0}'.format(cmd), fg='green')
- return call(cmd, shell=True, **kwargs)
+from .shell import sh
+"""
+Provides an API to monitor the file system
+"""
class RunScriptChangeHandler(FileSystemEventHandler):
- def __init__(self, script):
+ def __init__(self, argv):
super().__init__()
- self.script = script
+ self.argv = argv
self.is_running = False
def on_modified(self, event):
@@ -25,19 +22,19 @@ class RunScriptChangeHandler(FileSystemEventHandler):
if self.is_running:
return
self.is_running = True
- cmd = '{0} {1}'.format(sys.executable, self.script)
- sh(cmd, cwd=Path.getcwd())
+ # cmd = '{0} {1}'.format(sys.executable, ' '.join(self.argv))
+ sh(' '.join(self.argv), cwd=Path.getcwd())
self.is_running = False
-def monitor(src, script):
+def monitor(src, argv):
"""
- reloads the script when src files changes
+ reloads the script given by argv when src files changes
"""
- script = Path(script).expand().abspath()
+ script = Path(argv[0]).expand().abspath()
src = src if isinstance(src, (list, tuple)) else [src]
src = [Path(entry).expand().abspath() for entry in src]
- event_handler = RunScriptChangeHandler(script)
+ event_handler = RunScriptChangeHandler(argv)
observer = Observer()
path = script.dirname().expand().abspath()
click.secho('watch recursive: {0}'.format(path), fg='blue')
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 8357632..2da5e44 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -61,7 +61,7 @@ def test_operation():
interface = system.lookup('com.pelagicore.ivi.tuner.Tuner')
operation = interface._operationMap['nextStation']
assert operation
- operation = interface._definitionMap['previousStation']
+ operation = interface._contentMap['previousStation']
assert operation