Xqt has submitted this change. (
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1328678?usp=email )
Change subject: site: Fetch only missing MediaWiki messages
......................................................................
site: Fetch only missing MediaWiki messages
Materialize message keys once so one-shot iterables remain usable
after the cache check.
Request only keys absent from the cache. Use API formatversion 2 and
plain dictionaries while preserving requested key order.
Change-Id: Ib2d487c38b600bfd0d56d71c28520112c35eafd6
---
M pywikibot/site/_apisite.py
M tests/dry_site_tests.py
2 files changed, 46 insertions(+), 17 deletions(-)
Approvals:
Xqt: Verified; Looks good to me, approved
diff --git a/pywikibot/site/_apisite.py b/pywikibot/site/_apisite.py
index ff1fae9..c2d2303 100644
--- a/pywikibot/site/_apisite.py
+++ b/pywikibot/site/_apisite.py
@@ -10,7 +10,7 @@
import re
import time
import webbrowser
-from collections import OrderedDict, defaultdict
+from collections import defaultdict
from collections.abc import Iterable
from contextlib import suppress
from textwrap import fill
@@ -992,7 +992,7 @@
self,
keys: Iterable[str],
lang: str | None = None
- ) -> OrderedDict[str, str]:
+ ) -> dict[str, str]:
"""Fetch the text of a set of MediaWiki messages.
The returned dict uses each key to store the associated message.
@@ -1003,30 +1003,33 @@
:param lang: A language code, default is self.lang
"""
amlang = lang or self.lang
- if not all(amlang in _mw_msg_cache
- and _key in _mw_msg_cache[amlang] for _key in keys):
+ keys = list(keys)
+ messages = _mw_msg_cache.get(amlang, {})
+ missing_keys = [key for key in keys if key not in messages]
+
+ if missing_keys:
parameters = {'meta': 'allmessages',
- 'ammessages': keys,
+ 'ammessages': missing_keys,
'amlang': amlang,
+ 'formatversion': 2,
}
msg_query = api.QueryGenerator(site=self, parameters=parameters)
for msg in msg_query:
if 'missing' not in msg:
- _mw_msg_cache[amlang][msg['name']] = msg['*']
+ messages[msg['name']] = msg['content']
+ _mw_msg_cache[amlang] = messages
- # Check requested keys
- result = OrderedDict()
- for key in keys:
- try:
- result[key] = _mw_msg_cache[amlang][key]
- except KeyError:
- raise KeyError(
- f"No message '{key}' found for lang '{amlang}'")
+ # Check requested keys
+ result = {}
+ for key in keys:
+ try:
+ result[key] = messages[key]
+ except KeyError:
+ raise KeyError(
+ f"No message '{key}' found for lang '{amlang}'")
- return result
-
- return OrderedDict((key, _mw_msg_cache[amlang][key]) for key in keys)
+ return result
def mediawiki_message(
self,
diff --git a/tests/dry_site_tests.py b/tests/dry_site_tests.py
index 477c8ea..aebe291 100755
--- a/tests/dry_site_tests.py
+++ b/tests/dry_site_tests.py
@@ -8,6 +8,7 @@
from __future__ import annotations
import unittest
+from unittest.mock import patch
import pywikibot
from pywikibot.comms.http import user_agent, user_agent_username
@@ -21,6 +22,31 @@
dry = True
+ def test_mediawiki_messages_generator(self) -> None:
+ """Test fetching uncached messages from a one-shot iterable."""
+ cache = {'zz-test': {'cached': 'cached value'}}
+ response = ({'name': 'missing', 'content': 'missing value'},)
+ with patch.dict('pywikibot.site._apisite._mw_msg_cache', cache,
+ clear=True), \
+ patch('pywikibot.site._apisite.api.QueryGenerator',
+ return_value=response) as query:
+ keys = (key for key in ('cached', 'missing'))
+ result = self.site.mediawiki_messages(keys, lang='zz-test')
+
+ self.assertEqual(list(result.items()), [
+ ('cached', 'cached value'),
+ ('missing', 'missing value'),
+ ])
+ query.assert_called_once_with(
+ site=self.site,
+ parameters={
+ 'meta': 'allmessages',
+ 'ammessages': ['missing'],
+ 'amlang': 'zz-test',
+ 'formatversion': 2,
+ },
+ )
+
def test_logged_in(self) -> None:
"""Test logged_in() method."""
x = self.get_site()
--
To view, visit
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1328678?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.wikimedia.org/r/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ib2d487c38b600bfd0d56d71c28520112c35eafd6
Gerrit-Change-Number: 1328678
Gerrit-PatchSet: 3
Gerrit-Owner: Mahveotm <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]