From d895624308b02f1e970b3dee4ac1a3eb51dec5dd Mon Sep 17 00:00:00 2001 From: David Beauchemin Date: Tue, 17 Jan 2023 11:55:58 -0500 Subject: [PATCH] Add `fr_CA` address provider (#1767) --- faker/providers/address/en_CA/__init__.py | 8 ++- faker/providers/address/fr_CA/__init__.py | 81 +++++++++++++++++++++++ tests/providers/test_address.py | 41 ++++++++++++ 3 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 faker/providers/address/fr_CA/__init__.py diff --git a/faker/providers/address/en_CA/__init__.py b/faker/providers/address/en_CA/__init__.py index 4602bb0ead..f2ac4cafb7 100644 --- a/faker/providers/address/en_CA/__init__.py +++ b/faker/providers/address/en_CA/__init__.py @@ -2,6 +2,8 @@ from typing import Optional +from faker.providers import ElementsType + from ..en import Provider as AddressProvider @@ -33,9 +35,9 @@ class Provider(AddressProvider): "Y", ) - city_prefixes = ("North", "East", "West", "South", "New", "Lake", "Port") + city_prefixes: ElementsType[str] = ("North", "East", "West", "South", "New", "Lake", "Port") - city_suffixes = ( + city_suffixes: ElementsType[str] = ( "town", "ton", "land", @@ -337,7 +339,7 @@ class Provider(AddressProvider): "YT": ["Y"], } - city_formats = ( + city_formats: ElementsType[str] = ( "{{city_prefix}} {{first_name}}{{city_suffix}}", "{{city_prefix}} {{first_name}}", "{{first_name}}{{city_suffix}}", diff --git a/faker/providers/address/fr_CA/__init__.py b/faker/providers/address/fr_CA/__init__.py new file mode 100644 index 0000000000..40a5ba1351 --- /dev/null +++ b/faker/providers/address/fr_CA/__init__.py @@ -0,0 +1,81 @@ +from typing import Any + +from ..en_CA import Provider as EnCaProvider + + +class Provider(EnCaProvider): + # Most of the parts are identical to en_CA, we simply override those who are not shared between the two. + + city_prefixes = ( + "Ville", + "Baie", + "Saint-", + "Sainte-", + "Mont-", + "La", + "Lac-", + "L'", + "L'Île-", + ) + + city_suffixes = ( + "Est", + "Ouest", + "-sur-Mer", + ) + + street_prefixes = ( + "rue", + "rue", + "chemin", + "avenue", + "boulevard", + "route", + "rang", + "allé", + "montée", + ) + + provinces = ( + "Alberta", + "Colombie-Britannique", + "Manitoba", + "Nouveau-Brunswick", + "Terre-Neuve-et-Labrador", + "Territoires du Nord-Ouest", + "Nouvelle-Écosse", + "Nunavut", + "Ontario", + "Île-du-Prince-Édouard", + "Québec", + "Saskatchewan", + "Yukon", + ) + + street_name_formats = ( + "{{street_prefix}} {{first_name}}", + "{{street_prefix}} {{last_name}}", + ) + + city_formats = ( + "{{city_prefix}} {{last_name}}", + "{{city_prefix}} {{last_name}}", + "{{city_prefix}}-{{city_prefix}}-{{last_name}}", + "{{city_prefix}} {{first_name}} {{city_suffix}}", + "{{city_prefix}} {{first_name}}", + "{{city_prefix}} {{first_name}}", + "{{city_prefix}} {{first_name}}", + "{{last_name}}", + "{{last_name}}", + "{{first_name}} {{city_suffix}}", + "{{last_name}} {{city_suffix}}", + ) + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + def street_prefix(self) -> str: + """ + :example: 'rue' + """ + return self.random_element(self.street_prefixes) diff --git a/tests/providers/test_address.py b/tests/providers/test_address.py index 564012c942..d9cf2e8b25 100644 --- a/tests/providers/test_address.py +++ b/tests/providers/test_address.py @@ -26,6 +26,7 @@ from faker.providers.address.es_MX import Provider as EsMxAddressProvider from faker.providers.address.fa_IR import Provider as FaIrAddressProvider from faker.providers.address.fi_FI import Provider as FiFiAddressProvider +from faker.providers.address.fr_CA import Provider as FrCaAddressProvider from faker.providers.address.fr_CH import Provider as FrChAddressProvider from faker.providers.address.fr_FR import Provider as FrFrAddressProvider from faker.providers.address.he_IL import Provider as HeIlAddressProvider @@ -2222,6 +2223,46 @@ def test_region(self, faker, num_samples): assert region in UkUaAddressProvider.region_names +class TestFrCa: + """Test fr_CA address provider methods""" + + def test_province(self, faker, num_samples): + for _ in range(num_samples): + province = faker.province() + assert isinstance(province, str) + assert province in FrCaAddressProvider.provinces + + def test_province_abbr(self, faker, num_samples): + for _ in range(num_samples): + province_abbr = faker.province_abbr() + assert isinstance(province_abbr, str) + assert province_abbr in FrCaAddressProvider.provinces_abbr + + def test_city_prefixes(self, faker, num_samples): + for _ in range(num_samples): + city_prefix = faker.city_prefix() + assert isinstance(city_prefix, str) + assert city_prefix in FrCaAddressProvider.city_prefixes + + def test_city_suffixes(self, faker, num_samples): + for _ in range(num_samples): + city_suffixes = faker.city_suffix() + assert isinstance(city_suffixes, str) + assert city_suffixes in FrCaAddressProvider.city_suffixes + + def test_street_prefixes(self, faker, num_samples): + for _ in range(num_samples): + street_prefix = faker.street_prefix() + assert isinstance(street_prefix, str) + assert street_prefix in FrCaAddressProvider.street_prefixes + + def test_administrative_unit(self, faker, num_samples): + for _ in range(num_samples): + province = faker.administrative_unit() + assert isinstance(province, str) + assert province in FrCaAddressProvider.provinces + + class TestPlPl: """Test pl_PL address provider methods"""