Source code for wikibaseintegrator.entities.lexeme

from __future__ import annotations

import re
from typing import Any

from wikibaseintegrator.entities.baseentity import BaseEntity
from wikibaseintegrator.models.forms import Forms
from wikibaseintegrator.models.lemmas import Lemmas
from wikibaseintegrator.models.senses import Senses
from wikibaseintegrator.wbi_config import config


[docs] class LexemeEntity(BaseEntity): ETYPE = 'lexeme'
[docs] def __init__(self, lemmas: Lemmas | None = None, lexical_category: str | None = None, language: str | None = None, forms: Forms | None = None, senses: Senses | None = None, **kwargs: Any): super().__init__(**kwargs) self.lemmas: Lemmas = lemmas or Lemmas() self.lexical_category: str | None = lexical_category self.language: str = str(language or config['DEFAULT_LEXEME_LANGUAGE']) self.forms: Forms = forms or Forms() self.senses: Senses = senses or Senses()
@BaseEntity.id.setter # type: ignore def id(self, value: None | str | int): if isinstance(value, str): pattern = re.compile(r'^(?:[a-zA-Z]+:)?L?([0-9]+)$') matches = pattern.match(value) if not matches: raise ValueError(f"Invalid lexeme ID ({value}), format must be 'L[0-9]+'") value = f'L{matches.group(1)}' elif isinstance(value, int): value = f'L{value}' elif value is None: pass else: raise ValueError(f"Invalid lexeme ID ({value}), format must be 'L[0-9]+'") BaseEntity.id.fset(self, value) # type: ignore @property def lemmas(self) -> Lemmas: return self.__lemmas @lemmas.setter def lemmas(self, lemmas: Lemmas): if not isinstance(lemmas, Lemmas): raise TypeError self.__lemmas = lemmas @property def lexical_category(self) -> str | None: return self.__lexical_category @lexical_category.setter def lexical_category(self, lexical_category: str | None): self.__lexical_category = lexical_category @property def language(self) -> str: return self.__language @language.setter def language(self, language: str): if isinstance(language, str): pattern = re.compile(r'^(?:[a-zA-Z]+:|.+/entity/)?Q?([0-9]+)$') matches = pattern.match(language) if not matches: raise ValueError(f"Invalid lexeme language value ({language}), format must be 'Q[0-9]+'") language = f'Q{matches.group(1)}' elif isinstance(language, int): language = f'Q{language}' elif language is None: pass else: raise ValueError(f"Invalid lexeme language value ({language}), format must be 'Q[0-9]+'") self.__language = language @property def forms(self) -> Forms: return self.__forms @forms.setter def forms(self, forms: Forms): if not isinstance(forms, Forms): raise TypeError self.__forms = forms @property def senses(self) -> Senses: return self.__senses @senses.setter def senses(self, senses: Senses): if not isinstance(senses, Senses): raise TypeError self.__senses = senses
[docs] def new(self, **kwargs: Any) -> LexemeEntity: return LexemeEntity(api=self.api, **kwargs)
[docs] def get(self, entity_id: str | int, **kwargs: Any) -> LexemeEntity: if isinstance(entity_id, str): pattern = re.compile(r'^(?:[a-zA-Z]+:)?L?([0-9]+)$') matches = pattern.match(entity_id) if not matches: raise ValueError(f"Invalid lexeme ID ({entity_id}), format must be 'L[0-9]+'") entity_id = int(matches.group(1)) if entity_id < 1: raise ValueError("Lexeme ID must be greater than 0") entity_id = f'L{entity_id}' json_data = super()._get(entity_id=entity_id, **kwargs) return LexemeEntity(api=self.api).from_json(json_data=json_data['entities'][entity_id])
[docs] def get_json(self) -> dict[str, str | dict]: json_data: dict = { 'lemmas': self.lemmas.get_json(), 'language': self.language, 'forms': self.forms.get_json(), 'senses': self.senses.get_json(), **super().get_json() } if self.lexical_category: json_data['lexicalCategory'] = self.lexical_category return json_data
[docs] def from_json(self, json_data: dict[str, Any]) -> LexemeEntity: super().from_json(json_data=json_data) if 'lemmas' in json_data: self.lemmas = Lemmas().from_json(json_data['lemmas']) if 'lexicalCategory' in json_data: self.lexical_category = str(json_data['lexicalCategory']) if 'language' in json_data: self.language = str(json_data['language']) if 'forms' in json_data: self.forms = Forms().from_json(json_data['forms']) if 'senses' in json_data: self.senses = Senses().from_json(json_data['senses']) return self
[docs] def write(self, **kwargs: Any) -> LexemeEntity: """ Write the LexemeEntity data to the Wikibase instance and return the LexemeEntity object returned by the instance. :param data: The serialized object that is used as the data source. A newly created entity will be assigned an 'id'. :param summary: A summary of the edit :param login: A login instance :param allow_anonymous: Force a check if the query can be anonymous or not :param clear: Clear the existing entity before updating :param is_bot: Add the bot flag to the query :param kwargs: More arguments for Python requests :return: an LexemeEntity of the response from the instance """ json_data = super()._write(data=self.get_json(), **kwargs) return self.from_json(json_data=json_data)