start implementing property layering

This commit is contained in:
Jakob Ketterl 2020-03-22 21:51:49 +01:00
parent b3a5a36d9c
commit 885d02ceca
2 changed files with 65 additions and 0 deletions

View File

@ -119,3 +119,25 @@ class PropertyManager(object):
if p.getValue() is None:
p.setValue(other_pm[key])
return self
class PropertyLayers(object):
def __init__(self):
self.layers = []
def addLayer(self, priority: int, pm: PropertyManager):
"""
highest priority = 0
"""
self.layers.append({"priority": priority, "props": pm})
def removeLayer(self, pm: PropertyManager):
for layer in self.layers:
if layer["props"] == pm:
self.layers.remove(layer)
def __getitem__(self, item):
layers = [la["props"] for la in sorted(self.layers, key=lambda l: l["priority"])]
for m in layers:
if item in m:
return m[item]

View File

@ -0,0 +1,43 @@
from unittest import TestCase
from unittest.mock import Mock
from owrx.property import PropertyManager, PropertyLayers
class TestPropertyMock(TestCase):
def testLayer(self):
om = PropertyLayers()
pm = PropertyManager()
pm["testkey"] = "testvalue"
om.addLayer(1, pm)
self.assertEqual(om["testkey"], "testvalue")
def testHighPriority(self):
om = PropertyLayers()
low_pm = PropertyManager()
high_pm = PropertyManager()
low_pm["testkey"] = "low value"
high_pm["testkey"] = "high value"
om.addLayer(1, low_pm)
om.addLayer(0, high_pm)
self.assertEqual(om["testkey"], "high value")
def testPriorityFallback(self):
om = PropertyLayers()
low_pm = PropertyManager()
high_pm = PropertyManager()
low_pm["testkey"] = "low value"
om.addLayer(1, low_pm)
om.addLayer(0, high_pm)
self.assertEqual(om["testkey"], "low value")
def testLayerRemoval(self):
om = PropertyLayers()
low_pm = PropertyManager()
high_pm = PropertyManager()
low_pm["testkey"] = "low value"
high_pm["testkey"] = "high value"
om.addLayer(1, low_pm)
om.addLayer(0, high_pm)
self.assertEqual(om["testkey"], "high value")
om.removeLayer(high_pm)
self.assertEqual(om["testkey"], "low value")