Skip to content

Commit b714e65

Browse files
committed
add new emthod unique_ordered_append to easybuild.tools.utilities
1 parent d12251f commit b714e65

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

easybuild/tools/utilities.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,25 @@ def nub(list_):
223223
return [x for x in list_ if x not in seen and not seen_add(x)]
224224

225225

226+
def unique_ordered_append(base, extra):
227+
"""Append elements of extra list to another base list keeping order and without duplicates"""
228+
if extra and isinstance(extra, str):
229+
extra = [extra]
230+
231+
try:
232+
base.extend(extra)
233+
except TypeError as err:
234+
err_msg = f"_unique_ordered_list_append: given extra list is not iterable: {extra}"
235+
raise EasyBuildError(err_msg) from err
236+
except AttributeError as err:
237+
err_msg = f"_unique_ordered_list_append: given base cannot be extended: {base}"
238+
raise EasyBuildError(err_msg) from err
239+
else:
240+
base = nub(base) # remove duplicates
241+
242+
return base
243+
244+
226245
def get_class_for(modulepath, class_name):
227246
"""
228247
Get class for a given Python class name and Python module path.

test/framework/utilities_test.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,23 @@ def test_LooseVersion(self):
191191
self.assertEqual(LooseVersion('2.a').version, [2, 'a'])
192192
self.assertEqual(LooseVersion('2.a5').version, [2, 'a', 5])
193193

194+
def test_unique_ordered_append(self):
195+
"""Test unique_ordered_list_append method"""
196+
base = ["potato", "tomato", "orange"]
197+
198+
reference = ["potato", "tomato", "orange", "apple"]
199+
self.assertEqual(tu.unique_ordered_append(base, ["apple"]), reference)
200+
self.assertEqual(tu.unique_ordered_append(base, ["apple", "apple"]), reference)
201+
self.assertEqual(tu.unique_ordered_append(base, "apple"), reference)
202+
self.assertNotEqual(tu.unique_ordered_append(base, "apple"), sorted(reference))
203+
204+
error_pattern = "given extra list is not iterable"
205+
self.assertErrorRegex(EasyBuildError, error_pattern, tu.unique_ordered_append, base, 0)
206+
207+
base = "potato"
208+
error_pattern = "given base cannot be extended"
209+
self.assertErrorRegex(EasyBuildError, error_pattern, tu.unique_ordered_append, base, reference)
210+
194211

195212
def suite():
196213
""" return all the tests in this file """

0 commit comments

Comments
 (0)