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]

Reply via email to