From 49bf2f3bbc537dca7fbf87e1d292eed03964ec1a Mon Sep 17 00:00:00 2001 From: Plastic-time <247457381+Plastic-time@users.noreply.github.com> Date: Thu, 22 Oct 2026 16:20:55 -0400 Subject: [PATCH] Add missing ISO alphabetic country codes --- src/validators/country.py | 30 +++++++++++++++--------------- tests/test_country.py | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/validators/country.py b/src/validators/country.py index f220c77f..2b90d9ba 100644 --- a/src/validators/country.py +++ b/src/validators/country.py @@ -6,17 +6,17 @@ # fmt: off _alpha3_to_alpha2 = { # A - "ABW": "AW", "AFG": "AF", "AGO": "AO", "AIA": "AI", "ALB": "AL", "AND": "AD", "ANT": "AN", - "ARE": "AE", "ARG": "AR", "ARM": "AM", "ASM": "AS", "ATA": "AQ", "ATF": "TF", "ATG": "AG", - "AUS": "AU", "AUT": "AT", "AZE": "AZ", + "ABW": "AW", "AFG": "AF", "AGO": "AO", "AIA": "AI", "ALA": "AX", "ALB": "AL", "AND": "AD", + "ANT": "AN", "ARE": "AE", "ARG": "AR", "ARM": "AM", "ASM": "AS", "ATA": "AQ", "ATF": "TF", + "ATG": "AG", "AUS": "AU", "AUT": "AT", "AZE": "AZ", # B - "BDI": "BI", "BEL": "BE", "BEN": "BJ", "BFA": "BF", "BGD": "BD", "BGR": "BG", "BHR": "BH", - "BHS": "BS", "BIH": "BA", "BLR": "BY", "BLZ": "BZ", "BMU": "BM", "BOL": "BO", "BRA": "BR", - "BRB": "BB", "BRN": "BN", "BTN": "BT", "BVT": "BV", "BWA": "BW", + "BDI": "BI", "BEL": "BE", "BEN": "BJ", "BES": "BQ", "BFA": "BF", "BGD": "BD", "BGR": "BG", + "BHR": "BH", "BHS": "BS", "BIH": "BA", "BLM": "BL", "BLR": "BY", "BLZ": "BZ", "BMU": "BM", + "BOL": "BO", "BRA": "BR", "BRB": "BB", "BRN": "BN", "BTN": "BT", "BVT": "BV", "BWA": "BW", # C - "CAF": "CF", "CAN": "CA", "CCK": "CC", "CHE": "CH", "CHL": "CL", "CHN": "CN", "CMR": "CM", - "COD": "CD", "COG": "CG", "COK": "CK", "COL": "CO", "COM": "KM", "CPV": "CV", "CRI": "CR", - "CUB": "CU", "CXR": "CX", "CYM": "KY", "CYP": "CY", "CZE": "CZ", + "CAF": "CF", "CAN": "CA", "CCK": "CC", "CHE": "CH", "CHL": "CL", "CHN": "CN", "CIV": "CI", + "CMR": "CM", "COD": "CD", "COG": "CG", "COK": "CK", "COL": "CO", "COM": "KM", "CPV": "CV", + "CRI": "CR", "CUB": "CU", "CUW": "CW", "CXR": "CX", "CYM": "KY", "CYP": "CY", "CZE": "CZ", # D "DEU": "DE", "DJI": "DJ", "DMA": "DM", "DNK": "DK", "DOM": "DO", "DZA": "DZ", # E @@ -41,10 +41,10 @@ "LAO": "LA", "LBN": "LB", "LBR": "LR", "LBY": "LY", "LCA": "LC", "LIE": "LI", "LKA": "LK", "LSO": "LS", "LTU": "LT", "LUX": "LU", "LVA": "LV", # M - "MAC": "MO", "MAR": "MA", "MCO": "MC", "MDA": "MD", "MDG": "MG", "MDV": "MV", "MEX": "MX", - "MHL": "MH", "MKD": "MK", "MLI": "ML", "MLT": "MT", "MMR": "MM", "MNE": "ME", "MNG": "MN", - "MNP": "MP", "MOZ": "MZ", "MRT": "MR", "MSR": "MS", "MTQ": "MQ", "MUS": "MU", "MWI": "MW", - "MYS": "MY", "MYT": "YT", + "MAC": "MO", "MAF": "MF", "MAR": "MA", "MCO": "MC", "MDA": "MD", "MDG": "MG", "MDV": "MV", + "MEX": "MX", "MHL": "MH", "MKD": "MK", "MLI": "ML", "MLT": "MT", "MMR": "MM", "MNE": "ME", + "MNG": "MN", "MNP": "MP", "MOZ": "MZ", "MRT": "MR", "MSR": "MS", "MTQ": "MQ", "MUS": "MU", + "MWI": "MW", "MYS": "MY", "MYT": "YT", # N "NAM": "NA", "NCL": "NC", "NER": "NE", "NFK": "NF", "NGA": "NG", "NIC": "NI", "NIU": "NU", "NLD": "NL", "NOR": "NO", "NPL": "NP", "NRU": "NR", "NZL": "NZ", @@ -60,8 +60,8 @@ # S "SAU": "SA", "SDN": "SD", "SEN": "SN", "SGP": "SG", "SGS": "GS", "SHN": "SH", "SJM": "SJ", "SLB": "SB", "SLE": "SL", "SLV": "SV", "SMR": "SM", "SOM": "SO", "SPM": "PM", "SRB": "RS", - "STP": "ST", "SUR": "SR", "SVK": "SK", "SVN": "SI", "SWE": "SE", "SWZ": "SZ", "SYC": "SC", - "SYR": "SY", + "SSD": "SS", "STP": "ST", "SUR": "SR", "SVK": "SK", "SVN": "SI", "SWE": "SE", "SWZ": "SZ", + "SXM": "SX", "SYC": "SC", "SYR": "SY", # T "TCA": "TC", "TCD": "TD", "TGO": "TG", "THA": "TH", "TJK": "TJ", "TKL": "TK", "TKM": "TM", "TLS": "TL", "TON": "TO", "TTO": "TT", "TUN": "TN", "TUR": "TR", "TUV": "TV", "TWN": "TW", diff --git a/tests/test_country.py b/tests/test_country.py index 1485d265..c71352c6 100644 --- a/tests/test_country.py +++ b/tests/test_country.py @@ -7,6 +7,30 @@ from validators import ValidationError, calling_code, country_code, currency +@pytest.mark.parametrize( + ("alpha2", "alpha3", "numeric"), + [ + ("AX", "ALA", "248"), + ("BQ", "BES", "535"), + ("BL", "BLM", "652"), + ("CI", "CIV", "384"), + ("CW", "CUW", "531"), + ("MF", "MAF", "663"), + ("SS", "SSD", "728"), + ("SX", "SXM", "534"), + ], +) +def test_missing_alpha_codes_match_existing_numeric_codes(alpha2: str, alpha3: str, numeric: str): + """Accept alphabetic codes for countries already supported in numeric form.""" + assert country_code(numeric, iso_format="numeric") is True + for value, iso_format in ((alpha2, "alpha2"), (alpha3, "alpha3")): + assert country_code(value, iso_format=iso_format) is True + assert country_code(value) is True + assert country_code(value.lower(), iso_format=iso_format, ignore_case=True) is True + assert country_code(value.lower(), ignore_case=True) is True + assert isinstance(country_code(value.lower()), ValidationError) + + @pytest.mark.parametrize(("value"), ["+1", "+371"]) def test_returns_true_on_valid_calling_code(value: str): """Test returns true on valid calling code."""