fix: fallback only worked if not searching

This commit is contained in:
Hazel Noack 2025-06-12 15:09:06 +02:00
parent 5b724077e6
commit 78d60c9908
2 changed files with 16 additions and 10 deletions

View File

@ -1,11 +1,12 @@
from .__about__ import __name__, __version__
from . import Country, EmptyCountry
from . import Country, EmptyCountry, config
import pycountry
def cli():
print(f"Running {__name__} version {__version__} from __main__.py")
config.fallback_country = "US"
t = pycountry.countries.get(alpha_2="DE")
country = EmptyCountry(pycountry_object=t)
@ -15,4 +16,4 @@ def cli():
print()
empty_country = EmptyCountry(country="zwx")
print(type(empty_country))
print(empty_country)
print(empty_country)

View File

@ -23,11 +23,16 @@ class Country:
If the country couldn't be found, it raises a ValueError, or creates an empty object.
Empty objects return for every attribute None
"""
def __init__(self, country: Optional[str] = None, pycountry_object: Optional[pycountry.db.Country] = None) -> None:
def __init__(
self,
country: Optional[str] = None,
pycountry_object: Optional[pycountry.db.Country] = None,
force_disable_fallback: bool = False
) -> None:
if pycountry_object is None:
# search for the country string instead if the pycountry_object isn't given
# this also implements the optional fallback
pycountry_object = self._search_pycountry_object(country=country)
pycountry_object = self._search_pycountry_object(country=country, force_disable_fallback=force_disable_fallback)
if pycountry_object is None:
raise EmptyCountryException(f"the country {country} was not found and config.fallback_country isn't set")
@ -36,13 +41,13 @@ class Country:
@classmethod
def _search_pycountry_object(cls, country: Optional[str], is_fallback: bool = False) -> Optional[pycountry.db.Country]:
def _search_pycountry_object(cls, country: Optional[str], is_fallback: bool = False, force_disable_fallback: bool = False) -> Optional[pycountry.db.Country]:
# fallback to configured country if necessary
if country is None:
if is_fallback:
if country is None and not force_disable_fallback:
if force_disable_fallback or config.fallback_country is None:
return None
return cls._search_pycountry_object(country=config.fallback_country, is_fallback=True)
country = config.fallback_country
pycountry_object = None
@ -115,9 +120,9 @@ class EmptyCountry(Country):
This will be used if you don't want to use a fallback country but you still want to be able to not have None
You can access the same attributes but they will just return None
"""
def __new__(cls, country: Optional[str] = None, pycountry_object: Optional[pycountry.db.Country] = None):
def __new__(cls, country: Optional[str] = None, pycountry_object: Optional[pycountry.db.Country] = None, **kwargs):
try:
return Country(country=country, pycountry_object=pycountry_object)
return Country(country=country, pycountry_object=pycountry_object, force_disable_fallback=False)
except EmptyCountryException:
return super().__new__(cls)