Skip to content

Commit 8516ae5

Browse files
committed
Split model classes in its own file
1 parent 9bc5882 commit 8516ae5

File tree

19 files changed

+690
-630
lines changed

19 files changed

+690
-630
lines changed
Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
1-
from .aliases import Alias, Aliases
1+
from .alias import Alias
2+
from .aliases import Aliases
23
from .basemodel import BaseModel
3-
from .claims import Claim, Claims
4+
from .claim import Claim
5+
from .claims import Claims
46
from .descriptions import Descriptions
5-
from .forms import Form, Forms
7+
from .form import Form
8+
from .forms import Forms
9+
from .glosses import Glosses
610
from .labels import Labels
7-
from .language_values import LanguageValue, LanguageValues
11+
from .language_value import LanguageValue
12+
from .language_values import LanguageValues
813
from .lemmas import Lemmas
914
from .qualifiers import Qualifiers
10-
from .references import Reference, References
11-
from .senses import Glosses, Sense, Senses
12-
from .sitelinks import Sitelink, Sitelinks
13-
from .snaks import Snak, Snaks
15+
from .reference import Reference
16+
from .references import References
17+
from .representations import Representations
18+
from .sense import Sense
19+
from .senses import Senses
20+
from .sitelink import Sitelink
21+
from .sitelinks import Sitelinks
22+
from .snak import Snak
23+
from .snaks import Snaks

wikibaseintegrator/models/alias.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from wikibaseintegrator.models.language_value import LanguageValue
2+
3+
4+
class Alias(LanguageValue):
5+
pass

wikibaseintegrator/models/aliases.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
from typing import Dict, List, Optional, Union
44

5+
from wikibaseintegrator.models.alias import Alias
56
from wikibaseintegrator.models.basemodel import BaseModel
6-
from wikibaseintegrator.models.language_values import LanguageValue
77
from wikibaseintegrator.wbi_config import config
88
from wikibaseintegrator.wbi_enums import ActionIfExists
99

@@ -91,7 +91,3 @@ def from_json(self, json_data: Dict[str, List]) -> Aliases:
9191
# def __contains__(self, item):
9292
# all_aliases = [item for sublist in list(self.aliases.values()) for item in sublist]
9393
# return item in list(map(lambda x: x.value, all_aliases))
94-
95-
96-
class Alias(LanguageValue):
97-
pass

