From 54ede2f569ead99d8dc81c3f777911a3939e0d50 Mon Sep 17 00:00:00 2001 From: Jochem van Grondelle Date: Sun, 9 Nov 2025 15:54:00 +0700 Subject: [PATCH 1/3] [pycountry] Add stubs for 24.6.1 (closes #15001) Add type stubs for pycountry 24.6.*, providing type annotations for: - Database classes (ExistingCountries, HistoricCountries, Currencies, Languages, Scripts, etc.) - SubdivisionHierarchy and Subdivisions classes - Core data classes (Country, Subdivision, Data) - Module-level functions and constants --- stubs/pycountry/METADATA.toml | 5 ++ stubs/pycountry/pycountry/__init__.pyi | 63 ++++++++++++++++++++++++++ stubs/pycountry/pycountry/db.pyi | 43 ++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 stubs/pycountry/METADATA.toml create mode 100644 stubs/pycountry/pycountry/__init__.pyi create mode 100644 stubs/pycountry/pycountry/db.pyi diff --git a/stubs/pycountry/METADATA.toml b/stubs/pycountry/METADATA.toml new file mode 100644 index 000000000000..04310178112a --- /dev/null +++ b/stubs/pycountry/METADATA.toml @@ -0,0 +1,5 @@ +version = "24.6.*" +upstream_repository = "https://github.com/pycountry/pycountry" + +[tool.stubtest] +skip = false diff --git a/stubs/pycountry/pycountry/__init__.pyi b/stubs/pycountry/pycountry/__init__.pyi new file mode 100644 index 000000000000..973b00b89105 --- /dev/null +++ b/stubs/pycountry/pycountry/__init__.pyi @@ -0,0 +1,63 @@ +import pycountry.db + +LOCALES_DIR: str +DATABASE_DIR: str +__version__: str | None + +def resource_filename(package_or_requirement: str, resource_name: str) -> str: ... +def get_version(distribution_name: str) -> str | None: ... +def remove_accents(input_str: str) -> str: ... + +class ExistingCountries(pycountry.db.Database): + data_class: type + root_key: str + def search_fuzzy(self, query: str) -> list[pycountry.db.Country]: ... + +class HistoricCountries(ExistingCountries): + data_class: type + root_key: str + +class Scripts(pycountry.db.Database): + data_class: str + root_key: str + +class Currencies(pycountry.db.Database): + data_class: str + root_key: str + +class Languages(pycountry.db.Database): + no_index: list[str] + data_class: str + root_key: str + +class LanguageFamilies(pycountry.db.Database): + data_class: str + root_key: str + +class SubdivisionHierarchy(pycountry.db.Data): + country_code: str + parent_code: str | None + def __init__(self, **kw: str) -> None: ... + @property + def country(self) -> pycountry.db.Country | None: ... + @property + def parent(self) -> SubdivisionHierarchy | None: ... + +class Subdivisions(pycountry.db.Database): + data_class: type + no_index: list[str] + root_key: str + def get( + self, *, default: SubdivisionHierarchy | None = ..., **kw: str + ) -> SubdivisionHierarchy | None | list[SubdivisionHierarchy]: ... + def match(self, query: str) -> list[SubdivisionHierarchy]: ... + def partial_match(self, query: str) -> list[SubdivisionHierarchy]: ... + def search_fuzzy(self, query: str) -> list[SubdivisionHierarchy]: ... + +countries: ExistingCountries +subdivisions: Subdivisions +historic_countries: HistoricCountries +currencies: Currencies +languages: Languages +language_families: LanguageFamilies +scripts: Scripts diff --git a/stubs/pycountry/pycountry/db.pyi b/stubs/pycountry/pycountry/db.pyi new file mode 100644 index 000000000000..fd9869446f30 --- /dev/null +++ b/stubs/pycountry/pycountry/db.pyi @@ -0,0 +1,43 @@ +import logging +from collections.abc import Callable, Iterator +from typing import Any, TypeVar + +logger: logging.Logger + +_F = TypeVar("_F", bound=Callable[..., Any]) + +class Data: + def __init__(self, **fields: str) -> None: ... + def __getattr__(self, key: str) -> str: ... + def __setattr__(self, key: str, value: str) -> None: ... + def __dir__(self) -> list[str]: ... + def __iter__(self) -> Iterator[tuple[str, str]]: ... + +class Country(Data): ... +class Subdivision(Data): ... + +def lazy_load(f: _F) -> _F: ... + +class Database: + data_class: type | str + root_key: str | None + no_index: list[str] + filename: str + factory: type + objects: list[Data] + index_names: set[str] + indices: dict[str, dict[str, Data]] + + def __init__(self, filename: str) -> None: ... + @lazy_load + def add_entry(self, **kw: str) -> None: ... + @lazy_load + def remove_entry(self, **kw: Any) -> None: ... + @lazy_load + def __iter__(self) -> Iterator[Data]: ... + @lazy_load + def __len__(self) -> int: ... + @lazy_load + def get(self, *, default: Data | None = ..., **kw: Any) -> Data | None: ... + @lazy_load + def lookup(self, value: str) -> Data: ... From 61428d830b27483bd54bd45e10e0c7c05af79e63 Mon Sep 17 00:00:00 2001 From: Jochem van Grondelle Date: Sun, 9 Nov 2025 16:06:59 +0700 Subject: [PATCH 2/3] [pycountry] Fix error: Return type --- stubs/pycountry/pycountry/__init__.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/pycountry/pycountry/__init__.pyi b/stubs/pycountry/pycountry/__init__.pyi index 973b00b89105..471a1127b439 100644 --- a/stubs/pycountry/pycountry/__init__.pyi +++ b/stubs/pycountry/pycountry/__init__.pyi @@ -47,7 +47,7 @@ class Subdivisions(pycountry.db.Database): data_class: type no_index: list[str] root_key: str - def get( + def get( # type: ignore[override] self, *, default: SubdivisionHierarchy | None = ..., **kw: str ) -> SubdivisionHierarchy | None | list[SubdivisionHierarchy]: ... def match(self, query: str) -> list[SubdivisionHierarchy]: ... From ada29a16a15bc24d1e2a03188914b01936a28711 Mon Sep 17 00:00:00 2001 From: Jochem van Grondelle Date: Sat, 15 Nov 2025 23:22:13 +0700 Subject: [PATCH 3/3] [pycountry] Optimize stubs for pycountry 24.6.1 (thanks @donBarbos) --- stubs/pycountry/METADATA.toml | 5 +---- stubs/pycountry/pycountry/db.pyi | 12 +++++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/stubs/pycountry/METADATA.toml b/stubs/pycountry/METADATA.toml index 04310178112a..6377bbf8e102 100644 --- a/stubs/pycountry/METADATA.toml +++ b/stubs/pycountry/METADATA.toml @@ -1,5 +1,2 @@ -version = "24.6.*" +version = "24.6.*" upstream_repository = "https://github.com/pycountry/pycountry" - -[tool.stubtest] -skip = false diff --git a/stubs/pycountry/pycountry/db.pyi b/stubs/pycountry/pycountry/db.pyi index fd9869446f30..150488eecf23 100644 --- a/stubs/pycountry/pycountry/db.pyi +++ b/stubs/pycountry/pycountry/db.pyi @@ -1,10 +1,12 @@ import logging from collections.abc import Callable, Iterator -from typing import Any, TypeVar +from typing import TypeVar +from typing_extensions import ParamSpec logger: logging.Logger -_F = TypeVar("_F", bound=Callable[..., Any]) +_P = ParamSpec("_P") +_R = TypeVar("_R") class Data: def __init__(self, **fields: str) -> None: ... @@ -16,7 +18,7 @@ class Data: class Country(Data): ... class Subdivision(Data): ... -def lazy_load(f: _F) -> _F: ... +def lazy_load(f: Callable[_P, _R]) -> Callable[_P, _R]: ... class Database: data_class: type | str @@ -32,12 +34,12 @@ class Database: @lazy_load def add_entry(self, **kw: str) -> None: ... @lazy_load - def remove_entry(self, **kw: Any) -> None: ... + def remove_entry(self, **kw: str) -> None: ... @lazy_load def __iter__(self) -> Iterator[Data]: ... @lazy_load def __len__(self) -> int: ... @lazy_load - def get(self, *, default: Data | None = ..., **kw: Any) -> Data | None: ... + def get(self, *, default: Data | None = ..., **kw: str) -> Data | None: ... @lazy_load def lookup(self, value: str) -> Data: ...