Skip to content

Commit aa81f3b

Browse files
committed
Implementation EntityShape
Fix #470
1 parent 928f602 commit aa81f3b

File tree

5 files changed

+31
-0
lines changed

5 files changed

+31
-0
lines changed

requirements.txt

+1
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.9.0
7+
entityshape~=0.1.0

setup.cfg

+1
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.1.0
4344
python_requires = >=3.8, <3.13
4445

4546
[options.extras_require]

setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"requests >= 2.27.1,< 2.32.0",
1212
"requests-oauthlib ~= 1.3.1",
1313
"ujson >= 5.4,< 5.10"
14+
"entityshape ~= 0.1.0"
1415
],
1516
extras_require={
1617
"dev": [

test/test_entity_item.py

+7
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.schema_validator(entity_schema_id="E376").is_valid
114+
assert random_campsite.schema_validator(entity_schema_id="376").is_valid
115+
assert random_campsite.schema_validator(entity_schema_id=376).is_valid
116+
assert not wbi.item.get('Q582').schema_validator(entity_schema_id="E376").is_valid

wikibaseintegrator/entities/baseentity.py

+21
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, Result
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
@@ -306,6 +310,23 @@ def download_entity_ttl(self, **kwargs) -> str:
306310

307311
raise ValueError('entity ID is null')
308312

313+
def schema_validator(self, entity_schema_id: str, language: str | None = None) -> Result:
314+
if isinstance(entity_schema_id, str):
315+
pattern = re.compile(r'^(?:[a-zA-Z]+:)?E?([0-9]+)$')
316+
matches = pattern.match(entity_schema_id)
317+
318+
if not matches:
319+
raise ValueError(f"Invalid EntitySchema ID ({entity_schema_id}), format must be 'E[0-9]+'")
320+
321+
entity_schema_id = f'E{matches.group(1)}'
322+
elif isinstance(entity_schema_id, int):
323+
entity_schema_id = f'E{entity_schema_id}'
324+
else:
325+
raise ValueError(f"Invalid EntitySchema ID ({entity_schema_id}), format must be 'E[0-9]+'")
326+
327+
language = str(language or config['DEFAULT_LANGUAGE'])
328+
return EntityShape(qid=self.id, eid=entity_schema_id, lang=language).validate_and_get_result()
329+
309330
def __repr__(self):
310331
"""A mixin implementing a simple __repr__."""
311332
return "<{klass} @{id:x} {attrs}>".format( # pylint: disable=consider-using-f-string

0 commit comments

Comments
 (0)