--- pyanaconda/indexed_dict.py | 46 ++++++++++++++++++++++++++++ tests/pyanaconda_test/indexed_dict_test.py | 39 +++++++++++++++++++++++ 2 files changed, 85 insertions(+), 0 deletions(-) create mode 100644 pyanaconda/indexed_dict.py create mode 100644 tests/pyanaconda_test/indexed_dict_test.py diff --git a/pyanaconda/indexed_dict.py b/pyanaconda/indexed_dict.py new file mode 100644 index 0000000..eb5050c --- /dev/null +++ b/pyanaconda/indexed_dict.py @@ -0,0 +1,46 @@ +# indexed_dict.py +# Implements IndexedDictionary class. +# +# Copyright (C) 2009 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing to use, +# modify, copy, or redistribute it subject to the terms and conditions of +# the GNU General Public License v.2, or (at your option) any later version. +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY expressed or implied, including the implied warranties of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. You should have received a copy of the +# GNU General Public License along with this program; if not, write to the +# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the +# source code or documentation are not subject to the GNU General Public +# License and may only be used or replicated with the express permission of +# Red Hat, Inc. +# + +class IndexedDict(dict): + """ Indexed dictionary that remembers order of the inserted elements. + + Values can be inserted with string keys only, but referenced by both + string keys or index. + + There's a unit test for the class, please maintain it along. + """ + def __init__(self): + super(IndexedDict, self).__init__() + self._indexes = [] + + def __getitem__(self, key): + if type(key) is int: + key = self._indexes[key] + return super(IndexedDict, self).__getitem__(key) + + def __setitem__(self, key, value): + if type(key) is int: + raise TypeError("IndexedDict only accepts strings as new keys") + assert(len(self) == len(self._indexes)) + self._indexes.append(key) + return super(IndexedDict, self).__setitem__(key, value) + + def index(self, string_key): + return self._indexes.index(string_key) diff --git a/tests/pyanaconda_test/indexed_dict_test.py b/tests/pyanaconda_test/indexed_dict_test.py new file mode 100644 index 0000000..c56a9df --- /dev/null +++ b/tests/pyanaconda_test/indexed_dict_test.py @@ -0,0 +1,39 @@ +import mock +from pyanaconda.indexed_dict import IndexedDict + +class IndexedDictTest(mock.TestCase): + def instantiation_test(self): + d = IndexedDict() + self.assertIsInstance(d, IndexedDict) + + def append_test(self): + d = IndexedDict() + stored_data = [1, 2, 3] + d["some_step"] = stored_data + self.assertIs(d["some_step"], stored_data) + + def cant_append_test(self): + def assign_int(indexed_dict): + indexed_dict[3] = [1, 2, 3] + d = IndexedDict() + self.assertRaises(TypeError, d.__setitem__, 3, [1, 2, 3]) + + def referencing_test(self): + d = IndexedDict() + d["first"] = 10 + d["second"] = 20 + d["third"] = 30 + self.assertEqual(d[0], 10) + self.assertEqual(d[1], 20) + self.assertEqual(d[2], 30) + self.assertRaises(IndexError, d.__getitem__, 3) + + def index_test(self): + d = IndexedDict() + d["first"] = 10 + d["second"] = 20 + d["third"] = 30 + + self.assertEqual(d.index("first"), 0) + self.assertEqual(d.index("second"), 1) + self.assertEqual(d.index("third"), 2) \ No newline at end of file -- 1.7.3.3 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list