Fix interface class list

Communicator Modules were exported with the interface class Module
instead of the correct Communicator interface. Modules that combine
Drivable etc. and Communicator also did not have Communicator listed
as a second valid interface class.

Change-Id: Ib74d866cf97631f7fbc29ea9914b2968010cf226
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31037
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
This commit is contained in:
Alexander Zaft
2023-05-05 15:53:31 +02:00
parent 0153975d32
commit e20986c65b
2 changed files with 17 additions and 2 deletions

View File

@ -376,7 +376,7 @@ class Module(HasAccessibles):
# b.__name__ for b in mycls.__mro__ if b.__module__.startswith('frappy.modules')]
# list of only the 'highest' secop module class
self.interface_classes = [
b.__name__ for b in mycls.__mro__ if issubclass(Drivable, b)][0:1]
b.__name__ for b in mycls.__mro__ if b in SECoP_BASE_CLASSES][:1]
# handle Features
self.features = [b.__name__ for b in mycls.__mro__ if Feature in b.__bases__]
@ -897,6 +897,7 @@ class Communicator(HasComlog, Module):
"""
raise NotImplementedError()
SECoP_BASE_CLASSES = {Readable, Writable, Drivable, Communicator}
class Attached(Property):
"""a special property, defining an attached module

View File

@ -28,7 +28,7 @@ import pytest
from frappy.datatypes import BoolType, FloatRange, StringType, IntRange, ScaledInteger
from frappy.errors import ProgrammingError, ConfigError, RangeError
from frappy.modules import Communicator, Drivable, Readable, Module
from frappy.modules import Communicator, Drivable, Readable, Module, Writable
from frappy.params import Command, Parameter, Limit
from frappy.rwhandler import ReadHandler, WriteHandler, nopoll
from frappy.lib import generalConfig
@ -902,3 +902,17 @@ def test_limit_inheritance():
with pytest.raises(ValueError):
mod2.write_a(0)
@pytest.mark.parametrize('bases, iface_classes', [
([Module], ()),
([Communicator], ('Communicator',)),
([Readable], ('Readable',)),
([Writable], ('Writable',)),
([Drivable], ('Drivable',)),
])
def test_interface_classes(bases, iface_classes):
srv = ServerStub({})
class Mod(*bases):
pass
m = Mod('mod', LoggerStub(), {'description': 'test'}, srv)
assert m.interface_classes == iface_classes