From 2b1129da0ea38efffd6b240d3482316f6c05c70d Mon Sep 17 00:00:00 2001 From: Jochem van Grondelle Date: Sun, 9 Nov 2025 15:54:00 +0700 Subject: [PATCH 1/2] [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 2e5f9f81fe86137366882e33b865fe7f676af971 Mon Sep 17 00:00:00 2001 From: Jochem van Grondelle Date: Sun, 9 Nov 2025 16:06:59 +0700 Subject: [PATCH 2/2] [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]: ...