Source code for wikibaseintegrator.models.reference
from __future__ import annotations
from collections.abc import Iterator
from typing import TYPE_CHECKING, Any, Self
from wikibaseintegrator.models.basemodel import BaseModel
from wikibaseintegrator.models.snak import Snak
from wikibaseintegrator.models.snaks import Snaks
from wikibaseintegrator.wbi_enums import ActionIfExists
if TYPE_CHECKING:
from wikibaseintegrator.models.claim import Claim
[docs]
class Reference(BaseModel):
def __init__(self, snaks: Snaks | None = None, snaks_order: list[str] | None = None) -> None:
self.hash = None
self.snaks = snaks or Snaks()
self.snaks_order = snaks_order or []
@property
def hash(self) -> str | None:
return self.__hash
@hash.setter
def hash(self, value: str | None) -> None:
self.__hash = value
@property
def snaks(self) -> Snaks:
return self.__snaks
@snaks.setter
def snaks(self, value: Snaks) -> None:
self.__snaks = value
@property
def snaks_order(self) -> list[str]:
return self.__snaks_order
@snaks_order.setter
def snaks_order(self, value: list[str]) -> None:
self.__snaks_order = value
# TODO: implement action_if_exists
# action_if_exists is accepted for symmetry with Claims.add() but not implemented yet
# pylint: disable-next=unused-argument
[docs]
def add(self, snak: Snak | Claim | None = None, action_if_exists: ActionIfExists = ActionIfExists.APPEND_OR_REPLACE) -> Self:
# Imported here because Claim holds References, which would make a circular import at module level
from wikibaseintegrator.models.claim import Claim
if isinstance(snak, Claim):
snak = Snak().from_json(snak.get_json()['mainsnak'])
if snak is not None:
assert isinstance(snak, Snak)
self.snaks.add(snak)
return self
[docs]
def from_json(self, json_data: dict[str, Any]) -> Self:
self.hash = json_data['hash']
self.snaks = Snaks().from_json(json_data['snaks'])
self.snaks_order = json_data['snaks-order']
return self
[docs]
def get_json(self) -> dict[str, dict | list]:
json_data: dict[str, dict | list] = {
'snaks': self.snaks.get_json(),
'snaks-order': self.snaks_order
}
return json_data
def __iter__(self) -> Iterator[Snak]:
return iter(self.snaks)
def __len__(self) -> int:
return len(self.snaks)
def __eq__(self, other: object) -> bool:
if not isinstance(other, Reference):
return NotImplemented
# The hash is only known server-side, so two references are considered equal when they hold the same snaks
return self.snaks.get_json() == other.snaks.get_json()