Source code for wikibaseintegrator.models.language_values
from __future__ import annotations
from collections.abc import Iterator
from typing import Self
from wikibaseintegrator.models.basemodel import BaseModel
from wikibaseintegrator.models.language_value import LanguageValue
from wikibaseintegrator.wbi_config import config
from wikibaseintegrator.wbi_enums import ActionIfExists
[docs]
class LanguageValues(BaseModel):
def __init__(self) -> None:
self.values: dict[str, LanguageValue] = {}
@property
def values(self) -> dict[str, LanguageValue]:
"""
A dict of LanguageValue with the language as key.
"""
return self.__values
@values.setter
def values(self, value: dict[str, LanguageValue]) -> None:
self.__values = value
[docs]
def add(self, language_value: LanguageValue) -> Self:
"""
Add a LanguageValue object to the list
:param language_value: A LanguageValue object
:return: The current LanguageValues object
"""
assert isinstance(language_value, LanguageValue)
if language_value.value:
self.values[language_value.language] = language_value
return self
[docs]
def get(self, language: str | None = None) -> LanguageValue | None:
"""
Get a LanguageValue object with the specified language. Use the default language in wbi_config if none specified.
:param language: The requested language.
:return: The related LanguageValue object or None if none found.
"""
language = str(language or config['DEFAULT_LANGUAGE'])
if language in self.values:
return self.values[language]
return None
[docs]
def set(self, language: str | None = None, value: str | None = None, action_if_exists: ActionIfExists = ActionIfExists.REPLACE_ALL) -> LanguageValue | None:
"""
Create or update the specified language with the valued passed in arguments.
:param language: The desired language.
:param value: The desired value of the LanguageValue object. Use None to delete an existing LanguageValue object from the list.
:param action_if_exists: The action if the LanguageValue object is already defined. Can be ActionIfExists.REPLACE_ALL (default) or ActionIfExists.KEEP.
:return: The created or updated LanguageValue. None if there's no LanguageValue object with this language.
"""
language = str(language or config['DEFAULT_LANGUAGE'])
assert action_if_exists in [ActionIfExists.REPLACE_ALL, ActionIfExists.KEEP]
# Remove value if None
if value is None:
if language in self.values:
self.values[language].remove()
return None
if action_if_exists == ActionIfExists.REPLACE_ALL or self.get(language=language) is None:
language_value = LanguageValue(language, value)
self.add(language_value)
return language_value
return self.get(language=language)
[docs]
def from_json(self, json_data: dict[str, dict]) -> Self:
"""
Create a new LanguageValues object from a JSON/dict object.
:param json_data: A dict object who use the same format as Wikibase.
:return: The newly created or updated object.
"""
for language_value in json_data:
self.add(language_value=LanguageValue(language=json_data[language_value]['language']).from_json(json_data=json_data[language_value]))
return self
[docs]
def get_json(self) -> dict[str, dict]:
"""
Get a formatted dict who respect the Wikibase format.
:return: A dict using Wikibase format.
"""
json_data: dict[str, dict] = {}
for language, language_value in self.values.items():
json_data[language] = language_value.get_json()
return json_data
def __contains__(self, language: str) -> bool:
return language in self.values
def __iter__(self) -> Iterator[LanguageValue]:
return iter(self.values.values())
def __len__(self) -> int:
return len(self.values)