Skip to content

Commit

Permalink
i18n.Lang as a subclass of dict
Browse files Browse the repository at this point in the history
  • Loading branch information
rgaudin committed Jul 31, 2024
1 parent 6e700d8 commit dab3cbb
Showing 1 changed file with 19 additions and 37 deletions.
56 changes: 19 additions & 37 deletions src/zimscraperlib/i18n.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,75 +65,57 @@ def setlocale(root_dir: pathlib.Path, locale_name: str):
) from exc


class Lang:
def __init__(self, lang_data: dict):
self._lang_data = lang_data
class Lang(dict):

@property
def iso_639_1(self) -> str | None:
"""ISO-639-1 language code"""
return self._lang_data["iso-639-1"]
return self["iso-639-1"]

@property
def iso_639_2b(self) -> str | None:
"""ISO-639-2b language code"""
return self._lang_data["iso-639-2b"]
return self["iso-639-2b"]

@property
def iso_639_2t(self) -> str | None:
"""ISO-639-2t language code"""
return self._lang_data["iso-639-2t"]
return self["iso-639-2t"]

@property
def iso_639_3(self) -> str | None:
"""ISO-639-3 language code"""
return self._lang_data["iso-639-3"]
return self["iso-639-3"]

@property
def iso_639_5(self) -> str | None:
"""ISO-639-5 language code"""
return self._lang_data["iso-639-5"]
return self["iso-639-5"]

@property
def english(self) -> str:
"""language name in English"""
return self._lang_data["english"]
return self["english"]

@property
def native(self) -> str:
"""language name in native language"""
return self._lang_data["native"]
return self["native"]

@property
def iso_types(self) -> list[str]:
"""list of supported iso types"""
return self._lang_data["iso_types"]
return self["iso_types"]

@property
def query(self) -> list[str]:
"""Query issued for these language details"""
return self._lang_data["query"]
return self["query"]

@property
def querytype(self) -> list[str]:
"""Type of query issued to retrieve language details"""
return self._lang_data["querytype"]

def get(self, attribute: str) -> str | None:
"""Return language code for given ISO code"""
return self._lang_data.get(attribute)

def __eq__(self, value: object) -> bool:
"""Compare with another value, either Lang or dict supported"""
if isinstance(value, Lang):
return self._lang_data == value._lang_data
if isinstance(value, dict):
return self._lang_data == value
return False

def __iter__(self):
"""Iterate over dict properties"""
return self._lang_data.__iter__()
return self["querytype"]


def get_iso_lang_data(lang: str) -> tuple[Lang, Lang | None]:
Expand Down Expand Up @@ -173,17 +155,17 @@ def replace_types(new_type: str) -> str:
if str(getattr(isolang, code_type)).lower() == lang.lower():
iso_types.append(replace_types(code_type))

lang_data = {
f"iso-639-{lang_}": getattr(isolang, f"pt{lang_}") for lang_ in ISO_LEVELS
}
lang_data = Lang(
**{f"iso-639-{lang_}": getattr(isolang, f"pt{lang_}") for lang_ in ISO_LEVELS}
)
lang_data.update({"english": isolang.name, "iso_types": iso_types})

if isolang.macro():
return (
Lang(lang_data),
lang_data,
get_iso_lang_data(isolang.macro().name)[0],
) # first item in the returned tuple
return Lang(lang_data), None
return lang_data, None


def find_language_names(query: str, lang_data: Lang | None = None) -> tuple[str, str]:
Expand Down Expand Up @@ -219,9 +201,9 @@ def find_language_names(query: str, lang_data: Lang | None = None) -> tuple[str,
def update_with_macro(lang_data: Lang, macro_data: Lang | None):
"""update empty keys from lang_data with ones of macro_data"""
if macro_data:
for key, value in macro_data._lang_data.items():
for key, value in macro_data.items():
if key in lang_data and not lang_data.get(key):
lang_data._lang_data[key] = value
lang_data[key] = value
return lang_data


Expand Down Expand Up @@ -261,7 +243,7 @@ def get_language_details(

iso_data = update_with_macro(lang_data, macro_data)
native_name, english_name = find_language_names(native_query, iso_data)
iso_data._lang_data.update(
iso_data.update(
{
"english": english_name,
"native": native_name,
Expand Down

0 comments on commit dab3cbb

Please sign in to comment.