Source code for wikibaseintegrator.models.sense
from __future__ import annotations
import json
from typing import Any, Self
from wikibaseintegrator.models.basemodel import BaseModel
from wikibaseintegrator.models.claims import Claims
from wikibaseintegrator.models.glosses import Glosses
from wikibaseintegrator.models.language_values import LanguageValues
[docs]
class Sense(BaseModel):
def __init__(self, sense_id: str | None = None, glosses: Glosses | None = None, claims: Claims | None = None) -> None:
self.id = sense_id
self.glosses: LanguageValues = glosses or Glosses()
self.claims = claims or Claims()
self.removed = False
[docs]
def from_json(self, json_data: dict[str, Any]) -> Self:
self.id = json_data['id']
self.glosses = Glosses().from_json(json_data['glosses'])
self.claims = Claims().from_json(json_data['claims'])
return self
[docs]
def get_json(self) -> dict[str, str | dict]:
json_data: dict[str, str | dict] = {
'id': str(self.id),
'glosses': self.glosses.get_json(),
'claims': self.claims.get_json()
}
if self.id is None:
json_data['add'] = ''
del json_data['id']
if self.removed:
json_data['remove'] = ''
return json_data
[docs]
def remove(self) -> Self:
self.removed = True
return self
def _content(self) -> str:
# The id is assigned by the Wikibase instance, so two senses are considered equal when they hold the same content
return json.dumps([self.glosses.get_json(), self.claims.get_json()], sort_keys=True)
def __eq__(self, other: object) -> bool:
if not isinstance(other, Sense):
return NotImplemented
return self._content() == other._content()
def __hash__(self) -> int:
# Based on the content, like __eq__: a Sense modified after being added to a set or used as a dict key won't be found anymore
return hash(self._content())