From d75c1c445dbd3a5f8738e2b829ee4138d473048d Mon Sep 17 00:00:00 2001 From: Limitless Date: Mon, 25 Aug 2025 15:42:36 +0100 Subject: [PATCH 1/4] Add Nigerian locales (yo_NG, ha_NG, ig_NG, en_NG) --- faker/providers/person/en_NG/__init__.py | 35 ++++++ faker/providers/person/ha_NG/__init__.py | 35 ++++++ faker/providers/person/ig_NG/__init__.py | 35 ++++++ test_african_names.py | 25 ++++ tests/providers/test_person.py | 154 ++++++++++++++++++++++- 5 files changed, 281 insertions(+), 3 deletions(-) create mode 100644 faker/providers/person/en_NG/__init__.py create mode 100644 faker/providers/person/ha_NG/__init__.py create mode 100644 faker/providers/person/ig_NG/__init__.py create mode 100644 test_african_names.py diff --git a/faker/providers/person/en_NG/__init__.py b/faker/providers/person/en_NG/__init__.py new file mode 100644 index 0000000000..9ced48108b --- /dev/null +++ b/faker/providers/person/en_NG/__init__.py @@ -0,0 +1,35 @@ +from faker.providers.person import Provider as PersonProvider + +class Provider(PersonProvider): + # Male first names + first_names_male = [ + "John", "Emmanuel", "Peter", "Samuel", "David", "Michael", + "Joseph", "Daniel", "James", "Paul", "Gabriel", "Joshua", + "Philip", "Andrew", "Stephen", "Benjamin", "Mark", "Nathaniel", + "Simon", "Cornelius", + ] + + # Female first names + first_names_female = [ + "Mary", "Grace", "Joy", "Patience", "Elizabeth", "Victoria", + "Sarah", "Deborah", "Esther", "Blessing", "Charity", "Hope", + "Gloria", "Agnes", "Peace", "Comfort", "Juliet", "Ruth", + "Angela", "Faith", + ] + + # Combined list + first_names = first_names_male + first_names_female + + # Prefixes + prefixes_male = ["Mr.", "Chief", "Dr.", "Prof.", "Engr."] + prefixes_female = ["Mrs.", "Miss", "Dr.", "Prof.", "Lady"] + + prefixes = prefixes_male + prefixes_female + + # Last names + last_names = [ + "Okonkwo", "Adeyemi", "Olawale", "Chukwu", "Eze", + "Obi", "Abiola", "Okafor", "Balogun", "Uche", "Ogunleye", + "Nnamani", "Adetokunbo", "Ojo", "Ekwueme", "Oshodi", + "Ibrahim", "Akinwale", "Obasanjo", "Oyekan", + ] diff --git a/faker/providers/person/ha_NG/__init__.py b/faker/providers/person/ha_NG/__init__.py new file mode 100644 index 0000000000..1fcc22ebc2 --- /dev/null +++ b/faker/providers/person/ha_NG/__init__.py @@ -0,0 +1,35 @@ +from faker.providers.person import Provider as PersonProvider + +class Provider(PersonProvider): + # Male first names + first_names_male = [ + "Abdullahi", "Musa", "Sani", "Ibrahim", "Aliyu", "Bello", + "Kabiru", "Shehu", "Yusuf", "Haruna", "Ismail", "Usman", + "Nasiru", "Mahmud", "Umar", "Habibu", "Danjuma", "Tanimu", + "Shamsuddeen", "Ahmad", + ] + + # Female first names + first_names_female = [ + "Zainab", "Aisha", "Hauwa", "Fatima", "Hadiza", "Maryam", + "Sa’adatu", "Jamila", "Rabi", "Khadija", "Bilkisu", "Asma’u", + "Halima", "Safiya", "Sumayya", "Habiba", "Ruqayya", "Hafsat", + "Aminatu", "Gambo", + ] + + # Combined list + first_names = first_names_male + first_names_female + + # Prefixes + prefixes_male = ["Alhaji", "Mallam", "Dr.", "Prof."] + prefixes_female = ["Hajiya", "Mrs.", "Dr.", "Prof."] + + prefixes = prefixes_male + prefixes_female + + # Last names + last_names = [ + "Abubakar", "Mohammed", "Yahaya", "Garba", "Danjuma", + "Buhari", "Zubairu", "Jibril", "Suleiman", "Lawal", "Tukur", + "Ali", "Shehu", "Mustapha", "Kabir", "Idris", "Sa’idu", + "Bappa", "Yusuf", "Isah", + ] diff --git a/faker/providers/person/ig_NG/__init__.py b/faker/providers/person/ig_NG/__init__.py new file mode 100644 index 0000000000..dd3cba7164 --- /dev/null +++ b/faker/providers/person/ig_NG/__init__.py @@ -0,0 +1,35 @@ +from faker.providers.person import Provider as PersonProvider + +class Provider(PersonProvider): + # Male first names + first_names_male = [ + "Chinedu", "Obinna", "Ifeanyi", "Emeka", "Uche", "Chukwudi", + "Nnamdi", "Ikenna", "Ekene", "Chibuzo", "Ebuka", "Nonso", + "Chukwuemeka", "Somtochukwu", "Uchenna", "Ifechukwu", "Chigozie", + "Okechukwu", "Kelechi", "Chijioke", + ] + + # Female first names + first_names_female = [ + "Adaeze", "Chiamaka", "Oluchi", "Ngozi", "Amarachi", "Ifunanya", + "Chinelo", "Ogechi", "Nneka", "Obianuju", "Ujunwa", "Ifeoma", + "Chidimma", "Nkiruka", "Onyinye", "Chizoba", "Chinyere", "Kosisochukwu", + "Ozioma", "Somadina", + ] + + # Combined list + first_names = first_names_male + first_names_female + + # Prefixes + prefixes_male = ["Mr.", "Chief", "Dr.", "Engr.", "Prof."] + prefixes_female = ["Mrs.", "Miss", "Dr.", "Prof.", "Lady"] + + prefixes = prefixes_male + prefixes_female + + # Last names + last_names = [ + "Okafor", "Eze", "Obi", "Nwosu", "Okeke", "Nwachukwu", + "Onoh", "Ogbuehi", "Iwu", "Chukwu", "Onwuka", "Anyanwu", + "Udeh", "Ihejirika", "Madu", "Njoku", "Ezeugo", "Ojukwu", + "Iroha", "Okoro", + ] diff --git a/test_african_names.py b/test_african_names.py new file mode 100644 index 0000000000..2e46ca72eb --- /dev/null +++ b/test_african_names.py @@ -0,0 +1,25 @@ +from faker import Faker + +# Igbo provider +fake_ig = Faker("ig_NG") +print("Igbo samples:") +for _ in range(5): + print(fake_ig.name()) + +# Hausa provider +fake_ha = Faker("ha_NG") +print("\nHausa samples:") +for _ in range(5): + print(fake_ha.name()) + +# English-Nigerian provider +fake_en_ng = Faker("en_NG") +print("\nEnglish-Nigerian samples:") +for _ in range(5): + print(fake_en_ng.name()) + +# Yoruba provider (already exists, just for comparison) +fake_yo = Faker("yo_NG") +print("\nYoruba samples:") +for _ in range(5): + print(fake_yo.name()) diff --git a/tests/providers/test_person.py b/tests/providers/test_person.py index 385f2b25bf..48164f4638 100644 --- a/tests/providers/test_person.py +++ b/tests/providers/test_person.py @@ -14,6 +14,7 @@ from faker.providers.person.en_GB import Provider as EnGBProvider from faker.providers.person.en_IE import Provider as EnIEProvider from faker.providers.person.en_IN import Provider as EnINProvider +from faker.providers.person.en_NG import Provider as EnNgProvider from faker.providers.person.en_PK import Provider as EnPKprovider from faker.providers.person.en_US import Provider as EnUSProvider from faker.providers.person.es import Provider as EsProvider @@ -23,9 +24,11 @@ from faker.providers.person.fr_BE import Provider as FrBEProvider from faker.providers.person.ga_IE import Provider as GaIEProvider from faker.providers.person.gu_IN import Provider as GuINProvider +from faker.providers.person.ha_NG import Provider as HaNgProvider from faker.providers.person.he_IL import Provider as HeILProvider from faker.providers.person.hi_IN import Provider as HiINProvider from faker.providers.person.hy_AM import Provider as HyAmProvider +from faker.providers.person.ig_NG import Provider as IgNgProvider from faker.providers.person.is_IS import Provider as IsISProvider from faker.providers.person.lv_LV import Provider as LvProvider from faker.providers.person.ne_NP import Provider as NeProvider @@ -341,6 +344,54 @@ def get_first_name_from_full_name(self, full_name): if len(names) == 2: return names[0] return names[1] + + +class TestEnNG(unittest.TestCase): + """Tests person in the en_NG (English - Nigeria) locale""" + + def setUp(self): + self.fake = Faker("en_NG") + Faker.seed(0) + + def test_name(self): + name = self.fake.name() + self.assertIsInstance(name, str) + + name = self.fake.name_female() + self.assertIsInstance(name, str) + + name = self.fake.name_male() + self.assertIsInstance(name, str) + + def test_first_name(self): + name = self.fake.first_name() + self.assertIsInstance(name, str) + assert name in EnNgProvider.first_names + + name = self.fake.first_name_female() + self.assertIsInstance(name, str) + assert name in EnNgProvider.first_names + assert name in EnNgProvider.first_names_female + + name = self.fake.first_name_male() + self.assertIsInstance(name, str) + assert name in EnNgProvider.first_names + assert name in EnNgProvider.first_names_male + + def test_last_name(self): + assert hasattr(EnNgProvider, "last_names") + + name = self.fake.last_name() + self.assertIsInstance(name, str) + assert name in EnNgProvider.last_names + + name = self.fake.last_name_female() + self.assertIsInstance(name, str) + assert name in EnNgProvider.last_names + + name = self.fake.last_name_male() + self.assertIsInstance(name, str) + assert name in EnNgProvider.last_names class TestEnIE(unittest.TestCase): @@ -826,6 +877,55 @@ def test_prefix_male(self): assert prefix in GuINProvider.prefixes_male +class TestHaNG(unittest.TestCase): + """Tests person in the ha_NG (Hausa - Nigeria) locale""" + + def setUp(self): + self.fake = Faker("ha_NG") + Faker.seed(0) + + def test_name(self): + name = self.fake.name() + self.assertIsInstance(name, str) + + name = self.fake.name_female() + self.assertIsInstance(name, str) + + name = self.fake.name_male() + self.assertIsInstance(name, str) + + def test_first_name(self): + name = self.fake.first_name() + self.assertIsInstance(name, str) + assert name in HaNgProvider.first_names + + name = self.fake.first_name_female() + self.assertIsInstance(name, str) + assert name in HaNgProvider.first_names + assert name in HaNgProvider.first_names_female + + name = self.fake.first_name_male() + self.assertIsInstance(name, str) + assert name in HaNgProvider.first_names + assert name in HaNgProvider.first_names_male + + def test_last_name(self): + assert hasattr(HaNgProvider, "last_names") + + name = self.fake.last_name() + self.assertIsInstance(name, str) + assert name in HaNgProvider.last_names + + name = self.fake.last_name_female() + self.assertIsInstance(name, str) + assert name in HaNgProvider.last_names + + name = self.fake.last_name_male() + self.assertIsInstance(name, str) + assert name in HaNgProvider.last_names + + + class TestHeIL(unittest.TestCase): """Tests person in the he_IL locale.""" @@ -957,6 +1057,54 @@ def test_last_name(self): name = self.fake.last_name_male() self.assertIsInstance(name, str) assert name in HyAmProvider.last_names + + +class TestIgNG(unittest.TestCase): + """Tests person in the ig_NG (Igbo - Nigeria) locale""" + + def setUp(self): + self.fake = Faker("ig_NG") + Faker.seed(0) + + def test_name(self): + name = self.fake.name() + self.assertIsInstance(name, str) + + name = self.fake.name_female() + self.assertIsInstance(name, str) + + name = self.fake.name_male() + self.assertIsInstance(name, str) + + def test_first_name(self): + name = self.fake.first_name() + self.assertIsInstance(name, str) + assert name in IgNgProvider.first_names + + name = self.fake.first_name_female() + self.assertIsInstance(name, str) + assert name in IgNgProvider.first_names + assert name in IgNgProvider.first_names_female + + name = self.fake.first_name_male() + self.assertIsInstance(name, str) + assert name in IgNgProvider.first_names + assert name in IgNgProvider.first_names_male + + def test_last_name(self): + assert hasattr(IgNgProvider, "last_names") + + name = self.fake.last_name() + self.assertIsInstance(name, str) + assert name in IgNgProvider.last_names + + name = self.fake.last_name_female() + self.assertIsInstance(name, str) + assert name in IgNgProvider.last_names + + name = self.fake.last_name_male() + self.assertIsInstance(name, str) + assert name in IgNgProvider.last_names class TestIsIS(unittest.TestCase): @@ -1734,7 +1882,7 @@ def setUp(self): def test_last_name(self): """ - Test the generation of Zulu last names. + Test the generation of yoruba last names. """ # There's no gender-specific last name in Zulu. self.assertTrue(hasattr(YoNGProvider, "last_names_male")) @@ -1760,7 +1908,7 @@ def test_last_name(self): def test_first_name(self): """ - Test the generation of Zulu first names. + Test the generation of yoruba first names. """ # General first name. name = self.fake.first_name() @@ -1781,7 +1929,7 @@ def test_first_name(self): def test_full_name(self): """ - Test the generation of full Zulu names. + Test the generation of full yoruba names. """ # Full name. name = self.fake.name() From b2406f8b7fadaa11a9ee5e8228e24ab0eac90d59 Mon Sep 17 00:00:00 2001 From: Limitless Date: Tue, 26 Aug 2025 17:37:06 +0100 Subject: [PATCH 2/4] Remove redundant test_african_names.py (covered in test_person.py) --- test_african_names.py | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 test_african_names.py diff --git a/test_african_names.py b/test_african_names.py deleted file mode 100644 index 2e46ca72eb..0000000000 --- a/test_african_names.py +++ /dev/null @@ -1,25 +0,0 @@ -from faker import Faker - -# Igbo provider -fake_ig = Faker("ig_NG") -print("Igbo samples:") -for _ in range(5): - print(fake_ig.name()) - -# Hausa provider -fake_ha = Faker("ha_NG") -print("\nHausa samples:") -for _ in range(5): - print(fake_ha.name()) - -# English-Nigerian provider -fake_en_ng = Faker("en_NG") -print("\nEnglish-Nigerian samples:") -for _ in range(5): - print(fake_en_ng.name()) - -# Yoruba provider (already exists, just for comparison) -fake_yo = Faker("yo_NG") -print("\nYoruba samples:") -for _ in range(5): - print(fake_yo.name()) From 133c0731d7f0f04b5ce3a0b5af189ea9a80101fc Mon Sep 17 00:00:00 2001 From: Limitless Date: Tue, 26 Aug 2025 17:47:39 +0100 Subject: [PATCH 3/4] Add data source references for Nigerian person providers --- faker/providers/person/en_NG/__init__.py | 9 +++++++++ faker/providers/person/ha_NG/__init__.py | 5 +++++ faker/providers/person/ig_NG/__init__.py | 5 +++++ 3 files changed, 19 insertions(+) diff --git a/faker/providers/person/en_NG/__init__.py b/faker/providers/person/en_NG/__init__.py index 9ced48108b..8a96d049d0 100644 --- a/faker/providers/person/en_NG/__init__.py +++ b/faker/providers/person/en_NG/__init__.py @@ -1,3 +1,12 @@ +# Data sources: +# Yoruba names: https://en.wikipedia.org/wiki/List_of_Yoruba_given_names +# Igbo names: https://en.wikipedia.org/wiki/Igbo_names +# Hausa names: https://en.wikipedia.org/wiki/Hausa_names +# Nigerian English names: https://en.wikipedia.org/wiki/Nigerian_name +# Additional references: +# - Behind the Name (Igbo, Yoruba): https://www.behindthename.com +# - Journal of West African Languages (Hausa naming practices, 2016) + from faker.providers.person import Provider as PersonProvider class Provider(PersonProvider): diff --git a/faker/providers/person/ha_NG/__init__.py b/faker/providers/person/ha_NG/__init__.py index 1fcc22ebc2..16f4a36f45 100644 --- a/faker/providers/person/ha_NG/__init__.py +++ b/faker/providers/person/ha_NG/__init__.py @@ -1,3 +1,8 @@ +# Data sources: +# Hausa names: https://en.wikipedia.org/wiki/Hausa_names +# Additional references: +# - Journal of West African Languages (Hausa naming practices, 2016) + from faker.providers.person import Provider as PersonProvider class Provider(PersonProvider): diff --git a/faker/providers/person/ig_NG/__init__.py b/faker/providers/person/ig_NG/__init__.py index dd3cba7164..7570f0bf6d 100644 --- a/faker/providers/person/ig_NG/__init__.py +++ b/faker/providers/person/ig_NG/__init__.py @@ -1,3 +1,8 @@ +# Data sources: +# Igbo names: https://en.wikipedia.org/wiki/Igbo_names +# Additional references: +# - Behind the Name (Igbo, Yoruba): https://www.behindthename.com +# - Journal of West African Languages (Hausa naming practices, 2016) from faker.providers.person import Provider as PersonProvider class Provider(PersonProvider): From 1c9806fd7f8ef3b41eb8a00364a3de431ee506b9 Mon Sep 17 00:00:00 2001 From: Limitless Date: Thu, 20 Nov 2025 15:07:56 +0100 Subject: [PATCH 4/4] Merge upstream/master into add-nigerian-locales --- faker/providers/person/__init__.py | 1 + faker/providers/person/efik_NG/__init__.py | 43 ++++++++++++++++++++ tests/providers/test_person.py | 47 ++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 faker/providers/person/efik_NG/__init__.py diff --git a/faker/providers/person/__init__.py b/faker/providers/person/__init__.py index 54760558bb..8a0a2af27f 100644 --- a/faker/providers/person/__init__.py +++ b/faker/providers/person/__init__.py @@ -52,6 +52,7 @@ class Provider(BaseProvider): "Ewe", "Greek", "English", + "Efik", "Esperanto", "Spanish", "Estonian", diff --git a/faker/providers/person/efik_NG/__init__.py b/faker/providers/person/efik_NG/__init__.py new file mode 100644 index 0000000000..7bdaa6e061 --- /dev/null +++ b/faker/providers/person/efik_NG/__init__.py @@ -0,0 +1,43 @@ +# Data sources: +# Efik Names: https://efikeburutu.org/efik%20naming%20system.html +# Additional references: +# - https://en.wikipedia.org/wiki/Efik_name +# Compiled by: https://x.com/mb_awak +# programming help: https://github.com/ifeoluwaoladeji + +from faker.providers.person import Provider as PersonProvider + +class Provider(PersonProvider): + # Male first names + first_names_male = [ + "Etim", "Antigha", "Bassey", "Nyong", "Nkese", "Edet", + "Odionka", "Efefiom", "Andem", "Henshaw", "Ndiyo", "Duke", + "Orok", "Mesembe", "Namondo", "Efiwat", "Asikpo", "Archibong", + "Ekpe", + ] + + # Female first names + first_names_female = [ + "Okoho", "Edemanwan", "Ansa", "Asari", "Efioanwan", "Ekanem", + "Orokanwan", "Eyoanwan", "Itamanwan", "Efiokanwan", "Eke", "Atim", + "Inyang", "Nsikak", "Ekerette", "Ekanem", "Udobong", "Ankwa", "Minika" + ] + + # Combined list + first_names = first_names_male + first_names_female + + # Prefixes + prefixes_male = ["Mr", "Dr.", "Prof."] + prefixes_female = ["Miss", "Mrs.", "Dr.", "Prof."] + + prefixes = prefixes_male + prefixes_female + + # Last names + last_names = [ + "Oku", "Aye", "Ewa", "Ibok", "Efiok", + "Itam", "Essien", "Eyonsa", "Okokon", "Cobham", "Offiong", + "Ekeng", "Efa", "Otu", "Itam", "Orok", "Eyo", + "Nsa", "Ita", "Hogan", "Esu", "Ekpenyong", "Otu", + "Etetim", "Inyang", "Effiong", + ] + diff --git a/tests/providers/test_person.py b/tests/providers/test_person.py index 48164f4638..f282fcda7b 100644 --- a/tests/providers/test_person.py +++ b/tests/providers/test_person.py @@ -10,6 +10,7 @@ from faker.providers.person.cs_CZ import Provider as CsCZProvider from faker.providers.person.de_AT import Provider as DeAtProvider from faker.providers.person.de_LI import Provider as DeLiProvider +from faker.providers.person.efik_NG import Provider as EfikNgProvider from faker.providers.person.en import Provider as EnProvider from faker.providers.person.en_GB import Provider as EnGBProvider from faker.providers.person.en_IE import Provider as EnIEProvider @@ -301,6 +302,52 @@ def test_first_name_male(self): assert isinstance(name_male, str) assert name_male in DeLiProvider.first_names_male +class TestEfikNg(unittest.TestCase): + """Tests for the Efik_NG locale person provider""" + + def setUp(self): + self.fake = Faker("efik_NG") + Faker.seed(0) + + def test_first_name(self): + # General first name + name = self.fake.first_name() + self.assertIsInstance(name, str) + self.assertIn(name, EfikNgProvider.first_names) + + # Female first name + name_female = self.fake.first_name_female() + self.assertIsInstance(name_female, str) + self.assertIn(name_female, EfikNgProvider.first_names) + self.assertIn(name_female, EfikNgProvider.first_names_female) + + # Male first name + name_male = self.fake.first_name_male() + self.assertIsInstance(name_male, str) + self.assertIn(name_male, EfikNgProvider.first_names) + self.assertIn(name_male, EfikNgProvider.first_names_male) + + def test_last_name(self): + # General last name + last = self.fake.last_name() + self.assertIsInstance(last, str) + self.assertIn(last, EfikNgProvider.last_names) + + # Female last name + last_female = self.fake.last_name_female() + self.assertIsInstance(last_female, str) + self.assertIn(last_female, EfikNgProvider.last_names) + + # Male last name + last_male = self.fake.last_name_male() + self.assertIsInstance(last_male, str) + self.assertIn(last_male, EfikNgProvider.last_names) + + def test_full_name(self): + name = self.fake.name() + self.assertIsInstance(name, str) + self.assertTrue(any(fn in name for fn in EfikNgProvider.first_names)) + self.assertTrue(any(ln in name for ln in EfikNgProvider.last_names)) class TestEn(unittest.TestCase): """Tests person in the en locale"""