Source code for wikibaseintegrator.models.references
from __future__ import annotations
import logging
from collections.abc import Iterator
from typing import TYPE_CHECKING, Self
from wikibaseintegrator.models.basemodel import BaseModel
from wikibaseintegrator.models.reference import Reference
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
log = logging.getLogger(__name__)
[docs]
class References(BaseModel):
def __init__(self) -> None:
self.references: list[Reference] = []
@property
def references(self) -> list[Reference]:
return self.__references
@references.setter
def references(self, value: list[Reference]) -> None:
self.__references = value
[docs]
def get(self, hash: str | None = None) -> Reference | None:
for reference in self.references:
if reference.hash == hash:
return reference
return None
# 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, reference: Reference | 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(reference, Claim):
if reference.qualifiers:
log.warning("WARNING: It is not possible to use a qualifier in a reference, it will be ignored.")
if reference.references:
log.warning("WARNING: It is not possible to use a reference in a reference, it will be ignored.")
reference = Reference(snaks=Snaks().add(Snak().from_json(reference.get_json()['mainsnak'])))
if reference is not None:
assert isinstance(reference, Reference)
if reference not in self.references:
self.references.append(reference)
return self
[docs]
def from_json(self, json_data: list[dict]) -> Self:
for reference in json_data:
self.add(reference=Reference().from_json(reference))
return self
[docs]
def get_json(self) -> list[dict]:
json_data: list[dict] = []
for reference in self.references:
json_data.append(reference.get_json())
return json_data
[docs]
def remove(self, reference_to_remove: Claim | Reference) -> bool:
from wikibaseintegrator.models.claim import Claim
if isinstance(reference_to_remove, Claim):
reference_to_remove = Reference(snaks=Snaks().add(Snak().from_json(reference_to_remove.get_json()['mainsnak'])))
assert isinstance(reference_to_remove, Reference)
for reference in self.references:
if reference == reference_to_remove:
self.references.remove(reference)
return True
return False
[docs]
def clear(self) -> Self:
self.references = []
return self
def __iter__(self) -> Iterator[Reference]:
return iter(self.references)
def __len__(self) -> int:
return len(self.references)