summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Schäfer <j.wielicki@sotecware.net>2020-05-10 11:08:05 +0200
committerJonas Schäfer <j.wielicki@sotecware.net>2020-05-12 22:26:51 +0200
commitd4d0c1a19f5fc5df0f082df1fb7323141175a310 (patch)
tree86dee7fc58cc441a14b661fa5e003788a5eac18d
parent1b974d2d9aec5c20d3111d208a24d7d67ab6b7de (diff)
downloadpoezio-d4d0c1a19f5fc5df0f082df1fb7323141175a310.tar.gz
poezio-d4d0c1a19f5fc5df0f082df1fb7323141175a310.tar.bz2
poezio-d4d0c1a19f5fc5df0f082df1fb7323141175a310.tar.xz
poezio-d4d0c1a19f5fc5df0f082df1fb7323141175a310.zip
Add function to calculate unique prefix of two strings
-rw-r--r--poezio/common.py20
-rw-r--r--test/test_common.py21
2 files changed, 40 insertions, 1 deletions
diff --git a/poezio/common.py b/poezio/common.py
index ba179310..7cddc306 100644
--- a/poezio/common.py
+++ b/poezio/common.py
@@ -17,6 +17,7 @@ import subprocess
import time
import string
import logging
+import itertools
from slixmpp import JID, InvalidJID, Message
from poezio.poezio_shlex import shlex
@@ -468,3 +469,22 @@ def safeJID(*args, **kwargs) -> JID:
exc_info=True,
)
return JID('')
+
+
+def unique_prefix_of(a: str, b: str) -> str:
+ """
+ Return the unique prefix of `a` with `b`.
+
+ Corner cases:
+
+ * If `a` and `b` share no prefix, the first letter of `a` is returned.
+ * If `a` and `b` are equal, `a` is returned.
+ * If `a` is a prefix of `b`, `a` is returned.
+ * If `b` is a prefix of `a`, `b` plus the first letter of `a` after the
+ common prefix is returned.
+ """
+ for i, (ca, cb) in enumerate(itertools.zip_longest(a, b)):
+ if ca != cb:
+ return a[:i+1]
+ # both are equal, return a
+ return a
diff --git a/test/test_common.py b/test/test_common.py
index d7bc2b8b..b6560fc9 100644
--- a/test/test_common.py
+++ b/test/test_common.py
@@ -11,7 +11,7 @@ from poezio.common import (_datetime_tuple as datetime_tuple, get_utc_time,
get_local_time, shell_split, _find_argument_quoted
as find_argument_quoted, _find_argument_unquoted as
find_argument_unquoted, parse_str_to_secs,
- parse_secs_to_str, safeJID)
+ parse_secs_to_str, safeJID, unique_prefix_of)
def test_utc_time():
delta = timedelta(seconds=-3600)
@@ -63,3 +63,22 @@ def test_parse_secs_to_str():
def test_safeJID():
assert safeJID('toto@titi/tata') == JID('toto@titi/tata')
assert safeJID('toto@…') == JID('')
+
+def test_unique_prefix_of__no_shared_prefix():
+ assert unique_prefix_of("a", "b") == "a"
+ assert unique_prefix_of("foo", "bar") == "f"
+ assert unique_prefix_of("foo", "") == "f"
+
+def test_unique_prefix_of__equal():
+ assert unique_prefix_of("foo", "foo") == "foo"
+
+def test_unique_prefix_of__a_prefix():
+ assert unique_prefix_of("foo", "foobar") == "foo"
+
+def test_unique_prefix_of__b_prefix():
+ assert unique_prefix_of("foobar", "foo") == "foob"
+
+def test_unique_prefix_of__normal_shared_prefix():
+ assert unique_prefix_of("foobar", "foobaz") == "foobar"
+ assert unique_prefix_of("fnord", "funky") == "fn"
+ assert unique_prefix_of("asbestos", "aspergers") == "asb"