diff --git a/picard/script/functions.py b/picard/script/functions.py index a476bc024..586137dda 100644 --- a/picard/script/functions.py +++ b/picard/script/functions.py @@ -44,6 +44,7 @@ import operator import re import unicodedata +from picard.const.countries import RELEASE_COUNTRIES from picard.metadata import MULTI_VALUED_JOINER from picard.script.parser import ( MultiValue, @@ -1354,3 +1355,16 @@ def func_unique(parser, multi, case_sensitive="", separator=MULTI_VALUED_JOINER) 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))) + + +@script_function(documentation=N_( + """`$countryname(country_code)` + +Returns the name of the country for the specified country code. If the country code is invalid an empty string will be returned. +""" +)) +def func_countryname(parser, country_code): + code = country_code.strip().upper() + if code not in RELEASE_COUNTRIES: + return '' + return RELEASE_COUNTRIES[code] diff --git a/test/test_script.py b/test/test_script.py index 192ffe9a2..2badc8714 100644 --- a/test/test_script.py +++ b/test/test_script.py @@ -12,7 +12,7 @@ # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2017-2018 Wieland Hoffmann # Copyright (C) 2018 virusMac -# Copyright (C) 2020 Bob Swift +# Copyright (C) 2020-2021 Bob Swift # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -1568,3 +1568,21 @@ class ScriptParserTest(PicardTestCase): 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)") + + def test_cmd_countryname(self): + context = Metadata() + context["foo"] = "ca" + context["bar"] = "" + context["baz"] = "INVALID" + self.assertScriptResultEquals("$countryname(ca)", "Canada", context) + self.assertScriptResultEquals("$countryname(CA)", "Canada", context) + self.assertScriptResultEquals("$countryname(%foo%)", "Canada", context) + self.assertScriptResultEquals("$countryname(%bar%)", "", context) + self.assertScriptResultEquals("$countryname(%baz%)", "", context) + self.assertScriptResultEquals("$countryname(INVALID)", "", context) + # Tests with invalid number of arguments + areg = r"^\d+:\d+:\$countryname: Wrong number of arguments for \$countryname: Expected exactly 1, " + with self.assertRaisesRegex(ScriptError, areg): + self.parser.eval("$countryname()") + with self.assertRaisesRegex(ScriptError, areg): + self.parser.eval("$countryname(CA, UK)")