Revision 4a3dd52d
b/lib/compat.py | ||
---|---|---|
146 | 146 |
else: |
147 | 147 |
return val |
148 | 148 |
|
149 |
|
|
150 |
def UniqueFrozenset(seq): |
|
151 |
"""Makes C{frozenset} from sequence after checking for duplicate elements. |
|
152 |
|
|
153 |
@raise ValueError: When there are duplicate elements |
|
154 |
|
|
155 |
""" |
|
156 |
if isinstance(seq, (list, tuple)): |
|
157 |
items = seq |
|
158 |
else: |
|
159 |
items = list(seq) |
|
160 |
|
|
161 |
result = frozenset(items) |
|
162 |
|
|
163 |
if len(items) != len(result): |
|
164 |
raise ValueError("Duplicate values found") |
|
165 |
|
|
166 |
return result |
|
167 |
|
|
168 |
|
|
149 | 169 |
#: returns the first element of a list-like value |
150 | 170 |
fst = operator.itemgetter(0) |
151 | 171 |
|
b/test/ganeti.compat_unittest.py | ||
---|---|---|
99 | 99 |
self.assertEquals(compat.TryToRoman("19", convert=False), "19") |
100 | 100 |
|
101 | 101 |
|
102 |
class TestUniqueFrozenset(unittest.TestCase): |
|
103 |
def testDuplicates(self): |
|
104 |
for values in [["", ""], ["Hello", "World", "Hello"]]: |
|
105 |
self.assertRaises(ValueError, compat.UniqueFrozenset, values) |
|
106 |
|
|
107 |
def testEmpty(self): |
|
108 |
self.assertEqual(compat.UniqueFrozenset([]), frozenset([])) |
|
109 |
|
|
110 |
def testUnique(self): |
|
111 |
self.assertEqual(compat.UniqueFrozenset([1, 2, 3]), frozenset([1, 2, 3])) |
|
112 |
|
|
113 |
def testGenerator(self): |
|
114 |
seq = ("Foo%s" % i for i in range(10)) |
|
115 |
self.assertTrue(callable(seq.next)) |
|
116 |
self.assertFalse(isinstance(seq, (list, tuple))) |
|
117 |
self.assertEqual(compat.UniqueFrozenset(seq), |
|
118 |
frozenset(["Foo%s" % i for i in range(10)])) |
|
119 |
|
|
120 |
|
|
102 | 121 |
if __name__ == "__main__": |
103 | 122 |
testutils.GanetiTestProgram() |
Also available in: Unified diff