Source code for wikibaseintegrator.models.references

from __future__ import annotations

import logging
from typing import TYPE_CHECKING, Any

from wikibaseintegrator.models.basemodel import BaseModel
from wikibaseintegrator.models.snaks import Snak, Snaks
from wikibaseintegrator.wbi_enums import ActionIfExists

if TYPE_CHECKING:
    from wikibaseintegrator.models.claims import Claim

log = logging.getLogger(__name__)


[docs] class References(BaseModel):
[docs] 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]): 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
[docs] def add(self, reference: Reference | Claim | None = None, action_if_exists: ActionIfExists = ActionIfExists.REPLACE_ALL) -> References: from wikibaseintegrator.models.claims 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]) -> References: 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.claims 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) -> References: self.references = [] return self
def __iter__(self): return iter(self.references) def __len__(self): return len(self.references)
[docs] class Reference(BaseModel):
[docs] def __init__(self, snaks: Snaks | None = None, snaks_order: list | None = None): self.hash = None self.snaks = snaks or Snaks() self.snaks_order = snaks_order or []
@property def hash(self): return self.__hash @hash.setter def hash(self, value): self.__hash = value @property def snaks(self): return self.__snaks @snaks.setter def snaks(self, value): self.__snaks = value @property def snaks_order(self): return self.__snaks_order @snaks_order.setter def snaks_order(self, value): self.__snaks_order = value # TODO: implement action_if_exists
[docs] def add(self, snak: Snak | Claim | None = None, action_if_exists: ActionIfExists = ActionIfExists.REPLACE_ALL) -> Reference: from wikibaseintegrator.models.claims 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]) -> Reference: 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): return iter(self.snaks) def __len__(self): return len(self.snaks)