summaryrefslogtreecommitdiff
path: root/cmd2/utils.py
diff options
context:
space:
mode:
authorTodd Leonhardt <todd.leonhardt@gmail.com>2018-08-02 20:54:37 -0700
committerTodd Leonhardt <todd.leonhardt@gmail.com>2018-08-02 20:54:41 -0700
commitca27fac72bf8e0b5885587b354b8fcb889f8ee79 (patch)
tree3437bd70131981ca74139760ef4b29a5517aea11 /cmd2/utils.py
parent9a5fb90f18e90dbecf3a33337bbda36403b2256d (diff)
downloadcmd2-git-ca27fac72bf8e0b5885587b354b8fcb889f8ee79.tar.gz
Addeded utility function for combining unicode normalization and casefolding into a single step
Also: - Updated the alphabetical sort utility function to use this - Started adding explicit unit tests for functions in utils.py
Diffstat (limited to 'cmd2/utils.py')
-rw-r--r--cmd2/utils.py22
1 files changed, 16 insertions, 6 deletions
diff --git a/cmd2/utils.py b/cmd2/utils.py
index d8bdf08d..02956f6b 100644
--- a/cmd2/utils.py
+++ b/cmd2/utils.py
@@ -5,6 +5,7 @@
import collections
import os
from typing import Any, List, Optional, Union
+import unicodedata
from . import constants
@@ -110,7 +111,7 @@ def which(editor: str) -> Optional[str]:
def is_text_file(file_path: str) -> bool:
- """Returns if a file contains only ASCII or UTF-8 encoded text
+ """Returns if a file contains only ASCII or UTF-8 encoded text.
:param file_path: path to the file being checked
:return: True if the file is a text file, False if it is binary.
@@ -147,8 +148,8 @@ def is_text_file(file_path: str) -> bool:
def remove_duplicates(list_to_prune: List) -> List:
- """
- Removes duplicates from a list while preserving order of the items
+ """Removes duplicates from a list while preserving order of the items.
+
:param list_to_prune: the list being pruned of duplicates
:return: The pruned list
"""
@@ -159,10 +160,19 @@ def remove_duplicates(list_to_prune: List) -> List:
return list(temp_dict.keys())
-def alphabetical_sort(list_to_sort: List[str]) -> List[str]:
+def norm_fold(astr: str) -> str:
+ """Normalize and casefold Unicode strings for saner comparisons.
+
+ :param astr: input unicode string
+ :return: a normalized and case-folded version of the input string
"""
- Sorts a list of strings alphabetically
+ return unicodedata.normalize('NFC', astr).casefold()
+
+
+def alphabetical_sort(list_to_sort: List[str]) -> List[str]:
+ """Sorts a list of strings alphabetically.
+
:param list_to_sort: the list being sorted
:return: the sorted list
"""
- return sorted(list_to_sort, key=str.casefold)
+ return sorted(list_to_sort, key=norm_fold)