diff --git a/frappy/modulebase.py b/frappy/modulebase.py index 9d25648..de3bb70 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 850b06f..0d835ee 100644 --- a/frappy/modules.py +++ b/frappy/modules.py @@ -946,6 +946,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 05647e7..2f9d873 100644 --- a/frappy/playground.py +++ b/frappy/playground.py @@ -82,14 +82,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 36792d3..b5b18dc 100644 --- a/frappy/protocol/dispatcher.py +++ b/frappy/protocol/dispatcher.py @@ -94,10 +94,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 6b7b91a..b2ea18e 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 de41e35..ff57f5a 100644 --- a/test/test_attach.py +++ b/test/test_attach.py @@ -24,29 +24,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 2e738fd..649422f 100644 --- a/test/test_handler.py +++ b/test/test_handler.py @@ -37,12 +37,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 45490bf..3301ea4 100644 --- a/test/test_modules.py +++ b/test/test_modules.py @@ -44,12 +44,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: @@ -707,10 +708,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 5823b45..b6935f5 100644 --- a/test/test_persistent.py +++ b/test/test_persistent.py @@ -35,7 +35,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 57daea0..da504b2 100644 --- a/test/test_poller.py +++ b/test/test_poller.py @@ -53,7 +53,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 978d2cf..8e12e99 100644 --- a/test/test_statemachine.py +++ b/test/test_statemachine.py @@ -195,12 +195,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: