From 02daf74a1660d1cebe0387bf0be4cf6e3f970644 Mon Sep 17 00:00:00 2001 From: Vladislav Plaschevaty Date: Fri, 18 Apr 2025 09:33:34 +0200 Subject: [PATCH 1/2] Add random pseudonym generation functionality Added support for generating random pseudonyms when no seed is provided. Updated the README with usage examples and enhanced test coverage to validate the new functionality. --- README.md | 9 ++++++++ pseudomatic/__init__.py | 12 +++++++--- tests/test_pseudomatic.py | 46 ++++++++++++++++++++++++++++++++------- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index bb1c346..6011135 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Pseudomatic is a Python-based tool for generating pseudonyms based on a seed str - Ukrainian (`ua`) - Generates pseudonyms in the format: `Adjective Noun` (e.g., "Brave Fox" or "Хоробрий Лис"). - Deterministic output: the same seed and language will always produce the same pseudonym. +- Supports random pseudonym generation when no seed is provided. ## Installation @@ -46,6 +47,14 @@ print(pseudonym_en) # Example: "Brave Fox" pseudonym_ua = pseudonym("JohnDoe", language="ua") print(pseudonym_ua) # Example: "Хоробрий Лис" +# Generate a random pseudonym (no seed provided) +random_pseudonym = pseudonym(language="en") +print(random_pseudonym) # Example: "Curious Elephant" + +# Generate a random pseudonym in Ukrainian +random_pseudonym_ua = pseudonym(language="ua") +print(random_pseudonym_ua) # Example: "Цікавий Слон" + # Use different themes business_pseudonym = pseudonym("JohnDoe", language="en", theme="business") market_pseudonym = pseudonym("JohnDoe", language="ua", theme="market") diff --git a/pseudomatic/__init__.py b/pseudomatic/__init__.py index 93c9fa2..d35c645 100644 --- a/pseudomatic/__init__.py +++ b/pseudomatic/__init__.py @@ -1,4 +1,6 @@ import hashlib +import random +import uuid from . import names @@ -17,12 +19,13 @@ } } -def pseudonym(seed: str, language: str = "en", theme: str = 'default') -> str: +def pseudonym(seed: str = None, language: str = "en", theme: str = 'default') -> str: """ Generate a pseudonym based on a seed string and language. + If seed is None or empty, a random seed will be generated. Args: - seed (str): The input seed string. + seed (str, optional): The input seed string. If None or empty, a random seed will be generated. language (str): The language code ("en" for English, "ua" for Ukrainian). theme (str): The theme for the pseudonym ("default", "business", or "market"). @@ -34,6 +37,10 @@ def pseudonym(seed: str, language: str = "en", theme: str = 'default') -> str: adjectives, nouns, gender = LANGUAGES[theme][language] + # Generate a random seed if none is provided + if seed is None or seed == "": + seed = str(uuid.uuid4()) + # Hash the seed using SHA-256 hash_bytes = hashlib.sha256(seed.encode('utf-8')).digest() number = int.from_bytes(hash_bytes, byteorder="big") @@ -49,4 +56,3 @@ def pseudonym(seed: str, language: str = "en", theme: str = 'default') -> str: # Combine into a pseudonym return f"{adjective} {noun}" - diff --git a/tests/test_pseudomatic.py b/tests/test_pseudomatic.py index 58c8864..a684067 100644 --- a/tests/test_pseudomatic.py +++ b/tests/test_pseudomatic.py @@ -10,7 +10,7 @@ def test_pseudonym_generation(self): result1 = pseudonym(seed) result2 = pseudonym(seed) self.assertEqual(result1, result2) - + def test_different_seeds(self): # Test that different seeds produce different pseudonyms seed1 = "test-seed-1" @@ -18,38 +18,68 @@ def test_different_seeds(self): result1 = pseudonym(seed1) result2 = pseudonym(seed2) self.assertNotEqual(result1, result2) - + def test_language_support(self): # Test English language seed = "test-seed" en_result = pseudonym(seed, language="en") self.assertIsInstance(en_result, str) self.assertTrue(len(en_result) > 0) - + # Test Ukrainian language ua_result = pseudonym(seed, language="ua") self.assertIsInstance(ua_result, str) self.assertTrue(len(ua_result) > 0) - + # Test that different languages produce different results self.assertNotEqual(en_result, ua_result) - + def test_theme_support(self): # Test different themes seed = "test-seed" default_result = pseudonym(seed, theme="default") business_result = pseudonym(seed, theme="business") market_result = pseudonym(seed, theme="market") - + # Test that different themes produce different results self.assertNotEqual(default_result, business_result) self.assertNotEqual(default_result, market_result) self.assertNotEqual(business_result, market_result) - + def test_invalid_language(self): # Test that an invalid language raises a ValueError with self.assertRaises(ValueError): pseudonym("test-seed", language="invalid") + def test_no_seed_provided(self): + # Test that calling pseudonym() without a seed returns a non-empty string + result = pseudonym() + self.assertIsInstance(result, str) + self.assertTrue(len(result) > 0) + + # Test that calling pseudonym() with an empty string also generates a pseudonym + result_empty = pseudonym("") + self.assertIsInstance(result_empty, str) + self.assertTrue(len(result_empty) > 0) + + def test_random_pseudonyms_are_different(self): + # Test that calling pseudonym() multiple times returns different pseudonyms + result1 = pseudonym() + result2 = pseudonym() + self.assertNotEqual(result1, result2) + + # Test with different languages + en_result = pseudonym(language="en") + ua_result = pseudonym(language="ua") + self.assertNotEqual(en_result, ua_result) + + # Test with different themes + default_result = pseudonym(theme="default") + business_result = pseudonym(theme="business") + market_result = pseudonym(theme="market") + self.assertNotEqual(default_result, business_result) + self.assertNotEqual(default_result, market_result) + self.assertNotEqual(business_result, market_result) + if __name__ == "__main__": - unittest.main() \ No newline at end of file + unittest.main() From bcc460cfe937fd1d1734fa5c75b5a6fb0ee7e785 Mon Sep 17 00:00:00 2001 From: Vladislav Plaschevaty Date: Fri, 18 Apr 2025 09:36:17 +0200 Subject: [PATCH 2/2] Remove unused import of random module --- pseudomatic/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pseudomatic/__init__.py b/pseudomatic/__init__.py index d35c645..d2cca9d 100644 --- a/pseudomatic/__init__.py +++ b/pseudomatic/__init__.py @@ -1,5 +1,4 @@ import hashlib -import random import uuid from . import names