Skip to content

Commit 43f0bef

Browse files
committed
Implementation EntityShape
Fix #470
1 parent 4f2bcee commit 43f0bef

File tree

5 files changed

+32
-1
lines changed

5 files changed

+32
-1
lines changed

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ oauthlib~=3.2.2
44
requests~=2.31.0
55
requests-oauthlib~=1.3.1
66
ujson~=5.8.0
7+
entityshape~=0.0.1

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ install_requires =
4040
requests>=2.27.1,<2.29.0
4141
requests-oauthlib~=1.3.1
4242
ujson>=5.4,<5.6
43+
entityshape~=0.0.1
4344
python_requires = >=3.8, <3.13
4445

4546
[options.extras_require]

setup.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
"oauthlib ~= 3.2.0",
1111
"requests >= 2.27.1,< 2.32.0",
1212
"requests-oauthlib ~= 1.3.1",
13-
"ujson >= 5.4,< 5.9"
13+
"ujson >= 5.4,< 5.9",
14+
"entityshape ~= 0.0.1"
1415
],
1516
extras_require={
1617
"dev": [

test/test_entity_item.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,10 @@ def test_new_lines(self):
107107
item.claims.add(MonolingualText(prop_nr=123, text="Multi\r\nline"))
108108
item.claims.add(MonolingualText(prop_nr=123, text="Multi\rline"))
109109
item.claims.add(MonolingualText(prop_nr=123, text="Multi\nline"))
110+
111+
def test_entity_schema(self):
112+
random_campsite = wbi.item.get('Q119156070')
113+
assert random_campsite.validate_schema(entity_schema="E376")
114+
assert random_campsite.validate_schema(entity_schema="376")
115+
assert random_campsite.validate_schema(entity_schema=376)
116+
assert not wbi.item.get('Q582').validate_schema(entity_schema="E376")

wikibaseintegrator/entities/baseentity.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
from __future__ import annotations
22

33
import logging
4+
import re
45
from copy import copy
56
from typing import TYPE_CHECKING, Any
67

8+
from entityshape import EntityShape
9+
710
from wikibaseintegrator import wbi_fastrun
811
from wikibaseintegrator.datatypes import BaseDataType
912
from wikibaseintegrator.models.claims import Claim, Claims
13+
from wikibaseintegrator.wbi_config import config
1014
from wikibaseintegrator.wbi_enums import ActionIfExists
1115
from wikibaseintegrator.wbi_exceptions import MissingEntityException
1216
from wikibaseintegrator.wbi_helpers import delete_page, edit_entity, mediawiki_api_call_helper
@@ -299,6 +303,23 @@ def get_entity_url(self, wikibase_url: str | None = None) -> str:
299303

300304
raise ValueError('wikibase_url or entity ID is null.')
301305

306+
def validate_schema(self, entity_schema: str, language: Optional[str] = None) -> bool:
307+
if isinstance(entity_schema, str):
308+
pattern = re.compile(r'^(?:[a-zA-Z]+:)?E?([0-9]+)$')
309+
matches = pattern.match(entity_schema)
310+
311+
if not matches:
312+
raise ValueError(f"Invalid EntitySchema ID ({entity_schema}), format must be 'E[0-9]+'")
313+
314+
entity_schema = f'E{matches.group(1)}'
315+
elif isinstance(entity_schema, int):
316+
entity_schema = f'E{entity_schema}'
317+
else:
318+
raise ValueError(f"Invalid EntitySchema ID ({entity_schema}), format must be 'E[0-9]+'")
319+
320+
language = str(language or config['DEFAULT_LANGUAGE'])
321+
return EntityShape(qid=self.id, eid=entity_schema, lang=language).get_result().is_valid
322+
302323
def __repr__(self):
303324
"""A mixin implementing a simple __repr__."""
304325
return "<{klass} @{id:x} {attrs}>".format( # pylint: disable=consider-using-f-string

0 commit comments

Comments
 (0)