Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ oauthlib~=3.2.2
requests~=2.31.0
requests-oauthlib~=1.3.1
ujson~=5.9.0
entityshape~=0.1.1
1 change: 1 addition & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ install_requires =
requests>=2.27.1,<2.29.0
requests-oauthlib~=1.3.1
ujson>=5.4,<5.6
entityshape~=0.1.0
python_requires = >=3.8, <3.13

[options.extras_require]
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
"oauthlib ~= 3.2.0",
"requests >= 2.27.1,< 2.32.0",
"requests-oauthlib ~= 1.3.1",
"ujson >= 5.4,< 5.10"
"ujson >= 5.4,< 5.10",
"entityshape ~= 0.1.1"
],
extras_require={
"dev": [
Expand Down
7 changes: 7 additions & 0 deletions test/test_entity_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,10 @@ def test_new_lines(self):
item.claims.add(MonolingualText(prop_nr=123, text="Multi\r\nline"))
item.claims.add(MonolingualText(prop_nr=123, text="Multi\rline"))
item.claims.add(MonolingualText(prop_nr=123, text="Multi\nline"))

def test_entity_schema(self):
random_campsite = wbi.item.get('Q119156070')
assert random_campsite.schema_validator(entity_schema_id="E376").is_valid
assert random_campsite.schema_validator(entity_schema_id="376").is_valid
assert random_campsite.schema_validator(entity_schema_id=376).is_valid
assert not wbi.item.get('Q582').schema_validator(entity_schema_id="E376").is_valid
21 changes: 21 additions & 0 deletions wikibaseintegrator/entities/baseentity.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
from __future__ import annotations

import logging
import re
from copy import copy
from typing import TYPE_CHECKING, Any

from entityshape import EntityShape, Result

from wikibaseintegrator import wbi_fastrun
from wikibaseintegrator.datatypes import BaseDataType
from wikibaseintegrator.models.claims import Claim, Claims
from wikibaseintegrator.wbi_config import config
from wikibaseintegrator.wbi_enums import ActionIfExists
from wikibaseintegrator.wbi_exceptions import MissingEntityException
from wikibaseintegrator.wbi_helpers import delete_page, edit_entity, mediawiki_api_call_helper
Expand Down Expand Up @@ -306,6 +310,23 @@ def download_entity_ttl(self, **kwargs) -> str:

raise ValueError('entity ID is null')

def schema_validator(self, entity_schema_id: str, language: str | None = None) -> Result:
if isinstance(entity_schema_id, str):
pattern = re.compile(r'^(?:[a-zA-Z]+:)?E?([0-9]+)$')
matches = pattern.match(entity_schema_id)

if not matches:
raise ValueError(f"Invalid EntitySchema ID ({entity_schema_id}), format must be 'E[0-9]+'")

entity_schema_id = f'E{matches.group(1)}'
elif isinstance(entity_schema_id, int):
entity_schema_id = f'E{entity_schema_id}'
else:
raise ValueError(f"Invalid EntitySchema ID ({entity_schema_id}), format must be 'E[0-9]+'")

language = str(language or config['DEFAULT_LANGUAGE'])
return EntityShape(qid=self.id, eid=entity_schema_id, lang=language).validate_and_get_result()

def __repr__(self):
"""A mixin implementing a simple __repr__."""
return "<{klass} @{id:x} {attrs}>".format( # pylint: disable=consider-using-f-string
Expand Down