Replace .config rather than reconstructing plugins, drivers, and UIs.
authorW. Trevor King <wking@drexel.edu>
Sat, 14 Aug 2010 15:28:00 +0000 (11:28 -0400)
committerW. Trevor King <wking@drexel.edu>
Sat, 14 Aug 2010 15:28:00 +0000 (11:28 -0400)
The previous implementation destroyed any state the plugins, etc. were
holding.  For example, it cleared CommandStackPlugin.command_stack.

hooke/hooke.py
hooke/plugin/__init__.py
hooke/plugin/config.py

index b69bdf8eb166af6c8fbd708c376be652ea59b9d4..b9a659e77397d191ed913939b0bcb816d86378c3 100644 (file)
@@ -54,6 +54,7 @@ if False: # Queue pickle error debugging code
         feed(buffer, notempty, s, writelock, close)
     multiprocessing.queues.Queue._feed = staticmethod(new_feed)
 
+from ConfigParser import NoSectionError
 import logging
 import logging.config
 import multiprocessing
@@ -104,6 +105,7 @@ class Hooke (object):
     def load_plugins(self):
         self.plugins = plugin_mod.load_graph(
             plugin_mod.PLUGIN_GRAPH, self.config, include_section='plugins')
+        self.configure_plugins()
         self.commands = []
         for plugin in self.plugins:
             self.commands.extend(plugin.commands())
@@ -113,9 +115,32 @@ class Hooke (object):
     def load_drivers(self):
         self.drivers = plugin_mod.load_graph(
             driver_mod.DRIVER_GRAPH, self.config, include_section='drivers')
+        self.configure_drivers()
 
     def load_ui(self):
         self.ui = ui.load_ui(self.config)
+        self.configure_ui()
+
+    def configure_plugins(self):
+        for plugin in self.plugins:
+            self._configure_item(plugin)
+
+    def configure_drivers(self):
+        for driver in self.drivers:
+            self._configure_item(driver)
+
+    def configure_ui(self):
+        self._configure_item(self.ui)
+
+    def _configure_item(self, item):
+        conditions = self.config.items('conditions')
+        try:
+            item.config = dict(self.config.items(item.setting_section))
+        except NoSectionError:
+            item.config = {}
+        for key,value in conditions:
+            if key not in item.config:
+                item.config[key] = value
 
     def close(self, save_config=False):
         if save_config == True:
index 95c56e2380ff2d3f7ea3b68fa4442f155fda4291..d04f3740f3797fae36e731a0d01de3a43d56622f 100644 (file)
@@ -171,7 +171,6 @@ def default_settings():
 def load_graph(graph, config, include_section):
     enabled = {}
     items = []
-    conditions = config.items('conditions')
     for node in graph:
         item = node.data
         try:
@@ -188,12 +187,5 @@ def load_graph(graph, config, include_section):
                      % (item.name, dependency.data.name))
                     enabled[item.name] = False
                     continue
-            try:
-                item.config = dict(config.items(item.setting_section))
-            except configparser.NoSectionError:
-                item.config = {}
-            for key,value in conditions:
-                if key not in item.config:
-                    item.config[key] = value
             items.append(item)
     return items
index 5820dd7e1bead2eda4a127fca2543b25ec71250e..466ca1f32f09c1555182cef0615c58a345a38034 100644 (file)
@@ -88,9 +88,9 @@ class SetCommand (Command):
        hooke.config.set(params['section'], params['option'], params['value'])
         # push config changes
         hooke.load_log()
-        hooke.load_plugins()
-        hooke.load_drivers()
-        hooke.load_ui()  # for post-HookeRunner Hooke return.
+        hooke.configure_plugins()
+        hooke.configure_drivers()
+        hooke.configure_ui()  # for post-HookeRunner Hooke return.
         # notify UI to update config
         outqueue.put(ReloadUserInterfaceConfig(hooke.config))