Xqt submitted this change.
[IMPR] Show a warning message for a deleted or unknown claim type
Show this warning once and only if WbUnknown.toWikibase() is called.
Also update tests-
Bug: T374676
Change-Id: I56400c8f24390608c225ea953f406d6cbd329ff7
---
M pywikibot/_wbtypes.py
M pywikibot/page/_wikibase.py
M tests/wikibase_tests.py
3 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/pywikibot/_wbtypes.py b/pywikibot/_wbtypes.py
index 4764cfa..66374df 100644
--- a/pywikibot/_wbtypes.py
+++ b/pywikibot/_wbtypes.py
@@ -1151,8 +1151,7 @@
class WbUnknown(WbRepresentation):
- """
- A Wikibase representation for unknown data type.
+ """A Wikibase representation for unknown data type.
This will prevent the bot from breaking completely when a new type
is introduced.
@@ -1160,24 +1159,34 @@
This data type is just a json container
.. versionadded:: 3.0
+ .. versionchanged:: 9.4
+ *warning* parameter was added
"""
_items = ('json',)
- def __init__(self, json: dict[str, Any]) -> None:
+ def __init__(self, json: dict[str, Any], warning: str = '') -> None:
"""
Create a new WbUnknown object.
:param json: Wikibase JSON
+ :param warning: a warning message which is shown once if
+ :meth:`toWikibase` is called
"""
self.json = json
+ self.warning = warning
def toWikibase(self) -> dict[str, Any]:
- """
- Return the JSON object for the Wikibase API.
+ """Return the JSON object for the Wikibase API.
+
+ .. versionchanged:: 9.4
+ a waning message given by the warning attribute is shown once.
:return: Wikibase JSON
"""
+ if self.warning:
+ pywikibot.warning(self.warning)
+ self.warning = ''
return self.json
@classmethod
diff --git a/pywikibot/page/_wikibase.py b/pywikibot/page/_wikibase.py
index 881f3d3..65c2181 100644
--- a/pywikibot/page/_wikibase.py
+++ b/pywikibot/page/_wikibase.py
@@ -1777,19 +1777,19 @@
except NoWikibaseEntityError:
claim_type = None
- claim.target = None
+ msg = None
if not claim_type:
- pywikibot.warning(f'{claim.id} does not exist.')
+ msg = '{claim.id} does not exist.'
elif claim.type in cls.types:
# The default covers string, url types
claim.target = cls.TARGET_CONVERTER.get(
claim.type, lambda value, site: value)(value, site)
else:
- pywikibot.warning(
- f'{claim.type} datatype is not supported yet.')
+ msg = f'{claim.type} datatype is not supported yet.'
- if claim.target is None:
+ if msg is not None:
claim.target = pywikibot.WbUnknown.fromWikibase(value)
+ claim.target.warning = msg
if 'rank' in data: # References/Qualifiers don't have ranks
claim.rank = data['rank']
diff --git a/tests/wikibase_tests.py b/tests/wikibase_tests.py
index a5c3135..0a1f9c2 100755
--- a/tests/wikibase_tests.py
+++ b/tests/wikibase_tests.py
@@ -14,7 +14,6 @@
import unittest
from contextlib import suppress
from decimal import Decimal
-from unittest import mock
import pywikibot
from pywikibot import pagegenerators
@@ -1192,12 +1191,11 @@
def test_load_unknown(self):
"""Ensure unknown value is loaded but raises a warning."""
- with mock.patch.object(pywikibot, 'warning', autospec=True) as warn:
- self.wdp.get()
- unknown_value = self.wdp.claims['P99999'][0].getTarget()
- self.assertIsInstance(unknown_value, pywikibot.WbUnknown)
- warn.assert_called_once_with(
- 'foo-unknown-bar datatype is not supported yet.')
+ self.wdp.get()
+ unknown_value = self.wdp.claims['P99999'][0].getTarget()
+ self.assertIsInstance(unknown_value, pywikibot.WbUnknown)
+ self.assertEqual(unknown_value.warning,
+ 'foo-unknown-bar datatype is not supported yet.')
class TestItemPageExtensibility(TestCase):
To view, visit change 1074403. To unsubscribe, or for help writing mail filters, visit settings.