diff --git a/frappy/modulebase.py b/frappy/modulebase.py index 9d25648a..de3bb704 100644 --- a/frappy/modulebase.py +++ b/frappy/modulebase.py @@ -348,7 +348,7 @@ class Module(HasAccessibles): self.attachedModules = {} self.errors = [] self._isinitialized = False - self.updateCallback = srv.dispatcher.announce_update + self.updateCallback = srv.dispatcher.announce_update # handle module properties # 1) make local copies of properties @@ -549,7 +549,7 @@ class Module(HasAccessibles): arg = value pobj.readerror = None if pobj.export: - self.updateCallback(self.name, pname, pobj) + self.updateCallback(self, pobj) cblist = callbacks[pname] for cb in cblist: try: diff --git a/frappy/modules.py b/frappy/modules.py index 39dc7066..62026384 100644 --- a/frappy/modules.py +++ b/frappy/modules.py @@ -133,6 +133,9 @@ class Attached(Property): if not modulename: return None # happens when mandatory=False and modulename is not given modobj = obj.secNode.get_module(modulename) + if not modobj: + raise ConfigError(f'attached module {self.name}={modulename!r} ' + f'does not exist') if not isinstance(modobj, self.basecls): raise ConfigError(f'attached module {self.name}={modobj.name!r} ' f'must inherit from {self.basecls.__qualname__!r}') diff --git a/frappy/playground.py b/frappy/playground.py index 0b7f88eb..7b2deeb8 100644 --- a/frappy/playground.py +++ b/frappy/playground.py @@ -81,14 +81,14 @@ class Dispatcher(dispatcher.Dispatcher): super().__init__(name, log, options, srv) self.log = srv.log # overwrite child logger - def announce_update(self, modulename, pname, pobj): + def announce_update(self, moduleobj, pobj): if pobj.readerror: value = repr(pobj.readerror) else: value = pobj.value - logobj = self._modules.get(modulename, self) + logobj = self._modules.get(moduleobj.name, self) # self.log.info('%s:%s %r', modulename, pname, value) - logobj.log.info('%s %r', pname, value) + logobj.log.info('%s %r', pobj.name, value) def register_module(self, moduleobj, modulename, export=True): self.log.info('registering %s', modulename) diff --git a/frappy/protocol/dispatcher.py b/frappy/protocol/dispatcher.py index aa60956e..cc95e23d 100644 --- a/frappy/protocol/dispatcher.py +++ b/frappy/protocol/dispatcher.py @@ -93,10 +93,10 @@ class Dispatcher: for conn in listeners: conn.send_reply(msg) - def announce_update(self, modulename, pname, pobj): + def announce_update(self, moduleobj, pobj): """called by modules param setters to notify subscribers of new values """ - self.broadcast_event(make_update(modulename, pobj)) + self.broadcast_event(make_update(moduleobj.name, pobj)) def subscribe(self, conn, eventname): self._subscriptions.setdefault(eventname, set()).add(conn) diff --git a/frappy/secnode.py b/frappy/secnode.py index 6b7b91a3..b2ea18e0 100644 --- a/frappy/secnode.py +++ b/frappy/secnode.py @@ -94,6 +94,7 @@ class SecNode: if modulename in list(self.modules.values()): # it's actually already the module object return modulename + # create module from srv.module_cfg, store and return self.log.debug('attempting to create module %r', modulename) diff --git a/test/test_attach.py b/test/test_attach.py index b57f05a0..551fedad 100644 --- a/test/test_attach.py +++ b/test/test_attach.py @@ -23,29 +23,6 @@ from frappy.modules import Module, Attached from frappy.protocol.dispatcher import Dispatcher -# class DispatcherStub: -# # omit_unchanged_within = 0 -# -# # def __init__(self, updates): -# # self.updates = updates -# # -# # def announce_update(self, modulename, pname, pobj): -# # self.updates.setdefault(modulename, {}) -# # if pobj.readerror: -# # self.updates[modulename]['error', pname] = str(pobj.readerror) -# # else: -# # self.updates[modulename][pname] = pobj.value -# -# def __init__(self): -# self.modules = {} -# -# def get_module(self, name): -# return self.modules[name] -# -# def register_module(self, name, module): -# self.modules[name] = module - - class LoggerStub: def debug(self, fmt, *args): print(fmt % args) diff --git a/test/test_handler.py b/test/test_handler.py index 26d87ba0..0fb5e5e3 100644 --- a/test/test_handler.py +++ b/test/test_handler.py @@ -36,12 +36,13 @@ class DispatcherStub: generalConfig.testinit(omit_unchanged_within=0) self.updates = updates - def announce_update(self, modulename, pname, pobj): + def announce_update(self, moduleobj, pobj): + modulename = moduleobj.name self.updates.setdefault(modulename, {}) if pobj.readerror: - self.updates[modulename]['error', pname] = str(pobj.readerror) + self.updates[modulename]['error', pobj.name] = str(pobj.readerror) else: - self.updates[modulename][pname] = pobj.value + self.updates[modulename][pobj.name] = pobj.value class LoggerStub: diff --git a/test/test_modules.py b/test/test_modules.py index e18a107e..5a1f4984 100644 --- a/test/test_modules.py +++ b/test/test_modules.py @@ -43,12 +43,13 @@ class DispatcherStub: generalConfig.testinit(omit_unchanged_within=0) self.updates = updates - def announce_update(self, modulename, pname, pobj): + def announce_update(self, moduleobj, pobj): + modulename = moduleobj.name self.updates.setdefault(modulename, {}) if pobj.readerror: - self.updates[modulename]['error', pname] = str(pobj.readerror) + self.updates[modulename]['error', pobj.name] = str(pobj.readerror) else: - self.updates[modulename][pname] = pobj.value + self.updates[modulename][pobj.name] = pobj.value class LoggerStub: @@ -706,10 +707,10 @@ def test_super_call(): def __init__(self, updates): self.updates = updates - def announce_update(self, modulename, pname, pobj): + def announce_update(self, moduleobj, pobj): if pobj.readerror: raise pobj.readerror - self.updates.append((modulename, pname, pobj.value)) + self.updates.append((moduleobj.name, pobj.name, pobj.value)) class ServerStub1: def __init__(self, updates): diff --git a/test/test_persistent.py b/test/test_persistent.py index be931cd6..1dd74fc4 100644 --- a/test/test_persistent.py +++ b/test/test_persistent.py @@ -34,7 +34,7 @@ class SecNodeStub: class DispatcherStub: - def announce_update(self, modulename, pname, pobj): + def announce_update(self, moduleobj, pobj): pass diff --git a/test/test_poller.py b/test/test_poller.py index 1a2f85f9..077c40c9 100644 --- a/test/test_poller.py +++ b/test/test_poller.py @@ -52,7 +52,7 @@ artime = Time() # artificial test time class DispatcherStub: maxcycles = 10 - def announce_update(self, modulename, pname, pobj): + def announce_update(self, moduleobj, pobj): now = artime.time() if hasattr(pobj, 'stat'): pobj.stat.append(now) diff --git a/test/test_statemachine.py b/test/test_statemachine.py index 876480c7..a91371ad 100644 --- a/test/test_statemachine.py +++ b/test/test_statemachine.py @@ -194,12 +194,12 @@ class DispatcherStub: generalConfig.testinit(omit_unchanged_within=0) self.updates = updates - def announce_update(self, modulename, pname, pobj): - assert modulename == 'obj' + def announce_update(self, moduleobj, pobj): + assert moduleobj.name == 'obj' if pobj.readerror: - self.updates.append((pname, pobj.readerror)) + self.updates.append((pobj.name, pobj.readerror)) else: - self.updates.append((pname, pobj.value)) + self.updates.append((pobj.name, pobj.value)) class ServerStub: