mirror of
https://github.com/fergalmoran/picard.git
synced 2026-03-30 00:55:18 +00:00
Merge pull request #1769 from rdswift/add_uniquemulti
PICARD-2161: Add function to remove duplicate entries from multi-value variable
This commit is contained in:
@@ -1296,3 +1296,31 @@ Result: C; B; A
|
||||
def func_reversemulti(parser, multi, separator=MULTI_VALUED_JOINER):
|
||||
multi_value = MultiValue(parser, multi, separator)
|
||||
return multi_value.separator.join(reversed(multi_value))
|
||||
|
||||
|
||||
@script_function(eval_args=False, documentation=N_(
|
||||
"""`$unique(name,case_sensitive="",separator="; ")`
|
||||
|
||||
Returns a copy of the multi-value tag `name` with no duplicate elements.
|
||||
By default, a case-insensitive comparison of the elements is performed.
|
||||
|
||||
Example 1:
|
||||
|
||||
$setmulti(foo,a; A; B; b; cd; Cd; cD; CD; a; A; b)
|
||||
$unique(%foo%)
|
||||
|
||||
Result: A; CD; b
|
||||
|
||||
Example 2:
|
||||
|
||||
$setmulti(foo,a; A; B; b; a; b; A; B, cd)
|
||||
$unique(%foo%,True)
|
||||
|
||||
Result: A; B; a; b; cd
|
||||
"""
|
||||
))
|
||||
def func_unique(parser, multi, case_sensitive="", separator=MULTI_VALUED_JOINER):
|
||||
multi_value = MultiValue(parser, multi, separator)
|
||||
if not case_sensitive:
|
||||
multi_value._multi = list({v.lower(): v for v in multi_value}.values())
|
||||
return multi_value.separator.join(sorted(set(multi_value)))
|
||||
|
||||
@@ -1494,3 +1494,27 @@ class ScriptParserTest(PicardTestCase):
|
||||
self.parser.eval("$reversemulti()")
|
||||
with self.assertRaisesRegex(ScriptError, areg):
|
||||
self.parser.eval("$reversemulti(B:AB; D:C; E:D; A:A; C:X,:,extra)")
|
||||
|
||||
def test_cmd_unique(self):
|
||||
context = Metadata()
|
||||
context["foo"] = ['a', 'A', 'B', 'b', 'cd', 'Cd', 'cD', 'CD', 'a', 'A', 'b']
|
||||
context["bar"] = "a; A; B; b; cd; Cd; cD; CD; a; A; b"
|
||||
# Tests with context
|
||||
self.assertScriptResultEquals("$unique(%foo%)", "A; CD; b", context)
|
||||
self.assertScriptResultEquals("$unique(%bar%)", "a; A; B; b; cd; Cd; cD; CD; a; A; b", context)
|
||||
# Tests with static inputs
|
||||
self.assertScriptResultEquals("$unique(a; A; B; b; cd; Cd; cD; CD; a; A; b)", "A; CD; b", context)
|
||||
# Tests with separator override
|
||||
self.assertScriptResultEquals("$unique(a: A: B: b: cd: Cd: cD: CD: a: A: b,,: )", "A: CD: b", context)
|
||||
# Tests with case-sensitive comparison
|
||||
self.assertScriptResultEquals("$unique(%foo%,1)", "A; B; CD; Cd; a; b; cD; cd", context)
|
||||
# Tests with missing inputs
|
||||
self.assertScriptResultEquals("$unique(,)", "", context)
|
||||
self.assertScriptResultEquals("$unique(,,)", "", context)
|
||||
self.assertScriptResultEquals("$unique(,:)", "", context)
|
||||
# Tests with invalid number of arguments
|
||||
areg = r"^\d+:\d+:\$unique: Wrong number of arguments for \$unique: Expected between 1 and 3, "
|
||||
with self.assertRaisesRegex(ScriptError, areg):
|
||||
self.parser.eval("$unique()")
|
||||
with self.assertRaisesRegex(ScriptError, areg):
|
||||
self.parser.eval("$unique(B:AB; D:C; E:D; A:A; C:X,1,:,extra)")
|
||||
|
||||
Reference in New Issue
Block a user