summaryrefslogtreecommitdiff
path: root/string_utils.py
diff options
context:
space:
mode:
authorScott <[email protected]>2021-12-04 21:23:11 -0800
committerScott <[email protected]>2021-12-04 21:23:11 -0800
commitb29be4f1750fd20bd2eada88e751dfae85817882 (patch)
treed776c05519505fa3234ed44ae952163f0853e88c /string_utils.py
parented8fa2b10b0177b15b7423263bdd390efde2f0c8 (diff)
Various changes.
Diffstat (limited to 'string_utils.py')
-rw-r--r--string_utils.py21
1 files changed, 20 insertions, 1 deletions
diff --git a/string_utils.py b/string_utils.py
index 9a38d25..aca4a5e 100644
--- a/string_utils.py
+++ b/string_utils.py
@@ -1503,12 +1503,16 @@ def from_bitstring(bits: str, encoding='utf-8', errors='surrogatepass') -> str:
return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode(encoding, errors) or '\0'
-def ip_v4_sort_key(txt: str) -> str:
+def ip_v4_sort_key(txt: str) -> Tuple[int]:
"""Turn an IPv4 address into a tuple for sorting purposes.
>>> ip_v4_sort_key('10.0.0.18')
(10, 0, 0, 18)
+ >>> ips = ['10.0.0.10', '100.0.0.1', '1.2.3.4', '10.0.0.9']
+ >>> sorted(ips, key=lambda x: ip_v4_sort_key(x))
+ ['1.2.3.4', '10.0.0.9', '10.0.0.10', '100.0.0.1']
+
"""
if not is_ip_v4(txt):
print(f"not IP: {txt}")
@@ -1516,6 +1520,21 @@ def ip_v4_sort_key(txt: str) -> str:
return tuple([int(x) for x in txt.split('.')])
+def path_ancestors_before_descendants_sort_key(volume: str) -> Tuple[str]:
+ """Chunk up a file path so that parent/ancestor paths sort before
+ children/descendant paths.
+
+ >>> path_ancestors_before_descendants_sort_key('/usr/local/bin')
+ ('usr', 'local', 'bin')
+
+ >>> paths = ['/usr/local', '/usr/local/bin', '/usr']
+ >>> sorted(paths, key=lambda x: path_ancestors_before_descendants_sort_key(x))
+ ['/usr', '/usr/local', '/usr/local/bin']
+
+ """
+ return tuple([x for x in volume.split('/') if len(x) > 0])
+
+
if __name__ == '__main__':
import doctest
doctest.testmod()