# HG changeset patch # User Drew Perttula # Date 2016-06-07 10:51:23 # Node ID f427801da9f6d8c81639aff4304350f43c9892c9 # Parent 6c2d78dabb8bc2d362b491d94c2f0e1fb58425c8 collector properly merges repeated attr settings in the same message Ignore-this: a03dcc65eb0d9300cecf3153cd2a58d3 diff --git a/bin/collector b/bin/collector --- a/bin/collector +++ b/bin/collector @@ -7,6 +7,7 @@ from txzmq import ZmqEndpoint, ZmqFactor import json import logging import klein +import optparse from greplin import scales from greplin.scales.twistedweb import StatsResource @@ -75,8 +76,11 @@ def launch(graph): def main(): - log.setLevel(logging.DEBUG) - + parser = optparse.OptionParser() + parser.add_option("-v", "--verbose", action="store_true", + help="logging.DEBUG") + (options, args) = parser.parse_args() + log.setLevel(logging.DEBUG if options.verbose else logging.INFO) graph = SyncedGraph(networking.rdfdb.url, "collector") diff --git a/light9/collector/collector.py b/light9/collector/collector.py --- a/light9/collector/collector.py +++ b/light9/collector/collector.py @@ -61,6 +61,15 @@ class Collector(object): for c in staleClients: del self.lastRequest[c] + def resolvedSettingsDict(self, settingsList): + out = {} + for d, a, v in settingsList: + if (d, a) in out: + out[(d, a)] = resolve(d, a, [out[(d, a)], v]) + else: + out[(d, a)] = v + return out + def setAttrs(self, client, clientSession, settings): """ settings is a list of (device, attr, value). These attrs are @@ -80,14 +89,13 @@ class Collector(object): prevClientSettings = {} else: prevClientSettings = {} - for d, a, v in settings: - prevClientSettings[(d, a)] = v + prevClientSettings.update(self.resolvedSettingsDict(settings)) self.lastRequest[client] = (clientSession, now, prevClientSettings) deviceAttrs = {} # device: {attr: value} - for _, _, settings in self.lastRequest.itervalues(): - for (device, attr), value in settings.iteritems(): + for _, _, lastSettings in self.lastRequest.itervalues(): + for (device, attr), value in lastSettings.iteritems(): attrs = deviceAttrs.setdefault(device, {}) if attr in attrs: value = resolve(device, attr, [attrs[attr], value]) diff --git a/light9/collector/collector_test.py b/light9/collector/collector_test.py --- a/light9/collector/collector_test.py +++ b/light9/collector/collector_test.py @@ -195,3 +195,19 @@ class TestCollector(unittest.TestCase): self.assertEqual([[0, 255, 0, 215], 'flush'], self.udmx.updates) self.assertEqual([[127], 'flush', [255], 'flush', [255], 'flush'], self.dmx0.updates) + + def testRepeatedAttributesInOneRequestGetResolved(self): + c = Collector(self.config, outputs=[self.dmx0, self.udmx]) + + c.setAttrs('client1', 'sess1', [ + (DEV['inst1'], L9['brightness'], .5), + (DEV['inst1'], L9['brightness'], .3), + ]) + self.assertEqual([[127], 'flush'], self.dmx0.updates) + + c.setAttrs('client1', 'sess1', [ + (DEV['inst1'], L9['brightness'], .3), + (DEV['inst1'], L9['brightness'], .5), + ]) + self.assertEqual([[127], 'flush', [127], 'flush'], self.dmx0.updates) +