def test_gc_overlays(self): root = ConfigDict() overlay = root._make_overlay() del overlay import gc; gc.collect() root._make_overlay() # This triggers the weakref-collect self.assertEqual(len(root._overlays), 1)
def test_gc_overlays(self): root = ConfigDict() overlay = root._make_overlay() del overlay import gc gc.collect() root._make_overlay() # This triggers the weakref-collect self.assertEqual(len(root._overlays), 1)
def test_overlay(self): source = ConfigDict() source['key'] = 'source' intermediate = source._make_overlay() overlay = intermediate._make_overlay() # Overlay contains values from source self.assertEqual(overlay['key'], 'source') self.assertEqual(overlay.get('key'), 'source') self.assertTrue('key' in overlay) # Overlay is updated with source source['key'] = 'source2' self.assertEqual(source['key'], 'source2') self.assertEqual(overlay['key'], 'source2') # Overlay 'overlays' source (hence the name) overlay['key'] = 'overlay' self.assertEqual(source['key'], 'source2') self.assertEqual(intermediate['key'], 'source2') self.assertEqual(overlay['key'], 'overlay') # Deleting an overlayed key restores the value from source del overlay['key'] self.assertEqual(source['key'], 'source2') self.assertEqual(overlay['key'], 'source2') # Deleting a virtual key is actually not possible. with self.assertRaises(KeyError): del overlay['key'] # Deleting a key in the source also removes it from overlays. del source['key'] self.assertTrue('key' not in overlay) self.assertTrue('key' not in intermediate) self.assertTrue('key' not in source) # New keys in source are copied to overlay source['key2'] = 'source' self.assertEqual(source['key2'], 'source') self.assertEqual(intermediate['key2'], 'source') self.assertEqual(overlay['key2'], 'source') # New keys in overlay do not change the source overlay['key3'] = 'overlay' self.assertEqual(overlay['key3'], 'overlay') self.assertTrue('key3' not in intermediate) self.assertTrue('key3' not in source) # Setting the same key in the source does not affect the overlay # because it already has this key. source['key3'] = 'source' self.assertEqual(source['key3'], 'source') self.assertEqual(intermediate['key3'], 'source') self.assertEqual(overlay['key3'], 'overlay') # But as soon as the overlayed key is deleted, it gets the # copy from the source del overlay['key3'] self.assertEqual(source['key3'], 'source') self.assertEqual(overlay['key3'], 'source')