wikibaseintegrator/models/claim.py

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
from __future__ import annotations
2+
3+
import copy
4+
from typing import Any, Callable, Dict, List, Optional, Union
5+
6+
from wikibaseintegrator.models.basemodel import BaseModel
7+
from wikibaseintegrator.models.qualifiers import Qualifiers
8+
from wikibaseintegrator.models.references import Reference, References
9+
from wikibaseintegrator.models.snaks import Snak, Snaks
10+
from wikibaseintegrator.wbi_enums import WikibaseRank
11+
12+
13+
class Claim(BaseModel):
14+
DTYPE = 'claim'
15+
16+
def __init__(self, qualifiers: Qualifiers = None, rank: WikibaseRank = None, references: Union[References, List[Union[Claim, List[Claim]]]] = None) -> None:
17+
"""
18+
19+
:param qualifiers:
20+
:param rank:
21+
:param references: A References object, a list of Claim object or a list of list of Claim object
22+
"""
23+
self.mainsnak = Snak(datatype=self.DTYPE)
24+
self.type = 'statement'
25+
self.qualifiers = qualifiers or Qualifiers()
26+
self.qualifiers_order = []
27+
self.id = None
28+
self.rank = rank or WikibaseRank.NORMAL
29+
self.removed = False
30+
31+
self.references = References()
32+
33+
if isinstance(references, References):
34+
self.references = references
35+
elif isinstance(references, list):
36+
for ref_list in references:
37+
ref = Reference()
38+
if isinstance(ref_list, list):
39+
snaks = Snaks()
40+
for ref_claim in ref_list:
41+
if isinstance(ref_claim, Claim):
42+
snaks.add(Snak().from_json(ref_claim.get_json()['mainsnak']))
43+
else:
44+
raise ValueError("The references must be a References object or a list of Claim object")
45+
ref.snaks = snaks
46+
elif isinstance(ref_list, Claim):
47+
ref.snaks = Snaks().add(Snak().from_json(ref_list.get_json()['mainsnak']))
48+
elif isinstance(ref_list, Reference):
49+
ref = ref_list
50+
self.references.add(reference=ref)
51+
elif references is not None:
52+
raise ValueError("The references must be a References object or a list of Claim object")
53+
54+
@property
55+
def mainsnak(self) -> Snak:
56+
return self.__mainsnak
57+
58+
@mainsnak.setter
59+
def mainsnak(self, value: Snak):
60+
self.__mainsnak = value
61+
62+
@property
63+
def type(self) -> Union[str, Dict]:
64+
return self.__type
65+
66+
@type.setter
67+
def type(self, value: Union[str, Dict]):
68+
self.__type = value
69+
70+
@property
71+
def qualifiers(self) -> Qualifiers:
72+
return self.__qualifiers
73+
74+
@qualifiers.setter
75+
def qualifiers(self, value: Qualifiers) -> None:
76+
assert isinstance(value, (Qualifiers, list))
77+
self.__qualifiers: Qualifiers = Qualifiers().set(value) if isinstance(value, list) else value
78+
79+
@property
80+
def qualifiers_order(self) -> List[str]:
81+
return self.__qualifiers_order
82+
83+
@qualifiers_order.setter
84+
def qualifiers_order(self, value: List[str]):
85+
self.__qualifiers_order = value
86+
87+
@property
88+
def id(self) -> Optional[str]:
89+
return self.__id
90+
91+
@id.setter
92+
def id(self, value: Optional[str]):
93+
self.__id = value
94+
95+
@property
96+
def rank(self) -> WikibaseRank:
97+
return self.__rank
98+
99+
@rank.setter
100+
def rank(self, value: WikibaseRank):
101+
"""Parse the rank. The enum thows an error if it is not one of the recognized values"""
102+
self.__rank = WikibaseRank(value)
103+
104+
@property
105+
def references(self) -> References:
106+
return self.__references
107+
108+
@references.setter
109+
def references(self, value: References):
110+
self.__references = value
111+
112+
@property
113+
def removed(self) -> bool:
114+
return self.__removed
115+
116+
@removed.setter
117+
def removed(self, value: bool):
118+
self.__removed = value
119+
120+
def remove(self, remove=True) -> None:
121+
self.removed = remove
122+
123+
def update(self, claim: Claim) -> None:
124+
self.mainsnak = claim.mainsnak
125+
self.qualifiers = claim.qualifiers
126+
self.qualifiers_order = claim.qualifiers_order
127+
self.rank = claim.rank
128+
self.references = claim.references
129+
130+
def from_json(self, json_data: Dict[str, Any]) -> Claim:
131+
"""
132+
133+
:param json_data: a JSON representation of a Claim
134+
"""
135+
self.mainsnak = Snak().from_json(json_data['mainsnak'])
136+
self.type = str(json_data['type'])
137+
if 'qualifiers' in json_data:
138+
self.qualifiers = Qualifiers().from_json(json_data['qualifiers'])
139+
if 'qualifiers-order' in json_data:
140+
self.qualifiers_order = list(json_data['qualifiers-order'])
141+
self.id = str(json_data['id'])
142+
self.rank: WikibaseRank = WikibaseRank(json_data['rank'])
143+
if 'references' in json_data:
144+
self.references = References().from_json(json_data['references'])
145+
146+
return self
147+
148+
def get_json(self) -> Dict[str, Any]:
149+
json_data: Dict[str, Union[str, List[Dict], List[str], Dict[str, str], Dict[str, List], None]] = {
150+
'mainsnak': self.mainsnak.get_json(),
151+
'type': self.type,
152+
'id': self.id,
153+
'rank': self.rank.value
154+
}
155+
# Remove id if it's a temporary one
156+
if not self.id:
157+
del json_data['id']
158+
if len(self.qualifiers) > 0:
159+
json_data['qualifiers'] = self.qualifiers.get_json()
160+
json_data['qualifiers-order'] = list(self.qualifiers_order)
161+
if len(self.references) > 0:
162+
json_data['references'] = self.references.get_json()
163+
if self.removed:
164+
if self.id:
165+
json_data['remove'] = ''
166+
return json_data
167+
168+
def has_equal_qualifiers(self, other: Claim) -> bool:
169+
# check if the qualifiers are equal with the 'other' object
170+
self_qualifiers = copy.deepcopy(self.qualifiers)
171+
other_qualifiers = copy.deepcopy(other.qualifiers)
172+
173+
if len(self_qualifiers) != len(other_qualifiers):
174+
return False
175+
176+
for property_number in self_qualifiers.qualifiers:
177+
if property_number not in other_qualifiers.qualifiers:
178+
return False
179+
180+
if len(self_qualifiers.qualifiers[property_number]) != len(other_qualifiers.qualifiers[property_number]):
181+
return False
182+
183+
flg = [False for _ in range(len(self_qualifiers.qualifiers[property_number]))]
184+
for count, i in enumerate(self_qualifiers.qualifiers[property_number]):
185+
for q in other_qualifiers:
186+
if i == q:
187+
flg[count] = True
188+
if not all(flg):
189+
return False
190+
191+
return True
192+
193+
# TODO: rewrite this?
194+
def __contains__(self, item):
195+
if isinstance(item, Claim):
196+
return self == item
197+
198+
if isinstance(item, str):
199+
return self.mainsnak.datavalue == item
200+
201+
return super().__contains__(item)
202+
203+
def __eq__(self, other):
204+
if isinstance(other, Claim):
205+
return self.mainsnak.datavalue == other.mainsnak.datavalue and self.mainsnak.property_number == other.mainsnak.property_number and self.has_equal_qualifiers(other)
206+
207+
if isinstance(other, str):
208+
return self.mainsnak.property_number == other
209+
210+
raise super().__eq__(other)
211+
212+
def equals(self, that: Claim, include_ref: bool = False, fref: Callable = None) -> bool:
213+
"""
214+
Tests for equality of two statements.
215+
If comparing references, the order of the arguments matters!!!
216+
self is the current statement, the next argument is the new statement.
217+
Allows passing in a function to use to compare the references 'fref'. Default is equality.
218+
fref accepts two arguments 'oldrefs' and 'newrefs', each of which are a list of references,
219+
where each reference is a list of statements
220+
"""
221+
222+
if not include_ref:
223+
# return the result of BaseDataType.__eq__, which is testing for equality of value and qualifiers
224+
return self == that
225+
226+
if self != that:
227+
return False
228+
229+
if fref is None:
230+
return Claim.refs_equal(self, that)
231+
232+
return fref(self, that)
233+
234+
@staticmethod
235+
def refs_equal(olditem: Claim, newitem: Claim) -> bool:
236+
"""
237+
tests for exactly identical references
238+
"""
239+
240+
oldrefs = olditem.references
241+
newrefs = newitem.references
242+
243+
def ref_equal(oldref: References, newref: References) -> bool:
244+
return (len(oldref) == len(newref)) and all(x in oldref for x in newref)
245+
246+
return len(oldrefs) == len(newrefs) and all(any(ref_equal(oldref, newref) for oldref in oldrefs) for newref in newrefs)
247+
248+
def get_sparql_value(self) -> str:
249+
pass

0 commit comments

Comments
 (0)