From 91a5942fb9659f88d33598899fe17039b23b4c44 Mon Sep 17 00:00:00 2001 From: Daniel Watkins Date: Fri, 17 Jul 2015 16:02:11 +0100 Subject: [PATCH] Implement a DictRegistry. Change-Id: I67b177169285f30c7a980a51a81265c621c5f3ff --- cloudinit/registry.py | 23 +++++++++++++++++++++++ cloudinit/tests/test_registry.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 cloudinit/registry.py create mode 100644 cloudinit/tests/test_registry.py diff --git a/cloudinit/registry.py b/cloudinit/registry.py new file mode 100644 index 00000000..46cf0585 --- /dev/null +++ b/cloudinit/registry.py @@ -0,0 +1,23 @@ +import copy + + +class DictRegistry(object): + """A simple registry for a mapping of objects.""" + + def __init__(self): + self._items = {} + + def register_item(self, key, item): + """Add item to the registry.""" + if key in self._items: + raise ValueError( + 'Item already registered with key {0}'.format(key)) + self._items[key] = item + + @property + def registered_items(self): + """All the items that have been registered. + + This cannot be used to modify the contents of the registry. + """ + return copy.copy(self._items) diff --git a/cloudinit/tests/test_registry.py b/cloudinit/tests/test_registry.py new file mode 100644 index 00000000..fdfbd8eb --- /dev/null +++ b/cloudinit/tests/test_registry.py @@ -0,0 +1,28 @@ +from cloudinit.registry import DictRegistry +from cloudinit.tests import TestCase +from cloudinit.tests.util import mock + + +class TestDictRegistry(TestCase): + + def test_added_item_included_in_output(self): + registry = DictRegistry() + item_key, item_to_register = 'test_key', mock.Mock() + registry.register_item(item_key, item_to_register) + self.assertEqual({item_key: item_to_register}, + registry.registered_items) + + def test_registry_starts_out_empty(self): + self.assertEqual({}, DictRegistry().registered_items) + + def test_modifying_registered_items_isnt_exposed_to_other_callers(self): + registry = DictRegistry() + registry.registered_items['test_item'] = mock.Mock() + self.assertEqual({}, registry.registered_items) + + def test_keys_cannot_be_replaced(self): + registry = DictRegistry() + item_key = 'test_key' + registry.register_item(item_key, mock.Mock()) + self.assertRaises(ValueError, + registry.register_item, item_key, mock.Mock())