diff --git a/apprise/utils/parse.py b/apprise/utils/parse.py index c751be1f..b8efd9e4 100644 --- a/apprise/utils/parse.py +++ b/apprise/utils/parse.py @@ -107,18 +107,18 @@ PHONE_NO_WPREFIX_DETECTION_RE = re.compile( re.I, ) -# A simple verification check to make sure the content specified -# rougly conforms to a ham radio call sign before we parse it further +# Quick sanity check - does this look like a valid callsign before we +# bother parsing it IS_CALL_SIGN = re.compile( - r"^(?P[a-z0-9]{2,3}[0-9][a-z0-9]{3})" - r"(?P-[a-z0-9]{1,2})?\s*$", + r"^(?P[0-9a-z]{1,2}[0-9][a-z0-9]{1,3})" + r"(-(?P[0-9]{1,2}))?\s*$", re.I, ) -# Regular expression used to destinguish between multiple ham radio call signs +# Regex to split multiple callsigns from a single string CALL_SIGN_DETECTION_RE = re.compile( - r"\s*([a-z0-9]{2,3}[0-9][a-z0-9]{3}(?:-[a-z0-9]{1,2})?)" - r"(?=$|[\s,]+[a-z0-9]{4,6})", + r"\s*([0-9a-z]{1,2}[0-9][a-z0-9]{1,3}(?:-(?:[0-9]{1,2}))?)" + r"(?=\s*$|\s*[,;\s]+)", re.I, ) diff --git a/tests/test_apprise_utils.py b/tests/test_apprise_utils.py index b146574d..fc615545 100644 --- a/tests/test_apprise_utils.py +++ b/tests/test_apprise_utils.py @@ -1685,7 +1685,6 @@ def test_is_call_sign_no(): assert utils.parse.is_call_sign(42) is False # To short or 2 long - assert utils.parse.is_call_sign("DF1AB") is False assert utils.parse.is_call_sign("DF1ABCX") is False assert utils.parse.is_call_sign("DF1ABCEFG") is False assert utils.parse.is_call_sign("1ABCX") is False @@ -1693,6 +1692,36 @@ def test_is_call_sign_no(): assert utils.parse.is_call_sign("XXXXXX") is False # Some valid checks + # 1x2 + result = utils.parse.is_call_sign("A0AF") + assert isinstance(result, dict) + assert result["callsign"] == "A0AF" + assert result["ssid"] == "" + + # 2x1 + result = utils.parse.is_call_sign("AA0A") + assert isinstance(result, dict) + assert result["callsign"] == "AA0A" + assert result["ssid"] == "" + + # 2x2 + result = utils.parse.is_call_sign("AA0AF") + assert isinstance(result, dict) + assert result["callsign"] == "AA0AF" + assert result["ssid"] == "" + + result = utils.parse.is_call_sign("AA0AF-23") + assert isinstance(result, dict) + assert result["callsign"] == "AA0AF" + assert result["ssid"] == "23" + + # 1x3 + result = utils.parse.is_call_sign("K0ACL") + assert isinstance(result, dict) + assert result["callsign"] == "K0ACL" + assert result["ssid"] == "" + + # 2x3 result = utils.parse.is_call_sign("DF1ABC") assert isinstance(result, dict) assert result["callsign"] == "DF1ABC" @@ -1701,7 +1730,7 @@ def test_is_call_sign_no(): # Get our SSID result = utils.parse.is_call_sign("DF1ABC-14") assert result["callsign"] == "DF1ABC" - assert result["ssid"] == "-14" + assert result["ssid"] == "14" def test_is_phone_no(): @@ -1858,6 +1887,12 @@ def test_parse_call_sign(): assert "0A1DEF" in results assert "DF1ABC" in results + results = utils.parse.parse_call_sign("AA0A, A0AF-12, GARBAGE") + assert isinstance(results, list) + assert len(results) == 2 + assert "AA0A" in results + assert "A0AF-12" in results + def test_parse_phone_no(): """utils: parse_phone_no() testing""" diff --git a/tests/test_plugin_aprs.py b/tests/test_plugin_aprs.py index 3a8498f3..6582d722 100644 --- a/tests/test_plugin_aprs.py +++ b/tests/test_plugin_aprs.py @@ -80,6 +80,12 @@ def test_plugin_aprs_urls(mock_create_connection): ) assert instance.notify("test") is True + # 1N3 callsigns + instance = apprise.Apprise.instantiate( + "aprs://D1JSL-15:12345@D1ABC" + ) + assert isinstance(instance, NotifyAprs) + instance = apprise.Apprise.instantiate( "aprs://DF1JSL-15:12345@DF1ABC?delay=3.0" )