From: Gregor Dschung Date: Sat, 29 Jan 2022 12:33:31 +0000 (+0100) Subject: Add a case to keep the words' case as-is X-Git-Url: http://git.99rst.org/?a=commitdiff_plain;h=53072687d897139f6184b44fba76f5adf9b04c4a;p=redacted-XKCD-password-generator.git Add a case to keep the words' case as-is --- diff --git a/tests/test_xkcdpass.py b/tests/test_xkcdpass.py index 55b7fc3..f19b7cb 100644 --- a/tests/test_xkcdpass.py +++ b/tests/test_xkcdpass.py @@ -49,33 +49,37 @@ class XkcdPasswordTests(unittest.TestCase): self.assertIsNotNone(re.match('([a-z]+(_|$))+', result)) def test_set_case(self): - words = "this is only a test".lower().split() + words = "this is only a GREAT Test".lower().split() words_before = set(words) results = {} + results["as-is"] = xkcd_password.set_case(words, method="as-is") results["lower"] = xkcd_password.set_case(words, method="lower") results["upper"] = xkcd_password.set_case(words, method="upper") + results["first"] = xkcd_password.set_case(words, method="first") results["alternating"] = xkcd_password.set_case(words, method="alternating") results["random"] = xkcd_password.set_case(words, method="random", testing=True) - results["first"] = xkcd_password.set_case(words, method="first") words_after = set(word.lower() for group in list(results.values()) for word in group) # Test that no words have been fundamentally mutated by any of the methods self.assertTrue(words_before == words_after) + # Test that no words have been uppered or lowered for method "as-is" + self.assertEqual(results["as-is"], words) + # Test that the words have been uppered or lowered respectively. self.assertTrue(all(word.islower() for word in results["lower"])) self.assertTrue(all(word.isupper() for word in results["upper"])) self.assertTrue(all(word.istitle() for word in results["first"])) # Test that the words have been correctly uppered randomly. - expected_random_result_1_py3 = ['THIS', 'IS', 'ONLY', 'a', 'test'] - expected_random_result_2_py3 = ['THIS', 'IS', 'a', 'test', 'ALSO'] - expected_random_result_1_py2 = ['this', 'is', 'only', 'a', 'TEST'] - expected_random_result_2_py2 = ['this', 'is', 'a', 'TEST', 'also'] + expected_random_result_1_py3 = ['THIS', 'IS', 'ONLY', 'a', 'GREAT', 'test'] + expected_random_result_2_py3 = ['THIS', 'IS', 'a', 'test', 'ALSO', 'GREAT'] + expected_random_result_1_py2 = ['this', 'is', 'only', 'a', 'GREAT', 'TEST'] + expected_random_result_2_py2 = ['this', 'is', 'a', 'TEST', 'also', 'GREAT'] - words_extra = "this is a test also".lower().split() + words_extra = "this is a test also great".lower().split() observed_random_result_1 = results["random"] observed_random_result_2 = xkcd_password.set_case( words_extra, diff --git a/xkcdpass/xkcd_password.py b/xkcdpass/xkcd_password.py index c64470d..901e232 100755 --- a/xkcdpass/xkcd_password.py +++ b/xkcdpass/xkcd_password.py @@ -231,6 +231,12 @@ def try_input(prompt, validate): return validate(answer) +def as_is_case(words): + """ + Keeps the words' case. + """ + return words + def alternating_case(words): """ Set EVERY OTHER word to UPPER case. @@ -240,7 +246,6 @@ def alternating_case(words): else word for i, word in enumerate(lower_case(words))] - def upper_case(words): """ Set ALL words to UPPER case. @@ -283,14 +288,15 @@ def random_case(words, testing=False): return [make_upper(word) for word in lower_case(words)] -CASE_METHODS = {"alternating": alternating_case, - "upper": upper_case, - "lower": lower_case, - "random": random_case, - "first": first_upper_case, - "capitalize":capitalize_case} - - +CASE_METHODS = { + "as-is": as_is_case, + "lower": lower_case, + "upper": upper_case, + "first": first_upper_case, + "capitalize": capitalize_case, + "alternating": alternating_case, + "random": random_case +} def set_case(words, method="lower", testing=False): """ @@ -301,8 +307,8 @@ def set_case(words, method="lower", testing=False): Args: words (list): word list generated by `choose_words()` or `find_acrostic()`. - method (str): one of {"alternating", "upper", "lower", - "random"}. + method (str): one of {"as-is", "lower", "upper", "first", + "capitalize", "alternating", "random"}. testing (bool): only affects method="random". If True: the random seed will be set to each word prior to choosing True or False before setting the